From 3d378e625cf686ede7b1dfa8fd8a7bd1c174d087 Mon Sep 17 00:00:00 2001 From: NAKAMURA Takumi Date: Sat, 20 Jun 2015 06:21:48 +0000 Subject: [PATCH] Revert r240040, "[BranchFolding] Replace custom MachineInstr with MachineInstrExpressionTrait" 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 | 52 +++++++++++++++++++++++++++++++---- 1 file changed, 46 insertions(+), 6 deletions(-) diff --git a/lib/CodeGen/BranchFolding.cpp b/lib/CodeGen/BranchFolding.cpp index 42bf9343c99..4d4c2fe1a92 100644 --- a/lib/CodeGen/BranchFolding.cpp +++ b/lib/CodeGen/BranchFolding.cpp @@ -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 -- 2.34.1