1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-02-01 13:11:39 +01:00

stength reduce my previous patch a bit. The only instructions

that are allowed to have metadata operands are intrinsic calls,
and the only ones that take metadata currently return void.
Just reject all void instructions, which should not be value
numbered anyway.  To future proof things, add an assert to the
getHashValue impl for calls to check that metadata operands 
aren't present.

llvm-svn: 122759
This commit is contained in:
Chris Lattner 2011-01-03 18:43:03 +00:00
parent 9f81cc5372
commit 5b5347fde6

View File

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