28#include "llvm/Config/llvm-config.h" 
   36#define DEBUG_TYPE "machine-stable-hash" 
   41          "Number of encountered unsupported MachineOperands that were " 
   42          "MachineBasicBlocks while computing stable hashes");
 
   44          "Number of encountered unsupported MachineOperands that were " 
   45          "ConstantPoolIndex while computing stable hashes");
 
   47          "Number of encountered unsupported MachineOperands that were " 
   48          "TargetIndex with no name");
 
   50          "Number of encountered unsupported MachineOperands that were " 
   51          "GlobalAddress while computing stable hashes");
 
   53          "Number of encountered unsupported MachineOperands that were " 
   54          "BlockAddress while computing stable hashes");
 
   56          "Number of encountered unsupported MachineOperands that were " 
   57          "Metadata of an unsupported kind while computing stable hashes");
 
   65      for (
auto &Def : 
MRI.def_instructions(MO.
getReg()))
 
   85    ++StableHashBailingMachineBasicBlock;
 
   88    ++StableHashBailingConstantPoolIndex;
 
   91    ++StableHashBailingBlockAddress;
 
   94    ++StableHashBailingMetadataUnsupported;
 
  103        ++StableHashBailingGlobalAddress;
 
  117    ++StableHashBailingTargetIndexNoName;
 
  137          unsigned RegMaskSize =
 
  140          std::vector<llvm::stable_hash> RegMaskHashes(RegMask,
 
  141                                                       RegMask + RegMaskSize);
 
  148    assert(0 && 
"MachineOperand not associated with any MachineFunction");
 
  153    std::vector<llvm::stable_hash> ShuffleMaskHashes;
 
 
  188                                  bool HashConstantPoolIndices,
 
  189                                  bool HashMemOperands) {
 
  192  HashComponents.
reserve(
MI.getNumOperands() + 
MI.getNumMemOperands() + 2);
 
  196    if (!HashVRegs && MO.isReg() && MO.isDef() && MO.getReg().isVirtual())
 
  201          MO.getType(), MO.getTargetFlags(), MO.getIndex()));
 
  211  for (
const auto *
Op : 
MI.memoperands()) {
 
  212    if (!HashMemOperands)
 
  214    HashComponents.
push_back(
static_cast<unsigned>(
Op->getSize().getValue()));
 
  215    HashComponents.
push_back(
static_cast<unsigned>(
Op->getFlags()));
 
  216    HashComponents.
push_back(
static_cast<unsigned>(
Op->getOffset()));
 
  217    HashComponents.
push_back(
static_cast<unsigned>(
Op->getSuccessOrdering()));
 
  218    HashComponents.
push_back(
static_cast<unsigned>(
Op->getAddrSpace()));
 
  219    HashComponents.
push_back(
static_cast<unsigned>(
Op->getSyncScopeID()));
 
  220    HashComponents.
push_back(
static_cast<unsigned>(
Op->getBaseAlign().value()));
 
  221    HashComponents.
push_back(
static_cast<unsigned>(
Op->getFailureOrdering()));
 
 
  230  for (
const auto &
MI : 
MBB)
 
 
  238  for (
const auto &
MBB : MF)
 
 
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Register const TargetRegisterInfo * TRI
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
APInt bitcastToAPInt() const
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
const APFloat & getValueAPF() const
const APInt & getValue() const
Return the constant as an APInt value reference.
StringRef getName() const
getName - Get the symbol name.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Representation of each machine instruction.
LLVM_ABI const MachineFunction * getMF() const
Return the function that contains the basic block that this instruction belongs to.
MachineOperand class - Representation of each machine instruction operand.
unsigned getSubReg() const
unsigned getInstrRefOpIndex() const
const GlobalValue * getGlobal() const
const ConstantInt * getCImm() const
LLVM_ABI const char * getTargetIndexName() const
getTargetIndexName - If this MachineOperand is a TargetIndex that has a name, attempt to get the name...
bool isCImm() const
isCImm - Test if this is a MO_CImmediate operand.
unsigned getInstrRefInstrIndex() const
ArrayRef< int > getShuffleMask() const
unsigned getCFIIndex() const
MachineInstr * getParent()
getParent - Return the instruction that this operand belongs to.
static unsigned getRegMaskSize(unsigned NumRegs)
Returns number of elements needed for a regmask array.
unsigned getTargetFlags() const
MachineOperandType getType() const
getType - Returns the MachineOperandType for this operand.
const char * getSymbolName() const
Register getReg() const
getReg - Returns the register number.
Intrinsic::ID getIntrinsicID() const
const uint32_t * getRegMask() const
getRegMask - Returns a bit mask of registers preserved by this RegMask operand.
const ConstantFP * getFPImm() const
unsigned getPredicate() const
MCSymbol * getMCSymbol() const
@ MO_CFIIndex
MCCFIInstruction index.
@ MO_Immediate
Immediate operand.
@ MO_ConstantPoolIndex
Address of indexed Constant in Constant Pool.
@ MO_MCSymbol
MCSymbol reference (for debug/eh info)
@ MO_Predicate
Generic predicate for ISel.
@ MO_GlobalAddress
Address of a global value.
@ MO_RegisterMask
Mask of preserved registers.
@ MO_ShuffleMask
Other IR Constant for ISel (shuffle masks)
@ MO_CImmediate
Immediate >64bit operand.
@ MO_BlockAddress
Address of a basic block.
@ MO_DbgInstrRef
Integer indices referring to an instruction+operand.
@ MO_MachineBasicBlock
MachineBasicBlock reference.
@ MO_FrameIndex
Abstract Stack Frame Index.
@ MO_Register
Register operand.
@ MO_ExternalSymbol
Name of external global symbol.
@ MO_IntrinsicID
Intrinsic ID for ISel.
@ MO_JumpTableIndex
Address of indexed Jump Table for switch.
@ MO_TargetIndex
Target-dependent index+offset operand.
@ MO_Metadata
Metadata reference (for debug info)
@ MO_FPImmediate
Floating-point immediate operand.
@ MO_RegisterLiveOut
Mask of live-out registers.
int64_t getOffset() const
Return the offset from the symbol in this operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
constexpr unsigned id() const
void reserve(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
uint64_t stable_hash
An opaque object representing a stable hash code.
OutputIt transform(R &&Range, OutputIt d_first, UnaryFunction F)
Wrapper function around std::transform to apply a function to a range and store the result elsewhere.
LLVM_ABI stable_hash stableHashValue(const MachineOperand &MO)
stable_hash stable_hash_name(StringRef Name)
DWARFExpression::Operation Op
stable_hash stable_hash_combine(ArrayRef< stable_hash > Buffer)
LLVM_ABI stable_hash StructuralHash(const Function &F, bool DetailedHash=false)
Returns a hash of the function F.