Move the GET_SIDE_EFFECT_INFO logic from isInstructionTriviallyDead
[oota-llvm.git] / lib / VMCore / Instruction.cpp
index feff59dff9f12483e9a8285b83d843260cbdd29f..a3687530de9b69a69e251fda3da08f145f39f4ad 100644 (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();