diff options
author | Evan Cheng <evan.cheng@apple.com> | 2006-02-16 08:27:56 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2006-02-16 08:27:56 +0000 |
commit | 298ebf2bd80ca415e58bbcbd9866ee58f167b620 (patch) | |
tree | be283f1d3e98413e6841562c73582eca91bc94e0 | |
parent | 8f4880be6675dbf1840446bc7a335f71ff557154 (diff) |
If the false case is the current basic block, then this is a self loop.
We do not want to emit "Loop: ... brcond Out; br Loop", as it adds an extra
instruction in the loop. Instead, invert the condition and emit
"Loop: ... br!cond Loop; br Out.
Generalize the fix by moving it from PPCDAGToDAGISel to SelectionDAGLowering.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26231 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 9 | ||||
-rw-r--r-- | lib/Target/PowerPC/PPCISelDAGToDAG.cpp | 11 |
2 files changed, 9 insertions, 11 deletions
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index 766f846968..78f5623aed 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -562,6 +562,15 @@ void SelectionDAGLowering::visitBr(BranchInst &I) { } else { std::vector<SDOperand> Ops; Ops.push_back(getRoot()); + // If the false case is the current basic block, then this is a self + // loop. We do not want to emit "Loop: ... brcond Out; br Loop", as it + // adds an extra instruction in the loop. Instead, invert the + // condition and emit "Loop: ... br!cond Loop; br Out. + if (CurMBB == Succ1MBB) { + std::swap(Succ0MBB, Succ1MBB); + SDOperand True = DAG.getConstant(1, Cond.getValueType()); + Cond = DAG.getNode(ISD::XOR, Cond.getValueType(), Cond, True); + } Ops.push_back(Cond); Ops.push_back(DAG.getBasicBlock(Succ0MBB)); Ops.push_back(DAG.getBasicBlock(Succ1MBB)); diff --git a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp index 08fdcb4660..b781ca5cd8 100644 --- a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp +++ b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp @@ -1046,17 +1046,6 @@ void PPCDAGToDAGISel::Select(SDOperand &Result, SDOperand Op) { if (N->getOpcode() == ISD::BRTWOWAY_CC) { SDOperand CondTrueBlock = N->getOperand(4); SDOperand CondFalseBlock = N->getOperand(5); - - // If the false case is the current basic block, then this is a self loop. - // We do not want to emit "Loop: ... brcond Out; br Loop", as it adds an - // extra dispatch group to the loop. Instead, invert the condition and - // emit "Loop: ... br!cond Loop; br Out - if (cast<BasicBlockSDNode>(CondFalseBlock)->getBasicBlock() == BB) { - std::swap(CondTrueBlock, CondFalseBlock); - CC = getSetCCInverse(CC, - MVT::isInteger(N->getOperand(2).getValueType())); - } - unsigned Opc = getBCCForSetCC(CC); SDOperand CB = SDOperand(CurDAG->getTargetNode(PPC::COND_BRANCH, MVT::Other, |