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;
99 if (
auto *GVar = dyn_cast<GlobalVariable>(GV))
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
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...
unsigned const TargetRegisterInfo * TRI
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
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.
This class represents an Operation in the Expression.
StringRef getName() const
getName - Get the symbol name.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Representation of each machine instruction.
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
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.
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...
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.
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.
stable_hash stableHashValue(const MachineOperand &MO)
stable_hash stable_hash_name(StringRef Name)
stable_hash stable_hash_combine(ArrayRef< stable_hash > Buffer)
stable_hash StructuralHash(const Function &F, bool DetailedHash=false)
Returns a hash of the function F.