Generalize isSafeToSpeculativelyExecute to work on arbitrary
authorDan Gohman <gohman@apple.com>
Wed, 4 Jan 2012 23:01:09 +0000 (23:01 +0000)
committerDan Gohman <gohman@apple.com>
Wed, 4 Jan 2012 23:01:09 +0000 (23:01 +0000)
Values, rather than just Instructions, since it's interesting
for ConstantExprs too.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147560 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/ValueTracking.h
lib/Analysis/ValueTracking.cpp

index 85c659c631b4fa6d11e1a6bc4ade8474605f29d8..300f51df372186713ebce223cfe35950ae1727a0 100644 (file)
@@ -174,7 +174,7 @@ namespace llvm {
   /// the correct dominance relationships for the operands and users hold.
   /// However, this method can return true for instructions that read memory;
   /// for such instructions, moving them may change the resulting value.
-  bool isSafeToSpeculativelyExecute(const Instruction *Inst,
+  bool isSafeToSpeculativelyExecute(const Value *V,
                                     const TargetData *TD = 0);
 
 } // end namespace llvm
index 6de4426ab823dd2462759858ad274f88b3c7ccb7..6cef42df9a2246725b27a25c23fe6fac412cfa80 100644 (file)
@@ -1879,8 +1879,12 @@ bool llvm::onlyUsedByLifetimeMarkers(const Value *V) {
   return true;
 }
 
-bool llvm::isSafeToSpeculativelyExecute(const Instruction *Inst,
+bool llvm::isSafeToSpeculativelyExecute(const Value *V,
                                         const TargetData *TD) {
+  const Operator *Inst = dyn_cast<Operator>(V);
+  if (!Inst)
+    return false;
+
   for (unsigned i = 0, e = Inst->getNumOperands(); i != e; ++i)
     if (Constant *C = dyn_cast<Constant>(Inst->getOperand(i)))
       if (C->canTrap())