make jump threading handle lexically identical compare instructions

as if they were multiple uses of the same instruction.  This interacts
well with the existing loadpre that j-t does to open up many new jump
threads earlier.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73768 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-06-19 16:27:56 +00:00
parent 225503a5b5
commit 79c740ff47
2 changed files with 47 additions and 4 deletions

View File

@ -324,10 +324,6 @@ bool JumpThreading::ProcessBlock(BasicBlock *BB) {
} }
} }
// If there is only a single predecessor of this block, nothing to fold.
if (BB->getSinglePredecessor())
return false;
// All the rest of our checks depend on the condition being an instruction. // All the rest of our checks depend on the condition being an instruction.
if (CondInst == 0) if (CondInst == 0)
return false; return false;
@ -358,6 +354,23 @@ bool JumpThreading::ProcessBlock(BasicBlock *BB) {
if (ProcessBranchOnCompare(CondCmp, BB)) if (ProcessBranchOnCompare(CondCmp, BB))
return true; return true;
} }
// If we have a comparison, loop over the predecessors to see if there is
// a condition with the same value.
pred_iterator PI = pred_begin(BB), E = pred_end(BB);
for (; PI != E; ++PI)
if (BranchInst *PBI = dyn_cast<BranchInst>((*PI)->getTerminator()))
if (PBI->isConditional() && *PI != BB) {
if (CmpInst *CI = dyn_cast<CmpInst>(PBI->getCondition())) {
if (CI->getOperand(0) == CondCmp->getOperand(0) &&
CI->getOperand(1) == CondCmp->getOperand(1) &&
CI->getPredicate() == CondCmp->getPredicate()) {
// TODO: Could handle things like (x != 4) --> (x == 17)
if (ProcessBranchOnDuplicateCond(*PI, BB))
return true;
}
}
}
} }
// Check for some cases that are worth simplifying. Right now we want to look // Check for some cases that are worth simplifying. Right now we want to look

View File

@ -0,0 +1,30 @@
; RUN: llvm-as < %s | opt -jump-threading -die | llvm-dis | grep icmp | count 1
declare void @f1()
declare void @f2()
declare void @f3()
define i32 @test(i32 %A) {
%tmp455 = icmp eq i32 %A, 42
br i1 %tmp455, label %BB1, label %BB2
BB2:
call void @f1()
br label %BB1
BB1:
%tmp459 = icmp eq i32 %A, 42
br i1 %tmp459, label %BB3, label %BB4
BB3:
call void @f2()
ret i32 3
BB4:
call void @f3()
ret i32 4
}