aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStuart Hastings <stuart@apple.com>2011-04-16 03:31:26 +0000
committerStuart Hastings <stuart@apple.com>2011-04-16 03:31:26 +0000
commitc5eecbc4ec3e8b6934b2c932735c8ebc1b78f537 (patch)
treea15e272d4d744a1e9d990596c890e967b402c47d
parent65279cb9bd985721ac6ad090fed02298396ba06d (diff)
downloadexternal_llvm-c5eecbc4ec3e8b6934b2c932735c8ebc1b78f537.zip
external_llvm-c5eecbc4ec3e8b6934b2c932735c8ebc1b78f537.tar.gz
external_llvm-c5eecbc4ec3e8b6934b2c932735c8ebc1b78f537.tar.bz2
Correct result when a branch condition is live across a block
boundary. <rdar://problem/8933028> git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129634 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/ARM/ARMFastISel.cpp14
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/Target/ARM/ARMFastISel.cpp b/lib/Target/ARM/ARMFastISel.cpp
index ce9e21f..c95b4a8 100644
--- a/lib/Target/ARM/ARMFastISel.cpp
+++ b/lib/Target/ARM/ARMFastISel.cpp
@@ -1121,10 +1121,16 @@ bool ARMFastISel::SelectBranch(const Instruction *I) {
unsigned CmpReg = getRegForValue(BI->getCondition());
if (CmpReg == 0) return false;
- // Re-set the flags just in case.
- unsigned CmpOpc = isThumb ? ARM::t2CMPri : ARM::CMPri;
- AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(CmpOpc))
- .addReg(CmpReg).addImm(0));
+ // We've been divorced from our compare! Our block was split, and
+ // now our compare lives in a predecessor block. We musn't
+ // re-compare here, as the children of the compare aren't guaranteed
+ // live across the block boundary (we *could* check for this).
+ // Regardless, the compare has been done in the predecessor block,
+ // and it left a value for us in a virtual register. Ergo, we test
+ // the one-bit value left in the virtual register.
+ unsigned TstOpc = isThumb ? ARM::t2TSTri : ARM::TSTri;
+ AddOptionalDefs(BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(TstOpc))
+ .addReg(CmpReg).addImm(1));
unsigned BrOpc = isThumb ? ARM::t2Bcc : ARM::Bcc;
BuildMI(*FuncInfo.MBB, FuncInfo.InsertPt, DL, TII.get(BrOpc))