xref: /aosp_15_r20/external/llvm/test/Other/constant-fold-gep.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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