diff options
Diffstat (limited to 'lib/IR/Instruction.cpp')
| -rw-r--r-- | lib/IR/Instruction.cpp | 16 | 
1 files changed, 15 insertions, 1 deletions
diff --git a/lib/IR/Instruction.cpp b/lib/IR/Instruction.cpp index 5f2a6146ad818..508db9bcaf193 100644 --- a/lib/IR/Instruction.cpp +++ b/lib/IR/Instruction.cpp @@ -12,6 +12,7 @@  //===----------------------------------------------------------------------===//  #include "llvm/IR/Instruction.h" +#include "llvm/IR/IntrinsicInst.h"  #include "llvm/ADT/DenseSet.h"  #include "llvm/IR/Constants.h"  #include "llvm/IR/Instructions.h" @@ -589,6 +590,18 @@ bool Instruction::mayThrow() const {    return isa<ResumeInst>(this);  } +bool Instruction::isSafeToRemove() const { +  return (!isa<CallInst>(this) || !this->mayHaveSideEffects()) && +         !isa<TerminatorInst>(this); +} + +const Instruction *Instruction::getNextNonDebugInstruction() const { +  for (const Instruction *I = getNextNode(); I; I = I->getNextNode()) +    if (!isa<DbgInfoIntrinsic>(I)) +      return I; +  return nullptr; +} +  bool Instruction::isAssociative() const {    unsigned Opcode = getOpcode();    if (isAssociative(Opcode)) @@ -597,7 +610,8 @@ bool Instruction::isAssociative() const {    switch (Opcode) {    case FMul:    case FAdd: -    return cast<FPMathOperator>(this)->isFast(); +    return cast<FPMathOperator>(this)->hasAllowReassoc() && +           cast<FPMathOperator>(this)->hasNoSignedZeros();    default:      return false;    }  | 
