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: 192603dcddSDmitry Makogon; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B2]], [[LOOP]] ], !is_base_value !0 202603dcddSDmitry Makogon; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[LEFT]] ], [ [[B5]], [[LOOP]] ] 212603dcddSDmitry 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]], i8 addrspace(1)* [[B6_BASE]]) ] 222603dcddSDmitry Makogon; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0) 232603dcddSDmitry Makogon; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1) 242603dcddSDmitry Makogon; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 252603dcddSDmitry Makogon; 262603dcddSDmitry Makogonleft: 272603dcddSDmitry Makogon br i1 %c, label %loop, label %merge2 282603dcddSDmitry Makogon 292603dcddSDmitry Makogonloop: 302603dcddSDmitry Makogon %b5 = phi i8 addrspace(1)* [ %b2, %left ], [ %b5, %loop ] 312603dcddSDmitry Makogon br i1 %c, label %loop, label %merge2 322603dcddSDmitry Makogon 332603dcddSDmitry Makogonmerge2: 342603dcddSDmitry Makogon %b6 = phi i8 addrspace(1)* [ %b1, %left ], [ %b5, %loop ] 352603dcddSDmitry Makogon call void @foo() [ "deopt"() ] 362603dcddSDmitry Makogon ret i8 addrspace(1)* %b6 372603dcddSDmitry Makogon} 382603dcddSDmitry Makogon 396f8feeb3SDmitry Makogondefine i8 addrspace(1)* @test2(i1 %c, i32 %n, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 406f8feeb3SDmitry Makogon; CHECK-LABEL: @test2( 416f8feeb3SDmitry Makogon; CHECK-NEXT: entry: 426f8feeb3SDmitry Makogon; CHECK-NEXT: br label [[LEFT:%.*]] 436f8feeb3SDmitry Makogon; CHECK: left: 446f8feeb3SDmitry Makogon; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]] 456f8feeb3SDmitry Makogon; CHECK: loop: 466f8feeb3SDmitry Makogon; CHECK-NEXT: [[B5:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT]] ], [ [[B5]], [[LOOP]] ], [ [[B5]], [[LOOP]] ] 476f8feeb3SDmitry Makogon; CHECK-NEXT: switch i32 [[N:%.*]], label [[MERGE2]] [ 486f8feeb3SDmitry Makogon; CHECK-NEXT: i32 0, label [[LOOP]] 496f8feeb3SDmitry Makogon; CHECK-NEXT: i32 1, label [[LOOP]] 506f8feeb3SDmitry Makogon; CHECK-NEXT: i32 2, label [[LEFT]] 516f8feeb3SDmitry Makogon; CHECK-NEXT: ] 526f8feeb3SDmitry Makogon; CHECK: merge2: 536f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B2]], [[LOOP]] ], !is_base_value !0 546f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[LEFT]] ], [ [[B5]], [[LOOP]] ] 556f8feeb3SDmitry 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]], i8 addrspace(1)* [[B6_BASE]]) ] 566f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0) 576f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1) 586f8feeb3SDmitry Makogon; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 596f8feeb3SDmitry Makogon; 606f8feeb3SDmitry Makogonentry: 616f8feeb3SDmitry Makogon br label %left 626f8feeb3SDmitry Makogon 636f8feeb3SDmitry Makogonleft: 646f8feeb3SDmitry Makogon br i1 %c, label %loop, label %merge2 656f8feeb3SDmitry Makogon 666f8feeb3SDmitry Makogonloop: 676f8feeb3SDmitry Makogon %b5 = phi i8 addrspace(1)* [ %b2, %left ], [ %b5, %loop ], [ %b5, %loop ] 686f8feeb3SDmitry Makogon switch i32 %n, label %merge2 [ i32 0, label %loop 696f8feeb3SDmitry Makogon i32 1, label %loop 706f8feeb3SDmitry Makogon i32 2, label %left ] 716f8feeb3SDmitry Makogon 726f8feeb3SDmitry Makogonmerge2: 736f8feeb3SDmitry Makogon %b6 = phi i8 addrspace(1)* [ %b1, %left ], [ %b5, %loop ] 746f8feeb3SDmitry Makogon call void @foo() [ "deopt"() ] 756f8feeb3SDmitry Makogon ret i8 addrspace(1)* %b6 766f8feeb3SDmitry Makogon} 776f8feeb3SDmitry Makogon 782603dcddSDmitry Makogon; FIXME: In this test case %b5.base and %b6.base (inserted by RS4GC) are 792603dcddSDmitry Makogon; identical to %b5 and %b6 ; correspondingly. 806f8feeb3SDmitry Makogondefine i8 addrspace(1)* @test3(i1 %c, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 816f8feeb3SDmitry Makogon; CHECK-LABEL: @test3( 822603dcddSDmitry Makogon; CHECK-NEXT: left: 832603dcddSDmitry Makogon; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]] 842603dcddSDmitry Makogon; CHECK: loop: 852603dcddSDmitry Makogon; CHECK-NEXT: [[B5_BASE:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT:%.*]] ], [ [[B5_BASE]], [[LOOP]] ], [ [[B6_BASE_RELOCATED:%.*]], [[MERGE2]] ], !is_base_value !0 862603dcddSDmitry Makogon; CHECK-NEXT: [[B5:%.*]] = phi i8 addrspace(1)* [ [[B2]], [[LEFT]] ], [ [[B5]], [[LOOP]] ], [ [[B6_RELOCATED:%.*]], [[MERGE2]] ] 872603dcddSDmitry Makogon; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[MERGE2]] 882603dcddSDmitry Makogon; CHECK: merge2: 892603dcddSDmitry Makogon; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B5_BASE]], [[LOOP]] ], !is_base_value !0 902603dcddSDmitry Makogon; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[LEFT]] ], [ [[B5]], [[LOOP]] ] 912603dcddSDmitry 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]]) ] 922603dcddSDmitry Makogon; CHECK-NEXT: [[B6_BASE_RELOCATED]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 932603dcddSDmitry Makogon; CHECK-NEXT: [[B6_RELOCATED]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 1) 942603dcddSDmitry Makogon; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]] 952603dcddSDmitry Makogon; CHECK: exit: 962603dcddSDmitry Makogon; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 972603dcddSDmitry Makogon; 982603dcddSDmitry Makogonleft: 992603dcddSDmitry Makogon br i1 %c, label %loop, label %merge2 1002603dcddSDmitry Makogon 1012603dcddSDmitry Makogonloop: 1022603dcddSDmitry Makogon %b5 = phi i8 addrspace(1)* [ %b2, %left ], [ %b5, %loop ], [ %b6, %merge2 ] 1032603dcddSDmitry Makogon br i1 %c, label %loop, label %merge2 1042603dcddSDmitry Makogon 1052603dcddSDmitry Makogonmerge2: 1062603dcddSDmitry Makogon %b6 = phi i8 addrspace(1)* [ %b1, %left ], [ %b5, %loop ] 1072603dcddSDmitry Makogon call void @foo() [ "deopt"() ] 1082603dcddSDmitry Makogon br i1 %c, label %loop, label %exit 1092603dcddSDmitry Makogon 1102603dcddSDmitry Makogonexit: 1112603dcddSDmitry Makogon ret i8 addrspace(1)* %b6 1122603dcddSDmitry Makogon} 1136f8feeb3SDmitry Makogon 1146f8feeb3SDmitry Makogondefine i8 addrspace(1)* @test4(i1 %c, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 1156f8feeb3SDmitry Makogon; CHECK-LABEL: @test4( 1166f8feeb3SDmitry Makogon; CHECK-NEXT: left: 1176f8feeb3SDmitry Makogon; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]] 1186f8feeb3SDmitry Makogon; CHECK: loop: 1196f8feeb3SDmitry Makogon; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT:%.*]] ], [ [[B5:%.*]], [[LOOP]] ] 1206f8feeb3SDmitry Makogon; CHECK-NEXT: [[B4:%.*]] = bitcast i8 addrspace(1)* [[B3]] to i32 addrspace(1)* 1216f8feeb3SDmitry Makogon; CHECK-NEXT: [[B5]] = bitcast i32 addrspace(1)* [[B4]] to i8 addrspace(1)* 1226f8feeb3SDmitry Makogon; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[MERGE2]] 1236f8feeb3SDmitry Makogon; CHECK: merge2: 1246f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B2]], [[LOOP]] ], !is_base_value !0 1256f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[LEFT]] ], [ [[B5]], [[LOOP]] ] 1266f8feeb3SDmitry 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]], i8 addrspace(1)* [[B6_BASE]]) ] 1276f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0) 1286f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1) 1296f8feeb3SDmitry Makogon; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 1306f8feeb3SDmitry Makogon; 1316f8feeb3SDmitry Makogonleft: 1326f8feeb3SDmitry Makogon br i1 %c, label %loop, label %merge2 1336f8feeb3SDmitry Makogon 1346f8feeb3SDmitry Makogonloop: 1356f8feeb3SDmitry Makogon %b3 = phi i8 addrspace(1)* [ %b2, %left ], [ %b5, %loop ] 1366f8feeb3SDmitry Makogon %b4 = bitcast i8 addrspace(1)* %b3 to i32 addrspace(1)* 1376f8feeb3SDmitry Makogon %b5 = bitcast i32 addrspace(1)* %b4 to i8 addrspace(1)* 1386f8feeb3SDmitry Makogon br i1 %c, label %loop, label %merge2 1396f8feeb3SDmitry Makogon 1406f8feeb3SDmitry Makogonmerge2: 1416f8feeb3SDmitry Makogon %b6 = phi i8 addrspace(1)* [ %b1, %left ], [ %b5, %loop ] 1426f8feeb3SDmitry Makogon call void @foo() [ "deopt"() ] 1436f8feeb3SDmitry Makogon ret i8 addrspace(1)* %b6 1446f8feeb3SDmitry Makogon} 1456f8feeb3SDmitry Makogon 146*084ad1ebSDmitry Makogondefine i8 addrspace(1)* @test5(i1 %c1, i1 %c2, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 1476f8feeb3SDmitry Makogon; CHECK-LABEL: @test5( 1486f8feeb3SDmitry Makogon; CHECK-NEXT: entry: 149*084ad1ebSDmitry Makogon; CHECK-NEXT: br i1 [[C1:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]] 150*084ad1ebSDmitry Makogon; CHECK: loop: 151*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[ENTRY:%.*]] ], [ [[B5:%.*]], [[LEFT:%.*]] ] 152*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B4:%.*]] = addrspacecast i8 addrspace(1)* [[B3]] to i8* 153*084ad1ebSDmitry Makogon; CHECK-NEXT: br i1 [[C1]], label [[LEFT]], label [[MERGE2]] 154*084ad1ebSDmitry Makogon; CHECK: left: 155*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B5]] = addrspacecast i8* [[B4]] to i8 addrspace(1)* 156*084ad1ebSDmitry Makogon; CHECK-NEXT: br i1 [[C2:%.*]], label [[LOOP]], label [[MERGE2]] 157*084ad1ebSDmitry Makogon; CHECK: merge2: 158*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[ENTRY]] ], [ [[B2]], [[LOOP]] ], [ [[B2]], [[LEFT]] ], !is_base_value !0 159*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[ENTRY]] ], [ [[B3]], [[LOOP]] ], [ [[B5]], [[LEFT]] ] 160*084ad1ebSDmitry 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]], i8 addrspace(1)* [[B6_BASE]]) ] 161*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0) 162*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1) 163*084ad1ebSDmitry Makogon; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 164*084ad1ebSDmitry Makogon; 165*084ad1ebSDmitry Makogonentry: 166*084ad1ebSDmitry Makogon br i1 %c1, label %loop, label %merge2 167*084ad1ebSDmitry Makogon 168*084ad1ebSDmitry Makogonloop: 169*084ad1ebSDmitry Makogon %b3 = phi i8 addrspace(1)* [ %b2, %entry ], [ %b5, %left ] 170*084ad1ebSDmitry Makogon %b4 = addrspacecast i8 addrspace(1)* %b3 to i8* 171*084ad1ebSDmitry Makogon br i1 %c1, label %left, label %merge2 172*084ad1ebSDmitry Makogon 173*084ad1ebSDmitry Makogonleft: 174*084ad1ebSDmitry Makogon %b5 = addrspacecast i8* %b4 to i8 addrspace(1)* 175*084ad1ebSDmitry Makogon br i1 %c2, label %loop, label %merge2 176*084ad1ebSDmitry Makogon 177*084ad1ebSDmitry Makogonmerge2: 178*084ad1ebSDmitry Makogon %b6 = phi i8 addrspace(1)* [ %b1, %entry ], [ %b3, %loop ], [ %b5, %left ] 179*084ad1ebSDmitry Makogon call void @foo() [ "deopt"() ] 180*084ad1ebSDmitry Makogon ret i8 addrspace(1)* %b6 181*084ad1ebSDmitry Makogon} 182*084ad1ebSDmitry Makogon 183*084ad1ebSDmitry Makogondefine i8 addrspace(1)* @test6(i1 %c1, i1 %c2, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 184*084ad1ebSDmitry Makogon; CHECK-LABEL: @test6( 185*084ad1ebSDmitry Makogon; CHECK-NEXT: entry: 186*084ad1ebSDmitry Makogon; CHECK-NEXT: br i1 [[C1:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]] 187*084ad1ebSDmitry Makogon; CHECK: loop: 188*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[ENTRY:%.*]] ], [ [[B3]], [[LEFT:%.*]] ] 189*084ad1ebSDmitry Makogon; CHECK-NEXT: br i1 [[C1]], label [[LEFT]], label [[MERGE2]] 190*084ad1ebSDmitry Makogon; CHECK: left: 191*084ad1ebSDmitry Makogon; CHECK-NEXT: br i1 [[C2:%.*]], label [[LOOP]], label [[MERGE2]] 192*084ad1ebSDmitry Makogon; CHECK: merge2: 193*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[ENTRY]] ], [ [[B2]], [[LOOP]] ], [ [[B2]], [[LEFT]] ], !is_base_value !0 194*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[ENTRY]] ], [ [[B3]], [[LOOP]] ], [ [[B3]], [[LEFT]] ] 195*084ad1ebSDmitry 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]], i8 addrspace(1)* [[B6_BASE]]) ] 196*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0) 197*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1) 198*084ad1ebSDmitry Makogon; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 199*084ad1ebSDmitry Makogon; 200*084ad1ebSDmitry Makogonentry: 201*084ad1ebSDmitry Makogon br i1 %c1, label %loop, label %merge2 202*084ad1ebSDmitry Makogon 203*084ad1ebSDmitry Makogonloop: 204*084ad1ebSDmitry Makogon %b3 = phi i8 addrspace(1)* [ %b2, %entry ], [ %b4, %left ] 205*084ad1ebSDmitry Makogon br i1 %c1, label %left, label %merge2 206*084ad1ebSDmitry Makogon 207*084ad1ebSDmitry Makogonleft: 208*084ad1ebSDmitry Makogon %b4 = phi i8 addrspace(1)* [ %b3, %loop ] 209*084ad1ebSDmitry Makogon br i1 %c2, label %loop, label %merge2 210*084ad1ebSDmitry Makogon 211*084ad1ebSDmitry Makogonmerge2: 212*084ad1ebSDmitry Makogon %b6 = phi i8 addrspace(1)* [ %b1, %entry ], [ %b3, %loop ], [ %b4, %left ] 213*084ad1ebSDmitry Makogon call void @foo() [ "deopt"() ] 214*084ad1ebSDmitry Makogon ret i8 addrspace(1)* %b6 215*084ad1ebSDmitry Makogon} 216*084ad1ebSDmitry Makogon 217*084ad1ebSDmitry Makogondeclare i8 addrspace(1)* @returned_arg(i8 addrspace(1)* returned %p) 218*084ad1ebSDmitry Makogon 219*084ad1ebSDmitry Makogondefine i8 addrspace(1)* @test7(i1 %c1, i1 %c2, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 220*084ad1ebSDmitry Makogon; CHECK-LABEL: @test7( 221*084ad1ebSDmitry Makogon; CHECK-NEXT: entry: 222*084ad1ebSDmitry Makogon; CHECK-NEXT: br i1 [[C1:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]] 223*084ad1ebSDmitry Makogon; CHECK: loop: 224*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B3_BASE:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[ENTRY:%.*]] ], [ [[B41:%.*]], [[LEFT:%.*]] ], !is_base_value !0 225*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2]], [[ENTRY]] ], [ [[B41]], [[LEFT]] ] 226*084ad1ebSDmitry Makogon; CHECK-NEXT: br i1 [[C1]], label [[LEFT]], label [[MERGE2]] 227*084ad1ebSDmitry Makogon; CHECK: left: 228*084ad1ebSDmitry 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_BASE]], i8 addrspace(1)* [[B3]]) ] 229*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B41]] = call i8 addrspace(1)* @llvm.experimental.gc.result.p1i8(token [[STATEPOINT_TOKEN]]) 230*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B3_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 231*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B3_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 1) 232*084ad1ebSDmitry Makogon; CHECK-NEXT: br i1 [[C2:%.*]], label [[LOOP]], label [[MERGE2]] 233*084ad1ebSDmitry Makogon; CHECK: merge2: 234*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[ENTRY]] ], [ [[B3_BASE]], [[LOOP]] ], [ [[B41]], [[LEFT]] ], !is_base_value !0 235*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[ENTRY]] ], [ [[B3]], [[LOOP]] ], [ [[B41]], [[LEFT]] ] 236*084ad1ebSDmitry 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]]) ] 237*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN2]], i32 1, i32 0) 238*084ad1ebSDmitry Makogon; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN2]], i32 1, i32 1) 239*084ad1ebSDmitry Makogon; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 240*084ad1ebSDmitry Makogon; 241*084ad1ebSDmitry Makogonentry: 242*084ad1ebSDmitry Makogon br i1 %c1, label %loop, label %merge2 243*084ad1ebSDmitry Makogon 244*084ad1ebSDmitry Makogonloop: 245*084ad1ebSDmitry Makogon %b3 = phi i8 addrspace(1)* [ %b2, %entry ], [ %b4, %left ] 246*084ad1ebSDmitry Makogon br i1 %c1, label %left, label %merge2 247*084ad1ebSDmitry Makogon 248*084ad1ebSDmitry Makogonleft: 249*084ad1ebSDmitry Makogon %b4 = call i8 addrspace(1)* @returned_arg(i8 addrspace(1)* %b3) 250*084ad1ebSDmitry Makogon br i1 %c2, label %loop, label %merge2 251*084ad1ebSDmitry Makogon 252*084ad1ebSDmitry Makogonmerge2: 253*084ad1ebSDmitry Makogon %b6 = phi i8 addrspace(1)* [ %b1, %entry ], [ %b3, %loop ], [ %b4, %left ] 254*084ad1ebSDmitry Makogon call void @foo() [ "deopt"() ] 255*084ad1ebSDmitry Makogon ret i8 addrspace(1)* %b6 256*084ad1ebSDmitry Makogon} 257*084ad1ebSDmitry Makogon 258*084ad1ebSDmitry Makogondefine i8 addrspace(1)* @test8(i1 %c, i32 %n, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 259*084ad1ebSDmitry Makogon; CHECK-LABEL: @test8( 260*084ad1ebSDmitry Makogon; CHECK-NEXT: entry: 2616f8feeb3SDmitry Makogon; CHECK-NEXT: br label [[LEFT:%.*]] 2626f8feeb3SDmitry Makogon; CHECK: left: 2636f8feeb3SDmitry Makogon; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]] 2646f8feeb3SDmitry Makogon; CHECK: loop: 2656f8feeb3SDmitry Makogon; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT]] ], [ [[B5:%.*]], [[LOOP]] ], [ [[B5]], [[LOOP]] ] 2666f8feeb3SDmitry Makogon; CHECK-NEXT: [[B4:%.*]] = bitcast i8 addrspace(1)* [[B3]] to i32 addrspace(1)* 2676f8feeb3SDmitry Makogon; CHECK-NEXT: [[B5]] = bitcast i32 addrspace(1)* [[B4]] to i8 addrspace(1)* 2686f8feeb3SDmitry Makogon; CHECK-NEXT: switch i32 [[N:%.*]], label [[MERGE2]] [ 2696f8feeb3SDmitry Makogon; CHECK-NEXT: i32 0, label [[LOOP]] 2706f8feeb3SDmitry Makogon; CHECK-NEXT: i32 1, label [[LOOP]] 2716f8feeb3SDmitry Makogon; CHECK-NEXT: i32 2, label [[LEFT]] 2726f8feeb3SDmitry Makogon; CHECK-NEXT: ] 2736f8feeb3SDmitry Makogon; CHECK: merge2: 2746f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B2]], [[LOOP]] ], !is_base_value !0 2756f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[LEFT]] ], [ [[B5]], [[LOOP]] ] 2766f8feeb3SDmitry 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]], i8 addrspace(1)* [[B6_BASE]]) ] 2776f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0) 2786f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1) 2796f8feeb3SDmitry Makogon; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 2806f8feeb3SDmitry Makogon; 2816f8feeb3SDmitry Makogonentry: 2826f8feeb3SDmitry Makogon br label %left 2836f8feeb3SDmitry Makogon 2846f8feeb3SDmitry Makogonleft: 2856f8feeb3SDmitry Makogon br i1 %c, label %loop, label %merge2 2866f8feeb3SDmitry Makogon 2876f8feeb3SDmitry Makogonloop: 2886f8feeb3SDmitry Makogon %b3 = phi i8 addrspace(1)* [ %b2, %left ], [ %b5, %loop ], [ %b5, %loop ] 2896f8feeb3SDmitry Makogon %b4 = bitcast i8 addrspace(1)* %b3 to i32 addrspace(1)* 2906f8feeb3SDmitry Makogon %b5 = bitcast i32 addrspace(1)* %b4 to i8 addrspace(1)* 2916f8feeb3SDmitry Makogon switch i32 %n, label %merge2 [ i32 0, label %loop 2926f8feeb3SDmitry Makogon i32 1, label %loop 2936f8feeb3SDmitry Makogon i32 2, label %left ] 2946f8feeb3SDmitry Makogon 2956f8feeb3SDmitry Makogonmerge2: 2966f8feeb3SDmitry Makogon %b6 = phi i8 addrspace(1)* [ %b1, %left ], [ %b5, %loop ] 2976f8feeb3SDmitry Makogon call void @foo() [ "deopt"() ] 2986f8feeb3SDmitry Makogon ret i8 addrspace(1)* %b6 2996f8feeb3SDmitry Makogon} 300