DCE intrinsic instructions without side effects.
authorChris Lattner <sabre@nondot.org>
Fri, 6 May 2005 05:27:34 +0000 (05:27 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 6 May 2005 05:27:34 +0000 (05:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21719 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/Local.cpp

index 4d141533b889e0d2e7c9b87f68f1298a3d3cc3dd..0ed669643e5734582411a51e9ad52dabc79d6895 100644 (file)
@@ -373,7 +373,26 @@ Constant *llvm::ConstantFoldCall(Function *F,
 //
 
 bool llvm::isInstructionTriviallyDead(Instruction *I) {
-  return I->use_empty() && !I->mayWriteToMemory() && !isa<TerminatorInst>(I);
+  if (!I->use_empty() || isa<TerminatorInst>(I)) return false;
+  if (!I->mayWriteToMemory()) return true;
+
+  if (CallInst *CI = dyn_cast<CallInst>(I))
+    if (Function *F = CI->getCalledFunction())
+      switch (F->getIntrinsicID()) {
+      default: break;
+      case Intrinsic::vastart:
+      case Intrinsic::vacopy:
+      case Intrinsic::returnaddress:
+      case Intrinsic::frameaddress:
+      case Intrinsic::isunordered:
+      case Intrinsic::ctpop:
+      case Intrinsic::ctlz:
+      case Intrinsic::cttz:
+      case Intrinsic::sqrt:
+        return true;             // These intrinsics have no side effects.
+      }
+  return false;
 }
 
 // dceInstruction - Inspect the instruction at *BBI and figure out if it's