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.

llvm-svn: 73768
This commit is contained in:
Chris Lattner 2009-06-19 16:27:56 +00:00
parent 91740476a3
commit 8f6f044afd
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.
if (CondInst == 0)
return false;
@ -358,6 +354,23 @@ bool JumpThreading::ProcessBlock(BasicBlock *BB) {
if (ProcessBranchOnCompare(CondCmp, BB))
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

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
}