@@ -342,6 +342,32 @@ entry:
342
342
ret i8 addrspace (1 )* %res
343
343
}
344
344
345
+ ; Show that ISEL of gc.relocate used in other BB does generate extra COPY instruction.
346
+ define i1 @test_cross_bb_reloc (i32 addrspace (1 )* %a , i1 %external_cond ) gc "statepoint-example" {
347
+ ; CHECK-VREG_LABEL: test_cross_bb_reloc:
348
+ ; CHECK-VREG: bb.0.entry:
349
+ ; CHECK-VREG: [[VREG:%[^ ]+]]:gr64 = STATEPOINT 0, 0, 0, @return_i1, 2, 0, 2, 0, 2, 0, 2, 1, %2(tied-def 0), 2, 0, 2, 1, 0, 0, csr_64, implicit-def $rsp, implicit-def $ssp, implicit-def $al
350
+ ; CHECK-VREG: [[EXTRA:%[^ ]+]]:gr64 = COPY [[VREG]]
351
+ ; CHECK-VREG: bb.1.left:
352
+ ; CHECK-VREG: $rdi = COPY [[EXTRA]]
353
+ ; CHECK-VREG: CALL64pcrel32 @consume, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit-def $rsp, implicit-def $ssp
354
+ ; CHECK-VREG: $al = COPY %1
355
+ ; CHECK-VREG: RET 0, $al
356
+
357
+ entry:
358
+ %safepoint_token = tail call token (i64 , i32 , i1 ()*, i32 , i32 , ...) @llvm.experimental.gc.statepoint.p0f_i1f (i64 0 , i32 0 , i1 ()* elementtype(i1 ()) @return_i1 , i32 0 , i32 0 , i32 0 , i32 0 ) ["gc-live" (i32 addrspace (1 )* %a )]
359
+ %call1 = call i32 addrspace (1 )* @llvm.experimental.gc.relocate.p1i32 (token %safepoint_token , i32 0 , i32 0 )
360
+ %call2 = call zeroext i1 @llvm.experimental.gc.result.i1 (token %safepoint_token )
361
+ br i1 %external_cond , label %left , label %right
362
+
363
+ left:
364
+ call void @consume (i32 addrspace (1 )* %call1 )
365
+ ret i1 %call2
366
+
367
+ right:
368
+ ret i1 true
369
+ }
370
+
345
371
declare token @llvm.experimental.gc.statepoint.p0f_i1f (i64 , i32 , i1 ()*, i32 , i32 , ...)
346
372
declare token @llvm.experimental.gc.statepoint.p0f_isVoidf (i64 , i32 , void ()*, i32 , i32 , ...)
347
373
declare dso_local i32 addrspace (1 )* @llvm.experimental.gc.relocate.p1i32 (token, i32 , i32 )
0 commit comments