diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/llvm/CodeGen/MachineInstr.h | 65 | 
1 files changed, 65 insertions, 0 deletions
| diff --git a/include/llvm/CodeGen/MachineInstr.h b/include/llvm/CodeGen/MachineInstr.h index 66be26c..85ad26e 100644 --- a/include/llvm/CodeGen/MachineInstr.h +++ b/include/llvm/CodeGen/MachineInstr.h @@ -419,6 +419,71 @@ private:    void AddRegOperandsToUseLists(MachineRegisterInfo &RegInfo);  }; +/// MachineInstrExpressionTrait - Special DenseMapInfo traits to compare +/// MachineInstr* by *value* of the instruction rather than by pointer value. +/// The hashing and equality testing functions ignore definitions so this is +/// useful for CSE, etc. +struct MachineInstrExpressionTrait : DenseMapInfo<MachineInstr*> { +  static inline MachineInstr *getEmptyKey() { +    return 0; +  } + +  static inline MachineInstr *getTombstoneKey() { +    return reinterpret_cast<MachineInstr*>(-1); +  } + +  static unsigned getHashValue(const MachineInstr* const &MI) { +    unsigned Hash = MI->getOpcode() * 37; +    for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { +      const MachineOperand &MO = MI->getOperand(i); +      uint64_t Key = (uint64_t)MO.getType() << 32; +      switch (MO.getType()) { +        default: break; +        case MachineOperand::MO_Register: +          if (MO.isDef()) +            continue;  // Skip defs. +          Key |= MO.getReg(); +          break; +        case MachineOperand::MO_Immediate: +          Key |= MO.getImm(); +          break; +        case MachineOperand::MO_FrameIndex: +        case MachineOperand::MO_ConstantPoolIndex: +        case MachineOperand::MO_JumpTableIndex: +          Key |= MO.getIndex(); +          break; +        case MachineOperand::MO_MachineBasicBlock: +          Key |= DenseMapInfo<void*>::getHashValue(MO.getMBB()); +          break; +        case MachineOperand::MO_GlobalAddress: +          Key |= DenseMapInfo<void*>::getHashValue(MO.getGlobal()); +          break; +        case MachineOperand::MO_BlockAddress: +          Key |= DenseMapInfo<void*>::getHashValue(MO.getBlockAddress()); +          break; +      } +      Key += ~(Key << 32); +      Key ^= (Key >> 22); +      Key += ~(Key << 13); +      Key ^= (Key >> 8); +      Key += (Key << 3); +      Key ^= (Key >> 15); +      Key += ~(Key << 27); +      Key ^= (Key >> 31); +      Hash = (unsigned)Key + Hash * 37; +    } +    return Hash; +  } + +  static bool isEqual(const MachineInstr* const &LHS, +                      const MachineInstr* const &RHS) { +    if (RHS == getEmptyKey() || RHS == getTombstoneKey() || +        LHS == getEmptyKey() || LHS == getTombstoneKey()) +      return LHS == RHS; +    return LHS->isIdenticalTo(RHS, MachineInstr::IgnoreVRegDefs); +  } +}; +  //===----------------------------------------------------------------------===//  // Debugging Support | 
