blob: 6f674f443c94928940aed0215ab1e8270c78f7cb [file] [log] [blame]
Philip Reames3d40c752020-06-04 15:22:07 -07001; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
Eric Christophercee313d2019-04-17 04:52:47 +00002; RUN: opt < %s -rewrite-statepoints-for-gc -S | FileCheck %s
3; RUN: opt < %s -passes=rewrite-statepoints-for-gc -S | FileCheck %s
4
5
6declare void @use_obj16(i16 addrspace(1)*) "gc-leaf-function"
7declare void @use_obj32(i32 addrspace(1)*) "gc-leaf-function"
8declare void @use_obj64(i64 addrspace(1)*) "gc-leaf-function"
9
10declare void @do_safepoint()
11
12define void @test_gep_const(i32 addrspace(1)* %base) gc "statepoint-example" {
Philip Reames3d40c752020-06-04 15:22:07 -070013; CHECK-LABEL: @test_gep_const(
14; CHECK-NEXT: entry:
15; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE:%.*]], i32 15
16; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i32 addrspace(1)* [[BASE]]) ]
17; CHECK-NEXT: [[BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
18; CHECK-NEXT: [[BASE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BASE_RELOCATED]] to i32 addrspace(1)*
19; CHECK-NEXT: [[PTR_REMAT:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE_RELOCATED_CASTED]], i32 15
20; CHECK-NEXT: call void @use_obj32(i32 addrspace(1)* [[BASE_RELOCATED_CASTED]])
21; CHECK-NEXT: call void @use_obj32(i32 addrspace(1)* [[PTR_REMAT]])
22; CHECK-NEXT: ret void
23;
Eric Christophercee313d2019-04-17 04:52:47 +000024entry:
25 %ptr = getelementptr i32, i32 addrspace(1)* %base, i32 15
Eric Christophercee313d2019-04-17 04:52:47 +000026 call void @do_safepoint() [ "deopt"() ]
Eric Christophercee313d2019-04-17 04:52:47 +000027 call void @use_obj32(i32 addrspace(1)* %base)
28 call void @use_obj32(i32 addrspace(1)* %ptr)
29 ret void
30}
31
32define void @test_gep_idx(i32 addrspace(1)* %base, i32 %idx) gc "statepoint-example" {
Philip Reames3d40c752020-06-04 15:22:07 -070033; CHECK-LABEL: @test_gep_idx(
34; CHECK-NEXT: entry:
35; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE:%.*]], i32 [[IDX:%.*]]
36; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i32 addrspace(1)* [[BASE]]) ]
37; CHECK-NEXT: [[BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
38; CHECK-NEXT: [[BASE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BASE_RELOCATED]] to i32 addrspace(1)*
39; CHECK-NEXT: [[PTR_REMAT:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE_RELOCATED_CASTED]], i32 [[IDX]]
40; CHECK-NEXT: call void @use_obj32(i32 addrspace(1)* [[BASE_RELOCATED_CASTED]])
41; CHECK-NEXT: call void @use_obj32(i32 addrspace(1)* [[PTR_REMAT]])
42; CHECK-NEXT: ret void
43;
Eric Christophercee313d2019-04-17 04:52:47 +000044entry:
45 %ptr = getelementptr i32, i32 addrspace(1)* %base, i32 %idx
Eric Christophercee313d2019-04-17 04:52:47 +000046 call void @do_safepoint() [ "deopt"() ]
Eric Christophercee313d2019-04-17 04:52:47 +000047 call void @use_obj32(i32 addrspace(1)* %base)
48 call void @use_obj32(i32 addrspace(1)* %ptr)
49 ret void
50}
51
52define void @test_bitcast(i32 addrspace(1)* %base) gc "statepoint-example" {
Philip Reames3d40c752020-06-04 15:22:07 -070053; CHECK-LABEL: @test_bitcast(
54; CHECK-NEXT: entry:
55; CHECK-NEXT: [[PTR:%.*]] = bitcast i32 addrspace(1)* [[BASE:%.*]] to i64 addrspace(1)*
56; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i32 addrspace(1)* [[BASE]]) ]
57; CHECK-NEXT: [[BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
58; CHECK-NEXT: [[BASE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BASE_RELOCATED]] to i32 addrspace(1)*
59; CHECK-NEXT: [[PTR_REMAT:%.*]] = bitcast i32 addrspace(1)* [[BASE_RELOCATED_CASTED]] to i64 addrspace(1)*
60; CHECK-NEXT: call void @use_obj32(i32 addrspace(1)* [[BASE_RELOCATED_CASTED]])
61; CHECK-NEXT: call void @use_obj64(i64 addrspace(1)* [[PTR_REMAT]])
62; CHECK-NEXT: ret void
63;
Eric Christophercee313d2019-04-17 04:52:47 +000064entry:
65 %ptr = bitcast i32 addrspace(1)* %base to i64 addrspace(1)*
Eric Christophercee313d2019-04-17 04:52:47 +000066 call void @do_safepoint() [ "deopt"() ]
Eric Christophercee313d2019-04-17 04:52:47 +000067 call void @use_obj32(i32 addrspace(1)* %base)
68 call void @use_obj64(i64 addrspace(1)* %ptr)
69 ret void
70}
71
72define void @test_bitcast_bitcast(i32 addrspace(1)* %base) gc "statepoint-example" {
Philip Reames3d40c752020-06-04 15:22:07 -070073; CHECK-LABEL: @test_bitcast_bitcast(
74; CHECK-NEXT: entry:
75; CHECK-NEXT: [[PTR1:%.*]] = bitcast i32 addrspace(1)* [[BASE:%.*]] to i64 addrspace(1)*
76; CHECK-NEXT: [[PTR2:%.*]] = bitcast i64 addrspace(1)* [[PTR1]] to i16 addrspace(1)*
77; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i32 addrspace(1)* [[BASE]]) ]
78; CHECK-NEXT: [[BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
79; CHECK-NEXT: [[BASE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BASE_RELOCATED]] to i32 addrspace(1)*
80; CHECK-NEXT: [[PTR1_REMAT:%.*]] = bitcast i32 addrspace(1)* [[BASE_RELOCATED_CASTED]] to i64 addrspace(1)*
81; CHECK-NEXT: [[PTR2_REMAT:%.*]] = bitcast i64 addrspace(1)* [[PTR1_REMAT]] to i16 addrspace(1)*
82; CHECK-NEXT: call void @use_obj32(i32 addrspace(1)* [[BASE_RELOCATED_CASTED]])
83; CHECK-NEXT: call void @use_obj16(i16 addrspace(1)* [[PTR2_REMAT]])
84; CHECK-NEXT: ret void
85;
Eric Christophercee313d2019-04-17 04:52:47 +000086entry:
87 %ptr1 = bitcast i32 addrspace(1)* %base to i64 addrspace(1)*
88 %ptr2 = bitcast i64 addrspace(1)* %ptr1 to i16 addrspace(1)*
Eric Christophercee313d2019-04-17 04:52:47 +000089 call void @do_safepoint() [ "deopt"() ]
90
Eric Christophercee313d2019-04-17 04:52:47 +000091 call void @use_obj32(i32 addrspace(1)* %base)
92 call void @use_obj16(i16 addrspace(1)* %ptr2)
93 ret void
94}
95
96define void @test_addrspacecast_addrspacecast(i32 addrspace(1)* %base) gc "statepoint-example" {
Philip Reames3d40c752020-06-04 15:22:07 -070097; CHECK-LABEL: @test_addrspacecast_addrspacecast(
98; CHECK-NEXT: entry:
99; CHECK-NEXT: [[PTR1:%.*]] = addrspacecast i32 addrspace(1)* [[BASE:%.*]] to i32*
100; CHECK-NEXT: [[PTR2:%.*]] = addrspacecast i32* [[PTR1]] to i32 addrspace(1)*
101; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i32 addrspace(1)* [[PTR2]], i32 addrspace(1)* [[BASE]]) ]
102; CHECK-NEXT: [[PTR2_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0)
103; CHECK-NEXT: [[PTR2_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[PTR2_RELOCATED]] to i32 addrspace(1)*
104; CHECK-NEXT: [[BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1)
105; CHECK-NEXT: [[BASE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BASE_RELOCATED]] to i32 addrspace(1)*
106; CHECK-NEXT: call void @use_obj32(i32 addrspace(1)* [[BASE_RELOCATED_CASTED]])
107; CHECK-NEXT: call void @use_obj32(i32 addrspace(1)* [[PTR2_RELOCATED_CASTED]])
108; CHECK-NEXT: ret void
109;
Eric Christophercee313d2019-04-17 04:52:47 +0000110entry:
111 %ptr1 = addrspacecast i32 addrspace(1)* %base to i32*
112 %ptr2 = addrspacecast i32* %ptr1 to i32 addrspace(1)*
Eric Christophercee313d2019-04-17 04:52:47 +0000113 call void @do_safepoint() [ "deopt"() ]
114
Eric Christophercee313d2019-04-17 04:52:47 +0000115 call void @use_obj32(i32 addrspace(1)* %base)
116 call void @use_obj32(i32 addrspace(1)* %ptr2)
117 ret void
118}
119
120define void @test_bitcast_gep(i32 addrspace(1)* %base) gc "statepoint-example" {
Philip Reames3d40c752020-06-04 15:22:07 -0700121; CHECK-LABEL: @test_bitcast_gep(
122; CHECK-NEXT: entry:
123; CHECK-NEXT: [[PTR_GEP:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE:%.*]], i32 15
124; CHECK-NEXT: [[PTR_CAST:%.*]] = bitcast i32 addrspace(1)* [[PTR_GEP]] to i64 addrspace(1)*
125; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i32 addrspace(1)* [[BASE]]) ]
126; CHECK-NEXT: [[BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
127; CHECK-NEXT: [[BASE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BASE_RELOCATED]] to i32 addrspace(1)*
128; CHECK-NEXT: [[PTR_GEP_REMAT:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE_RELOCATED_CASTED]], i32 15
129; CHECK-NEXT: [[PTR_CAST_REMAT:%.*]] = bitcast i32 addrspace(1)* [[PTR_GEP_REMAT]] to i64 addrspace(1)*
130; CHECK-NEXT: call void @use_obj32(i32 addrspace(1)* [[BASE_RELOCATED_CASTED]])
131; CHECK-NEXT: call void @use_obj64(i64 addrspace(1)* [[PTR_CAST_REMAT]])
132; CHECK-NEXT: ret void
133;
Eric Christophercee313d2019-04-17 04:52:47 +0000134entry:
135 %ptr.gep = getelementptr i32, i32 addrspace(1)* %base, i32 15
Eric Christophercee313d2019-04-17 04:52:47 +0000136 %ptr.cast = bitcast i32 addrspace(1)* %ptr.gep to i64 addrspace(1)*
137 call void @do_safepoint() [ "deopt"() ]
138
Eric Christophercee313d2019-04-17 04:52:47 +0000139 call void @use_obj32(i32 addrspace(1)* %base)
140 call void @use_obj64(i64 addrspace(1)* %ptr.cast)
141 ret void
142}
143
144define void @test_intersecting_chains(i32 addrspace(1)* %base, i32 %idx) gc "statepoint-example" {
Philip Reames3d40c752020-06-04 15:22:07 -0700145; CHECK-LABEL: @test_intersecting_chains(
146; CHECK-NEXT: entry:
147; CHECK-NEXT: [[PTR_GEP:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE:%.*]], i32 15
148; CHECK-NEXT: [[PTR_CAST:%.*]] = bitcast i32 addrspace(1)* [[PTR_GEP]] to i64 addrspace(1)*
149; CHECK-NEXT: [[PTR_CAST2:%.*]] = bitcast i32 addrspace(1)* [[PTR_GEP]] to i16 addrspace(1)*
150; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i32 addrspace(1)* [[BASE]]) ]
151; CHECK-NEXT: [[BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
152; CHECK-NEXT: [[BASE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BASE_RELOCATED]] to i32 addrspace(1)*
153; CHECK-NEXT: [[PTR_GEP_REMAT1:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE_RELOCATED_CASTED]], i32 15
154; CHECK-NEXT: [[PTR_CAST_REMAT:%.*]] = bitcast i32 addrspace(1)* [[PTR_GEP_REMAT1]] to i64 addrspace(1)*
155; CHECK-NEXT: [[PTR_GEP_REMAT:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE_RELOCATED_CASTED]], i32 15
156; CHECK-NEXT: [[PTR_CAST2_REMAT:%.*]] = bitcast i32 addrspace(1)* [[PTR_GEP_REMAT]] to i16 addrspace(1)*
157; CHECK-NEXT: call void @use_obj64(i64 addrspace(1)* [[PTR_CAST_REMAT]])
158; CHECK-NEXT: call void @use_obj16(i16 addrspace(1)* [[PTR_CAST2_REMAT]])
159; CHECK-NEXT: ret void
160;
Eric Christophercee313d2019-04-17 04:52:47 +0000161entry:
162 %ptr.gep = getelementptr i32, i32 addrspace(1)* %base, i32 15
Eric Christophercee313d2019-04-17 04:52:47 +0000163 %ptr.cast = bitcast i32 addrspace(1)* %ptr.gep to i64 addrspace(1)*
Eric Christophercee313d2019-04-17 04:52:47 +0000164 %ptr.cast2 = bitcast i32 addrspace(1)* %ptr.gep to i16 addrspace(1)*
Eric Christophercee313d2019-04-17 04:52:47 +0000165 call void @do_safepoint() [ "deopt"() ]
166
Eric Christophercee313d2019-04-17 04:52:47 +0000167 call void @use_obj64(i64 addrspace(1)* %ptr.cast)
168 call void @use_obj16(i16 addrspace(1)* %ptr.cast2)
169 ret void
170}
171
172define void @test_cost_threshold(i32 addrspace(1)* %base, i32 %idx1, i32 %idx2, i32 %idx3) gc "statepoint-example" {
Philip Reames3d40c752020-06-04 15:22:07 -0700173; CHECK-LABEL: @test_cost_threshold(
174; CHECK-NEXT: entry:
175; CHECK-NEXT: [[PTR_GEP:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE:%.*]], i32 15
176; CHECK-NEXT: [[PTR_GEP2:%.*]] = getelementptr i32, i32 addrspace(1)* [[PTR_GEP]], i32 [[IDX1:%.*]]
177; CHECK-NEXT: [[PTR_GEP3:%.*]] = getelementptr i32, i32 addrspace(1)* [[PTR_GEP2]], i32 [[IDX2:%.*]]
178; CHECK-NEXT: [[PTR_GEP4:%.*]] = getelementptr i32, i32 addrspace(1)* [[PTR_GEP3]], i32 [[IDX3:%.*]]
179; CHECK-NEXT: [[PTR_CAST:%.*]] = bitcast i32 addrspace(1)* [[PTR_GEP4]] to i64 addrspace(1)*
180; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i64 addrspace(1)* [[PTR_CAST]], i32 addrspace(1)* [[BASE]]) ]
181; CHECK-NEXT: [[PTR_CAST_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0)
182; CHECK-NEXT: [[PTR_CAST_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[PTR_CAST_RELOCATED]] to i64 addrspace(1)*
183; CHECK-NEXT: [[BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1)
184; CHECK-NEXT: [[BASE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BASE_RELOCATED]] to i32 addrspace(1)*
185; CHECK-NEXT: call void @use_obj64(i64 addrspace(1)* [[PTR_CAST_RELOCATED_CASTED]])
186; CHECK-NEXT: ret void
187;
Eric Christophercee313d2019-04-17 04:52:47 +0000188entry:
189 %ptr.gep = getelementptr i32, i32 addrspace(1)* %base, i32 15
Eric Christophercee313d2019-04-17 04:52:47 +0000190 %ptr.gep2 = getelementptr i32, i32 addrspace(1)* %ptr.gep, i32 %idx1
Eric Christophercee313d2019-04-17 04:52:47 +0000191 %ptr.gep3 = getelementptr i32, i32 addrspace(1)* %ptr.gep2, i32 %idx2
Eric Christophercee313d2019-04-17 04:52:47 +0000192 %ptr.gep4 = getelementptr i32, i32 addrspace(1)* %ptr.gep3, i32 %idx3
Eric Christophercee313d2019-04-17 04:52:47 +0000193 %ptr.cast = bitcast i32 addrspace(1)* %ptr.gep4 to i64 addrspace(1)*
194 call void @do_safepoint() [ "deopt"() ]
195
Eric Christophercee313d2019-04-17 04:52:47 +0000196 call void @use_obj64(i64 addrspace(1)* %ptr.cast)
197 ret void
198}
199
200define void @test_two_derived(i32 addrspace(1)* %base) gc "statepoint-example" {
Philip Reames3d40c752020-06-04 15:22:07 -0700201; CHECK-LABEL: @test_two_derived(
202; CHECK-NEXT: entry:
203; CHECK-NEXT: [[PTR:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE:%.*]], i32 15
204; CHECK-NEXT: [[PTR2:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE]], i32 12
205; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i32 addrspace(1)* [[BASE]]) ]
206; CHECK-NEXT: [[BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
207; CHECK-NEXT: [[BASE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BASE_RELOCATED]] to i32 addrspace(1)*
208; CHECK-NEXT: [[PTR_REMAT:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE_RELOCATED_CASTED]], i32 15
209; CHECK-NEXT: [[PTR2_REMAT:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE_RELOCATED_CASTED]], i32 12
210; CHECK-NEXT: call void @use_obj32(i32 addrspace(1)* [[PTR_REMAT]])
211; CHECK-NEXT: call void @use_obj32(i32 addrspace(1)* [[PTR2_REMAT]])
212; CHECK-NEXT: ret void
213;
Eric Christophercee313d2019-04-17 04:52:47 +0000214entry:
215 %ptr = getelementptr i32, i32 addrspace(1)* %base, i32 15
216 %ptr2 = getelementptr i32, i32 addrspace(1)* %base, i32 12
Eric Christophercee313d2019-04-17 04:52:47 +0000217 call void @do_safepoint() [ "deopt"() ]
218
Eric Christophercee313d2019-04-17 04:52:47 +0000219 call void @use_obj32(i32 addrspace(1)* %ptr)
220 call void @use_obj32(i32 addrspace(1)* %ptr2)
221 ret void
222}
223
224define void @test_gep_smallint_array([3 x i32] addrspace(1)* %base) gc "statepoint-example" {
Philip Reames3d40c752020-06-04 15:22:07 -0700225; CHECK-LABEL: @test_gep_smallint_array(
226; CHECK-NEXT: entry:
227; CHECK-NEXT: [[PTR:%.*]] = getelementptr [3 x i32], [3 x i32] addrspace(1)* [[BASE:%.*]], i32 0, i32 2
228; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"([3 x i32] addrspace(1)* [[BASE]]) ]
229; CHECK-NEXT: [[BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
230; CHECK-NEXT: [[BASE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BASE_RELOCATED]] to [3 x i32] addrspace(1)*
231; CHECK-NEXT: [[PTR_REMAT:%.*]] = getelementptr [3 x i32], [3 x i32] addrspace(1)* [[BASE_RELOCATED_CASTED]], i32 0, i32 2
232; CHECK-NEXT: call void @use_obj32(i32 addrspace(1)* [[PTR_REMAT]])
233; CHECK-NEXT: ret void
234;
Eric Christophercee313d2019-04-17 04:52:47 +0000235entry:
236 %ptr = getelementptr [3 x i32], [3 x i32] addrspace(1)* %base, i32 0, i32 2
Eric Christophercee313d2019-04-17 04:52:47 +0000237 call void @do_safepoint() [ "deopt"() ]
238
Eric Christophercee313d2019-04-17 04:52:47 +0000239 call void @use_obj32(i32 addrspace(1)* %ptr)
240 ret void
241}
242
243declare i32 @fake_personality_function()
244
245define void @test_invoke(i32 addrspace(1)* %base) gc "statepoint-example" personality i32 ()* @fake_personality_function {
Philip Reames3d40c752020-06-04 15:22:07 -0700246; CHECK-LABEL: @test_invoke(
247; CHECK-NEXT: entry:
248; CHECK-NEXT: [[PTR_GEP:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE:%.*]], i32 15
249; CHECK-NEXT: [[PTR_CAST:%.*]] = bitcast i32 addrspace(1)* [[PTR_GEP]] to i64 addrspace(1)*
250; CHECK-NEXT: [[PTR_CAST2:%.*]] = bitcast i32 addrspace(1)* [[PTR_GEP]] to i16 addrspace(1)*
251; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = invoke token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i32 addrspace(1)* [[BASE]]) ]
252; CHECK-NEXT: to label [[NORMAL:%.*]] unwind label [[EXCEPTION:%.*]]
253; CHECK: normal:
254; CHECK-NEXT: [[BASE_RELOCATED6:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
255; CHECK-NEXT: [[BASE_RELOCATED6_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BASE_RELOCATED6]] to i32 addrspace(1)*
256; CHECK-NEXT: [[PTR_GEP_REMAT3:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE_RELOCATED6_CASTED]], i32 15
257; CHECK-NEXT: [[PTR_CAST_REMAT:%.*]] = bitcast i32 addrspace(1)* [[PTR_GEP_REMAT3]] to i64 addrspace(1)*
258; CHECK-NEXT: [[PTR_GEP_REMAT:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE_RELOCATED6_CASTED]], i32 15
259; CHECK-NEXT: [[PTR_CAST2_REMAT:%.*]] = bitcast i32 addrspace(1)* [[PTR_GEP_REMAT]] to i16 addrspace(1)*
260; CHECK-NEXT: call void @use_obj64(i64 addrspace(1)* [[PTR_CAST_REMAT]])
261; CHECK-NEXT: call void @use_obj16(i16 addrspace(1)* [[PTR_CAST2_REMAT]])
262; CHECK-NEXT: ret void
263; CHECK: exception:
264; CHECK-NEXT: [[LANDING_PAD4:%.*]] = landingpad token
265; CHECK-NEXT: cleanup
266; CHECK-NEXT: [[BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[LANDING_PAD4]], i32 0, i32 0)
267; CHECK-NEXT: [[BASE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BASE_RELOCATED]] to i32 addrspace(1)*
268; CHECK-NEXT: [[PTR_GEP_REMAT4:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE_RELOCATED_CASTED]], i32 15
269; CHECK-NEXT: [[PTR_CAST_REMAT5:%.*]] = bitcast i32 addrspace(1)* [[PTR_GEP_REMAT4]] to i64 addrspace(1)*
270; CHECK-NEXT: [[PTR_GEP_REMAT1:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE_RELOCATED_CASTED]], i32 15
271; CHECK-NEXT: [[PTR_CAST2_REMAT2:%.*]] = bitcast i32 addrspace(1)* [[PTR_GEP_REMAT1]] to i16 addrspace(1)*
272; CHECK-NEXT: call void @use_obj64(i64 addrspace(1)* [[PTR_CAST_REMAT5]])
273; CHECK-NEXT: call void @use_obj16(i16 addrspace(1)* [[PTR_CAST2_REMAT2]])
274; CHECK-NEXT: ret void
275;
Eric Christophercee313d2019-04-17 04:52:47 +0000276entry:
277 %ptr.gep = getelementptr i32, i32 addrspace(1)* %base, i32 15
Eric Christophercee313d2019-04-17 04:52:47 +0000278 %ptr.cast = bitcast i32 addrspace(1)* %ptr.gep to i64 addrspace(1)*
Eric Christophercee313d2019-04-17 04:52:47 +0000279 %ptr.cast2 = bitcast i32 addrspace(1)* %ptr.gep to i16 addrspace(1)*
Eric Christophercee313d2019-04-17 04:52:47 +0000280 invoke void @do_safepoint() [ "deopt"() ]
Philip Reames3d40c752020-06-04 15:22:07 -0700281 to label %normal unwind label %exception
Eric Christophercee313d2019-04-17 04:52:47 +0000282
283normal:
Eric Christophercee313d2019-04-17 04:52:47 +0000284 call void @use_obj64(i64 addrspace(1)* %ptr.cast)
285 call void @use_obj16(i16 addrspace(1)* %ptr.cast2)
286 ret void
287
288exception:
Eric Christophercee313d2019-04-17 04:52:47 +0000289 %landing_pad4 = landingpad token
Philip Reames3d40c752020-06-04 15:22:07 -0700290 cleanup
Eric Christophercee313d2019-04-17 04:52:47 +0000291 call void @use_obj64(i64 addrspace(1)* %ptr.cast)
292 call void @use_obj16(i16 addrspace(1)* %ptr.cast2)
293 ret void
294}
295
296define void @test_loop(i32 addrspace(1)* %base) gc "statepoint-example" {
Philip Reames3d40c752020-06-04 15:22:07 -0700297; CHECK-LABEL: @test_loop(
298; CHECK-NEXT: entry:
299; CHECK-NEXT: [[PTR_GEP:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE:%.*]], i32 15
300; CHECK-NEXT: br label [[LOOP:%.*]]
301; CHECK: loop:
302; CHECK-NEXT: [[DOT01:%.*]] = phi i32 addrspace(1)* [ [[PTR_GEP]], [[ENTRY:%.*]] ], [ [[PTR_GEP_REMAT:%.*]], [[LOOP]] ]
303; CHECK-NEXT: [[DOT0:%.*]] = phi i32 addrspace(1)* [ [[BASE]], [[ENTRY]] ], [ [[BASE_RELOCATED_CASTED:%.*]], [[LOOP]] ]
304; CHECK-NEXT: call void @use_obj32(i32 addrspace(1)* [[DOT01]])
305; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i32 addrspace(1)* [[DOT0]]) ]
306; CHECK-NEXT: [[BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
307; CHECK-NEXT: [[BASE_RELOCATED_CASTED]] = bitcast i8 addrspace(1)* [[BASE_RELOCATED]] to i32 addrspace(1)*
308; CHECK-NEXT: [[PTR_GEP_REMAT]] = getelementptr i32, i32 addrspace(1)* [[BASE_RELOCATED_CASTED]], i32 15
309; CHECK-NEXT: br label [[LOOP]]
310;
Eric Christophercee313d2019-04-17 04:52:47 +0000311entry:
312 %ptr.gep = getelementptr i32, i32 addrspace(1)* %base, i32 15
Eric Christophercee313d2019-04-17 04:52:47 +0000313 br label %loop
314
315loop: ; preds = %loop, %entry
Eric Christophercee313d2019-04-17 04:52:47 +0000316 call void @use_obj32(i32 addrspace(1)* %ptr.gep)
317 call void @do_safepoint() [ "deopt"() ]
Eric Christophercee313d2019-04-17 04:52:47 +0000318 br label %loop
319}
320
321define void @test_too_long(i32 addrspace(1)* %base) gc "statepoint-example" {
Philip Reames3d40c752020-06-04 15:22:07 -0700322; CHECK-LABEL: @test_too_long(
323; CHECK-NEXT: entry:
324; CHECK-NEXT: [[PTR_GEP:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASE:%.*]], i32 15
325; CHECK-NEXT: [[PTR_GEP1:%.*]] = getelementptr i32, i32 addrspace(1)* [[PTR_GEP]], i32 15
326; CHECK-NEXT: [[PTR_GEP2:%.*]] = getelementptr i32, i32 addrspace(1)* [[PTR_GEP1]], i32 15
327; CHECK-NEXT: [[PTR_GEP3:%.*]] = getelementptr i32, i32 addrspace(1)* [[PTR_GEP2]], i32 15
328; CHECK-NEXT: [[PTR_GEP4:%.*]] = getelementptr i32, i32 addrspace(1)* [[PTR_GEP3]], i32 15
329; CHECK-NEXT: [[PTR_GEP5:%.*]] = getelementptr i32, i32 addrspace(1)* [[PTR_GEP4]], i32 15
330; CHECK-NEXT: [[PTR_GEP6:%.*]] = getelementptr i32, i32 addrspace(1)* [[PTR_GEP5]], i32 15
331; CHECK-NEXT: [[PTR_GEP7:%.*]] = getelementptr i32, i32 addrspace(1)* [[PTR_GEP6]], i32 15
332; CHECK-NEXT: [[PTR_GEP8:%.*]] = getelementptr i32, i32 addrspace(1)* [[PTR_GEP7]], i32 15
333; CHECK-NEXT: [[PTR_GEP9:%.*]] = getelementptr i32, i32 addrspace(1)* [[PTR_GEP8]], i32 15
334; CHECK-NEXT: [[PTR_GEP10:%.*]] = getelementptr i32, i32 addrspace(1)* [[PTR_GEP9]], i32 15
335; CHECK-NEXT: [[PTR_GEP11:%.*]] = getelementptr i32, i32 addrspace(1)* [[PTR_GEP10]], i32 15
336; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i32 addrspace(1)* [[PTR_GEP11]], i32 addrspace(1)* [[BASE]]) ]
337; CHECK-NEXT: [[PTR_GEP11_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0)
338; CHECK-NEXT: [[PTR_GEP11_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[PTR_GEP11_RELOCATED]] to i32 addrspace(1)*
339; CHECK-NEXT: [[BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1)
340; CHECK-NEXT: [[BASE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BASE_RELOCATED]] to i32 addrspace(1)*
341; CHECK-NEXT: call void @use_obj32(i32 addrspace(1)* [[PTR_GEP11_RELOCATED_CASTED]])
342; CHECK-NEXT: ret void
343;
Eric Christophercee313d2019-04-17 04:52:47 +0000344entry:
345 %ptr.gep = getelementptr i32, i32 addrspace(1)* %base, i32 15
346 %ptr.gep1 = getelementptr i32, i32 addrspace(1)* %ptr.gep, i32 15
347 %ptr.gep2 = getelementptr i32, i32 addrspace(1)* %ptr.gep1, i32 15
348 %ptr.gep3 = getelementptr i32, i32 addrspace(1)* %ptr.gep2, i32 15
349 %ptr.gep4 = getelementptr i32, i32 addrspace(1)* %ptr.gep3, i32 15
350 %ptr.gep5 = getelementptr i32, i32 addrspace(1)* %ptr.gep4, i32 15
351 %ptr.gep6 = getelementptr i32, i32 addrspace(1)* %ptr.gep5, i32 15
352 %ptr.gep7 = getelementptr i32, i32 addrspace(1)* %ptr.gep6, i32 15
353 %ptr.gep8 = getelementptr i32, i32 addrspace(1)* %ptr.gep7, i32 15
354 %ptr.gep9 = getelementptr i32, i32 addrspace(1)* %ptr.gep8, i32 15
355 %ptr.gep10 = getelementptr i32, i32 addrspace(1)* %ptr.gep9, i32 15
356 %ptr.gep11 = getelementptr i32, i32 addrspace(1)* %ptr.gep10, i32 15
357 call void @do_safepoint() [ "deopt"() ]
Eric Christophercee313d2019-04-17 04:52:47 +0000358 call void @use_obj32(i32 addrspace(1)* %ptr.gep11)
359 ret void
360}
361
362
363declare i32 addrspace(1)* @new_instance() nounwind "gc-leaf-function"
364
365; remat the gep in presence of base pointer which is a phi node.
366; FIXME: We should remove the extra basephi.base as well.
367define void @contains_basephi(i1 %cond) gc "statepoint-example" {
Philip Reames3d40c752020-06-04 15:22:07 -0700368; CHECK-LABEL: @contains_basephi(
369; CHECK-NEXT: entry:
370; CHECK-NEXT: [[BASE1:%.*]] = call i32 addrspace(1)* @new_instance()
371; CHECK-NEXT: [[BASE2:%.*]] = call i32 addrspace(1)* @new_instance()
372; CHECK-NEXT: br i1 [[COND:%.*]], label [[HERE:%.*]], label [[THERE:%.*]]
373; CHECK: here:
374; CHECK-NEXT: br label [[MERGE:%.*]]
375; CHECK: there:
376; CHECK-NEXT: br label [[MERGE]]
377; CHECK: merge:
378; CHECK-NEXT: [[BASEPHI_BASE:%.*]] = phi i32 addrspace(1)* [ [[BASE1]], [[HERE]] ], [ [[BASE2]], [[THERE]] ], !is_base_value !0
379; CHECK-NEXT: [[BASEPHI:%.*]] = phi i32 addrspace(1)* [ [[BASE1]], [[HERE]] ], [ [[BASE2]], [[THERE]] ]
380; CHECK-NEXT: [[PTR_GEP:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASEPHI]], i32 15
381; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i32 addrspace(1)* [[BASEPHI_BASE]]) ]
382; CHECK-NEXT: [[BASEPHI_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
383; CHECK-NEXT: [[BASEPHI_BASE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BASEPHI_BASE_RELOCATED]] to i32 addrspace(1)*
384; CHECK-NEXT: [[PTR_GEP_REMAT:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASEPHI_BASE_RELOCATED_CASTED]], i32 15
385; CHECK-NEXT: call void @use_obj32(i32 addrspace(1)* [[PTR_GEP_REMAT]])
386; CHECK-NEXT: ret void
387;
Eric Christophercee313d2019-04-17 04:52:47 +0000388entry:
389 %base1 = call i32 addrspace(1)* @new_instance()
390 %base2 = call i32 addrspace(1)* @new_instance()
391 br i1 %cond, label %here, label %there
392
393here:
394 br label %merge
395
396there:
397 br label %merge
398
399merge:
Eric Christophercee313d2019-04-17 04:52:47 +0000400
401
402
403 %basephi = phi i32 addrspace(1)* [ %base1, %here ], [ %base2, %there ]
404 %ptr.gep = getelementptr i32, i32 addrspace(1)* %basephi, i32 15
405 call void @do_safepoint() ["deopt"() ]
406 call void @use_obj32(i32 addrspace(1)* %ptr.gep)
407 ret void
408}
409
410
411define void @test_intersecting_chains_with_phi(i1 %cond) gc "statepoint-example" {
Philip Reames3d40c752020-06-04 15:22:07 -0700412; CHECK-LABEL: @test_intersecting_chains_with_phi(
413; CHECK-NEXT: entry:
414; CHECK-NEXT: [[BASE1:%.*]] = call i32 addrspace(1)* @new_instance()
415; CHECK-NEXT: [[BASE2:%.*]] = call i32 addrspace(1)* @new_instance()
416; CHECK-NEXT: br i1 [[COND:%.*]], label [[HERE:%.*]], label [[THERE:%.*]]
417; CHECK: here:
418; CHECK-NEXT: br label [[MERGE:%.*]]
419; CHECK: there:
420; CHECK-NEXT: br label [[MERGE]]
421; CHECK: merge:
422; CHECK-NEXT: [[BASEPHI_BASE:%.*]] = phi i32 addrspace(1)* [ [[BASE1]], [[HERE]] ], [ [[BASE2]], [[THERE]] ], !is_base_value !0
423; CHECK-NEXT: [[BASEPHI:%.*]] = phi i32 addrspace(1)* [ [[BASE1]], [[HERE]] ], [ [[BASE2]], [[THERE]] ]
424; CHECK-NEXT: [[PTR_GEP:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASEPHI]], i32 15
425; CHECK-NEXT: [[PTR_CAST:%.*]] = bitcast i32 addrspace(1)* [[PTR_GEP]] to i64 addrspace(1)*
426; CHECK-NEXT: [[PTR_CAST2:%.*]] = bitcast i32 addrspace(1)* [[PTR_GEP]] to i16 addrspace(1)*
427; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* @do_safepoint, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i32 addrspace(1)* [[BASEPHI_BASE]]) ]
428; CHECK-NEXT: [[BASEPHI_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
429; CHECK-NEXT: [[BASEPHI_BASE_RELOCATED_CASTED:%.*]] = bitcast i8 addrspace(1)* [[BASEPHI_BASE_RELOCATED]] to i32 addrspace(1)*
430; CHECK-NEXT: [[PTR_GEP_REMAT1:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASEPHI_BASE_RELOCATED_CASTED]], i32 15
431; CHECK-NEXT: [[PTR_CAST_REMAT:%.*]] = bitcast i32 addrspace(1)* [[PTR_GEP_REMAT1]] to i64 addrspace(1)*
432; CHECK-NEXT: [[PTR_GEP_REMAT:%.*]] = getelementptr i32, i32 addrspace(1)* [[BASEPHI_BASE_RELOCATED_CASTED]], i32 15
433; CHECK-NEXT: [[PTR_CAST2_REMAT:%.*]] = bitcast i32 addrspace(1)* [[PTR_GEP_REMAT]] to i16 addrspace(1)*
434; CHECK-NEXT: call void @use_obj64(i64 addrspace(1)* [[PTR_CAST_REMAT]])
435; CHECK-NEXT: call void @use_obj16(i16 addrspace(1)* [[PTR_CAST2_REMAT]])
436; CHECK-NEXT: ret void
437;
Eric Christophercee313d2019-04-17 04:52:47 +0000438entry:
439 %base1 = call i32 addrspace(1)* @new_instance()
440 %base2 = call i32 addrspace(1)* @new_instance()
441 br i1 %cond, label %here, label %there
442
443here:
444 br label %merge
445
446there:
447 br label %merge
448
449merge:
450 %basephi = phi i32 addrspace(1)* [ %base1, %here ], [ %base2, %there ]
451 %ptr.gep = getelementptr i32, i32 addrspace(1)* %basephi, i32 15
452 %ptr.cast = bitcast i32 addrspace(1)* %ptr.gep to i64 addrspace(1)*
453 %ptr.cast2 = bitcast i32 addrspace(1)* %ptr.gep to i16 addrspace(1)*
454 call void @do_safepoint() [ "deopt"() ]
Eric Christophercee313d2019-04-17 04:52:47 +0000455 call void @use_obj64(i64 addrspace(1)* %ptr.cast)
456 call void @use_obj16(i16 addrspace(1)* %ptr.cast2)
457 ret void
458}