diff options
author | Chris Lattner <sabre@nondot.org> | 2004-02-27 06:27:46 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-02-27 06:27:46 +0000 |
commit | a0ebcebc062e66fdc74a739671064101b92f9231 (patch) | |
tree | 59466ee164898d5e66605000f95e6f4f08d4b409 /lib | |
parent | f7b0041fb5605828bede461cc58a1b17a356676d (diff) | |
download | llvm-a0ebcebc062e66fdc74a739671064101b92f9231.tar.gz llvm-a0ebcebc062e66fdc74a739671064101b92f9231.tar.bz2 llvm-a0ebcebc062e66fdc74a739671064101b92f9231.tar.xz |
Implement test/Regression/Transforms/InstCombine/canonicalize_branch.ll
This is a really minor thing, but might help out the 'switch statement induction'
code in simplifycfg.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11900 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Transforms/Scalar/InstructionCombining.cpp | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index 322112a942..0bf785360e 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -2343,7 +2343,7 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) { Instruction *InstCombiner::visitBranchInst(BranchInst &BI) { // Change br (not X), label True, label False to: br X, label False, True - if (BI.isConditional() && !isa<Constant>(BI.getCondition())) + if (BI.isConditional() && !isa<Constant>(BI.getCondition())) { if (Value *V = dyn_castNotVal(BI.getCondition())) { BasicBlock *TrueDest = BI.getSuccessor(0); BasicBlock *FalseDest = BI.getSuccessor(1); @@ -2352,7 +2352,29 @@ Instruction *InstCombiner::visitBranchInst(BranchInst &BI) { BI.setSuccessor(0, FalseDest); BI.setSuccessor(1, TrueDest); return &BI; + } else if (SetCondInst *I = dyn_cast<SetCondInst>(BI.getCondition())) { + // Cannonicalize setne -> seteq + if ((I->getOpcode() == Instruction::SetNE || + I->getOpcode() == Instruction::SetLE || + I->getOpcode() == Instruction::SetGE) && I->hasOneUse()) { + std::string Name = I->getName(); I->setName(""); + Instruction::BinaryOps NewOpcode = + SetCondInst::getInverseCondition(I->getOpcode()); + Value *NewSCC = BinaryOperator::create(NewOpcode, I->getOperand(0), + I->getOperand(1), Name, I); + BasicBlock *TrueDest = BI.getSuccessor(0); + BasicBlock *FalseDest = BI.getSuccessor(1); + // Swap Destinations and condition... + BI.setCondition(NewSCC); + BI.setSuccessor(0, FalseDest); + BI.setSuccessor(1, TrueDest); + removeFromWorkList(I); + I->getParent()->getInstList().erase(I); + WorkList.push_back(cast<Instruction>(NewSCC)); + return &BI; + } } + } return 0; } |