[BranchFolding] Replace custom MachineInstr with MachineInstrExpressionTrait
authorBenjamin Kramer <benny.kra@googlemail.com>
Thu, 18 Jun 2015 20:00:03 +0000 (20:00 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Thu, 18 Jun 2015 20:00:03 +0000 (20:00 +0000)
While the hash functions are subtly different it shouldn't have an
impact. Instructions are checked with isIdenticalTo later.

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

lib/CodeGen/BranchFolding.cpp

index b8d9a1a29edc885dee30a98f57e278c61cd8af40..a884833d4715930589a0be655ba81d9b04cfb8f9 100644 (file)
@@ -264,54 +264,14 @@ bool BranchFolder::OptimizeFunction(MachineFunction &MF,
 //  Tail Merging of Blocks
 //===----------------------------------------------------------------------===//
 
-/// HashMachineInstr - Compute a hash value for MI and its operands.
-static unsigned HashMachineInstr(const MachineInstr *MI) {
-  unsigned Hash = MI->getOpcode();
-  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
-    const MachineOperand &Op = MI->getOperand(i);
-
-    // Merge in bits from the operand if easy.
-    unsigned OperandHash = 0;
-    switch (Op.getType()) {
-    case MachineOperand::MO_Register:          OperandHash = Op.getReg(); break;
-    case MachineOperand::MO_Immediate:         OperandHash = Op.getImm(); break;
-    case MachineOperand::MO_MachineBasicBlock:
-      OperandHash = Op.getMBB()->getNumber();
-      break;
-    case MachineOperand::MO_FrameIndex:
-    case MachineOperand::MO_ConstantPoolIndex:
-    case MachineOperand::MO_JumpTableIndex:
-      OperandHash = Op.getIndex();
-      break;
-    case MachineOperand::MO_GlobalAddress:
-    case MachineOperand::MO_ExternalSymbol:
-      // Global address / external symbol are too hard, don't bother, but do
-      // pull in the offset.
-      OperandHash = Op.getOffset();
-      break;
-    default: break;
-    }
-
-    Hash += ((OperandHash << 3) | Op.getType()) << (i&31);
-  }
-  return Hash;
-}
-
 /// HashEndOfMBB - Hash the last instruction in the MBB.
 static unsigned HashEndOfMBB(const MachineBasicBlock *MBB) {
-  MachineBasicBlock::const_iterator I = MBB->end();
-  if (I == MBB->begin())
-    return 0;   // Empty MBB.
-
-  --I;
-  // Skip debug info so it will not affect codegen.
-  while (I->isDebugValue()) {
-    if (I==MBB->begin())
-      return 0;      // MBB empty except for debug info.
-    --I;
-  }
-
-  return HashMachineInstr(I);
+  auto LastInst = MBB->getLastNonDebugInstr();
+  if (LastInst == MBB->end())
+    return 0;
+  // Hash the instruction and all operands. MachineInstrExpressionTrait ignores
+  // vreg defs when computing the hash but we're post-regalloc here.
+  return MachineInstrExpressionTrait::getHashValue(LastInst);
 }
 
 /// ComputeCommonTailLength - Given two machine basic blocks, compute the number