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;
}
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 {
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();