[llvm] 0303137 - Revert "[AArch64][CodeGen] Avoid inverting hot branches during relaxation"
Daniel Hoekwater via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 21 10:16:03 PDT 2023
Author: Daniel Hoekwater
Date: 2023-08-21T17:13:35Z
New Revision: 0303137bfcf2e28fb2d9387b67f91b00ca6b42f5
URL: https://github.com/llvm/llvm-project/commit/0303137bfcf2e28fb2d9387b67f91b00ca6b42f5
DIFF: https://github.com/llvm/llvm-project/commit/0303137bfcf2e28fb2d9387b67f91b00ca6b42f5.diff
LOG: Revert "[AArch64][CodeGen] Avoid inverting hot branches during relaxation"
This reverts commit 46d2d7599d9ed5e68fb53e910feb10d47ee2667b.
Breaks build https://lab.llvm.org/buildbot/#/builders/21/builds/78779
Added:
Modified:
llvm/lib/CodeGen/BranchRelaxation.cpp
llvm/test/CodeGen/AArch64/branch-relax-cross-section.mir
Removed:
################################################################################
diff --git a/llvm/lib/CodeGen/BranchRelaxation.cpp b/llvm/lib/CodeGen/BranchRelaxation.cpp
index 2995732e0aa86b..378f8bfda20361 100644
--- a/llvm/lib/CodeGen/BranchRelaxation.cpp
+++ b/llvm/lib/CodeGen/BranchRelaxation.cpp
@@ -79,10 +79,6 @@ class BranchRelaxation : public MachineFunctionPass {
};
SmallVector<BasicBlockInfo, 16> BlockInfo;
-
- // The basic block after which trampolines are inserted. This is the last
- // basic block that isn't in the cold section.
- MachineBasicBlock *TrampolineInsertionPoint = nullptr;
std::unique_ptr<RegScavenger> RS;
LivePhysRegs LiveRegs;
@@ -170,27 +166,16 @@ LLVM_DUMP_METHOD void BranchRelaxation::dumpBBs() {
void BranchRelaxation::scanFunction() {
BlockInfo.clear();
BlockInfo.resize(MF->getNumBlockIDs());
- TrampolineInsertionPoint = nullptr;
// First thing, compute the size of all basic blocks, and see if the function
// has any inline assembly in it. If so, we have to be conservative about
// alignment assumptions, as we don't know for sure the size of any
- // instructions in the inline assembly. At the same time, place the
- // trampoline insertion point at the end of the hot portion of the function.
- for (MachineBasicBlock &MBB : *MF) {
+ // instructions in the inline assembly.
+ for (MachineBasicBlock &MBB : *MF)
BlockInfo[MBB.getNumber()].Size = computeBlockSize(MBB);
- if (MBB.getSectionID() != MBBSectionID::ColdSectionID)
- TrampolineInsertionPoint = &MBB;
- }
-
// Compute block offsets and known bits.
adjustBlockOffsets(*MF->begin());
-
- if (TrampolineInsertionPoint == nullptr) {
- LLVM_DEBUG(dbgs() << " No suitable trampoline insertion point found in "
- << MF->getName() << ".\n");
- }
}
/// computeBlockSize - Compute the size for MBB.
@@ -391,50 +376,6 @@ bool BranchRelaxation::fixupConditionalBranch(MachineInstr &MI) {
assert(!Fail && "branches to be relaxed must be analyzable");
(void)Fail;
- // Since cross-section conditional branches to the cold section are rarely
- // taken, try to avoid inverting the condition. Instead, add a "trampoline
- // branch", which unconditionally branches to the branch destination. Place
- // the trampoline branch at the end of the function and retarget the
- // conditional branch to the trampoline.
- // tbz L1
- // =>
- // tbz L1Trampoline
- // ...
- // L1Trampoline: b L1
- if (MBB->getSectionID() != TBB->getSectionID() &&
- TBB->getSectionID() == MBBSectionID::ColdSectionID &&
- TrampolineInsertionPoint != nullptr) {
- // If the insertion point is out of range, we can't put a trampoline there.
- NewBB =
- createNewBlockAfter(*TrampolineInsertionPoint, MBB->getBasicBlock());
-
- if (isBlockInRange(MI, *NewBB)) {
- LLVM_DEBUG(dbgs() << " Retarget destination to trampoline at "
- << NewBB->back());
-
- insertUncondBranch(NewBB, TBB);
-
- // Update the successor lists to include the trampoline.
- MBB->replaceSuccessor(TBB, NewBB);
- NewBB->addSuccessor(TBB);
-
- // Replace branch in the current (MBB) block.
- removeBranch(MBB);
- insertBranch(MBB, NewBB, FBB, Cond);
-
- TrampolineInsertionPoint = NewBB;
- finalizeBlockChanges(MBB, NewBB);
- return true;
- }
-
- LLVM_DEBUG(
- dbgs() << " Trampoline insertion point out of range for Bcc from "
- << printMBBReference(*MBB) << " to " << printMBBReference(*TBB)
- << ".\n");
- TrampolineInsertionPoint->setIsEndSection(NewBB->isEndSection());
- MF->erase(NewBB);
- }
-
// Add an unconditional branch to the destination and invert the branch
// condition to jump over it:
// tbz L1
diff --git a/llvm/test/CodeGen/AArch64/branch-relax-cross-section.mir b/llvm/test/CodeGen/AArch64/branch-relax-cross-section.mir
index 231bc886dd3b74..1cf307cd16ecff 100644
--- a/llvm/test/CodeGen/AArch64/branch-relax-cross-section.mir
+++ b/llvm/test/CodeGen/AArch64/branch-relax-cross-section.mir
@@ -1,5 +1,4 @@
-# RUN: llc -mtriple=aarch64-none-linux-gnu -run-pass branch-relaxation -aarch64-b-offset-bits=64 -aarch64-tbz-offset-bits=9 -aarch64-cbz-offset-bits=9 %s -o - | FileCheck %s
-# RUN: llc -mtriple=aarch64-none-linux-gnu -run-pass branch-relaxation -aarch64-tbz-offset-bits=9 -aarch64-cbz-offset-bits=9 %s -o - | FileCheck --check-prefix=INDIRECT %s
+# RUN: llc -mtriple=aarch64-none-linux-gnu -run-pass branch-relaxation -aarch64-b-offset-bits=64 %s -o - | FileCheck %s
--- |
declare i32 @bar()
@@ -22,73 +21,6 @@
br label %end
}
- define void @tbz_hot_to_cold(i1 zeroext %0) {
- br i1 %0, label %hot_block, label %cold_block
-
- hot_block: ; preds = %1
- %2 = call i32 @baz()
- br label %end
-
- end: ; preds = %cold_block, %hot_block
- %3 = tail call i32 @qux()
- ret void
-
- cold_block: ; preds = %1
- %4 = call i32 @bar()
- br label %end
- }
-
- define void @tbz_no_valid_tramp(i1 zeroext %0) {
- br i1 %0, label %hot, label %cold
-
- hot: ; preds = %1
- %2 = call i32 @baz()
- call void asm sideeffect ".space 1024", ""()
- br label %end
-
- end: ; preds = %cold, %hot
- %3 = tail call i32 @qux()
- ret void
-
- cold: ; preds = %1
- %4 = call i32 @bar()
- br label %end
- }
-
- define void @tbz_cold_to_hot(i1 zeroext %0) #0 {
- br i1 %0, label %cold_block, label %hot_block
-
- cold_block: ; preds = %1
- %2 = call i32 @baz()
- br label %end
-
- end: ; preds = %hot_block, %cold_block
- %3 = tail call i32 @qux()
- ret void
-
- hot_block: ; preds = %1
- %4 = call i32 @bar()
- br label %end
- }
-
- define void @tbz_tramp_pushed_oob(i1 zeroext %0, i1 zeroext %1) {
- entry:
- %x16 = call i64 asm sideeffect "mov x16, 1", "={x16}"()
- br i1 %0, label %unrelaxable, label %cold
-
- unrelaxable: ; preds = %entry
- br i1 %1, label %end, label %cold
-
- end: ; preds = %unrelaxable
- call void asm sideeffect ".space 996", ""()
- call void asm sideeffect "# reg use $0", "{x16}"(i64 %x16)
- ret void
-
- cold: ; preds = %entry, %unrelaxable
- call void asm sideeffect "# reg use $0", "{x16}"(i64 %x16)
- ret void
- }
-
...
---
name: relax_tbz
@@ -137,201 +69,3 @@ body: |
early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.0)
TCRETURNdi @qux, 0, csr_aarch64_aapcs, implicit $sp
...
----
-name: tbz_hot_to_cold
-tracksRegLiveness: true
-liveins:
- - { reg: '$w0', virtual-reg: '' }
-stack:
- - { id: 0, name: '', type: spill-slot, offset: -16, size: 8, alignment: 16,
- stack-id: default, callee-saved-register: '$lr', callee-saved-restored: true,
- debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
-body: |
- ; CHECK-LABEL: name: tbz_hot_to_cold
- ; COM: Check that branch relaxation relaxes cross-section conditional
- ; COM: branches by creating trampolines after all other hot basic blocks.
- ; CHECK: bb.0 (%ir-block.1):
- ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.3(0x40000000)
- ; CHECK: TBZW
- ; CHECK-SAME: %bb.3
- ; CHECK: bb.1.hot_block:
- ; CHECK: TCRETURNdi @qux, 0, csr_aarch64_aapcs, implicit $sp
- ; CHECK: bb.3 (%ir-block.1):
- ; CHECK-NEXT: successors: %bb.2(0x80000000)
- ; CHECK-NEXT: {{ $}}
- ; CHECK-NEXT: B %bb.2
- ; CHECK-NEXT: {{ $}}
- ; CHECK-NEXT: bb.2.cold_block (bbsections Cold):
- ; CHECK: TCRETURNdi @qux, 0, csr_aarch64_aapcs, implicit $sp
- bb.0 (%ir-block.1):
- successors: %bb.1(0x40000000), %bb.2(0x40000000)
- liveins: $w0, $lr
-
- early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.0)
- TBZW killed renamable $w0, 0, %bb.2
-
- bb.1.hot_block:
- BL @baz, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, implicit-def dead $w0
- early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.0)
- TCRETURNdi @qux, 0, csr_aarch64_aapcs, implicit $sp
-
- bb.2.cold_block (bbsections Cold):
- BL @bar, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, implicit-def dead $w0
- early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.0)
- TCRETURNdi @qux, 0, csr_aarch64_aapcs, implicit $sp
-
-...
----
-name: tbz_no_valid_tramp
-tracksRegLiveness: true
-liveins:
- - { reg: '$w0', virtual-reg: '' }
-stack:
- - { id: 0, name: '', type: spill-slot, offset: -16, size: 8, alignment: 16,
- stack-id: default, callee-saved-register: '$lr', callee-saved-restored: true,
- debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
-machineFunctionInfo:
- hasRedZone: false
-body: |
- ; CHECK-LABEL: name: tbz_no_valid_tramp
- ; COM: Check that branch relaxation doesn't insert a trampoline if there is no
- ; COM: viable insertion location.
- ; CHECK: bb.0 (%ir-block.1):
- ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.3(0x40000000)
- ; CHECK: CBNZW
- ; CHECK-SAME: %bb.1
- ; CHECK-NEXT: B
- ; CHECK-SAME: %bb.3
- ; CHECK: bb.1.hot:
- ; CHECK: TCRETURNdi
- ; CHECK: bb.2.cold (bbsections Cold):
- ; CHECK: TCRETURNdi
- bb.0 (%ir-block.1):
- successors: %bb.1(0x40000000), %bb.2(0x40000000)
- liveins: $w0, $lr
-
- early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.0)
- CBZW killed renamable $w0, %bb.2
-
- bb.1.hot:
- BL @baz, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, implicit-def dead $w0
- INLINEASM &".space 1024", 1 /* sideeffect attdialect */
- early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.0)
- TCRETURNdi @qux, 0, csr_aarch64_aapcs, implicit $sp
-
- bb.2.cold (bbsections Cold):
- BL @bar, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, implicit-def dead $w0
- early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.0)
- TCRETURNdi @qux, 0, csr_aarch64_aapcs, implicit $sp
-
-...
----
-name: tbz_cold_to_hot
-tracksRegLiveness: true
-liveins:
- - { reg: '$w0', virtual-reg: '' }
-stack:
- - { id: 0, name: '', type: spill-slot, offset: -16, size: 8, alignment: 16,
- stack-id: default, callee-saved-register: '$lr', callee-saved-restored: true,
- debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
-machineFunctionInfo:
- hasRedZone: false
-body: |
- ; CHECK-LABEL: name: tbz_cold_to_hot
- ; COM: Check that relaxation of conditional branches from the Cold section to
- ; COM: the Hot section doesn't modify the Hot section.
- ; CHECK: bb.0 (%ir-block.1, bbsections Cold):
- ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000)
- ; CHECK: CBNZW
- ; CHECK-SAME: %bb.1
- ; CHECK-NEXT: B %bb.2
- ; CHECK: bb.1.cold_block (bbsections Cold):
- ; CHECK: TCRETURNdi
- ; CHECK: bb.2.hot_block:
- ; CHECK: TCRETURNdi
- bb.0 (%ir-block.1, bbsections Cold):
- successors: %bb.1(0x40000000), %bb.2(0x40000000)
- liveins: $w0, $lr
-
- early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.0)
- CBZW killed renamable $w0, %bb.2
-
- bb.1.cold_block (bbsections Cold):
- BL @baz, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, implicit-def dead $w0
- early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.0)
- TCRETURNdi @qux, 0, csr_aarch64_aapcs, implicit $sp
-
- bb.2.hot_block:
- BL @bar, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp, implicit-def dead $w0
- early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.0)
- TCRETURNdi @qux, 0, csr_aarch64_aapcs, implicit $sp
-
-...
----
-name: tbz_tramp_pushed_oob
-tracksRegLiveness: true
-liveins:
- - { reg: '$w0', virtual-reg: '' }
- - { reg: '$w1', virtual-reg: '' }
-stack:
- - { id: 0, name: '', type: spill-slot, offset: -16, size: 8, alignment: 16,
- stack-id: default, callee-saved-register: '$lr', callee-saved-restored: true,
- debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
-machineFunctionInfo:
- hasRedZone: false
-body: |
- ; INDIRECT-LABEL: name: tbz_tramp_pushed_oob
- ; COM: Check that a conditional branch to a trampoline is properly relaxed
- ; COM: if the trampoline is pushed out of range.
- ; INDIRECT: bb.0.entry:
- ; INDIRECT-NEXT: successors: %bb.1(0x40000000), %[[TRAMP1:bb.[0-9]+]](0x40000000)
- ; INDIRECT: TBNZW
- ; INDIRECT-SAME: %bb.1
- ; INDIRECT-NEXT: B{{ }}
- ; INDIRECT-SAME: %[[TRAMP1]]
- ; INDIRECT: bb.1.unrelaxable:
- ; INDIRECT-NEXT: successors: %bb.2(0x40000000), %[[TRAMP2:bb.[0-9]+]](0x40000000)
- ; INDIRECT: TBNZW
- ; INDIRECT-SAME: %bb.2
- ; INDIRECT: [[TRAMP2]]
- ; INDIRECT-NEXT: successors: %bb.3(0x80000000)
- ; INDIRECT: bb.2.end:
- ; INDIRECT: TCRETURNdi
- ; INDIRECT: [[TRAMP1]].entry:
- ; INDIRECT: successors: %bb.3(0x80000000)
- ; INDIRECT-NOT: bbsections Cold
- ; INDIRECT: bb.3.cold (bbsections Cold):
- ; INDIRECT: TCRETURNdi
-
- bb.0.entry (%ir-block.entry):
- successors: %bb.1(0x40000000), %bb.3(0x40000000)
- liveins: $w0, $w1, $lr
-
- early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.0)
- INLINEASM &"mov x16, 1", 1 /* sideeffect attdialect */, 10 /* regdef */, implicit-def $x16
- TBZW killed renamable $w0, 0, %bb.3
-
- bb.1.unrelaxable:
- successors: %bb.2(0x40000000), %bb.3(0x40000000)
- liveins: $w1, $x16
-
- TBNZW killed renamable $w1, 0, %bb.2
-
- B %bb.3
-
- bb.2.end:
- liveins: $x16
-
- INLINEASM &".space 996", 1 /* sideeffect attdialect */
- INLINEASM &"# reg use $0", 1 /* sideeffect attdialect */, 9 /* reguse */, killed $x16
- early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.0)
- TCRETURNdi @qux, 0, csr_aarch64_aapcs, implicit $sp
-
- bb.3.cold (bbsections Cold):
- liveins: $x16
-
- INLINEASM &"# reg use $0", 1 /* sideeffect attdialect */, 9 /* reguse */, killed $x16
- early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.0)
- TCRETURNdi @qux, 0, csr_aarch64_aapcs, implicit $sp
-
-...
More information about the llvm-commits
mailing list