From 2ad00bf99d5738c39dbc8cab7e30a0b55e0714ad Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 11 Nov 2009 22:31:38 +0000 Subject: [PATCH] pass TD into a SimplifyCmpInst call. Add another case that uses LVI info when -enable-jump-threading-lvi is passed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@86886 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/JumpThreading.cpp | 27 ++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/Scalar/JumpThreading.cpp b/lib/Transforms/Scalar/JumpThreading.cpp index 03b32540c9c..e93e9cb4d37 100644 --- a/lib/Transforms/Scalar/JumpThreading.cpp +++ b/lib/Transforms/Scalar/JumpThreading.cpp @@ -361,7 +361,7 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){ Value *LHS = PN->getIncomingValue(i); Value *RHS = Cmp->getOperand(1)->DoPHITranslation(BB, PredBB); - Value *Res = SimplifyCmpInst(Cmp->getPredicate(), LHS, RHS); + Value *Res = SimplifyCmpInst(Cmp->getPredicate(), LHS, RHS, TD); if (Res == 0) continue; if (isa(Res)) @@ -373,8 +373,29 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){ return !Result.empty(); } - // TODO: We could also recurse to see if we can determine constants another - // way. + + // If comparing a live-in value against a constant, see if we know the + // live-in value on any predecessors. + if (LVI && isa(Cmp->getOperand(1)) && + (!isa(Cmp->getOperand(0)) || + cast(Cmp->getOperand(0))->getParent() != BB)) { + Constant *RHSCst = cast(Cmp->getOperand(1)); + + for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI) { + // If the value is known by LazyValueInfo to be a constant in a + // predecessor, use that information to try to thread this block. + Constant *PredCst = LVI->getConstant(Cmp->getOperand(0), *PI); + if (PredCst == 0) + continue; + + // Constant fold the compare. + Value *Res = SimplifyCmpInst(Cmp->getPredicate(), PredCst, RHSCst, TD); + if (isa(Res) || isa(Res)) + Result.push_back(std::make_pair(dyn_cast(Res), *PI)); + } + + return !Result.empty(); + } } return false; }