[llvm] [SelectionDAG][Statepoint] Fix truncation of `gc.statepoint` ID argument (PR #85908)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Mar 20 02:08:07 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-selectiondag
Author: None (Il-Capitano)
<details>
<summary>Changes</summary>
The ID argument of `gc.statepoint` gets incorrectly truncated to 32 bits during code generation.
This is fixed by using `uint64_t` instead of `unsigned` for the `ID` member in `SelectionDAGBuilder::StatepointLoweringInfo`, and a `patchpoint` test case is extended to check for 64 bit ID generation in stackmaps.
---
Full diff: https://github.com/llvm/llvm-project/pull/85908.diff
2 Files Affected:
- (modified) llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h (+1-1)
- (modified) llvm/test/CodeGen/AArch64/stackmap.ll (+16-2)
``````````diff
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
index dcf46e0563ff9d..211e1653de560a 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.h
@@ -449,7 +449,7 @@ class SelectionDAGBuilder {
ArrayRef<const Use> GCTransitionArgs;
/// The ID that the resulting STATEPOINT instruction has to report.
- unsigned ID = -1;
+ uint64_t ID = -1;
/// Information regarding the underlying call instruction.
TargetLowering::CallLoweringInfo CLI;
diff --git a/llvm/test/CodeGen/AArch64/stackmap.ll b/llvm/test/CodeGen/AArch64/stackmap.ll
index ce7dcc4a59e9a7..dfef9ccbe304f0 100644
--- a/llvm/test/CodeGen/AArch64/stackmap.ll
+++ b/llvm/test/CodeGen/AArch64/stackmap.ll
@@ -13,7 +13,7 @@
; Num LargeConstants
; CHECK-NEXT: .word 4
; Num Callsites
-; CHECK-NEXT: .word 18
+; CHECK-NEXT: .word 22
; Functions and stack size
; CHECK-NEXT: .xword constantargs
@@ -434,14 +434,27 @@ entry:
; CHECK-LABEL: .word .L{{.*}}-longid
; CHECK: .xword -1
; CHECK-LABEL: .word .L{{.*}}-longid
-define void @longid() {
+; CHECK: .xword 4294967295
+; CHECK-LABEL: .word .L{{.*}}-longid
+; CHECK: .xword 4294967296
+; CHECK-LABEL: .word .L{{.*}}-longid
+; CHECK: .xword 9223372036854775807
+; CHECK-LABEL: .word .L{{.*}}-longid
+; CHECK: .xword -1
+; CHECK-LABEL: .word .L{{.*}}-longid
+define void @longid() gc "statepoint-example" {
entry:
tail call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 4294967295, i32 0, ptr null, i32 0)
tail call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 4294967296, i32 0, ptr null, i32 0)
tail call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 9223372036854775807, i32 0, ptr null, i32 0)
tail call void (i64, i32, ptr, i32, ...) @llvm.experimental.patchpoint.void(i64 -1, i32 0, ptr null, i32 0)
+ %safepoint_token1 = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 4294967295, i32 0, ptr elementtype(void ()) @return_void, i32 0, i32 0, i32 0, i32 0)
+ %safepoint_token2 = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 4294967296, i32 0, ptr elementtype(void ()) @return_void, i32 0, i32 0, i32 0, i32 0)
+ %safepoint_token3 = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 9223372036854775807, i32 0, ptr elementtype(void ()) @return_void, i32 0, i32 0, i32 0, i32 0)
+ %safepoint_token4 = tail call token (i64, i32, ptr, i32, i32, ...) @llvm.experimental.gc.statepoint.p0(i64 -1, i32 0, ptr elementtype(void ()) @return_void, i32 0, i32 0, i32 0, i32 0)
ret void
}
+declare void @return_void()
; Map a value when R11 is the only free register.
; The scratch register should not be used for a live stackmap value.
@@ -537,3 +550,4 @@ define void @floats(float %f, double %g) {
declare void @llvm.experimental.stackmap(i64, i32, ...)
declare void @llvm.experimental.patchpoint.void(i64, i32, ptr, i32, ...)
declare i64 @llvm.experimental.patchpoint.i64(i64, i32, ptr, i32, ...)
+declare token @llvm.experimental.gc.statepoint.p0(i64, i32, ptr, i32, i32, ...)
``````````
</details>
https://github.com/llvm/llvm-project/pull/85908
More information about the llvm-commits
mailing list