220 lines · plain
1; "PLAIN" - No optimizations. This tests the target-independent2; constant folder.3; RUN: opt -S -o - %s | FileCheck --check-prefix=PLAIN %s4 5target datalayout = "e-p:128:128:128-p1:32:32:32-p2:8:8:8-p3:16:16:16-p4:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:32"6 7; The automatic constant folder in opt does not have targetdata access, so8; it can't fold gep arithmetic, in general. However, the constant folder run9; from instcombine and global opt can use targetdata.10; PLAIN: @G8 = global ptr addrspace(1) getelementptr (i8, ptr addrspace(1) inttoptr (i32 1 to ptr addrspace(1)), i32 -1)11@G8 = global ptr addrspace(1) getelementptr (i8, ptr addrspace(1) inttoptr (i32 1 to ptr addrspace(1)), i32 -1)12; PLAIN: @G1 = global ptr addrspace(2) getelementptr (i1, ptr addrspace(2) inttoptr (i8 1 to ptr addrspace(2)), i8 -1)13@G1 = global ptr addrspace(2) getelementptr (i1, ptr addrspace(2) inttoptr (i8 1 to ptr addrspace(2)), i8 -1)14; PLAIN: @F8 = global ptr addrspace(1) getelementptr (i8, ptr addrspace(1) inttoptr (i32 1 to ptr addrspace(1)), i32 -2)15@F8 = global ptr addrspace(1) getelementptr (i8, ptr addrspace(1) inttoptr (i32 1 to ptr addrspace(1)), i32 -2)16; PLAIN: @F1 = global ptr addrspace(2) getelementptr (i1, ptr addrspace(2) inttoptr (i8 1 to ptr addrspace(2)), i8 -2)17@F1 = global ptr addrspace(2) getelementptr (i1, ptr addrspace(2) inttoptr (i8 1 to ptr addrspace(2)), i8 -2)18; PLAIN: @H8 = global ptr addrspace(1) getelementptr (i8, ptr addrspace(1) null, i32 -1)19@H8 = global ptr addrspace(1) getelementptr (i8, ptr addrspace(1) inttoptr (i32 0 to ptr addrspace(1)), i32 -1)20; PLAIN: @H1 = global ptr addrspace(2) getelementptr (i1, ptr addrspace(2) null, i8 -1)21@H1 = global ptr addrspace(2) getelementptr (i1, ptr addrspace(2) inttoptr (i8 0 to ptr addrspace(2)), i8 -1)22 23 24; The target-independent folder should be able to do some clever25; simplifications on sizeof, alignof, and offsetof expressions. The26; target-dependent folder should fold these down to constants.27 28; PLAIN-X: @b = constant i64 ptrtoint (ptr addrspace(4) getelementptr ({ i1, double }, ptr null, i64 0, i32 1) to i64)29@b = constant i64 ptrtoint (ptr addrspace(4) getelementptr ({i1, [13 x double]}, ptr addrspace(4) null, i64 0, i32 1) to i64)30 31; PLAIN-X: @e = constant i64 ptrtoint (ptr addrspace(4) getelementptr ({ double, float, double, double }, ptr null, i64 0, i32 2) to i64)32@e = constant i64 ptrtoint (ptr addrspace(4) getelementptr ({double, float, double, double}, ptr addrspace(4) null, i64 0, i32 2) to i64)33 34; PLAIN-X: @f = constant i64 135@f = constant i64 ptrtoint (ptr addrspace(4) getelementptr ({i1, <{ i16, i128 }>}, ptr addrspace(4) null, i64 0, i32 1) to i64)36 37; PLAIN-X: @g = constant i64 ptrtoint (ptr addrspace(4) getelementptr ({ i1, double }, ptr null, i64 0, i32 1) to i64)38@g = constant i64 ptrtoint (ptr addrspace(4) getelementptr ({i1, {double, double}}, ptr addrspace(4) null, i64 0, i32 1) to i64)39 40; PLAIN-X: @h = constant i64 ptrtoint (ptr addrspace(2) getelementptr (i1, ptr addrspace(2) null, i32 1) to i64)41@h = constant i64 ptrtoint (ptr addrspace(4) getelementptr (double, ptr addrspace(4) null, i64 1) to i64)42 43; PLAIN-X: @i = constant i64 ptrtoint (ptr addrspace(2) getelementptr ({ i1, ptr addrspace(2) }, ptr null, i64 0, i32 1) to i64)44@i = constant i64 ptrtoint (ptr addrspace(4) getelementptr ({i1, double}, ptr addrspace(4) null, i64 0, i32 1) to i64)45 46; The target-dependent folder should cast GEP indices to integer-sized pointers.47 48; PLAIN: @M = constant ptr addrspace(4) getelementptr (i64, ptr addrspace(4) null, i32 1)49; PLAIN: @N = constant ptr addrspace(4) getelementptr ({ i64, i64 }, ptr addrspace(4) null, i32 0, i32 1)50; PLAIN: @O = constant ptr addrspace(4) getelementptr ([2 x i64], ptr addrspace(4) null, i32 0, i32 1)51 52@M = constant ptr addrspace(4) getelementptr (i64, ptr addrspace(4) null, i32 1)53@N = constant ptr addrspace(4) getelementptr ({ i64, i64 }, ptr addrspace(4) null, i32 0, i32 1)54@O = constant ptr addrspace(4) getelementptr ([2 x i64], ptr addrspace(4) null, i32 0, i32 1)55 56; Fold GEP of a GEP. Very simple cases are folded.57 58; PLAIN-X: @Y = global ptraddrspace(3) getelementptr inbounds ([3 x { i32, i32 }], ptraddrspace(3) @ext, i64 2)59@ext = external addrspace(3) global [3 x { i32, i32 }]60@Y = global ptr addrspace(3) getelementptr inbounds ([3 x { i32, i32 }], ptr addrspace(3) getelementptr inbounds ([3 x { i32, i32 }], ptr addrspace(3) @ext, i64 1), i64 1)61 62; PLAIN-X: @Z = global ptraddrspace(3) getelementptr inbounds (i32, ptr addrspace(3) getelementptr inbounds ([3 x { i32, i32 }], ptr addrspace(3) @ext, i64 0, i64 1, i32 0), i64 1)63@Z = global ptr addrspace(3) getelementptr inbounds (i32, ptr addrspace(3) getelementptr inbounds ([3 x { i32, i32 }], ptr addrspace(3) @ext, i64 0, i64 1, i32 0), i64 1)64 65 66; Duplicate all of the above as function return values rather than67; global initializers.68 69; PLAIN: define ptr addrspace(1) @goo8() #0 {70; PLAIN: %t = bitcast ptr addrspace(1) getelementptr (i8, ptr addrspace(1) inttoptr (i32 1 to ptr addrspace(1)), i32 -1) to ptr addrspace(1)71; PLAIN: ret ptr addrspace(1) %t72; PLAIN: }73; PLAIN: define ptr addrspace(2) @goo1() #0 {74; PLAIN: %t = bitcast ptr addrspace(2) getelementptr (i1, ptr addrspace(2) inttoptr (i32 1 to ptr addrspace(2)), i32 -1) to ptr addrspace(2)75; PLAIN: ret ptr addrspace(2) %t76; PLAIN: }77; PLAIN: define ptr addrspace(1) @foo8() #0 {78; PLAIN: %t = bitcast ptr addrspace(1) getelementptr (i8, ptr addrspace(1) inttoptr (i32 1 to ptr addrspace(1)), i32 -2) to ptr addrspace(1)79; PLAIN: ret ptr addrspace(1) %t80; PLAIN: }81; PLAIN: define ptr addrspace(2) @foo1() #0 {82; PLAIN: %t = bitcast ptr addrspace(2) getelementptr (i1, ptr addrspace(2) inttoptr (i32 1 to ptr addrspace(2)), i32 -2) to ptr addrspace(2)83; PLAIN: ret ptr addrspace(2) %t84; PLAIN: }85; PLAIN: define ptr addrspace(1) @hoo8() #0 {86; PLAIN: %t = bitcast ptr addrspace(1) getelementptr (i8, ptr addrspace(1) null, i32 -1) to ptr addrspace(1)87; PLAIN: ret ptr addrspace(1) %t88; PLAIN: }89; PLAIN: define ptr addrspace(2) @hoo1() #0 {90; PLAIN: %t = bitcast ptr addrspace(2) getelementptr (i1, ptr addrspace(2) null, i32 -1) to ptr addrspace(2)91; PLAIN: ret ptr addrspace(2) %t92; PLAIN: }93define ptr addrspace(1) @goo8() #0 {94 %t = bitcast ptr addrspace(1) getelementptr (i8, ptr addrspace(1) inttoptr (i32 1 to ptr addrspace(1)), i32 -1) to ptr addrspace(1)95 ret ptr addrspace(1) %t96}97define ptr addrspace(2) @goo1() #0 {98 %t = bitcast ptr addrspace(2) getelementptr (i1, ptr addrspace(2) inttoptr (i32 1 to ptr addrspace(2)), i32 -1) to ptr addrspace(2)99 ret ptr addrspace(2) %t100}101define ptr addrspace(1) @foo8() #0 {102 %t = bitcast ptr addrspace(1) getelementptr (i8, ptr addrspace(1) inttoptr (i32 1 to ptr addrspace(1)), i32 -2) to ptr addrspace(1)103 ret ptr addrspace(1) %t104}105define ptr addrspace(2) @foo1() #0 {106 %t = bitcast ptr addrspace(2) getelementptr (i1, ptr addrspace(2) inttoptr (i32 1 to ptr addrspace(2)), i32 -2) to ptr addrspace(2)107 ret ptr addrspace(2) %t108}109define ptr addrspace(1) @hoo8() #0 {110 %t = bitcast ptr addrspace(1) getelementptr (i8, ptr addrspace(1) inttoptr (i32 0 to ptr addrspace(1)), i32 -1) to ptr addrspace(1)111 ret ptr addrspace(1) %t112}113define ptr addrspace(2) @hoo1() #0 {114 %t = bitcast ptr addrspace(2) getelementptr (i1, ptr addrspace(2) inttoptr (i32 0 to ptr addrspace(2)), i32 -1) to ptr addrspace(2)115 ret ptr addrspace(2) %t116}117 118; PLAIN-X: define i64 @fb() #0 {119; PLAIN-X: %t = bitcast i64 ptrtoint (ptr addrspace(4) getelementptr ({ i1, double }, ptr null, i64 0, i32 1) to i64) to i64120; PLAIN-X: ret i64 %t121; PLAIN-X: }122; PLAIN-X: define i64 @fc() #0 {123; PLAIN-X: %t = bitcast i64 mul nuw (i64 ptrtoint (ptr addrspace(4) getelementptr (double, ptr addrspace(4) null, i32 1) to i64), i64 2) to i64124; PLAIN-X: ret i64 %t125; PLAIN-X: }126; PLAIN-X: define i64 @fd() #0 {127; PLAIN-X: %t = bitcast i64 mul nuw (i64 ptrtoint (ptr addrspace(4) getelementptr (double, ptr addrspace(4) null, i32 1) to i64), i64 11) to i64128; PLAIN-X: ret i64 %t129; PLAIN-X: }130; PLAIN-X: define i64 @fe() #0 {131; PLAIN-X: %t = bitcast i64 ptrtoint (ptr addrspace(4) getelementptr ({ double, float, double, double }, ptr null, i64 0, i32 2) to i64) to i64132; PLAIN-X: ret i64 %t133; PLAIN-X: }134; PLAIN-X: define i64 @ff() #0 {135; PLAIN-X: %t = bitcast i64 1 to i64136; PLAIN-X: ret i64 %t137; PLAIN-X: }138; PLAIN-X: define i64 @fg() #0 {139; PLAIN-X: %t = bitcast i64 ptrtoint (ptr addrspace(4) getelementptr ({ i1, double }, ptr null, i64 0, i32 1) to i64) to i64140; PLAIN-X: ret i64 %t141; PLAIN-X: }142; PLAIN-X: define i64 @fh() #0 {143; PLAIN-X: %t = bitcast i64 ptrtoint (ptr addrspace(2) getelementptr (i1, ptr addrspace(2) null, i32 1) to i64) to i64144; PLAIN-X: ret i64 %t145; PLAIN-X: }146; PLAIN-X: define i64 @fi() #0 {147; PLAIN-X: %t = bitcast i64 ptrtoint (ptr addrspace(2) getelementptr ({ i1, ptr addrspace(2) }, ptr null, i64 0, i32 1) to i64) to i64148; PLAIN-X: ret i64 %t149; PLAIN-X: }150define i64 @fb() #0 {151 %t = bitcast i64 ptrtoint (ptr addrspace(4) getelementptr ({i1, [13 x double]}, ptr addrspace(4) null, i64 0, i32 1) to i64) to i64152 ret i64 %t153}154define i64 @fc() #0 {155 %t = bitcast i64 ptrtoint (ptr addrspace(4) getelementptr ({double, double, double, double}, ptr addrspace(4) null, i64 0, i32 2) to i64) to i64156 ret i64 %t157}158define i64 @fd() #0 {159 %t = bitcast i64 ptrtoint (ptr addrspace(4) getelementptr ([13 x double], ptr addrspace(4) null, i64 0, i32 11) to i64) to i64160 ret i64 %t161}162define i64 @fe() #0 {163 %t = bitcast i64 ptrtoint (ptr addrspace(4) getelementptr ({double, float, double, double}, ptr addrspace(4) null, i64 0, i32 2) to i64) to i64164 ret i64 %t165}166define i64 @ff() #0 {167 %t = bitcast i64 ptrtoint (ptr addrspace(4) getelementptr ({i1, <{ i16, i128 }>}, ptr addrspace(4) null, i64 0, i32 1) to i64) to i64168 ret i64 %t169}170define i64 @fg() #0 {171 %t = bitcast i64 ptrtoint (ptr addrspace(4) getelementptr ({i1, {double, double}}, ptr addrspace(4) null, i64 0, i32 1) to i64) to i64172 ret i64 %t173}174define i64 @fh() #0 {175 %t = bitcast i64 ptrtoint (ptr addrspace(4) getelementptr (double, ptr addrspace(4) null, i32 1) to i64) to i64176 ret i64 %t177}178define i64 @fi() #0 {179 %t = bitcast i64 ptrtoint (ptr addrspace(4) getelementptr ({i1, double}, ptr addrspace(4) null, i64 0, i32 1) to i64) to i64180 ret i64 %t181}182 183; PLAIN: define ptr @fM() #0 {184; PLAIN: %t = bitcast ptr getelementptr (i64, ptr null, i32 1) to ptr185; PLAIN: ret ptr %t186; PLAIN: }187; PLAIN: define ptr @fN() #0 {188; PLAIN: %t = bitcast ptr getelementptr ({ i64, i64 }, ptr null, i32 0, i32 1) to ptr189; PLAIN: ret ptr %t190; PLAIN: }191; PLAIN: define ptr @fO() #0 {192; PLAIN: %t = bitcast ptr getelementptr ([2 x i64], ptr null, i32 0, i32 1) to ptr193; PLAIN: ret ptr %t194; PLAIN: }195 196define ptr @fM() #0 {197 %t = bitcast ptr getelementptr (i64, ptr null, i32 1) to ptr198 ret ptr %t199}200define ptr @fN() #0 {201 %t = bitcast ptr getelementptr ({ i64, i64 }, ptr null, i32 0, i32 1) to ptr202 ret ptr %t203}204define ptr @fO() #0 {205 %t = bitcast ptr getelementptr ([2 x i64], ptr null, i32 0, i32 1) to ptr206 ret ptr %t207}208 209; PLAIN: define ptr addrspace(1) @fZ() #0 {210; PLAIN: %t = bitcast ptr addrspace(1) getelementptr inbounds (i32, ptr addrspace(1) getelementptr inbounds ([3 x { i32, i32 }], ptr addrspace(1) @ext2, i64 0, i64 1, i32 0), i64 1) to ptr addrspace(1)211; PLAIN: ret ptr addrspace(1) %t212; PLAIN: }213@ext2 = external addrspace(1) global [3 x { i32, i32 }]214define ptr addrspace(1) @fZ() #0 {215 %t = bitcast ptr addrspace(1) getelementptr inbounds (i32, ptr addrspace(1) getelementptr inbounds ([3 x { i32, i32 }], ptr addrspace(1) @ext2, i64 0, i64 1, i32 0), i64 1) to ptr addrspace(1)216 ret ptr addrspace(1) %t217}218 219attributes #0 = { nounwind }220