Revert r240040, "[BranchFolding] Replace custom MachineInstr with MachineInstrExpress...
authorNAKAMURA Takumi <geek4civic@gmail.com>
Sat, 20 Jun 2015 06:21:48 +0000 (06:21 +0000)
committerNAKAMURA Takumi <geek4civic@gmail.com>
Sat, 20 Jun 2015 06:21:48 +0000 (06:21 +0000)
It caused different emission between stage2 and stage3. Investigating.

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

lib/CodeGen/BranchFolding.cpp

index 42bf9343c99ca667789a41f56d2fa30809fb9f37..4d4c2fe1a92fdf28e27215162d8d02d0416d2b7f 100644 (file)
@@ -264,14 +264,54 @@ 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) {
-  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);
+  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);
 }
 
 /// ComputeCommonTailLength - Given two machine basic blocks, compute the number