diff options
author | Owen Anderson <resistor@mac.com> | 2010-08-30 22:07:52 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2010-08-30 22:07:52 +0000 |
commit | 1e35610f20ba04daf3aa3048219914421b9931af (patch) | |
tree | def5835b9af95ae32eb08785fa9260a19e7e0ccf /lib/Transforms/Scalar/JumpThreading.cpp | |
parent | 55c134a26188291f60c44d027a837f05d797194f (diff) |
Fixes and cleanups pointed out by Chris. In general, be careful to handle 0 results from ComputeValueKnownInPredecessors
(indicating undef), and re-use existing constant folding APIs.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@112539 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/JumpThreading.cpp')
-rw-r--r-- | lib/Transforms/Scalar/JumpThreading.cpp | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/lib/Transforms/Scalar/JumpThreading.cpp b/lib/Transforms/Scalar/JumpThreading.cpp index c0b0cbebde..2955ca1ab5 100644 --- a/lib/Transforms/Scalar/JumpThreading.cpp +++ b/lib/Transforms/Scalar/JumpThreading.cpp @@ -16,6 +16,7 @@ #include "llvm/IntrinsicInst.h" #include "llvm/LLVMContext.h" #include "llvm/Pass.h" +#include "llvm/Analysis/ConstantFolding.h" #include "llvm/Analysis/InstructionSimplify.h" #include "llvm/Analysis/LazyValueInfo.h" #include "llvm/Analysis/Loads.h" @@ -86,6 +87,7 @@ namespace { virtual void getAnalysisUsage(AnalysisUsage &AU) const { if (EnableLVI) AU.addRequired<LazyValueInfo>(); + AU.addPreserved<LazyValueInfo>(); } void FindLoopHeaders(Function &F); @@ -325,9 +327,10 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){ } else if (LVI) { Constant *CI = LVI->getConstantOnEdge(InVal, PN->getIncomingBlock(i), BB); - ConstantInt *CInt = dyn_cast_or_null<ConstantInt>(CI); - if (CInt) - Result.push_back(std::make_pair(CInt, PN->getIncomingBlock(i))); + // LVI returns null is no value could be determined. + if (!CI) continue; + ConstantInt *CInt = dyn_cast<ConstantInt>(CI); + Result.push_back(std::make_pair(CInt, PN->getIncomingBlock(i))); } } return !Result.empty(); @@ -373,10 +376,6 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){ } } return !Result.empty(); - - // Try to process a few other binary operator patterns. - } else if (isa<BinaryOperator>(I)) { - } // Handle the NOT form of XOR. @@ -400,12 +399,14 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){ // AND or OR of a value with itself is that value. ConstantInt *CI = dyn_cast<ConstantInt>(BO->getOperand(1)); if (CI && (BO->getOpcode() == Instruction::And || - BO->getOpcode() == Instruction::Or)) { + BO->getOpcode() == Instruction::Or)) { SmallVector<std::pair<ConstantInt*, BasicBlock*>, 8> LHSVals; ComputeValueKnownInPredecessors(BO->getOperand(0), BB, LHSVals); - for (unsigned i = 0, e = LHSVals.size(); i != e; ++i) - if (LHSVals[i].first == CI) - Result.push_back(std::make_pair(CI, LHSVals[i].second)); + for (unsigned i = 0, e = LHSVals.size(); i != e; ++i) + if (LHSVals[i].first == 0) + Result.push_back(std::make_pair((ConstantInt*)0, LHSVals[i].second)); + else if (LHSVals[i].first == CI) + Result.push_back(std::make_pair(CI, LHSVals[i].second)); return !Result.empty(); } @@ -450,7 +451,7 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){ if (LVI && isa<Constant>(Cmp->getOperand(1)) && Cmp->getType()->isIntegerTy()) { if (!isa<Instruction>(Cmp->getOperand(0)) || - cast<Instruction>(Cmp->getOperand(0))->getParent() != BB) { + cast<Instruction>(Cmp->getOperand(0))->getParent() != BB) { Constant *RHSCst = cast<Constant>(Cmp->getOperand(1)); for (pred_iterator PI = pred_begin(BB), E = pred_end(BB);PI != E; ++PI){ @@ -472,17 +473,20 @@ ComputeValueKnownInPredecessors(Value *V, BasicBlock *BB,PredValueInfo &Result){ // Try to find a constant value for the LHS of an equality comparison, // and evaluate it statically if we can. - if (Cmp->getPredicate() == CmpInst::ICMP_EQ || - Cmp->getPredicate() == CmpInst::ICMP_NE) { + if (Constant *CmpConst = dyn_cast<Constant>(Cmp->getOperand(1))) { SmallVector<std::pair<ConstantInt*, BasicBlock*>, 8> LHSVals; ComputeValueKnownInPredecessors(I->getOperand(0), BB, LHSVals); ConstantInt *True = ConstantInt::getTrue(I->getContext()); ConstantInt *False = ConstantInt::getFalse(I->getContext()); - if (Cmp->getPredicate() == CmpInst::ICMP_NE) std::swap(True, False); for (unsigned i = 0, e = LHSVals.size(); i != e; ++i) { - if (LHSVals[i].first == Cmp->getOperand(1)) + if (LHSVals[i].first == 0) + Result.push_back(std::make_pair((ConstantInt*)0, + LHSVals[i].second)); + else if (ConstantFoldCompareInstOperands(Cmp->getPredicate(), + LHSVals[i].first, + CmpConst)) Result.push_back(std::make_pair(True, LHSVals[i].second)); else Result.push_back(std::make_pair(False, LHSVals[i].second)); |