Move the GET_SIDE_EFFECT_INFO logic from isInstructionTriviallyDead

to Instruction::mayWriteToMemory, fixing a FIXME, and helping
various places that call mayWriteToMemory directly.

llvm-svn: 40533
This commit is contained in:
Dan Gohman 2007-07-26 16:06:08 +00:00
parent eb47d9213c
commit 6e853bc73f
2 changed files with 12 additions and 11 deletions

View File

@ -175,13 +175,6 @@ bool llvm::isInstructionTriviallyDead(Instruction *I) {
if (!I->mayWriteToMemory()) return true;
if (CallInst *CI = dyn_cast<CallInst>(I))
if (Function *F = CI->getCalledFunction()) {
unsigned IntrinsicID = F->getIntrinsicID();
#define GET_SIDE_EFFECT_INFO
#include "llvm/Intrinsics.gen"
#undef GET_SIDE_EFFECT_INFO
}
return false;
}

View File

@ -197,6 +197,15 @@ bool Instruction::isSameOperationAs(Instruction *I) const {
return true;
}
// IntrinsicOnlyReadsMemory - Return true if the specified intrinsic doesn't
// have any side-effects or if it only reads memory.
static bool IntrinsicOnlyReadsMemory(unsigned IntrinsicID) {
#define GET_SIDE_EFFECT_INFO
#include "llvm/Intrinsics.gen"
#undef GET_SIDE_EFFECT_INFO
return false;
}
/// mayWriteToMemory - Return true if this instruction may modify memory.
///
bool Instruction::mayWriteToMemory() const {
@ -208,11 +217,10 @@ bool Instruction::mayWriteToMemory() const {
case Instruction::VAArg:
return true;
case Instruction::Call:
//if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(this)) {
if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(this)) {
// If the intrinsic doesn't write memory, it is safe.
// FIXME: this is obviously supposed to determine which intrinsics
// don't write to memory, but hasn't been implemented yet.
//}
return !IntrinsicOnlyReadsMemory(II->getIntrinsicID());
}
return true;
case Instruction::Load:
return cast<LoadInst>(this)->isVolatile();