Skip to content
Snippets Groups Projects
Commit 5f6b8b2b authored by Chris Lattner's avatar Chris Lattner
Browse files

use getPredicateOnEdge to fold comparisons through PHI nodes,

which implements GCC PR18046.  This also gets us 360 more
jump threads on 176.gcc.

llvm-svn: 86953
parent 22db4b5e
No related branches found
No related tags found
No related merge requests found
......@@ -368,7 +368,17 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){
Value *RHS = Cmp->getOperand(1)->DoPHITranslation(BB, PredBB);
Value *Res = SimplifyCmpInst(Cmp->getPredicate(), LHS, RHS, TD);
if (Res == 0) continue;
if (Res == 0) {
if (!LVI || !isa<Constant>(RHS))
continue;
LazyValueInfo::Tristate
ResT = LVI->getPredicateOnEdge(Cmp->getPredicate(), LHS,
cast<Constant>(RHS), PredBB, BB);
if (ResT == LazyValueInfo::Unknown)
continue;
Res = ConstantInt::get(Type::getInt1Ty(LHS->getContext()), ResT);
}
if (isa<UndefValue>(Res))
Result.push_back(std::make_pair((ConstantInt*)0, PredBB));
......
......@@ -349,6 +349,38 @@ BB4:
ret i32 4
}
;; Correlated value through boolean expression. GCC PR18046.
define void @test12(i32 %A) {
; CHECK: @test12
entry:
%cond = icmp eq i32 %A, 0
br i1 %cond, label %bb, label %bb1
; Should branch to the return block instead of through BB1.
; CHECK: entry:
; CHECK-NEXT: %cond = icmp eq i32 %A, 0
; CHECK-NEXT: br i1 %cond, label %bb1, label %return
bb:
%B = call i32 @test10f2()
br label %bb1
bb1:
%C = phi i32 [ %A, %entry ], [ %B, %bb ]
%cond4 = icmp eq i32 %C, 0
br i1 %cond4, label %bb2, label %return
; CHECK: bb1:
; CHECK-NEXT: %B = call i32 @test10f2()
; CHECK-NEXT: %cond4 = icmp eq i32 %B, 0
; CHECK-NEXT: br i1 %cond4, label %bb2, label %return
bb2:
%D = call i32 @test10f2()
ret void
return:
ret void
}
;;; Duplicate condition to avoid xor of cond.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment