[llvm] [AArch64][PowerPC][RISCV] Ignore debug instructions when trimming stackmap shadows (PR #219756)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Aug 29 21:26:42 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-powerpc
Author: Yongqiang Tian (yqtian-se)
<details>
<summary>Changes</summary>
Debug instructions do not emit code and therefore must not consume stackmap
shadow bytes.
The AArch64, PowerPC, and RISC-V `LowerSTACKMAP` implementations scan
subsequent fixed-width instructions to determine how many NOP bytes are still
required. Previously, `DBG_VALUE` stopped this scan, while other debug
instructions such as `DBG_LABEL` were incorrectly counted as encoded
instructions. This could either inhibit shadow optimization or underfill the
requested shadow.
Skip all debug instructions without decrementing the remaining shadow size.
Add `DBG_LABEL` and `DBG_VALUE` regression coverage for all three targets.
Fixes #<!-- -->219750.
Testing:
- The modified IR tests pass `llvm-as` and `opt -passes=verify`.
- The AArch64, PowerPC, RISC-V, and RISC-V compressed-instruction RUN lines pass.
- The tests pass with `-verify-machineinstrs`.
- The new regression checks fail with an unmodified build from the same base revision.
- The issue reproducer reports identical requested shadow sizes for all three debug modes after the fix.
AI disclosure: This patch was developed with OpenAI Codex 5.6 Sol and
co-reviewed by Claude and Yongqiang Tian.
---
Full diff: https://github.com/llvm/llvm-project/pull/219756.diff
6 Files Affected:
- (modified) llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp (+4-1)
- (modified) llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp (+4-1)
- (modified) llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp (+4-1)
- (modified) llvm/test/CodeGen/AArch64/arm64-stackmap-nops.ll (+38)
- (modified) llvm/test/CodeGen/PowerPC/ppc64-stackmap-nops.ll (+41)
- (modified) llvm/test/CodeGen/RISCV/rv64-stackmap-nops.ll (+80)
``````````diff
diff --git a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
index 321d1cf1bd435..8145e28cfbd57 100644
--- a/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
+++ b/llvm/lib/Target/AArch64/AArch64AsmPrinter.cpp
@@ -1785,8 +1785,11 @@ void AArch64AsmPrinter::LowerSTACKMAP(MCStreamer &OutStreamer, StackMaps &SM,
MachineBasicBlock::const_iterator MII(MI);
++MII;
while (NumNOPBytes > 0) {
+ if (MII != MBB.end() && MII->isDebugInstr()) {
+ ++MII;
+ continue;
+ }
if (MII == MBB.end() || MII->isCall() ||
- MII->getOpcode() == AArch64::DBG_VALUE ||
MII->getOpcode() == TargetOpcode::PATCHPOINT ||
MII->getOpcode() == TargetOpcode::STACKMAP)
break;
diff --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
index a837e21933c56..e93ff95290fa7 100644
--- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
+++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp
@@ -554,8 +554,11 @@ void PPCAsmPrinter::LowerSTACKMAP(StackMaps &SM, const MachineInstr &MI) {
MachineBasicBlock::const_iterator MII(MI);
++MII;
while (NumNOPBytes > 0) {
+ if (MII != MBB.end() && MII->isDebugInstr()) {
+ ++MII;
+ continue;
+ }
if (MII == MBB.end() || MII->isCall() ||
- MII->getOpcode() == PPC::DBG_VALUE ||
MII->getOpcode() == TargetOpcode::PATCHPOINT ||
MII->getOpcode() == TargetOpcode::STACKMAP)
break;
diff --git a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp
index 6771e9d7e7fa1..3b639b7a802ce 100644
--- a/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp
+++ b/llvm/lib/Target/RISCV/RISCVAsmPrinter.cpp
@@ -160,8 +160,11 @@ void RISCVAsmPrinter::LowerSTACKMAP(MCStreamer &OutStreamer, StackMaps &SM,
MachineBasicBlock::const_iterator MII(MI);
++MII;
while (NumNOPBytes > 0) {
+ if (MII != MBB.end() && MII->isDebugInstr()) {
+ ++MII;
+ continue;
+ }
if (MII == MBB.end() || MII->isCall() ||
- MII->getOpcode() == RISCV::DBG_VALUE ||
MII->getOpcode() == TargetOpcode::PATCHPOINT ||
MII->getOpcode() == TargetOpcode::STACKMAP)
break;
diff --git a/llvm/test/CodeGen/AArch64/arm64-stackmap-nops.ll b/llvm/test/CodeGen/AArch64/arm64-stackmap-nops.ll
index 2647ac4429690..5205c17eb2990 100644
--- a/llvm/test/CodeGen/AArch64/arm64-stackmap-nops.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-stackmap-nops.ll
@@ -13,3 +13,41 @@ entry:
}
declare void @llvm.experimental.stackmap(i64, i32, ...)
+
+define void @test_shadow_optimization_dbg_label() !dbg !4 {
+entry:
+; CHECK-LABEL: test_shadow_optimization_dbg_label:
+; CHECK: nop
+; CHECK-NEXT: nop
+; CHECK-NOT: nop
+ tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 0, i32 16)
+ #dbg_label(!6, !7)
+ ret void
+}
+
+define void @test_shadow_optimization_dbg_value() !dbg !8 {
+entry:
+; CHECK-LABEL: test_shadow_optimization_dbg_value:
+; CHECK: nop
+; CHECK-NEXT: nop
+; CHECK-NOT: nop
+ tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 0, i32 16)
+ #dbg_value(i32 0, !9, !DIExpression(), !10)
+ ret void
+}
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
+!1 = !DIFile(filename: "stackmap-shadow.c", directory: "/")
+!2 = !{}
+!3 = !{i32 2, !"Debug Info Version", i32 3}
+!4 = distinct !DISubprogram(name: "test_shadow_optimization_dbg_label", scope: !1, file: !1, line: 1, type: !5, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0)
+!5 = !DISubroutineType(types: !2)
+!6 = !DILabel(scope: !4, name: "after_stackmap", file: !1, line: 2)
+!7 = !DILocation(line: 2, column: 1, scope: !4)
+!8 = distinct !DISubprogram(name: "test_shadow_optimization_dbg_value", scope: !1, file: !1, line: 4, type: !5, scopeLine: 4, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0)
+!9 = !DILocalVariable(name: "value", scope: !8, file: !1, line: 5, type: !11)
+!10 = !DILocation(line: 5, column: 1, scope: !8)
+!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
diff --git a/llvm/test/CodeGen/PowerPC/ppc64-stackmap-nops.ll b/llvm/test/CodeGen/PowerPC/ppc64-stackmap-nops.ll
index 05a40ada1d7bd..474b1ea509cb6 100644
--- a/llvm/test/CodeGen/PowerPC/ppc64-stackmap-nops.ll
+++ b/llvm/test/CodeGen/PowerPC/ppc64-stackmap-nops.ll
@@ -22,3 +22,44 @@ entry:
declare void @llvm.experimental.stackmap(i64, i32, ...)
+define void @test_shadow_optimization_dbg_label() !dbg !4 {
+entry:
+; CHECK-LABEL: test_shadow_optimization_dbg_label:
+; CHECK: nop
+; CHECK-NEXT: nop
+; CHECK-NEXT: nop
+; CHECK-NOT: nop
+; CHECK: blr
+ tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 0, i32 32)
+ #dbg_label(!6, !7)
+ ret void
+}
+
+define void @test_shadow_optimization_dbg_value() !dbg !8 {
+entry:
+; CHECK-LABEL: test_shadow_optimization_dbg_value:
+; CHECK: nop
+; CHECK-NEXT: nop
+; CHECK-NEXT: nop
+; CHECK-NOT: nop
+; CHECK: blr
+ tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 0, i32 32)
+ #dbg_value(i32 0, !9, !DIExpression(), !10)
+ ret void
+}
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
+!1 = !DIFile(filename: "stackmap-shadow.c", directory: "/")
+!2 = !{}
+!3 = !{i32 2, !"Debug Info Version", i32 3}
+!4 = distinct !DISubprogram(name: "test_shadow_optimization_dbg_label", scope: !1, file: !1, line: 1, type: !5, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0)
+!5 = !DISubroutineType(types: !2)
+!6 = !DILabel(scope: !4, name: "after_stackmap", file: !1, line: 2)
+!7 = !DILocation(line: 2, column: 1, scope: !4)
+!8 = distinct !DISubprogram(name: "test_shadow_optimization_dbg_value", scope: !1, file: !1, line: 4, type: !5, scopeLine: 4, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0)
+!9 = !DILocalVariable(name: "value", scope: !8, file: !1, line: 5, type: !11)
+!10 = !DILocation(line: 5, column: 1, scope: !8)
+!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
diff --git a/llvm/test/CodeGen/RISCV/rv64-stackmap-nops.ll b/llvm/test/CodeGen/RISCV/rv64-stackmap-nops.ll
index 96d7f3349695d..e498690f462e7 100644
--- a/llvm/test/CodeGen/RISCV/rv64-stackmap-nops.ll
+++ b/llvm/test/CodeGen/RISCV/rv64-stackmap-nops.ll
@@ -26,3 +26,83 @@ entry:
tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 0, i32 16)
ret void
}
+
+define void @test_shadow_optimization_dbg_label() !dbg !4 {
+; CHECK-LABEL: test_shadow_optimization_dbg_label:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: .file 1 "/" "stackmap-shadow.c"
+; CHECK-NEXT: .loc 1 1 0 prologue_end # stackmap-shadow.c:1:0
+; CHECK-NEXT: .Ltmp1:
+; CHECK-NEXT: nop
+; CHECK-NEXT: nop
+; CHECK-NEXT: nop
+; CHECK-NEXT: #DEBUG_LABEL: test_shadow_optimization_dbg_label:after_stackmap
+; CHECK-NEXT: ret
+;
+; RVC-LABEL: test_shadow_optimization_dbg_label:
+; RVC: # %bb.0: # %entry
+; RVC-NEXT: .file 1 "/" "stackmap-shadow.c"
+; RVC-NEXT: .loc 1 1 0 prologue_end # stackmap-shadow.c:1:0
+; RVC-NEXT: .Ltmp1:
+; RVC-NEXT: nop
+; RVC-NEXT: nop
+; RVC-NEXT: nop
+; RVC-NEXT: nop
+; RVC-NEXT: nop
+; RVC-NEXT: nop
+; RVC-NEXT: nop
+; RVC-NEXT: #DEBUG_LABEL: test_shadow_optimization_dbg_label:after_stackmap
+; RVC-NEXT: ret
+entry:
+ tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 0, i32 16)
+ #dbg_label(!6, !7)
+ ret void
+}
+
+define void @test_shadow_optimization_dbg_value() !dbg !8 {
+; CHECK-LABEL: test_shadow_optimization_dbg_value:
+; CHECK: # %bb.0: # %entry
+; CHECK-NEXT: .loc 1 4 0 prologue_end # stackmap-shadow.c:4:0
+; CHECK-NEXT: .Ltmp2:
+; CHECK-NEXT: nop
+; CHECK-NEXT: nop
+; CHECK-NEXT: nop
+; CHECK-NEXT: #DEBUG_VALUE: test_shadow_optimization_dbg_value:value <- 0
+; CHECK-NEXT: ret
+;
+; RVC-LABEL: test_shadow_optimization_dbg_value:
+; RVC: # %bb.0: # %entry
+; RVC-NEXT: .loc 1 4 0 prologue_end # stackmap-shadow.c:4:0
+; RVC-NEXT: .Ltmp2:
+; RVC-NEXT: nop
+; RVC-NEXT: nop
+; RVC-NEXT: nop
+; RVC-NEXT: nop
+; RVC-NEXT: nop
+; RVC-NEXT: nop
+; RVC-NEXT: nop
+; RVC-NEXT: #DEBUG_VALUE: test_shadow_optimization_dbg_value:value <- 0
+; RVC-NEXT: ret
+entry:
+ tail call void (i64, i32, ...) @llvm.experimental.stackmap(i64 0, i32 16)
+ #dbg_value(i32 0, !9, !DIExpression(), !10)
+ ret void
+}
+
+declare void @llvm.experimental.stackmap(i64, i32, ...)
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug)
+!1 = !DIFile(filename: "stackmap-shadow.c", directory: "/")
+!2 = !{}
+!3 = !{i32 2, !"Debug Info Version", i32 3}
+!4 = distinct !DISubprogram(name: "test_shadow_optimization_dbg_label", scope: !1, file: !1, line: 1, type: !5, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0)
+!5 = !DISubroutineType(types: !2)
+!6 = !DILabel(scope: !4, name: "after_stackmap", file: !1, line: 2)
+!7 = !DILocation(line: 2, column: 1, scope: !4)
+!8 = distinct !DISubprogram(name: "test_shadow_optimization_dbg_value", scope: !1, file: !1, line: 4, type: !5, scopeLine: 4, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0)
+!9 = !DILocalVariable(name: "value", scope: !8, file: !1, line: 5, type: !11)
+!10 = !DILocation(line: 5, column: 1, scope: !8)
+!11 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
``````````
</details>
https://github.com/llvm/llvm-project/pull/219756
More information about the llvm-commits
mailing list