1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=rewrite-statepoints-for-gc -S 2>&1 | FileCheck %s 3 4; A collection of tests for exercising the base inference logic in the 5; findBasePointers. That is, the logic which proves a potentially derived 6; pointer is actually a base pointer itself. 7 8define ptr addrspace(1) @test(ptr addrspace(1) %a) gc "statepoint-example" { 9; CHECK-LABEL: @test( 10; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(ptr addrspace(1) [[A:%.*]]) ] 11; CHECK-NEXT: [[A_RELOCATED:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 12; CHECK-NEXT: ret ptr addrspace(1) [[A_RELOCATED]] 13; 14 call void @foo() 15 ret ptr addrspace(1) %a 16} 17 18define ptr addrspace(1) @test_select(i1 %c, ptr addrspace(1) %a1, ptr addrspace(1) %a2) gc "statepoint-example" { 19; CHECK-LABEL: @test_select( 20; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], ptr addrspace(1) [[A1:%.*]], ptr addrspace(1) [[A2:%.*]] 21; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(ptr addrspace(1) [[SEL]]) ] 22; CHECK-NEXT: [[SEL_RELOCATED:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 23; CHECK-NEXT: ret ptr addrspace(1) [[SEL_RELOCATED]] 24; 25 %sel = select i1 %c, ptr addrspace(1) %a1, ptr addrspace(1) %a2 26 call void @foo() 27 ret ptr addrspace(1) %sel 28} 29 30define ptr addrspace(1) @test_phi1(i1 %c, ptr addrspace(1) %a1, ptr addrspace(1) %a2) gc "statepoint-example" { 31; CHECK-LABEL: @test_phi1( 32; CHECK-NEXT: entry: 33; CHECK-NEXT: br i1 [[C:%.*]], label [[TAKEN:%.*]], label [[UNTAKEN:%.*]] 34; CHECK: taken: 35; CHECK-NEXT: br label [[MERGE:%.*]] 36; CHECK: untaken: 37; CHECK-NEXT: br label [[MERGE]] 38; CHECK: merge: 39; CHECK-NEXT: [[PHI:%.*]] = phi ptr addrspace(1) [ [[A1:%.*]], [[TAKEN]] ], [ [[A2:%.*]], [[UNTAKEN]] ] 40; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(ptr addrspace(1) [[PHI]]) ] 41; CHECK-NEXT: [[PHI_RELOCATED:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 42; CHECK-NEXT: ret ptr addrspace(1) [[PHI_RELOCATED]] 43; 44entry: 45 br i1 %c, label %taken, label %untaken 46taken: 47 br label %merge 48untaken: 49 br label %merge 50merge: 51 %phi = phi ptr addrspace(1) [%a1, %taken], [%a2, %untaken] 52 call void @foo() 53 ret ptr addrspace(1) %phi 54} 55 56define ptr addrspace(1) @test_phi_lcssa(i1 %c, ptr addrspace(1) %a1, ptr addrspace(1) %a2) gc "statepoint-example" { 57; CHECK-LABEL: @test_phi_lcssa( 58; CHECK-NEXT: entry: 59; CHECK-NEXT: br label [[MERGE:%.*]] 60; CHECK: merge: 61; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(ptr addrspace(1) [[A1:%.*]]) ] 62; CHECK-NEXT: [[A1_RELOCATED:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 63; CHECK-NEXT: ret ptr addrspace(1) [[A1_RELOCATED]] 64; 65entry: 66 br label %merge 67merge: 68 %phi = phi ptr addrspace(1) [%a1, %entry] 69 call void @foo() 70 ret ptr addrspace(1) %phi 71} 72 73 74define ptr addrspace(1) @test_loop1(i1 %c, ptr addrspace(1) %a1, ptr addrspace(1) %a2) gc "statepoint-example" { 75; CHECK-LABEL: @test_loop1( 76; CHECK-NEXT: entry: 77; CHECK-NEXT: br label [[LOOP:%.*]] 78; CHECK: loop: 79; CHECK-NEXT: [[PHI:%.*]] = phi ptr addrspace(1) [ [[A1:%.*]], [[ENTRY:%.*]] ], [ [[A2:%.*]], [[LOOP]] ] 80; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]] 81; CHECK: exit: 82; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(ptr addrspace(1) [[PHI]]) ] 83; CHECK-NEXT: [[PHI_RELOCATED:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 84; CHECK-NEXT: ret ptr addrspace(1) [[PHI_RELOCATED]] 85; 86entry: 87 br label %loop 88loop: 89 %phi = phi ptr addrspace(1) [%a1, %entry], [%a2, %loop] 90 br i1 %c, label %exit, label %loop 91exit: 92 %phi2 = phi ptr addrspace(1) [%phi, %loop] 93 call void @foo() 94 ret ptr addrspace(1) %phi2 95} 96 97define ptr addrspace(1) @test_loop2(i1 %c, ptr addrspace(1) %a1) gc "statepoint-example" { 98; CHECK-LABEL: @test_loop2( 99; CHECK-NEXT: entry: 100; CHECK-NEXT: br label [[LOOP:%.*]] 101; CHECK: loop: 102; CHECK-NEXT: [[PHI:%.*]] = phi ptr addrspace(1) [ [[A1:%.*]], [[ENTRY:%.*]] ], [ [[O2:%.*]], [[LOOP]] ] 103; CHECK-NEXT: [[O2]] = load ptr addrspace(1), ptr addrspace(1) [[PHI]], align 8 104; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]] 105; CHECK: exit: 106; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(ptr addrspace(1) [[PHI]]) ] 107; CHECK-NEXT: [[PHI_RELOCATED:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 108; CHECK-NEXT: ret ptr addrspace(1) [[PHI_RELOCATED]] 109; 110entry: 111 br label %loop 112loop: 113 %phi = phi ptr addrspace(1) [%a1, %entry], [%o2, %loop] 114 %o2 = load ptr addrspace(1), ptr addrspace(1) %phi 115 br i1 %c, label %exit, label %loop 116exit: 117 %phi2 = phi ptr addrspace(1) [%phi, %loop] 118 call void @foo() 119 ret ptr addrspace(1) %phi2 120} 121 122; %phi1 and phi2 are not base pointers, but they do have a single 123; base pointer which is %a1 124define ptr addrspace(1) @test_loop3(i1 %c, ptr addrspace(1) %a1) gc "statepoint-example" { 125; CHECK-LABEL: @test_loop3( 126; CHECK-NEXT: entry: 127; CHECK-NEXT: br label [[LOOP:%.*]] 128; CHECK: loop: 129; CHECK-NEXT: [[PHI:%.*]] = phi ptr addrspace(1) [ [[A1:%.*]], [[ENTRY:%.*]] ], [ [[GEP:%.*]], [[LOOP]] ] 130; CHECK-NEXT: [[GEP]] = getelementptr i8, ptr addrspace(1) [[PHI]], i64 16 131; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]] 132; CHECK: exit: 133; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(ptr addrspace(1) [[PHI]], ptr addrspace(1) [[A1]]) ] 134; CHECK-NEXT: [[PHI_RELOCATED:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[STATEPOINT_TOKEN]], i32 1, i32 0) 135; CHECK-NEXT: [[A1_RELOCATED:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[STATEPOINT_TOKEN]], i32 1, i32 1) 136; CHECK-NEXT: ret ptr addrspace(1) [[PHI_RELOCATED]] 137; 138entry: 139 br label %loop 140loop: 141 %phi = phi ptr addrspace(1) [%a1, %entry], [%gep, %loop] 142 %gep = getelementptr i8, ptr addrspace(1) %phi, i64 16 143 br i1 %c, label %exit, label %loop 144exit: 145 %phi2 = phi ptr addrspace(1) [%phi, %loop] 146 call void @foo() 147 ret ptr addrspace(1) %phi2 148} 149 150define <2 x ptr addrspace(1)> @test_vec_passthrough(<2 x ptr addrspace(1)> %a) gc "statepoint-example" { 151; CHECK-LABEL: @test_vec_passthrough( 152; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(<2 x ptr addrspace(1)> [[A:%.*]]) ] 153; CHECK-NEXT: [[A_RELOCATED:%.*]] = call coldcc <2 x ptr addrspace(1)> @llvm.experimental.gc.relocate.v2p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 154; CHECK-NEXT: ret <2 x ptr addrspace(1)> [[A_RELOCATED]] 155; 156 call void @foo() 157 ret <2 x ptr addrspace(1)> %a 158} 159 160 161define <2 x ptr addrspace(1)> @test_insert(ptr addrspace(1) %a) gc "statepoint-example" { 162; CHECK-LABEL: @test_insert( 163; CHECK-NEXT: [[VEC:%.*]] = insertelement <2 x ptr addrspace(1)> zeroinitializer, ptr addrspace(1) [[A:%.*]], i64 0 164; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(<2 x ptr addrspace(1)> [[VEC]]) ] 165; CHECK-NEXT: [[VEC_RELOCATED:%.*]] = call coldcc <2 x ptr addrspace(1)> @llvm.experimental.gc.relocate.v2p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 166; CHECK-NEXT: ret <2 x ptr addrspace(1)> [[VEC_RELOCATED]] 167; 168 %vec = insertelement <2 x ptr addrspace(1)> zeroinitializer, ptr addrspace(1) %a, i64 0 169 call void @foo() 170 ret <2 x ptr addrspace(1)> %vec 171} 172 173define ptr addrspace(1) @test_extract(<2 x ptr addrspace(1)> %a) gc "statepoint-example" { 174; CHECK-LABEL: @test_extract( 175; CHECK-NEXT: [[EE:%.*]] = extractelement <2 x ptr addrspace(1)> [[A:%.*]], i64 0 176; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(ptr addrspace(1) [[EE]]) ] 177; CHECK-NEXT: [[EE_RELOCATED:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 178; CHECK-NEXT: ret ptr addrspace(1) [[EE_RELOCATED]] 179; 180 %ee = extractelement <2 x ptr addrspace(1)> %a, i64 0 181 call void @foo() 182 ret ptr addrspace(1) %ee 183} 184 185define <2 x ptr addrspace(1)> @test_shuffle(<2 x ptr addrspace(1)> %a1) gc "statepoint-example" { 186; CHECK-LABEL: @test_shuffle( 187; CHECK-NEXT: [[RES:%.*]] = shufflevector <2 x ptr addrspace(1)> [[A1:%.*]], <2 x ptr addrspace(1)> [[A1]], <2 x i32> zeroinitializer 188; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(<2 x ptr addrspace(1)> [[RES]]) ] 189; CHECK-NEXT: [[RES_RELOCATED:%.*]] = call coldcc <2 x ptr addrspace(1)> @llvm.experimental.gc.relocate.v2p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 190; CHECK-NEXT: ret <2 x ptr addrspace(1)> [[RES_RELOCATED]] 191; 192 %res = shufflevector <2 x ptr addrspace(1)> %a1, <2 x ptr addrspace(1)> %a1, <2 x i32> zeroinitializer 193 call void @foo() 194 ret <2 x ptr addrspace(1)> %res 195} 196 197define <2 x ptr addrspace(1)> @test_shuffle2(<2 x ptr addrspace(1)> %a1, <2 x ptr addrspace(1)> %a2) gc "statepoint-example" { 198; CHECK-LABEL: @test_shuffle2( 199; CHECK-NEXT: [[RES:%.*]] = shufflevector <2 x ptr addrspace(1)> [[A1:%.*]], <2 x ptr addrspace(1)> [[A2:%.*]], <2 x i32> zeroinitializer 200; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(<2 x ptr addrspace(1)> [[RES]]) ] 201; CHECK-NEXT: [[RES_RELOCATED:%.*]] = call coldcc <2 x ptr addrspace(1)> @llvm.experimental.gc.relocate.v2p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 202; CHECK-NEXT: ret <2 x ptr addrspace(1)> [[RES_RELOCATED]] 203; 204 %res = shufflevector <2 x ptr addrspace(1)> %a1, <2 x ptr addrspace(1)> %a2, <2 x i32> zeroinitializer 205 call void @foo() 206 ret <2 x ptr addrspace(1)> %res 207} 208 209define <4 x ptr addrspace(1)> @test_shuffle_concat(<2 x ptr addrspace(1)> %a1, <2 x ptr addrspace(1)> %a2) gc "statepoint-example" { 210; CHECK-LABEL: @test_shuffle_concat( 211; CHECK-NEXT: [[RES:%.*]] = shufflevector <2 x ptr addrspace(1)> [[A1:%.*]], <2 x ptr addrspace(1)> [[A2:%.*]], <4 x i32> <i32 0, i32 1, i32 2, i32 3> 212; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(<4 x ptr addrspace(1)> [[RES]]) ] 213; CHECK-NEXT: [[RES_RELOCATED:%.*]] = call coldcc <4 x ptr addrspace(1)> @llvm.experimental.gc.relocate.v4p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 214; CHECK-NEXT: ret <4 x ptr addrspace(1)> [[RES_RELOCATED]] 215; 216 %res = shufflevector <2 x ptr addrspace(1)> %a1, <2 x ptr addrspace(1)> %a2, <4 x i32> <i32 0, i32 1, i32 2, i32 3> 217 call void @foo() 218 ret <4 x ptr addrspace(1)> %res 219} 220 221; TODO: Special case worth handling - we interpret the shuffle as if we need 222; to select the base pointers from either input when the mask is known. 223define <2 x ptr addrspace(1)> @test_shuffle_broadcast(ptr addrspace(1) %a) gc "statepoint-example" { 224; CHECK-LABEL: @test_shuffle_broadcast( 225; CHECK-NEXT: entry: 226; CHECK-NEXT: [[IE:%.*]] = insertelement <2 x ptr addrspace(1)> zeroinitializer, ptr addrspace(1) [[A:%.*]], i64 0 227; CHECK-NEXT: [[BROADCAST:%.*]] = shufflevector <2 x ptr addrspace(1)> [[IE]], <2 x ptr addrspace(1)> undef, <2 x i32> zeroinitializer 228; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(<2 x ptr addrspace(1)> [[BROADCAST]]) ] 229; CHECK-NEXT: [[BROADCAST_RELOCATED:%.*]] = call coldcc <2 x ptr addrspace(1)> @llvm.experimental.gc.relocate.v2p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 230; CHECK-NEXT: ret <2 x ptr addrspace(1)> [[BROADCAST_RELOCATED]] 231; 232entry: 233 %ie = insertelement <2 x ptr addrspace(1)> zeroinitializer, ptr addrspace(1) %a, i64 0 234 %broadcast = shufflevector <2 x ptr addrspace(1)> %ie, <2 x ptr addrspace(1)> undef, <2 x i32> zeroinitializer 235 call void @foo() 236 ret <2 x ptr addrspace(1)> %broadcast 237} 238 239; Show a case where only a portion of the sub-graph propagates base pointers. 240define i8 @test_subgraph(i1 %c, ptr addrspace(1) %a1, ptr addrspace(1) %a2) gc "statepoint-example" { 241; CHECK-LABEL: @test_subgraph( 242; CHECK-NEXT: entry: 243; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], ptr addrspace(1) [[A1:%.*]], ptr addrspace(1) [[A2:%.*]] 244; CHECK-NEXT: br i1 [[C]], label [[TAKEN:%.*]], label [[MERGE:%.*]] 245; CHECK: taken: 246; CHECK-NEXT: [[GEP:%.*]] = getelementptr i8, ptr addrspace(1) [[SEL]], i64 8 247; CHECK-NEXT: br label [[MERGE]] 248; CHECK: merge: 249; CHECK-NEXT: [[PHI:%.*]] = phi ptr addrspace(1) [ [[GEP]], [[TAKEN]] ], [ [[SEL]], [[ENTRY:%.*]] ] 250; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(ptr addrspace(1) [[PHI]], ptr addrspace(1) [[SEL]]) ] 251; CHECK-NEXT: [[PHI_RELOCATED:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[STATEPOINT_TOKEN]], i32 1, i32 0) 252; CHECK-NEXT: [[SEL_RELOCATED:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[STATEPOINT_TOKEN]], i32 1, i32 1) 253; CHECK-NEXT: [[RES:%.*]] = load i8, ptr addrspace(1) [[PHI_RELOCATED]], align 1 254; CHECK-NEXT: ret i8 [[RES]] 255; 256entry: 257 %sel = select i1 %c, ptr addrspace(1) %a1, ptr addrspace(1) %a2 258 br i1 %c, label %taken, label %merge 259taken: 260 %gep = getelementptr i8, ptr addrspace(1) %sel, i64 8 261 br label %merge 262merge: 263 %phi = phi ptr addrspace(1) [%gep, %taken], [%sel, %entry] 264 call void @foo() 265 %res = load i8, ptr addrspace(1) %phi 266 ret i8 %res 267} 268 269; An example of a non-trivial subgraph computing base pointers. 270define i8 @test_subgraph2(i1 %c, ptr addrspace(1) %a1, ptr addrspace(1) %a2) gc "statepoint-example" { 271; CHECK-LABEL: @test_subgraph2( 272; CHECK-NEXT: entry: 273; CHECK-NEXT: [[SEL:%.*]] = select i1 [[C:%.*]], ptr addrspace(1) [[A1:%.*]], ptr addrspace(1) [[A2:%.*]] 274; CHECK-NEXT: [[IE:%.*]] = insertelement <2 x ptr addrspace(1)> zeroinitializer, ptr addrspace(1) [[SEL]], i64 0 275; CHECK-NEXT: [[BROADCAST:%.*]] = shufflevector <2 x ptr addrspace(1)> [[IE]], <2 x ptr addrspace(1)> [[IE]], <2 x i32> zeroinitializer 276; CHECK-NEXT: [[EE:%.*]] = extractelement <2 x ptr addrspace(1)> [[BROADCAST]], i32 1 277; CHECK-NEXT: [[STATEPOINT_TOKEN:%.*]] = call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 2882400000, i32 0, ptr elementtype(void ()) @foo, i32 0, i32 0, i32 0, i32 0) [ "gc-live"(ptr addrspace(1) [[EE]]) ] 278; CHECK-NEXT: [[EE_RELOCATED:%.*]] = call coldcc ptr addrspace(1) @llvm.experimental.gc.relocate.p1(token [[STATEPOINT_TOKEN]], i32 0, i32 0) 279; CHECK-NEXT: [[RES:%.*]] = load i8, ptr addrspace(1) [[EE_RELOCATED]], align 1 280; CHECK-NEXT: ret i8 [[RES]] 281; 282entry: 283 %sel = select i1 %c, ptr addrspace(1) %a1, ptr addrspace(1) %a2 284 %ie = insertelement <2 x ptr addrspace(1)> zeroinitializer, ptr addrspace(1) %sel, i64 0 285 %broadcast = shufflevector <2 x ptr addrspace(1)> %ie, <2 x ptr addrspace(1)> %ie, <2 x i32> zeroinitializer 286 %ee = extractelement <2 x ptr addrspace(1)> %broadcast, i32 1 287 call void @foo() 288 %res = load i8, ptr addrspace(1) %ee 289 ret i8 %res 290} 291 292 293declare void @foo() 294