1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -S -rewrite-statepoints-for-gc < %s | FileCheck %s 3 4target 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" 5target triple = "x86_64-unknown-linux-gnu" 6 7declare void @foo() gc "statepoint-example" 8 9; FIXME: In this test case %b6.base, which is inserted by RS4GC, is identical 10; to %b6. 11define i8 addrspace(1)* @test1(i1 %c, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 12; CHECK-LABEL: @test1( 13; CHECK-NEXT: left: 14; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]] 15; CHECK: loop: 16; CHECK-NEXT: [[B5:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT:%.*]] ], [ [[B5]], [[LOOP]] ] 17; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[MERGE2]] 18; CHECK: merge2: 19; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B2]], [[LOOP]] ], !is_base_value !0 20; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[LEFT]] ], [ [[B5]], [[LOOP]] ] 21; 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]]) ] 22; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0) 23; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1) 24; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 25; 26left: 27 br i1 %c, label %loop, label %merge2 28 29loop: 30 %b5 = phi i8 addrspace(1)* [ %b2, %left ], [ %b5, %loop ] 31 br i1 %c, label %loop, label %merge2 32 33merge2: 34 %b6 = phi i8 addrspace(1)* [ %b1, %left ], [ %b5, %loop ] 35 call void @foo() [ "deopt"() ] 36 ret i8 addrspace(1)* %b6 37} 38 39define i8 addrspace(1)* @test2(i1 %c, i32 %n, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 40; CHECK-LABEL: @test2( 41; CHECK-NEXT: entry: 42; CHECK-NEXT: br label [[LEFT:%.*]] 43; CHECK: left: 44; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]] 45; CHECK: loop: 46; CHECK-NEXT: [[B5:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT]] ], [ [[B5]], [[LOOP]] ], [ [[B5]], [[LOOP]] ] 47; CHECK-NEXT: switch i32 [[N:%.*]], label [[MERGE2]] [ 48; CHECK-NEXT: i32 0, label [[LOOP]] 49; CHECK-NEXT: i32 1, label [[LOOP]] 50; CHECK-NEXT: i32 2, label [[LEFT]] 51; CHECK-NEXT: ] 52; CHECK: merge2: 53; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B2]], [[LOOP]] ], !is_base_value !0 54; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[LEFT]] ], [ [[B5]], [[LOOP]] ] 55; 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; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0) 57; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1) 58; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 59; 60entry: 61 br label %left 62 63left: 64 br i1 %c, label %loop, label %merge2 65 66loop: 67 %b5 = phi i8 addrspace(1)* [ %b2, %left ], [ %b5, %loop ], [ %b5, %loop ] 68 switch i32 %n, label %merge2 [ i32 0, label %loop 69 i32 1, label %loop 70 i32 2, label %left ] 71 72merge2: 73 %b6 = phi i8 addrspace(1)* [ %b1, %left ], [ %b5, %loop ] 74 call void @foo() [ "deopt"() ] 75 ret i8 addrspace(1)* %b6 76} 77 78; FIXME: In this test case %b5.base and %b6.base (inserted by RS4GC) are 79; identical to %b5 and %b6 ; correspondingly. 80define i8 addrspace(1)* @test3(i1 %c, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 81; CHECK-LABEL: @test3( 82; CHECK-NEXT: left: 83; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]] 84; CHECK: loop: 85; CHECK-NEXT: [[B5_BASE:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT:%.*]] ], [ [[B5_BASE]], [[LOOP]] ], [ [[B6_BASE_RELOCATED:%.*]], [[MERGE2]] ], !is_base_value !0 86; CHECK-NEXT: [[B5:%.*]] = phi i8 addrspace(1)* [ [[B2]], [[LEFT]] ], [ [[B5]], [[LOOP]] ], [ [[B6_RELOCATED:%.*]], [[MERGE2]] ] 87; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[MERGE2]] 88; CHECK: merge2: 89; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B5_BASE]], [[LOOP]] ], !is_base_value !0 90; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[LEFT]] ], [ [[B5]], [[LOOP]] ] 91; 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]]) ] 92; CHECK-NEXT: [[B6_BASE_RELOCATED]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 93; CHECK-NEXT: [[B6_RELOCATED]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 1) 94; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[EXIT:%.*]] 95; CHECK: exit: 96; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 97; 98left: 99 br i1 %c, label %loop, label %merge2 100 101loop: 102 %b5 = phi i8 addrspace(1)* [ %b2, %left ], [ %b5, %loop ], [ %b6, %merge2 ] 103 br i1 %c, label %loop, label %merge2 104 105merge2: 106 %b6 = phi i8 addrspace(1)* [ %b1, %left ], [ %b5, %loop ] 107 call void @foo() [ "deopt"() ] 108 br i1 %c, label %loop, label %exit 109 110exit: 111 ret i8 addrspace(1)* %b6 112} 113 114define i8 addrspace(1)* @test4(i1 %c, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 115; CHECK-LABEL: @test4( 116; CHECK-NEXT: left: 117; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]] 118; CHECK: loop: 119; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT:%.*]] ], [ [[B5:%.*]], [[LOOP]] ] 120; CHECK-NEXT: [[B4:%.*]] = bitcast i8 addrspace(1)* [[B3]] to i32 addrspace(1)* 121; CHECK-NEXT: [[B5]] = bitcast i32 addrspace(1)* [[B4]] to i8 addrspace(1)* 122; CHECK-NEXT: br i1 [[C]], label [[LOOP]], label [[MERGE2]] 123; CHECK: merge2: 124; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B2]], [[LOOP]] ], !is_base_value !0 125; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[LEFT]] ], [ [[B5]], [[LOOP]] ] 126; 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; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0) 128; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1) 129; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 130; 131left: 132 br i1 %c, label %loop, label %merge2 133 134loop: 135 %b3 = phi i8 addrspace(1)* [ %b2, %left ], [ %b5, %loop ] 136 %b4 = bitcast i8 addrspace(1)* %b3 to i32 addrspace(1)* 137 %b5 = bitcast i32 addrspace(1)* %b4 to i8 addrspace(1)* 138 br i1 %c, label %loop, label %merge2 139 140merge2: 141 %b6 = phi i8 addrspace(1)* [ %b1, %left ], [ %b5, %loop ] 142 call void @foo() [ "deopt"() ] 143 ret i8 addrspace(1)* %b6 144} 145 146define i8 addrspace(1)* @test5(i1 %c1, i1 %c2, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 147; CHECK-LABEL: @test5( 148; CHECK-NEXT: entry: 149; CHECK-NEXT: br i1 [[C1:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]] 150; CHECK: loop: 151; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[ENTRY:%.*]] ], [ [[B5:%.*]], [[LEFT:%.*]] ] 152; CHECK-NEXT: [[B4:%.*]] = addrspacecast i8 addrspace(1)* [[B3]] to i8* 153; CHECK-NEXT: br i1 [[C1]], label [[LEFT]], label [[MERGE2]] 154; CHECK: left: 155; CHECK-NEXT: [[B5]] = addrspacecast i8* [[B4]] to i8 addrspace(1)* 156; CHECK-NEXT: br i1 [[C2:%.*]], label [[LOOP]], label [[MERGE2]] 157; CHECK: merge2: 158; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[ENTRY]] ], [ [[B2]], [[LOOP]] ], [ [[B2]], [[LEFT]] ], !is_base_value !0 159; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[ENTRY]] ], [ [[B3]], [[LOOP]] ], [ [[B5]], [[LEFT]] ] 160; 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; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0) 162; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1) 163; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 164; 165entry: 166 br i1 %c1, label %loop, label %merge2 167 168loop: 169 %b3 = phi i8 addrspace(1)* [ %b2, %entry ], [ %b5, %left ] 170 %b4 = addrspacecast i8 addrspace(1)* %b3 to i8* 171 br i1 %c1, label %left, label %merge2 172 173left: 174 %b5 = addrspacecast i8* %b4 to i8 addrspace(1)* 175 br i1 %c2, label %loop, label %merge2 176 177merge2: 178 %b6 = phi i8 addrspace(1)* [ %b1, %entry ], [ %b3, %loop ], [ %b5, %left ] 179 call void @foo() [ "deopt"() ] 180 ret i8 addrspace(1)* %b6 181} 182 183define i8 addrspace(1)* @test6(i1 %c1, i1 %c2, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 184; CHECK-LABEL: @test6( 185; CHECK-NEXT: entry: 186; CHECK-NEXT: br i1 [[C1:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]] 187; CHECK: loop: 188; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[ENTRY:%.*]] ], [ [[B3]], [[LEFT:%.*]] ] 189; CHECK-NEXT: br i1 [[C1]], label [[LEFT]], label [[MERGE2]] 190; CHECK: left: 191; CHECK-NEXT: br i1 [[C2:%.*]], label [[LOOP]], label [[MERGE2]] 192; CHECK: merge2: 193; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[ENTRY]] ], [ [[B2]], [[LOOP]] ], [ [[B2]], [[LEFT]] ], !is_base_value !0 194; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[ENTRY]] ], [ [[B3]], [[LOOP]] ], [ [[B3]], [[LEFT]] ] 195; 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; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0) 197; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1) 198; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 199; 200entry: 201 br i1 %c1, label %loop, label %merge2 202 203loop: 204 %b3 = phi i8 addrspace(1)* [ %b2, %entry ], [ %b4, %left ] 205 br i1 %c1, label %left, label %merge2 206 207left: 208 %b4 = phi i8 addrspace(1)* [ %b3, %loop ] 209 br i1 %c2, label %loop, label %merge2 210 211merge2: 212 %b6 = phi i8 addrspace(1)* [ %b1, %entry ], [ %b3, %loop ], [ %b4, %left ] 213 call void @foo() [ "deopt"() ] 214 ret i8 addrspace(1)* %b6 215} 216 217declare i8 addrspace(1)* @returned_arg(i8 addrspace(1)* returned %p) 218 219define i8 addrspace(1)* @test7(i1 %c1, i1 %c2, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 220; CHECK-LABEL: @test7( 221; CHECK-NEXT: entry: 222; CHECK-NEXT: br i1 [[C1:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]] 223; CHECK: loop: 224; CHECK-NEXT: [[B3_BASE:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[ENTRY:%.*]] ], [ [[B41:%.*]], [[LEFT:%.*]] ], !is_base_value !0 225; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2]], [[ENTRY]] ], [ [[B41]], [[LEFT]] ] 226; CHECK-NEXT: br i1 [[C1]], label [[LEFT]], label [[MERGE2]] 227; CHECK: left: 228; 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; CHECK-NEXT: [[B41]] = call i8 addrspace(1)* @llvm.experimental.gc.result.p1i8(token [[STATEPOINT_TOKEN]]) 230; CHECK-NEXT: [[B3_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 231; CHECK-NEXT: [[B3_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 0, i32 1) 232; CHECK-NEXT: br i1 [[C2:%.*]], label [[LOOP]], label [[MERGE2]] 233; CHECK: merge2: 234; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[ENTRY]] ], [ [[B3_BASE]], [[LOOP]] ], [ [[B41]], [[LEFT]] ], !is_base_value !0 235; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[ENTRY]] ], [ [[B3]], [[LOOP]] ], [ [[B41]], [[LEFT]] ] 236; 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; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN2]], i32 1, i32 0) 238; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN2]], i32 1, i32 1) 239; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 240; 241entry: 242 br i1 %c1, label %loop, label %merge2 243 244loop: 245 %b3 = phi i8 addrspace(1)* [ %b2, %entry ], [ %b4, %left ] 246 br i1 %c1, label %left, label %merge2 247 248left: 249 %b4 = call i8 addrspace(1)* @returned_arg(i8 addrspace(1)* %b3) 250 br i1 %c2, label %loop, label %merge2 251 252merge2: 253 %b6 = phi i8 addrspace(1)* [ %b1, %entry ], [ %b3, %loop ], [ %b4, %left ] 254 call void @foo() [ "deopt"() ] 255 ret i8 addrspace(1)* %b6 256} 257 258define i8 addrspace(1)* @test8(i1 %c, i32 %n, i8 addrspace(1)* %b1, i8 addrspace(1)* %b2) gc "statepoint-example" { 259; CHECK-LABEL: @test8( 260; CHECK-NEXT: entry: 261; CHECK-NEXT: br label [[LEFT:%.*]] 262; CHECK: left: 263; CHECK-NEXT: br i1 [[C:%.*]], label [[LOOP:%.*]], label [[MERGE2:%.*]] 264; CHECK: loop: 265; CHECK-NEXT: [[B3:%.*]] = phi i8 addrspace(1)* [ [[B2:%.*]], [[LEFT]] ], [ [[B5:%.*]], [[LOOP]] ], [ [[B5]], [[LOOP]] ] 266; CHECK-NEXT: [[B4:%.*]] = bitcast i8 addrspace(1)* [[B3]] to i32 addrspace(1)* 267; CHECK-NEXT: [[B5]] = bitcast i32 addrspace(1)* [[B4]] to i8 addrspace(1)* 268; CHECK-NEXT: switch i32 [[N:%.*]], label [[MERGE2]] [ 269; CHECK-NEXT: i32 0, label [[LOOP]] 270; CHECK-NEXT: i32 1, label [[LOOP]] 271; CHECK-NEXT: i32 2, label [[LEFT]] 272; CHECK-NEXT: ] 273; CHECK: merge2: 274; CHECK-NEXT: [[B6_BASE:%.*]] = phi i8 addrspace(1)* [ [[B1:%.*]], [[LEFT]] ], [ [[B2]], [[LOOP]] ], !is_base_value !0 275; CHECK-NEXT: [[B6:%.*]] = phi i8 addrspace(1)* [ [[B1]], [[LEFT]] ], [ [[B5]], [[LOOP]] ] 276; 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]]) ] 277; CHECK-NEXT: [[B6_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 0) 278; CHECK-NEXT: [[B6_BASE_RELOCATED:%.*]] = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(token [[STATEPOINT_TOKEN]], i32 1, i32 1) 279; CHECK-NEXT: ret i8 addrspace(1)* [[B6_RELOCATED]] 280; 281entry: 282 br label %left 283 284left: 285 br i1 %c, label %loop, label %merge2 286 287loop: 288 %b3 = phi i8 addrspace(1)* [ %b2, %left ], [ %b5, %loop ], [ %b5, %loop ] 289 %b4 = bitcast i8 addrspace(1)* %b3 to i32 addrspace(1)* 290 %b5 = bitcast i32 addrspace(1)* %b4 to i8 addrspace(1)* 291 switch i32 %n, label %merge2 [ i32 0, label %loop 292 i32 1, label %loop 293 i32 2, label %left ] 294 295merge2: 296 %b6 = phi i8 addrspace(1)* [ %b1, %left ], [ %b5, %loop ] 297 call void @foo() [ "deopt"() ] 298 ret i8 addrspace(1)* %b6 299} 300