summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-02-27 06:27:46 +0000
committerChris Lattner <sabre@nondot.org>2004-02-27 06:27:46 +0000
commita0ebcebc062e66fdc74a739671064101b92f9231 (patch)
tree59466ee164898d5e66605000f95e6f4f08d4b409 /lib
parentf7b0041fb5605828bede461cc58a1b17a356676d (diff)
downloadllvm-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.cpp24
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;
}