1*9880d681SAndroid Build Coastguard Worker; "PLAIN" - No optimizations. This tests the default target layout 2*9880d681SAndroid Build Coastguard Worker; constant folder. 3*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -o - < %s | FileCheck --check-prefix=PLAIN %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; "OPT" - Optimizations but no targetdata. This tests default target layout 6*9880d681SAndroid Build Coastguard Worker; folding in the optimizers. 7*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -o - -instcombine -globalopt < %s | FileCheck --check-prefix=OPT %s 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Worker; "TO" - Optimizations and targetdata. This tests target-dependent 10*9880d681SAndroid Build Coastguard Worker; folding in the optimizers. 11*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -o - -instcombine -globalopt -default-data-layout="e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64" < %s | FileCheck --check-prefix=TO %s 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Worker; "SCEV" - ScalarEvolution with default target layout 14*9880d681SAndroid Build Coastguard Worker; RUN: opt -analyze -scalar-evolution < %s | FileCheck --check-prefix=SCEV %s 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker; The automatic constant folder in opt does not have targetdata access, so 18*9880d681SAndroid Build Coastguard Worker; it can't fold gep arithmetic, in general. However, the constant folder run 19*9880d681SAndroid Build Coastguard Worker; from instcombine and global opt can use targetdata. 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker; PLAIN: @G8 = global i8* getelementptr (i8, i8* inttoptr (i32 1 to i8*), i32 -1) 22*9880d681SAndroid Build Coastguard Worker; PLAIN: @G1 = global i1* getelementptr (i1, i1* inttoptr (i32 1 to i1*), i32 -1) 23*9880d681SAndroid Build Coastguard Worker; PLAIN: @F8 = global i8* getelementptr (i8, i8* inttoptr (i32 1 to i8*), i32 -2) 24*9880d681SAndroid Build Coastguard Worker; PLAIN: @F1 = global i1* getelementptr (i1, i1* inttoptr (i32 1 to i1*), i32 -2) 25*9880d681SAndroid Build Coastguard Worker; PLAIN: @H8 = global i8* getelementptr (i8, i8* null, i32 -1) 26*9880d681SAndroid Build Coastguard Worker; PLAIN: @H1 = global i1* getelementptr (i1, i1* null, i32 -1) 27*9880d681SAndroid Build Coastguard Worker; OPT: @G8 = local_unnamed_addr global i8* null 28*9880d681SAndroid Build Coastguard Worker; OPT: @G1 = local_unnamed_addr global i1* null 29*9880d681SAndroid Build Coastguard Worker; OPT: @F8 = local_unnamed_addr global i8* inttoptr (i64 -1 to i8*) 30*9880d681SAndroid Build Coastguard Worker; OPT: @F1 = local_unnamed_addr global i1* inttoptr (i64 -1 to i1*) 31*9880d681SAndroid Build Coastguard Worker; OPT: @H8 = local_unnamed_addr global i8* inttoptr (i64 -1 to i8*) 32*9880d681SAndroid Build Coastguard Worker; OPT: @H1 = local_unnamed_addr global i1* inttoptr (i64 -1 to i1*) 33*9880d681SAndroid Build Coastguard Worker; TO: @G8 = local_unnamed_addr global i8* null 34*9880d681SAndroid Build Coastguard Worker; TO: @G1 = local_unnamed_addr global i1* null 35*9880d681SAndroid Build Coastguard Worker; TO: @F8 = local_unnamed_addr global i8* inttoptr (i64 -1 to i8*) 36*9880d681SAndroid Build Coastguard Worker; TO: @F1 = local_unnamed_addr global i1* inttoptr (i64 -1 to i1*) 37*9880d681SAndroid Build Coastguard Worker; TO: @H8 = local_unnamed_addr global i8* inttoptr (i64 -1 to i8*) 38*9880d681SAndroid Build Coastguard Worker; TO: @H1 = local_unnamed_addr global i1* inttoptr (i64 -1 to i1*) 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker@G8 = global i8* getelementptr (i8, i8* inttoptr (i32 1 to i8*), i32 -1) 41*9880d681SAndroid Build Coastguard Worker@G1 = global i1* getelementptr (i1, i1* inttoptr (i32 1 to i1*), i32 -1) 42*9880d681SAndroid Build Coastguard Worker@F8 = global i8* getelementptr (i8, i8* inttoptr (i32 1 to i8*), i32 -2) 43*9880d681SAndroid Build Coastguard Worker@F1 = global i1* getelementptr (i1, i1* inttoptr (i32 1 to i1*), i32 -2) 44*9880d681SAndroid Build Coastguard Worker@H8 = global i8* getelementptr (i8, i8* inttoptr (i32 0 to i8*), i32 -1) 45*9880d681SAndroid Build Coastguard Worker@H1 = global i1* getelementptr (i1, i1* inttoptr (i32 0 to i1*), i32 -1) 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker; The target-independent folder should be able to do some clever 48*9880d681SAndroid Build Coastguard Worker; simplifications on sizeof, alignof, and offsetof expressions. The 49*9880d681SAndroid Build Coastguard Worker; target-dependent folder should fold these down to constants. 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Worker; PLAIN: @a = constant i64 mul (i64 ptrtoint (double* getelementptr (double, double* null, i32 1) to i64), i64 2310) 52*9880d681SAndroid Build Coastguard Worker; PLAIN: @b = constant i64 ptrtoint (double* getelementptr ({ i1, double }, { i1, double }* null, i64 0, i32 1) to i64) 53*9880d681SAndroid Build Coastguard Worker; PLAIN: @c = constant i64 mul nuw (i64 ptrtoint (double* getelementptr (double, double* null, i32 1) to i64), i64 2) 54*9880d681SAndroid Build Coastguard Worker; PLAIN: @d = constant i64 mul nuw (i64 ptrtoint (double* getelementptr (double, double* null, i32 1) to i64), i64 11) 55*9880d681SAndroid Build Coastguard Worker; PLAIN: @e = constant i64 ptrtoint (double* getelementptr ({ double, float, double, double }, { double, float, double, double }* null, i64 0, i32 2) to i64) 56*9880d681SAndroid Build Coastguard Worker; PLAIN: @f = constant i64 1 57*9880d681SAndroid Build Coastguard Worker; PLAIN: @g = constant i64 ptrtoint (double* getelementptr ({ i1, double }, { i1, double }* null, i64 0, i32 1) to i64) 58*9880d681SAndroid Build Coastguard Worker; PLAIN: @h = constant i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64) 59*9880d681SAndroid Build Coastguard Worker; PLAIN: @i = constant i64 ptrtoint (i1** getelementptr ({ i1, i1* }, { i1, i1* }* null, i64 0, i32 1) to i64) 60*9880d681SAndroid Build Coastguard Worker; OPT: @a = local_unnamed_addr constant i64 18480 61*9880d681SAndroid Build Coastguard Worker; OPT: @b = local_unnamed_addr constant i64 8 62*9880d681SAndroid Build Coastguard Worker; OPT: @c = local_unnamed_addr constant i64 16 63*9880d681SAndroid Build Coastguard Worker; OPT: @d = local_unnamed_addr constant i64 88 64*9880d681SAndroid Build Coastguard Worker; OPT: @e = local_unnamed_addr constant i64 16 65*9880d681SAndroid Build Coastguard Worker; OPT: @f = local_unnamed_addr constant i64 1 66*9880d681SAndroid Build Coastguard Worker; OPT: @g = local_unnamed_addr constant i64 8 67*9880d681SAndroid Build Coastguard Worker; OPT: @h = local_unnamed_addr constant i64 8 68*9880d681SAndroid Build Coastguard Worker; OPT: @i = local_unnamed_addr constant i64 8 69*9880d681SAndroid Build Coastguard Worker; TO: @a = local_unnamed_addr constant i64 18480 70*9880d681SAndroid Build Coastguard Worker; TO: @b = local_unnamed_addr constant i64 8 71*9880d681SAndroid Build Coastguard Worker; TO: @c = local_unnamed_addr constant i64 16 72*9880d681SAndroid Build Coastguard Worker; TO: @d = local_unnamed_addr constant i64 88 73*9880d681SAndroid Build Coastguard Worker; TO: @e = local_unnamed_addr constant i64 16 74*9880d681SAndroid Build Coastguard Worker; TO: @f = local_unnamed_addr constant i64 1 75*9880d681SAndroid Build Coastguard Worker; TO: @g = local_unnamed_addr constant i64 8 76*9880d681SAndroid Build Coastguard Worker; TO: @h = local_unnamed_addr constant i64 8 77*9880d681SAndroid Build Coastguard Worker; TO: @i = local_unnamed_addr constant i64 8 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker@a = constant i64 mul (i64 3, i64 mul (i64 ptrtoint ({[7 x double], [7 x double]}* getelementptr ({[7 x double], [7 x double]}, {[7 x double], [7 x double]}* null, i64 11) to i64), i64 5)) 80*9880d681SAndroid Build Coastguard Worker@b = constant i64 ptrtoint ([13 x double]* getelementptr ({i1, [13 x double]}, {i1, [13 x double]}* null, i64 0, i32 1) to i64) 81*9880d681SAndroid Build Coastguard Worker@c = constant i64 ptrtoint (double* getelementptr ({double, double, double, double}, {double, double, double, double}* null, i64 0, i32 2) to i64) 82*9880d681SAndroid Build Coastguard Worker@d = constant i64 ptrtoint (double* getelementptr ([13 x double], [13 x double]* null, i64 0, i32 11) to i64) 83*9880d681SAndroid Build Coastguard Worker@e = constant i64 ptrtoint (double* getelementptr ({double, float, double, double}, {double, float, double, double}* null, i64 0, i32 2) to i64) 84*9880d681SAndroid Build Coastguard Worker@f = constant i64 ptrtoint (<{ i16, i128 }>* getelementptr ({i1, <{ i16, i128 }>}, {i1, <{ i16, i128 }>}* null, i64 0, i32 1) to i64) 85*9880d681SAndroid Build Coastguard Worker@g = constant i64 ptrtoint ({double, double}* getelementptr ({i1, {double, double}}, {i1, {double, double}}* null, i64 0, i32 1) to i64) 86*9880d681SAndroid Build Coastguard Worker@h = constant i64 ptrtoint (double** getelementptr (double*, double** null, i64 1) to i64) 87*9880d681SAndroid Build Coastguard Worker@i = constant i64 ptrtoint (double** getelementptr ({i1, double*}, {i1, double*}* null, i64 0, i32 1) to i64) 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker; The target-dependent folder should cast GEP indices to integer-sized pointers. 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker; PLAIN: @M = constant i64* getelementptr (i64, i64* null, i32 1) 92*9880d681SAndroid Build Coastguard Worker; PLAIN: @N = constant i64* getelementptr ({ i64, i64 }, { i64, i64 }* null, i32 0, i32 1) 93*9880d681SAndroid Build Coastguard Worker; PLAIN: @O = constant i64* getelementptr ([2 x i64], [2 x i64]* null, i32 0, i32 1) 94*9880d681SAndroid Build Coastguard Worker; OPT: @M = local_unnamed_addr constant i64* inttoptr (i64 8 to i64*) 95*9880d681SAndroid Build Coastguard Worker; OPT: @N = local_unnamed_addr constant i64* inttoptr (i64 8 to i64*) 96*9880d681SAndroid Build Coastguard Worker; OPT: @O = local_unnamed_addr constant i64* inttoptr (i64 8 to i64*) 97*9880d681SAndroid Build Coastguard Worker; TO: @M = local_unnamed_addr constant i64* inttoptr (i64 8 to i64*) 98*9880d681SAndroid Build Coastguard Worker; TO: @N = local_unnamed_addr constant i64* inttoptr (i64 8 to i64*) 99*9880d681SAndroid Build Coastguard Worker; TO: @O = local_unnamed_addr constant i64* inttoptr (i64 8 to i64*) 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker@M = constant i64* getelementptr (i64, i64* null, i32 1) 102*9880d681SAndroid Build Coastguard Worker@N = constant i64* getelementptr ({ i64, i64 }, { i64, i64 }* null, i32 0, i32 1) 103*9880d681SAndroid Build Coastguard Worker@O = constant i64* getelementptr ([2 x i64], [2 x i64]* null, i32 0, i32 1) 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker; Fold GEP of a GEP. Very simple cases are folded without targetdata. 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker; PLAIN: @Y = global [3 x { i32, i32 }]* getelementptr inbounds ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 2) 108*9880d681SAndroid Build Coastguard Worker; PLAIN: @Z = global i32* getelementptr inbounds (i32, i32* getelementptr inbounds ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 0, i64 1, i32 0), i64 1) 109*9880d681SAndroid Build Coastguard Worker; OPT: @Y = local_unnamed_addr global [3 x { i32, i32 }]* getelementptr ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 2) 110*9880d681SAndroid Build Coastguard Worker; OPT: @Z = local_unnamed_addr global i32* getelementptr inbounds ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 0, i64 1, i32 1) 111*9880d681SAndroid Build Coastguard Worker; TO: @Y = local_unnamed_addr global [3 x { i32, i32 }]* getelementptr ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 2) 112*9880d681SAndroid Build Coastguard Worker; TO: @Z = local_unnamed_addr global i32* getelementptr inbounds ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 0, i64 1, i32 1) 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Worker@ext = external global [3 x { i32, i32 }] 115*9880d681SAndroid Build Coastguard Worker@Y = global [3 x { i32, i32 }]* getelementptr inbounds ([3 x { i32, i32 }], [3 x { i32, i32 }]* getelementptr inbounds ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 1), i64 1) 116*9880d681SAndroid Build Coastguard Worker@Z = global i32* getelementptr inbounds (i32, i32* getelementptr inbounds ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 0, i64 1, i32 0), i64 1) 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker; Duplicate all of the above as function return values rather than 119*9880d681SAndroid Build Coastguard Worker; global initializers. 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Worker; PLAIN: define i8* @goo8() #0 { 122*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i8* getelementptr (i8, i8* inttoptr (i32 1 to i8*), i32 -1) to i8* 123*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i8* %t 124*9880d681SAndroid Build Coastguard Worker; PLAIN: } 125*9880d681SAndroid Build Coastguard Worker; PLAIN: define i1* @goo1() #0 { 126*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i1* getelementptr (i1, i1* inttoptr (i32 1 to i1*), i32 -1) to i1* 127*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i1* %t 128*9880d681SAndroid Build Coastguard Worker; PLAIN: } 129*9880d681SAndroid Build Coastguard Worker; PLAIN: define i8* @foo8() #0 { 130*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i8* getelementptr (i8, i8* inttoptr (i32 1 to i8*), i32 -2) to i8* 131*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i8* %t 132*9880d681SAndroid Build Coastguard Worker; PLAIN: } 133*9880d681SAndroid Build Coastguard Worker; PLAIN: define i1* @foo1() #0 { 134*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i1* getelementptr (i1, i1* inttoptr (i32 1 to i1*), i32 -2) to i1* 135*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i1* %t 136*9880d681SAndroid Build Coastguard Worker; PLAIN: } 137*9880d681SAndroid Build Coastguard Worker; PLAIN: define i8* @hoo8() #0 { 138*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i8* getelementptr (i8, i8* null, i32 -1) to i8* 139*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i8* %t 140*9880d681SAndroid Build Coastguard Worker; PLAIN: } 141*9880d681SAndroid Build Coastguard Worker; PLAIN: define i1* @hoo1() #0 { 142*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i1* getelementptr (i1, i1* null, i32 -1) to i1* 143*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i1* %t 144*9880d681SAndroid Build Coastguard Worker; PLAIN: } 145*9880d681SAndroid Build Coastguard Worker; OPT: define i8* @goo8() local_unnamed_addr #0 { 146*9880d681SAndroid Build Coastguard Worker; OPT: ret i8* null 147*9880d681SAndroid Build Coastguard Worker; OPT: } 148*9880d681SAndroid Build Coastguard Worker; OPT: define i1* @goo1() local_unnamed_addr #0 { 149*9880d681SAndroid Build Coastguard Worker; OPT: ret i1* null 150*9880d681SAndroid Build Coastguard Worker; OPT: } 151*9880d681SAndroid Build Coastguard Worker; OPT: define i8* @foo8() local_unnamed_addr #0 { 152*9880d681SAndroid Build Coastguard Worker; OPT: ret i8* inttoptr (i64 -1 to i8*) 153*9880d681SAndroid Build Coastguard Worker; OPT: } 154*9880d681SAndroid Build Coastguard Worker; OPT: define i1* @foo1() local_unnamed_addr #0 { 155*9880d681SAndroid Build Coastguard Worker; OPT: ret i1* inttoptr (i64 -1 to i1*) 156*9880d681SAndroid Build Coastguard Worker; OPT: } 157*9880d681SAndroid Build Coastguard Worker; OPT: define i8* @hoo8() local_unnamed_addr #0 { 158*9880d681SAndroid Build Coastguard Worker; OPT: ret i8* inttoptr (i64 -1 to i8*) 159*9880d681SAndroid Build Coastguard Worker; OPT: } 160*9880d681SAndroid Build Coastguard Worker; OPT: define i1* @hoo1() local_unnamed_addr #0 { 161*9880d681SAndroid Build Coastguard Worker; OPT: ret i1* inttoptr (i64 -1 to i1*) 162*9880d681SAndroid Build Coastguard Worker; OPT: } 163*9880d681SAndroid Build Coastguard Worker; TO: define i8* @goo8() local_unnamed_addr #0 { 164*9880d681SAndroid Build Coastguard Worker; TO: ret i8* null 165*9880d681SAndroid Build Coastguard Worker; TO: } 166*9880d681SAndroid Build Coastguard Worker; TO: define i1* @goo1() local_unnamed_addr #0 { 167*9880d681SAndroid Build Coastguard Worker; TO: ret i1* null 168*9880d681SAndroid Build Coastguard Worker; TO: } 169*9880d681SAndroid Build Coastguard Worker; TO: define i8* @foo8() local_unnamed_addr #0 { 170*9880d681SAndroid Build Coastguard Worker; TO: ret i8* inttoptr (i64 -1 to i8*) 171*9880d681SAndroid Build Coastguard Worker; TO: } 172*9880d681SAndroid Build Coastguard Worker; TO: define i1* @foo1() local_unnamed_addr #0 { 173*9880d681SAndroid Build Coastguard Worker; TO: ret i1* inttoptr (i64 -1 to i1*) 174*9880d681SAndroid Build Coastguard Worker; TO: } 175*9880d681SAndroid Build Coastguard Worker; TO: define i8* @hoo8() local_unnamed_addr #0 { 176*9880d681SAndroid Build Coastguard Worker; TO: ret i8* inttoptr (i64 -1 to i8*) 177*9880d681SAndroid Build Coastguard Worker; TO: } 178*9880d681SAndroid Build Coastguard Worker; TO: define i1* @hoo1() local_unnamed_addr #0 { 179*9880d681SAndroid Build Coastguard Worker; TO: ret i1* inttoptr (i64 -1 to i1*) 180*9880d681SAndroid Build Coastguard Worker; TO: } 181*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @goo8 182*9880d681SAndroid Build Coastguard Worker; SCEV: %t = bitcast i8* getelementptr (i8, i8* inttoptr (i32 1 to i8*), i32 -1) to i8* 183*9880d681SAndroid Build Coastguard Worker; SCEV: --> (-1 + inttoptr (i32 1 to i8*)) 184*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @goo1 185*9880d681SAndroid Build Coastguard Worker; SCEV: %t = bitcast i1* getelementptr (i1, i1* inttoptr (i32 1 to i1*), i32 -1) to i1* 186*9880d681SAndroid Build Coastguard Worker; SCEV: --> (-1 + inttoptr (i32 1 to i1*)) 187*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @foo8 188*9880d681SAndroid Build Coastguard Worker; SCEV: %t = bitcast i8* getelementptr (i8, i8* inttoptr (i32 1 to i8*), i32 -2) to i8* 189*9880d681SAndroid Build Coastguard Worker; SCEV: --> (-2 + inttoptr (i32 1 to i8*)) 190*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @foo1 191*9880d681SAndroid Build Coastguard Worker; SCEV: %t = bitcast i1* getelementptr (i1, i1* inttoptr (i32 1 to i1*), i32 -2) to i1* 192*9880d681SAndroid Build Coastguard Worker; SCEV: --> (-2 + inttoptr (i32 1 to i1*)) 193*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @hoo8 194*9880d681SAndroid Build Coastguard Worker; SCEV: --> -1 195*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @hoo1 196*9880d681SAndroid Build Coastguard Worker; SCEV: --> -1 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Workerdefine i8* @goo8() nounwind { 199*9880d681SAndroid Build Coastguard Worker %t = bitcast i8* getelementptr (i8, i8* inttoptr (i32 1 to i8*), i32 -1) to i8* 200*9880d681SAndroid Build Coastguard Worker ret i8* %t 201*9880d681SAndroid Build Coastguard Worker} 202*9880d681SAndroid Build Coastguard Workerdefine i1* @goo1() nounwind { 203*9880d681SAndroid Build Coastguard Worker %t = bitcast i1* getelementptr (i1, i1* inttoptr (i32 1 to i1*), i32 -1) to i1* 204*9880d681SAndroid Build Coastguard Worker ret i1* %t 205*9880d681SAndroid Build Coastguard Worker} 206*9880d681SAndroid Build Coastguard Workerdefine i8* @foo8() nounwind { 207*9880d681SAndroid Build Coastguard Worker %t = bitcast i8* getelementptr (i8, i8* inttoptr (i32 1 to i8*), i32 -2) to i8* 208*9880d681SAndroid Build Coastguard Worker ret i8* %t 209*9880d681SAndroid Build Coastguard Worker} 210*9880d681SAndroid Build Coastguard Workerdefine i1* @foo1() nounwind { 211*9880d681SAndroid Build Coastguard Worker %t = bitcast i1* getelementptr (i1, i1* inttoptr (i32 1 to i1*), i32 -2) to i1* 212*9880d681SAndroid Build Coastguard Worker ret i1* %t 213*9880d681SAndroid Build Coastguard Worker} 214*9880d681SAndroid Build Coastguard Workerdefine i8* @hoo8() nounwind { 215*9880d681SAndroid Build Coastguard Worker %t = bitcast i8* getelementptr (i8, i8* inttoptr (i32 0 to i8*), i32 -1) to i8* 216*9880d681SAndroid Build Coastguard Worker ret i8* %t 217*9880d681SAndroid Build Coastguard Worker} 218*9880d681SAndroid Build Coastguard Workerdefine i1* @hoo1() nounwind { 219*9880d681SAndroid Build Coastguard Worker %t = bitcast i1* getelementptr (i1, i1* inttoptr (i32 0 to i1*), i32 -1) to i1* 220*9880d681SAndroid Build Coastguard Worker ret i1* %t 221*9880d681SAndroid Build Coastguard Worker} 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Worker; PLAIN: define i64 @fa() #0 { 224*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i64 mul (i64 ptrtoint (double* getelementptr (double, double* null, i32 1) to i64), i64 2310) to i64 225*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i64 %t 226*9880d681SAndroid Build Coastguard Worker; PLAIN: } 227*9880d681SAndroid Build Coastguard Worker; PLAIN: define i64 @fb() #0 { 228*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i64 ptrtoint (double* getelementptr ({ i1, double }, { i1, double }* null, i64 0, i32 1) to i64) to i64 229*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i64 %t 230*9880d681SAndroid Build Coastguard Worker; PLAIN: } 231*9880d681SAndroid Build Coastguard Worker; PLAIN: define i64 @fc() #0 { 232*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i64 mul nuw (i64 ptrtoint (double* getelementptr (double, double* null, i32 1) to i64), i64 2) to i64 233*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i64 %t 234*9880d681SAndroid Build Coastguard Worker; PLAIN: } 235*9880d681SAndroid Build Coastguard Worker; PLAIN: define i64 @fd() #0 { 236*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i64 mul nuw (i64 ptrtoint (double* getelementptr (double, double* null, i32 1) to i64), i64 11) to i64 237*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i64 %t 238*9880d681SAndroid Build Coastguard Worker; PLAIN: } 239*9880d681SAndroid Build Coastguard Worker; PLAIN: define i64 @fe() #0 { 240*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i64 ptrtoint (double* getelementptr ({ double, float, double, double }, { double, float, double, double }* null, i64 0, i32 2) to i64) to i64 241*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i64 %t 242*9880d681SAndroid Build Coastguard Worker; PLAIN: } 243*9880d681SAndroid Build Coastguard Worker; PLAIN: define i64 @ff() #0 { 244*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i64 1 to i64 245*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i64 %t 246*9880d681SAndroid Build Coastguard Worker; PLAIN: } 247*9880d681SAndroid Build Coastguard Worker; PLAIN: define i64 @fg() #0 { 248*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i64 ptrtoint (double* getelementptr ({ i1, double }, { i1, double }* null, i64 0, i32 1) to i64) to i64 249*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i64 %t 250*9880d681SAndroid Build Coastguard Worker; PLAIN: } 251*9880d681SAndroid Build Coastguard Worker; PLAIN: define i64 @fh() #0 { 252*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64) to i64 253*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i64 %t 254*9880d681SAndroid Build Coastguard Worker; PLAIN: } 255*9880d681SAndroid Build Coastguard Worker; PLAIN: define i64 @fi() #0 { 256*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i64 ptrtoint (i1** getelementptr ({ i1, i1* }, { i1, i1* }* null, i64 0, i32 1) to i64) to i64 257*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i64 %t 258*9880d681SAndroid Build Coastguard Worker; PLAIN: } 259*9880d681SAndroid Build Coastguard Worker; OPT: define i64 @fa() local_unnamed_addr #0 { 260*9880d681SAndroid Build Coastguard Worker; OPT: ret i64 18480 261*9880d681SAndroid Build Coastguard Worker; OPT: } 262*9880d681SAndroid Build Coastguard Worker; OPT: define i64 @fb() local_unnamed_addr #0 { 263*9880d681SAndroid Build Coastguard Worker; OPT: ret i64 8 264*9880d681SAndroid Build Coastguard Worker; OPT: } 265*9880d681SAndroid Build Coastguard Worker; OPT: define i64 @fc() local_unnamed_addr #0 { 266*9880d681SAndroid Build Coastguard Worker; OPT: ret i64 16 267*9880d681SAndroid Build Coastguard Worker; OPT: } 268*9880d681SAndroid Build Coastguard Worker; OPT: define i64 @fd() local_unnamed_addr #0 { 269*9880d681SAndroid Build Coastguard Worker; OPT: ret i64 88 270*9880d681SAndroid Build Coastguard Worker; OPT: } 271*9880d681SAndroid Build Coastguard Worker; OPT: define i64 @fe() local_unnamed_addr #0 { 272*9880d681SAndroid Build Coastguard Worker; OPT: ret i64 16 273*9880d681SAndroid Build Coastguard Worker; OPT: } 274*9880d681SAndroid Build Coastguard Worker; OPT: define i64 @ff() local_unnamed_addr #0 { 275*9880d681SAndroid Build Coastguard Worker; OPT: ret i64 1 276*9880d681SAndroid Build Coastguard Worker; OPT: } 277*9880d681SAndroid Build Coastguard Worker; OPT: define i64 @fg() local_unnamed_addr #0 { 278*9880d681SAndroid Build Coastguard Worker; OPT: ret i64 8 279*9880d681SAndroid Build Coastguard Worker; OPT: } 280*9880d681SAndroid Build Coastguard Worker; OPT: define i64 @fh() local_unnamed_addr #0 { 281*9880d681SAndroid Build Coastguard Worker; OPT: ret i64 8 282*9880d681SAndroid Build Coastguard Worker; OPT: } 283*9880d681SAndroid Build Coastguard Worker; OPT: define i64 @fi() local_unnamed_addr #0 { 284*9880d681SAndroid Build Coastguard Worker; OPT: ret i64 8 285*9880d681SAndroid Build Coastguard Worker; OPT: } 286*9880d681SAndroid Build Coastguard Worker; TO: define i64 @fa() local_unnamed_addr #0 { 287*9880d681SAndroid Build Coastguard Worker; TO: ret i64 18480 288*9880d681SAndroid Build Coastguard Worker; TO: } 289*9880d681SAndroid Build Coastguard Worker; TO: define i64 @fb() local_unnamed_addr #0 { 290*9880d681SAndroid Build Coastguard Worker; TO: ret i64 8 291*9880d681SAndroid Build Coastguard Worker; TO: } 292*9880d681SAndroid Build Coastguard Worker; TO: define i64 @fc() local_unnamed_addr #0 { 293*9880d681SAndroid Build Coastguard Worker; TO: ret i64 16 294*9880d681SAndroid Build Coastguard Worker; TO: } 295*9880d681SAndroid Build Coastguard Worker; TO: define i64 @fd() local_unnamed_addr #0 { 296*9880d681SAndroid Build Coastguard Worker; TO: ret i64 88 297*9880d681SAndroid Build Coastguard Worker; TO: } 298*9880d681SAndroid Build Coastguard Worker; TO: define i64 @fe() local_unnamed_addr #0 { 299*9880d681SAndroid Build Coastguard Worker; TO: ret i64 16 300*9880d681SAndroid Build Coastguard Worker; TO: } 301*9880d681SAndroid Build Coastguard Worker; TO: define i64 @ff() local_unnamed_addr #0 { 302*9880d681SAndroid Build Coastguard Worker; TO: ret i64 1 303*9880d681SAndroid Build Coastguard Worker; TO: } 304*9880d681SAndroid Build Coastguard Worker; TO: define i64 @fg() local_unnamed_addr #0 { 305*9880d681SAndroid Build Coastguard Worker; TO: ret i64 8 306*9880d681SAndroid Build Coastguard Worker; TO: } 307*9880d681SAndroid Build Coastguard Worker; TO: define i64 @fh() local_unnamed_addr #0 { 308*9880d681SAndroid Build Coastguard Worker; TO: ret i64 8 309*9880d681SAndroid Build Coastguard Worker; TO: } 310*9880d681SAndroid Build Coastguard Worker; TO: define i64 @fi() local_unnamed_addr #0 { 311*9880d681SAndroid Build Coastguard Worker; TO: ret i64 8 312*9880d681SAndroid Build Coastguard Worker; TO: } 313*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @fa 314*9880d681SAndroid Build Coastguard Worker; SCEV: %t = bitcast i64 mul (i64 ptrtoint (double* getelementptr (double, double* null, i32 1) to i64), i64 2310) to i64 315*9880d681SAndroid Build Coastguard Worker; SCEV: --> (2310 * sizeof(double)) 316*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @fb 317*9880d681SAndroid Build Coastguard Worker; SCEV: %t = bitcast i64 ptrtoint (double* getelementptr ({ i1, double }, { i1, double }* null, i64 0, i32 1) to i64) to i64 318*9880d681SAndroid Build Coastguard Worker; SCEV: --> alignof(double) 319*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @fc 320*9880d681SAndroid Build Coastguard Worker; SCEV: %t = bitcast i64 mul nuw (i64 ptrtoint (double* getelementptr (double, double* null, i32 1) to i64), i64 2) to i64 321*9880d681SAndroid Build Coastguard Worker; SCEV: --> (2 * sizeof(double)) 322*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @fd 323*9880d681SAndroid Build Coastguard Worker; SCEV: %t = bitcast i64 mul nuw (i64 ptrtoint (double* getelementptr (double, double* null, i32 1) to i64), i64 11) to i64 324*9880d681SAndroid Build Coastguard Worker; SCEV: --> (11 * sizeof(double)) 325*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @fe 326*9880d681SAndroid Build Coastguard Worker; SCEV: %t = bitcast i64 ptrtoint (double* getelementptr ({ double, float, double, double }, { double, float, double, double }* null, i64 0, i32 2) to i64) to i64 327*9880d681SAndroid Build Coastguard Worker; SCEV: --> offsetof({ double, float, double, double }, 2) 328*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @ff 329*9880d681SAndroid Build Coastguard Worker; SCEV: %t = bitcast i64 1 to i64 330*9880d681SAndroid Build Coastguard Worker; SCEV: --> 1 331*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @fg 332*9880d681SAndroid Build Coastguard Worker; SCEV: %t = bitcast i64 ptrtoint (double* getelementptr ({ i1, double }, { i1, double }* null, i64 0, i32 1) to i64) to i64 333*9880d681SAndroid Build Coastguard Worker; SCEV: --> alignof(double) 334*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @fh 335*9880d681SAndroid Build Coastguard Worker; SCEV: %t = bitcast i64 ptrtoint (i1** getelementptr (i1*, i1** null, i32 1) to i64) to i64 336*9880d681SAndroid Build Coastguard Worker; SCEV: --> sizeof(i1*) 337*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @fi 338*9880d681SAndroid Build Coastguard Worker; SCEV: %t = bitcast i64 ptrtoint (i1** getelementptr ({ i1, i1* }, { i1, i1* }* null, i64 0, i32 1) to i64) to i64 339*9880d681SAndroid Build Coastguard Worker; SCEV: --> alignof(i1*) 340*9880d681SAndroid Build Coastguard Worker 341*9880d681SAndroid Build Coastguard Workerdefine i64 @fa() nounwind { 342*9880d681SAndroid Build Coastguard Worker %t = bitcast i64 mul (i64 3, i64 mul (i64 ptrtoint ({[7 x double], [7 x double]}* getelementptr ({[7 x double], [7 x double]}, {[7 x double], [7 x double]}* null, i64 11) to i64), i64 5)) to i64 343*9880d681SAndroid Build Coastguard Worker ret i64 %t 344*9880d681SAndroid Build Coastguard Worker} 345*9880d681SAndroid Build Coastguard Workerdefine i64 @fb() nounwind { 346*9880d681SAndroid Build Coastguard Worker %t = bitcast i64 ptrtoint ([13 x double]* getelementptr ({i1, [13 x double]}, {i1, [13 x double]}* null, i64 0, i32 1) to i64) to i64 347*9880d681SAndroid Build Coastguard Worker ret i64 %t 348*9880d681SAndroid Build Coastguard Worker} 349*9880d681SAndroid Build Coastguard Workerdefine i64 @fc() nounwind { 350*9880d681SAndroid Build Coastguard Worker %t = bitcast i64 ptrtoint (double* getelementptr ({double, double, double, double}, {double, double, double, double}* null, i64 0, i32 2) to i64) to i64 351*9880d681SAndroid Build Coastguard Worker ret i64 %t 352*9880d681SAndroid Build Coastguard Worker} 353*9880d681SAndroid Build Coastguard Workerdefine i64 @fd() nounwind { 354*9880d681SAndroid Build Coastguard Worker %t = bitcast i64 ptrtoint (double* getelementptr ([13 x double], [13 x double]* null, i64 0, i32 11) to i64) to i64 355*9880d681SAndroid Build Coastguard Worker ret i64 %t 356*9880d681SAndroid Build Coastguard Worker} 357*9880d681SAndroid Build Coastguard Workerdefine i64 @fe() nounwind { 358*9880d681SAndroid Build Coastguard Worker %t = bitcast i64 ptrtoint (double* getelementptr ({double, float, double, double}, {double, float, double, double}* null, i64 0, i32 2) to i64) to i64 359*9880d681SAndroid Build Coastguard Worker ret i64 %t 360*9880d681SAndroid Build Coastguard Worker} 361*9880d681SAndroid Build Coastguard Workerdefine i64 @ff() nounwind { 362*9880d681SAndroid Build Coastguard Worker %t = bitcast i64 ptrtoint (<{ i16, i128 }>* getelementptr ({i1, <{ i16, i128 }>}, {i1, <{ i16, i128 }>}* null, i64 0, i32 1) to i64) to i64 363*9880d681SAndroid Build Coastguard Worker ret i64 %t 364*9880d681SAndroid Build Coastguard Worker} 365*9880d681SAndroid Build Coastguard Workerdefine i64 @fg() nounwind { 366*9880d681SAndroid Build Coastguard Worker %t = bitcast i64 ptrtoint ({double, double}* getelementptr ({i1, {double, double}}, {i1, {double, double}}* null, i64 0, i32 1) to i64) to i64 367*9880d681SAndroid Build Coastguard Worker ret i64 %t 368*9880d681SAndroid Build Coastguard Worker} 369*9880d681SAndroid Build Coastguard Workerdefine i64 @fh() nounwind { 370*9880d681SAndroid Build Coastguard Worker %t = bitcast i64 ptrtoint (double** getelementptr (double*, double** null, i32 1) to i64) to i64 371*9880d681SAndroid Build Coastguard Worker ret i64 %t 372*9880d681SAndroid Build Coastguard Worker} 373*9880d681SAndroid Build Coastguard Workerdefine i64 @fi() nounwind { 374*9880d681SAndroid Build Coastguard Worker %t = bitcast i64 ptrtoint (double** getelementptr ({i1, double*}, {i1, double*}* null, i64 0, i32 1) to i64) to i64 375*9880d681SAndroid Build Coastguard Worker ret i64 %t 376*9880d681SAndroid Build Coastguard Worker} 377*9880d681SAndroid Build Coastguard Worker 378*9880d681SAndroid Build Coastguard Worker; PLAIN: define i64* @fM() #0 { 379*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i64* getelementptr (i64, i64* null, i32 1) to i64* 380*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i64* %t 381*9880d681SAndroid Build Coastguard Worker; PLAIN: } 382*9880d681SAndroid Build Coastguard Worker; PLAIN: define i64* @fN() #0 { 383*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i64* getelementptr ({ i64, i64 }, { i64, i64 }* null, i32 0, i32 1) to i64* 384*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i64* %t 385*9880d681SAndroid Build Coastguard Worker; PLAIN: } 386*9880d681SAndroid Build Coastguard Worker; PLAIN: define i64* @fO() #0 { 387*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i64* getelementptr ([2 x i64], [2 x i64]* null, i32 0, i32 1) to i64* 388*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i64* %t 389*9880d681SAndroid Build Coastguard Worker; PLAIN: } 390*9880d681SAndroid Build Coastguard Worker; OPT: define i64* @fM() local_unnamed_addr #0 { 391*9880d681SAndroid Build Coastguard Worker; OPT: ret i64* inttoptr (i64 8 to i64*) 392*9880d681SAndroid Build Coastguard Worker; OPT: } 393*9880d681SAndroid Build Coastguard Worker; OPT: define i64* @fN() local_unnamed_addr #0 { 394*9880d681SAndroid Build Coastguard Worker; OPT: ret i64* inttoptr (i64 8 to i64*) 395*9880d681SAndroid Build Coastguard Worker; OPT: } 396*9880d681SAndroid Build Coastguard Worker; OPT: define i64* @fO() local_unnamed_addr #0 { 397*9880d681SAndroid Build Coastguard Worker; OPT: ret i64* inttoptr (i64 8 to i64*) 398*9880d681SAndroid Build Coastguard Worker; OPT: } 399*9880d681SAndroid Build Coastguard Worker; TO: define i64* @fM() local_unnamed_addr #0 { 400*9880d681SAndroid Build Coastguard Worker; TO: ret i64* inttoptr (i64 8 to i64*) 401*9880d681SAndroid Build Coastguard Worker; TO: } 402*9880d681SAndroid Build Coastguard Worker; TO: define i64* @fN() local_unnamed_addr #0 { 403*9880d681SAndroid Build Coastguard Worker; TO: ret i64* inttoptr (i64 8 to i64*) 404*9880d681SAndroid Build Coastguard Worker; TO: } 405*9880d681SAndroid Build Coastguard Worker; TO: define i64* @fO() local_unnamed_addr #0 { 406*9880d681SAndroid Build Coastguard Worker; TO: ret i64* inttoptr (i64 8 to i64*) 407*9880d681SAndroid Build Coastguard Worker; TO: } 408*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @fM 409*9880d681SAndroid Build Coastguard Worker; SCEV: %t = bitcast i64* getelementptr (i64, i64* null, i32 1) to i64* 410*9880d681SAndroid Build Coastguard Worker; SCEV: --> 8 411*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @fN 412*9880d681SAndroid Build Coastguard Worker; SCEV: %t = bitcast i64* getelementptr ({ i64, i64 }, { i64, i64 }* null, i32 0, i32 1) to i64* 413*9880d681SAndroid Build Coastguard Worker; SCEV: --> 8 414*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @fO 415*9880d681SAndroid Build Coastguard Worker; SCEV: %t = bitcast i64* getelementptr ([2 x i64], [2 x i64]* null, i32 0, i32 1) to i64* 416*9880d681SAndroid Build Coastguard Worker; SCEV: --> 8 417*9880d681SAndroid Build Coastguard Worker 418*9880d681SAndroid Build Coastguard Workerdefine i64* @fM() nounwind { 419*9880d681SAndroid Build Coastguard Worker %t = bitcast i64* getelementptr (i64, i64* null, i32 1) to i64* 420*9880d681SAndroid Build Coastguard Worker ret i64* %t 421*9880d681SAndroid Build Coastguard Worker} 422*9880d681SAndroid Build Coastguard Workerdefine i64* @fN() nounwind { 423*9880d681SAndroid Build Coastguard Worker %t = bitcast i64* getelementptr ({ i64, i64 }, { i64, i64 }* null, i32 0, i32 1) to i64* 424*9880d681SAndroid Build Coastguard Worker ret i64* %t 425*9880d681SAndroid Build Coastguard Worker} 426*9880d681SAndroid Build Coastguard Workerdefine i64* @fO() nounwind { 427*9880d681SAndroid Build Coastguard Worker %t = bitcast i64* getelementptr ([2 x i64], [2 x i64]* null, i32 0, i32 1) to i64* 428*9880d681SAndroid Build Coastguard Worker ret i64* %t 429*9880d681SAndroid Build Coastguard Worker} 430*9880d681SAndroid Build Coastguard Worker 431*9880d681SAndroid Build Coastguard Worker; PLAIN: define i32* @fZ() #0 { 432*9880d681SAndroid Build Coastguard Worker; PLAIN: %t = bitcast i32* getelementptr inbounds (i32, i32* getelementptr inbounds ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 0, i64 1, i32 0), i64 1) to i32* 433*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i32* %t 434*9880d681SAndroid Build Coastguard Worker; PLAIN: } 435*9880d681SAndroid Build Coastguard Worker; OPT: define i32* @fZ() local_unnamed_addr #0 { 436*9880d681SAndroid Build Coastguard Worker; OPT: ret i32* getelementptr inbounds ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 0, i64 1, i32 1) 437*9880d681SAndroid Build Coastguard Worker; OPT: } 438*9880d681SAndroid Build Coastguard Worker; TO: define i32* @fZ() local_unnamed_addr #0 { 439*9880d681SAndroid Build Coastguard Worker; TO: ret i32* getelementptr inbounds ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 0, i64 1, i32 1) 440*9880d681SAndroid Build Coastguard Worker; TO: } 441*9880d681SAndroid Build Coastguard Worker; SCEV: Classifying expressions for: @fZ 442*9880d681SAndroid Build Coastguard Worker; SCEV: %t = bitcast i32* getelementptr inbounds (i32, i32* getelementptr inbounds ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 0, i64 1, i32 0), i64 1) to i32* 443*9880d681SAndroid Build Coastguard Worker; SCEV: --> (12 + @ext) 444*9880d681SAndroid Build Coastguard Worker 445*9880d681SAndroid Build Coastguard Workerdefine i32* @fZ() nounwind { 446*9880d681SAndroid Build Coastguard Worker %t = bitcast i32* getelementptr inbounds (i32, i32* getelementptr inbounds ([3 x { i32, i32 }], [3 x { i32, i32 }]* @ext, i64 0, i64 1, i32 0), i64 1) to i32* 447*9880d681SAndroid Build Coastguard Worker ret i32* %t 448*9880d681SAndroid Build Coastguard Worker} 449*9880d681SAndroid Build Coastguard Worker 450*9880d681SAndroid Build Coastguard Worker; PR15262 - Check GEP folding with casts between address spaces. 451*9880d681SAndroid Build Coastguard Worker 452*9880d681SAndroid Build Coastguard Worker@p0 = global [4 x i8] zeroinitializer, align 1 453*9880d681SAndroid Build Coastguard Worker@p12 = addrspace(12) global [4 x i8] zeroinitializer, align 1 454*9880d681SAndroid Build Coastguard Worker 455*9880d681SAndroid Build Coastguard Workerdefine i8* @different_addrspace() nounwind noinline { 456*9880d681SAndroid Build Coastguard Worker; OPT: different_addrspace 457*9880d681SAndroid Build Coastguard Worker %p = getelementptr inbounds i8, i8* addrspacecast ([4 x i8] addrspace(12)* @p12 to i8*), 458*9880d681SAndroid Build Coastguard Worker i32 2 459*9880d681SAndroid Build Coastguard Worker ret i8* %p 460*9880d681SAndroid Build Coastguard Worker; OPT: ret i8* getelementptr ([4 x i8], [4 x i8]* addrspacecast ([4 x i8] addrspace(12)* @p12 to [4 x i8]*), i64 0, i64 2) 461*9880d681SAndroid Build Coastguard Worker} 462*9880d681SAndroid Build Coastguard Worker 463*9880d681SAndroid Build Coastguard Workerdefine i8* @same_addrspace() nounwind noinline { 464*9880d681SAndroid Build Coastguard Worker; OPT: same_addrspace 465*9880d681SAndroid Build Coastguard Worker %p = getelementptr inbounds i8, i8* bitcast ([4 x i8] * @p0 to i8*), i32 2 466*9880d681SAndroid Build Coastguard Worker ret i8* %p 467*9880d681SAndroid Build Coastguard Worker; OPT: ret i8* getelementptr inbounds ([4 x i8], [4 x i8]* @p0, i64 0, i64 2) 468*9880d681SAndroid Build Coastguard Worker} 469*9880d681SAndroid Build Coastguard Worker 470*9880d681SAndroid Build Coastguard Worker@gv1 = internal global i32 1 471*9880d681SAndroid Build Coastguard Worker@gv2 = internal global [1 x i32] [ i32 2 ] 472*9880d681SAndroid Build Coastguard Worker@gv3 = internal global [1 x i32] [ i32 2 ] 473*9880d681SAndroid Build Coastguard Worker 474*9880d681SAndroid Build Coastguard Worker; Handled by TI-independent constant folder 475*9880d681SAndroid Build Coastguard Workerdefine i1 @gv_gep_vs_gv() { 476*9880d681SAndroid Build Coastguard Worker ret i1 icmp eq (i32* getelementptr inbounds ([1 x i32], [1 x i32]* @gv2, i32 0, i32 0), i32* @gv1) 477*9880d681SAndroid Build Coastguard Worker} 478*9880d681SAndroid Build Coastguard Worker; PLAIN: gv_gep_vs_gv 479*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i1 false 480*9880d681SAndroid Build Coastguard Worker 481*9880d681SAndroid Build Coastguard Workerdefine i1 @gv_gep_vs_gv_gep() { 482*9880d681SAndroid Build Coastguard Worker ret i1 icmp eq (i32* getelementptr inbounds ([1 x i32], [1 x i32]* @gv2, i32 0, i32 0), i32* getelementptr inbounds ([1 x i32], [1 x i32]* @gv3, i32 0, i32 0)) 483*9880d681SAndroid Build Coastguard Worker} 484*9880d681SAndroid Build Coastguard Worker; PLAIN: gv_gep_vs_gv_gep 485*9880d681SAndroid Build Coastguard Worker; PLAIN: ret i1 false 486*9880d681SAndroid Build Coastguard Worker 487*9880d681SAndroid Build Coastguard Worker; CHECK: attributes #0 = { nounwind } 488