diff options
| author | Weiming Zhao <weimingz@codeaurora.org> | 2016-01-15 00:06:58 +0000 |
|---|---|---|
| committer | Weiming Zhao <weimingz@codeaurora.org> | 2016-01-15 00:06:58 +0000 |
| commit | 038393bba00c5654724de27d72ae633ec48533d4 (patch) | |
| tree | 3e4871610d43fd329c577d246ae273efda389a3c /llvm/lib/Target | |
| parent | 95e363d0de54e10bf4bf7cc18d84b4998b5e9e78 (diff) | |
| download | bcm5719-llvm-038393bba00c5654724de27d72ae633ec48533d4.tar.gz bcm5719-llvm-038393bba00c5654724de27d72ae633ec48533d4.zip | |
Fix AArch64ConditionOptimizer
Summary:
This pass may modify the Cmp operands. However, the flag reg may be used by both the branch and CSEL.
Modifying CMP will have side effect on CSEL.
Reviewers: t.p.northover
Subscribers: llvm-commits, aemerson, rengolin
Differential Revision: http://reviews.llvm.org/D16147
llvm-svn: 257844
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64ConditionOptimizer.cpp | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64ConditionOptimizer.cpp b/llvm/lib/Target/AArch64/AArch64ConditionOptimizer.cpp index fc27bfee73d..8a3748389a2 100644 --- a/llvm/lib/Target/AArch64/AArch64ConditionOptimizer.cpp +++ b/llvm/lib/Target/AArch64/AArch64ConditionOptimizer.cpp @@ -144,10 +144,18 @@ MachineInstr *AArch64ConditionOptimizer::findSuitableCompare( if (I->getOpcode() != AArch64::Bcc) return nullptr; + // Since we may modify cmp of this MBB, make sure NZCV does not live out. + for (auto SuccBB : MBB->successors()) + if (SuccBB->isLiveIn(AArch64::NZCV)) + return nullptr; + // Now find the instruction controlling the terminator. for (MachineBasicBlock::iterator B = MBB->begin(); I != B;) { --I; assert(!I->isTerminator() && "Spurious terminator"); + // Check if there is any use of NZCV between CMP and Bcc. + if (I->readsRegister(AArch64::NZCV)) + return nullptr; switch (I->getOpcode()) { // cmp is an alias for subs with a dead destination register. case AArch64::SUBSWri: |

