Correct result when a branch condition is live across a block

boundary.  <rdar://problem/8933028>

llvm-svn: 129634
This commit is contained in:
Stuart Hastings 2011-04-16 03:31:26 +00:00
parent b14ce09fca
commit ebddfe60a0
1 changed files with 10 additions and 4 deletions

View File

@ -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))