[flang-commits] [clang] [flang] [llvm] [mlir] [polly] Revert "[IR] Use persistent metadata IDs for printing" (PR #220334)
Yaxun Liu via flang-commits
flang-commits at lists.llvm.org
Tue Sep 1 11:54:31 PDT 2026
https://github.com/yxsamliu updated https://github.com/llvm/llvm-project/pull/220334
>From d89dcdbaffbdc1a83ec62c29c7400baec3460ade Mon Sep 17 00:00:00 2001
From: "Yaxun (Sam) Liu" <yaxun.liu at amd.com>
Date: Tue, 1 Sep 2026 18:45:47 +0000
Subject: [PATCH] Revert "[IR] Use persistent metadata IDs for printing"
This reverts commit 85e903099313aa5ea98d175698aaa40e27a0d743.
The change breaks MSVC builds because an inline SmallPtrSet operation
requires a complete DILocation type. It also causes expensive-check
builds to report that the DXIL pretty-printer modifies its input
without reporting it.
Revert while fixes and test coverage are prepared.
Buildbot failure: https://lab.llvm.org/buildbot/#/builders/2/builds/60795
Buildbot failure: https://lab.llvm.org/buildbot/#/builders/187/builds/23268
---
clang/lib/CodeGen/BackendUtil.cpp | 7 +-
clang/tools/cir-translate/cir-translate.cpp | 1 -
.../clang-fuzzer/handle-llvm/handle_llvm.cpp | 5 +-
.../clang-import-test/clang-import-test.cpp | 4 +-
.../include/flang/Optimizer/CodeGen/CodeGen.h | 8 +-
flang/lib/Frontend/FrontendActions.cpp | 6 +-
.../llvm/CodeGen/MachineModuleSlotTracker.h | 25 +-
llvm/include/llvm/IR/IRPrintingPasses.h | 5 -
llvm/include/llvm/IR/Metadata.h | 10 +-
llvm/include/llvm/IR/Module.h | 5 -
llvm/include/llvm/IR/ModuleSlotTracker.h | 52 +--
.../include/llvm/IRPrinter/IRPrintingPasses.h | 7 +-
llvm/lib/CodeGen/MIRParser/MIParser.cpp | 4 +-
llvm/lib/CodeGen/MIRPrintingPass.cpp | 16 -
llvm/lib/CodeGen/MachineBasicBlock.cpp | 2 +-
llvm/lib/CodeGen/MachineModuleSlotTracker.cpp | 111 +++--
llvm/lib/CodeGen/MachineOperand.cpp | 2 +-
llvm/lib/IR/AsmWriter.cpp | 412 ++++++++----------
llvm/lib/IR/Core.cpp | 2 -
llvm/lib/IR/IRPrintingPasses.cpp | 71 ++-
llvm/lib/IR/LLVMContextImpl.cpp | 9 -
llvm/lib/IR/LLVMContextImpl.h | 18 -
llvm/lib/IR/Metadata.cpp | 17 -
llvm/lib/IR/MetadataImpl.h | 2 -
llvm/lib/IR/SSAContext.cpp | 2 +-
llvm/lib/IRPrinter/IRPrintingPasses.cpp | 20 +-
llvm/lib/Target/DirectX/DXILPrettyPrinter.cpp | 106 +----
.../DirectX/DebugInfo/di-globalvariable.ll | 7 -
llvm/test/CodeGen/Hexagon/swp-no-alias.mir | 8 +-
llvm/test/CodeGen/MIR/AMDGPU/instr-mmra.mir | 2 +-
.../CodeGen/MIR/AMDGPU/machine-metadata.mir | 12 +-
.../MIR/X86/instr-heap-alloc-operands.mir | 2 +-
.../test/CodeGen/MIR/X86/instr-pcsections.mir | 2 +-
.../MIR/X86/instructions-debug-location.mir | 14 +-
.../test/CodeGen/MIR/X86/machine-metadata.mir | 36 +-
llvm/test/CodeGen/MIR/X86/mem-cache-hint.mir | 4 +-
llvm/test/CodeGen/MIR/X86/memory-operands.mir | 10 +-
.../CodeGen/MIR/X86/metadata-operands.mir | 2 +-
llvm/test/CodeGen/MIR/X86/pr38773.mir | 4 +-
.../MIR/X86/stack-object-debug-info.mir | 4 +-
.../AArch64/no-dbg-value-after-terminator.mir | 2 +-
.../legacy-callgraph-scc-pass-printer.ll | 13 +-
.../print-changed-persistent-metadata-ids.ll | 77 ----
.../Other/print-persistent-metadata-ids.ll | 94 ----
.../Inputs/loop-distribute.ll.expected | 6 +-
.../IR/01-ir-print-basic-details.test | 22 +-
.../IR/01-ir-select-logical-elements.test | 16 +-
.../IR/02-ir-logical-lines.test | 4 +-
.../IR/06-ir-full-logical-view.test | 22 +-
llvm/tools/llvm-dis/llvm-dis.cpp | 1 -
llvm/tools/llvm-extract/llvm-extract.cpp | 6 +-
llvm/tools/llvm-link/llvm-link.cpp | 1 -
llvm/tools/llvm-reduce/ReducerWorkItem.cpp | 9 +-
llvm/tools/llvm-split/llvm-split.cpp | 7 +-
llvm/tools/llvm-stress/llvm-stress.cpp | 1 -
llvm/tools/opt/NewPMDriver.cpp | 3 +-
llvm/tools/opt/optdriver.cpp | 7 +-
.../verify-uselistorder.cpp | 9 +-
llvm/unittests/AsmParser/AsmParserTest.cpp | 33 --
llvm/unittests/IR/AsmWriterTest.cpp | 124 ------
llvm/unittests/IR/MetadataTest.cpp | 18 +-
llvm/unittests/IR/ModuleTest.cpp | 55 ---
llvm/unittests/MIR/MachineMetadata.cpp | 107 ++---
mlir/lib/Target/LLVMIR/ConvertToLLVMIR.cpp | 1 -
.../Target/LLVMIR/Import/import-failure.ll | 24 +-
polly/test/ForwardOpTree/atax.ll | 16 +-
polly/test/ForwardOpTree/jacobi-1d.ll | 8 +-
...eserve-equiv-class-order-in-basic_block.ll | 4 +-
.../stmt_split_exit_of_region_stmt.ll | 2 +-
.../ScopInfo/stmt_split_no_after_split.ll | 2 +-
.../test/ScopInfo/stmt_split_no_dependence.ll | 2 +-
.../stmt_split_phi_in_beginning_bb.ll | 2 +-
polly/test/ScopInfo/stmt_split_phi_in_stmt.ll | 2 +-
.../ScopInfo/stmt_split_scalar_dependence.ll | 2 +-
polly/test/ScopInfo/stmt_split_within_loop.ll | 2 +-
75 files changed, 504 insertions(+), 1236 deletions(-)
delete mode 100644 llvm/test/Other/print-changed-persistent-metadata-ids.ll
delete mode 100644 llvm/test/Other/print-persistent-metadata-ids.ll
diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp
index 086f886be4390..6aa6bc1bd41e8 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -1166,8 +1166,7 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
*OS, ThinLinkOS ? &ThinLinkOS->os() : nullptr));
} else if (Action == Backend_EmitLL) {
MPM.addPass(PrintModulePass(*OS, "", CodeGenOpts.EmitLLVMUseLists,
- /*EmitLTOSummary=*/true,
- /*ShouldRenumberMetadata=*/true));
+ /*EmitLTOSummary=*/true));
}
} else {
// Emit a module summary by default for Regular LTO except for ld64
@@ -1185,8 +1184,7 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
EmitLTOSummary));
} else if (Action == Backend_EmitLL) {
MPM.addPass(PrintModulePass(*OS, "", CodeGenOpts.EmitLLVMUseLists,
- EmitLTOSummary,
- /*ShouldRenumberMetadata=*/true));
+ EmitLTOSummary));
}
}
@@ -1458,7 +1456,6 @@ runThinLTOBackend(CompilerInstance &CI, ModuleSummaryIndex *CombinedIndex,
break;
case Backend_EmitLL:
Conf.PreCodeGenModuleHook = [&](size_t Task, const llvm::Module &Mod) {
- M->renumberMetadataForAssembly();
M->print(*OS, nullptr, CGOpts.EmitLLVMUseLists);
return false;
};
diff --git a/clang/tools/cir-translate/cir-translate.cpp b/clang/tools/cir-translate/cir-translate.cpp
index a58512e3fca22..4452741d7433e 100644
--- a/clang/tools/cir-translate/cir-translate.cpp
+++ b/clang/tools/cir-translate/cir-translate.cpp
@@ -165,7 +165,6 @@ void registerToLLVMTranslation() {
enableOpenMP);
if (!llvmModule)
return mlir::failure();
- llvmModule->renumberMetadataForAssembly();
llvmModule->print(output, nullptr);
return mlir::success();
},
diff --git a/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp b/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp
index 1c745bffe00c0..942e35c30e19f 100644
--- a/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp
+++ b/clang/tools/clang-fuzzer/handle-llvm/handle_llvm.cpp
@@ -103,10 +103,7 @@ static void RunOptimizationPasses(raw_ostream &OS, Module &M,
PB.crossRegisterProxies(LAM, FAM, CGAM, MAM);
ModulePassManager MPM = PB.buildPerModuleDefaultPipeline(OL);
- MPM.addPass(PrintModulePass(OS, /*Banner=*/"",
- /*ShouldPreserveUseListOrder=*/false,
- /*EmitSummaryIndex=*/false,
- /*ShouldRenumberMetadata=*/true));
+ MPM.addPass(PrintModulePass(OS));
MPM.run(M, MAM);
}
diff --git a/clang/tools/clang-import-test/clang-import-test.cpp b/clang/tools/clang-import-test/clang-import-test.cpp
index bcb5d2bdb8952..8e83687d3e96a 100644
--- a/clang/tools/clang-import-test/clang-import-test.cpp
+++ b/clang/tools/clang-import-test/clang-import-test.cpp
@@ -338,10 +338,8 @@ llvm::Expected<CIAndOrigins> Parse(const std::string &Path,
if (llvm::Error PE = ParseSource(Path, CI.getCompilerInstance(), Consumers))
return std::move(PE);
CI.getDiagnosticClient().EndSourceFile();
- if (ShouldDumpIR) {
- CG.GetModule()->renumberMetadataForAssembly();
+ if (ShouldDumpIR)
CG.GetModule()->print(llvm::outs(), nullptr);
- }
if (CI.getDiagnosticClient().getNumErrors())
return llvm::make_error<llvm::StringError>(
"Errors occurred while parsing the expression.", std::error_code());
diff --git a/flang/include/flang/Optimizer/CodeGen/CodeGen.h b/flang/include/flang/Optimizer/CodeGen/CodeGen.h
index 6ef575f5391d9..1d36788fb84f9 100644
--- a/flang/include/flang/Optimizer/CodeGen/CodeGen.h
+++ b/flang/include/flang/Optimizer/CodeGen/CodeGen.h
@@ -90,11 +90,9 @@ using LLVMIRLoweringPrinter =
/// Convert the LLVM IR dialect to LLVM-IR proper
std::unique_ptr<mlir::Pass> createLLVMDialectToLLVMPass(
- llvm::raw_ostream &output, LLVMIRLoweringPrinter printer =
- [](llvm::Module &m, llvm::raw_ostream &out) {
- m.renumberMetadataForAssembly();
- m.print(out, nullptr);
- });
+ llvm::raw_ostream &output,
+ LLVMIRLoweringPrinter printer =
+ [](llvm::Module &m, llvm::raw_ostream &out) { m.print(out, nullptr); });
/// Populate the given list with patterns that convert from FIR to LLVM.
void populateFIRToLLVMConversionPatterns(
diff --git a/flang/lib/Frontend/FrontendActions.cpp b/flang/lib/Frontend/FrontendActions.cpp
index 108b1b4559d48..35e0e4004d9a0 100644
--- a/flang/lib/Frontend/FrontendActions.cpp
+++ b/flang/lib/Frontend/FrontendActions.cpp
@@ -1094,9 +1094,9 @@ void CodeGenAction::runOptimizationPipeline(llvm::raw_pwrite_stream &os) {
os, /*ShouldPreserveUseListOrder=*/false, emitSummary));
}
} else if (action == BackendActionTy::Backend_EmitLL) {
- mpm.addPass(llvm::PrintModulePass(
- os, /*Banner=*/"", /*ShouldPreserveUseListOrder=*/false, emitSummary,
- /*ShouldRenumberMetadata=*/true));
+ mpm.addPass(llvm::PrintModulePass(os, /*Banner=*/"",
+ /*ShouldPreserveUseListOrder=*/false,
+ emitSummary));
}
}
diff --git a/llvm/include/llvm/CodeGen/MachineModuleSlotTracker.h b/llvm/include/llvm/CodeGen/MachineModuleSlotTracker.h
index 1cb15f9cc172d..666b3caf67e27 100644
--- a/llvm/include/llvm/CodeGen/MachineModuleSlotTracker.h
+++ b/llvm/include/llvm/CodeGen/MachineModuleSlotTracker.h
@@ -10,13 +10,12 @@
#define LLVM_CODEGEN_MACHINEMODULESLOTTRACKER_H
#include "llvm/ADT/STLFunctionalExtras.h"
-#include "llvm/ADT/SmallPtrSet.h"
-#include "llvm/ADT/SmallVector.h"
#include "llvm/IR/ModuleSlotTracker.h"
#include "llvm/Support/Compiler.h"
namespace llvm {
+class AbstractSlotTrackerStorage;
class Function;
class MachineModuleInfo;
class MachineFunction;
@@ -25,24 +24,24 @@ class Module;
using MFGetterFnT = function_ref<MachineFunction *(const Function &)>;
class LLVM_ABI MachineModuleSlotTracker : public ModuleSlotTracker {
+ const Function &TheFunction;
const MachineFunction *TheMF;
- MachineMDNodeListType MachineMDNodes;
- SmallPtrSet<const DILocation *, 4> InlineDebugLocations;
+ unsigned MDNStartSlot = 0, MDNEndSlot = 0;
- void collectMachineFunctionMetadata(
- SmallVectorImpl<const MDNode *> &Metadata, const MachineFunction &MF,
- SmallVectorImpl<const MDNode *> *DebugLocations = nullptr) const;
+ void processMachineFunctionMetadata(AbstractSlotTrackerStorage *AST,
+ const MachineFunction &MF);
+ void processMachineModule(AbstractSlotTrackerStorage *AST, const Module *M,
+ bool ShouldInitializeAllMetadata);
+ void processMachineFunction(AbstractSlotTrackerStorage *AST,
+ const Function *F,
+ bool ShouldInitializeAllMetadata);
public:
- MachineModuleSlotTracker(MFGetterFnT Fn, const MachineFunction *MF);
+ MachineModuleSlotTracker(MFGetterFnT Fn, const MachineFunction *MF,
+ bool ShouldInitializeAllMetadata = true);
~MachineModuleSlotTracker() override;
- /// Renumber module and machine metadata for canonical MIR output.
- void renumberMetadataForAssembly();
void collectMachineMDNodes(MachineMDNodeListType &L) const;
- bool shouldPrintDebugLocationInline(const DILocation *DL) const override {
- return InlineDebugLocations.contains(DL);
- }
};
} // namespace llvm
diff --git a/llvm/include/llvm/IR/IRPrintingPasses.h b/llvm/include/llvm/IR/IRPrintingPasses.h
index 0eb60f55f74c3..1b2d38d6190e9 100644
--- a/llvm/include/llvm/IR/IRPrintingPasses.h
+++ b/llvm/include/llvm/IR/IRPrintingPasses.h
@@ -31,11 +31,6 @@ LLVM_ABI ModulePass *
createPrintModulePass(raw_ostream &OS, const std::string &Banner = "",
bool ShouldPreserveUseListOrder = false);
-LLVM_ABI ModulePass *createPrintModulePass(raw_ostream &OS,
- const std::string &Banner,
- bool ShouldPreserveUseListOrder,
- bool ShouldRenumberMetadata);
-
/// Create and return a pass that prints functions to the specified
/// \c raw_ostream as they are processed.
LLVM_ABI FunctionPass *createPrintFunctionPass(raw_ostream &OS,
diff --git a/llvm/include/llvm/IR/Metadata.h b/llvm/include/llvm/IR/Metadata.h
index a53cb63ed59cf..5b458fa14f0b1 100644
--- a/llvm/include/llvm/IR/Metadata.h
+++ b/llvm/include/llvm/IR/Metadata.h
@@ -1079,11 +1079,11 @@ class MDNode : public Metadata {
/// Explicity set alignment because bitfields by default have an
/// alignment of 1 on z/OS.
struct alignas(alignof(size_t)) Header {
- uint32_t IsResizable : 1;
- uint32_t IsLarge : 1;
- uint32_t SmallSize : 4;
- uint32_t SmallNumOps : 4;
- uint32_t MetadataPrintID;
+ size_t IsResizable : 1;
+ size_t IsLarge : 1;
+ size_t SmallSize : 4;
+ size_t SmallNumOps : 4;
+ size_t : sizeof(size_t) * CHAR_BIT - 10;
unsigned NumUnresolved = 0;
using LargeStorageVector = SmallVector<MDOperand, 0>;
diff --git a/llvm/include/llvm/IR/Module.h b/llvm/include/llvm/IR/Module.h
index 1b22ac79f2d51..6090644f7a12f 100644
--- a/llvm/include/llvm/IR/Module.h
+++ b/llvm/include/llvm/IR/Module.h
@@ -987,11 +987,6 @@ class LLVM_ABI Module {
bool ShouldPreserveUseListOrder = false,
bool IsForDebug = false) const;
- /// Renumber the IDs stored in metadata nodes into canonical assembly order.
- /// This mutates the IDs and should only be used immediately before final
- /// assembly output.
- void renumberMetadataForAssembly();
-
/// Dump the module to stderr (for debugging).
void dump() const;
diff --git a/llvm/include/llvm/IR/ModuleSlotTracker.h b/llvm/include/llvm/IR/ModuleSlotTracker.h
index b92bd16084b06..a3882a81e1177 100644
--- a/llvm/include/llvm/IR/ModuleSlotTracker.h
+++ b/llvm/include/llvm/IR/ModuleSlotTracker.h
@@ -9,12 +9,11 @@
#ifndef LLVM_IR_MODULESLOTTRACKER_H
#define LLVM_IR_MODULESLOTTRACKER_H
-#include "llvm/ADT/ArrayRef.h"
-#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/Compiler.h"
#include <functional>
#include <memory>
#include <utility>
+#include <vector>
namespace llvm {
@@ -22,7 +21,6 @@ class Module;
class Function;
class SlotTracker;
class Value;
-class DILocation;
class MDNode;
/// Abstract interface of slot tracker storage.
@@ -30,6 +28,8 @@ class LLVM_ABI AbstractSlotTrackerStorage {
public:
virtual ~AbstractSlotTrackerStorage();
+ virtual unsigned getNextMetadataSlot() = 0;
+
virtual void createMetadataSlot(const MDNode *) = 0;
virtual int getMetadataSlot(const MDNode *) = 0;
};
@@ -43,37 +43,20 @@ class LLVM_ABI AbstractSlotTrackerStorage {
/// If the IR changes from underneath \a ModuleSlotTracker, strings like
/// "<badref>" will be printed, or, worse, the wrong slots entirely.
class LLVM_ABI ModuleSlotTracker {
-public:
- using MachineMDNodeListType =
- SmallVector<std::pair<unsigned, const MDNode *>, 0>;
-
-private:
/// Storage for a slot tracker.
std::unique_ptr<SlotTracker> MachineStorage;
bool ShouldCreateStorage = false;
+ bool ShouldInitializeAllMetadata = false;
const Module *M = nullptr;
const Function *F = nullptr;
SlotTracker *Machine = nullptr;
- std::function<void(AbstractSlotTrackerStorage *, const Module *)>
+ std::function<void(AbstractSlotTrackerStorage *, const Module *, bool)>
ProcessModuleHookFn;
- std::function<void(AbstractSlotTrackerStorage *, const Function *)>
+ std::function<void(AbstractSlotTrackerStorage *, const Function *, bool)>
ProcessFunctionHookFn;
-protected:
- /// Renumber module metadata and then additional metadata for canonical
- /// assembly output.
- void renumberMetadataForAssembly(
- ArrayRef<const MDNode *> AdditionalMetadata,
- MachineMDNodeListType *AdditionalMetadataNodes = nullptr) const;
-
- /// Collect metadata reachable from \p AdditionalMetadata but not from the
- /// module.
- void collectAdditionalMetadata(
- ArrayRef<const MDNode *> AdditionalMetadata,
- MachineMDNodeListType &AdditionalMetadataNodes) const;
-
public:
/// Wrap a preinitialized SlotTracker.
ModuleSlotTracker(SlotTracker &Machine, const Module *M,
@@ -81,8 +64,13 @@ class LLVM_ABI ModuleSlotTracker {
/// Construct a slot tracker from a module.
///
- /// If \a M is \c nullptr, uses a null slot tracker.
- explicit ModuleSlotTracker(const Module *M);
+ /// If \a M is \c nullptr, uses a null slot tracker. Otherwise, initializes
+ /// a slot tracker, and initializes all metadata slots. \c
+ /// ShouldInitializeAllMetadata defaults to true because this is expected to
+ /// be shared between multiple callers, and otherwise MDNode references will
+ /// not match up.
+ explicit ModuleSlotTracker(const Module *M,
+ bool ShouldInitializeAllMetadata = true);
/// Destructor to clean up storage.
virtual ~ModuleSlotTracker();
@@ -107,16 +95,14 @@ class LLVM_ABI ModuleSlotTracker {
int getLocalSlot(const Value *V);
void setProcessHook(
- std::function<void(AbstractSlotTrackerStorage *, const Module *)>);
- void setProcessHook(
- std::function<void(AbstractSlotTrackerStorage *, const Function *)>);
+ std::function<void(AbstractSlotTrackerStorage *, const Module *, bool)>);
+ void setProcessHook(std::function<void(AbstractSlotTrackerStorage *,
+ const Function *, bool)>);
- void collectMDNodes(MachineMDNodeListType &L) const;
+ using MachineMDNodeListType =
+ std::vector<std::pair<unsigned, const MDNode *>>;
- /// Return whether a debug location should be printed inline instead of by ID.
- virtual bool shouldPrintDebugLocationInline(const DILocation *) const {
- return false;
- }
+ void collectMDNodes(MachineMDNodeListType &L, unsigned LB, unsigned UB) const;
};
} // end namespace llvm
diff --git a/llvm/include/llvm/IRPrinter/IRPrintingPasses.h b/llvm/include/llvm/IRPrinter/IRPrintingPasses.h
index 56fdd94187dd3..e574d94ca2f22 100644
--- a/llvm/include/llvm/IRPrinter/IRPrintingPasses.h
+++ b/llvm/include/llvm/IRPrinter/IRPrintingPasses.h
@@ -35,16 +35,13 @@ class PrintModulePass : public RequiredPassInfoMixin<PrintModulePass> {
std::string Banner;
bool ShouldPreserveUseListOrder;
bool EmitSummaryIndex;
- bool ShouldRenumberMetadata;
public:
LLVM_ABI PrintModulePass();
- /// If \p ShouldRenumberMetadata, renumber metadata for canonical assembly
- /// output before printing.
LLVM_ABI PrintModulePass(raw_ostream &OS, const std::string &Banner = "",
bool ShouldPreserveUseListOrder = false,
- bool EmitSummaryIndex = false,
- bool ShouldRenumberMetadata = false);
+ bool EmitSummaryIndex = false);
+
LLVM_ABI PreservedAnalyses run(Module &M, AnalysisManager<Module> &);
};
diff --git a/llvm/lib/CodeGen/MIRParser/MIParser.cpp b/llvm/lib/CodeGen/MIRParser/MIParser.cpp
index ef4927e2c4ee3..a9caf95a32ef9 100644
--- a/llvm/lib/CodeGen/MIRParser/MIParser.cpp
+++ b/llvm/lib/CodeGen/MIRParser/MIParser.cpp
@@ -360,7 +360,7 @@ static void mapValueToSlot(const Value *V, ModuleSlotTracker &MST,
/// Creates the mapping from slot numbers to function's unnamed IR values.
static void initSlots2Values(const Function &F,
DenseMap<unsigned, const Value *> &Slots2Values) {
- ModuleSlotTracker MST(F.getParent());
+ ModuleSlotTracker MST(F.getParent(), /*ShouldInitializeAllMetadata=*/false);
MST.incorporateFunction(F);
for (const auto &Arg : F.args())
mapValueToSlot(&Arg, MST, Slots2Values);
@@ -3813,7 +3813,7 @@ bool MIParser::parseMMRA(MDNode *&Node) {
static void initSlots2BasicBlocks(
const Function &F,
DenseMap<unsigned, const BasicBlock *> &Slots2BasicBlocks) {
- ModuleSlotTracker MST(F.getParent());
+ ModuleSlotTracker MST(F.getParent(), /*ShouldInitializeAllMetadata=*/false);
MST.incorporateFunction(F);
for (const auto &BB : F) {
if (BB.hasName())
diff --git a/llvm/lib/CodeGen/MIRPrintingPass.cpp b/llvm/lib/CodeGen/MIRPrintingPass.cpp
index 5f6537cdd8c13..f5e455a520151 100644
--- a/llvm/lib/CodeGen/MIRPrintingPass.cpp
+++ b/llvm/lib/CodeGen/MIRPrintingPass.cpp
@@ -12,20 +12,16 @@
//===----------------------------------------------------------------------===//
#include "llvm/CodeGen/MIRPrinter.h"
-#include "llvm/CodeGen/MachineFunctionAnalysis.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
-#include "llvm/CodeGen/MachineModuleSlotTracker.h"
#include "llvm/CodeGen/Passes.h"
#include "llvm/CodeGen/VirtRegMap.h"
#include "llvm/IR/Function.h"
-#include "llvm/IR/Module.h"
#include "llvm/InitializePasses.h"
using namespace llvm;
PreservedAnalyses PrintMIRPreparePass::run(Module &M, ModuleAnalysisManager &) {
- M.renumberMetadataForAssembly();
printMIR(OS, M);
return PreservedAnalyses::all();
}
@@ -36,14 +32,6 @@ PreservedAnalyses PrintMIRPass::run(MachineFunction &MF,
.getManager();
const VirtRegMap *VRM = MFAM.getCachedResult<VirtRegMapAnalysis>(MF);
- MachineModuleSlotTracker MST(
- [&](const Function &F) {
- return &FAM.getResult<MachineFunctionAnalysis>(
- const_cast<Function &>(F))
- .getMF();
- },
- &MF);
- MST.renumberMetadataForAssembly();
printMIR(OS, FAM, MF, VRM);
return PreservedAnalyses::all();
}
@@ -79,16 +67,12 @@ struct MIRPrintingPass : public MachineFunctionPass {
if (auto *W = getAnalysisIfAvailable<VirtRegMapWrapperLegacy>())
VRM = &W->getVRM();
- MachineModuleSlotTracker MST(
- [&](const Function &F) { return MMI->getMachineFunction(F); }, &MF);
- MST.renumberMetadataForAssembly();
printMIR(StrOS, *MMI, MF, VRM);
MachineFunctions.append(Str);
return false;
}
bool doFinalization(Module &M) override {
- M.renumberMetadataForAssembly();
printMIR(OS, M);
OS << MachineFunctions;
return false;
diff --git a/llvm/lib/CodeGen/MachineBasicBlock.cpp b/llvm/lib/CodeGen/MachineBasicBlock.cpp
index b58a11efd103c..08a67935b52f5 100644
--- a/llvm/lib/CodeGen/MachineBasicBlock.cpp
+++ b/llvm/lib/CodeGen/MachineBasicBlock.cpp
@@ -503,7 +503,7 @@ void MachineBasicBlock::printName(raw_ostream &os, unsigned printNameFlags,
if (moduleSlotTracker) {
slot = moduleSlotTracker->getLocalSlot(bb);
} else if (bb->getParent()) {
- ModuleSlotTracker tmpTracker(bb->getModule());
+ ModuleSlotTracker tmpTracker(bb->getModule(), false);
tmpTracker.incorporateFunction(*bb->getParent());
slot = tmpTracker.getLocalSlot(bb);
}
diff --git a/llvm/lib/CodeGen/MachineModuleSlotTracker.cpp b/llvm/lib/CodeGen/MachineModuleSlotTracker.cpp
index f688f2b8b61aa..e08b03eb4d70c 100644
--- a/llvm/lib/CodeGen/MachineModuleSlotTracker.cpp
+++ b/llvm/lib/CodeGen/MachineModuleSlotTracker.cpp
@@ -16,93 +16,92 @@
using namespace llvm;
-void MachineModuleSlotTracker::collectMachineFunctionMetadata(
- SmallVectorImpl<const MDNode *> &Metadata, const MachineFunction &MF,
- SmallVectorImpl<const MDNode *> *DebugLocations) const {
+void MachineModuleSlotTracker::processMachineFunctionMetadata(
+ AbstractSlotTrackerStorage *AST, const MachineFunction &MF) {
+ // Create metadata created within the backend.
for (const MachineBasicBlock &MBB : MF)
for (const MachineInstr &MI : MBB.instrs()) {
- if (DebugLocations)
- if (DebugLoc DL = MI.getDebugLoc())
- DebugLocations->push_back(DL.getAsMDNode());
-
if (MDNode *N = MI.getHeapAllocMarker())
- Metadata.push_back(N);
+ AST->createMetadataSlot(N);
if (MDNode *N = MI.getPCSections())
- Metadata.push_back(N);
+ AST->createMetadataSlot(N);
if (MDNode *N = MI.getMMRAMetadata())
- Metadata.push_back(N);
+ AST->createMetadataSlot(N);
for (const MachineOperand &MO : MI.operands())
if (MO.isMetadata())
- Metadata.push_back(MO.getMetadata());
+ AST->createMetadataSlot(MO.getMetadata());
for (const MachineMemOperand *MMO : MI.memoperands()) {
AAMDNodes AAInfo = MMO->getAAInfo();
if (AAInfo.TBAA)
- Metadata.push_back(AAInfo.TBAA);
+ AST->createMetadataSlot(AAInfo.TBAA);
if (AAInfo.TBAAStruct)
- Metadata.push_back(AAInfo.TBAAStruct);
+ AST->createMetadataSlot(AAInfo.TBAAStruct);
if (AAInfo.Scope)
- Metadata.push_back(AAInfo.Scope);
+ AST->createMetadataSlot(AAInfo.Scope);
if (AAInfo.NoAlias)
- Metadata.push_back(AAInfo.NoAlias);
+ AST->createMetadataSlot(AAInfo.NoAlias);
if (AAInfo.NoAliasAddrSpace)
- Metadata.push_back(AAInfo.NoAliasAddrSpace);
+ AST->createMetadataSlot(AAInfo.NoAliasAddrSpace);
if (const MDNode *N = MMO->getRanges())
- Metadata.push_back(N);
+ AST->createMetadataSlot(N);
if (const MDNode *N = MMO->getMemCacheHint())
- Metadata.push_back(N);
+ AST->createMetadataSlot(N);
}
}
for (const MachineFunction::VariableDbgInfo &DebugVar :
MF.getVariableDbgInfo()) {
- Metadata.push_back(DebugVar.Var);
- if (DebugLocations)
- DebugLocations->push_back(DebugVar.Loc);
+ AST->createMetadataSlot(DebugVar.Var);
}
}
-void MachineModuleSlotTracker::collectMachineMDNodes(
- MachineMDNodeListType &L) const {
- L.insert(L.end(), MachineMDNodes.begin(), MachineMDNodes.end());
+void MachineModuleSlotTracker::processMachineModule(
+ AbstractSlotTrackerStorage *AST, const Module *M,
+ bool ShouldInitializeAllMetadata) {
+ if (ShouldInitializeAllMetadata) {
+ for (const Function &F : *M) {
+ if (&F != &TheFunction)
+ continue;
+ MDNStartSlot = AST->getNextMetadataSlot();
+ if (TheMF)
+ processMachineFunctionMetadata(AST, *TheMF);
+ MDNEndSlot = AST->getNextMetadataSlot();
+ break;
+ }
+ }
}
-void MachineModuleSlotTracker::renumberMetadataForAssembly() {
- if (!TheMF)
- return;
-
- SmallVector<const MDNode *, 16> Metadata;
- collectMachineFunctionMetadata(Metadata, *TheMF);
- MachineMDNodes.clear();
- ModuleSlotTracker::renumberMetadataForAssembly(Metadata, &MachineMDNodes);
+void MachineModuleSlotTracker::processMachineFunction(
+ AbstractSlotTrackerStorage *AST, const Function *F,
+ bool ShouldInitializeAllMetadata) {
+ if (!ShouldInitializeAllMetadata && F == &TheFunction) {
+ MDNStartSlot = AST->getNextMetadataSlot();
+ if (TheMF)
+ processMachineFunctionMetadata(AST, *TheMF);
+ MDNEndSlot = AST->getNextMetadataSlot();
+ }
}
-MachineModuleSlotTracker::MachineModuleSlotTracker(MFGetterFnT Fn,
- const MachineFunction *MF)
- : ModuleSlotTracker(MF->getFunction().getParent()),
- TheMF(Fn(MF->getFunction())) {
- if (!TheMF)
- return;
-
- SmallVector<const MDNode *, 16> Metadata;
- SmallVector<const MDNode *, 16> DebugLocations;
- collectMachineFunctionMetadata(Metadata, *TheMF, &DebugLocations);
- collectAdditionalMetadata(Metadata, MachineMDNodes);
-
- if (DebugLocations.empty())
- return;
-
- MachineMDNodeListType DebugMetadataNodes;
- collectAdditionalMetadata(DebugLocations, DebugMetadataNodes);
- SmallPtrSet<const MDNode *, 16> MachineMetadata;
- for (const auto &Entry : MachineMDNodes)
- MachineMetadata.insert(Entry.second);
+void MachineModuleSlotTracker::collectMachineMDNodes(
+ MachineMDNodeListType &L) const {
+ collectMDNodes(L, MDNStartSlot, MDNEndSlot);
+}
- for (const auto &Entry : DebugMetadataNodes)
- if (isa<DILocation>(Entry.second) &&
- !MachineMetadata.contains(Entry.second))
- InlineDebugLocations.insert(cast<DILocation>(Entry.second));
+MachineModuleSlotTracker::MachineModuleSlotTracker(
+ MFGetterFnT Fn, const MachineFunction *MF, bool ShouldInitializeAllMetadata)
+ : ModuleSlotTracker(MF->getFunction().getParent(),
+ ShouldInitializeAllMetadata),
+ TheFunction(MF->getFunction()), TheMF(Fn(MF->getFunction())) {
+ setProcessHook([this](AbstractSlotTrackerStorage *AST, const Module *M,
+ bool ShouldInitializeAllMetadata) {
+ this->processMachineModule(AST, M, ShouldInitializeAllMetadata);
+ });
+ setProcessHook([this](AbstractSlotTrackerStorage *AST, const Function *F,
+ bool ShouldInitializeAllMetadata) {
+ this->processMachineFunction(AST, F, ShouldInitializeAllMetadata);
+ });
}
MachineModuleSlotTracker::~MachineModuleSlotTracker() = default;
diff --git a/llvm/lib/CodeGen/MachineOperand.cpp b/llvm/lib/CodeGen/MachineOperand.cpp
index af1487038de59..3067f6e636130 100644
--- a/llvm/lib/CodeGen/MachineOperand.cpp
+++ b/llvm/lib/CodeGen/MachineOperand.cpp
@@ -529,7 +529,7 @@ static void printIRBlockReference(raw_ostream &OS, const BasicBlock &BB,
if (F == MST.getCurrentFunction()) {
Slot = MST.getLocalSlot(&BB);
} else if (const Module *M = F->getParent()) {
- ModuleSlotTracker CustomMST(M);
+ ModuleSlotTracker CustomMST(M, /*ShouldInitializeAllMetadata=*/false);
CustomMST.incorporateFunction(*F);
Slot = CustomMST.getLocalSlot(&BB);
}
diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp
index 8c1d4fa6c13cd..f23a4b0bcc29d 100644
--- a/llvm/lib/IR/AsmWriter.cpp
+++ b/llvm/lib/IR/AsmWriter.cpp
@@ -15,13 +15,11 @@
//
//===----------------------------------------------------------------------===//
-#include "LLVMContextImpl.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/STLFunctionalExtras.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallString.h"
@@ -800,11 +798,11 @@ class llvm::SlotTracker : public AbstractSlotTrackerStorage {
/// TheFunction - The function for which we are holding slot numbers.
const Function* TheFunction = nullptr;
bool FunctionProcessed = false;
- bool ShouldTrackMetadataDefinitions;
+ bool ShouldInitializeAllMetadata;
- std::function<void(AbstractSlotTrackerStorage *, const Module *)>
+ std::function<void(AbstractSlotTrackerStorage *, const Module *, bool)>
ProcessModuleHookFn;
- std::function<void(AbstractSlotTrackerStorage *, const Function *)>
+ std::function<void(AbstractSlotTrackerStorage *, const Function *, bool)>
ProcessFunctionHookFn;
/// The summary index for which we are holding slot numbers.
@@ -820,6 +818,8 @@ class llvm::SlotTracker : public AbstractSlotTrackerStorage {
/// mdnMap - Map for MDNodes.
DenseMap<const MDNode *, unsigned> mdnMap;
+ unsigned mdnNext = 0;
+
/// asMap - The slot map for attribute sets.
DenseMap<AttributeSet, unsigned> asMap;
unsigned asNext = 0;
@@ -844,12 +844,19 @@ class llvm::SlotTracker : public AbstractSlotTrackerStorage {
public:
/// Construct from a module.
///
+ /// If \c ShouldInitializeAllMetadata, initializes all metadata in all
+ /// functions, giving correct numbering for metadata referenced only from
+ /// within a function (even if no functions have been initialized).
explicit SlotTracker(const Module *M,
- bool ShouldTrackMetadataDefinitions = false);
+ bool ShouldInitializeAllMetadata = false);
/// Construct from a function, starting out in incorp state.
///
- explicit SlotTracker(const Function *F);
+ /// If \c ShouldInitializeAllMetadata, initializes all metadata in all
+ /// functions, giving correct numbering for metadata referenced only from
+ /// within a function (even if no functions have been initialized).
+ explicit SlotTracker(const Function *F,
+ bool ShouldInitializeAllMetadata = false);
/// Construct from a module summary index.
explicit SlotTracker(const ModuleSummaryIndex *Index);
@@ -860,9 +867,11 @@ class llvm::SlotTracker : public AbstractSlotTrackerStorage {
~SlotTracker() override = default;
void setProcessHook(
- std::function<void(AbstractSlotTrackerStorage *, const Module *)>);
- void setProcessHook(
- std::function<void(AbstractSlotTrackerStorage *, const Function *)>);
+ std::function<void(AbstractSlotTrackerStorage *, const Module *, bool)>);
+ void setProcessHook(std::function<void(AbstractSlotTrackerStorage *,
+ const Function *, bool)>);
+
+ unsigned getNextMetadataSlot() override { return mdnNext; }
void createMetadataSlot(const MDNode *N) override;
@@ -919,7 +928,7 @@ class llvm::SlotTracker : public AbstractSlotTrackerStorage {
/// CreateModuleSlot - Insert the specified GlobalValue* into the slot table.
void CreateModuleSlot(const GlobalValue *V);
- /// Record a metadata definition and the metadata nodes referenced by it.
+ /// CreateMetadataSlot - Insert the specified MDNode* into the slot table.
void CreateMetadataSlot(const MDNode *N);
/// CreateFunctionSlot - Insert the specified Value* into the slot table.
@@ -941,14 +950,28 @@ class llvm::SlotTracker : public AbstractSlotTrackerStorage {
/// Add all of the functions arguments, basic blocks, and instructions.
void processFunction();
+
+ /// Add the metadata directly attached to a GlobalObject.
+ void processGlobalObjectMetadata(const GlobalObject &GO);
+
+ /// Add all of the metadata from a function.
+ void processFunctionMetadata(const Function &F);
+
+ /// Add all of the metadata from an instruction.
+ void processInstructionMetadata(const Instruction &I);
+
+ /// Add all of the metadata from a DbgRecord.
+ void processDbgRecordMetadata(const DbgRecord &DVR);
};
ModuleSlotTracker::ModuleSlotTracker(SlotTracker &Machine, const Module *M,
const Function *F)
: M(M), F(F), Machine(&Machine) {}
-ModuleSlotTracker::ModuleSlotTracker(const Module *M)
- : ShouldCreateStorage(M), M(M) {}
+ModuleSlotTracker::ModuleSlotTracker(const Module *M,
+ bool ShouldInitializeAllMetadata)
+ : ShouldCreateStorage(M),
+ ShouldInitializeAllMetadata(ShouldInitializeAllMetadata), M(M) {}
ModuleSlotTracker::~ModuleSlotTracker() = default;
@@ -957,7 +980,8 @@ SlotTracker *ModuleSlotTracker::getMachine() {
return Machine;
ShouldCreateStorage = false;
- MachineStorage = std::make_unique<SlotTracker>(M);
+ MachineStorage =
+ std::make_unique<SlotTracker>(M, ShouldInitializeAllMetadata);
Machine = MachineStorage.get();
if (ProcessModuleHookFn)
Machine->setProcessHook(ProcessModuleHookFn);
@@ -986,12 +1010,14 @@ int ModuleSlotTracker::getLocalSlot(const Value *V) {
}
void ModuleSlotTracker::setProcessHook(
- std::function<void(AbstractSlotTrackerStorage *, const Module *)> Fn) {
+ std::function<void(AbstractSlotTrackerStorage *, const Module *, bool)>
+ Fn) {
ProcessModuleHookFn = std::move(Fn);
}
void ModuleSlotTracker::setProcessHook(
- std::function<void(AbstractSlotTrackerStorage *, const Function *)> Fn) {
+ std::function<void(AbstractSlotTrackerStorage *, const Function *, bool)>
+ Fn) {
ProcessFunctionHookFn = std::move(Fn);
}
@@ -1029,19 +1055,17 @@ static SlotTracker *createSlotTracker(const Value *V) {
// Module level constructor. Causes the contents of the Module (sans functions)
// to be added to the slot table.
-SlotTracker::SlotTracker(const Module *M, bool ShouldTrackMetadataDefinitions)
- : TheModule(M),
- ShouldTrackMetadataDefinitions(ShouldTrackMetadataDefinitions) {}
+SlotTracker::SlotTracker(const Module *M, bool ShouldInitializeAllMetadata)
+ : TheModule(M), ShouldInitializeAllMetadata(ShouldInitializeAllMetadata) {}
// Function level constructor. Causes the contents of the Module and the one
// function provided to be added to the slot table.
-SlotTracker::SlotTracker(const Function *F)
+SlotTracker::SlotTracker(const Function *F, bool ShouldInitializeAllMetadata)
: TheModule(F ? F->getParent() : nullptr), TheFunction(F),
- ShouldTrackMetadataDefinitions(false) {}
+ ShouldInitializeAllMetadata(ShouldInitializeAllMetadata) {}
SlotTracker::SlotTracker(const ModuleSummaryIndex *Index)
- : TheModule(nullptr), ShouldTrackMetadataDefinitions(false),
- TheIndex(Index) {}
+ : TheModule(nullptr), ShouldInitializeAllMetadata(false), TheIndex(Index) {}
inline void SlotTracker::initializeIfNeeded() {
if (TheModule) {
@@ -1070,6 +1094,7 @@ void SlotTracker::processModule() {
for (const GlobalVariable &Var : TheModule->globals()) {
if (!Var.hasName())
CreateModuleSlot(&Var);
+ processGlobalObjectMetadata(Var);
auto Attrs = Var.getAttributes();
if (Attrs.hasAttributes())
CreateAttributeSetSlot(Attrs);
@@ -1083,6 +1108,13 @@ void SlotTracker::processModule() {
for (const GlobalIFunc &I : TheModule->ifuncs()) {
if (!I.hasName())
CreateModuleSlot(&I);
+ processGlobalObjectMetadata(I);
+ }
+
+ // Add metadata used by named metadata.
+ for (const NamedMDNode &NMD : TheModule->named_metadata()) {
+ for (const MDNode *N : NMD.operands())
+ CreateMetadataSlot(N);
}
for (const Function &F : *TheModule) {
@@ -1090,6 +1122,9 @@ void SlotTracker::processModule() {
// Add all the unnamed functions to the table.
CreateModuleSlot(&F);
+ if (ShouldInitializeAllMetadata)
+ processFunctionMetadata(F);
+
// Add all the function attributes to the table.
// FIXME: Add attributes of other objects?
AttributeSet FnAttrs = F.getAttributes().getFnAttrs();
@@ -1098,7 +1133,7 @@ void SlotTracker::processModule() {
}
if (ProcessModuleHookFn)
- ProcessModuleHookFn(this, TheModule);
+ ProcessModuleHookFn(this, TheModule, ShouldInitializeAllMetadata);
ST_DEBUG("end processModule!\n");
}
@@ -1108,6 +1143,10 @@ void SlotTracker::processFunction() {
ST_DEBUG("begin processFunction!\n");
fNext = 0;
+ // Process function metadata if it wasn't hit at the module-level.
+ if (!ShouldInitializeAllMetadata)
+ processFunctionMetadata(*TheFunction);
+
// Add all the function arguments with no names.
for(Function::const_arg_iterator AI = TheFunction->arg_begin(),
AE = TheFunction->arg_end(); AI != AE; ++AI)
@@ -1137,7 +1176,7 @@ void SlotTracker::processFunction() {
}
if (ProcessFunctionHookFn)
- ProcessFunctionHookFn(this, TheFunction);
+ ProcessFunctionHookFn(this, TheFunction, ShouldInitializeAllMetadata);
FunctionProcessed = true;
@@ -1180,168 +1219,68 @@ int SlotTracker::processIndex() {
return TypeIdNext;
}
-namespace {
-class MetadataNodeVisitor {
- /// Visited MDNodes.
- SmallPtrSet<const MDNode *, 32> VisitedMDNodes;
- function_ref<void(const MDNode *)> Visit;
-
- void visit(const MDNode *N) {
- if (isa<DIExpression>(N) || !VisitedMDNodes.insert(N).second)
- return;
-
- Visit(N);
- for (const MDOperand &Op : N->operands())
- if (const auto *OpNode = dyn_cast_or_null<MDNode>(Op.get()))
- visit(OpNode);
- }
+void SlotTracker::processGlobalObjectMetadata(const GlobalObject &GO) {
+ SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;
+ GO.getAllMetadata(MDs);
+ for (auto &MD : MDs)
+ CreateMetadataSlot(MD.second);
+}
- void visitGlobalObjectMetadata(const GlobalObject &GO) {
- SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;
- GO.getAllMetadata(MDs);
- for (auto &MD : MDs)
- visit(MD.second);
- }
-
- void visitDbgRecordMetadata(const DbgRecord &DR) {
- if (const auto *DVR = dyn_cast<const DbgVariableRecord>(&DR)) {
- if (auto *Empty = dyn_cast_if_present<MDNode>(DVR->getRawLocation()))
- visit(Empty);
- if (DVR->getRawVariable())
- visit(DVR->getRawVariable());
- if (DVR->isDbgAssign()) {
- if (auto *AssignID = DVR->getRawAssignID())
- visit(cast<MDNode>(AssignID));
- if (auto *Empty = dyn_cast_if_present<MDNode>(DVR->getRawAddress()))
- visit(Empty);
- }
- } else if (const auto *DLR = dyn_cast<const DbgLabelRecord>(&DR)) {
- visit(DLR->getRawLabel());
- } else {
- llvm_unreachable("unsupported DbgRecord kind");
+void SlotTracker::processFunctionMetadata(const Function &F) {
+ processGlobalObjectMetadata(F);
+ for (auto &BB : F) {
+ for (auto &I : BB) {
+ for (const DbgRecord &DR : I.getDbgRecordRange())
+ processDbgRecordMetadata(DR);
+ processInstructionMetadata(I);
}
- if (DR.getDebugLoc())
- visit(DR.getDebugLoc().getAsMDNode());
- }
-
- void visitInstructionMetadata(const Instruction &I) {
- if (const auto *CI = dyn_cast<CallInst>(&I))
- if (Function *F = CI->getCalledFunction())
- if (F->isIntrinsic())
- for (auto &Op : I.operands())
- if (auto *V = dyn_cast_or_null<MetadataAsValue>(Op))
- if (auto *N = dyn_cast<MDNode>(V->getMetadata()))
- visit(N);
-
- SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;
- I.getAllMetadata(MDs);
- for (auto &MD : MDs)
- visit(MD.second);
- }
-
- void visitFunctionMetadata(const Function &F) {
- visitGlobalObjectMetadata(F);
- for (const BasicBlock &BB : F)
- for (const Instruction &I : BB) {
- for (const DbgRecord &DR : I.getDbgRecordRange())
- visitDbgRecordMetadata(DR);
- visitInstructionMetadata(I);
- }
- }
-
-public:
- MetadataNodeVisitor(function_ref<void(const MDNode *)> Visit)
- : Visit(Visit) {}
-
- void visitModuleMetadata(const Module &M) {
- for (const GlobalVariable &Var : M.globals())
- visitGlobalObjectMetadata(Var);
- for (const GlobalIFunc &I : M.ifuncs())
- visitGlobalObjectMetadata(I);
- for (const NamedMDNode &NMD : M.named_metadata())
- for (const MDNode *N : NMD.operands())
- visit(N);
- for (const Function &F : M)
- visitFunctionMetadata(F);
- }
-
- void visitMetadata(ArrayRef<const MDNode *> Metadata) {
- for (const MDNode *N : Metadata)
- visit(N);
}
+}
- bool contains(const MDNode *N) const { return VisitedMDNodes.contains(N); }
-};
-
-class MetadataIDRenumberer {
- uint32_t NextID = 0;
-
-public:
- void run(const Module &M, ArrayRef<const MDNode *> AdditionalMetadata,
- ModuleSlotTracker::MachineMDNodeListType *AdditionalMetadataNodes =
- nullptr) {
- bool IsAdditionalMetadata = false;
- auto Renumber = [&](const MDNode *N) {
- N->getContext().pImpl->setMetadataPrintID(const_cast<MDNode *>(N),
- NextID++);
- if (IsAdditionalMetadata && AdditionalMetadataNodes)
- AdditionalMetadataNodes->emplace_back(
- N->getContext().pImpl->getMetadataPrintID(N), N);
- };
- MetadataNodeVisitor Visitor(Renumber);
-
- Visitor.visitModuleMetadata(M);
-
- IsAdditionalMetadata = true;
- Visitor.visitMetadata(AdditionalMetadata);
-
- // Keep IDs unique for nodes outside the canonical output.
- SmallVector<MDNode *, 32> RemainingNodes;
- M.getContext().pImpl->getAllMetadataNodes(RemainingNodes);
- llvm::erase_if(RemainingNodes, [&](const MDNode *N) {
- return Visitor.contains(N) ||
- M.getContext().pImpl->getMetadataPrintID(N) >= NextID;
- });
- llvm::sort(RemainingNodes, [&](const MDNode *LHS, const MDNode *RHS) {
- return M.getContext().pImpl->getMetadataPrintID(LHS) <
- M.getContext().pImpl->getMetadataPrintID(RHS);
- });
- for (MDNode *N : RemainingNodes)
- M.getContext().pImpl->setMetadataPrintID(
- N, M.getContext().pImpl->allocateMetadataPrintID());
-
- if (AdditionalMetadataNodes)
- llvm::sort(*AdditionalMetadataNodes);
+void SlotTracker::processDbgRecordMetadata(const DbgRecord &DR) {
+ // Tolerate null metadata pointers: it's a completely illegal debug record,
+ // but we can have faulty metadata from debug-intrinsic days being
+ // autoupgraded into debug records. This gets caught by the verifier, which
+ // then will print the faulty IR, hitting this code path.
+ if (const auto *DVR = dyn_cast<const DbgVariableRecord>(&DR)) {
+ // Process metadata used by DbgRecords; we only specifically care about the
+ // DILocalVariable, DILocation, and DIAssignID fields, as the Value and
+ // Expression fields should only be printed inline and so do not use a slot.
+ // Note: The above doesn't apply for empty-metadata operands.
+ if (auto *Empty = dyn_cast_if_present<MDNode>(DVR->getRawLocation()))
+ CreateMetadataSlot(Empty);
+ if (DVR->getRawVariable())
+ CreateMetadataSlot(DVR->getRawVariable());
+ if (DVR->isDbgAssign()) {
+ if (auto *AssignID = DVR->getRawAssignID())
+ CreateMetadataSlot(cast<MDNode>(AssignID));
+ if (auto *Empty = dyn_cast_if_present<MDNode>(DVR->getRawAddress()))
+ CreateMetadataSlot(Empty);
+ }
+ } else if (const auto *DLR = dyn_cast<const DbgLabelRecord>(&DR)) {
+ CreateMetadataSlot(DLR->getRawLabel());
+ } else {
+ llvm_unreachable("unsupported DbgRecord kind");
}
-};
-} // namespace
-
-void Module::renumberMetadataForAssembly() {
- MetadataIDRenumberer().run(*this, {});
+ if (DR.getDebugLoc())
+ CreateMetadataSlot(DR.getDebugLoc().getAsMDNode());
}
-void ModuleSlotTracker::renumberMetadataForAssembly(
- ArrayRef<const MDNode *> AdditionalMetadata,
- MachineMDNodeListType *AdditionalMetadataNodes) const {
- assert(M && "metadata renumbering requires a module");
- MetadataIDRenumberer().run(*M, AdditionalMetadata, AdditionalMetadataNodes);
-}
+void SlotTracker::processInstructionMetadata(const Instruction &I) {
+ // Process metadata used directly by intrinsics.
+ if (const auto *CI = dyn_cast<CallInst>(&I))
+ if (Function *F = CI->getCalledFunction())
+ if (F->isIntrinsic())
+ for (auto &Op : I.operands())
+ if (auto *V = dyn_cast_or_null<MetadataAsValue>(Op))
+ if (auto *N = dyn_cast<MDNode>(V->getMetadata()))
+ CreateMetadataSlot(N);
-void ModuleSlotTracker::collectAdditionalMetadata(
- ArrayRef<const MDNode *> AdditionalMetadata,
- MachineMDNodeListType &AdditionalMetadataNodes) const {
- assert(M && "metadata collection requires a module");
- bool IsAdditionalMetadata = false;
- auto Collect = [&](const MDNode *N) {
- if (IsAdditionalMetadata)
- AdditionalMetadataNodes.emplace_back(
- N->getContext().pImpl->getMetadataPrintID(N), N);
- };
- MetadataNodeVisitor Visitor(Collect);
- Visitor.visitModuleMetadata(*M);
- IsAdditionalMetadata = true;
- Visitor.visitMetadata(AdditionalMetadata);
- llvm::sort(AdditionalMetadataNodes);
+ // Process metadata attached to this instruction.
+ SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;
+ I.getAllMetadata(MDs);
+ for (auto &MD : MDs)
+ CreateMetadataSlot(MD.second);
}
/// Clean up after incorporating a function. This is the only way to get out of
@@ -1366,12 +1305,14 @@ int SlotTracker::getGlobalSlot(const GlobalValue *V) {
}
void SlotTracker::setProcessHook(
- std::function<void(AbstractSlotTrackerStorage *, const Module *)> Fn) {
+ std::function<void(AbstractSlotTrackerStorage *, const Module *, bool)>
+ Fn) {
ProcessModuleHookFn = std::move(Fn);
}
void SlotTracker::setProcessHook(
- std::function<void(AbstractSlotTrackerStorage *, const Function *)> Fn) {
+ std::function<void(AbstractSlotTrackerStorage *, const Function *, bool)>
+ Fn) {
ProcessFunctionHookFn = std::move(Fn);
}
@@ -1383,11 +1324,9 @@ int SlotTracker::getMetadataSlot(const MDNode *N) {
// Check for uninitialized state and do lazy initialization.
initializeIfNeeded();
- if (isa<DIExpression>(N))
- return -1;
- if (ShouldTrackMetadataDefinitions)
- CreateMetadataSlot(N);
- return N->getContext().pImpl->getMetadataPrintID(N);
+ // Find the MDNode in the module map
+ mdn_iterator MI = mdnMap.find(N);
+ return MI == mdnMap.end() ? -1 : (int)MI->second;
}
/// getLocalSlot - Get the slot number for a value that is local to a function.
@@ -1480,16 +1419,19 @@ void SlotTracker::CreateFunctionSlot(const Value *V) {
void SlotTracker::CreateMetadataSlot(const MDNode *N) {
assert(N && "Can't insert a null Value into SlotTracker!");
+ // Don't make slots for DIExpressions. We just print them inline everywhere.
if (isa<DIExpression>(N))
return;
- unsigned ID = N->getContext().pImpl->getMetadataPrintID(N);
- if (!mdnMap.try_emplace(N, ID).second)
+ unsigned DestSlot = mdnNext;
+ if (!mdnMap.insert(std::make_pair(N, DestSlot)).second)
return;
+ ++mdnNext;
- for (const MDOperand &Op : N->operands())
- if (const auto *OpNode = dyn_cast_or_null<MDNode>(Op.get()))
- CreateMetadataSlot(OpNode);
+ // Recursively add any MDNodes referenced by operands.
+ for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i)
+ if (const auto *Op = dyn_cast_or_null<MDNode>(N->getOperand(i)))
+ CreateMetadataSlot(Op);
}
void SlotTracker::CreateAttributeSetSlot(AttributeSet AS) {
@@ -1525,11 +1467,9 @@ struct AsmWriterContext {
TypePrinting *TypePrinter = nullptr;
SlotTracker *Machine = nullptr;
const Module *Context = nullptr;
- const ModuleSlotTracker *MST = nullptr;
- AsmWriterContext(TypePrinting *TP, SlotTracker *ST, const Module *M = nullptr,
- const ModuleSlotTracker *MST = nullptr)
- : TypePrinter(TP), Machine(ST), Context(M), MST(MST) {}
+ AsmWriterContext(TypePrinting *TP, SlotTracker *ST, const Module *M = nullptr)
+ : TypePrinter(TP), Machine(ST), Context(M) {}
static AsmWriterContext &getEmpty() {
static AsmWriterContext EmptyCtx(nullptr, nullptr);
@@ -2905,13 +2845,6 @@ static void writeAsOperandInternal(raw_ostream &Out, const Metadata *MD,
}
if (const auto *N = dyn_cast<MDNode>(MD)) {
- if (const auto *Loc = dyn_cast<DILocation>(N);
- Loc && WriterCtx.MST &&
- WriterCtx.MST->shouldPrintDebugLocationInline(Loc)) {
- writeDILocation(Out, Loc, WriterCtx);
- return;
- }
-
std::unique_ptr<SlotTracker> MachineStorage;
SaveAndRestore SARMachine(WriterCtx.Machine);
if (!WriterCtx.Machine) {
@@ -5099,14 +5032,14 @@ void AssemblyWriter::writeMDNode(unsigned Slot, const MDNode *Node) {
}
void AssemblyWriter::writeAllMDNodes() {
- SmallVector<std::pair<unsigned, const MDNode *>, 16> Nodes;
- Nodes.reserve(Machine.mdn_size());
+ SmallVector<const MDNode *, 16> Nodes;
+ Nodes.resize(Machine.mdn_size());
for (auto &I : llvm::make_range(Machine.mdn_begin(), Machine.mdn_end()))
- Nodes.emplace_back(I.second, cast<MDNode>(I.first));
- llvm::sort(Nodes);
+ Nodes[I.second] = cast<MDNode>(I.first);
- for (auto [Slot, Node] : Nodes)
- writeMDNode(Slot, Node);
+ for (unsigned i = 0, e = Nodes.size(); i != e; ++i) {
+ writeMDNode(i, Nodes[i]);
+ }
}
void AssemblyWriter::printMDNodeBody(const MDNode *Node) {
@@ -5177,7 +5110,7 @@ void AssemblyWriter::printUseLists(const Function *F) {
void Function::print(raw_ostream &ROS, AssemblyAnnotationWriter *AAW,
bool ShouldPreserveUseListOrder, bool IsForDebug) const {
- SlotTracker SlotTable(this);
+ SlotTracker SlotTable(this->getParent());
formatted_raw_ostream OS(ROS);
AssemblyWriter W(OS, SlotTable, this->getParent(), AAW, IsForDebug,
ShouldPreserveUseListOrder);
@@ -5196,7 +5129,7 @@ void BasicBlock::print(raw_ostream &ROS, AssemblyAnnotationWriter *AAW,
void Module::print(raw_ostream &ROS, AssemblyAnnotationWriter *AAW,
bool ShouldPreserveUseListOrder, bool IsForDebug) const {
- SlotTracker SlotTable(this, /*ShouldTrackMetadataDefinitions=*/true);
+ SlotTracker SlotTable(this);
formatted_raw_ostream OS(ROS);
AssemblyWriter W(OS, SlotTable, this, AAW, IsForDebug,
ShouldPreserveUseListOrder);
@@ -5266,15 +5199,26 @@ void Type::print(raw_ostream &OS, bool /*IsForDebug*/, bool NoDetails) const {
}
}
+static bool isReferencingMDNode(const Instruction &I) {
+ if (const auto *CI = dyn_cast<CallInst>(&I))
+ if (Function *F = CI->getCalledFunction())
+ if (F->isIntrinsic())
+ for (auto &Op : I.operands())
+ if (auto *V = dyn_cast_or_null<MetadataAsValue>(Op))
+ if (isa<MDNode>(V->getMetadata()))
+ return true;
+ return false;
+}
+
void DbgMarker::print(raw_ostream &ROS, bool IsForDebug) const {
- ModuleSlotTracker MST(getModuleFromDPI(this));
+ ModuleSlotTracker MST(getModuleFromDPI(this), true);
print(ROS, MST, IsForDebug);
}
void DbgVariableRecord::print(raw_ostream &ROS, bool IsForDebug) const {
- ModuleSlotTracker MST(getModuleFromDPI(this));
+ ModuleSlotTracker MST(getModuleFromDPI(this), true);
print(ROS, MST, IsForDebug);
}
@@ -5293,7 +5237,7 @@ void DbgMarker::print(raw_ostream &ROS, ModuleSlotTracker &MST,
void DbgLabelRecord::print(raw_ostream &ROS, bool IsForDebug) const {
- ModuleSlotTracker MST(getModuleFromDPI(this));
+ ModuleSlotTracker MST(getModuleFromDPI(this), true);
print(ROS, MST, IsForDebug);
}
@@ -5328,16 +5272,13 @@ void DbgLabelRecord::print(raw_ostream &ROS, ModuleSlotTracker &MST,
}
void Value::print(raw_ostream &ROS, bool IsForDebug) const {
- if (const auto *F = dyn_cast<Function>(this)) {
- F->print(ROS, nullptr, /*ShouldPreserveUseListOrder=*/false, IsForDebug);
- return;
- }
- if (const auto *BB = dyn_cast<BasicBlock>(this)) {
- BB->print(ROS, nullptr, /*ShouldPreserveUseListOrder=*/false, IsForDebug);
- return;
- }
+ bool ShouldInitializeAllMetadata = false;
+ if (auto *I = dyn_cast<Instruction>(this))
+ ShouldInitializeAllMetadata = isReferencingMDNode(*I);
+ else if (isa<Function>(this) || isa<MetadataAsValue>(this))
+ ShouldInitializeAllMetadata = true;
- ModuleSlotTracker MST(getModuleFromVal(this));
+ ModuleSlotTracker MST(getModuleFromVal(this), ShouldInitializeAllMetadata);
print(ROS, MST, IsForDebug);
}
@@ -5417,7 +5358,8 @@ void Value::printAsOperand(raw_ostream &O, bool PrintType,
if (printWithoutType(*this, O, nullptr, M))
return;
- SlotTracker Machine(M);
+ SlotTracker Machine(
+ M, /* ShouldInitializeAllMetadata */ isa<MetadataAsValue>(this));
ModuleSlotTracker MST(Machine, M);
printAsOperandImpl(*this, O, PrintType, MST);
}
@@ -5458,10 +5400,8 @@ struct MDTreeAsmWriterContext : public AsmWriterContext {
raw_ostream &MainOS;
MDTreeAsmWriterContext(TypePrinting *TP, SlotTracker *ST, const Module *M,
- const ModuleSlotTracker *MST, raw_ostream &OS,
- const Metadata *InitMD)
- : AsmWriterContext(TP, ST, M, MST), Level(0U), Visited({InitMD}),
- MainOS(OS) {}
+ raw_ostream &OS, const Metadata *InitMD)
+ : AsmWriterContext(TP, ST, M), Level(0U), Visited({InitMD}), MainOS(OS) {}
void onWriteMetadataAsOperand(const Metadata *MD) override {
if (!Visited.insert(MD).second)
@@ -5500,10 +5440,10 @@ static void printMetadataImpl(raw_ostream &ROS, const Metadata &MD,
std::unique_ptr<AsmWriterContext> WriterCtx;
if (PrintAsTree && !OnlyAsOperand)
WriterCtx = std::make_unique<MDTreeAsmWriterContext>(
- &TypePrinter, MST.getMachine(), M, &MST, OS, &MD);
+ &TypePrinter, MST.getMachine(), M, OS, &MD);
else
- WriterCtx = std::make_unique<AsmWriterContext>(&TypePrinter,
- MST.getMachine(), M, &MST);
+ WriterCtx =
+ std::make_unique<AsmWriterContext>(&TypePrinter, MST.getMachine(), M);
writeAsOperandInternal(OS, &MD, *WriterCtx, /* FromValue */ true);
@@ -5516,7 +5456,7 @@ static void printMetadataImpl(raw_ostream &ROS, const Metadata &MD,
}
void Metadata::printAsOperand(raw_ostream &OS, const Module *M) const {
- ModuleSlotTracker MST(M);
+ ModuleSlotTracker MST(M, isa<MDNode>(this));
printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ true);
}
@@ -5527,7 +5467,7 @@ void Metadata::printAsOperand(raw_ostream &OS, ModuleSlotTracker &MST,
void Metadata::print(raw_ostream &OS, const Module *M,
bool /*IsForDebug*/) const {
- ModuleSlotTracker MST(M);
+ ModuleSlotTracker MST(M, isa<MDNode>(this));
printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ false);
}
@@ -5537,7 +5477,7 @@ void Metadata::print(raw_ostream &OS, ModuleSlotTracker &MST,
}
void MDNode::printTree(raw_ostream &OS, const Module *M) const {
- ModuleSlotTracker MST(M);
+ ModuleSlotTracker MST(M, true);
printMetadataImpl(OS, *this, MST, M, /* OnlyAsOperand */ false,
/*PrintAsTree=*/true);
}
@@ -5555,13 +5495,15 @@ void ModuleSummaryIndex::print(raw_ostream &ROS, bool IsForDebug) const {
W.printModuleSummaryIndex();
}
-void ModuleSlotTracker::collectMDNodes(MachineMDNodeListType &L) const {
+void ModuleSlotTracker::collectMDNodes(MachineMDNodeListType &L, unsigned LB,
+ unsigned UB) const {
SlotTracker *ST = MachineStorage.get();
if (!ST)
return;
for (auto &I : llvm::make_range(ST->mdn_begin(), ST->mdn_end()))
- L.push_back(std::make_pair(I.second, I.first));
+ if (I.second >= LB && I.second < UB)
+ L.push_back(std::make_pair(I.second, I.first));
}
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
diff --git a/llvm/lib/IR/Core.cpp b/llvm/lib/IR/Core.cpp
index d1ee8411e392c..a7abd3eed31c3 100644
--- a/llvm/lib/IR/Core.cpp
+++ b/llvm/lib/IR/Core.cpp
@@ -474,7 +474,6 @@ LLVMBool LLVMPrintModuleToFile(LLVMModuleRef M, const char *Filename,
return true;
}
- unwrap(M)->renumberMetadataForAssembly();
unwrap(M)->print(dest, nullptr);
dest.close();
@@ -492,7 +491,6 @@ char *LLVMPrintModuleToString(LLVMModuleRef M) {
std::string buf;
raw_string_ostream os(buf);
- unwrap(M)->renumberMetadataForAssembly();
unwrap(M)->print(os, nullptr);
return strdup(buf.c_str());
diff --git a/llvm/lib/IR/IRPrintingPasses.cpp b/llvm/lib/IR/IRPrintingPasses.cpp
index a84f8db98bee4..43671b0b9a1a3 100644
--- a/llvm/lib/IR/IRPrintingPasses.cpp
+++ b/llvm/lib/IR/IRPrintingPasses.cpp
@@ -26,49 +26,37 @@ using namespace llvm;
namespace {
-static void printModule(raw_ostream &OS, StringRef Banner,
- bool ShouldPreserveUseListOrder, Module &M) {
- if (llvm::isFunctionInPrintList("*")) {
- if (!Banner.empty())
- OS << Banner << "\n";
- M.print(OS, nullptr, ShouldPreserveUseListOrder);
- return;
- }
-
- bool BannerPrinted = false;
- for (const auto &F : M.functions()) {
- if (!llvm::isFunctionInPrintList(F.getName()))
- continue;
- if (!BannerPrinted && !Banner.empty()) {
- OS << Banner << "\n";
- BannerPrinted = true;
- }
- F.print(OS);
- }
-}
-
class PrintModulePassWrapper : public ModulePass {
raw_ostream &OS;
std::string Banner;
bool ShouldPreserveUseListOrder;
- bool ShouldRenumberMetadata;
public:
static char ID;
- PrintModulePassWrapper()
- : ModulePass(ID), OS(dbgs()), ShouldPreserveUseListOrder(false),
- ShouldRenumberMetadata(false) {}
+ PrintModulePassWrapper() : ModulePass(ID), OS(dbgs()) {}
PrintModulePassWrapper(raw_ostream &OS, const std::string &Banner,
- bool ShouldPreserveUseListOrder,
- bool ShouldRenumberMetadata)
+ bool ShouldPreserveUseListOrder)
: ModulePass(ID), OS(OS), Banner(Banner),
- ShouldPreserveUseListOrder(ShouldPreserveUseListOrder),
- ShouldRenumberMetadata(ShouldRenumberMetadata) {}
+ ShouldPreserveUseListOrder(ShouldPreserveUseListOrder) {}
bool runOnModule(Module &M) override {
- if (ShouldRenumberMetadata)
- M.renumberMetadataForAssembly();
- printModule(OS, Banner, ShouldPreserveUseListOrder, M);
+ if (llvm::isFunctionInPrintList("*")) {
+ if (!Banner.empty())
+ OS << Banner << "\n";
+ M.print(OS, nullptr, ShouldPreserveUseListOrder);
+ } else {
+ bool BannerPrinted = false;
+ for (const auto &F : M.functions()) {
+ if (llvm::isFunctionInPrintList(F.getName())) {
+ if (!BannerPrinted && !Banner.empty()) {
+ OS << Banner << "\n";
+ BannerPrinted = true;
+ }
+ F.print(OS);
+ }
+ }
+ }
+
return false;
}
@@ -92,10 +80,10 @@ class PrintFunctionPassWrapper : public FunctionPass {
// This pass just prints a banner followed by the function as it's processed.
bool runOnFunction(Function &F) override {
if (isFunctionInPrintList(F.getName())) {
- if (forcePrintModuleIR()) {
- OS << Banner << " (function: " << F.getName() << ")\n";
- F.getParent()->print(OS, nullptr);
- } else
+ if (forcePrintModuleIR())
+ OS << Banner << " (function: " << F.getName() << ")\n"
+ << *F.getParent();
+ else
OS << Banner << '\n' << static_cast<Value &>(F);
}
@@ -121,16 +109,7 @@ INITIALIZE_PASS(PrintFunctionPassWrapper, "print-function",
ModulePass *llvm::createPrintModulePass(llvm::raw_ostream &OS,
const std::string &Banner,
bool ShouldPreserveUseListOrder) {
- return createPrintModulePass(OS, Banner, ShouldPreserveUseListOrder,
- /*ShouldRenumberMetadata=*/false);
-}
-
-ModulePass *llvm::createPrintModulePass(llvm::raw_ostream &OS,
- const std::string &Banner,
- bool ShouldPreserveUseListOrder,
- bool ShouldRenumberMetadata) {
- return new PrintModulePassWrapper(OS, Banner, ShouldPreserveUseListOrder,
- ShouldRenumberMetadata);
+ return new PrintModulePassWrapper(OS, Banner, ShouldPreserveUseListOrder);
}
FunctionPass *llvm::createPrintFunctionPass(llvm::raw_ostream &OS,
diff --git a/llvm/lib/IR/LLVMContextImpl.cpp b/llvm/lib/IR/LLVMContextImpl.cpp
index 5af5a477cf69a..9d094cc6d1b72 100644
--- a/llvm/lib/IR/LLVMContextImpl.cpp
+++ b/llvm/lib/IR/LLVMContextImpl.cpp
@@ -38,15 +38,6 @@ LLVMContextImpl::LLVMContextImpl(LLVMContext &C)
Int64Ty(C, 64), Int128Ty(C, 128), Byte1Ty(C, 1), Byte8Ty(C, 8),
Byte16Ty(C, 16), Byte32Ty(C, 32), Byte64Ty(C, 64), Byte128Ty(C, 128) {}
-void LLVMContextImpl::getAllMetadataNodes(
- SmallVectorImpl<MDNode *> &Nodes) const {
- Nodes.append(DistinctMDNodes.begin(), DistinctMDNodes.end());
-#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
- Nodes.append(CLASS##s.begin(), CLASS##s.end());
-#include "llvm/IR/Metadata.def"
- Nodes.append(TemporaryMDNodes.begin(), TemporaryMDNodes.end());
-}
-
LLVMContextImpl::~LLVMContextImpl() {
#ifndef NDEBUG
// Check that any variable location records that fell off the end of a block
diff --git a/llvm/lib/IR/LLVMContextImpl.h b/llvm/lib/IR/LLVMContextImpl.h
index a6342389d8543..2d22484d2ffb7 100644
--- a/llvm/lib/IR/LLVMContextImpl.h
+++ b/llvm/lib/IR/LLVMContextImpl.h
@@ -1637,20 +1637,6 @@ class LLVMContextImpl {
DenseMap<Metadata *, MetadataAsValue *> MetadataAsValues;
DenseSet<DIArgList *, DIArgListInfo> DIArgLists;
- uint32_t NextMetadataPrintID = 0;
-
- uint32_t allocateMetadataPrintID() { return NextMetadataPrintID++; }
-
- void getAllMetadataNodes(SmallVectorImpl<MDNode *> &Nodes) const;
-
- uint32_t getMetadataPrintID(const MDNode *N) const {
- return N->getHeader().MetadataPrintID;
- }
-
- void setMetadataPrintID(MDNode *N, uint32_t ID) {
- N->getHeader().MetadataPrintID = ID;
- }
-
#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
DenseSet<CLASS *, CLASS##Info> CLASS##s;
#include "llvm/IR/Metadata.def"
@@ -1664,10 +1650,6 @@ class LLVMContextImpl {
// them on context teardown.
std::vector<MDNode *> DistinctMDNodes;
- // Temporary nodes are caller-owned, but track live ones for persistent
- // metadata print IDs.
- DenseSet<MDNode *> TemporaryMDNodes;
-
// ConstantRangeListAttributeImpl is a TrailingObjects/ArrayRef of
// ConstantRange. Since this is a dynamically sized class, it's not
// possible to use SpecificBumpPtrAllocator. Instead, we use normal Alloc
diff --git a/llvm/lib/IR/Metadata.cpp b/llvm/lib/IR/Metadata.cpp
index 2b1a7bb117308..0a4141ee2362e 100644
--- a/llvm/lib/IR/Metadata.cpp
+++ b/llvm/lib/IR/Metadata.cpp
@@ -650,8 +650,6 @@ StringRef MDString::getString() const {
void *MDNode::operator new(size_t Size, size_t NumOps, StorageType Storage) {
// uint64_t is the most aligned type we need support (ensured by static_assert
// above)
- static_assert(sizeof(Header) == sizeof(size_t) + 2 * sizeof(uint32_t),
- "MDNode header fields poorly packed");
size_t AllocSize =
alignTo(Header::getAllocSize(Storage, NumOps), alignof(uint64_t));
char *Mem = reinterpret_cast<char *>(::operator new(AllocSize + Size));
@@ -669,8 +667,6 @@ void MDNode::operator delete(void *N) {
MDNode::MDNode(LLVMContext &Context, unsigned ID, StorageType Storage,
ArrayRef<Metadata *> Ops1, ArrayRef<Metadata *> Ops2)
: Metadata(ID, Storage), Context(Context) {
- getHeader().MetadataPrintID = Context.pImpl->allocateMetadataPrintID();
-
unsigned Op = 0;
for (Metadata *MD : Ops1)
setOperand(Op++, MD);
@@ -785,9 +781,6 @@ void MDNode::countUnresolvedOperands() {
void MDNode::makeUniqued() {
assert(isTemporary() && "Expected this to be temporary");
assert(!isResolved() && "Expected this to be unresolved");
- bool WasTracked = getContext().pImpl->TemporaryMDNodes.erase(this);
- assert(WasTracked && "Temporary node not tracked");
- (void)WasTracked;
// Enable uniquing callbacks.
for (auto &Op : mutable_operands())
@@ -988,11 +981,6 @@ void MDNode::handleChangedOperand(void *Ref, Metadata *New) {
}
void MDNode::deleteAsSubclass() {
- if (isTemporary()) {
- bool WasTracked = getContext().pImpl->TemporaryMDNodes.erase(this);
- assert(WasTracked && "Temporary node not tracked");
- (void)WasTracked;
- }
switch (getMetadataID()) {
default:
llvm_unreachable("Invalid subclass of MDNode");
@@ -1078,11 +1066,6 @@ void MDNode::deleteTemporary(MDNode *N) {
void MDNode::storeDistinctInContext() {
assert(!Context.hasReplaceableUses() && "Unexpected replaceable uses");
assert(!getNumUnresolved() && "Unexpected unresolved nodes");
- if (isTemporary()) {
- bool WasTracked = getContext().pImpl->TemporaryMDNodes.erase(this);
- assert(WasTracked && "Temporary node not tracked");
- (void)WasTracked;
- }
Storage = Distinct;
assert(isResolved() && "Expected this to be resolved");
diff --git a/llvm/lib/IR/MetadataImpl.h b/llvm/lib/IR/MetadataImpl.h
index 0045b7c406f97..b4188dd7d3ee4 100644
--- a/llvm/lib/IR/MetadataImpl.h
+++ b/llvm/lib/IR/MetadataImpl.h
@@ -33,7 +33,6 @@ template <class T> T *MDNode::storeImpl(T *N, StorageType Storage) {
N->storeDistinctInContext();
break;
case Temporary:
- N->getContext().pImpl->TemporaryMDNodes.insert(N);
break;
}
return N;
@@ -49,7 +48,6 @@ T *MDNode::storeImpl(T *N, StorageType Storage, StoreT &Store) {
N->storeDistinctInContext();
break;
case Temporary:
- N->getContext().pImpl->TemporaryMDNodes.insert(N);
break;
}
return N;
diff --git a/llvm/lib/IR/SSAContext.cpp b/llvm/lib/IR/SSAContext.cpp
index ca093a1e6a76c..feb8570d32757 100644
--- a/llvm/lib/IR/SSAContext.cpp
+++ b/llvm/lib/IR/SSAContext.cpp
@@ -93,7 +93,7 @@ template <> Printable SSAContext::print(const BasicBlock *BB) const {
return Printable([BB](raw_ostream &Out) { Out << BB->getName(); });
return Printable([BB](raw_ostream &Out) {
- ModuleSlotTracker MST{BB->getParent()->getParent()};
+ ModuleSlotTracker MST{BB->getParent()->getParent(), false};
MST.incorporateFunction(*BB->getParent());
Out << MST.getLocalSlot(BB);
});
diff --git a/llvm/lib/IRPrinter/IRPrintingPasses.cpp b/llvm/lib/IRPrinter/IRPrintingPasses.cpp
index 8893e34fdeec2..adb192ac4a916 100644
--- a/llvm/lib/IRPrinter/IRPrintingPasses.cpp
+++ b/llvm/lib/IRPrinter/IRPrintingPasses.cpp
@@ -23,22 +23,15 @@
using namespace llvm;
-PrintModulePass::PrintModulePass()
- : OS(dbgs()), ShouldPreserveUseListOrder(false), EmitSummaryIndex(false),
- ShouldRenumberMetadata(false) {}
+PrintModulePass::PrintModulePass() : OS(dbgs()) {}
PrintModulePass::PrintModulePass(raw_ostream &OS, const std::string &Banner,
bool ShouldPreserveUseListOrder,
- bool EmitSummaryIndex,
- bool ShouldRenumberMetadata)
+ bool EmitSummaryIndex)
: OS(OS), Banner(Banner),
ShouldPreserveUseListOrder(ShouldPreserveUseListOrder),
- EmitSummaryIndex(EmitSummaryIndex),
- ShouldRenumberMetadata(ShouldRenumberMetadata) {}
+ EmitSummaryIndex(EmitSummaryIndex) {}
PreservedAnalyses PrintModulePass::run(Module &M, ModuleAnalysisManager &AM) {
- if (ShouldRenumberMetadata)
- M.renumberMetadataForAssembly();
-
if (llvm::isFunctionInPrintList("*")) {
if (!Banner.empty())
OS << Banner << "\n";
@@ -75,10 +68,9 @@ PrintFunctionPass::PrintFunctionPass(raw_ostream &OS, const std::string &Banner)
PreservedAnalyses PrintFunctionPass::run(Function &F,
FunctionAnalysisManager &) {
if (isFunctionInPrintList(F.getName())) {
- if (forcePrintModuleIR()) {
- OS << Banner << " (function: " << F.getName() << ")\n";
- F.getParent()->print(OS, nullptr);
- } else
+ if (forcePrintModuleIR())
+ OS << Banner << " (function: " << F.getName() << ")\n" << *F.getParent();
+ else
OS << Banner << '\n' << static_cast<Value &>(F);
}
diff --git a/llvm/lib/Target/DirectX/DXILPrettyPrinter.cpp b/llvm/lib/Target/DirectX/DXILPrettyPrinter.cpp
index 8d8a7812e47f8..35990848e0e1d 100644
--- a/llvm/lib/Target/DirectX/DXILPrettyPrinter.cpp
+++ b/llvm/lib/Target/DirectX/DXILPrettyPrinter.cpp
@@ -9,9 +9,6 @@
#include "DXILPrettyPrinter.h"
#include "DirectX.h"
#include "DirectXIRPasses/DXILDebugInfo.h"
-#include "llvm/ADT/DenseSet.h"
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Analysis/DXILResource.h"
#include "llvm/IR/AssemblyAnnotationWriter.h"
@@ -265,25 +262,17 @@ static void prettyPrintResources(raw_ostream &OS, const DXILResourceMap &DRM,
}
namespace {
-class DXILModuleSlotTracker : public ModuleSlotTracker {
-public:
- using ModuleSlotTracker::ModuleSlotTracker;
- using ModuleSlotTracker::renumberMetadataForAssembly;
-};
-
class DXILAssemblyAnnotationWriter : public llvm::AssemblyAnnotationWriter {
private:
ModuleSlotTracker &MST;
AbstractSlotTrackerStorage &STS;
const DXILDebugInfoMap &DI;
- DenseSet<const MDNode *> &EmittedMDNodes;
public:
DXILAssemblyAnnotationWriter(ModuleSlotTracker &MST,
AbstractSlotTrackerStorage &STS,
- const DXILDebugInfoMap &DI,
- DenseSet<const MDNode *> &EmittedMDNodes)
- : MST(MST), STS(STS), DI(DI), EmittedMDNodes(EmittedMDNodes) {}
+ const DXILDebugInfoMap &DI)
+ : MST(MST), STS(STS), DI(DI) {}
void emitInstructionAnnot(const Instruction *OrigI,
formatted_raw_ostream &os) override {
@@ -295,11 +284,10 @@ class DXILAssemblyAnnotationWriter : public llvm::AssemblyAnnotationWriter {
}
void emitMDNodeAnnot(const MDNode *N, formatted_raw_ostream &os) override {
- EmittedMDNodes.insert(N);
-
if (const Metadata *NewMD = DI.MDReplace.lookup(N)) {
if (const auto *NewN = dyn_cast<MDNode>(NewMD))
- STS.createMetadataSlot(NewN);
+ if (STS.getMetadataSlot(NewN) == -1)
+ STS.createMetadataSlot(NewN);
os << "; DXIL: ";
N->printAsOperand(os, MST);
@@ -311,7 +299,8 @@ class DXILAssemblyAnnotationWriter : public llvm::AssemblyAnnotationWriter {
if (const Metadata *ExtraMD = DI.MDExtra.lookup(N)) {
if (const auto *ExtraN = dyn_cast<MDNode>(ExtraMD))
- STS.createMetadataSlot(ExtraN);
+ if (STS.getMetadataSlot(ExtraN) == -1)
+ STS.createMetadataSlot(ExtraN);
os << "; DXIL: ";
N->printAsOperand(os, MST);
@@ -324,71 +313,6 @@ class DXILAssemblyAnnotationWriter : public llvm::AssemblyAnnotationWriter {
};
} // namespace
-static SmallVector<const MDNode *>
-collectAdditionalMetadata(Module &M, const DXILDebugInfoMap &DI) {
- // Annotation metadata follows module metadata in the order its keys print.
- // Follow replacement graphs to preserve that order in canonical output.
- M.renumberMetadataForAssembly();
-
- ModuleSlotTracker MST(&M);
- AbstractSlotTrackerStorage *STS = nullptr;
- MST.setProcessHook(
- [&](AbstractSlotTrackerStorage *STS_, const Module *) { STS = STS_; });
- MDNode::get(M.getContext(), {})->print(llvm::nulls(), MST);
- assert(STS && "Slot tracker storage should have been initialised");
-
- DenseSet<const Metadata *> ReplacementMetadata;
- for (auto [_, Replacement] : DI.MDReplace)
- ReplacementMetadata.insert(Replacement);
-
- SmallVector<std::pair<unsigned, const MDNode *>> OriginalNodes;
- DenseSet<const MDNode *> Queued;
- auto AddOriginal = [&](const Metadata *MD) {
- const auto *N = dyn_cast<MDNode>(MD);
- if (!N || ReplacementMetadata.contains(N) || !Queued.insert(N).second)
- return;
- OriginalNodes.emplace_back(STS->getMetadataSlot(N), N);
- };
- for (auto [Original, _] : DI.MDReplace)
- AddOriginal(Original);
- for (auto [Original, _] : DI.MDExtra)
- AddOriginal(Original);
- llvm::sort(OriginalNodes);
-
- SmallVector<const MDNode *> Worklist;
- for (auto [_, N] : OriginalNodes)
- Worklist.push_back(N);
-
- SmallVector<const MDNode *> AdditionalMetadata;
- auto AddAdditional = [&](const Metadata *MD) {
- const auto *Root = dyn_cast_or_null<MDNode>(MD);
- if (!Root || Queued.contains(Root))
- return;
-
- AdditionalMetadata.push_back(Root);
- SmallVector<const MDNode *> Nodes = {Root};
- while (!Nodes.empty()) {
- const MDNode *N = Nodes.pop_back_val();
- if (!Queued.insert(N).second)
- continue;
- Worklist.push_back(N);
- for (const MDOperand &Op : llvm::reverse(N->operands()))
- if (const auto *OpNode = dyn_cast_or_null<MDNode>(Op.get()))
- Nodes.push_back(OpNode);
- }
- };
-
- for (size_t I = 0; I != Worklist.size(); ++I) {
- const MDNode *N = Worklist[I];
- if (const Metadata *Replacement = DI.MDReplace.lookup(N)) {
- AddAdditional(Replacement);
- continue;
- }
- AddAdditional(DI.MDExtra.lookup(N));
- }
- return AdditionalMetadata;
-}
-
static void prettyPrint(raw_ostream &OS, Module &M, const DXILResourceMap &DRM,
DXILResourceTypeMap &DRTM) {
formatted_raw_ostream FOS(OS);
@@ -397,32 +321,30 @@ static void prettyPrint(raw_ostream &OS, Module &M, const DXILResourceMap &DRM,
DXILDebugInfoMap DI = DXILDebugInfoPass::run(M);
- SmallVector<const MDNode *> AdditionalMetadata =
- collectAdditionalMetadata(M, DI);
- DXILModuleSlotTracker MST(&M);
- MST.renumberMetadataForAssembly(AdditionalMetadata);
+ ModuleSlotTracker MST(&M);
AbstractSlotTrackerStorage *STS = nullptr;
+ unsigned NextMetadataSlot = 0;
MST.setProcessHook(
- [&](AbstractSlotTrackerStorage *STS_, const Module *) { STS = STS_; });
+ [&](AbstractSlotTrackerStorage *STS_, const Module *, bool) {
+ STS = STS_;
+ NextMetadataSlot = STS->getNextMetadataSlot();
+ });
// Force initialisation. ModuleSlotTracker does not have a dedicated function
// for this so trigger it through a dummy print.
MDNode::get(M.getContext(), {})->print(llvm::nulls(), MST);
assert(STS && "Slot tracker storage should have been initialised");
- DenseSet<const MDNode *> EmittedMDNodes;
- DXILAssemblyAnnotationWriter DAAW(MST, *STS, DI, EmittedMDNodes);
+ DXILAssemblyAnnotationWriter DAAW(MST, *STS, DI);
M.print(FOS, &DAAW);
ModuleSlotTracker::MachineMDNodeListType MDNodes;
- MST.collectMDNodes(MDNodes);
+ MST.collectMDNodes(MDNodes, NextMetadataSlot, ~0u);
std::sort(MDNodes.begin(), MDNodes.end(),
[](const std::pair<unsigned, const MDNode *> &A,
const std::pair<unsigned, const MDNode *> &B) {
return A.first < B.first;
});
for (auto [_, MDNode] : MDNodes) {
- if (EmittedMDNodes.contains(MDNode))
- continue;
DAAW.emitMDNodeAnnot(MDNode, FOS);
MDNode->print(FOS, MST);
FOS << "\n";
diff --git a/llvm/test/CodeGen/DirectX/DebugInfo/di-globalvariable.ll b/llvm/test/CodeGen/DirectX/DebugInfo/di-globalvariable.ll
index fd23adbcd42b5..978c6f6cfb221 100644
--- a/llvm/test/CodeGen/DirectX/DebugInfo/di-globalvariable.ll
+++ b/llvm/test/CodeGen/DirectX/DebugInfo/di-globalvariable.ll
@@ -1,5 +1,4 @@
; RUN: llc %s -o - | FileCheck %s
-; RUN: llc %s -o - | FileCheck %s --check-prefix=NO-DUP
target triple = "dxil-unknown-shadermodel6.3-library"
@@ -25,12 +24,6 @@ define void @foo() {
; CHECK-DAG: ![[FILE]] = !DIFile(filename: "cu.cpp", directory: "/tmp")
; CHECK-DAG: ![[TYPE]] = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
-; NO-DUP: ![[GVY:[0-9]+]] = !DIGlobalVariable(name: "y"
-; NO-DUP-NOT: ![[GVY]] =
-; NO-DUP: ![[GVX:[0-9]+]] = !DIGlobalVariable(name: "x"
-; NO-DUP-NOT: ![[GVX]] =
-; NO-DUP-NOT: ![[GVY]] =
-
!llvm.dbg.cu = !{!4}
!llvm.module.flags = !{!8, !9}
diff --git a/llvm/test/CodeGen/Hexagon/swp-no-alias.mir b/llvm/test/CodeGen/Hexagon/swp-no-alias.mir
index c37b9b32f8230..38b7212702ff9 100644
--- a/llvm/test/CodeGen/Hexagon/swp-no-alias.mir
+++ b/llvm/test/CodeGen/Hexagon/swp-no-alias.mir
@@ -27,7 +27,7 @@
# CHECK-DAG: SU(4): Data Latency=0 Reg=%10
# CHECK-DAG: SU(2): Data Latency=0 Reg=%10
# CHECK-DAG: SU(7): Anti Latency=1
-# CHECK-NEXT: SU(2): %12:hvxvr = V6_vL32b_ai %10:intregs, 0 :: (load (s1024) from %ir.iptr.09, !tbaa !10)
+# CHECK-NEXT: SU(2): %12:hvxvr = V6_vL32b_ai %10:intregs, 0 :: (load (s1024) from %ir.iptr.09, !tbaa !4)
# CHECK-NEXT: # preds left
# CHECK-NEXT: # succs left
# CHECK-NEXT: # rdefs left
@@ -38,7 +38,7 @@
# CHECK-NEXT: SU(1): Data Latency=0 Reg=%10
# CHECK-NEXT: Successors:
# CHECK-NEXT: SU(3): Data Latency=0 Reg=%12
-# CHECK-NEXT: SU(3): V6_vS32b_ai %8:intregs, 0, %12:hvxvr :: (store (s1024) into %ir.optr.010, !tbaa !10)
+# CHECK-NEXT: SU(3): V6_vS32b_ai %8:intregs, 0, %12:hvxvr :: (store (s1024) into %ir.optr.010, !tbaa !4)
# CHECK-NEXT: # preds left
# CHECK-NEXT: # succs left
# CHECK-NEXT: # rdefs left
@@ -48,7 +48,7 @@
# CHECK-NEXT: Predecessors:
# CHECK-DAG: SU(2): Data Latency=0 Reg=%12
# CHECK-DAG: SU(0): Data Latency=0 Reg=%8
-# CHECK-NEXT: SU(4): %13:hvxvr = V6_vL32b_ai %10:intregs, 128 :: (load (s1024) from %ir.cgep, !tbaa !10)
+# CHECK-NEXT: SU(4): %13:hvxvr = V6_vL32b_ai %10:intregs, 128 :: (load (s1024) from %ir.cgep, !tbaa !4)
# CHECK-NEXT: # preds left
# CHECK-NEXT: # succs left
# CHECK-NEXT: # rdefs left
@@ -59,7 +59,7 @@
# CHECK-NEXT: SU(1): Data Latency=0 Reg=%10
# CHECK-NEXT: Successors:
# CHECK-NEXT: SU(5): Data Latency=0 Reg=%13
-# CHECK-NEXT: SU(5): V6_vS32b_ai %8:intregs, 128, %13:hvxvr :: (store (s1024) into %ir.cgep3, !tbaa !10)
+# CHECK-NEXT: SU(5): V6_vS32b_ai %8:intregs, 128, %13:hvxvr :: (store (s1024) into %ir.cgep3, !tbaa !4)
diff --git a/llvm/test/CodeGen/MIR/AMDGPU/instr-mmra.mir b/llvm/test/CodeGen/MIR/AMDGPU/instr-mmra.mir
index 7dce5c230df63..62593255ea4ab 100644
--- a/llvm/test/CodeGen/MIR/AMDGPU/instr-mmra.mir
+++ b/llvm/test/CodeGen/MIR/AMDGPU/instr-mmra.mir
@@ -19,7 +19,7 @@ body: |
liveins: $vgpr0, $vgpr1
; CHECK-LABEL: name: test_mmra
- ; CHECK: ATOMIC_FENCE 5, 2, mmra !{{[0-9]+}}
+ ; CHECK: ATOMIC_FENCE 5, 2, mmra !0
ATOMIC_FENCE 5, 2, mmra !0
S_ENDPGM 0
...
diff --git a/llvm/test/CodeGen/MIR/AMDGPU/machine-metadata.mir b/llvm/test/CodeGen/MIR/AMDGPU/machine-metadata.mir
index 45cf5a3fb7f7b..9570f8b98c468 100644
--- a/llvm/test/CodeGen/MIR/AMDGPU/machine-metadata.mir
+++ b/llvm/test/CodeGen/MIR/AMDGPU/machine-metadata.mir
@@ -86,11 +86,11 @@ body: |
; CHECK: [[REG_SEQUENCE:%[0-9]+]]:vreg_64 = REG_SEQUENCE [[COPY2]], %subreg.sub0, [[COPY1]], %subreg.sub1
; CHECK: [[REG_SEQUENCE1:%[0-9]+]]:vreg_64 = REG_SEQUENCE [[COPY4]], %subreg.sub0, [[COPY3]], %subreg.sub1
; CHECK: [[COPY5:%[0-9]+]]:vreg_64 = COPY [[REG_SEQUENCE1]]
- ; CHECK: [[GLOBAL_LOAD_DWORDX4_:%[0-9]+]]:vreg_128 = GLOBAL_LOAD_DWORDX4 [[COPY5]], 16, 0, implicit $exec :: (load (s128) from %ir.p1, align 4, !alias.scope ![[LOAD_SCOPE:[0-9]+]], !noalias ![[LOAD_NOALIAS:[0-9]+]], addrspace 1)
+ ; CHECK: [[GLOBAL_LOAD_DWORDX4_:%[0-9]+]]:vreg_128 = GLOBAL_LOAD_DWORDX4 [[COPY5]], 16, 0, implicit $exec :: (load (s128) from %ir.p1, align 4, !alias.scope !5, !noalias !8, addrspace 1)
; CHECK: [[COPY6:%[0-9]+]]:vreg_64 = COPY [[REG_SEQUENCE1]]
- ; CHECK: GLOBAL_STORE_DWORDX4 [[COPY6]], killed [[GLOBAL_LOAD_DWORDX4_]], 0, 0, implicit $exec :: (store (s128) into %ir.p0, align 4, !alias.scope ![[STORE_SCOPE:[0-9]+]], !noalias ![[STORE_NOALIAS:[0-9]+]], addrspace 1)
+ ; CHECK: GLOBAL_STORE_DWORDX4 [[COPY6]], killed [[GLOBAL_LOAD_DWORDX4_]], 0, 0, implicit $exec :: (store (s128) into %ir.p0, align 4, !alias.scope !10, !noalias !11, addrspace 1)
; CHECK: [[COPY7:%[0-9]+]]:vreg_64 = COPY [[REG_SEQUENCE]]
- ; CHECK: [[GLOBAL_LOAD_DWORDX2_:%[0-9]+]]:vreg_64 = GLOBAL_LOAD_DWORDX2 killed [[COPY7]], 0, 0, implicit $exec :: (load (s64) from %ir.1, align 4, !alias.scope ![[IR_SCOPE:[0-9]+]], !noalias ![[IR_NOALIAS:[0-9]+]], addrspace 1)
+ ; CHECK: [[GLOBAL_LOAD_DWORDX2_:%[0-9]+]]:vreg_64 = GLOBAL_LOAD_DWORDX2 killed [[COPY7]], 0, 0, implicit $exec :: (load (s64) from %ir.1, align 4, !alias.scope !3, !noalias !0, addrspace 1)
; CHECK: [[COPY8:%[0-9]+]]:vgpr_32 = COPY [[GLOBAL_LOAD_DWORDX2_]].sub0
; CHECK: [[COPY9:%[0-9]+]]:vgpr_32 = COPY [[GLOBAL_LOAD_DWORDX2_]].sub1
; CHECK: [[V_ADD_U32_e64_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e64 killed [[COPY8]], killed [[COPY9]], 0, implicit $exec
@@ -137,11 +137,11 @@ body: |
; CHECK: [[REG_SEQUENCE:%[0-9]+]]:vreg_64 = REG_SEQUENCE [[COPY2]], %subreg.sub0, [[COPY1]], %subreg.sub1
; CHECK: [[REG_SEQUENCE1:%[0-9]+]]:vreg_64 = REG_SEQUENCE [[COPY4]], %subreg.sub0, [[COPY3]], %subreg.sub1
; CHECK: [[COPY5:%[0-9]+]]:vreg_64 = COPY [[REG_SEQUENCE1]]
- ; CHECK: [[GLOBAL_LOAD_DWORDX4_:%[0-9]+]]:vreg_128 = GLOBAL_LOAD_DWORDX4 [[COPY5]], 16, 0, implicit $exec :: (load (s128) from %ir.p1, align 4, !alias.scope ![[INLINE_LOAD_SCOPE:[0-9]+]], !noalias ![[INLINE_LOAD_NOALIAS:[0-9]+]], addrspace 1)
+ ; CHECK: [[GLOBAL_LOAD_DWORDX4_:%[0-9]+]]:vreg_128 = GLOBAL_LOAD_DWORDX4 [[COPY5]], 16, 0, implicit $exec :: (load (s128) from %ir.p1, align 4, !alias.scope !5, !noalias !8, addrspace 1)
; CHECK: [[COPY6:%[0-9]+]]:vreg_64 = COPY [[REG_SEQUENCE1]]
- ; CHECK: GLOBAL_STORE_DWORDX4 [[COPY6]], killed [[GLOBAL_LOAD_DWORDX4_]], 0, 0, implicit $exec :: (store (s128) into %ir.p0, align 4, !alias.scope ![[INLINE_STORE_SCOPE:[0-9]+]], !noalias ![[INLINE_STORE_NOALIAS:[0-9]+]], addrspace 1)
+ ; CHECK: GLOBAL_STORE_DWORDX4 [[COPY6]], killed [[GLOBAL_LOAD_DWORDX4_]], 0, 0, implicit $exec :: (store (s128) into %ir.p0, align 4, !alias.scope !10, !noalias !11, addrspace 1)
; CHECK: [[COPY7:%[0-9]+]]:vreg_64 = COPY [[REG_SEQUENCE]]
- ; CHECK: [[GLOBAL_LOAD_DWORDX2_:%[0-9]+]]:vreg_64 = GLOBAL_LOAD_DWORDX2 killed [[COPY7]], 0, 0, implicit $exec :: (load (s64) from %ir.1, align 4, !alias.scope ![[IR_SCOPE]], !noalias ![[IR_NOALIAS]], addrspace 1)
+ ; CHECK: [[GLOBAL_LOAD_DWORDX2_:%[0-9]+]]:vreg_64 = GLOBAL_LOAD_DWORDX2 killed [[COPY7]], 0, 0, implicit $exec :: (load (s64) from %ir.1, align 4, !alias.scope !3, !noalias !0, addrspace 1)
; CHECK: [[COPY8:%[0-9]+]]:vgpr_32 = COPY [[GLOBAL_LOAD_DWORDX2_]].sub0
; CHECK: [[COPY9:%[0-9]+]]:vgpr_32 = COPY [[GLOBAL_LOAD_DWORDX2_]].sub1
; CHECK: [[V_ADD_U32_e64_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e64 killed [[COPY8]], killed [[COPY9]], 0, implicit $exec
diff --git a/llvm/test/CodeGen/MIR/X86/instr-heap-alloc-operands.mir b/llvm/test/CodeGen/MIR/X86/instr-heap-alloc-operands.mir
index 724335cc371dc..ca59e5fe7b8fd 100644
--- a/llvm/test/CodeGen/MIR/X86/instr-heap-alloc-operands.mir
+++ b/llvm/test/CodeGen/MIR/X86/instr-heap-alloc-operands.mir
@@ -34,7 +34,7 @@ body: |
ADJCALLSTACKDOWN64 32, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
$ecx = COPY %0
CALL64pcrel32 @f, csr_win64, implicit $rsp, implicit $ssp, implicit $ecx, implicit-def $rsp, implicit-def $ssp, implicit-def dead $rax, heap-alloc-marker !2
- ; CHECK: CALL64pcrel32 @f, {{.*}} heap-alloc-marker !{{[0-9]+}}
+ ; CHECK: CALL64pcrel32 @f, {{.*}} heap-alloc-marker !2
ADJCALLSTACKUP64 32, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp
$eax = MOV32r0 implicit-def dead $eflags
RET 0, killed $eax
diff --git a/llvm/test/CodeGen/MIR/X86/instr-pcsections.mir b/llvm/test/CodeGen/MIR/X86/instr-pcsections.mir
index 4a50838f45444..947d93ef35937 100644
--- a/llvm/test/CodeGen/MIR/X86/instr-pcsections.mir
+++ b/llvm/test/CodeGen/MIR/X86/instr-pcsections.mir
@@ -27,7 +27,7 @@ body: |
liveins: $rdi
; CHECK-LABEL: name: test
- ; CHECK: MOV{{.*}} pcsections !{{[0-9]+}}
+ ; CHECK: MOV{{.*}} pcsections !0
renamable $al = MOV8rm killed renamable $rdi, 1, $noreg, 0, $noreg, pcsections !0
RET64 implicit killed $al
diff --git a/llvm/test/CodeGen/MIR/X86/instructions-debug-location.mir b/llvm/test/CodeGen/MIR/X86/instructions-debug-location.mir
index 11b41182a36af..11fed8ae64fd0 100644
--- a/llvm/test/CodeGen/MIR/X86/instructions-debug-location.mir
+++ b/llvm/test/CodeGen/MIR/X86/instructions-debug-location.mir
@@ -72,10 +72,10 @@ stack:
body: |
bb.0.entry:
liveins: $edi
- ; CHECK: DBG_VALUE $noreg, 0, ![[VAR:[0-9]+]], !DIExpression(), debug-location ![[VAR_LOC:[0-9]+]]
- ; CHECK: DBG_VALUE $noreg, 0, ![[VAR]], !DIExpression(), debug-location ![[VAR_LOC]]
- ; CHECK: $eax = COPY %0, debug-location ![[RET_LOC:[0-9]+]]
- ; CHECK: RET64 $eax, debug-location ![[RET_LOC]]
+ ; CHECK: DBG_VALUE $noreg, 0, !11, !DIExpression(), debug-location !12
+ ; CHECK: DBG_VALUE $noreg, 0, !11, !DIExpression(), debug-location !12
+ ; CHECK: $eax = COPY %0, debug-location !13
+ ; CHECK: RET64 $eax, debug-location !13
%0 = COPY $edi
DBG_VALUE _, 0, !12, !DIExpression(), debug-location !13
; Test whether debug-use is still recognized for compatibility with old
@@ -99,9 +99,9 @@ body: |
liveins: $edi
%0 = COPY $edi
- ; CHECK: DBG_VALUE $noreg, i32 0, ![[VAR]], !DIExpression()
- ; CHECK-NEXT: DBG_VALUE $noreg, i64 -22, ![[VAR]], !DIExpression()
- ; CHECK-NEXT: DBG_VALUE $noreg, i128 123492148938512984928424384934328985928, ![[VAR]], !DIExpression()
+ ; CHECK: DBG_VALUE $noreg, i32 0, !11, !DIExpression()
+ ; CHECK-NEXT: DBG_VALUE $noreg, i64 -22, !11, !DIExpression()
+ ; CHECK-NEXT: DBG_VALUE $noreg, i128 123492148938512984928424384934328985928, !11, !DIExpression()
DBG_VALUE _, i32 0, !12, !DIExpression(), debug-location !13
DBG_VALUE _, i64 -22, !12, !DIExpression(), debug-location !13
DBG_VALUE _, i128 123492148938512984928424384934328985928, !12, !DIExpression(), debug-location !13
diff --git a/llvm/test/CodeGen/MIR/X86/machine-metadata.mir b/llvm/test/CodeGen/MIR/X86/machine-metadata.mir
index cb782c88b40b4..47929752f1af8 100644
--- a/llvm/test/CodeGen/MIR/X86/machine-metadata.mir
+++ b/llvm/test/CodeGen/MIR/X86/machine-metadata.mir
@@ -76,12 +76,12 @@ body: |
; CHECK-LABEL: name: test_memcpy
; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi
; CHECK: [[COPY1:%[0-9]+]]:gr64 = COPY $rdi
- ; CHECK: [[MOV64rm:%[0-9]+]]:gr64 = MOV64rm [[COPY1]], 1, $noreg, 16, $noreg :: (load (s64) from %ir.p1, align 4, !alias.scope ![[MEMCPY_LOAD_SCOPE:[0-9]+]], !noalias ![[MEMCPY_LOAD_NOALIAS:[0-9]+]])
- ; CHECK: [[MOV64rm1:%[0-9]+]]:gr64 = MOV64rm [[COPY1]], 1, $noreg, 24, $noreg :: (load (s64) from %ir.p1 + 8, align 4, !alias.scope ![[MEMCPY_LOAD_SCOPE]], !noalias ![[MEMCPY_LOAD_NOALIAS]])
- ; CHECK: MOV64mr [[COPY1]], 1, $noreg, 8, $noreg, killed [[MOV64rm1]] :: (store (s64) into %ir.p0 + 8, align 4, !alias.scope ![[MEMCPY_STORE_SCOPE:[0-9]+]], !noalias ![[MEMCPY_STORE_NOALIAS:[0-9]+]])
- ; CHECK: MOV64mr [[COPY1]], 1, $noreg, 0, $noreg, killed [[MOV64rm]] :: (store (s64) into %ir.p0, align 4, !alias.scope ![[MEMCPY_STORE_SCOPE]], !noalias ![[MEMCPY_STORE_NOALIAS]])
- ; CHECK: [[MOV32rm:%[0-9]+]]:gr32 = MOV32rm [[COPY]], 1, $noreg, 0, $noreg :: (load (s32) from %ir.q, !alias.scope ![[IR_SCOPE:[0-9]+]], !noalias ![[IR_NOALIAS:[0-9]+]])
- ; CHECK: [[ADD32rm:%[0-9]+]]:gr32 = ADD32rm [[MOV32rm]], [[COPY]], 1, $noreg, 4, $noreg, implicit-def dead $eflags :: (load (s32) from %ir.q1, !alias.scope ![[IR_SCOPE]], !noalias ![[IR_NOALIAS]])
+ ; CHECK: [[MOV64rm:%[0-9]+]]:gr64 = MOV64rm [[COPY1]], 1, $noreg, 16, $noreg :: (load (s64) from %ir.p1, align 4, !alias.scope !5, !noalias !8)
+ ; CHECK: [[MOV64rm1:%[0-9]+]]:gr64 = MOV64rm [[COPY1]], 1, $noreg, 24, $noreg :: (load (s64) from %ir.p1 + 8, align 4, !alias.scope !5, !noalias !8)
+ ; CHECK: MOV64mr [[COPY1]], 1, $noreg, 8, $noreg, killed [[MOV64rm1]] :: (store (s64) into %ir.p0 + 8, align 4, !alias.scope !10, !noalias !11)
+ ; CHECK: MOV64mr [[COPY1]], 1, $noreg, 0, $noreg, killed [[MOV64rm]] :: (store (s64) into %ir.p0, align 4, !alias.scope !10, !noalias !11)
+ ; CHECK: [[MOV32rm:%[0-9]+]]:gr32 = MOV32rm [[COPY]], 1, $noreg, 0, $noreg :: (load (s32) from %ir.q, !alias.scope !3, !noalias !0)
+ ; CHECK: [[ADD32rm:%[0-9]+]]:gr32 = ADD32rm [[MOV32rm]], [[COPY]], 1, $noreg, 4, $noreg, implicit-def dead $eflags :: (load (s32) from %ir.q1, !alias.scope !3, !noalias !0)
; CHECK: $eax = COPY [[ADD32rm]]
; CHECK: RET 0, $eax
%1:gr64 = COPY $rsi
@@ -113,12 +113,12 @@ body: |
; CHECK-LABEL: name: test_memcpy_inline
; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi
; CHECK: [[COPY1:%[0-9]+]]:gr64 = COPY $rdi
- ; CHECK: [[MOV64rm:%[0-9]+]]:gr64 = MOV64rm [[COPY1]], 1, $noreg, 16, $noreg :: (load (s64) from %ir.p1, align 4, !alias.scope ![[INLINE_LOAD_SCOPE:[0-9]+]], !noalias ![[INLINE_LOAD_NOALIAS:[0-9]+]])
- ; CHECK: [[MOV64rm1:%[0-9]+]]:gr64 = MOV64rm [[COPY1]], 1, $noreg, 24, $noreg :: (load (s64) from %ir.p1 + 8, align 4, !alias.scope ![[INLINE_LOAD_SCOPE]], !noalias ![[INLINE_LOAD_NOALIAS]])
- ; CHECK: MOV64mr [[COPY1]], 1, $noreg, 8, $noreg, killed [[MOV64rm1]] :: (store (s64) into %ir.p0 + 8, align 4, !alias.scope ![[INLINE_STORE_SCOPE:[0-9]+]], !noalias ![[INLINE_STORE_NOALIAS:[0-9]+]])
- ; CHECK: MOV64mr [[COPY1]], 1, $noreg, 0, $noreg, killed [[MOV64rm]] :: (store (s64) into %ir.p0, align 4, !alias.scope ![[INLINE_STORE_SCOPE]], !noalias ![[INLINE_STORE_NOALIAS]])
- ; CHECK: [[MOV32rm:%[0-9]+]]:gr32 = MOV32rm [[COPY]], 1, $noreg, 0, $noreg :: (load (s32) from %ir.q, !alias.scope ![[IR_SCOPE]], !noalias ![[IR_NOALIAS]])
- ; CHECK: [[ADD32rm:%[0-9]+]]:gr32 = ADD32rm [[MOV32rm]], [[COPY]], 1, $noreg, 4, $noreg, implicit-def dead $eflags :: (load (s32) from %ir.q1, !alias.scope ![[IR_SCOPE]], !noalias ![[IR_NOALIAS]])
+ ; CHECK: [[MOV64rm:%[0-9]+]]:gr64 = MOV64rm [[COPY1]], 1, $noreg, 16, $noreg :: (load (s64) from %ir.p1, align 4, !alias.scope !5, !noalias !8)
+ ; CHECK: [[MOV64rm1:%[0-9]+]]:gr64 = MOV64rm [[COPY1]], 1, $noreg, 24, $noreg :: (load (s64) from %ir.p1 + 8, align 4, !alias.scope !5, !noalias !8)
+ ; CHECK: MOV64mr [[COPY1]], 1, $noreg, 8, $noreg, killed [[MOV64rm1]] :: (store (s64) into %ir.p0 + 8, align 4, !alias.scope !10, !noalias !11)
+ ; CHECK: MOV64mr [[COPY1]], 1, $noreg, 0, $noreg, killed [[MOV64rm]] :: (store (s64) into %ir.p0, align 4, !alias.scope !10, !noalias !11)
+ ; CHECK: [[MOV32rm:%[0-9]+]]:gr32 = MOV32rm [[COPY]], 1, $noreg, 0, $noreg :: (load (s32) from %ir.q, !alias.scope !3, !noalias !0)
+ ; CHECK: [[ADD32rm:%[0-9]+]]:gr32 = ADD32rm [[MOV32rm]], [[COPY]], 1, $noreg, 4, $noreg, implicit-def dead $eflags :: (load (s32) from %ir.q1, !alias.scope !3, !noalias !0)
; CHECK: $eax = COPY [[ADD32rm]]
; CHECK: RET 0, $eax
%1:gr64 = COPY $rsi
@@ -150,12 +150,12 @@ body: |
; CHECK-LABEL: name: test_mempcpy
; CHECK: [[COPY:%[0-9]+]]:gr64 = COPY $rsi
; CHECK: [[COPY1:%[0-9]+]]:gr64 = COPY $rdi
- ; CHECK: [[MOV64rm:%[0-9]+]]:gr64 = MOV64rm [[COPY1]], 1, $noreg, 16, $noreg :: (load (s64) from %ir.p1, align 1, !alias.scope ![[MEMPCPY_LOAD_SCOPE:[0-9]+]], !noalias ![[MEMPCPY_LOAD_NOALIAS:[0-9]+]])
- ; CHECK: [[MOV64rm1:%[0-9]+]]:gr64 = MOV64rm [[COPY1]], 1, $noreg, 24, $noreg :: (load (s64) from %ir.p1 + 8, align 1, !alias.scope ![[MEMPCPY_LOAD_SCOPE]], !noalias ![[MEMPCPY_LOAD_NOALIAS]])
- ; CHECK: MOV64mr [[COPY1]], 1, $noreg, 8, $noreg, killed [[MOV64rm1]] :: (store (s64) into %ir.p0 + 8, align 1, !alias.scope ![[MEMPCPY_STORE_SCOPE:[0-9]+]], !noalias ![[MEMPCPY_STORE_NOALIAS:[0-9]+]])
- ; CHECK: MOV64mr [[COPY1]], 1, $noreg, 0, $noreg, killed [[MOV64rm]] :: (store (s64) into %ir.p0, align 1, !alias.scope ![[MEMPCPY_STORE_SCOPE]], !noalias ![[MEMPCPY_STORE_NOALIAS]])
- ; CHECK: [[MOV32rm:%[0-9]+]]:gr32 = MOV32rm [[COPY]], 1, $noreg, 0, $noreg :: (load (s32) from %ir.q, !alias.scope ![[IR_SCOPE]], !noalias ![[IR_NOALIAS]])
- ; CHECK: [[ADD32rm:%[0-9]+]]:gr32 = ADD32rm [[MOV32rm]], [[COPY]], 1, $noreg, 4, $noreg, implicit-def dead $eflags :: (load (s32) from %ir.q1, !alias.scope ![[IR_SCOPE]], !noalias ![[IR_NOALIAS]])
+ ; CHECK: [[MOV64rm:%[0-9]+]]:gr64 = MOV64rm [[COPY1]], 1, $noreg, 16, $noreg :: (load (s64) from %ir.p1, align 1, !alias.scope !5, !noalias !8)
+ ; CHECK: [[MOV64rm1:%[0-9]+]]:gr64 = MOV64rm [[COPY1]], 1, $noreg, 24, $noreg :: (load (s64) from %ir.p1 + 8, align 1, !alias.scope !5, !noalias !8)
+ ; CHECK: MOV64mr [[COPY1]], 1, $noreg, 8, $noreg, killed [[MOV64rm1]] :: (store (s64) into %ir.p0 + 8, align 1, !alias.scope !10, !noalias !11)
+ ; CHECK: MOV64mr [[COPY1]], 1, $noreg, 0, $noreg, killed [[MOV64rm]] :: (store (s64) into %ir.p0, align 1, !alias.scope !10, !noalias !11)
+ ; CHECK: [[MOV32rm:%[0-9]+]]:gr32 = MOV32rm [[COPY]], 1, $noreg, 0, $noreg :: (load (s32) from %ir.q, !alias.scope !3, !noalias !0)
+ ; CHECK: [[ADD32rm:%[0-9]+]]:gr32 = ADD32rm [[MOV32rm]], [[COPY]], 1, $noreg, 4, $noreg, implicit-def dead $eflags :: (load (s32) from %ir.q1, !alias.scope !3, !noalias !0)
; CHECK: $eax = COPY [[ADD32rm]]
; CHECK: RET 0, $eax
%1:gr64 = COPY $rsi
diff --git a/llvm/test/CodeGen/MIR/X86/mem-cache-hint.mir b/llvm/test/CodeGen/MIR/X86/mem-cache-hint.mir
index f59023de10e77..196307e14ef1d 100644
--- a/llvm/test/CodeGen/MIR/X86/mem-cache-hint.mir
+++ b/llvm/test/CodeGen/MIR/X86/mem-cache-hint.mir
@@ -28,9 +28,9 @@ body: |
; CHECK: liveins: $rdi, $esi
; CHECK-NEXT: {{ $}}
; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rdi
- ; CHECK-NEXT: [[MOV32rm:%[0-9]+]]:gr32 = MOV32rm [[COPY]], 1, $noreg, 0, $noreg :: (load (s32) from %ir.p, !mem.cache_hint !{{[0-9]+}})
+ ; CHECK-NEXT: [[MOV32rm:%[0-9]+]]:gr32 = MOV32rm [[COPY]], 1, $noreg, 0, $noreg :: (load (s32) from %ir.p, !mem.cache_hint !0)
; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $esi
- ; CHECK-NEXT: MOV32mr [[COPY]], 1, $noreg, 0, $noreg, [[COPY1]] :: (store (s32) into %ir.p, !mem.cache_hint !{{[0-9]+}})
+ ; CHECK-NEXT: MOV32mr [[COPY]], 1, $noreg, 0, $noreg, [[COPY1]] :: (store (s32) into %ir.p, !mem.cache_hint !2)
; CHECK-NEXT: $eax = COPY [[MOV32rm]]
; CHECK-NEXT: RET 0, $eax
%0:gr64 = COPY $rdi
diff --git a/llvm/test/CodeGen/MIR/X86/memory-operands.mir b/llvm/test/CodeGen/MIR/X86/memory-operands.mir
index b738dd9b12b51..60a5a4b192aed 100644
--- a/llvm/test/CodeGen/MIR/X86/memory-operands.mir
+++ b/llvm/test/CodeGen/MIR/X86/memory-operands.mir
@@ -459,8 +459,8 @@ body: |
bb.0.entry:
$rax = MOV64rm $rip, 1, _, @a, _ :: (load (s64) from got)
; CHECK-LABEL: name: tbaa_metadata
- ; CHECK: $eax = MOV32rm killed $rax, 1, $noreg, 0, $noreg, implicit-def $rax :: (load (s32) from @a, !tbaa !{{[0-9]+}})
- ; CHECK-NEXT: $eax = MOV32rm killed $rax, 1, $noreg, 0, $noreg :: (load (s32) from %ir.1, !tbaa !{{[0-9]+}})
+ ; CHECK: $eax = MOV32rm killed $rax, 1, $noreg, 0, $noreg, implicit-def $rax :: (load (s32) from @a, !tbaa !2)
+ ; CHECK-NEXT: $eax = MOV32rm killed $rax, 1, $noreg, 0, $noreg :: (load (s32) from %ir.1, !tbaa !6)
$eax = MOV32rm killed $rax, 1, _, 0, _, implicit-def $rax :: (load (s32) from @a, !tbaa !2)
$eax = MOV32rm killed $rax, 1, _, 0, _ :: (load (s32) from %ir.1, !tbaa !6)
RET64 $eax
@@ -475,9 +475,9 @@ body: |
bb.0.entry:
liveins: $rdi, $rsi
; CHECK-LABEL: name: aa_scope
- ; CHECK: $xmm0 = MOVSSrm_alt $rsi, 1, $noreg, 0, $noreg :: (load (s32) from %ir.c, !alias.scope ![[AA_SCOPE:[0-9]+]])
+ ; CHECK: $xmm0 = MOVSSrm_alt $rsi, 1, $noreg, 0, $noreg :: (load (s32) from %ir.c, !alias.scope !9)
$xmm0 = MOVSSrm_alt $rsi, 1, _, 0, _ :: (load (s32) from %ir.c, !alias.scope !9)
- ; CHECK-NEXT: MOVSSmr $rdi, 1, $noreg, 20, $noreg, killed $xmm0 :: (store (s32) into %ir.arrayidx.i, !noalias ![[AA_SCOPE]])
+ ; CHECK-NEXT: MOVSSmr $rdi, 1, $noreg, 20, $noreg, killed $xmm0 :: (store (s32) into %ir.arrayidx.i, !noalias !9)
MOVSSmr $rdi, 1, _, 20, _, killed $xmm0 :: (store (s32) into %ir.arrayidx.i, !noalias !9)
$xmm0 = MOVSSrm_alt killed $rsi, 1, _, 0, _ :: (load (s32) from %ir.c)
MOVSSmr killed $rdi, 1, _, 28, _, killed $xmm0 :: (store (s32) into %ir.arrayidx)
@@ -492,7 +492,7 @@ body: |
bb.0.entry:
liveins: $rdi
; CHECK-LABEL: name: range_metadata
- ; CHECK: $al = MOV8rm killed $rdi, 1, $noreg, 0, $noreg :: (load (s8) from %ir.x, !range !{{[0-9]+}}, !mem.cache_hint !{{[0-9]+}})
+ ; CHECK: $al = MOV8rm killed $rdi, 1, $noreg, 0, $noreg :: (load (s8) from %ir.x, !range !11, !mem.cache_hint !12)
$al = MOV8rm killed $rdi, 1, _, 0, _ :: (load (s8) from %ir.x, !range !11, !mem.cache_hint !12)
RET64 $al
...
diff --git a/llvm/test/CodeGen/MIR/X86/metadata-operands.mir b/llvm/test/CodeGen/MIR/X86/metadata-operands.mir
index 063b04e828b24..c80af7dd6501c 100644
--- a/llvm/test/CodeGen/MIR/X86/metadata-operands.mir
+++ b/llvm/test/CodeGen/MIR/X86/metadata-operands.mir
@@ -51,7 +51,7 @@ body: |
bb.0.entry:
liveins: $edi
; CHECK: %0:gr32 = COPY $edi
- ; CHECK-NEXT: DBG_VALUE $noreg, 0, !{{[0-9]+}}, !DIExpression()
+ ; CHECK-NEXT: DBG_VALUE $noreg, 0, !11, !DIExpression()
%0 = COPY $edi
DBG_VALUE _, 0, !12, !DIExpression(), debug-location !13
MOV32mr %stack.0.x.addr, 1, _, 0, _, %0
diff --git a/llvm/test/CodeGen/MIR/X86/pr38773.mir b/llvm/test/CodeGen/MIR/X86/pr38773.mir
index 32b175775f63a..1d4be4b23f400 100644
--- a/llvm/test/CodeGen/MIR/X86/pr38773.mir
+++ b/llvm/test/CodeGen/MIR/X86/pr38773.mir
@@ -97,14 +97,14 @@ body: |
IDIV32r killed renamable $ecx, implicit-def $eax, implicit-def dead $edx, implicit-def dead $eflags, implicit $eax, implicit killed $edx
renamable $ecx = COPY $eax
; CHECK: IDIV32r killed renamable $ecx
- ; CHECK-NEXT: DBG_VALUE $eax, $noreg, ![[VAR:[0-9]+]], !DIExpression(), debug-location ![[LOC:[0-9]+]]
+ ; CHECK-NEXT: DBG_VALUE $eax, $noreg, !12, !DIExpression(), debug-location !13
DBG_VALUE $ecx, $noreg, !12, !DIExpression(), debug-location !13
; The following mov and DBG_VALUE have been inserted after the PR was
; resolved to check that MCP will update debug users that are not
; immediately after the dead copy.
; CHECK-NEXT: $edx = MOV32r0
$edx = MOV32r0 implicit-def dead $eflags
- ; CHECK-NEXT: DBG_VALUE $eax, $noreg, ![[VAR]], !DIExpression(), debug-location ![[LOC]]
+ ; CHECK-NEXT: DBG_VALUE $eax, $noreg, !12, !DIExpression(), debug-location !13
DBG_VALUE $ecx, $noreg, !12, !DIExpression(), debug-location !13
$eax = COPY killed renamable $ecx
RET 0, $eax
diff --git a/llvm/test/CodeGen/MIR/X86/stack-object-debug-info.mir b/llvm/test/CodeGen/MIR/X86/stack-object-debug-info.mir
index c34622fe8512a..416f8cfbaed0a 100644
--- a/llvm/test/CodeGen/MIR/X86/stack-object-debug-info.mir
+++ b/llvm/test/CodeGen/MIR/X86/stack-object-debug-info.mir
@@ -54,8 +54,8 @@ frameInfo:
# CHECK: stack:
# CHECK: - { id: 0, name: y.i, type: default, offset: 0, size: 256, alignment: 16,
# CHECK-NEXT: callee-saved-register: '', callee-saved-restored: true,
-# CHECK-NEXT: debug-info-variable: '!{{[0-9]+}}', debug-info-expression: '!DIExpression()',
-# CHECK-NEXT: debug-info-location: '!{{[0-9]+}}' }
+# CHECK-NEXT: debug-info-variable: '!4', debug-info-expression: '!DIExpression()',
+# CHECK-NEXT: debug-info-location: '!12' }
stack:
- { id: 0, name: y.i, offset: 0, size: 256, alignment: 16,
debug-info-variable: '!4', debug-info-expression: '!DIExpression()',
diff --git a/llvm/test/DebugInfo/MIR/AArch64/no-dbg-value-after-terminator.mir b/llvm/test/DebugInfo/MIR/AArch64/no-dbg-value-after-terminator.mir
index 586e5abc16e8b..34c099f27becb 100644
--- a/llvm/test/DebugInfo/MIR/AArch64/no-dbg-value-after-terminator.mir
+++ b/llvm/test/DebugInfo/MIR/AArch64/no-dbg-value-after-terminator.mir
@@ -5,7 +5,7 @@
# CHECK-NEXT: - function: f1
# CHECK-NEXT: - basic block: %bb.0
# CHECK-NEXT: - instruction: DBG_VALUE $noreg, $noreg, !"1", !DIExpression(DW_OP_LLVM_entry_value, 1)
-# CHECK-NEXT: First terminator was: RET undef $lr, debug-location !26; /tmp/foo.ll:2:1
+# CHECK-NEXT: First terminator was: RET undef $lr, debug-location !12; /tmp/foo.ll:2:1
--- |
target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
diff --git a/llvm/test/Other/legacy-callgraph-scc-pass-printer.ll b/llvm/test/Other/legacy-callgraph-scc-pass-printer.ll
index 341584508ea79..fda04f6740575 100644
--- a/llvm/test/Other/legacy-callgraph-scc-pass-printer.ll
+++ b/llvm/test/Other/legacy-callgraph-scc-pass-printer.ll
@@ -1,22 +1,11 @@
; RUN: llc -mtriple=x86_64-unknown-linux-gnu -enable-ipra \
; RUN: -print-after=DummyCGSCCPass -o - %s 2>&1 | FileCheck %s
-; RUN: llc -mtriple=x86_64-unknown-linux-gnu -enable-ipra \
-; RUN: -print-after=DummyCGSCCPass -print-module-scope -o - %s 2>&1 \
-; RUN: | FileCheck %s --check-prefix=PERSISTENT
; REQUIRES: x86-registered-target
; The legacy CallGraphSCCPass printer should emit the banner as its own line.
; CHECK-LABEL: *** IR Dump After DummyCGSCCPass (DummyCGSCCPass) ***
; CHECK-NEXT: define void @bar() {
-; PERSISTENT-LABEL: *** IR Dump After DummyCGSCCPass (DummyCGSCCPass) ***
-; PERSISTENT: define void @bar() {
-; PERSISTENT: ret void, !annotation ![[USED:[0-9]+]]
-; PERSISTENT: ![[USED]] = !{!"used"}
-
define void @bar() {
- ret void, !annotation !1
+ ret void
}
-
-!0 = !{!"unused"}
-!1 = !{!"used"}
diff --git a/llvm/test/Other/print-changed-persistent-metadata-ids.ll b/llvm/test/Other/print-changed-persistent-metadata-ids.ll
deleted file mode 100644
index 01cb0eb3fb548..0000000000000
--- a/llvm/test/Other/print-changed-persistent-metadata-ids.ll
+++ /dev/null
@@ -1,77 +0,0 @@
-; RUN: opt -passes=instsimplify -filter-print-funcs=second \
-; RUN: -print-changed=quiet -disable-output < %s 2>&1 | FileCheck %s --check-prefix=CHANGED
-; RUN: opt -passes=instsimplify -filter-print-funcs=second \
-; RUN: -print-before=instsimplify -print-after=instsimplify \
-; RUN: -disable-output < %s 2>&1 | FileCheck %s --check-prefix=STABLE
-; RUN: opt -passes='function(instsimplify),globaldce' -filter-print-funcs=second \
-; RUN: -print-changed=quiet -print-module-scope -disable-output < %s 2>&1 \
-; RUN: | FileCheck %s --check-prefix=CROSS-KIND
-; RUN: opt -passes='function(instsimplify),print' -disable-output < %s 2> %t
-; RUN: FileCheck %s --check-prefix=SPARSE < %t
-; RUN: opt -disable-output < %t
-; RUN: opt -S -passes='function(instsimplify)' < %s \
-; RUN: | FileCheck %s --check-prefix=COMPACT
-
-declare i32 @opaque(i32)
-
- at dead = internal global i32 0
-
-define i32 @first(i32 %arg) #0 {
- %keep = call i32 @opaque(i32 %arg)
- ret i32 %keep
-}
-
-define i32 @second(i32 %arg) #1 {
- %constant = add i32 2, 3, !annotation !0
- %keep = call i32 @opaque(i32 %arg), !annotation !1, !other !3
- %result = add i32 %keep, %constant
- ret i32 %result
-}
-
-!0 = !{!"removed metadata"}
-!1 = !{!2}
-!2 = !{!"second metadata"}
-!3 = !{!"other metadata"}
-
-attributes #0 = { nounwind }
-attributes #1 = { noinline }
-
-; CHANGED: *** IR Dump After InstSimplifyPass on second ***
-; CHANGED: define i32 @second(i32 %arg) #1 {
-; CHANGED: %keep = call i32 @opaque(i32 %arg)
-; CHANGED-SAME: !annotation ![[ANNOTATION:[0-9]+]], !other ![[OTHER:[0-9]+]]
-
-; STABLE: *** IR Dump Before InstSimplifyPass on second ***
-; STABLE: %constant = add i32 2, 3, !annotation !{{[0-9]+}}
-; STABLE: %keep = call i32 @opaque(i32 %arg)
-; STABLE-SAME: !annotation ![[STABLE_ANNOTATION:[0-9]+]], !other ![[STABLE_OTHER:[0-9]+]]
-; STABLE: *** IR Dump After InstSimplifyPass on second ***
-; STABLE-NOT: %constant
-; STABLE: %keep = call i32 @opaque(i32 %arg)
-; STABLE-SAME: !annotation ![[STABLE_ANNOTATION]], !other ![[STABLE_OTHER]]
-
-; CROSS-KIND: *** IR Dump After InstSimplifyPass on second ***
-; CROSS-KIND: @dead = internal global i32 0
-; CROSS-KIND: define i32 @second(i32 %arg) #1 {
-; CROSS-KIND: %keep = call i32 @opaque(i32 %arg)
-; CROSS-KIND-SAME: !annotation ![[CROSS_ANNOTATION:[0-9]+]], !other ![[CROSS_OTHER:[0-9]+]]
-; CROSS-KIND: *** IR Dump After GlobalDCEPass on [module] ***
-; CROSS-KIND-NOT: @dead
-; CROSS-KIND: define i32 @second(i32 %arg) #1 {
-; CROSS-KIND: %keep = call i32 @opaque(i32 %arg)
-; CROSS-KIND-SAME: !annotation ![[CROSS_ANNOTATION]], !other ![[CROSS_OTHER]]
-
-; SPARSE: define i32 @second(i32 %arg) #1 {
-; SPARSE: %keep = call i32 @opaque(i32 %arg)
-; SPARSE-SAME: !annotation ![[SPARSE_ANNOTATION:[1-9][0-9]*]], !other ![[SPARSE_OTHER:[0-9]+]]
-; SPARSE-NOT: !0 =
-; SPARSE: ![[SPARSE_ANNOTATION]] = !{![[SPARSE_NESTED:[0-9]+]]}
-; SPARSE-DAG: ![[SPARSE_NESTED]] = !{!"second metadata"}
-; SPARSE-DAG: ![[SPARSE_OTHER]] = !{!"other metadata"}
-
-; COMPACT: define i32 @second(i32 %arg) #1 {
-; COMPACT: %keep = call i32 @opaque(i32 %arg)
-; COMPACT-SAME: !annotation !0, !other !2
-; COMPACT: !0 = !{!1}
-; COMPACT: !1 = !{!"second metadata"}
-; COMPACT: !2 = !{!"other metadata"}
diff --git a/llvm/test/Other/print-persistent-metadata-ids.ll b/llvm/test/Other/print-persistent-metadata-ids.ll
deleted file mode 100644
index 79ae153353d02..0000000000000
--- a/llvm/test/Other/print-persistent-metadata-ids.ll
+++ /dev/null
@@ -1,94 +0,0 @@
-; RUN: opt -S -passes=no-op-module < %s | FileCheck %s --check-prefix=COMPACT
-; RUN: opt -disable-output -passes=print < %s 2>&1 | FileCheck %s --check-prefix=PERSISTENT-MODULE
-; RUN: opt -disable-output -passes=print < %s 2> %t
-; RUN: opt -disable-output < %t
-; RUN: opt -disable-output -passes='function(print)' -filter-print-funcs=second \
-; RUN: < %s 2>&1 | FileCheck %s --check-prefix=PERSISTENT-FUNCTION
-; RUN: opt -disable-output -passes='function(no-op-function)' \
-; RUN: -print-before=no-op-function -filter-print-funcs=second \
-; RUN: < %s 2>&1 | FileCheck %s --check-prefix=PERSISTENT-FUNCTION
-; RUN: opt -disable-output -passes='function(no-op-function)' -print-after-all \
-; RUN: -filter-print-funcs=second < %s 2>&1 | FileCheck %s --check-prefix=PERSISTENT-FUNCTION
-; RUN: opt -disable-output -passes=no-op-module -print-before=no-op-module \
-; RUN: -filter-print-funcs=first,second < %s 2>&1 | FileCheck %s --check-prefix=PERSISTENT-MULTI
-; RUN: opt -disable-output -passes='loop(no-op-loop)' -print-before=no-op-loop \
-; RUN: -filter-print-funcs=loop < %s 2>&1 | FileCheck %s --check-prefix=PERSISTENT-LOOP
-; RUN: opt -disable-output -passes='print,function(print)' < %s 2>&1 | FileCheck %s --check-prefix=SAME-ID
-$group = comdat any
-
- at named = global ptr @0, comdat($group), !annotation !5
- at 0 = global i32 0
- at 1 = global i32 1
-
-declare void @callee(ptr)
-
-define void @first() #0 {
- call void @callee(ptr @0) #1
- call void @callee(ptr @1) #1
- ret void, !annotation !1
-}
-
-define void @second() {
- call void @callee(ptr @1) #1, !annotation !3
- ret void, !annotation !3
-}
-
-define void @loop() {
-entry:
- call void @callee(ptr @0) #1
- call void @callee(ptr @1) #1
- br label %loop
-
-loop:
- call void @callee(ptr @1) #1
- br i1 false, label %loop, label %exit
-
-exit:
- ret void
-}
-
-attributes #0 = { noinline }
-attributes #1 = { nounwind }
-
-!named = !{!0}
-!0 = !{!"named metadata"}
-!1 = !{!2}
-!2 = !{!"first metadata"}
-!3 = !{!4}
-!4 = !{!"second metadata"}
-!5 = !{!6}
-!6 = !{!"global metadata"}
-
-; COMPACT: @named = global ptr @0, comdat($group), !annotation !0
-; COMPACT: ret void, !annotation !3
-; COMPACT: call void @callee(ptr @1) #1, !annotation !5
-; COMPACT: ret void, !annotation !5
-; COMPACT: !named = !{!2}
-
-; PERSISTENT-MODULE: @named = global ptr @0, comdat($group), !annotation ![[GLOBAL:[0-9]+]]
-; PERSISTENT-MODULE: ret void, !annotation ![[FIRST:[0-9]+]]
-; PERSISTENT-MODULE: call void @callee(ptr @1) #1, !annotation ![[SECOND:[0-9]+]]
-; PERSISTENT-MODULE: ret void, !annotation ![[SECOND]]
-; PERSISTENT-MODULE: !named = !{![[NAMED:[0-9]+]]}
-
-; PERSISTENT-FUNCTION: define void @second() {
-; PERSISTENT-FUNCTION: call void @callee(ptr @1) #1, !annotation ![[SECOND:[0-9]+]]
-; PERSISTENT-FUNCTION: ret void, !annotation ![[SECOND]]
-
-; PERSISTENT-MULTI: define void @first() #0 {
-; PERSISTENT-MULTI: call void @callee(ptr @0) #1
-; PERSISTENT-MULTI: call void @callee(ptr @1) #1
-; PERSISTENT-MULTI: define void @second() {
-; PERSISTENT-MULTI: call void @callee(ptr @1) #1
-
-; PERSISTENT-LOOP: ; Preheader:
-; PERSISTENT-LOOP: call void @callee(ptr @0) #1
-; PERSISTENT-LOOP: call void @callee(ptr @1) #1
-; PERSISTENT-LOOP: ; Loop:
-; PERSISTENT-LOOP: call void @callee(ptr @1) #1
-
-; SAME-ID: define void @second() {
-; SAME-ID: call void @callee(ptr @1) #1, !annotation ![[SAME_SECOND:[0-9]+]]
-; SAME-ID: ![[SAME_SECOND]] = !{!{{[0-9]+}}}
-; SAME-ID: define void @second() {
-; SAME-ID: call void @callee(ptr @1) #1, !annotation ![[SAME_SECOND]]
diff --git a/llvm/test/tools/UpdateTestChecks/update_analyze_test_checks/Inputs/loop-distribute.ll.expected b/llvm/test/tools/UpdateTestChecks/update_analyze_test_checks/Inputs/loop-distribute.ll.expected
index e3e62c44f6ce4..b2cd7cc79a70c 100644
--- a/llvm/test/tools/UpdateTestChecks/update_analyze_test_checks/Inputs/loop-distribute.ll.expected
+++ b/llvm/test/tools/UpdateTestChecks/update_analyze_test_checks/Inputs/loop-distribute.ll.expected
@@ -72,12 +72,12 @@ define void @ldist(i1 %cond, ptr %A, ptr %B, ptr %C) {
; CHECK-NEXT: LDist: Partition 0:
; CHECK-NEXT: for.body.ldist1: ; preds = %if.end.ldist1, %for.body.ph.ldist1
; CHECK-NEXT: %iv.ldist1 = phi i16 [ 0, %for.body.ph.ldist1 ], [ %iv.next.ldist1, %if.end.ldist1 ]
-; CHECK-NEXT: %lv.ldist1 = load i16, ptr %A, align 1, !alias.scope !5, !noalias !4
-; CHECK-NEXT: store i16 %lv.ldist1, ptr %A, align 1, !alias.scope !5, !noalias !4
+; CHECK-NEXT: %lv.ldist1 = load i16, ptr %A, align 1, !alias.scope !2, !noalias !5
+; CHECK-NEXT: store i16 %lv.ldist1, ptr %A, align 1, !alias.scope !2, !noalias !5
; CHECK-NEXT: br i1 %cond, label %if.then.ldist1, label %if.end.ldist1
; CHECK-EMPTY:
; CHECK-NEXT: if.then.ldist1: ; preds = %for.body.ldist1
-; CHECK-NEXT: %lv2.ldist1 = load i16, ptr %A, align 1, !alias.scope !5, !noalias !4
+; CHECK-NEXT: %lv2.ldist1 = load i16, ptr %A, align 1, !alias.scope !2, !noalias !5
; CHECK-NEXT: br label %if.end.ldist1
; CHECK-EMPTY:
; CHECK-NEXT: if.end.ldist1: ; preds = %if.then.ldist1, %for.body.ldist1
diff --git a/llvm/test/tools/llvm-debuginfo-analyzer/IR/01-ir-print-basic-details.test b/llvm/test/tools/llvm-debuginfo-analyzer/IR/01-ir-print-basic-details.test
index b11128d164ea7..51a807942c48e 100644
--- a/llvm/test/tools/llvm-debuginfo-analyzer/IR/01-ir-print-basic-details.test
+++ b/llvm/test/tools/llvm-debuginfo-analyzer/IR/01-ir-print-basic-details.test
@@ -40,11 +40,11 @@
; ONE-NEXT: [003] {Block}
; ONE-NEXT: [004] 5 {Variable} 'CONSTANT' -> 'const INTEGER'
; ONE-NEXT: [004] 5 {Line}
-; ONE-NEXT: [004] {Code} 'store i32 7, ptr %CONSTANT, align 4, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [004] {Code} 'store i32 7, ptr %CONSTANT, align 4, !dbg !32'
; ONE-NEXT: [004] 6 {Line}
-; ONE-NEXT: [004] {Code} 'store i32 7, ptr %retval, align 4, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [004] {Code} 'store i32 7, ptr %retval, align 4, !dbg !33'
; ONE-NEXT: [004] 6 {Line}
-; ONE-NEXT: [004] {Code} 'br label %return, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [004] {Code} 'br label %return, !dbg !33'
; ONE-NEXT: [003] 2 {Parameter} 'ParamPtr' -> 'INTPTR'
; ONE-NEXT: [003] 2 {Parameter} 'ParamUnsigned' -> 'unsigned int'
; ONE-NEXT: [003] 2 {Parameter} 'ParamBool' -> 'bool'
@@ -60,19 +60,19 @@
; ONE-NEXT: [003] {Code} '%storedv = zext i1 %ParamBool to i8'
; ONE-NEXT: [003] {Code} 'store i8 %storedv, ptr %ParamBool.addr, align 1'
; ONE-NEXT: [003] 8 {Line}
-; ONE-NEXT: [003] {Code} '%1 = load i32, ptr %ParamUnsigned.addr, align 4, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [003] {Code} '%1 = load i32, ptr %ParamUnsigned.addr, align 4, !dbg !34'
; ONE-NEXT: [003] 8 {Line}
-; ONE-NEXT: [003] {Code} 'store i32 %1, ptr %retval, align 4, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [003] {Code} 'store i32 %1, ptr %retval, align 4, !dbg !35'
; ONE-NEXT: [003] 8 {Line}
-; ONE-NEXT: [003] {Code} 'br label %return, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [003] {Code} 'br label %return, !dbg !35'
; ONE-NEXT: [003] 9 {Line}
-; ONE-NEXT: [003] {Code} '%2 = load i32, ptr %retval, align 4, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [003] {Code} '%2 = load i32, ptr %retval, align 4, !dbg !36'
; ONE-NEXT: [003] 9 {Line}
-; ONE-NEXT: [003] {Code} 'ret i32 %2, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [003] {Code} 'ret i32 %2, !dbg !36'
; ONE-NEXT: [003] 3 {Line}
-; ONE-NEXT: [003] {Code} '%0 = load i8, ptr %ParamBool.addr, align 1, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [003] {Code} '%0 = load i8, ptr %ParamBool.addr, align 1, !dbg !26'
; ONE-NEXT: [003] 3 {Line}
-; ONE-NEXT: [003] {Code} '%loadedv = trunc i8 %0 to i1, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [003] {Code} '%loadedv = trunc i8 %0 to i1, !dbg !26'
; ONE-NEXT: [003] 3 {Line}
-; ONE-NEXT: [003] {Code} 'br i1 %loadedv, label %if.then, label %if.end, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [003] {Code} 'br i1 %loadedv, label %if.then, label %if.end, !dbg !26'
; ONE-NEXT: [002] 1 {TypeAlias} 'INTPTR' -> '* const int'
diff --git a/llvm/test/tools/llvm-debuginfo-analyzer/IR/01-ir-select-logical-elements.test b/llvm/test/tools/llvm-debuginfo-analyzer/IR/01-ir-select-logical-elements.test
index cae4183e7253f..51bbb30c1d97e 100644
--- a/llvm/test/tools/llvm-debuginfo-analyzer/IR/01-ir-select-logical-elements.test
+++ b/llvm/test/tools/llvm-debuginfo-analyzer/IR/01-ir-select-logical-elements.test
@@ -30,16 +30,16 @@
; ONE-NEXT: [000] {File} 'test-clang.ll'
; ONE-EMPTY:
; ONE-NEXT: [001] {CompileUnit} 'test.cpp'
-; ONE-NEXT: [003] {Code} '%0 = load i8, ptr %ParamBool.addr, align 1, !dbg !{{[0-9]+}}'
-; ONE-NEXT: [003] {Code} '%1 = load i32, ptr %ParamUnsigned.addr, align 4, !dbg !{{[0-9]+}}'
-; ONE-NEXT: [003] {Code} '%2 = load i32, ptr %retval, align 4, !dbg !{{[0-9]+}}'
-; ONE-NEXT: [003] {Code} '%loadedv = trunc i8 %0 to i1, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [003] {Code} '%0 = load i8, ptr %ParamBool.addr, align 1, !dbg !26'
+; ONE-NEXT: [003] {Code} '%1 = load i32, ptr %ParamUnsigned.addr, align 4, !dbg !34'
+; ONE-NEXT: [003] {Code} '%2 = load i32, ptr %retval, align 4, !dbg !36'
+; ONE-NEXT: [003] {Code} '%loadedv = trunc i8 %0 to i1, !dbg !26'
; ONE-NEXT: [003] {Code} '%storedv = zext i1 %ParamBool to i8'
-; ONE-NEXT: [003] {Code} 'br i1 %loadedv, label %if.then, label %if.end, !dbg !{{[0-9]+}}'
-; ONE-NEXT: [003] {Code} 'store i32 %1, ptr %retval, align 4, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [003] {Code} 'br i1 %loadedv, label %if.then, label %if.end, !dbg !26'
+; ONE-NEXT: [003] {Code} 'store i32 %1, ptr %retval, align 4, !dbg !35'
; ONE-NEXT: [003] {Code} 'store i32 %ParamUnsigned, ptr %ParamUnsigned.addr, align 4'
-; ONE-NEXT: [004] {Code} 'store i32 7, ptr %CONSTANT, align 4, !dbg !{{[0-9]+}}'
-; ONE-NEXT: [004] {Code} 'store i32 7, ptr %retval, align 4, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [004] {Code} 'store i32 7, ptr %CONSTANT, align 4, !dbg !32'
+; ONE-NEXT: [004] {Code} 'store i32 7, ptr %retval, align 4, !dbg !33'
; ONE-NEXT: [003] {Code} 'store i8 %storedv, ptr %ParamBool.addr, align 1'
; ONE-NEXT: [003] {Code} 'store ptr %ParamPtr, ptr %ParamPtr.addr, align 8'
; ONE-EMPTY:
diff --git a/llvm/test/tools/llvm-debuginfo-analyzer/IR/02-ir-logical-lines.test b/llvm/test/tools/llvm-debuginfo-analyzer/IR/02-ir-logical-lines.test
index 8280d0f41ff6d..76272e3f677ea 100644
--- a/llvm/test/tools/llvm-debuginfo-analyzer/IR/02-ir-logical-lines.test
+++ b/llvm/test/tools/llvm-debuginfo-analyzer/IR/02-ir-logical-lines.test
@@ -33,9 +33,9 @@
; ONE-NEXT: [003] {Code} '%retval = alloca i32, align 4'
; ONE-NEXT: [003] {Code} 'store i32 0, ptr %retval, align 4'
; ONE-NEXT: [003] 5 {Line}
-; ONE-NEXT: [003] {Code} '%call = call noundef i32 (ptr, ...) @_Z6printfPKcz(ptr noundef @.str), !dbg !{{[0-9]+}}'
+; ONE-NEXT: [003] {Code} '%call = call noundef i32 (ptr, ...) @_Z6printfPKcz(ptr noundef @.str), !dbg !22'
; ONE-NEXT: [003] 6 {Line}
-; ONE-NEXT: [003] {Code} 'ret i32 0, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [003] {Code} 'ret i32 0, !dbg !23'
; ONE-EMPTY:
; ONE-NEXT: Logical View:
; ONE-NEXT: [000] {File} 'hello-world-dwarf-clang.o' -> elf64-x86-64
diff --git a/llvm/test/tools/llvm-debuginfo-analyzer/IR/06-ir-full-logical-view.test b/llvm/test/tools/llvm-debuginfo-analyzer/IR/06-ir-full-logical-view.test
index 29fc246b27a21..3f6db431a676c 100644
--- a/llvm/test/tools/llvm-debuginfo-analyzer/IR/06-ir-full-logical-view.test
+++ b/llvm/test/tools/llvm-debuginfo-analyzer/IR/06-ir-full-logical-view.test
@@ -51,11 +51,11 @@
; ONE-NEXT: [0x0000000000][006] {Location}
; ONE-NEXT: [0x0000000000][007] {Entry} bregx 3 ptr %CONSTANT+0
; ONE-NEXT: [0x0000000030][004] 5 {Line} '{{.*}}/general/test.cpp'
-; ONE-NEXT: [0x0000000030][004] {Code} 'store i32 7, ptr %CONSTANT, align 4, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [0x0000000030][004] {Code} 'store i32 7, ptr %CONSTANT, align 4, !dbg !32'
; ONE-NEXT: [0x0000000034][004] 6 {Line} '{{.*}}/general/test.cpp'
-; ONE-NEXT: [0x0000000034][004] {Code} 'store i32 7, ptr %retval, align 4, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [0x0000000034][004] {Code} 'store i32 7, ptr %retval, align 4, !dbg !33'
; ONE-NEXT: [0x0000000038][004] 6 {Line} '{{.*}}/general/test.cpp'
-; ONE-NEXT: [0x0000000038][004] {Code} 'br label %return, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [0x0000000038][004] {Code} 'br label %return, !dbg !33'
; ONE-NEXT: [0x0000000014][003] 2 {Parameter} 'ParamPtr' -> [0x0000000028]'INTPTR'
; ONE-NEXT: [0x0000000014][004] {Coverage} 100.00%
; ONE-NEXT: [0x0000000000][004] {Location}
@@ -80,21 +80,21 @@
; ONE-NEXT: [0x000000001c][003] {Code} '%storedv = zext i1 %ParamBool to i8'
; ONE-NEXT: [0x0000000020][003] {Code} 'store i8 %storedv, ptr %ParamBool.addr, align 1'
; ONE-NEXT: [0x000000003c][003] 8 {Line} '{{.*}}/general/test.cpp'
-; ONE-NEXT: [0x000000003c][003] {Code} '%1 = load i32, ptr %ParamUnsigned.addr, align 4, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [0x000000003c][003] {Code} '%1 = load i32, ptr %ParamUnsigned.addr, align 4, !dbg !34'
; ONE-NEXT: [0x0000000040][003] 8 {Line} '{{.*}}/general/test.cpp'
-; ONE-NEXT: [0x0000000040][003] {Code} 'store i32 %1, ptr %retval, align 4, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [0x0000000040][003] {Code} 'store i32 %1, ptr %retval, align 4, !dbg !35'
; ONE-NEXT: [0x0000000044][003] 8 {Line} '{{.*}}/general/test.cpp'
-; ONE-NEXT: [0x0000000044][003] {Code} 'br label %return, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [0x0000000044][003] {Code} 'br label %return, !dbg !35'
; ONE-NEXT: [0x0000000048][003] 9 {Line} '{{.*}}/general/test.cpp'
-; ONE-NEXT: [0x0000000048][003] {Code} '%2 = load i32, ptr %retval, align 4, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [0x0000000048][003] {Code} '%2 = load i32, ptr %retval, align 4, !dbg !36'
; ONE-NEXT: [0x000000004c][003] 9 {Line} '{{.*}}/general/test.cpp'
-; ONE-NEXT: [0x000000004c][003] {Code} 'ret i32 %2, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [0x000000004c][003] {Code} 'ret i32 %2, !dbg !36'
; ONE-NEXT: [0x0000000024][003] 3 {Line} '{{.*}}/general/test.cpp'
-; ONE-NEXT: [0x0000000024][003] {Code} '%0 = load i8, ptr %ParamBool.addr, align 1, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [0x0000000024][003] {Code} '%0 = load i8, ptr %ParamBool.addr, align 1, !dbg !26'
; ONE-NEXT: [0x0000000028][003] 3 {Line} '{{.*}}/general/test.cpp'
-; ONE-NEXT: [0x0000000028][003] {Code} '%loadedv = trunc i8 %0 to i1, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [0x0000000028][003] {Code} '%loadedv = trunc i8 %0 to i1, !dbg !26'
; ONE-NEXT: [0x000000002c][003] 3 {Line} '{{.*}}/general/test.cpp'
-; ONE-NEXT: [0x000000002c][003] {Code} 'br i1 %loadedv, label %if.then, label %if.end, !dbg !{{[0-9]+}}'
+; ONE-NEXT: [0x000000002c][003] {Code} 'br i1 %loadedv, label %if.then, label %if.end, !dbg !26'
; ONE-NEXT: [0x0000000024][002] {BaseType} 'int'
; ONE-NEXT: [0x0000000028][002] 1 {TypeAlias} 'INTPTR' -> [0x000000002c]'* const int'
; ONE-NEXT: [0x0000000034][002] {BaseType} 'unsigned int'
diff --git a/llvm/tools/llvm-dis/llvm-dis.cpp b/llvm/tools/llvm-dis/llvm-dis.cpp
index 2a986fc145fbf..a961f9cb0f7dd 100644
--- a/llvm/tools/llvm-dis/llvm-dis.cpp
+++ b/llvm/tools/llvm-dis/llvm-dis.cpp
@@ -263,7 +263,6 @@ int main(int argc, char **argv) {
// All that llvm-dis does is write the assembly to a file.
if (!DontPrint) {
if (M) {
- M->renumberMetadataForAssembly();
M->print(Out->os(), Annotator.get(),
/* ShouldPreserveUseListOrder */ false);
}
diff --git a/llvm/tools/llvm-extract/llvm-extract.cpp b/llvm/tools/llvm-extract/llvm-extract.cpp
index 17ce664a64ba2..439a4a48b350a 100644
--- a/llvm/tools/llvm-extract/llvm-extract.cpp
+++ b/llvm/tools/llvm-extract/llvm-extract.cpp
@@ -411,10 +411,8 @@ int main(int argc, char **argv) {
}
if (OutputAssembly)
- PM.addPass(PrintModulePass(Out.os(), "",
- /*ShouldPreserveUseListOrder=*/false,
- /*EmitSummaryIndex=*/false,
- /*ShouldRenumberMetadata=*/true));
+ PM.addPass(
+ PrintModulePass(Out.os(), "", /* ShouldPreserveUseListOrder */ false));
else if (Force || !CheckBitcodeOutputToConsole(Out.os()))
PM.addPass(
BitcodeWriterPass(Out.os(), /* ShouldPreserveUseListOrder */ true));
diff --git a/llvm/tools/llvm-link/llvm-link.cpp b/llvm/tools/llvm-link/llvm-link.cpp
index 9390301f1b75a..e49082f2d7bfb 100644
--- a/llvm/tools/llvm-link/llvm-link.cpp
+++ b/llvm/tools/llvm-link/llvm-link.cpp
@@ -518,7 +518,6 @@ int main(int argc, char **argv) {
if (Verbose)
errs() << "Writing bitcode...\n";
if (OutputAssembly) {
- Composite->renumberMetadataForAssembly();
Composite->print(Out.os(), nullptr, /* ShouldPreserveUseListOrder */ false);
} else if (Force || !CheckBitcodeOutputToConsole(Out.os())) {
WriteBitcodeToFile(*Composite, Out.os(),
diff --git a/llvm/tools/llvm-reduce/ReducerWorkItem.cpp b/llvm/tools/llvm-reduce/ReducerWorkItem.cpp
index c483a7ef893e0..fa4da7a073f1e 100644
--- a/llvm/tools/llvm-reduce/ReducerWorkItem.cpp
+++ b/llvm/tools/llvm-reduce/ReducerWorkItem.cpp
@@ -20,7 +20,6 @@
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineJumpTableInfo.h"
#include "llvm/CodeGen/MachineModuleInfo.h"
-#include "llvm/CodeGen/MachineModuleSlotTracker.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/PseudoSourceValueManager.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
@@ -444,18 +443,12 @@ static std::unique_ptr<MachineFunction> cloneMF(MachineFunction *SrcMF,
void ReducerWorkItem::print(raw_ostream &ROS, void *p) const {
if (MMI) {
- M->renumberMetadataForAssembly();
printMIR(ROS, *M);
for (Function &F : *M) {
- if (auto *MF = MMI->getMachineFunction(F)) {
- MachineModuleSlotTracker MST(
- [&](const Function &F) { return MMI->getMachineFunction(F); }, MF);
- MST.renumberMetadataForAssembly();
+ if (auto *MF = MMI->getMachineFunction(F))
printMIR(ROS, *MMI, *MF);
- }
}
} else {
- M->renumberMetadataForAssembly();
M->print(ROS, /*AssemblyAnnotationWriter=*/nullptr,
/*ShouldPreserveUseListOrder=*/true);
}
diff --git a/llvm/tools/llvm-split/llvm-split.cpp b/llvm/tools/llvm-split/llvm-split.cpp
index 4ead6fd4b88be..e7c9d52127274 100644
--- a/llvm/tools/llvm-split/llvm-split.cpp
+++ b/llvm/tools/llvm-split/llvm-split.cpp
@@ -116,7 +116,7 @@ void writeStringToFile(StringRef Content, StringRef Path) {
OS << Content << "\n";
}
-void writeModuleToFile(Module &M, StringRef Path, bool OutputAssembly) {
+void writeModuleToFile(const Module &M, StringRef Path, bool OutputAssembly) {
int FD = -1;
if (std::error_code EC = sys::fs::openFileForWrite(Path, FD)) {
errs() << formatv("error opening file: {0}, error: {1}", Path, EC.message())
@@ -125,10 +125,9 @@ void writeModuleToFile(Module &M, StringRef Path, bool OutputAssembly) {
}
raw_fd_ostream OS(FD, /*ShouldClose*/ true);
- if (OutputAssembly) {
- M.renumberMetadataForAssembly();
+ if (OutputAssembly)
M.print(OS, /*AssemblyAnnotationWriter*/ nullptr);
- } else
+ else
WriteBitcodeToFile(M, OS);
}
diff --git a/llvm/tools/llvm-stress/llvm-stress.cpp b/llvm/tools/llvm-stress/llvm-stress.cpp
index e99c83c2b9bac..e3c8a5c3d51ab 100644
--- a/llvm/tools/llvm-stress/llvm-stress.cpp
+++ b/llvm/tools/llvm-stress/llvm-stress.cpp
@@ -754,7 +754,6 @@ int main(int argc, char **argv) {
report_fatal_error("Broken module found, compilation aborted!");
// Output textual IR.
- M->renumberMetadataForAssembly();
M->print(Out->os(), nullptr);
Out->keep();
diff --git a/llvm/tools/opt/NewPMDriver.cpp b/llvm/tools/opt/NewPMDriver.cpp
index 4fbaf02526a87..04c7b99e08cbc 100644
--- a/llvm/tools/opt/NewPMDriver.cpp
+++ b/llvm/tools/opt/NewPMDriver.cpp
@@ -529,8 +529,7 @@ bool llvm::runPassPipeline(
MPM.addPass(AssignGUIDPass());
}
MPM.addPass(PrintModulePass(
- Out->os(), "", ShouldPreserveAssemblyUseListOrder, EmitSummaryIndex,
- /*ShouldRenumberMetadata=*/true));
+ Out->os(), "", ShouldPreserveAssemblyUseListOrder, EmitSummaryIndex));
break;
case OK_OutputBitcode:
if (EmitSummaryIndex) {
diff --git a/llvm/tools/opt/optdriver.cpp b/llvm/tools/opt/optdriver.cpp
index 5333825629a27..2db4502aa449b 100644
--- a/llvm/tools/opt/optdriver.cpp
+++ b/llvm/tools/opt/optdriver.cpp
@@ -930,11 +930,10 @@ optMain(int argc, char **argv,
BOS = std::make_unique<raw_svector_ostream>(Buffer);
OS = BOS.get();
}
- if (OutputAssembly) {
+ if (OutputAssembly)
Passes.add(createPrintModulePass(
- *OS, "", /*ShouldPreserveAssemblyUseListOrder=*/false,
- /*ShouldRenumberMetadata=*/true));
- } else
+ *OS, "", /* ShouldPreserveAssemblyUseListOrder */ false));
+ else
Passes.add(createBitcodeWriterPass(
*OS, /* ShouldPreserveBitcodeUseListOrder */ true));
}
diff --git a/llvm/tools/verify-uselistorder/verify-uselistorder.cpp b/llvm/tools/verify-uselistorder/verify-uselistorder.cpp
index 95edf41e84ce4..8f58cc00a3dd1 100644
--- a/llvm/tools/verify-uselistorder/verify-uselistorder.cpp
+++ b/llvm/tools/verify-uselistorder/verify-uselistorder.cpp
@@ -75,7 +75,7 @@ struct TempFile {
FileRemover Remover;
bool init(const std::string &Ext, bool IsText = false);
bool writeBitcode(const Module &M) const;
- bool writeAssembly(Module &M) const;
+ bool writeAssembly(const Module &M) const;
std::unique_ptr<Module> readBitcode(LLVMContext &Context) const;
std::unique_ptr<Module> readAssembly(LLVMContext &Context) const;
};
@@ -137,7 +137,7 @@ bool TempFile::writeBitcode(const Module &M) const {
return false;
}
-bool TempFile::writeAssembly(Module &M) const {
+bool TempFile::writeAssembly(const Module &M) const {
LLVM_DEBUG(dbgs() << " - write assembly\n");
std::error_code EC;
raw_fd_ostream OS(Filename, EC, sys::fs::OF_TextWithCRLF);
@@ -146,7 +146,6 @@ bool TempFile::writeAssembly(Module &M) const {
return true;
}
- M.renumberMetadataForAssembly();
M.print(OS, nullptr, /* ShouldPreserveUseListOrder */ true);
return false;
}
@@ -380,7 +379,7 @@ static void verifyBitcodeUseListOrder(const Module &M) {
verifyAfterRoundTrip(M, F.readBitcode(Context));
}
-static void verifyAssemblyUseListOrder(Module &M) {
+static void verifyAssemblyUseListOrder(const Module &M) {
TempFile F;
if (F.init("ll", /*IsText=*/true))
report_fatal_error("failed to initialize assembly file");
@@ -392,7 +391,7 @@ static void verifyAssemblyUseListOrder(Module &M) {
verifyAfterRoundTrip(M, F.readAssembly(Context));
}
-static void verifyUseListOrder(Module &M) {
+static void verifyUseListOrder(const Module &M) {
outs() << "verify bitcode\n";
verifyBitcodeUseListOrder(M);
outs() << "verify assembly\n";
diff --git a/llvm/unittests/AsmParser/AsmParserTest.cpp b/llvm/unittests/AsmParser/AsmParserTest.cpp
index 631cbe5c56464..bdfd91dbec269 100644
--- a/llvm/unittests/AsmParser/AsmParserTest.cpp
+++ b/llvm/unittests/AsmParser/AsmParserTest.cpp
@@ -16,12 +16,10 @@
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
-#include "llvm/IR/ModuleSummaryIndex.h"
#include "llvm/IR/Value.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/SourceMgr.h"
-#include "llvm/Support/raw_ostream.h"
#include "gtest/gtest.h"
#define DEBUG_TYPE "unittest-asm-parser-tests"
@@ -75,37 +73,6 @@ TEST(AsmParserTest, SlotMappingTest) {
EXPECT_EQ(Mapping.MetadataNodes.count(1), 0u);
}
-TEST(AsmParserTest, ParsingPreservesMetadataIDsInOtherModules) {
- StringRef Source = "!named = !{!0}\n!0 = distinct !{}\n";
-
- for (bool WithIndex : {false, true}) {
- SCOPED_TRACE(WithIndex ? "parseAssemblyWithIndex" : "parseAssembly");
- LLVMContext Ctx;
- SMDiagnostic Error;
- auto Mod1 = parseAssemblyString(Source, Error, Ctx);
- ASSERT_TRUE(Mod1) << Error.getMessage().str();
- MDNode *Node = Mod1->getNamedMetadata("named")->getOperand(0);
-
- auto PrintMetadataID = [&] {
- std::string ID;
- raw_string_ostream OS(ID);
- Node->printAsOperand(OS, Mod1.get());
- return ID;
- };
- std::string ID = PrintMetadataID();
-
- std::unique_ptr<Module> Mod2;
- if (WithIndex)
- Mod2 = parseAssemblyWithIndex(MemoryBufferRef(Source, "<string>"), Error,
- Ctx)
- .Mod;
- else
- Mod2 = parseAssemblyString(Source, Error, Ctx);
- ASSERT_TRUE(Mod2) << Error.getMessage().str();
- EXPECT_EQ(ID, PrintMetadataID());
- }
-}
-
TEST(AsmParserTest, TypeAndConstantValueParsing) {
LLVMContext Ctx;
SMDiagnostic Error;
diff --git a/llvm/unittests/IR/AsmWriterTest.cpp b/llvm/unittests/IR/AsmWriterTest.cpp
index 6c04309af810e..75305f4e2dea4 100644
--- a/llvm/unittests/IR/AsmWriterTest.cpp
+++ b/llvm/unittests/IR/AsmWriterTest.cpp
@@ -5,7 +5,6 @@
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
-#include "llvm/AsmParser/Parser.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/Function.h"
@@ -13,7 +12,6 @@
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/MDBuilder.h"
#include "llvm/IR/Module.h"
-#include "llvm/Support/SourceMgr.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
@@ -64,128 +62,6 @@ TEST(AsmWriterTest, DumpDIExpression) {
EXPECT_EQ("!DIExpression(DW_OP_constu, 4, DW_OP_minus, DW_OP_deref)", S);
}
-TEST(AsmWriterTest, PersistentBasicBlockPrint) {
- LLVMContext Ctx;
- SMDiagnostic Err;
- std::unique_ptr<Module> M = parseAssemblyString(R"(
- @0 = global i32 0
-
- declare void @use(ptr)
-
- define void @f() !dbg !6 {
- call void @use(ptr @0), !annotation !12
- #dbg_value(i32 0, !9, !DIExpression(DW_OP_constu, 4), !11)
- ret void, !annotation !12
- }
-
- define void @g() {
- ret void
- }
-
- !llvm.dbg.cu = !{!0}
- !llvm.module.flags = !{!5}
-
- !0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "test", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
- !1 = !DIFile(filename: "t.ll", directory: "/")
- !2 = !{}
- !5 = !{i32 2, !"Debug Info Version", i32 3}
- !6 = distinct !DISubprogram(name: "f", scope: null, file: !1, line: 1, type: !7, scopeLine: 1, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0, retainedNodes: !8)
- !7 = !DISubroutineType(types: !2)
- !8 = !{!9}
- !9 = !DILocalVariable(name: "x", scope: !6, file: !1, line: 1, type: !10)
- !10 = !DIBasicType(name: "i32", size: 32, encoding: DW_ATE_unsigned)
- !11 = !DILocation(line: 1, column: 1, scope: !6)
- !12 = !{!"annotation"}
- )",
- Err, Ctx);
- ASSERT_NE(M, nullptr);
-
- std::string First;
- raw_string_ostream FirstOS(First);
- M->getFunction("f")->getEntryBlock().print(FirstOS);
-
- std::string Second;
- raw_string_ostream SecondOS(Second);
- M->getFunction("f")->getEntryBlock().print(SecondOS);
-
- EXPECT_EQ(First, Second);
- EXPECT_THAT(First, HasSubstr("call void @use(ptr @0), !annotation !"));
- EXPECT_THAT(First, HasSubstr("#dbg_value(i32 0, !"));
- EXPECT_THAT(First, HasSubstr("!DIExpression(DW_OP_constu, 4)"));
- EXPECT_THAT(First, HasSubstr("ret void, !annotation !"));
-
- MDNode *Earlier = MDNode::getDistinct(Ctx, MDString::get(Ctx, "earlier"));
- M->getFunction("f")->getEntryBlock().getTerminator()->setMetadata("order",
- Earlier);
- MDNode *Later = MDNode::getDistinct(Ctx, MDString::get(Ctx, "later"));
- M->getFunction("g")->getEntryBlock().getTerminator()->setMetadata("order",
- Later);
-
- std::string LaterOutput;
- raw_string_ostream LaterOS(LaterOutput);
- M->getFunction("g")->getEntryBlock().print(LaterOS);
-
- std::string EarlierOutput;
- raw_string_ostream EarlierOS(EarlierOutput);
- M->getFunction("f")->getEntryBlock().print(EarlierOS);
-
- StringRef MetadataPrefix = "!order !";
- size_t EarlierPos = EarlierOutput.find(MetadataPrefix);
- size_t LaterPos = LaterOutput.find(MetadataPrefix);
- ASSERT_NE(EarlierPos, StringRef::npos);
- ASSERT_NE(LaterPos, StringRef::npos);
- StringRef EarlierIDText =
- StringRef(EarlierOutput).drop_front(EarlierPos + MetadataPrefix.size());
- StringRef LaterIDText =
- StringRef(LaterOutput).drop_front(LaterPos + MetadataPrefix.size());
- unsigned EarlierID;
- unsigned LaterID;
- ASSERT_FALSE(EarlierIDText.consumeInteger(10, EarlierID));
- ASSERT_FALSE(LaterIDText.consumeInteger(10, LaterID));
- EXPECT_LT(EarlierID, LaterID);
-}
-
-TEST(AsmWriterTest, PersistentPrintTemporaryMetadata) {
- LLVMContext Ctx;
- Module M("test", Ctx);
- Function *F = Function::Create(
- FunctionType::get(Type::getVoidTy(Ctx), /*isVarArg=*/false),
- Function::ExternalLinkage, "f", M);
- BasicBlock *BB = BasicBlock::Create(Ctx, "entry", F);
- ReturnInst *Ret = ReturnInst::Create(Ctx, BB);
-
- MDNode *Permanent = MDNode::getDistinct(Ctx, MDString::get(Ctx, "permanent"));
- TempMDNode Temporary = MDNode::getTemporary(Ctx, Permanent);
- Ret->setMetadata("permanent", Permanent);
- Ret->setMetadata("temporary", Temporary.get());
-
- std::string FunctionText;
- raw_string_ostream FunctionOS(FunctionText);
- F->print(FunctionOS);
- EXPECT_THAT(FunctionText, HasSubstr("!permanent !0"));
- EXPECT_THAT(FunctionText, HasSubstr("!temporary !1"));
-
- std::string BasicBlockText;
- raw_string_ostream BasicBlockOS(BasicBlockText);
- BB->print(BasicBlockOS);
- EXPECT_THAT(BasicBlockText, HasSubstr("!permanent !0"));
- EXPECT_THAT(BasicBlockText, HasSubstr("!temporary !1"));
-
- std::string ModuleText;
- raw_string_ostream ModuleOS(ModuleText);
- M.print(ModuleOS, nullptr);
- EXPECT_THAT(ModuleText, HasSubstr("!0 = distinct !{!\"permanent\"}"));
- EXPECT_THAT(ModuleText, HasSubstr("!1 = <temporary!> !{!0}"));
-
- MDNode *Later = MDNode::getDistinct(Ctx, MDString::get(Ctx, "later"));
- Ret->setMetadata("later", Later);
- std::string LaterText;
- raw_string_ostream LaterOS(LaterText);
- F->print(LaterOS);
- EXPECT_THAT(LaterText, HasSubstr("!later !2"));
- EXPECT_THAT(LaterText, HasSubstr("!temporary !1"));
-}
-
TEST(AsmWriterTest, PrintAddrspaceWithNullOperand) {
LLVMContext Ctx;
Module M("test module", Ctx);
diff --git a/llvm/unittests/IR/MetadataTest.cpp b/llvm/unittests/IR/MetadataTest.cpp
index 5f6feb5bd87bb..f2c55c0f2a534 100644
--- a/llvm/unittests/IR/MetadataTest.cpp
+++ b/llvm/unittests/IR/MetadataTest.cpp
@@ -282,11 +282,15 @@ TEST_F(MDNodeTest, Print) {
std::string Expected;
{
raw_string_ostream OS(Expected);
- OS << "!3 = !{";
+ OS << "<" << (void *)N << "> = !{";
C->printAsOperand(OS);
OS << ", ";
S->printAsOperand(OS);
- OS << ", null, !0, !1, !2}";
+ OS << ", null";
+ MDNode *Nodes[] = {N0, N1, N2};
+ for (auto *Node : Nodes)
+ OS << ", <" << (void *)Node << ">";
+ OS << "}";
}
std::string Actual;
@@ -315,9 +319,9 @@ TEST_F(MDNodeTest, PrintTemporary) {
NamedMDNode *NMD = M.getOrInsertNamedMetadata("named");
NMD->addOperand(N);
- EXPECT_PRINTER_EQ("!2 = !{!1}", N->print(OS, &M));
- EXPECT_PRINTER_EQ("!1 = <temporary!> !{!0}", Temp->print(OS, &M));
- EXPECT_PRINTER_EQ("!0 = !{}", Arg->print(OS, &M));
+ EXPECT_PRINTER_EQ("!0 = !{!1}", N->print(OS, &M));
+ EXPECT_PRINTER_EQ("!1 = <temporary!> !{!2}", Temp->print(OS, &M));
+ EXPECT_PRINTER_EQ("!2 = !{}", Arg->print(OS, &M));
// Cleanup.
Temp->replaceAllUsesWith(Arg);
@@ -339,11 +343,11 @@ TEST_F(MDNodeTest, PrintFromModule) {
std::string Expected;
{
raw_string_ostream OS(Expected);
- OS << "!3 = !{";
+ OS << "!0 = !{";
C->printAsOperand(OS);
OS << ", ";
S->printAsOperand(OS);
- OS << ", null, !0, !1, !2}";
+ OS << ", null, !1, !2, !3}";
}
EXPECT_PRINTER_EQ(Expected, N->print(OS, &M));
diff --git a/llvm/unittests/IR/ModuleTest.cpp b/llvm/unittests/IR/ModuleTest.cpp
index 82e652aadc013..e8c2ecfb9f3a8 100644
--- a/llvm/unittests/IR/ModuleTest.cpp
+++ b/llvm/unittests/IR/ModuleTest.cpp
@@ -438,7 +438,6 @@ define void @Foo2() {
ASSERT_EQ(NMD.getParent(), &*M1);
}
- M1->renumberMetadataForAssembly();
std::string M1Print;
{
llvm::raw_string_ostream Os(M1Print);
@@ -447,60 +446,6 @@ define void @Foo2() {
ASSERT_EQ(M2Str, M1Print);
}
-TEST(ModuleTest, RenumberMetadataPreservesContextWideUniqueIDs) {
- LLVMContext Context;
- Module M("M", Context);
- MDNode *Detached =
- MDNode::getDistinct(Context, MDString::get(Context, "detached"));
- MDNode *Attached =
- MDNode::getDistinct(Context, MDString::get(Context, "attached"));
- NamedMDNode *NMD = M.getOrInsertNamedMetadata("n");
- NMD->addOperand(Attached);
-
- M.renumberMetadataForAssembly();
- NMD->addOperand(Detached);
-
- std::string Assembly;
- raw_string_ostream OS(Assembly);
- M.print(OS, nullptr);
- EXPECT_NE(Assembly.find("!n = !{!0, !2}"), std::string::npos);
-
- LLVMContext ParsedContext;
- SMDiagnostic Err;
- EXPECT_TRUE(parseAssemblyString(Assembly, Err, ParsedContext))
- << Err.getMessage().str();
-}
-
-TEST(ModuleTest, RenumberMetadataPreservesUniqueTemporaryIDs) {
- LLVMContext Context;
- Module M("M", Context);
- TempMDTuple DetachedA =
- MDTuple::getTemporary(Context, MDString::get(Context, "detached-a"));
- TempMDTuple DetachedB =
- MDTuple::getTemporary(Context, MDString::get(Context, "detached-b"));
- MDNode *AttachedA =
- MDNode::getDistinct(Context, MDString::get(Context, "attached-a"));
- MDNode *AttachedB =
- MDNode::getDistinct(Context, MDString::get(Context, "attached-b"));
- NamedMDNode *NMD = M.getOrInsertNamedMetadata("n");
- NMD->addOperand(AttachedA);
- NMD->addOperand(AttachedB);
-
- M.renumberMetadataForAssembly();
- NMD->addOperand(MDNode::replaceWithDistinct(std::move(DetachedA)));
- NMD->addOperand(MDNode::replaceWithDistinct(std::move(DetachedB)));
-
- std::string Assembly;
- raw_string_ostream OS(Assembly);
- M.print(OS, nullptr);
- EXPECT_NE(Assembly.find("!n = !{!0, !1, !4, !5}"), std::string::npos);
-
- LLVMContext ParsedContext;
- SMDiagnostic Err;
- EXPECT_TRUE(parseAssemblyString(Assembly, Err, ParsedContext))
- << Err.getMessage().str();
-}
-
TEST(ModuleTest, FunctionDefinitions) {
// Test getFunctionDefs() method which returns only functions with bodies
LLVMContext Context;
diff --git a/llvm/unittests/MIR/MachineMetadata.cpp b/llvm/unittests/MIR/MachineMetadata.cpp
index c611cf062bf6b..242c14a36a707 100644
--- a/llvm/unittests/MIR/MachineMetadata.cpp
+++ b/llvm/unittests/MIR/MachineMetadata.cpp
@@ -19,7 +19,6 @@
#include "llvm/CodeGen/TargetLowering.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/FileCheck/FileCheck.h"
-#include "llvm/IR/DebugInfoMetadata.h"
#include "llvm/IR/MDBuilder.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/ModuleSlotTracker.h"
@@ -50,9 +49,20 @@ class MachineMetadataTest : public testing::Test {
void SetUp() override { M = std::make_unique<Module>("Dummy", Context); }
void addHooks(ModuleSlotTracker &MST, const MachineOperand &MO) {
- MST.setProcessHook([&MO](AbstractSlotTrackerStorage *AST, const Module *) {
- if (MO.isMetadata())
- AST->createMetadataSlot(MO.getMetadata());
+ // Setup hooks to assign slot numbers for the specified machine metadata.
+ MST.setProcessHook([&MO](AbstractSlotTrackerStorage *AST, const Module *M,
+ bool ShouldInitializeAllMetadata) {
+ if (ShouldInitializeAllMetadata) {
+ if (MO.isMetadata())
+ AST->createMetadataSlot(MO.getMetadata());
+ }
+ });
+ MST.setProcessHook([&MO](AbstractSlotTrackerStorage *AST, const Function *F,
+ bool ShouldInitializeAllMetadata) {
+ if (!ShouldInitializeAllMetadata) {
+ if (MO.isMetadata())
+ AST->createMetadataSlot(MO.getMetadata());
+ }
});
}
@@ -130,7 +140,9 @@ TEST_F(MachineMetadataTest, TrivialHook) {
}
TEST_F(MachineMetadataTest, BasicHook) {
- // Verify that the post-process hook records machine metadata.
+ // Verify that post-process hook is invoked to assign slot numbers for
+ // machine metadata. When both LLVM IR and machine IR contain metadata,
+ // ensure that machine metadata is always assigned after LLVM IR.
ASSERT_TRUE(M);
// Create a MachineOperand with a metadata and print it.
@@ -153,16 +165,16 @@ TEST_F(MachineMetadataTest, BasicHook) {
addHooks(MST, MO);
// Print a MachineOperand containing a metadata node.
- EXPECT_EQ("!0", print([&](raw_ostream &OS) {
+ EXPECT_EQ("!1", print([&](raw_ostream &OS) {
MO.print(OS, MST, LLT{}, /*OpIdx*/ ~0U, /*PrintDef=*/false,
/*IsStandalone=*/false,
/*ShouldPrintRegisterTies=*/false, /*TiedOperandIdx=*/0,
/*TRI=*/nullptr);
}));
// Print the definition of these unnamed metadata nodes.
- EXPECT_EQ("!1 = !{!\"bar\"}",
+ EXPECT_EQ("!0 = !{!\"bar\"}",
print([&](raw_ostream &OS) { Node->print(OS, MST); }));
- EXPECT_EQ("!0 = !{!\"foo\"}",
+ EXPECT_EQ("!1 = !{!\"foo\"}",
print([&](raw_ostream &OS) { MachineNode->print(OS, MST); }));
}
@@ -240,9 +252,10 @@ body: |
MachineModuleSlotTracker MST(
[&](const Function &F) { return MMI.getMachineFunction(F); }, MF);
- // Print the MI using the stored IDs of the new machine metadata.
+ // Print that MI with new machine metadata, which slot numbers should be
+ // assigned.
EXPECT_EQ("%1:gpr32 = LDRWui %0, 0 :: (load (s32) from %ir.p, "
- "!alias.scope !3, !noalias !4)",
+ "!alias.scope !0, !noalias !3)",
print([&](raw_ostream &OS) {
MI.print(OS, MST, /*IsStandalone=*/false, /*SkipOpers=*/false,
/*SkipDebugLoc=*/false, /*AddNewLine=*/false);
@@ -329,64 +342,10 @@ body: |
auto *MF = MMI.getMachineFunction(*M->getFunction("test0"));
auto *MBB = MF->getBlockNumbered(0);
- MachineInstr *DbgValue = nullptr;
for (auto It = MBB->begin(); It != MBB->end(); ++It) {
MachineInstr &MI = *It;
ASSERT_TRUE(MI.isMetaInstruction());
- if (MI.isDebugValue())
- DbgValue = &MI;
}
-
- ASSERT_NE(DbgValue, nullptr);
- auto *IRVar = cast<DILocalVariable>(DbgValue->getOperand(2).getMetadata());
- M->getOrInsertNamedMetadata("test.ir.variable")
- ->addOperand(const_cast<DILocalVariable *>(IRVar));
- // Leave gaps between reachable nodes to exercise sparse metadata IDs.
- auto *UnusedModuleNode = MDNode::getDistinct(Context, {});
- (void)UnusedModuleNode;
- auto *ModuleNode =
- MDNode::getDistinct(Context, MDString::get(Context, "module metadata"));
- M->getOrInsertNamedMetadata("test.module.metadata")->addOperand(ModuleNode);
- auto PrintMetadataID = [&](const MDNode *N) {
- return print([&](raw_ostream &OS) { N->printAsOperand(OS, M.get()); });
- };
- std::string ModuleNodeID = PrintMetadataID(ModuleNode);
- print([&](raw_ostream &OS) { printMIR(OS, *M); });
- EXPECT_EQ(ModuleNodeID, PrintMetadataID(ModuleNode));
-
- auto *UnusedMachineNode = MDNode::getDistinct(Context, {});
- (void)UnusedMachineNode;
- auto *MachineLoc =
- DILocation::get(Context, 2, 1, DbgValue->getDebugLoc()->getScope());
- auto *MachineNode =
- MDNode::get(Context, {MDString::get(Context, "machine"), MachineLoc});
- MBB->front().addOperand(*MF, MachineOperand::CreateMetadata(MachineNode));
- auto *InlineMachineLoc =
- DILocation::get(Context, 3, 1, DbgValue->getDebugLoc()->getScope());
- DbgValue->setDebugLoc(DebugLoc(InlineMachineLoc));
-
- MachineModuleSlotTracker MST(
- [&](const Function &F) { return MMI.getMachineFunction(F); }, MF);
- MachineModuleSlotTracker::MachineMDNodeListType MDList;
- MST.collectMachineMDNodes(MDList);
- EXPECT_TRUE(llvm::any_of(
- MDList, [&](const auto &MD) { return MD.second == MachineNode; }));
- EXPECT_TRUE(llvm::any_of(
- MDList, [&](const auto &MD) { return MD.second == MachineLoc; }));
- EXPECT_FALSE(llvm::any_of(
- MDList, [&](const auto &MD) { return MD.second == InlineMachineLoc; }));
- EXPECT_FALSE(
- llvm::any_of(MDList, [&](const auto &MD) { return MD.second == IRVar; }));
-
- std::string MachineNodeID = PrintMetadataID(MachineNode);
- std::string Output = print([&](raw_ostream &OS) {
- printMIR(OS, *M);
- printMIR(OS, MMI, *MF);
- });
- EXPECT_EQ(ModuleNodeID, PrintMetadataID(ModuleNode));
- EXPECT_EQ(MachineNodeID, PrintMetadataID(MachineNode));
- MachineModuleInfo RoundTripMMI(TM.get());
- EXPECT_TRUE(parseMIR(*TM, Output, RoundTripMMI)) << Output;
}
TEST_F(MachineMetadataTest, MMSlotTrackerX64) {
@@ -444,15 +403,11 @@ body: |
MachineModuleSlotTracker MST(
[&](const Function &F) { return MMI.getMachineFunction(F); }, MF);
- // Print the MI using the stored IDs of the new machine metadata.
- std::string Set0ID =
- print([&](raw_ostream &OS) { Set0->printAsOperand(OS, M.get()); });
- std::string Set1ID =
- print([&](raw_ostream &OS) { Set1->printAsOperand(OS, M.get()); });
+ // Print that MI with new machine metadata, which slot numbers should be
+ // assigned.
EXPECT_EQ(
"%1:gr32 = MOV32rm %0, 1, $noreg, 0, $noreg :: (load (s32) from %ir.p, "
- "!alias.scope " +
- Set0ID + ", !noalias " + Set1ID + ")",
+ "!alias.scope !0, !noalias !3)",
print([&](raw_ostream &OS) {
MI.print(OS, MST, /*IsStandalone=*/false, /*SkipOpers=*/false,
/*SkipDebugLoc=*/false, /*AddNewLine=*/false);
@@ -548,15 +503,11 @@ body: |
MachineModuleSlotTracker MST(
[&](const Function &F) { return MMI.getMachineFunction(F); }, MF);
- // Print the MI using the stored IDs of the new machine metadata.
- std::string Set0ID =
- print([&](raw_ostream &OS) { Set0->printAsOperand(OS, M.get()); });
- std::string Set1ID =
- print([&](raw_ostream &OS) { Set1->printAsOperand(OS, M.get()); });
+ // Print that MI with new machine metadata, which slot numbers should be
+ // assigned.
EXPECT_EQ(
"%5:vgpr_32 = FLAT_LOAD_DWORD killed %4, 0, 0, implicit $exec, implicit "
- "$flat_scr :: (load (s32) from %ir.p, !alias.scope " +
- Set0ID + ", !noalias " + Set1ID + ")",
+ "$flat_scr :: (load (s32) from %ir.p, !alias.scope !0, !noalias !3)",
print([&](raw_ostream &OS) {
MI.print(OS, MST, /*IsStandalone=*/false, /*SkipOpers=*/false,
/*SkipDebugLoc=*/false, /*AddNewLine=*/false);
diff --git a/mlir/lib/Target/LLVMIR/ConvertToLLVMIR.cpp b/mlir/lib/Target/LLVMIR/ConvertToLLVMIR.cpp
index 1797efec0252f..fef191a302ac8 100644
--- a/mlir/lib/Target/LLVMIR/ConvertToLLVMIR.cpp
+++ b/mlir/lib/Target/LLVMIR/ConvertToLLVMIR.cpp
@@ -31,7 +31,6 @@ void registerToLLVMIRTranslation() {
if (!llvmModule)
return failure();
- llvmModule->renumberMetadataForAssembly();
llvmModule->print(output, nullptr);
return success();
},
diff --git a/mlir/test/Target/LLVMIR/Import/import-failure.ll b/mlir/test/Target/LLVMIR/Import/import-failure.ll
index ba854d8616144..7b59f91497120 100644
--- a/mlir/test/Target/LLVMIR/Import/import-failure.ll
+++ b/mlir/test/Target/LLVMIR/Import/import-failure.ll
@@ -65,7 +65,7 @@ define void @access_group(ptr %arg1) {
; CHECK: <unknown>
; CHECK-SAME: warning: expected all loop properties to be either debug locations or metadata nodes
; CHECK: <unknown>
-; CHECK-SAME: warning: unhandled metadata: ![[LOOP_ID:[0-9]+]] = distinct !{![[LOOP_ID]], i32 42}
+; CHECK-SAME: warning: unhandled metadata: !0 = distinct !{!0, i32 42}
define void @invalid_loop_node(i64 %n, ptr %A) {
entry:
br label %end, !llvm.loop !0
@@ -80,7 +80,7 @@ end:
; CHECK: <unknown>
; CHECK-SAME: warning: cannot import empty loop property
; CHECK: <unknown>
-; CHECK-SAME: warning: unhandled metadata: ![[EMPTY_LOOP:[0-9]+]] = distinct !{![[EMPTY_LOOP]], ![[EMPTY_PROP:[0-9]+]]}
+; CHECK-SAME: warning: unhandled metadata: !0 = distinct !{!0, !1}
define void @invalid_loop_node(i64 %n, ptr %A) {
entry:
br label %end, !llvm.loop !0
@@ -96,7 +96,7 @@ end:
; CHECK: <unknown>
; CHECK-SAME: warning: cannot import loop property without a name
; CHECK: <unknown>
-; CHECK-SAME: warning: unhandled metadata: ![[UNNAMED_LOOP:[0-9]+]] = distinct !{![[UNNAMED_LOOP]], ![[UNNAMED_PROP:[0-9]+]]}
+; CHECK-SAME: warning: unhandled metadata: !0 = distinct !{!0, !1}
define void @invalid_loop_node(i64 %n, ptr %A) {
entry:
br label %end, !llvm.loop !0
@@ -112,7 +112,7 @@ end:
; CHECK: <unknown>
; CHECK-SAME: warning: cannot import loop properties with duplicated names llvm.loop.disable_nonforced
; CHECK: <unknown>
-; CHECK-SAME: warning: unhandled metadata: ![[DUP_LOOP:[0-9]+]] = distinct !{![[DUP_LOOP]], ![[DUP_PROP:[0-9]+]], ![[DUP_PROP]]}
+; CHECK-SAME: warning: unhandled metadata: !0 = distinct !{!0, !1, !1}
define void @unsupported_loop_annotation(i64 %n, ptr %A) {
entry:
br label %end, !llvm.loop !0
@@ -128,7 +128,7 @@ end:
; CHECK: <unknown>
; CHECK-SAME: warning: expected metadata node llvm.loop.disable_nonforced to hold no value
; CHECK: <unknown>
-; CHECK-SAME: warning: unhandled metadata: ![[VALUE_LOOP:[0-9]+]] = distinct !{![[VALUE_LOOP]], ![[VALUE_PROP:[0-9]+]]}
+; CHECK-SAME: warning: unhandled metadata: !0 = distinct !{!0, !1}
define void @unsupported_loop_annotation(i64 %n, ptr %A) {
entry:
br label %end, !llvm.loop !0
@@ -144,7 +144,7 @@ end:
; CHECK: <unknown>
; CHECK-SAME: warning: expected metadata nodes llvm.loop.unroll.enable and llvm.loop.unroll.disable to be mutually exclusive
; CHECK: <unknown>
-; CHECK-SAME: warning: unhandled metadata: ![[EXCLUSIVE_LOOP:[0-9]+]] = distinct !{![[EXCLUSIVE_LOOP]], ![[ENABLE_PROP:[0-9]+]], ![[DISABLE_PROP:[0-9]+]]}
+; CHECK-SAME: warning: unhandled metadata: !0 = distinct !{!0, !1, !2}
define void @unsupported_loop_annotation(i64 %n, ptr %A) {
entry:
br label %end, !llvm.loop !0
@@ -161,7 +161,7 @@ end:
; CHECK: <unknown>
; CHECK-SAME: warning: expected metadata node llvm.loop.vectorize.width to hold an i32 value
; CHECK: <unknown>
-; CHECK-SAME: warning: unhandled metadata: ![[WIDTH_LOOP:[0-9]+]] = distinct !{![[WIDTH_LOOP]], ![[WIDTH_PROP:[0-9]+]]}
+; CHECK-SAME: warning: unhandled metadata: !0 = distinct !{!0, !1}
define void @unsupported_loop_annotation(i64 %n, ptr %A) {
entry:
br label %end, !llvm.loop !0
@@ -177,7 +177,7 @@ end:
; CHECK: <unknown>
; CHECK-SAME: warning: expected metadata node llvm.loop.vectorize.followup_all to hold an MDNode
; CHECK: <unknown>
-; CHECK-SAME: warning: unhandled metadata: ![[FOLLOWUP_LOOP:[0-9]+]] = distinct !{![[FOLLOWUP_LOOP]], ![[FOLLOWUP_PROP:[0-9]+]]}
+; CHECK-SAME: warning: unhandled metadata: !0 = distinct !{!0, !1}
define void @unsupported_loop_annotation(i64 %n, ptr %A) {
entry:
br label %end, !llvm.loop !0
@@ -193,7 +193,7 @@ end:
; CHECK: <unknown>
; CHECK-SAME: warning: expected metadata node llvm.loop.parallel_accesses to hold one or multiple MDNodes
; CHECK: <unknown>
-; CHECK-SAME: warning: unhandled metadata: ![[PARALLEL_LOOP:[0-9]+]] = distinct !{![[PARALLEL_LOOP]], ![[PARALLEL_PROP:[0-9]+]]}
+; CHECK-SAME: warning: unhandled metadata: !0 = distinct !{!0, !1}
define void @unsupported_loop_annotation(i64 %n, ptr %A) {
entry:
br label %end, !llvm.loop !0
@@ -209,7 +209,7 @@ end:
; CHECK: <unknown>
; CHECK-SAME: warning: unknown loop annotation llvm.loop.typo
; CHECK: <unknown>
-; CHECK-SAME: warning: unhandled metadata: ![[UNKNOWN_LOOP:[0-9]+]] = distinct !{![[UNKNOWN_LOOP]], ![[KNOWN_PROP:[0-9]+]], ![[UNKNOWN_PROP:[0-9]+]]}
+; CHECK-SAME: warning: unhandled metadata: !0 = distinct !{!0, !1, !2}
define void @unsupported_loop_annotation(i64 %n, ptr %A) {
entry:
br label %end, !llvm.loop !0
@@ -241,7 +241,7 @@ end:
; // -----
; CHECK: <unknown>
-; CHECK-SAME: warning: dropped instruction: call void @llvm.experimental.noalias.scope.decl(metadata ![[SCOPE_LIST:[0-9]+]])
+; CHECK-SAME: warning: dropped instruction: call void @llvm.experimental.noalias.scope.decl(metadata !0)
define void @unused_scope() {
call void @llvm.experimental.noalias.scope.decl(metadata !0)
ret void
@@ -320,7 +320,7 @@ bb1:
!10 = !{ i32 1, !"foo", i32 1 }
!11 = !{ i32 4, !"bar", i32 37 }
!12 = !{ i32 2, !"qux", i32 42 }
-; CHECK: unsupported module flag value for key 'qux' : ![[FLAG_VALUE:[0-9]+]] = !{!"foo", i32 1}
+; CHECK: unsupported module flag value for key 'qux' : !4 = !{!"foo", i32 1}
!13 = !{ i32 3, !"qux", !{ !"foo", i32 1 }}
!llvm.module.flags = !{ !10, !11, !12, !13 }
diff --git a/polly/test/ForwardOpTree/atax.ll b/polly/test/ForwardOpTree/atax.ll
index 3d3a44b763aa3..3dfe3fa0aa8e6 100644
--- a/polly/test/ForwardOpTree/atax.ll
+++ b/polly/test/ForwardOpTree/atax.ll
@@ -87,7 +87,7 @@ declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i32, i1)
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_for_body3[i0] -> MemRef1__phi[] };
; CHECK-NEXT: Instructions {
-; CHECK-NEXT: store double 0.000000e+00, ptr %arrayidx5, align 8, !tbaa !13
+; CHECK-NEXT: store double 0.000000e+00, ptr %arrayidx5, align 8, !tbaa !2
; CHECK-NEXT: }
; CHECK-NEXT: Stmt_for_body8
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
@@ -105,11 +105,11 @@ declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i32, i1)
; CHECK-NEXT: { Stmt_for_body8[i0, i1] -> MemRef_add[] };
; CHECK-NEXT: Instructions {
; CHECK-NEXT: %0 = phi double [ 0.000000e+00, %for.body3 ], [ %add, %for.body8 ]
-; CHECK-NEXT: %1 = load double, ptr %arrayidx14, align 8, !tbaa !13
-; CHECK-NEXT: %2 = load double, ptr %arrayidx16, align 8, !tbaa !13
+; CHECK-NEXT: %1 = load double, ptr %arrayidx14, align 8, !tbaa !2
+; CHECK-NEXT: %2 = load double, ptr %arrayidx16, align 8, !tbaa !2
; CHECK-NEXT: %mul = fmul double %1, %2
; CHECK-NEXT: %add = fadd double %0, %mul
-; CHECK-NEXT: store double %add, ptr %arrayidx5, align 8, !tbaa !13
+; CHECK-NEXT: store double %add, ptr %arrayidx5, align 8, !tbaa !2
; CHECK-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, 2
; CHECK-NEXT: }
; CHECK-NEXT: Stmt_for_end21
@@ -131,11 +131,11 @@ declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i32, i1)
; CHECK-NEXT: { Stmt_for_body24[i0, i1] -> MemRef_y[i1] };
; CHECK-NEXT: Instructions {
; CHECK-NEXT: %3 = phi double [ %add, %for.end21 ], [ %.pre, %for.body24.for.body24_crit_edge ]
-; CHECK-NEXT: %4 = load double, ptr %arrayidx26, align 8, !tbaa !13
-; CHECK-NEXT: %5 = load double, ptr %arrayidx30, align 8, !tbaa !13
+; CHECK-NEXT: %4 = load double, ptr %arrayidx26, align 8, !tbaa !2
+; CHECK-NEXT: %5 = load double, ptr %arrayidx30, align 8, !tbaa !2
; CHECK-NEXT: %mul33 = fmul double %5, %3
; CHECK-NEXT: %add34 = fadd double %4, %mul33
-; CHECK-NEXT: store double %add34, ptr %arrayidx26, align 8, !tbaa !13
+; CHECK-NEXT: store double %add34, ptr %arrayidx26, align 8, !tbaa !2
; CHECK-NEXT: %exitcond7 = icmp eq i64 %indvars.iv.next6, 2
; CHECK-NEXT: }
; CHECK-NEXT: Stmt_for_body24_for_body24_crit_edge
@@ -144,6 +144,6 @@ declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i32, i1)
; CHECK-NEXT: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
; CHECK-NEXT: { Stmt_for_body24_for_body24_crit_edge[i0, i1] -> MemRef_tmp[i0] };
; CHECK-NEXT: Instructions {
-; CHECK-NEXT: %.pre = load double, ptr %arrayidx5, align 8, !tbaa !13
+; CHECK-NEXT: %.pre = load double, ptr %arrayidx5, align 8, !tbaa !2
; CHECK-NEXT: }
; CHECK-NEXT: }
diff --git a/polly/test/ForwardOpTree/jacobi-1d.ll b/polly/test/ForwardOpTree/jacobi-1d.ll
index fbae4c7bc227b..3bc504d88c0eb 100644
--- a/polly/test/ForwardOpTree/jacobi-1d.ll
+++ b/polly/test/ForwardOpTree/jacobi-1d.ll
@@ -74,8 +74,8 @@ for.end35: ; preds = %for.inc33
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_for_body[i0] -> MemRef2__phi[] };
; CHECK-NEXT: Instructions {
-; CHECK-NEXT: %.pre = load double, ptr %A, align 8, !tbaa !13
-; CHECK-NEXT: %.pre10 = load double, ptr %arrayidx6.phi.trans.insert, align 8, !tbaa !13
+; CHECK-NEXT: %.pre = load double, ptr %A, align 8, !tbaa !2
+; CHECK-NEXT: %.pre10 = load double, ptr %arrayidx6.phi.trans.insert, align 8, !tbaa !2
; CHECK-NEXT: }
; CHECK-NEXT: Stmt_for_body3
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
@@ -96,10 +96,10 @@ for.end35: ; preds = %for.inc33
; CHECK-NEXT: %0 = phi double [ %.pre10, %for.body ], [ %2, %for.body3 ]
; CHECK-NEXT: %1 = phi double [ %.pre, %for.body ], [ %0, %for.body3 ]
; CHECK-NEXT: %add = fadd double %1, %0
-; CHECK-NEXT: %2 = load double, ptr %arrayidx9, align 8, !tbaa !13
+; CHECK-NEXT: %2 = load double, ptr %arrayidx9, align 8, !tbaa !2
; CHECK-NEXT: %add10 = fadd double %add, %2
; CHECK-NEXT: %mul = fmul double %add10, 3.333300e-01
-; CHECK-NEXT: store double %mul, ptr %arrayidx12, align 8, !tbaa !13
+; CHECK-NEXT: store double %mul, ptr %arrayidx12, align 8, !tbaa !2
; CHECK-NEXT: %exitcond = icmp eq i64 %indvars.iv.next, 3
; CHECK-NEXT: }
; CHECK-NEXT: }
diff --git a/polly/test/ScopInfo/preserve-equiv-class-order-in-basic_block.ll b/polly/test/ScopInfo/preserve-equiv-class-order-in-basic_block.ll
index adcd95a277e62..800b0339a1422 100644
--- a/polly/test/ScopInfo/preserve-equiv-class-order-in-basic_block.ll
+++ b/polly/test/ScopInfo/preserve-equiv-class-order-in-basic_block.ll
@@ -77,7 +77,7 @@ for.end13: ; preds = %for.inc11
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 1]
; CHECK-NEXT: { Stmt_for_end_a[] -> MemRef_conv[] };
; CHECK-NEXT: Instructions {
-; CHECK-NEXT: %1 = load i32, ptr @e, align 4, !tbaa !4
+; CHECK-NEXT: %1 = load i32, ptr @e, align 4, !tbaa !0
; CHECK-NEXT: %2 = trunc i32 %1 to i16
; CHECK-NEXT: %conv = and i16 %2, 1
; CHECK-NEXT: %tobool = icmp eq i16 %conv, 0
@@ -90,5 +90,5 @@ for.end13: ; preds = %for.inc11
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
; CHECK-NEXT: { Stmt_for_end[] -> MemRef_e[0] };
; CHECK-NEXT: Instructions {
-; CHECK-NEXT: store i32 2, ptr @e, align 4, !tbaa !4
+; CHECK-NEXT: store i32 2, ptr @e, align 4, !tbaa !0
; CHECK-NEXT: }
diff --git a/polly/test/ScopInfo/stmt_split_exit_of_region_stmt.ll b/polly/test/ScopInfo/stmt_split_exit_of_region_stmt.ll
index 8a160c299172b..54832607f11d5 100644
--- a/polly/test/ScopInfo/stmt_split_exit_of_region_stmt.ll
+++ b/polly/test/ScopInfo/stmt_split_exit_of_region_stmt.ll
@@ -19,7 +19,7 @@
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
; CHECK-NEXT: { Stmt_Stmt[i0] -> MemRef_A[i0] };
; CHECK-NEXT: Instructions {
-; CHECK-NEXT: store i32 %i.0, ptr %arrayidx, align 4, !polly_split_after !1
+; CHECK-NEXT: store i32 %i.0, ptr %arrayidx, align 4, !polly_split_after !0
; CHECK-NEXT: }
; CHECK-NEXT: Stmt_Stmt_b
; CHECK-NEXT: Domain :=
diff --git a/polly/test/ScopInfo/stmt_split_no_after_split.ll b/polly/test/ScopInfo/stmt_split_no_after_split.ll
index b0dffa98c7e79..0a4284bdd34f5 100644
--- a/polly/test/ScopInfo/stmt_split_no_after_split.ll
+++ b/polly/test/ScopInfo/stmt_split_no_after_split.ll
@@ -9,7 +9,7 @@
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
; CHECK-NEXT: { Stmt_Stmt[i0] -> MemRef_A[i0] };
; CHECK-NEXT: Instructions {
-; CHECK-NEXT: store i32 %i.0, ptr %arrayidx, align 4, !polly_split_after !1
+; CHECK-NEXT: store i32 %i.0, ptr %arrayidx, align 4, !polly_split_after !0
; CHECK-NEXT: }
; CHECK-NEXT: }
;
diff --git a/polly/test/ScopInfo/stmt_split_no_dependence.ll b/polly/test/ScopInfo/stmt_split_no_dependence.ll
index d129e58c11204..ed2180407c68d 100644
--- a/polly/test/ScopInfo/stmt_split_no_dependence.ll
+++ b/polly/test/ScopInfo/stmt_split_no_dependence.ll
@@ -17,7 +17,7 @@
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
; CHECK-NEXT: { Stmt_Stmt[i0] -> MemRef_A[i0] };
; CHECK-NEXT: Instructions {
-; CHECK-NEXT: store i32 %i.0, ptr %arrayidx, align 4, !polly_split_after !1
+; CHECK-NEXT: store i32 %i.0, ptr %arrayidx, align 4, !polly_split_after !0
; CHECK-NEXT: }
; CHECK-NEXT: Stmt_Stmt_b
; CHECK-NEXT: Domain :=
diff --git a/polly/test/ScopInfo/stmt_split_phi_in_beginning_bb.ll b/polly/test/ScopInfo/stmt_split_phi_in_beginning_bb.ll
index 1150c5ead3065..0521525e272b3 100644
--- a/polly/test/ScopInfo/stmt_split_phi_in_beginning_bb.ll
+++ b/polly/test/ScopInfo/stmt_split_phi_in_beginning_bb.ll
@@ -9,7 +9,7 @@
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
; CHECK-NEXT: { Stmt_Stmt[i0] -> MemRef_A[i0] };
; CHECK-NEXT: Instructions {
-; CHECK-NEXT: store i32 %phi, ptr %arrayidx, align 4, !polly_split_after !1
+; CHECK-NEXT: store i32 %phi, ptr %arrayidx, align 4, !polly_split_after !0
; CHECK-NEXT: }
; CHECK-NEXT: Stmt_Stmt_b
; CHECK-NEXT: Domain :=
diff --git a/polly/test/ScopInfo/stmt_split_phi_in_stmt.ll b/polly/test/ScopInfo/stmt_split_phi_in_stmt.ll
index 2ba38dc7b3a4b..82a85aa5f0099 100644
--- a/polly/test/ScopInfo/stmt_split_phi_in_stmt.ll
+++ b/polly/test/ScopInfo/stmt_split_phi_in_stmt.ll
@@ -9,7 +9,7 @@
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
; CHECK-NEXT: { Stmt_Stmt[i0] -> MemRef_A[i0] };
; CHECK-NEXT: Instructions {
-; CHECK-NEXT: store i32 %i.0, ptr %arrayidx, align 4, !polly_split_after !1
+; CHECK-NEXT: store i32 %i.0, ptr %arrayidx, align 4, !polly_split_after !0
; CHECK-NEXT: }
; CHECK-NEXT: Stmt_Stmt_b
; CHECK-NEXT: Domain :=
diff --git a/polly/test/ScopInfo/stmt_split_scalar_dependence.ll b/polly/test/ScopInfo/stmt_split_scalar_dependence.ll
index a98a0538fb3a5..1f21c0ce7225f 100644
--- a/polly/test/ScopInfo/stmt_split_scalar_dependence.ll
+++ b/polly/test/ScopInfo/stmt_split_scalar_dependence.ll
@@ -12,7 +12,7 @@
; CHECK-NEXT: { Stmt_Stmt[i0] -> MemRef_a[] };
; CHECK-NEXT: Instructions {
; CHECK-NEXT: %a = fadd double 2.100000e+01, 2.100000e+01
-; CHECK-NEXT: store i32 %i.0, ptr %arrayidx, align 4, !polly_split_after !1
+; CHECK-NEXT: store i32 %i.0, ptr %arrayidx, align 4, !polly_split_after !0
; CHECK-NEXT: }
; CHECK-NEXT: Stmt_Stmt_b
; CHECK-NEXT: Domain :=
diff --git a/polly/test/ScopInfo/stmt_split_within_loop.ll b/polly/test/ScopInfo/stmt_split_within_loop.ll
index 6164cce2de7fd..580ffab567846 100644
--- a/polly/test/ScopInfo/stmt_split_within_loop.ll
+++ b/polly/test/ScopInfo/stmt_split_within_loop.ll
@@ -9,7 +9,7 @@
; CHECK-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
; CHECK-NEXT: { Stmt_Stmt[i0, i1] -> MemRef_A[i0] };
; CHECK-NEXT: Instructions {
-; CHECK-NEXT: store i32 %i.0, ptr %arrayidx, align 4, !polly_split_after !1
+; CHECK-NEXT: store i32 %i.0, ptr %arrayidx, align 4, !polly_split_after !0
; CHECK-NEXT: }
; CHECK-NEXT: Stmt_Stmt_b
; CHECK-NEXT: Domain :=
More information about the flang-commits
mailing list