[llvm] bd6c16c - [MachineOutliner] Avoid ranges that cross bundle boundary (#148977)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 16 09:51:27 PDT 2025
Author: Ellis Hoag
Date: 2025-07-16T09:51:25-07:00
New Revision: bd6c16c6cfe28105d992fa997dce6e18ea86a5a4
URL: https://github.com/llvm/llvm-project/commit/bd6c16c6cfe28105d992fa997dce6e18ea86a5a4
DIFF: https://github.com/llvm/llvm-project/commit/bd6c16c6cfe28105d992fa997dce6e18ea86a5a4.diff
LOG: [MachineOutliner] Avoid ranges that cross bundle boundary (#148977)
We found some code that was hitting this assert because
`getOutlinableRanges()` was trying to create a range that crossed a
bundle boundary.
https://github.com/llvm/llvm-project/blob/ae3bba4d15a10646ea91c6c0795633b82939857b/llvm/include/llvm/CodeGen/MachineInstrBundleIterator.h#L133-L135
Avoid creating those ranges and add a test that hit the assert.
Added:
Modified:
llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
llvm/test/CodeGen/AArch64/machine-outliner-safe-range-in-middle.mir
Removed:
################################################################################
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
index cdb224d0cd09f..996b0edd24200 100644
--- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
+++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp
@@ -9585,10 +9585,15 @@ AArch64InstrInfo::getOutlinableRanges(MachineBasicBlock &MBB,
};
auto SaveRangeIfNonEmpty = [&RangeLen, &Ranges, &RangeBegin, &RangeEnd]() {
// At least one unsafe register is not dead. We do not want to outline at
- // this point. If it is long enough to outline from, save the range
- // [RangeBegin, RangeEnd).
- if (RangeLen > 1)
- Ranges.push_back(std::make_pair(RangeBegin, RangeEnd));
+ // this point. If it is long enough to outline from and does not cross a
+ // bundle boundary, save the range [RangeBegin, RangeEnd).
+ if (RangeLen <= 1)
+ return;
+ if (!RangeBegin.isEnd() && RangeBegin->isBundledWithPred())
+ return;
+ if (!RangeEnd.isEnd() && RangeEnd->isBundledWithPred())
+ return;
+ Ranges.emplace_back(RangeBegin, RangeEnd);
};
// Find the first point where all unsafe registers are dead.
// FIND: <safe instr> <-- end of first potential range
diff --git a/llvm/test/CodeGen/AArch64/machine-outliner-safe-range-in-middle.mir b/llvm/test/CodeGen/AArch64/machine-outliner-safe-range-in-middle.mir
index 23811425101fd..b99ca25a5432d 100644
--- a/llvm/test/CodeGen/AArch64/machine-outliner-safe-range-in-middle.mir
+++ b/llvm/test/CodeGen/AArch64/machine-outliner-safe-range-in-middle.mir
@@ -16,27 +16,53 @@ body: |
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: BL @OUTLINED_FUNCTION_0, implicit-def $lr, implicit $sp, implicit-def $lr, implicit-def $x0, implicit-def $x1, implicit-def $x2, implicit-def $x3, implicit-def $x16, implicit $x0, implicit $sp
; CHECK-NEXT: $x9 = ADDXri $x16, 16, 0
- ; CHECK-NEXT: $x16 = ADDXri killed $x16, 16, 0
+ ; CHECK-NEXT: $x16 = ADDXri killed $x16, 16, 1
; CHECK-NEXT: BL @OUTLINED_FUNCTION_0, implicit-def $lr, implicit $sp, implicit-def $lr, implicit-def $x0, implicit-def $x1, implicit-def $x2, implicit-def $x3, implicit-def $x16, implicit $x0, implicit $sp
; CHECK-NEXT: $x9 = ADDXri $x9, 16, 0
- ; CHECK-NEXT: $x16 = ADDXri killed $x16, 16, 0
+ ; CHECK-NEXT: $x16 = ADDXri killed $x16, 16, 2
; CHECK-NEXT: RET undef $x9
$x0 = ADDXri $x0, 0, 0
$x1 = ADDXri $x0, 1, 0
$x2 = ADDXri $x0, 2, 0
$x3 = ADDXri $x0, 3, 0
-
- ; End safe range
$x16 = ADDXri $x0, 16, 0
$x9 = ADDXri $x16, 16, 0
- $x16 = ADDXri killed $x16, 16, 0
-
+ $x16 = ADDXri killed $x16, 16, 1
+ ; End safe range
$x0 = ADDXri $x0, 0, 0
$x1 = ADDXri $x0, 1, 0
$x2 = ADDXri $x0, 2, 0
$x3 = ADDXri $x0, 3, 0
- ; End safe range
$x16 = ADDXri $x0, 16, 0
$x9 = ADDXri $x9, 16, 0
- $x16 = ADDXri killed $x16, 16, 0
+ $x16 = ADDXri killed $x16, 16, 2
+ ; End safe range
RET undef $x9
+...
+---
+name: unsafe_range_bundle
+tracksRegLiveness: true
+machineFunctionInfo:
+ hasRedZone: false
+body: |
+ bb.0:
+ liveins: $x0
+ ; CHECK-LABEL: name: unsafe_range_bundle
+ ; CHECK: liveins: $x0
+ ; CHECK-NEXT: {{ $}}
+ ; CHECK-NEXT: $x0 = ADDXri $x0, 0, 0
+ ; CHECK-NEXT: $x16 = ADDXri $x0, 16, 0
+ ; CHECK-NEXT: BUNDLE {
+ ; CHECK-NEXT: $x16 = ADDXri killed $x16, 16, 3
+ ; CHECK-NEXT: $x1 = ADDXri $x0, 0, 0
+ ; CHECK-NEXT: }
+ ; CHECK-NEXT: RET undef $x9
+ $x0 = ADDXri $x0, 0, 0
+ $x16 = ADDXri $x0, 16, 0
+ BUNDLE { ; Bundle crosses a safe range
+ $x16 = ADDXri killed $x16, 16, 3
+ ; End safe range
+ $x1 = ADDXri $x0, 0, 0
+ }
+ RET undef $x9
+...
More information about the llvm-commits
mailing list