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