summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Transforms/Scalar/EarlyCSE.cpp15
1 files changed, 9 insertions, 6 deletions
diff --git a/lib/Transforms/Scalar/EarlyCSE.cpp b/lib/Transforms/Scalar/EarlyCSE.cpp
index 61830e02d6..6c2ea39896 100644
--- a/lib/Transforms/Scalar/EarlyCSE.cpp
+++ b/lib/Transforms/Scalar/EarlyCSE.cpp
@@ -145,14 +145,13 @@ namespace {
}
static bool canHandle(Instruction *Inst) {
+ // Don't value number anything that returns void.
+ if (Inst->getType()->isVoidTy())
+ return false;
+
CallInst *CI = dyn_cast<CallInst>(Inst);
if (CI == 0 || !CI->onlyReadsMemory())
return false;
-
- // Check that there are no metadata operands.
- for (unsigned i = 0, e = CI->getNumOperands(); i != e; ++i)
- if (CI->getOperand(i)->getType()->isMetadataTy())
- return false;
return true;
}
};
@@ -179,8 +178,12 @@ unsigned DenseMapInfo<CallValue>::getHashValue(CallValue Val) {
Instruction *Inst = Val.Inst;
// Hash in all of the operands as pointers.
unsigned Res = 0;
- for (unsigned i = 0, e = Inst->getNumOperands(); i != e; ++i)
+ for (unsigned i = 0, e = Inst->getNumOperands(); i != e; ++i) {
+ assert(!Inst->getOperand(i)->getType()->isMetadataTy() &&
+ "Cannot value number calls with metadata operands");
Res ^= getHash(Inst->getOperand(i)) << i;
+ }
+
// Mix in the opcode.
return (Res << 1) ^ Inst->getOpcode();
}