diff options
-rw-r--r-- | include/llvm/Analysis/InstructionSimplify.h | 6 | ||||
-rw-r--r-- | lib/Analysis/InstructionSimplify.cpp | 20 | ||||
-rw-r--r-- | lib/Transforms/Scalar/JumpThreading.cpp | 11 |
3 files changed, 30 insertions, 7 deletions
diff --git a/include/llvm/Analysis/InstructionSimplify.h b/include/llvm/Analysis/InstructionSimplify.h index 2398cf694f..bb5c811fe2 100644 --- a/include/llvm/Analysis/InstructionSimplify.h +++ b/include/llvm/Analysis/InstructionSimplify.h @@ -17,10 +17,10 @@ #define LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H namespace llvm { + class Instruction; class Value; class TargetData; - /// SimplifyAndInst - Given operands for an And, see if we can /// fold the result. If not, this returns null. Value *SimplifyAndInst(Value *LHS, Value *RHS, @@ -55,6 +55,10 @@ namespace llvm { Value *SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, const TargetData *TD = 0); + /// SimplifyInstruction - See if we can compute a simplified version of this + /// instruction. If not, this returns null. + Value *SimplifyInstruction(Instruction *I, const TargetData *TD = 0); + } // end namespace llvm #endif diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp index 3c1529ce6d..6953f16dc9 100644 --- a/lib/Analysis/InstructionSimplify.cpp +++ b/lib/Analysis/InstructionSimplify.cpp @@ -291,3 +291,23 @@ Value *llvm::SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS, return SimplifyFCmpInst(Predicate, LHS, RHS, TD); } + +/// SimplifyInstruction - See if we can compute a simplified version of this +/// instruction. If not, this returns null. +Value *llvm::SimplifyInstruction(Instruction *I, const TargetData *TD) { + switch (I->getOpcode()) { + default: + return ConstantFoldInstruction(I, TD); + case Instruction::And: + return SimplifyAndInst(I->getOperand(0), I->getOperand(1), TD); + case Instruction::Or: + return SimplifyOrInst(I->getOperand(0), I->getOperand(1), TD); + case Instruction::ICmp: + return SimplifyICmpInst(cast<ICmpInst>(I)->getPredicate(), + I->getOperand(0), I->getOperand(1), TD); + case Instruction::FCmp: + return SimplifyFCmpInst(cast<FCmpInst>(I)->getPredicate(), + I->getOperand(0), I->getOperand(1), TD); + } +} + diff --git a/lib/Transforms/Scalar/JumpThreading.cpp b/lib/Transforms/Scalar/JumpThreading.cpp index 7eaae9b36f..46d40ef5d1 100644 --- a/lib/Transforms/Scalar/JumpThreading.cpp +++ b/lib/Transforms/Scalar/JumpThreading.cpp @@ -16,7 +16,6 @@ #include "llvm/IntrinsicInst.h" #include "llvm/LLVMContext.h" #include "llvm/Pass.h" -#include "llvm/Analysis/ConstantFolding.h" #include "llvm/Analysis/InstructionSimplify.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Transforms/Utils/Local.h" @@ -223,9 +222,9 @@ static void RemovePredecessorAndSimplify(BasicBlock *BB, BasicBlock *Pred, Instruction *User = cast<Instruction>(U.getUser()); U = PNV; - // See if we can simplify it (constant folding). - if (Constant *C = ConstantFoldInstruction(User, TD)) { - User->replaceAllUsesWith(C); + // See if we can simplify it. + if (Value *V = SimplifyInstruction(User, TD)) { + User->replaceAllUsesWith(V); User->eraseFromParent(); } } @@ -1203,8 +1202,8 @@ bool JumpThreading::ThreadEdge(BasicBlock *BB, BI = NewBB->begin(); for (BasicBlock::iterator E = NewBB->end(); BI != E; ) { Instruction *Inst = BI++; - if (Constant *C = ConstantFoldInstruction(Inst, TD)) { - Inst->replaceAllUsesWith(C); + if (Value *V = SimplifyInstruction(Inst, TD)) { + Inst->replaceAllUsesWith(V); Inst->eraseFromParent(); continue; } |