xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/addrspacecast.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -instcombine -S < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-p1:32:32:32-p2:16:16:16-n8:16:32:64"
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p0i8.i32(i8*, i8*, i32, i32, i1) nounwind
7*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p1i8.i32(i8*, i8 addrspace(1)*, i32, i32, i1) nounwind
8*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p2i8.i32(i8*, i8 addrspace(2)*, i32, i32, i1) nounwind
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Workerdefine i32* @combine_redundant_addrspacecast(i32 addrspace(1)* %x) nounwind {
12*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @combine_redundant_addrspacecast(
13*9880d681SAndroid Build Coastguard Worker; CHECK: addrspacecast i32 addrspace(1)* %x to i32*
14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
15*9880d681SAndroid Build Coastguard Worker  %y = addrspacecast i32 addrspace(1)* %x to i32 addrspace(3)*
16*9880d681SAndroid Build Coastguard Worker  %z = addrspacecast i32 addrspace(3)* %y to i32*
17*9880d681SAndroid Build Coastguard Worker  ret i32* %z
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdefine <4 x i32*> @combine_redundant_addrspacecast_vector(<4 x i32 addrspace(1)*> %x) nounwind {
21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @combine_redundant_addrspacecast_vector(
22*9880d681SAndroid Build Coastguard Worker; CHECK: addrspacecast <4 x i32 addrspace(1)*> %x to <4 x i32*>
23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
24*9880d681SAndroid Build Coastguard Worker  %y = addrspacecast <4 x i32 addrspace(1)*> %x to <4 x i32 addrspace(3)*>
25*9880d681SAndroid Build Coastguard Worker  %z = addrspacecast <4 x i32 addrspace(3)*> %y to <4 x i32*>
26*9880d681SAndroid Build Coastguard Worker  ret <4 x i32*> %z
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdefine float* @combine_redundant_addrspacecast_types(i32 addrspace(1)* %x) nounwind {
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @combine_redundant_addrspacecast_types(
31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bitcast i32 addrspace(1)* %x to float addrspace(1)*
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: addrspacecast float addrspace(1)* %1 to float*
33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
34*9880d681SAndroid Build Coastguard Worker  %y = addrspacecast i32 addrspace(1)* %x to i32 addrspace(3)*
35*9880d681SAndroid Build Coastguard Worker  %z = addrspacecast i32 addrspace(3)* %y to float*
36*9880d681SAndroid Build Coastguard Worker  ret float* %z
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerdefine <4 x float*> @combine_redundant_addrspacecast_types_vector(<4 x i32 addrspace(1)*> %x) nounwind {
40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @combine_redundant_addrspacecast_types_vector(
41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bitcast <4 x i32 addrspace(1)*> %x to <4 x float addrspace(1)*>
42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: addrspacecast <4 x float addrspace(1)*> %1 to <4 x float*>
43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
44*9880d681SAndroid Build Coastguard Worker  %y = addrspacecast <4 x i32 addrspace(1)*> %x to <4 x i32 addrspace(3)*>
45*9880d681SAndroid Build Coastguard Worker  %z = addrspacecast <4 x i32 addrspace(3)*> %y to <4 x float*>
46*9880d681SAndroid Build Coastguard Worker  ret <4 x float*> %z
47*9880d681SAndroid Build Coastguard Worker}
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerdefine float addrspace(2)* @combine_addrspacecast_bitcast_1(i32 addrspace(1)* %x) nounwind {
50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @combine_addrspacecast_bitcast_1(
51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bitcast i32 addrspace(1)* %x to float addrspace(1)*
52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: addrspacecast float addrspace(1)* %1 to float addrspace(2)*
53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
54*9880d681SAndroid Build Coastguard Worker  %y = addrspacecast i32 addrspace(1)* %x to i32 addrspace(2)*
55*9880d681SAndroid Build Coastguard Worker  %z = bitcast i32 addrspace(2)* %y to float addrspace(2)*
56*9880d681SAndroid Build Coastguard Worker  ret float addrspace(2)* %z
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdefine i32 addrspace(2)* @combine_addrspacecast_bitcast_2(i32 addrspace(1)* %x) nounwind {
60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @combine_addrspacecast_bitcast_2(
61*9880d681SAndroid Build Coastguard Worker; CHECK: addrspacecast i32 addrspace(1)* %x to i32 addrspace(2)*
62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
63*9880d681SAndroid Build Coastguard Worker  %y = addrspacecast i32 addrspace(1)* %x to float addrspace(2)*
64*9880d681SAndroid Build Coastguard Worker  %z = bitcast float addrspace(2)* %y to i32 addrspace(2)*
65*9880d681SAndroid Build Coastguard Worker  ret i32 addrspace(2)* %z
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerdefine i32 addrspace(2)* @combine_bitcast_addrspacecast_1(i32 addrspace(1)* %x) nounwind {
69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @combine_bitcast_addrspacecast_1(
70*9880d681SAndroid Build Coastguard Worker; CHECK: addrspacecast i32 addrspace(1)* %x to i32 addrspace(2)*
71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
72*9880d681SAndroid Build Coastguard Worker  %y = bitcast i32 addrspace(1)* %x to i8 addrspace(1)*
73*9880d681SAndroid Build Coastguard Worker  %z = addrspacecast i8 addrspace(1)* %y to i32 addrspace(2)*
74*9880d681SAndroid Build Coastguard Worker  ret i32 addrspace(2)* %z
75*9880d681SAndroid Build Coastguard Worker}
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerdefine float addrspace(2)* @combine_bitcast_addrspacecast_2(i32 addrspace(1)* %x) nounwind {
78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @combine_bitcast_addrspacecast_2(
79*9880d681SAndroid Build Coastguard Worker; CHECK: bitcast i32 addrspace(1)* %x to float addrspace(1)*
80*9880d681SAndroid Build Coastguard Worker; CHECK: addrspacecast float addrspace(1)* %1 to float addrspace(2)*
81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
82*9880d681SAndroid Build Coastguard Worker  %y = bitcast i32 addrspace(1)* %x to i8 addrspace(1)*
83*9880d681SAndroid Build Coastguard Worker  %z = addrspacecast i8 addrspace(1)* %y to float addrspace(2)*
84*9880d681SAndroid Build Coastguard Worker  ret float addrspace(2)* %z
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerdefine float addrspace(2)* @combine_addrspacecast_types(i32 addrspace(1)* %x) nounwind {
88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @combine_addrspacecast_types(
89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bitcast i32 addrspace(1)* %x to float addrspace(1)*
90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: addrspacecast float addrspace(1)* %1 to float addrspace(2)*
91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
92*9880d681SAndroid Build Coastguard Worker  %y = addrspacecast i32 addrspace(1)* %x to float addrspace(2)*
93*9880d681SAndroid Build Coastguard Worker  ret float addrspace(2)* %y
94*9880d681SAndroid Build Coastguard Worker}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerdefine <4 x float addrspace(2)*> @combine_addrspacecast_types_vector(<4 x i32 addrspace(1)*> %x) nounwind {
97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @combine_addrspacecast_types_vector(
98*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bitcast <4 x i32 addrspace(1)*> %x to <4 x float addrspace(1)*>
99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: addrspacecast <4 x float addrspace(1)*> %1 to <4 x float addrspace(2)*>
100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
101*9880d681SAndroid Build Coastguard Worker  %y = addrspacecast <4 x i32 addrspace(1)*> %x to <4 x float addrspace(2)*>
102*9880d681SAndroid Build Coastguard Worker  ret <4 x float addrspace(2)*> %y
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Workerdefine i32 @canonicalize_addrspacecast([16 x i32] addrspace(1)* %arr) {
106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @canonicalize_addrspacecast(
107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: getelementptr inbounds [16 x i32], [16 x i32] addrspace(1)* %arr, i32 0, i32 0
108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: addrspacecast i32 addrspace(1)* %{{[a-zA-Z0-9]+}} to i32*
109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: load i32, i32*
110*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
111*9880d681SAndroid Build Coastguard Worker  %p = addrspacecast [16 x i32] addrspace(1)* %arr to i32*
112*9880d681SAndroid Build Coastguard Worker  %v = load i32, i32* %p
113*9880d681SAndroid Build Coastguard Worker  ret i32 %v
114*9880d681SAndroid Build Coastguard Worker}
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker@const_array = addrspace(2) constant [60 x i8] [i8 2, i8 9, i8 4, i8 22, i8 2, i8 9, i8 4, i8 22, i8 2, i8 9, i8 4, i8 22,
117*9880d681SAndroid Build Coastguard Worker                                                i8 2, i8 9, i8 4, i8 22, i8 2, i8 9, i8 4, i8 22, i8 2, i8 9, i8 4, i8 22,
118*9880d681SAndroid Build Coastguard Worker                                                i8 2, i8 9, i8 4, i8 22, i8 2, i8 9, i8 4, i8 22, i8 2, i8 9, i8 4, i8 22,
119*9880d681SAndroid Build Coastguard Worker                                                i8 2, i8 9, i8 4, i8 22, i8 2, i8 9, i8 4, i8 22, i8 2, i8 9, i8 4, i8 22,
120*9880d681SAndroid Build Coastguard Worker                                                i8 2, i8 9, i8 4, i8 22, i8 2, i8 9, i8 4, i8 22, i8 2, i8 9, i8 4, i8 22 ]
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Workerdeclare void @foo(i8*) nounwind
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker; A copy from a constant addrspacecast'ed global
125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @memcpy_addrspacecast(
126*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:  call void @llvm.memcpy
127*9880d681SAndroid Build Coastguard Workerdefine i32 @memcpy_addrspacecast() nounwind {
128*9880d681SAndroid Build Coastguard Workerentry:
129*9880d681SAndroid Build Coastguard Worker  %alloca = alloca i8, i32 48
130*9880d681SAndroid Build Coastguard Worker  call void @llvm.memcpy.p0i8.p1i8.i32(i8* %alloca, i8 addrspace(1)* addrspacecast (i8 addrspace(2)* getelementptr inbounds ([60 x i8], [60 x i8] addrspace(2)* @const_array, i16 0, i16 4) to i8 addrspace(1)*), i32 48, i32 4, i1 false) nounwind
131*9880d681SAndroid Build Coastguard Worker  br label %loop.body
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Workerloop.body:
134*9880d681SAndroid Build Coastguard Worker  %i = phi i32 [ 0, %entry ], [ %i.inc, %loop.body ]
135*9880d681SAndroid Build Coastguard Worker  %sum = phi i32 [ 0, %entry ], [ %sum.inc, %loop.body]
136*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr i8, i8* %alloca, i32 %i
137*9880d681SAndroid Build Coastguard Worker  %load = load i8, i8* %ptr
138*9880d681SAndroid Build Coastguard Worker  %ext = zext i8 %load to i32
139*9880d681SAndroid Build Coastguard Worker  %sum.inc = add i32 %sum, %ext
140*9880d681SAndroid Build Coastguard Worker  %i.inc = add i32 %i, 1
141*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i32 %i, 48
142*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %loop.body, label %end
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerend:
145*9880d681SAndroid Build Coastguard Worker  ret i32 %sum.inc
146*9880d681SAndroid Build Coastguard Worker}
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_null(
149*9880d681SAndroid Build Coastguard Worker; CHECK: i32 addrspace(3)* null to i32 addrspace(4)*
150*9880d681SAndroid Build Coastguard Workerdefine void @constant_fold_null() #0 {
151*9880d681SAndroid Build Coastguard Worker  %cast = addrspacecast i32 addrspace(3)* null to i32 addrspace(4)*
152*9880d681SAndroid Build Coastguard Worker  store i32 7, i32 addrspace(4)* %cast
153*9880d681SAndroid Build Coastguard Worker  ret void
154*9880d681SAndroid Build Coastguard Worker}
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_undef(
157*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 addrspace(4)* undef
158*9880d681SAndroid Build Coastguard Workerdefine i32 addrspace(4)* @constant_fold_undef() #0 {
159*9880d681SAndroid Build Coastguard Worker  %cast = addrspacecast i32 addrspace(3)* undef to i32 addrspace(4)*
160*9880d681SAndroid Build Coastguard Worker  ret i32 addrspace(4)* %cast
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_null_vector(
164*9880d681SAndroid Build Coastguard Worker; CHECK: addrspacecast (<4 x i32 addrspace(3)*> zeroinitializer to <4 x i32 addrspace(4)*>)
165*9880d681SAndroid Build Coastguard Workerdefine <4 x i32 addrspace(4)*> @constant_fold_null_vector() #0 {
166*9880d681SAndroid Build Coastguard Worker  %cast = addrspacecast <4 x i32 addrspace(3)*> zeroinitializer to <4 x i32 addrspace(4)*>
167*9880d681SAndroid Build Coastguard Worker  ret <4 x i32 addrspace(4)*> %cast
168*9880d681SAndroid Build Coastguard Worker}
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_inttoptr(
171*9880d681SAndroid Build Coastguard Worker; CHECK: addrspacecast (i32 addrspace(3)* inttoptr (i32 -1 to i32 addrspace(3)*) to i32 addrspace(4)*)
172*9880d681SAndroid Build Coastguard Workerdefine void @constant_fold_inttoptr() #0 {
173*9880d681SAndroid Build Coastguard Worker  %cast = addrspacecast i32 addrspace(3)* inttoptr (i32 -1 to i32 addrspace(3)*) to i32 addrspace(4)*
174*9880d681SAndroid Build Coastguard Worker  store i32 7, i32 addrspace(4)* %cast
175*9880d681SAndroid Build Coastguard Worker  ret void
176*9880d681SAndroid Build Coastguard Worker}
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @constant_fold_gep_inttoptr(
179*9880d681SAndroid Build Coastguard Worker; CHECK: addrspacecast (i32 addrspace(3)* inttoptr (i64 1274 to i32 addrspace(3)*) to i32 addrspace(4)*)
180*9880d681SAndroid Build Coastguard Workerdefine void @constant_fold_gep_inttoptr() #0 {
181*9880d681SAndroid Build Coastguard Worker  %k = inttoptr i32 1234 to i32 addrspace(3)*
182*9880d681SAndroid Build Coastguard Worker  %gep = getelementptr i32, i32 addrspace(3)* %k, i32 10
183*9880d681SAndroid Build Coastguard Worker  %cast = addrspacecast i32 addrspace(3)* %gep to i32 addrspace(4)*
184*9880d681SAndroid Build Coastguard Worker  store i32 7, i32 addrspace(4)* %cast
185*9880d681SAndroid Build Coastguard Worker  ret void
186*9880d681SAndroid Build Coastguard Worker}
187