[llvm-commits] [PATCH] Make EarlyCSE understand commutativity

Chris Lattner clattner at apple.com
Mon Oct 1 22:51:17 PDT 2012


On Oct 1, 2012, at 1:14 PM, Michael Ilseman <milseman at apple.com> wrote:
> I could also swap based on the addresses of the operands, which is how GVN does it. Swapping itself would still change execution to execution, but it will be consistent within a single execution.

I think that this is the right way to go.  The code in EarlyCSE should stay really simple, and I don't like the idea of adding yet-another expression abstraction that has to stay up to date with the IR as we add new things to it.


What I'm suggesting is that the hashing code can look like (psuedo code obviously):

unsigned DenseMapInfo<SimpleValue>::getHashValue(SimpleValue Val) {
  Instruction *Inst = Val.Inst;

  // Hash in all of the operands as pointers.
  bool Swapped = false;
  if (isa<BinaryOperator>(Inst) && Inst->isCommutative() && Inst->getOperand(0) > Inst->getOperand(1)) {
    Inst->swapOperands();
    Swapped = true;
  }

  unsigned Res = 0;
  for (unsigned i = 0, e = Inst->getNumOperands(); i != e; ++i)
    Res ^= getHash(Inst->getOperand(i)) << (i & 0xF);

 ...

  // Mix in the opcode.
  Res = (Res << 1) ^ Inst->getOpcode();

  if (Swapped) Inst->swapOperands();
  return Res;
}

Similarly for compares.

Of course, it would be much better to avoid actually swapping the operands, and I don't think it would make the code any more complex to do that.

-Chris




More information about the llvm-commits mailing list