xref: /llvm-project/llvm/test/Transforms/InstCombine/statepoint-cleanup.ll (revision 90ba33099cbb17e7c159e9ebc5a512037db99d6d)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes='instcombine<max-iterations=1>' -S | FileCheck %s
3; These tests check the optimizations specific to
4; pointers being relocated at a statepoint.
5
6
7declare ptr @fake_personality_function()
8declare void @func()
9
10define void @test(ptr addrspace(1) %b) gc "statepoint-example" {
11; CHECK-LABEL: @test(
12; CHECK-NEXT:  entry:
13; CHECK-NEXT:    [[D:%.*]] = getelementptr i8, ptr addrspace(1) [[B:%.*]], i64 64
14; CHECK-NEXT:    [[SAFEPOINT_TOKEN:%.*]] = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr nonnull elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(ptr addrspace(1) [[B]], ptr addrspace(1) [[D]]) ]
15; CHECK-NEXT:    [[B_NEW_1:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[SAFEPOINT_TOKEN]], i32 0, i32 0)
16; CHECK-NEXT:    [[B_NEW_2:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[SAFEPOINT_TOKEN]], i32 0, i32 0)
17; CHECK-NEXT:    [[D_NEW_1:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[SAFEPOINT_TOKEN]], i32 0, i32 1)
18; CHECK-NEXT:    [[D_NEW_2:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[SAFEPOINT_TOKEN]], i32 0, i32 1)
19; CHECK-NEXT:    [[D_NEW_3:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[SAFEPOINT_TOKEN]], i32 0, i32 1)
20; CHECK-NEXT:    [[D_NEW_4:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[SAFEPOINT_TOKEN]], i32 0, i32 1)
21; CHECK-NEXT:    store i32 1, ptr addrspace(1) [[B_NEW_1]], align 4
22; CHECK-NEXT:    store i32 1, ptr addrspace(1) [[B_NEW_2]], align 4
23; CHECK-NEXT:    store i32 1, ptr addrspace(1) [[D_NEW_1]], align 4
24; CHECK-NEXT:    store i32 1, ptr addrspace(1) [[D_NEW_2]], align 4
25; CHECK-NEXT:    store i32 1, ptr addrspace(1) [[D_NEW_3]], align 4
26; CHECK-NEXT:    store i32 1, ptr addrspace(1) [[D_NEW_4]], align 4
27; CHECK-NEXT:    ret void
28;
29entry:
30  %d = getelementptr i32, ptr addrspace(1) %b, i64 16
31  %safepoint_token = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) ["gc-live" (ptr addrspace(1) %b, ptr addrspace(1) %b, ptr addrspace(1) %d, ptr addrspace(1) %d)]
32  %b.new.1 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 0)
33  %b.new.2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 1)
34  %d.new.1 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 2)
35  %d.new.2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 3)
36  %d.new.3 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 1, i32 2)
37  %d.new.4 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 1, i32 3)
38  store i32 1, ptr addrspace(1) %b.new.1
39  store i32 1, ptr addrspace(1) %b.new.2
40  store i32 1, ptr addrspace(1) %d.new.1
41  store i32 1, ptr addrspace(1) %d.new.2
42  store i32 1, ptr addrspace(1) %d.new.3
43  store i32 1, ptr addrspace(1) %d.new.4
44  ret void
45}
46
47define void @test_no_derived_use(ptr addrspace(1) %b) gc "statepoint-example" {
48; CHECK-LABEL: @test_no_derived_use(
49; CHECK-NEXT:  entry:
50; CHECK-NEXT:    [[SAFEPOINT_TOKEN:%.*]] = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr nonnull elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(ptr addrspace(1) [[B:%.*]]) ]
51; CHECK-NEXT:    [[B_NEW_1:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[SAFEPOINT_TOKEN]], i32 0, i32 0)
52; CHECK-NEXT:    store i32 1, ptr addrspace(1) [[B_NEW_1]], align 4
53; CHECK-NEXT:    ret void
54;
55entry:
56  %d = getelementptr i32, ptr addrspace(1) %b, i64 16
57  %safepoint_token = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) ["gc-live" (ptr addrspace(1) %b, ptr addrspace(1) %b, ptr addrspace(1) %d, ptr addrspace(1) %d)]
58  %b.new.1 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 0)
59  %b.new.2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 1)
60  %d.new.1 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 2)
61  %d.new.2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 3)
62  %d.new.3 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 1, i32 2)
63  %d.new.4 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 1, i32 3)
64  store i32 1, ptr addrspace(1) %b.new.1
65  ret void
66}
67
68define void @test_no_base_use(ptr addrspace(1) %b) gc "statepoint-example" {
69; CHECK-LABEL: @test_no_base_use(
70; CHECK-NEXT:  entry:
71; CHECK-NEXT:    [[D:%.*]] = getelementptr i8, ptr addrspace(1) [[B:%.*]], i64 64
72; CHECK-NEXT:    [[SAFEPOINT_TOKEN:%.*]] = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr nonnull elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(ptr addrspace(1) [[B]], ptr addrspace(1) [[D]]) ]
73; CHECK-NEXT:    [[D_NEW_1:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[SAFEPOINT_TOKEN]], i32 0, i32 1)
74; CHECK-NEXT:    store i32 1, ptr addrspace(1) [[D_NEW_1]], align 4
75; CHECK-NEXT:    ret void
76;
77entry:
78  %d = getelementptr i32, ptr addrspace(1) %b, i64 16
79  %safepoint_token = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) ["gc-live" (ptr addrspace(1) %b, ptr addrspace(1) %b, ptr addrspace(1) %d, ptr addrspace(1) %d)]
80  %b.new.1 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 0)
81  %b.new.2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 1)
82  %d.new.1 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 2)
83  %d.new.2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 3)
84  %d.new.3 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 1, i32 2)
85  %d.new.4 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 1, i32 3)
86  store i32 1, ptr addrspace(1) %d.new.1
87  ret void
88}
89
90define void @test_invoke(ptr addrspace(1) %b) gc "statepoint-example" personality ptr @fake_personality_function {
91; CHECK-LABEL: @test_invoke(
92; CHECK-NEXT:  entry:
93; CHECK-NEXT:    [[D:%.*]] = getelementptr i8, ptr addrspace(1) [[B:%.*]], i64 64
94; CHECK-NEXT:    [[SAFEPOINT_TOKEN:%.*]] = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr nonnull elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(ptr addrspace(1) [[B]], ptr addrspace(1) [[D]]) ]
95; CHECK-NEXT:    to label [[NORMAL_DEST:%.*]] unwind label [[UNWIND_DEST:%.*]]
96; CHECK:       normal_dest:
97; CHECK-NEXT:    [[B_NEW_1:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[SAFEPOINT_TOKEN]], i32 0, i32 0)
98; CHECK-NEXT:    [[B_NEW_2:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[SAFEPOINT_TOKEN]], i32 0, i32 0)
99; CHECK-NEXT:    [[D_NEW_1:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[SAFEPOINT_TOKEN]], i32 0, i32 1)
100; CHECK-NEXT:    [[D_NEW_2:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[SAFEPOINT_TOKEN]], i32 0, i32 1)
101; CHECK-NEXT:    [[D_NEW_3:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[SAFEPOINT_TOKEN]], i32 0, i32 1)
102; CHECK-NEXT:    [[D_NEW_4:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[SAFEPOINT_TOKEN]], i32 0, i32 1)
103; CHECK-NEXT:    store i32 1, ptr addrspace(1) [[B_NEW_1]], align 4
104; CHECK-NEXT:    store i32 1, ptr addrspace(1) [[B_NEW_2]], align 4
105; CHECK-NEXT:    store i32 1, ptr addrspace(1) [[D_NEW_1]], align 4
106; CHECK-NEXT:    store i32 1, ptr addrspace(1) [[D_NEW_2]], align 4
107; CHECK-NEXT:    store i32 1, ptr addrspace(1) [[D_NEW_3]], align 4
108; CHECK-NEXT:    store i32 1, ptr addrspace(1) [[D_NEW_4]], align 4
109; CHECK-NEXT:    ret void
110; CHECK:       unwind_dest:
111; CHECK-NEXT:    [[LPAD:%.*]] = landingpad token
112; CHECK-NEXT:    cleanup
113; CHECK-NEXT:    [[LPB_NEW_1:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[LPAD]], i32 0, i32 0)
114; CHECK-NEXT:    [[LPB_NEW_2:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[LPAD]], i32 0, i32 0)
115; CHECK-NEXT:    [[LPD_NEW_1:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[LPAD]], i32 0, i32 1)
116; CHECK-NEXT:    [[LPD_NEW_2:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[LPAD]], i32 0, i32 1)
117; CHECK-NEXT:    [[LPD_NEW_3:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[LPAD]], i32 0, i32 1)
118; CHECK-NEXT:    [[LPD_NEW_4:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[LPAD]], i32 0, i32 1)
119; CHECK-NEXT:    store i32 2, ptr addrspace(1) [[LPB_NEW_1]], align 4
120; CHECK-NEXT:    store i32 2, ptr addrspace(1) [[LPB_NEW_2]], align 4
121; CHECK-NEXT:    store i32 2, ptr addrspace(1) [[LPD_NEW_1]], align 4
122; CHECK-NEXT:    store i32 2, ptr addrspace(1) [[LPD_NEW_2]], align 4
123; CHECK-NEXT:    store i32 2, ptr addrspace(1) [[LPD_NEW_3]], align 4
124; CHECK-NEXT:    store i32 2, ptr addrspace(1) [[LPD_NEW_4]], align 4
125; CHECK-NEXT:    ret void
126;
127entry:
128  %d = getelementptr i32, ptr addrspace(1) %b, i64 16
129  %safepoint_token = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) ["gc-live" (ptr addrspace(1) %b, ptr addrspace(1) %b, ptr addrspace(1) %d, ptr addrspace(1) %d)]
130  to label %normal_dest unwind label %unwind_dest
131
132normal_dest:
133  %b.new.1 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 0)
134  %b.new.2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 1)
135  %d.new.1 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 2)
136  %d.new.2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 3)
137  %d.new.3 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 1, i32 2)
138  %d.new.4 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 1, i32 3)
139  store i32 1, ptr addrspace(1) %b.new.1
140  store i32 1, ptr addrspace(1) %b.new.2
141  store i32 1, ptr addrspace(1) %d.new.1
142  store i32 1, ptr addrspace(1) %d.new.2
143  store i32 1, ptr addrspace(1) %d.new.3
144  store i32 1, ptr addrspace(1) %d.new.4
145  ret void
146
147unwind_dest:
148  %lpad = landingpad token
149  cleanup
150  %lpb.new.1 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %lpad,  i32 0, i32 0)
151  %lpb.new.2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %lpad,  i32 0, i32 1)
152  %lpd.new.1 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %lpad,  i32 0, i32 2)
153  %lpd.new.2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %lpad,  i32 0, i32 3)
154  %lpd.new.3 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %lpad,  i32 1, i32 2)
155  %lpd.new.4 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %lpad,  i32 1, i32 3)
156  store i32 2, ptr addrspace(1) %lpb.new.1
157  store i32 2, ptr addrspace(1) %lpb.new.2
158  store i32 2, ptr addrspace(1) %lpd.new.1
159  store i32 2, ptr addrspace(1) %lpd.new.2
160  store i32 2, ptr addrspace(1) %lpd.new.3
161  store i32 2, ptr addrspace(1) %lpd.new.4
162  ret void
163}
164
165define void @test_no_derived_use_invoke(ptr addrspace(1) %b) gc "statepoint-example" personality ptr @fake_personality_function {
166; CHECK-LABEL: @test_no_derived_use_invoke(
167; CHECK-NEXT:  entry:
168; CHECK-NEXT:    [[SAFEPOINT_TOKEN:%.*]] = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr nonnull elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(ptr addrspace(1) [[B:%.*]]) ]
169; CHECK-NEXT:    to label [[NORMAL_DEST:%.*]] unwind label [[UNWIND_DEST:%.*]]
170; CHECK:       normal_dest:
171; CHECK-NEXT:    [[B_NEW_1:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[SAFEPOINT_TOKEN]], i32 0, i32 0)
172; CHECK-NEXT:    store i32 1, ptr addrspace(1) [[B_NEW_1]], align 4
173; CHECK-NEXT:    ret void
174; CHECK:       unwind_dest:
175; CHECK-NEXT:    [[LPAD:%.*]] = landingpad token
176; CHECK-NEXT:    cleanup
177; CHECK-NEXT:    [[LPB_NEW_1:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[LPAD]], i32 0, i32 0)
178; CHECK-NEXT:    store i32 2, ptr addrspace(1) [[LPB_NEW_1]], align 4
179; CHECK-NEXT:    ret void
180;
181entry:
182  %d = getelementptr i32, ptr addrspace(1) %b, i64 16
183  %safepoint_token = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) ["gc-live" (ptr addrspace(1) %b, ptr addrspace(1) %b, ptr addrspace(1) %d, ptr addrspace(1) %d)]
184  to label %normal_dest unwind label %unwind_dest
185
186normal_dest:
187  %b.new.1 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 0)
188  %b.new.2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 1)
189  %d.new.1 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 2)
190  %d.new.2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 3)
191  %d.new.3 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 1, i32 2)
192  %d.new.4 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 1, i32 3)
193  store i32 1, ptr addrspace(1) %b.new.1
194  ret void
195
196unwind_dest:
197  %lpad = landingpad token
198  cleanup
199  %lpb.new.1 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %lpad,  i32 0, i32 0)
200  %lpb.new.2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %lpad,  i32 0, i32 1)
201  %lpd.new.1 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %lpad,  i32 0, i32 2)
202  %lpd.new.2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %lpad,  i32 0, i32 3)
203  %lpd.new.3 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %lpad,  i32 1, i32 2)
204  %lpd.new.4 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %lpad,  i32 1, i32 3)
205  store i32 2, ptr addrspace(1) %lpb.new.1
206  ret void
207}
208
209define void @test_no_base_use_invoke(ptr addrspace(1) %b) gc "statepoint-example" personality ptr @fake_personality_function {
210; CHECK-LABEL: @test_no_base_use_invoke(
211; CHECK-NEXT:  entry:
212; CHECK-NEXT:    [[D:%.*]] = getelementptr i8, ptr addrspace(1) [[B:%.*]], i64 64
213; CHECK-NEXT:    [[SAFEPOINT_TOKEN:%.*]] = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr nonnull elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(ptr addrspace(1) [[B]], ptr addrspace(1) [[D]]) ]
214; CHECK-NEXT:    to label [[NORMAL_DEST:%.*]] unwind label [[UNWIND_DEST:%.*]]
215; CHECK:       normal_dest:
216; CHECK-NEXT:    [[D_NEW_1:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[SAFEPOINT_TOKEN]], i32 0, i32 1)
217; CHECK-NEXT:    store i32 1, ptr addrspace(1) [[D_NEW_1]], align 4
218; CHECK-NEXT:    ret void
219; CHECK:       unwind_dest:
220; CHECK-NEXT:    [[LPAD:%.*]] = landingpad token
221; CHECK-NEXT:    cleanup
222; CHECK-NEXT:    [[LPD_NEW_1:%.*]] = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[LPAD]], i32 0, i32 1)
223; CHECK-NEXT:    store i32 2, ptr addrspace(1) [[LPD_NEW_1]], align 4
224; CHECK-NEXT:    ret void
225;
226entry:
227  %d = getelementptr i32, ptr addrspace(1) %b, i64 16
228  %safepoint_token = invoke token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 0, i32 0, ptr elementtype(void ()) @func, i32 0, i32 0, i32 0, i32 0) ["gc-live" (ptr addrspace(1) %b, ptr addrspace(1) %b, ptr addrspace(1) %d, ptr addrspace(1) %d)]
229  to label %normal_dest unwind label %unwind_dest
230
231normal_dest:
232  %b.new.1 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 0)
233  %b.new.2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 1)
234  %d.new.1 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 2)
235  %d.new.2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 0, i32 3)
236  %d.new.3 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 1, i32 2)
237  %d.new.4 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %safepoint_token,  i32 1, i32 3)
238  store i32 1, ptr addrspace(1) %d.new.1
239  ret void
240
241unwind_dest:
242  %lpad = landingpad token
243  cleanup
244  %lpb.new.1 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %lpad,  i32 0, i32 0)
245  %lpb.new.2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %lpad,  i32 0, i32 1)
246  %lpd.new.1 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %lpad,  i32 0, i32 2)
247  %lpd.new.2 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %lpad,  i32 0, i32 3)
248  %lpd.new.3 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %lpad,  i32 1, i32 2)
249  %lpd.new.4 = call ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token %lpad,  i32 1, i32 3)
250  store i32 2, ptr addrspace(1) %lpd.new.1
251  ret void
252}
253
254declare token @llvm.experimental.gc.statepoint.p0(i64, i32, ptr, i32, i32, ...)
255declare ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token, i32, i32)
256