[llvm-commits] [llvm] r122720 - in /llvm/trunk/lib/Transforms/Scalar: EarlyCSE.cpp LoopIdiomRecognize.cpp

Nick Lewycky nicholas at mxc.ca
Sun Jan 2 18:15:23 PST 2011


On 01/02/2011 05:46 PM, Chris Lattner wrote:
>
> On Jan 2, 2011, at 5:21 PM, Nick Lewycky wrote:
>
>>> +           "Invalid/unknown instruction");
>>>     }
>>> -
>>> +
>>> +  // Mix in the opcode.
>>>     return (Res<<   1) ^ Inst->getOpcode();
>>
>> Chris, did you consider using a FoldingSetNodeID to calculate your hash?
>> I think it would end up cleaner.
>
> How would it help?

Mostly it just hides the hashing math. You'd end up with:

   unsigned DenseMapInfo<InstValue>::getHashValue(InstValue Val) {
     FoldingSetNodeID Res;
     for (unsigned i = 0, e = Inst->getNumOperands(); i != e; ++i)
       Res.AddPointer(Inst->getOperand(i));

     if (CastInst *CI = dyn_cast<CastInst>(Inst))
       Res.AddPointer(CI->getType());
     else if (CmpInst *CI = dyn_cast<CmpInst>(Inst))
       Res.AddInteger(CI->getPredicate());
     else if (const ExtractValueInst *EVI = 
dyn_cast<ExtractValueInst>(Inst)) {
       for (ExtractValueInst::idx_iterator I = EVI->idx_begin(),
            E = EVI->idx_end(); I != E; ++I)
         Res.AddInteger(*I);
     } else if (const InsertValueInst *IVI = 
dyn_cast<InsertValueInst>(Inst)) {
       for (InsertValueInst::idx_iterator I = IVI->idx_begin(),
            E = IVI->idx_end(); I != E; ++I)
         Res.AddInteger(*I);
   [...]
     Res.AddInteger(I->getOpcode());
     return Res.ComputeHash();
   }

It's nice in that you don't have to worry about how much you're shifting 
and whether you're going to be mixing the bits properly, etc. It doesn't 
do anything to reduce the number of lines.

Nick



More information about the llvm-commits mailing list