[llvm] [ARM] Handle debug instructions in LowOverheadLoop (PR #221699)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 7 03:46:57 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-arm
Author: David Green (davemgreen)
<details>
<summary>Changes</summary>
The last instruction in the block might be a debug instruction, in which case we should get the last non-debug instruction.
Fixes #<!-- -->221633.
---
Full diff: https://github.com/llvm/llvm-project/pull/221699.diff
2 Files Affected:
- (modified) llvm/lib/Target/ARM/ARMLowOverheadLoops.cpp (+3-2)
- (added) llvm/test/CodeGen/Thumb2/LowOverheadLoops/dbg-verify.ll (+81)
``````````diff
diff --git a/llvm/lib/Target/ARM/ARMLowOverheadLoops.cpp b/llvm/lib/Target/ARM/ARMLowOverheadLoops.cpp
index 1719165fb6717..f89f209d6ecf8 100644
--- a/llvm/lib/Target/ARM/ARMLowOverheadLoops.cpp
+++ b/llvm/lib/Target/ARM/ARMLowOverheadLoops.cpp
@@ -685,10 +685,11 @@ bool LowOverheadLoop::ValidateTailPredicate() {
// before entering the loop.
auto CannotProvideElements = [this](MachineBasicBlock *MBB,
MCRegister NumElements) {
- if (MBB->empty())
+ auto Back = MBB->getLastNonDebugInstr();
+ if (Back == MBB->end())
return false;
// NumElements is redefined in this block.
- if (RDI.hasLocalDefBefore(&MBB->back(), NumElements))
+ if (RDI.hasLocalDefBefore(&*Back, NumElements))
return true;
// Don't continue searching up through multiple predecessors.
diff --git a/llvm/test/CodeGen/Thumb2/LowOverheadLoops/dbg-verify.ll b/llvm/test/CodeGen/Thumb2/LowOverheadLoops/dbg-verify.ll
new file mode 100644
index 0000000000000..a13c65e28be67
--- /dev/null
+++ b/llvm/test/CodeGen/Thumb2/LowOverheadLoops/dbg-verify.ll
@@ -0,0 +1,81 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve %s -o - | FileCheck %s
+
+ at ccmdv2_carrier_address = constant ptr blockaddress(@ccmdv2_source_carrier, %carrier)
+
+define arm_aapcs_vfpcc <4 x float> @ccmdv2_source_carrier(ptr %pSrc, i32 %blockSize) !dbg !7 {
+; CHECK-LABEL: ccmdv2_source_carrier:
+; CHECK: @ %bb.0: @ %entry
+; CHECK-NEXT: .save {r7, lr}
+; CHECK-NEXT: push {r7, lr}
+; CHECK-NEXT: .cfi_def_cfa_offset 8
+; CHECK-NEXT: .cfi_offset lr, -4
+; CHECK-NEXT: .cfi_offset r7, -8
+; CHECK-NEXT: .loc 1 1 0 prologue_end
+; CHECK-NEXT: cbz r1, .LBB0_5
+; CHECK-NEXT: @ %bb.1: @ %start.block
+; CHECK-NEXT: dlstp.32 lr, r1
+; CHECK-NEXT: .Ltmp0: @ Block address taken
+; CHECK-NEXT: @ %bb.2: @ %carrier
+; CHECK-NEXT: @APP
+; CHECK-NEXT: @NO_APP
+; CHECK-NEXT: @DEBUG_VALUE: ccmdv2_source_carrier:count <- $r1
+; CHECK-NEXT: .LBB0_3: @ %do.body
+; CHECK-NEXT: @ =>This Inner Loop Header: Depth=1
+; CHECK-NEXT: vldrw.u32 q0, [r0], #16
+; CHECK-NEXT: letp lr, .LBB0_3
+; CHECK-NEXT: @ %bb.4: @ %common.ret
+; CHECK-NEXT: pop {r7, pc}
+; CHECK-NEXT: .LBB0_5:
+; CHECK-NEXT: vmov.i32 q0, #0x0
+; CHECK-NEXT: pop {r7, pc}
+entry:
+ %is.zero = icmp eq i32 %blockSize, 0
+ %rnd.up = add i32 %blockSize, 3
+ %iterations = lshr i32 %rnd.up, 2
+ br i1 %is.zero, label %cleanup, label %start.block
+
+start.block:
+ %loop.start = call i32 @llvm.start.loop.iterations.i32(i32 %iterations)
+ br label %carrier
+
+carrier:
+ %ccmdv2_count = call i32 asm sideeffect "", "={r1},0"(i32 %blockSize)
+ call void @llvm.dbg.value(metadata i32 %ccmdv2_count, metadata !6, metadata !DIExpression()), !dbg !9
+ br label %do.body
+
+do.body:
+ %hw.counter = phi i32 [ %loop.start, %carrier ], [ %hw.next, %do.body ]
+ %blockSize.addr.0 = phi i32 [ %ccmdv2_count, %carrier ], [ %sub, %do.body ]
+ %pSrc.addr.0 = phi ptr [ %pSrc, %carrier ], [ %add.ptr, %do.body ]
+ %pred = tail call <4 x i1> @llvm.arm.mve.vctp32(i32 %blockSize.addr.0)
+ %value = tail call <4 x float> @llvm.masked.load.v4f32.p0(ptr %pSrc.addr.0, i32 4, <4 x i1> %pred, <4 x float> zeroinitializer)
+ %add.ptr = getelementptr inbounds float, ptr %pSrc.addr.0, i32 4
+ %sub = add i32 %blockSize.addr.0, -4
+ %hw.next = call i32 @llvm.loop.decrement.reg.i32.i32.i32(i32 %hw.counter, i32 1)
+ %continue = icmp ne i32 %hw.next, 0
+ br i1 %continue, label %do.body, label %do.end
+
+do.end:
+ ret <4 x float> %value
+
+cleanup:
+ ret <4 x float> zeroinitializer
+}
+
+!llvm.dbg.cu = !{!0}
+!llvm.module.flags = !{!3, !4}
+!llvm.ident = !{!5}
+
+!0 = distinct !DICompileUnit(language: DW_LANG_C11, file: !1, producer: "ccmdv2", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
+!1 = !DIFile(filename: "llvm-arm-loloop-query-window-source-v1.c", directory: "/")
+!2 = !{}
+!3 = !{i32 2, !"Dwarf Version", i32 4}
+!4 = !{i32 2, !"Debug Info Version", i32 3}
+!5 = !{!"ccmdv2"}
+!6 = !DILocalVariable(name: "count", scope: !7, file: !1, line: 2, type: !8)
+!7 = distinct !DISubprogram(name: "ccmdv2_source_carrier", scope: !1, file: !1, line: 1, type: !10, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !2)
+!8 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
+!9 = !DILocation(line: 2, column: 3, scope: !7)
+!10 = !DISubroutineType(types: !2)
+
``````````
</details>
https://github.com/llvm/llvm-project/pull/221699
More information about the llvm-commits
mailing list