ARM: correctly update CFG when splitting BB to fix branch.

Because the block-splitting code is multi-purpose, we have to meddle with the
branches when using it to fixup a conditional branch destination. We got the
code right, but forgot to update the CFG so the verifier complained when
expensive checks were on.

Probably harmless since constant-islands comes so late, but best to fix it
anyway.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@318148 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Tim Northover 2017-11-14 11:43:54 +00:00
parent 155567c8fe
commit cb6b828542
2 changed files with 70 additions and 0 deletions

View File

@ -1689,6 +1689,12 @@ ARMConstantIslands::fixupConditionalBr(ImmBranch &Br) {
int delta = TII->getInstSizeInBytes(MBB->back()); int delta = TII->getInstSizeInBytes(MBB->back());
BBInfo[MBB->getNumber()].Size -= delta; BBInfo[MBB->getNumber()].Size -= delta;
MBB->back().eraseFromParent(); MBB->back().eraseFromParent();
// The conditional successor will be swapped between the BBs after this, so
// update CFG.
MBB->addSuccessor(DestBB);
std::next(MBB->getIterator())->removeSuccessor(DestBB);
// BBInfo[SplitBB].Offset is wrong temporarily, fixed below // BBInfo[SplitBB].Offset is wrong temporarily, fixed below
} }
MachineBasicBlock *NextBB = &*++MBB->getIterator(); MachineBasicBlock *NextBB = &*++MBB->getIterator();

View File

@ -0,0 +1,64 @@
# RUN: llc -mtriple=thumbv6m-apple-ios -run-pass=arm-cp-islands %s -o - | FileCheck %s
--- |
; Function Attrs: minsize nounwind optsize uwtable
define arm_aapcscc double @test_split_cfg(double %a, double %b) local_unnamed_addr #0 {
ret double undef
}
...
---
name: test_split_cfg
alignment: 1
exposesReturnsTwice: false
legalized: false
regBankSelected: false
selected: false
tracksRegLiveness: true
registers:
liveins:
- { reg: '%r0', virtual-reg: '' }
frameInfo:
isFrameAddressTaken: false
isReturnAddressTaken: false
hasStackMap: false
hasPatchPoint: false
stackSize: 48
offsetAdjustment: 0
maxAlignment: 4
adjustsStack: true
hasCalls: true
stackProtector: ''
maxCallFrameSize: 0
hasOpaqueSPAdjustment: false
hasVAStart: false
hasMustTailInVarArgFunc: false
savePoint: ''
restorePoint: ''
fixedStack:
# CHECK-LABEL: name: test_split_cfg
# CHECK: bb.0:
# CHECK: successors: %[[LONG_BR_BB:bb.[0-9]+]](0x{{[0-9a-f]+}}), %[[DEST1:bb.[0-9]+]](0x{{[0-9a-f]+}}){{$}}
# CHECK: tBcc %[[LONG_BR_BB]], 0, %cpsr
# CHECK: tB %[[DEST1]]
# CHECK: [[LONG_BR_BB]]:
# CHECK: successors: %[[DEST2:bb.[0-9]+]](0x{{[0-9a-f]+}}){{$}}
# CHECK: tB %[[DEST2]]
# CHECK: [[DEST1]]:
# CHECK: [[DEST2]]:
body: |
bb.0:
liveins: %r0
tCMPi8 killed %r0, 0, 14, _, implicit-def %cpsr
tBcc %bb.2, 1, killed %cpsr
tB %bb.3, 14, _
bb.1:
dead %r0 = SPACE 256, undef %r0
bb.2:
tPOP_RET 14, _, def %pc
bb.3:
tPOP_RET 14, _, def %pc
...