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 39*6f8feeb3SDmitry Makogondefine i8 addrspace(1)* @test2(i1 %c, i32 %n, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 40*6f8feeb3SDmitry Makogon; CHECK-LABEL: @test2( 41*6f8feeb3SDmitry Makogon; CHECK-NEXT: entry: 42*6f8feeb3SDmitry Makogon; CHECK-NEXT: br label [[LEFT:%.*]] 43*6f8feeb3SDmitry Makogon; CHECK: left: 44*6f8feeb3SDmitry Makogon; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]] 45*6f8feeb3SDmitry Makogon; CHECK: loop: 46*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B5:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT]] ], [ [[B5]], [[LOOP]] ], [ [[B5]], [[LOOP]] ] 47*6f8feeb3SDmitry Makogon; CHECK-NEXT: switch i32 [[N:%.*]], label [[MERGE2]] [ 48*6f8feeb3SDmitry Makogon; CHECK-NEXT: i32 0, label [[LOOP]] 49*6f8feeb3SDmitry Makogon; CHECK-NEXT: i32 1, label [[LOOP]] 50*6f8feeb3SDmitry Makogon; CHECK-NEXT: i32 2, label [[LEFT]] 51*6f8feeb3SDmitry Makogon; CHECK-NEXT: ] 52*6f8feeb3SDmitry Makogon; CHECK: merge2: 53*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B2]], [[LOOP]] ], !is_base_value !0 54*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[LEFT]] ], [ [[B5]], [[LOOP]] ] 55*6f8feeb3SDmitry 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]]) ] 56*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0) 57*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1) 58*6f8feeb3SDmitry Makogon; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 59*6f8feeb3SDmitry Makogon; 60*6f8feeb3SDmitry Makogonentry: 61*6f8feeb3SDmitry Makogon br label %left 62*6f8feeb3SDmitry Makogon 63*6f8feeb3SDmitry Makogonleft: 64*6f8feeb3SDmitry Makogon br i1 %c, label %loop, label %merge2 65*6f8feeb3SDmitry Makogon 66*6f8feeb3SDmitry Makogonloop: 67*6f8feeb3SDmitry Makogon %b5 = phi i8 addrspace(1)* [ %b2, %left ], [ %b5, %loop ], [ %b5, %loop ] 68*6f8feeb3SDmitry Makogon switch i32 %n, label %merge2 [ i32 0, label %loop 69*6f8feeb3SDmitry Makogon i32 1, label %loop 70*6f8feeb3SDmitry Makogon i32 2, label %left ] 71*6f8feeb3SDmitry Makogon 72*6f8feeb3SDmitry Makogonmerge2: 73*6f8feeb3SDmitry Makogon %b6 = phi i8 addrspace(1)* [ %b1, %left ], [ %b5, %loop ] 74*6f8feeb3SDmitry Makogon call void @foo() [ "deopt"() ] 75*6f8feeb3SDmitry Makogon ret i8 addrspace(1)* %b6 76*6f8feeb3SDmitry Makogon} 77*6f8feeb3SDmitry 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. 80*6f8feeb3SDmitry Makogondefine i8 addrspace(1)* @test3(i1 %c, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 81*6f8feeb3SDmitry 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} 113*6f8feeb3SDmitry Makogon 114*6f8feeb3SDmitry Makogondefine i8 addrspace(1)* @test4(i1 %c, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 115*6f8feeb3SDmitry Makogon; CHECK-LABEL: @test4( 116*6f8feeb3SDmitry Makogon; CHECK-NEXT: left: 117*6f8feeb3SDmitry Makogon; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]] 118*6f8feeb3SDmitry Makogon; CHECK: loop: 119*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT:%.*]] ], [ [[B5:%.*]], [[LOOP]] ] 120*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B4:%.*]] = bitcast i8 addrspace(1)* [[B3]] to i32 addrspace(1)* 121*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B5]] = bitcast i32 addrspace(1)* [[B4]] to i8 addrspace(1)* 122*6f8feeb3SDmitry Makogon; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[MERGE2]] 123*6f8feeb3SDmitry Makogon; CHECK: merge2: 124*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B2]], [[LOOP]] ], !is_base_value !0 125*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[LEFT]] ], [ [[B5]], [[LOOP]] ] 126*6f8feeb3SDmitry 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]]) ] 127*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0) 128*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1) 129*6f8feeb3SDmitry Makogon; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 130*6f8feeb3SDmitry Makogon; 131*6f8feeb3SDmitry Makogonleft: 132*6f8feeb3SDmitry Makogon br i1 %c, label %loop, label %merge2 133*6f8feeb3SDmitry Makogon 134*6f8feeb3SDmitry Makogonloop: 135*6f8feeb3SDmitry Makogon %b3 = phi i8 addrspace(1)* [ %b2, %left ], [ %b5, %loop ] 136*6f8feeb3SDmitry Makogon %b4 = bitcast i8 addrspace(1)* %b3 to i32 addrspace(1)* 137*6f8feeb3SDmitry Makogon %b5 = bitcast i32 addrspace(1)* %b4 to i8 addrspace(1)* 138*6f8feeb3SDmitry Makogon br i1 %c, label %loop, label %merge2 139*6f8feeb3SDmitry Makogon 140*6f8feeb3SDmitry Makogonmerge2: 141*6f8feeb3SDmitry Makogon %b6 = phi i8 addrspace(1)* [ %b1, %left ], [ %b5, %loop ] 142*6f8feeb3SDmitry Makogon call void @foo() [ "deopt"() ] 143*6f8feeb3SDmitry Makogon ret i8 addrspace(1)* %b6 144*6f8feeb3SDmitry Makogon} 145*6f8feeb3SDmitry Makogon 146*6f8feeb3SDmitry Makogondefine i8 addrspace(1)* @test5(i1 %c, i32 %n, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 147*6f8feeb3SDmitry Makogon; CHECK-LABEL: @test5( 148*6f8feeb3SDmitry Makogon; CHECK-NEXT: entry: 149*6f8feeb3SDmitry Makogon; CHECK-NEXT: br label [[LEFT:%.*]] 150*6f8feeb3SDmitry Makogon; CHECK: left: 151*6f8feeb3SDmitry Makogon; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]] 152*6f8feeb3SDmitry Makogon; CHECK: loop: 153*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT]] ], [ [[B5:%.*]], [[LOOP]] ], [ [[B5]], [[LOOP]] ] 154*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B4:%.*]] = bitcast i8 addrspace(1)* [[B3]] to i32 addrspace(1)* 155*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B5]] = bitcast i32 addrspace(1)* [[B4]] to i8 addrspace(1)* 156*6f8feeb3SDmitry Makogon; CHECK-NEXT: switch i32 [[N:%.*]], label [[MERGE2]] [ 157*6f8feeb3SDmitry Makogon; CHECK-NEXT: i32 0, label [[LOOP]] 158*6f8feeb3SDmitry Makogon; CHECK-NEXT: i32 1, label [[LOOP]] 159*6f8feeb3SDmitry Makogon; CHECK-NEXT: i32 2, label [[LEFT]] 160*6f8feeb3SDmitry Makogon; CHECK-NEXT: ] 161*6f8feeb3SDmitry Makogon; CHECK: merge2: 162*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B2]], [[LOOP]] ], !is_base_value !0 163*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[LEFT]] ], [ [[B5]], [[LOOP]] ] 164*6f8feeb3SDmitry 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]]) ] 165*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0) 166*6f8feeb3SDmitry Makogon; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1) 167*6f8feeb3SDmitry Makogon; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 168*6f8feeb3SDmitry Makogon; 169*6f8feeb3SDmitry Makogonentry: 170*6f8feeb3SDmitry Makogon br label %left 171*6f8feeb3SDmitry Makogon 172*6f8feeb3SDmitry Makogonleft: 173*6f8feeb3SDmitry Makogon br i1 %c, label %loop, label %merge2 174*6f8feeb3SDmitry Makogon 175*6f8feeb3SDmitry Makogonloop: 176*6f8feeb3SDmitry Makogon %b3 = phi i8 addrspace(1)* [ %b2, %left ], [ %b5, %loop ], [ %b5, %loop ] 177*6f8feeb3SDmitry Makogon %b4 = bitcast i8 addrspace(1)* %b3 to i32 addrspace(1)* 178*6f8feeb3SDmitry Makogon %b5 = bitcast i32 addrspace(1)* %b4 to i8 addrspace(1)* 179*6f8feeb3SDmitry Makogon switch i32 %n, label %merge2 [ i32 0, label %loop 180*6f8feeb3SDmitry Makogon i32 1, label %loop 181*6f8feeb3SDmitry Makogon i32 2, label %left ] 182*6f8feeb3SDmitry Makogon 183*6f8feeb3SDmitry Makogonmerge2: 184*6f8feeb3SDmitry Makogon %b6 = phi i8 addrspace(1)* [ %b1, %left ], [ %b5, %loop ] 185*6f8feeb3SDmitry Makogon call void @foo() [ "deopt"() ] 186*6f8feeb3SDmitry Makogon ret i8 addrspace(1)* %b6 187*6f8feeb3SDmitry Makogon} 188