12603dcddSDmitry Makogon; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
22603dcddSDmitry Makogon; RUN: opt -S -rewrite-statepoints-for-gc < %s | FileCheck %s
32603dcddSDmitry Makogon
42603dcddSDmitry Makogontarget datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128-ni:1-p2:32:8:8:32-ni:2"
52603dcddSDmitry Makogontarget triple = "x86_64-unknown-linux-gnu"
62603dcddSDmitry Makogon
72603dcddSDmitry Makogondeclare void @foo() gc "statepoint-example"
82603dcddSDmitry Makogon
92603dcddSDmitry Makogon; FIXME: In this test case %b6.base, which is inserted by RS4GC, is identical
102603dcddSDmitry Makogon; to %b6.
112603dcddSDmitry Makogondefine i8 addrspace(1)* @test1(i1 %c, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" {
122603dcddSDmitry Makogon; CHECK-LABEL: @test1(
132603dcddSDmitry Makogon; CHECK-NEXT:  left:
142603dcddSDmitry Makogon; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
152603dcddSDmitry Makogon; CHECK:       loop:
162603dcddSDmitry Makogon; CHECK-NEXT:    [[B5:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT:%.*]] ], [ [[B5]], [[LOOP]] ]
172603dcddSDmitry Makogon; CHECK-NEXT:    br i1 [[C]], label [[LOOP]], label [[MERGE2]]
182603dcddSDmitry Makogon; CHECK:       merge2:
19*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B5]], [[LOOP]] ]
20*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i8 addrspace(1)* [[B6]]) ]
21*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
222603dcddSDmitry Makogon; CHECK-NEXT:    ret i8 addrspace(1)* [[B6_RELOCATED]]
232603dcddSDmitry Makogon;
242603dcddSDmitry Makogonleft:
252603dcddSDmitry Makogon  br i1 %c, label %loop, label %merge2
262603dcddSDmitry Makogon
272603dcddSDmitry Makogonloop:
282603dcddSDmitry Makogon  %b5 = phi i8 addrspace(1)* [ %b2, %left ], [ %b5, %loop ]
292603dcddSDmitry Makogon  br i1 %c, label %loop, label %merge2
302603dcddSDmitry Makogon
312603dcddSDmitry Makogonmerge2:
322603dcddSDmitry Makogon  %b6 = phi i8 addrspace(1)* [ %b1, %left ], [ %b5, %loop ]
332603dcddSDmitry Makogon  call void @foo() [ "deopt"() ]
342603dcddSDmitry Makogon  ret i8 addrspace(1)* %b6
352603dcddSDmitry Makogon}
362603dcddSDmitry Makogon
376f8feeb3SDmitry Makogondefine i8 addrspace(1)* @test2(i1 %c, i32 %n, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" {
386f8feeb3SDmitry Makogon; CHECK-LABEL: @test2(
396f8feeb3SDmitry Makogon; CHECK-NEXT:  entry:
406f8feeb3SDmitry Makogon; CHECK-NEXT:    br label [[LEFT:%.*]]
416f8feeb3SDmitry Makogon; CHECK:       left:
426f8feeb3SDmitry Makogon; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
436f8feeb3SDmitry Makogon; CHECK:       loop:
446f8feeb3SDmitry Makogon; CHECK-NEXT:    [[B5:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT]] ], [ [[B5]], [[LOOP]] ], [ [[B5]], [[LOOP]] ]
456f8feeb3SDmitry Makogon; CHECK-NEXT:    switch i32 [[N:%.*]], label [[MERGE2]] [
466f8feeb3SDmitry Makogon; CHECK-NEXT:    i32 0, label [[LOOP]]
476f8feeb3SDmitry Makogon; CHECK-NEXT:    i32 1, label [[LOOP]]
486f8feeb3SDmitry Makogon; CHECK-NEXT:    i32 2, label [[LEFT]]
496f8feeb3SDmitry Makogon; CHECK-NEXT:    ]
506f8feeb3SDmitry Makogon; CHECK:       merge2:
51*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B5]], [[LOOP]] ]
52*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i8 addrspace(1)* [[B6]]) ]
53*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
546f8feeb3SDmitry Makogon; CHECK-NEXT:    ret i8 addrspace(1)* [[B6_RELOCATED]]
556f8feeb3SDmitry Makogon;
566f8feeb3SDmitry Makogonentry:
576f8feeb3SDmitry Makogon  br label %left
586f8feeb3SDmitry Makogon
596f8feeb3SDmitry Makogonleft:
606f8feeb3SDmitry Makogon  br i1 %c, label %loop, label %merge2
616f8feeb3SDmitry Makogon
626f8feeb3SDmitry Makogonloop:
636f8feeb3SDmitry Makogon  %b5 = phi i8 addrspace(1)* [ %b2, %left ], [ %b5, %loop ], [ %b5, %loop ]
646f8feeb3SDmitry Makogon  switch i32 %n, label %merge2 [ i32 0, label %loop
656f8feeb3SDmitry Makogon  i32 1, label %loop
666f8feeb3SDmitry Makogon  i32 2, label %left ]
676f8feeb3SDmitry Makogon
686f8feeb3SDmitry Makogonmerge2:
696f8feeb3SDmitry Makogon  %b6 = phi i8 addrspace(1)* [ %b1, %left ], [ %b5, %loop ]
706f8feeb3SDmitry Makogon  call void @foo() [ "deopt"() ]
716f8feeb3SDmitry Makogon  ret i8 addrspace(1)* %b6
726f8feeb3SDmitry Makogon}
736f8feeb3SDmitry Makogon
742603dcddSDmitry Makogon; FIXME: In this test case %b5.base and %b6.base (inserted by RS4GC) are
752603dcddSDmitry Makogon; identical to %b5 and %b6 ; correspondingly.
766f8feeb3SDmitry Makogondefine i8 addrspace(1)* @test3(i1 %c, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" {
776f8feeb3SDmitry Makogon; CHECK-LABEL: @test3(
782603dcddSDmitry Makogon; CHECK-NEXT:  left:
792603dcddSDmitry Makogon; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
802603dcddSDmitry Makogon; CHECK:       loop:
812603dcddSDmitry Makogon; CHECK-NEXT:    [[B5_BASE:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT:%.*]] ], [ [[B5_BASE]], [[LOOP]] ], [ [[B6_BASE_RELOCATED:%.*]], [[MERGE2]] ], !is_base_value !0
822603dcddSDmitry Makogon; CHECK-NEXT:    [[B5:%.*]] = phi i8 addrspace(1)* [ [[B2]], [[LEFT]] ], [ [[B5]], [[LOOP]] ], [ [[B6_RELOCATED:%.*]], [[MERGE2]] ]
832603dcddSDmitry Makogon; CHECK-NEXT:    br i1 [[C]], label [[LOOP]], label [[MERGE2]]
842603dcddSDmitry Makogon; CHECK:       merge2:
852603dcddSDmitry Makogon; CHECK-NEXT:    [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B5_BASE]], [[LOOP]] ], !is_base_value !0
862603dcddSDmitry Makogon; CHECK-NEXT:    [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[LEFT]] ], [ [[B5]], [[LOOP]] ]
872603dcddSDmitry Makogon; CHECK-NEXT:    [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i8 addrspace(1)* [[B6_BASE]], i8 addrspace(1)* [[B6]]) ]
882603dcddSDmitry Makogon; CHECK-NEXT:    [[B6_BASE_RELOCATED]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
892603dcddSDmitry Makogon; CHECK-NEXT:    [[B6_RELOCATED]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 1)
902603dcddSDmitry Makogon; CHECK-NEXT:    br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]]
912603dcddSDmitry Makogon; CHECK:       exit:
922603dcddSDmitry Makogon; CHECK-NEXT:    ret i8 addrspace(1)* [[B6_RELOCATED]]
932603dcddSDmitry Makogon;
942603dcddSDmitry Makogonleft:
952603dcddSDmitry Makogon  br i1 %c, label %loop, label %merge2
962603dcddSDmitry Makogon
972603dcddSDmitry Makogonloop:
982603dcddSDmitry Makogon  %b5 = phi i8 addrspace(1)* [ %b2, %left ], [ %b5, %loop ], [ %b6, %merge2 ]
992603dcddSDmitry Makogon  br i1 %c, label %loop, label %merge2
1002603dcddSDmitry Makogon
1012603dcddSDmitry Makogonmerge2:
1022603dcddSDmitry Makogon  %b6 = phi i8 addrspace(1)* [ %b1, %left ], [ %b5, %loop ]
1032603dcddSDmitry Makogon  call void @foo() [ "deopt"() ]
1042603dcddSDmitry Makogon  br i1 %c, label %loop, label %exit
1052603dcddSDmitry Makogon
1062603dcddSDmitry Makogonexit:
1072603dcddSDmitry Makogon  ret i8 addrspace(1)* %b6
1082603dcddSDmitry Makogon}
1096f8feeb3SDmitry Makogon
1106f8feeb3SDmitry Makogondefine i8 addrspace(1)* @test4(i1 %c, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" {
1116f8feeb3SDmitry Makogon; CHECK-LABEL: @test4(
1126f8feeb3SDmitry Makogon; CHECK-NEXT:  left:
1136f8feeb3SDmitry Makogon; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
1146f8feeb3SDmitry Makogon; CHECK:       loop:
1156f8feeb3SDmitry Makogon; CHECK-NEXT:    [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT:%.*]] ], [ [[B5:%.*]], [[LOOP]] ]
1166f8feeb3SDmitry Makogon; CHECK-NEXT:    [[B4:%.*]] = bitcast i8 addrspace(1)* [[B3]] to i32 addrspace(1)*
1176f8feeb3SDmitry Makogon; CHECK-NEXT:    [[B5]] = bitcast i32 addrspace(1)* [[B4]] to i8 addrspace(1)*
1186f8feeb3SDmitry Makogon; CHECK-NEXT:    br i1 [[C]], label [[LOOP]], label [[MERGE2]]
1196f8feeb3SDmitry Makogon; CHECK:       merge2:
120*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B5]], [[LOOP]] ]
121*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i8 addrspace(1)* [[B6]]) ]
122*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
1236f8feeb3SDmitry Makogon; CHECK-NEXT:    ret i8 addrspace(1)* [[B6_RELOCATED]]
1246f8feeb3SDmitry Makogon;
1256f8feeb3SDmitry Makogonleft:
1266f8feeb3SDmitry Makogon  br i1 %c, label %loop, label %merge2
1276f8feeb3SDmitry Makogon
1286f8feeb3SDmitry Makogonloop:
1296f8feeb3SDmitry Makogon  %b3 = phi i8 addrspace(1)* [ %b2, %left ], [ %b5, %loop ]
1306f8feeb3SDmitry Makogon  %b4 = bitcast i8 addrspace(1)* %b3 to i32 addrspace(1)*
1316f8feeb3SDmitry Makogon  %b5 = bitcast i32 addrspace(1)* %b4 to i8 addrspace(1)*
1326f8feeb3SDmitry Makogon  br i1 %c, label %loop, label %merge2
1336f8feeb3SDmitry Makogon
1346f8feeb3SDmitry Makogonmerge2:
1356f8feeb3SDmitry Makogon  %b6 = phi i8 addrspace(1)* [ %b1, %left ], [ %b5, %loop ]
1366f8feeb3SDmitry Makogon  call void @foo() [ "deopt"() ]
1376f8feeb3SDmitry Makogon  ret i8 addrspace(1)* %b6
1386f8feeb3SDmitry Makogon}
1396f8feeb3SDmitry Makogon
140084ad1ebSDmitry Makogondefine i8 addrspace(1)* @test5(i1 %c1, i1 %c2, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" {
1416f8feeb3SDmitry Makogon; CHECK-LABEL: @test5(
1426f8feeb3SDmitry Makogon; CHECK-NEXT:  entry:
143084ad1ebSDmitry Makogon; CHECK-NEXT:    br i1 [[C1:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
144084ad1ebSDmitry Makogon; CHECK:       loop:
145084ad1ebSDmitry Makogon; CHECK-NEXT:    [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[ENTRY:%.*]] ], [ [[B5:%.*]], [[LEFT:%.*]] ]
146084ad1ebSDmitry Makogon; CHECK-NEXT:    [[B4:%.*]] = addrspacecast i8 addrspace(1)* [[B3]] to i8*
147084ad1ebSDmitry Makogon; CHECK-NEXT:    br i1 [[C1]], label [[LEFT]], label [[MERGE2]]
148084ad1ebSDmitry Makogon; CHECK:       left:
149084ad1ebSDmitry Makogon; CHECK-NEXT:    [[B5]] = addrspacecast i8* [[B4]] to i8 addrspace(1)*
150084ad1ebSDmitry Makogon; CHECK-NEXT:    br i1 [[C2:%.*]], label [[LOOP]], label [[MERGE2]]
151084ad1ebSDmitry Makogon; CHECK:       merge2:
152*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[ENTRY]] ], [ [[B3]], [[LOOP]] ], [ [[B5]], [[LEFT]] ]
153*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i8 addrspace(1)* [[B6]]) ]
154*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
155084ad1ebSDmitry Makogon; CHECK-NEXT:    ret i8 addrspace(1)* [[B6_RELOCATED]]
156084ad1ebSDmitry Makogon;
157084ad1ebSDmitry Makogonentry:
158084ad1ebSDmitry Makogon  br i1 %c1, label %loop, label %merge2
159084ad1ebSDmitry Makogon
160084ad1ebSDmitry Makogonloop:
161084ad1ebSDmitry Makogon  %b3 = phi i8 addrspace(1)* [ %b2, %entry ], [ %b5, %left ]
162084ad1ebSDmitry Makogon  %b4 = addrspacecast i8 addrspace(1)* %b3 to i8*
163084ad1ebSDmitry Makogon  br i1 %c1, label %left, label %merge2
164084ad1ebSDmitry Makogon
165084ad1ebSDmitry Makogonleft:
166084ad1ebSDmitry Makogon  %b5 = addrspacecast i8* %b4 to i8 addrspace(1)*
167084ad1ebSDmitry Makogon  br i1 %c2, label %loop, label %merge2
168084ad1ebSDmitry Makogon
169084ad1ebSDmitry Makogonmerge2:
170084ad1ebSDmitry Makogon  %b6 = phi i8 addrspace(1)* [ %b1, %entry ], [ %b3, %loop ], [ %b5, %left ]
171084ad1ebSDmitry Makogon  call void @foo() [ "deopt"() ]
172084ad1ebSDmitry Makogon  ret i8 addrspace(1)* %b6
173084ad1ebSDmitry Makogon}
174084ad1ebSDmitry Makogon
175084ad1ebSDmitry Makogondefine i8 addrspace(1)* @test6(i1 %c1, i1 %c2, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" {
176084ad1ebSDmitry Makogon; CHECK-LABEL: @test6(
177084ad1ebSDmitry Makogon; CHECK-NEXT:  entry:
178084ad1ebSDmitry Makogon; CHECK-NEXT:    br i1 [[C1:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
179084ad1ebSDmitry Makogon; CHECK:       loop:
180084ad1ebSDmitry Makogon; CHECK-NEXT:    [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[ENTRY:%.*]] ], [ [[B3]], [[LEFT:%.*]] ]
181084ad1ebSDmitry Makogon; CHECK-NEXT:    br i1 [[C1]], label [[LEFT]], label [[MERGE2]]
182084ad1ebSDmitry Makogon; CHECK:       left:
183084ad1ebSDmitry Makogon; CHECK-NEXT:    br i1 [[C2:%.*]], label [[LOOP]], label [[MERGE2]]
184084ad1ebSDmitry Makogon; CHECK:       merge2:
185*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[ENTRY]] ], [ [[B3]], [[LOOP]] ], [ [[B3]], [[LEFT]] ]
186*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i8 addrspace(1)* [[B6]]) ]
187*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
188084ad1ebSDmitry Makogon; CHECK-NEXT:    ret i8 addrspace(1)* [[B6_RELOCATED]]
189084ad1ebSDmitry Makogon;
190084ad1ebSDmitry Makogonentry:
191084ad1ebSDmitry Makogon  br i1 %c1, label %loop, label %merge2
192084ad1ebSDmitry Makogon
193084ad1ebSDmitry Makogonloop:
194084ad1ebSDmitry Makogon  %b3 = phi i8 addrspace(1)* [ %b2, %entry ], [ %b4, %left ]
195084ad1ebSDmitry Makogon  br i1 %c1, label %left, label %merge2
196084ad1ebSDmitry Makogon
197084ad1ebSDmitry Makogonleft:
198084ad1ebSDmitry Makogon  %b4 = phi i8 addrspace(1)* [ %b3, %loop ]
199084ad1ebSDmitry Makogon  br i1 %c2, label %loop, label %merge2
200084ad1ebSDmitry Makogon
201084ad1ebSDmitry Makogonmerge2:
202084ad1ebSDmitry Makogon  %b6 = phi i8 addrspace(1)* [ %b1, %entry ], [ %b3, %loop ], [ %b4, %left ]
203084ad1ebSDmitry Makogon  call void @foo() [ "deopt"() ]
204084ad1ebSDmitry Makogon  ret i8 addrspace(1)* %b6
205084ad1ebSDmitry Makogon}
206084ad1ebSDmitry Makogon
207084ad1ebSDmitry Makogondeclare i8 addrspace(1)* @returned_arg(i8 addrspace(1)* returned %p)
208084ad1ebSDmitry Makogon
209084ad1ebSDmitry Makogondefine i8 addrspace(1)* @test7(i1 %c1, i1 %c2, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" {
210084ad1ebSDmitry Makogon; CHECK-LABEL: @test7(
211084ad1ebSDmitry Makogon; CHECK-NEXT:  entry:
212084ad1ebSDmitry Makogon; CHECK-NEXT:    br i1 [[C1:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
213084ad1ebSDmitry Makogon; CHECK:       loop:
214*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[ENTRY:%.*]] ], [ [[B41:%.*]], [[LEFT:%.*]] ]
215084ad1ebSDmitry Makogon; CHECK-NEXT:    br i1 [[C1]], label [[LEFT]], label [[MERGE2]]
216084ad1ebSDmitry Makogon; CHECK:       left:
217*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, i8 addrspace(1)* (i8 addrspace(1)*)*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_p1i8p1i8f(i64 2882400000, i32 0, i8 addrspace(1)* (i8 addrspace(1)*)* elementtype(i8 addrspace(1)* (i8 addrspace(1)*)) @returned_arg, i32 1, i32 0, i8 addrspace(1)* [[B3]], i32 0, i32 0) [ "gc-live"(i8 addrspace(1)* [[B3]]) ]
218084ad1ebSDmitry Makogon; CHECK-NEXT:    [[B41]] = call i8 addrspace(1)* @llvm.experimental.gc.result.p1i8(token [[STATEPOINT_TOKEN]])
219*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[B3_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
220084ad1ebSDmitry Makogon; CHECK-NEXT:    br i1 [[C2:%.*]], label [[LOOP]], label [[MERGE2]]
221084ad1ebSDmitry Makogon; CHECK:       merge2:
222*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[ENTRY]] ], [ [[B3]], [[LOOP]] ], [ [[B41]], [[LEFT]] ], !is_base_value !0
223084ad1ebSDmitry Makogon; CHECK-NEXT:    [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[ENTRY]] ], [ [[B3]], [[LOOP]] ], [ [[B41]], [[LEFT]] ]
224084ad1ebSDmitry Makogon; CHECK-NEXT:    [[STATEPOINT_TOKEN2:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i8 addrspace(1)* [[B6]], i8 addrspace(1)* [[B6_BASE]]) ]
225084ad1ebSDmitry Makogon; CHECK-NEXT:    [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN2]], i32 1, i32 0)
226084ad1ebSDmitry Makogon; CHECK-NEXT:    [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN2]], i32 1, i32 1)
227084ad1ebSDmitry Makogon; CHECK-NEXT:    ret i8 addrspace(1)* [[B6_RELOCATED]]
228084ad1ebSDmitry Makogon;
229084ad1ebSDmitry Makogonentry:
230084ad1ebSDmitry Makogon  br i1 %c1, label %loop, label %merge2
231084ad1ebSDmitry Makogon
232084ad1ebSDmitry Makogonloop:
233084ad1ebSDmitry Makogon  %b3 = phi i8 addrspace(1)* [ %b2, %entry ], [ %b4, %left ]
234084ad1ebSDmitry Makogon  br i1 %c1, label %left, label %merge2
235084ad1ebSDmitry Makogon
236084ad1ebSDmitry Makogonleft:
237084ad1ebSDmitry Makogon  %b4 = call i8 addrspace(1)* @returned_arg(i8 addrspace(1)* %b3)
238084ad1ebSDmitry Makogon  br i1 %c2, label %loop, label %merge2
239084ad1ebSDmitry Makogon
240084ad1ebSDmitry Makogonmerge2:
241084ad1ebSDmitry Makogon  %b6 = phi i8 addrspace(1)* [ %b1, %entry ], [ %b3, %loop ], [ %b4, %left ]
242084ad1ebSDmitry Makogon  call void @foo() [ "deopt"() ]
243084ad1ebSDmitry Makogon  ret i8 addrspace(1)* %b6
244084ad1ebSDmitry Makogon}
245084ad1ebSDmitry Makogon
246084ad1ebSDmitry Makogondefine i8 addrspace(1)* @test8(i1 %c, i32 %n, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" {
247084ad1ebSDmitry Makogon; CHECK-LABEL: @test8(
248084ad1ebSDmitry Makogon; CHECK-NEXT:  entry:
2496f8feeb3SDmitry Makogon; CHECK-NEXT:    br label [[LEFT:%.*]]
2506f8feeb3SDmitry Makogon; CHECK:       left:
2516f8feeb3SDmitry Makogon; CHECK-NEXT:    br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]]
2526f8feeb3SDmitry Makogon; CHECK:       loop:
2536f8feeb3SDmitry Makogon; CHECK-NEXT:    [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT]] ], [ [[B5:%.*]], [[LOOP]] ], [ [[B5]], [[LOOP]] ]
2546f8feeb3SDmitry Makogon; CHECK-NEXT:    [[B4:%.*]] = bitcast i8 addrspace(1)* [[B3]] to i32 addrspace(1)*
2556f8feeb3SDmitry Makogon; CHECK-NEXT:    [[B5]] = bitcast i32 addrspace(1)* [[B4]] to i8 addrspace(1)*
2566f8feeb3SDmitry Makogon; CHECK-NEXT:    switch i32 [[N:%.*]], label [[MERGE2]] [
2576f8feeb3SDmitry Makogon; CHECK-NEXT:    i32 0, label [[LOOP]]
2586f8feeb3SDmitry Makogon; CHECK-NEXT:    i32 1, label [[LOOP]]
2596f8feeb3SDmitry Makogon; CHECK-NEXT:    i32 2, label [[LEFT]]
2606f8feeb3SDmitry Makogon; CHECK-NEXT:    ]
2616f8feeb3SDmitry Makogon; CHECK:       merge2:
262*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B5]], [[LOOP]] ]
263*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 2882400000, i32 0, void ()* elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "deopt"(), "gc-live"(i8 addrspace(1)* [[B6]]) ]
264*d03d2d8aSDmitry Makogon; CHECK-NEXT:    [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0)
2656f8feeb3SDmitry Makogon; CHECK-NEXT:    ret i8 addrspace(1)* [[B6_RELOCATED]]
2666f8feeb3SDmitry Makogon;
2676f8feeb3SDmitry Makogonentry:
2686f8feeb3SDmitry Makogon  br label %left
2696f8feeb3SDmitry Makogon
2706f8feeb3SDmitry Makogonleft:
2716f8feeb3SDmitry Makogon  br i1 %c, label %loop, label %merge2
2726f8feeb3SDmitry Makogon
2736f8feeb3SDmitry Makogonloop:
2746f8feeb3SDmitry Makogon  %b3 = phi i8 addrspace(1)* [ %b2, %left ], [ %b5, %loop ], [ %b5, %loop ]
2756f8feeb3SDmitry Makogon  %b4 = bitcast i8 addrspace(1)* %b3 to i32 addrspace(1)*
2766f8feeb3SDmitry Makogon  %b5 = bitcast i32 addrspace(1)* %b4 to i8 addrspace(1)*
2776f8feeb3SDmitry Makogon  switch i32 %n, label %merge2 [ i32 0, label %loop
2786f8feeb3SDmitry Makogon  i32 1, label %loop
2796f8feeb3SDmitry Makogon  i32 2, label %left ]
2806f8feeb3SDmitry Makogon
2816f8feeb3SDmitry Makogonmerge2:
2826f8feeb3SDmitry Makogon  %b6 = phi i8 addrspace(1)* [ %b1, %left ], [ %b5, %loop ]
2836f8feeb3SDmitry Makogon  call void @foo() [ "deopt"() ]
2846f8feeb3SDmitry Makogon  ret i8 addrspace(1)* %b6
2856f8feeb3SDmitry Makogon}
286