diff options
| -rw-r--r-- | llvm/include/llvm/Analysis/InstructionSimplify.h | 6 | ||||
| -rw-r--r-- | llvm/lib/Analysis/InstructionSimplify.cpp | 20 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Scalar/JumpThreading.cpp | 11 | 
3 files changed, 30 insertions, 7 deletions
| diff --git a/llvm/include/llvm/Analysis/InstructionSimplify.h b/llvm/include/llvm/Analysis/InstructionSimplify.h index 2398cf694fa..bb5c811fe2e 100644 --- a/llvm/include/llvm/Analysis/InstructionSimplify.h +++ b/llvm/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/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 3c1529ce6df..6953f16dc92 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/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/llvm/lib/Transforms/Scalar/JumpThreading.cpp b/llvm/lib/Transforms/Scalar/JumpThreading.cpp index 7eaae9b36f1..46d40ef5d15 100644 --- a/llvm/lib/Transforms/Scalar/JumpThreading.cpp +++ b/llvm/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;      } | 

