diff --git a/llvm/include/llvm/CodeGen/MachineFunctionPass.h b/llvm/include/llvm/CodeGen/MachineFunctionPass.h --- a/llvm/include/llvm/CodeGen/MachineFunctionPass.h +++ b/llvm/include/llvm/CodeGen/MachineFunctionPass.h @@ -73,6 +73,10 @@ const std::string &Banner) const override; bool runOnFunction(Function &F) override; + +#ifdef EXPENSIVE_CHECKS + uint64_t structuralHash(Function &F) const override; +#endif }; } // End llvm namespace diff --git a/llvm/lib/CodeGen/MachineFunctionPass.cpp b/llvm/lib/CodeGen/MachineFunctionPass.cpp --- a/llvm/lib/CodeGen/MachineFunctionPass.cpp +++ b/llvm/lib/CodeGen/MachineFunctionPass.cpp @@ -22,10 +22,15 @@ #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineModuleInfo.h" #include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h" +#include "llvm/CodeGen/MachineStableHash.h" #include "llvm/CodeGen/Passes.h" #include "llvm/IR/Dominators.h" #include "llvm/IR/Function.h" +#ifdef EXPENSIVE_CHECKS +#include "llvm/IR/StructuralHash.h" +#endif + using namespace llvm; using namespace ore; @@ -121,3 +126,14 @@ FunctionPass::getAnalysisUsage(AU); } + +#ifdef EXPENSIVE_CHECKS +uint64_t MachineFunctionPass::structuralHash(Function &F) const { + uint64_t Hash = StructuralHash(F); + MachineModuleInfo &MMI = getAnalysis().getMMI(); + MachineFunction *MF = MMI.getMachineFunction(F); + if (MF) + Hash = stable_hash_combine(Hash, stableHashValue(*MF)); + return Hash; +} +#endif