[llvm] [BOLT] Add support for safe-icf (PR #116275)

Alexander Yermolovich via llvm-commits llvm-commits at lists.llvm.org
Mon Nov 25 17:52:00 PST 2024


https://github.com/ayermolo updated https://github.com/llvm/llvm-project/pull/116275

>From 03ca42cce937fc7a85104e80fc271095e998b472 Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Mon, 11 Nov 2024 19:19:02 -0800
Subject: [PATCH 01/18] safe-icf

Summary:

Test Plan:

Reviewers:

Subscribers:

Tasks:

Tags:

Differential Revision: https://phabricator.intern.facebook.com/D65799965
---
 bolt/include/bolt/Core/BinaryContext.h        |   9 +
 bolt/include/bolt/Core/BinaryFunction.h       |   9 +
 .../bolt/Passes/IdenticalCodeFolding.h        |  14 +-
 bolt/lib/Core/BinaryContext.cpp               |  86 +++++
 bolt/lib/Core/BinaryFunction.cpp              |   2 +
 bolt/lib/Passes/IdenticalCodeFolding.cpp      |  85 +++-
 bolt/lib/Rewrite/BinaryPassManager.cpp        |  15 +-
 bolt/lib/Rewrite/BoltDiff.cpp                 |   3 +-
 bolt/lib/Rewrite/RewriteInstance.cpp          |  64 +--
 bolt/test/X86/Inputs/helperSafeICF.s          |  39 ++
 bolt/test/X86/Inputs/helperSafeICFICPTest.s   |  40 ++
 bolt/test/X86/Inputs/mainSafeICFICPTest.s     | 331 ++++++++++++++++
 bolt/test/X86/Inputs/mainSafeICFTest1.s       | 345 +++++++++++++++++
 .../X86/Inputs/mainSafeICFTest2GlobalVarO0.s  | 363 ++++++++++++++++++
 .../X86/Inputs/mainSafeICFTest2GlobalVarO3.s  | 293 ++++++++++++++
 .../X86/Inputs/mainSafeICFTest3LocalVarO0.s   | 359 +++++++++++++++++
 .../X86/Inputs/mainSafeICFTest3LocalVarO3.s   | 286 ++++++++++++++
 bolt/test/X86/icf-safe-icp.test               |  20 +
 bolt/test/X86/icf-safe-test1-no-cfg.test      |  21 +
 bolt/test/X86/icf-safe-test1-no-relocs.test   |  16 +
 bolt/test/X86/icf-safe-test1.test             |  21 +
 bolt/test/X86/icf-safe-test2GlobalVarO0.test  |  21 +
 bolt/test/X86/icf-safe-test2GlobalVarO3.test  |  21 +
 bolt/test/X86/icf-safe-test3LocalVarO0.test   |  21 +
 bolt/test/X86/icf-safe-test3LocalVarO3.test   |  21 +
 25 files changed, 2431 insertions(+), 74 deletions(-)
 create mode 100644 bolt/test/X86/Inputs/helperSafeICF.s
 create mode 100644 bolt/test/X86/Inputs/helperSafeICFICPTest.s
 create mode 100644 bolt/test/X86/Inputs/mainSafeICFICPTest.s
 create mode 100644 bolt/test/X86/Inputs/mainSafeICFTest1.s
 create mode 100644 bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO0.s
 create mode 100644 bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO3.s
 create mode 100644 bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO0.s
 create mode 100644 bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO3.s
 create mode 100644 bolt/test/X86/icf-safe-icp.test
 create mode 100644 bolt/test/X86/icf-safe-test1-no-cfg.test
 create mode 100644 bolt/test/X86/icf-safe-test1-no-relocs.test
 create mode 100644 bolt/test/X86/icf-safe-test1.test
 create mode 100644 bolt/test/X86/icf-safe-test2GlobalVarO0.test
 create mode 100644 bolt/test/X86/icf-safe-test2GlobalVarO3.test
 create mode 100644 bolt/test/X86/icf-safe-test3LocalVarO0.test
 create mode 100644 bolt/test/X86/icf-safe-test3LocalVarO3.test

diff --git a/bolt/include/bolt/Core/BinaryContext.h b/bolt/include/bolt/Core/BinaryContext.h
index 08ce892054874c..92889ffe162ae1 100644
--- a/bolt/include/bolt/Core/BinaryContext.h
+++ b/bolt/include/bolt/Core/BinaryContext.h
@@ -282,6 +282,12 @@ class BinaryContext {
                       std::unique_ptr<DWARFContext> DwCtx,
                       JournalingStreams Logger);
 
+  /// Returns addend of a relocation.
+  static int64_t getRelocationAddend(const ELFObjectFileBase *Obj,
+                                     const RelocationRef &Rel);
+  /// Returns symbol of a relocation.
+  static uint32_t getRelocationSymbol(const ELFObjectFileBase *Obj,
+                                      const RelocationRef &Rel);
   /// Superset of compiler units that will contain overwritten code that needs
   /// new debug info. In a few cases, functions may end up not being
   /// overwritten, but it is okay to re-generate debug info for them.
@@ -1350,6 +1356,9 @@ class BinaryContext {
     return Code.size();
   }
 
+  /// Processes .text section to identify function references.
+  void processInstructionForFuncReferences(const MCInst &Inst);
+
   /// Compute the native code size for a range of instructions.
   /// Note: this can be imprecise wrt the final binary since happening prior to
   /// relaxation, as well as wrt the original binary because of opcode
diff --git a/bolt/include/bolt/Core/BinaryFunction.h b/bolt/include/bolt/Core/BinaryFunction.h
index 0b3682353f736e..5e1ddcc6bff9a2 100644
--- a/bolt/include/bolt/Core/BinaryFunction.h
+++ b/bolt/include/bolt/Core/BinaryFunction.h
@@ -428,6 +428,9 @@ class BinaryFunction {
   /// Function order for streaming into the destination binary.
   uint32_t Index{-1U};
 
+  /// Indicates if the function is safe to fold.
+  bool IsSafeToICF{true};
+
   /// Get basic block index assuming it belongs to this function.
   unsigned getIndex(const BinaryBasicBlock *BB) const {
     assert(BB->getIndex() < BasicBlocks.size());
@@ -817,6 +820,12 @@ class BinaryFunction {
     return nullptr;
   }
 
+  /// Indicates if the function is safe to fold.
+  bool isSafeToICF() const { return IsSafeToICF; }
+
+  /// Sets the function is not safe to fold.
+  void setUnsetToICF() { IsSafeToICF = false; }
+
   /// Returns the raw binary encoding of this function.
   ErrorOr<ArrayRef<uint8_t>> getData() const;
 
diff --git a/bolt/include/bolt/Passes/IdenticalCodeFolding.h b/bolt/include/bolt/Passes/IdenticalCodeFolding.h
index b4206fa3607445..75d5f19ddfc7be 100644
--- a/bolt/include/bolt/Passes/IdenticalCodeFolding.h
+++ b/bolt/include/bolt/Passes/IdenticalCodeFolding.h
@@ -31,11 +31,21 @@ class IdenticalCodeFolding : public BinaryFunctionPass {
   }
 
 public:
-  explicit IdenticalCodeFolding(const cl::opt<bool> &PrintPass)
-      : BinaryFunctionPass(PrintPass) {}
+  explicit IdenticalCodeFolding(const cl::opt<bool> &PrintPass, bool IsSafeICF)
+      : BinaryFunctionPass(PrintPass), IsSafeICF(IsSafeICF) {}
 
   const char *getName() const override { return "identical-code-folding"; }
   Error runOnFunctions(BinaryContext &BC) override;
+
+private:
+  /// Create a skip list of functions that should not be folded.
+  Error createFoldSkipList(BinaryContext &BC);
+  /// Processes relocations in the .data section to identify function
+  /// references.
+  void processDataRelocations(BinaryContext &BC,
+                              const SectionRef &SecRefRelData);
+
+  bool IsSafeICF;
 };
 
 } // namespace bolt
diff --git a/bolt/lib/Core/BinaryContext.cpp b/bolt/lib/Core/BinaryContext.cpp
index f246750209d6c4..31352bed6fdab7 100644
--- a/bolt/lib/Core/BinaryContext.cpp
+++ b/bolt/lib/Core/BinaryContext.cpp
@@ -75,8 +75,63 @@ cl::opt<std::string> CompDirOverride(
              "location, which is used with DW_AT_dwo_name to construct a path "
              "to *.dwo files."),
     cl::Hidden, cl::init(""), cl::cat(BoltCategory));
+
+cl::opt<bool> ICF("icf", cl::desc("fold functions with identical code"),
+                  cl::cat(BoltOptCategory));
+
+cl::opt<bool> SafeICF("safe-icf",
+                      cl::desc("Enable safe identical code folding"),
+                      cl::cat(BoltOptCategory));
 } // namespace opts
 
+namespace {
+template <typename ELFT>
+int64_t getRelocationAddend(const ELFObjectFile<ELFT> *Obj,
+                            const RelocationRef &RelRef) {
+  using ELFShdrTy = typename ELFT::Shdr;
+  using Elf_Rela = typename ELFT::Rela;
+  int64_t Addend = 0;
+  const ELFFile<ELFT> &EF = Obj->getELFFile();
+  DataRefImpl Rel = RelRef.getRawDataRefImpl();
+  const ELFShdrTy *RelocationSection = cantFail(EF.getSection(Rel.d.a));
+  switch (RelocationSection->sh_type) {
+  default:
+    llvm_unreachable("unexpected relocation section type");
+  case ELF::SHT_REL:
+    break;
+  case ELF::SHT_RELA: {
+    const Elf_Rela *RelA = Obj->getRela(Rel);
+    Addend = RelA->r_addend;
+    break;
+  }
+  }
+
+  return Addend;
+}
+
+template <typename ELFT>
+uint32_t getRelocationSymbol(const ELFObjectFile<ELFT> *Obj,
+                             const RelocationRef &RelRef) {
+  using ELFShdrTy = typename ELFT::Shdr;
+  uint32_t Symbol = 0;
+  const ELFFile<ELFT> &EF = Obj->getELFFile();
+  DataRefImpl Rel = RelRef.getRawDataRefImpl();
+  const ELFShdrTy *RelocationSection = cantFail(EF.getSection(Rel.d.a));
+  switch (RelocationSection->sh_type) {
+  default:
+    llvm_unreachable("unexpected relocation section type");
+  case ELF::SHT_REL:
+    Symbol = Obj->getRel(Rel)->getSymbol(EF.isMips64EL());
+    break;
+  case ELF::SHT_RELA:
+    Symbol = Obj->getRela(Rel)->getSymbol(EF.isMips64EL());
+    break;
+  }
+
+  return Symbol;
+}
+} // anonymous namespace
+
 namespace llvm {
 namespace bolt {
 
@@ -156,6 +211,16 @@ BinaryContext::~BinaryContext() {
   clearBinaryData();
 }
 
+uint32_t BinaryContext::getRelocationSymbol(const ELFObjectFileBase *Obj,
+                                            const RelocationRef &Rel) {
+  return ::getRelocationSymbol(cast<ELF64LEObjectFile>(Obj), Rel);
+}
+
+int64_t BinaryContext::getRelocationAddend(const ELFObjectFileBase *Obj,
+                                           const RelocationRef &Rel) {
+  return ::getRelocationAddend(cast<ELF64LEObjectFile>(Obj), Rel);
+}
+
 /// Create BinaryContext for a given architecture \p ArchName and
 /// triple \p TripleName.
 Expected<std::unique_ptr<BinaryContext>> BinaryContext::createBinaryContext(
@@ -1945,6 +2010,27 @@ static void printDebugInfo(raw_ostream &OS, const MCInst &Instruction,
     OS << " discriminator:" << Row.Discriminator;
 }
 
+static bool skipInstruction(const MCInst &Inst, const BinaryContext &BC) {
+  const bool IsX86 = BC.isX86();
+  return (BC.MIB->isPseudo(Inst) || BC.MIB->isUnconditionalBranch(Inst) ||
+          (IsX86 && BC.MIB->isConditionalBranch(Inst)) ||
+          BC.MIB->isCall(Inst) || BC.MIB->isBranch(Inst));
+}
+void BinaryContext::processInstructionForFuncReferences(const MCInst &Inst) {
+  if (!opts::SafeICF || skipInstruction(Inst, *this))
+    return;
+  for (const MCOperand &Op : MCPlus::primeOperands(Inst)) {
+    if (Op.isExpr()) {
+      const MCExpr &Expr = *Op.getExpr();
+      if (Expr.getKind() == MCExpr::SymbolRef) {
+        const MCSymbol &Symbol = cast<MCSymbolRefExpr>(Expr).getSymbol();
+        if (BinaryFunction *BF = getFunctionForSymbol(&Symbol))
+          BF->setUnsetToICF();
+      }
+    }
+  }
+}
+
 void BinaryContext::printInstruction(raw_ostream &OS, const MCInst &Instruction,
                                      uint64_t Offset,
                                      const BinaryFunction *Function,
diff --git a/bolt/lib/Core/BinaryFunction.cpp b/bolt/lib/Core/BinaryFunction.cpp
index c12217d549479b..07d386efb26ec5 100644
--- a/bolt/lib/Core/BinaryFunction.cpp
+++ b/bolt/lib/Core/BinaryFunction.cpp
@@ -1626,6 +1626,8 @@ bool BinaryFunction::scanExternalRefs() {
     if (!BC.HasRelocations)
       continue;
 
+    BC.processInstructionForFuncReferences(Instruction);
+
     if (BranchTargetSymbol) {
       BC.MIB->replaceBranchTarget(Instruction, BranchTargetSymbol,
                                   Emitter.LocalCtx.get());
diff --git a/bolt/lib/Passes/IdenticalCodeFolding.cpp b/bolt/lib/Passes/IdenticalCodeFolding.cpp
index 38e080c9dd6213..f09482dc08c212 100644
--- a/bolt/lib/Passes/IdenticalCodeFolding.cpp
+++ b/bolt/lib/Passes/IdenticalCodeFolding.cpp
@@ -11,8 +11,10 @@
 //===----------------------------------------------------------------------===//
 
 #include "bolt/Passes/IdenticalCodeFolding.h"
+#include "bolt/Core/BinaryContext.h"
 #include "bolt/Core/HashUtilities.h"
 #include "bolt/Core/ParallelUtilities.h"
+#include "bolt/Rewrite/RewriteInstance.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/ThreadPool.h"
@@ -31,6 +33,7 @@ using namespace bolt;
 namespace opts {
 
 extern cl::OptionCategory BoltOptCategory;
+extern cl::opt<unsigned> Verbosity;
 
 static cl::opt<bool>
     ICFUseDFS("icf-dfs", cl::desc("use DFS ordering when using -icf option"),
@@ -341,6 +344,75 @@ typedef std::unordered_map<BinaryFunction *, std::vector<BinaryFunction *>,
 namespace llvm {
 namespace bolt {
 
+void IdenticalCodeFolding::processDataRelocations(
+    BinaryContext &BC, const SectionRef &SecRefRelData) {
+  for (const RelocationRef &Rel : SecRefRelData.relocations()) {
+    symbol_iterator SymbolIter = Rel.getSymbol();
+    const ObjectFile *OwningObj = Rel.getObject();
+    assert(SymbolIter != OwningObj->symbol_end() &&
+           "relocation Symbol expected");
+    const SymbolRef &Symbol = *SymbolIter;
+    const uint64_t SymbolAddress = cantFail(Symbol.getAddress());
+    const ELFObjectFileBase *ELFObj = dyn_cast<ELFObjectFileBase>(OwningObj);
+    if (!ELFObj)
+      assert(false && "Only ELFObjectFileBase is supported");
+    const int64_t Addend = BinaryContext::getRelocationAddend(ELFObj, Rel);
+    BinaryFunction *BF = BC.getBinaryFunctionAtAddress(SymbolAddress + Addend);
+    if (!BF)
+      continue;
+    BF->setUnsetToICF();
+  }
+}
+
+Error IdenticalCodeFolding::createFoldSkipList(BinaryContext &BC) {
+  Error ErrorStatus = Error::success();
+  ErrorOr<BinarySection &> SecRelData = BC.getUniqueSectionByName(".rela.data");
+  if (!BC.HasRelocations)
+    ErrorStatus = joinErrors(
+        std::move(ErrorStatus),
+        createFatalBOLTError(Twine("BOLT-ERROR: Binary built without "
+                                   "relocations. Safe ICF is not supported")));
+  if (ErrorStatus)
+    return ErrorStatus;
+  if (SecRelData) {
+    SectionRef SecRefRelData = SecRelData->getSectionRef();
+    processDataRelocations(BC, SecRefRelData);
+  }
+
+  ParallelUtilities::WorkFuncTy WorkFun = [&](BinaryFunction &BF) {
+    if (BF.getState() == BinaryFunction::State::CFG) {
+      for (const BinaryBasicBlock *BB : BF.getLayout().blocks())
+        for (const MCInst &Inst : *BB)
+          BC.processInstructionForFuncReferences(Inst);
+    }
+  };
+  ParallelUtilities::PredicateTy SkipFunc =
+      [&](const BinaryFunction &BF) -> bool { return (bool)ErrorStatus; };
+  ParallelUtilities::runOnEachFunction(
+      BC, ParallelUtilities::SchedulingPolicy::SP_TRIVIAL, WorkFun, SkipFunc,
+      "markUnsafe", /*ForceSequential*/ false, 2);
+
+  LLVM_DEBUG({
+    std::vector<StringRef> Vect;
+    std::mutex PrintMutex;
+    ParallelUtilities::WorkFuncTy WorkFun = [&](BinaryFunction &BF) {
+      if (BF.isSafeToICF())
+        return;
+      std::lock_guard<std::mutex> Lock(PrintMutex);
+      Vect.push_back(BF.getOneName());
+    };
+    ParallelUtilities::PredicateTy SkipFunc =
+        [&](const BinaryFunction &BF) -> bool { return false; };
+    ParallelUtilities::runOnEachFunction(
+        BC, ParallelUtilities::SchedulingPolicy::SP_TRIVIAL, WorkFun, SkipFunc,
+        "markUnsafe", /*ForceSequential*/ false, 2);
+    llvm::sort(Vect);
+    for (const auto &FuncName : Vect)
+      dbgs() << "BOLT-DEBUG: skipping function " << FuncName << '\n';
+  });
+  return ErrorStatus;
+}
+
 Error IdenticalCodeFolding::runOnFunctions(BinaryContext &BC) {
   const size_t OriginalFunctionCount = BC.getBinaryFunctions().size();
   uint64_t NumFunctionsFolded = 0;
@@ -350,6 +422,9 @@ Error IdenticalCodeFolding::runOnFunctions(BinaryContext &BC) {
   std::atomic<uint64_t> NumFoldedLastIteration{0};
   CongruentBucketsMap CongruentBuckets;
 
+  auto SkipFuncShared = [&](const BinaryFunction &BF) {
+    return !shouldOptimize(BF) || !BF.isSafeToICF();
+  };
   // Hash all the functions
   auto hashFunctions = [&]() {
     NamedRegionTimer HashFunctionsTimer("hashing", "hashing", "ICF breakdown",
@@ -369,7 +444,7 @@ Error IdenticalCodeFolding::runOnFunctions(BinaryContext &BC) {
     };
 
     ParallelUtilities::PredicateTy SkipFunc = [&](const BinaryFunction &BF) {
-      return !shouldOptimize(BF);
+      return SkipFuncShared(BF);
     };
 
     ParallelUtilities::runOnEachFunction(
@@ -385,7 +460,7 @@ Error IdenticalCodeFolding::runOnFunctions(BinaryContext &BC) {
                                            "ICF breakdown", opts::TimeICF);
     for (auto &BFI : BC.getBinaryFunctions()) {
       BinaryFunction &BF = BFI.second;
-      if (!this->shouldOptimize(BF))
+      if (SkipFuncShared(BF))
         continue;
       CongruentBuckets[&BF].emplace(&BF);
     }
@@ -475,7 +550,11 @@ Error IdenticalCodeFolding::runOnFunctions(BinaryContext &BC) {
 
     LLVM_DEBUG(SinglePass.stopTimer());
   };
-
+  if (IsSafeICF) {
+    if (Error Err = createFoldSkipList(BC)) {
+      return Err;
+    }
+  }
   hashFunctions();
   createCongruentBuckets();
 
diff --git a/bolt/lib/Rewrite/BinaryPassManager.cpp b/bolt/lib/Rewrite/BinaryPassManager.cpp
index b0906041833484..df612c0a8f2e51 100644
--- a/bolt/lib/Rewrite/BinaryPassManager.cpp
+++ b/bolt/lib/Rewrite/BinaryPassManager.cpp
@@ -54,6 +54,8 @@ extern cl::opt<bool> PrintDynoStats;
 extern cl::opt<bool> DumpDotAll;
 extern cl::opt<std::string> AsmDump;
 extern cl::opt<bolt::PLTCall::OptType> PLT;
+extern cl::opt<bool> ICF;
+extern cl::opt<bool> SafeICF;
 
 static cl::opt<bool>
 DynoStatsAll("dyno-stats-all",
@@ -65,9 +67,6 @@ static cl::opt<bool>
                          cl::desc("eliminate unreachable code"), cl::init(true),
                          cl::cat(BoltOptCategory));
 
-cl::opt<bool> ICF("icf", cl::desc("fold functions with identical code"),
-                  cl::cat(BoltOptCategory));
-
 static cl::opt<bool> JTFootprintReductionFlag(
     "jt-footprint-reduction",
     cl::desc("make jump tables size smaller at the cost of using more "
@@ -397,8 +396,9 @@ Error BinaryFunctionPassManager::runAllPasses(BinaryContext &BC) {
     Manager.registerPass(std::make_unique<StripRepRet>(NeverPrint),
                          opts::StripRepRet);
 
-  Manager.registerPass(std::make_unique<IdenticalCodeFolding>(PrintICF),
-                       opts::ICF);
+  Manager.registerPass(
+      std::make_unique<IdenticalCodeFolding>(PrintICF, opts::SafeICF),
+      opts::ICF || opts::SafeICF);
 
   Manager.registerPass(
       std::make_unique<SpecializeMemcpy1>(NeverPrint, opts::SpecializeMemcpy1),
@@ -422,8 +422,9 @@ Error BinaryFunctionPassManager::runAllPasses(BinaryContext &BC) {
 
   Manager.registerPass(std::make_unique<Inliner>(PrintInline));
 
-  Manager.registerPass(std::make_unique<IdenticalCodeFolding>(PrintICF),
-                       opts::ICF);
+  Manager.registerPass(
+      std::make_unique<IdenticalCodeFolding>(PrintICF, opts::SafeICF),
+      opts::ICF || opts::SafeICF);
 
   Manager.registerPass(std::make_unique<PLTCall>(PrintPLT));
 
diff --git a/bolt/lib/Rewrite/BoltDiff.cpp b/bolt/lib/Rewrite/BoltDiff.cpp
index 74b5ca18abce42..1a8eb5cd2ce39d 100644
--- a/bolt/lib/Rewrite/BoltDiff.cpp
+++ b/bolt/lib/Rewrite/BoltDiff.cpp
@@ -29,6 +29,7 @@ namespace opts {
 extern cl::OptionCategory BoltDiffCategory;
 extern cl::opt<bool> NeverPrint;
 extern cl::opt<bool> ICF;
+extern cl::opt<bool> SafeICF;
 
 static cl::opt<bool> IgnoreLTOSuffix(
     "ignore-lto-suffix",
@@ -698,7 +699,7 @@ void RewriteInstance::compare(RewriteInstance &RI2) {
 
   // Pre-pass ICF
   if (opts::ICF) {
-    IdenticalCodeFolding ICF(opts::NeverPrint);
+    IdenticalCodeFolding ICF(opts::NeverPrint, opts::SafeICF);
     outs() << "BOLT-DIFF: Starting ICF pass for binary 1";
     BC->logBOLTErrorsAndQuitOnFatal(ICF.runOnFunctions(*BC));
     outs() << "BOLT-DIFF: Starting ICF pass for binary 2";
diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp
index a4c50cbc3e2bbf..70c9eeef3cdc57 100644
--- a/bolt/lib/Rewrite/RewriteInstance.cpp
+++ b/bolt/lib/Rewrite/RewriteInstance.cpp
@@ -2111,64 +2111,6 @@ void RewriteInstance::adjustCommandLineOptions() {
   }
 }
 
-namespace {
-template <typename ELFT>
-int64_t getRelocationAddend(const ELFObjectFile<ELFT> *Obj,
-                            const RelocationRef &RelRef) {
-  using ELFShdrTy = typename ELFT::Shdr;
-  using Elf_Rela = typename ELFT::Rela;
-  int64_t Addend = 0;
-  const ELFFile<ELFT> &EF = Obj->getELFFile();
-  DataRefImpl Rel = RelRef.getRawDataRefImpl();
-  const ELFShdrTy *RelocationSection = cantFail(EF.getSection(Rel.d.a));
-  switch (RelocationSection->sh_type) {
-  default:
-    llvm_unreachable("unexpected relocation section type");
-  case ELF::SHT_REL:
-    break;
-  case ELF::SHT_RELA: {
-    const Elf_Rela *RelA = Obj->getRela(Rel);
-    Addend = RelA->r_addend;
-    break;
-  }
-  }
-
-  return Addend;
-}
-
-int64_t getRelocationAddend(const ELFObjectFileBase *Obj,
-                            const RelocationRef &Rel) {
-  return getRelocationAddend(cast<ELF64LEObjectFile>(Obj), Rel);
-}
-
-template <typename ELFT>
-uint32_t getRelocationSymbol(const ELFObjectFile<ELFT> *Obj,
-                             const RelocationRef &RelRef) {
-  using ELFShdrTy = typename ELFT::Shdr;
-  uint32_t Symbol = 0;
-  const ELFFile<ELFT> &EF = Obj->getELFFile();
-  DataRefImpl Rel = RelRef.getRawDataRefImpl();
-  const ELFShdrTy *RelocationSection = cantFail(EF.getSection(Rel.d.a));
-  switch (RelocationSection->sh_type) {
-  default:
-    llvm_unreachable("unexpected relocation section type");
-  case ELF::SHT_REL:
-    Symbol = Obj->getRel(Rel)->getSymbol(EF.isMips64EL());
-    break;
-  case ELF::SHT_RELA:
-    Symbol = Obj->getRela(Rel)->getSymbol(EF.isMips64EL());
-    break;
-  }
-
-  return Symbol;
-}
-
-uint32_t getRelocationSymbol(const ELFObjectFileBase *Obj,
-                             const RelocationRef &Rel) {
-  return getRelocationSymbol(cast<ELF64LEObjectFile>(Obj), Rel);
-}
-} // anonymous namespace
-
 bool RewriteInstance::analyzeRelocation(
     const RelocationRef &Rel, uint64_t &RType, std::string &SymbolName,
     bool &IsSectionRelocation, uint64_t &SymbolAddress, int64_t &Addend,
@@ -2196,7 +2138,7 @@ bool RewriteInstance::analyzeRelocation(
     return true;
 
   ExtractedValue = Relocation::extractValue(RType, *Value, Rel.getOffset());
-  Addend = getRelocationAddend(InputFile, Rel);
+  Addend = BinaryContext::getRelocationAddend(InputFile, Rel);
 
   const bool IsPCRelative = Relocation::isPCRelative(RType);
   const uint64_t PCRelOffset = IsPCRelative && !IsAArch64 ? Rel.getOffset() : 0;
@@ -2396,7 +2338,7 @@ void RewriteInstance::readDynamicRelocations(const SectionRef &Section,
     StringRef SymbolName = "<none>";
     MCSymbol *Symbol = nullptr;
     uint64_t SymbolAddress = 0;
-    const uint64_t Addend = getRelocationAddend(InputFile, Rel);
+    const uint64_t Addend = BinaryContext::getRelocationAddend(InputFile, Rel);
 
     symbol_iterator SymbolIter = Rel.getSymbol();
     if (SymbolIter != InputFile->symbol_end()) {
@@ -2421,7 +2363,7 @@ void RewriteInstance::readDynamicRelocations(const SectionRef &Section,
       IsJmpRelocation[RType] = true;
 
     if (Symbol)
-      SymbolIndex[Symbol] = getRelocationSymbol(InputFile, Rel);
+      SymbolIndex[Symbol] = BinaryContext::getRelocationSymbol(InputFile, Rel);
 
     BC->addDynamicRelocation(Rel.getOffset(), Symbol, RType, Addend);
   }
diff --git a/bolt/test/X86/Inputs/helperSafeICF.s b/bolt/test/X86/Inputs/helperSafeICF.s
new file mode 100644
index 00000000000000..8ab47324454cbc
--- /dev/null
+++ b/bolt/test/X86/Inputs/helperSafeICF.s
@@ -0,0 +1,39 @@
+# clang++ -c helper.cpp -o helper.o
+# int FooVar = 1;
+# int BarVar = 2;
+#
+# int fooGlobalFuncHelper(int a, int b) {
+#   return 5;
+# }
+	.text
+	.file	"helper.cpp"
+	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.p2align	4, 0x90
+	.type	_Z19fooGlobalFuncHelperii, at function
+_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.cfi_startproc
+# %bb.0:
+	movl	$5, %eax
+	retq
+.Lfunc_end0:
+	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end0-_Z19fooGlobalFuncHelperii
+	.cfi_endproc
+                                        # -- End function
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
+
+	.ident	"clang version 20.0.0git"
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
diff --git a/bolt/test/X86/Inputs/helperSafeICFICPTest.s b/bolt/test/X86/Inputs/helperSafeICFICPTest.s
new file mode 100644
index 00000000000000..ae62b4f292656f
--- /dev/null
+++ b/bolt/test/X86/Inputs/helperSafeICFICPTest.s
@@ -0,0 +1,40 @@
+# clang++ -O2 helper.cpp -c -o helperProf.o
+# int returnFive() {
+#   return 5;
+# }
+# int returnFourOrFive(int val) {
+#   return val == 1 ? 4 : 5;
+# }
+
+	.text
+	.file	"helper.cpp"
+	.globl	_Z10returnFivev                 # -- Begin function _Z10returnFivev
+	.p2align	4, 0x90
+	.type	_Z10returnFivev, at function
+_Z10returnFivev:                        # @_Z10returnFivev
+	.cfi_startproc
+# %bb.0:                                # %entry
+	movl	$5, %eax
+	retq
+.Lfunc_end0:
+	.size	_Z10returnFivev, .Lfunc_end0-_Z10returnFivev
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z16returnFourOrFivei           # -- Begin function _Z16returnFourOrFivei
+	.p2align	4, 0x90
+	.type	_Z16returnFourOrFivei, at function
+_Z16returnFourOrFivei:                  # @_Z16returnFourOrFivei
+	.cfi_startproc
+# %bb.0:                                # %entry
+	xorl	%eax, %eax
+	cmpl	$1, %edi
+	sete	%al
+	xorl	$5, %eax
+	retq
+.Lfunc_end1:
+	.size	_Z16returnFourOrFivei, .Lfunc_end1-_Z16returnFourOrFivei
+	.cfi_endproc
+                                        # -- End function
+	.ident	"clang version 20.0.0git"
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
diff --git a/bolt/test/X86/Inputs/mainSafeICFICPTest.s b/bolt/test/X86/Inputs/mainSafeICFICPTest.s
new file mode 100644
index 00000000000000..4b12acdeae0995
--- /dev/null
+++ b/bolt/test/X86/Inputs/mainSafeICFICPTest.s
@@ -0,0 +1,331 @@
+# generate profile
+# clang++ -O2 -fprofile-generate=. main.cpp   -c -o mainProf.o
+# PROF=test.profdata
+# clang++ -m64  -fprofile-use=$PROF \
+#   -mllvm -disable-icp=true -mllvm -print-after-all \
+#   -g0 -flto=thin -fwhole-program-vtables -fno-split-lto-unit -O2 \
+#   -fdebug-types-section \
+#   main.cpp -c -o mainProfLTO.bc
+# PASS='pgo-icall-prom'
+# clang++ -m64  -fprofile-use=$PROF \
+#   -O3 -Rpass=$PASS \
+#   -mllvm -print-before=$PASS \
+#   -mllvm -print-after=$PASS \
+#   -mllvm -filter-print-funcs=main \
+#   -mllvm -debug-only=$PASS \
+#   -x ir \
+#   mainProfLTO.bc -c -o mainProfFinal.o
+
+# class Base {
+# public:
+#   virtual int func(int a, int b) const = 0;
+#
+#   virtual ~Base() {};
+# };
+#
+# //namespace {
+# class Derived2 : public Base {
+#   int c = 5;
+# public:
+#   __attribute__((noinline)) int func(int a, int b)const override { return a * (a - b) + this->c; }
+#
+#   ~Derived2() {}
+# };
+#
+# class Derived3 : public Base {
+#   int c = 500;
+# public:
+#   __attribute__((noinline)) int func(int a, int b) const override { return a * (a - b) + this->c; }
+#   ~Derived3() {}
+# };
+# //} // namespace//
+#
+# __attribute__((noinline)) Base *createType(int a) {
+#     Base *base = nullptr;
+#     if (a == 4)
+#       base = new Derived2();
+#     else
+#       base = new Derived3();
+#     return base;
+# }
+#
+# extern int returnFive();
+# extern int returnFourOrFive(int val);
+# int main(int argc, char **argv) {
+#   int sum = 0;
+#   int a = returnFourOrFive(argc);
+#   int b = returnFive();
+#   Base *ptr = createType(a);
+#   Base *ptr2 = createType(b);
+#   sum += ptr->func(b, a) + ptr2->func(b, a);
+#   return 0;
+# }
+  .text
+	.file	"main.cpp"
+	.section	.text.hot.,"ax", at progbits
+	.globl	_Z10createTypei                 # -- Begin function _Z10createTypei
+	.p2align	4, 0x90
+	.type	_Z10createTypei, at function
+_Z10createTypei:                        # @_Z10createTypei
+	.cfi_startproc
+# %bb.0:                                # %entry
+	pushq	%rbx
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbx, -16
+	movl	%edi, %ebx
+	movl	$16, %edi
+	callq	_Znwm at PLT
+	cmpl	$4, %ebx
+	xorps	%xmm0, %xmm0
+	leaq	_ZTV8Derived2+16(%rip), %rcx
+	leaq	_ZTV8Derived3+16(%rip), %rdx
+	cmoveq	%rcx, %rdx
+	movl	$5, %ecx
+	movl	$500, %esi                      # imm = 0x1F4
+	cmovel	%ecx, %esi
+	movaps	%xmm0, (%rax)
+	movq	%rdx, (%rax)
+	movl	%esi, 8(%rax)
+	popq	%rbx
+	.cfi_def_cfa_offset 8
+	retq
+.Lfunc_end0:
+	.size	_Z10createTypei, .Lfunc_end0-_Z10createTypei
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+# %bb.0:                                # %entry
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	pushq	%r15
+	.cfi_def_cfa_offset 24
+	pushq	%r14
+	.cfi_def_cfa_offset 32
+	pushq	%rbx
+	.cfi_def_cfa_offset 40
+	pushq	%rax
+	.cfi_def_cfa_offset 48
+	.cfi_offset %rbx, -40
+	.cfi_offset %r14, -32
+	.cfi_offset %r15, -24
+	.cfi_offset %rbp, -16
+	callq	_Z16returnFourOrFivei at PLT
+	movl	%eax, %ebx
+	callq	_Z10returnFivev at PLT
+	movl	%eax, %ebp
+	movl	%ebx, %edi
+	callq	_Z10createTypei
+	movq	%rax, %r15
+	movl	%ebp, %edi
+	callq	_Z10createTypei
+	movq	%rax, %r14
+	movq	(%r15), %rax
+	movq	(%rax), %rax
+	leaq	_ZNK8Derived24funcEii(%rip), %rcx
+	movq	%r15, %rdi
+	movl	%ebp, %esi
+	movl	%ebx, %edx
+	cmpq	%rcx, %rax
+	jne	.LBB1_2
+# %bb.1:                                # %if.true.direct_targ
+	callq	_ZNK8Derived24funcEii
+.LBB1_3:                                # %if.end.icp
+	movq	(%r14), %rax
+	movq	(%rax), %rax
+	leaq	_ZNK8Derived34funcEii(%rip), %rcx
+	movq	%r14, %rdi
+	movl	%ebp, %esi
+	movl	%ebx, %edx
+	cmpq	%rcx, %rax
+	jne	.LBB1_5
+# %bb.4:                                # %if.true.direct_targ1
+	callq	_ZNK8Derived34funcEii
+.LBB1_6:                                # %if.end.icp3
+	xorl	%eax, %eax
+	addq	$8, %rsp
+	.cfi_def_cfa_offset 40
+	popq	%rbx
+	.cfi_def_cfa_offset 32
+	popq	%r14
+	.cfi_def_cfa_offset 24
+	popq	%r15
+	.cfi_def_cfa_offset 16
+	popq	%rbp
+	.cfi_def_cfa_offset 8
+	retq
+.LBB1_2:                                # %if.false.orig_indirect
+	.cfi_def_cfa_offset 48
+	callq	*%rax
+	jmp	.LBB1_3
+.LBB1_5:                                # %if.false.orig_indirect2
+	callq	*%rax
+	jmp	.LBB1_6
+.Lfunc_end1:
+	.size	main, .Lfunc_end1-main
+	.cfi_endproc
+                                        # -- End function
+	.section	.text.hot._ZNK8Derived24funcEii,"axG", at progbits,_ZNK8Derived24funcEii,comdat
+	.weak	_ZNK8Derived24funcEii           # -- Begin function _ZNK8Derived24funcEii
+	.p2align	4, 0x90
+	.type	_ZNK8Derived24funcEii, at function
+_ZNK8Derived24funcEii:                  # @_ZNK8Derived24funcEii
+	.cfi_startproc
+# %bb.0:                                # %entry
+	movl	%esi, %eax
+	subl	%edx, %eax
+	imull	%esi, %eax
+	addl	8(%rdi), %eax
+	retq
+.Lfunc_end2:
+	.size	_ZNK8Derived24funcEii, .Lfunc_end2-_ZNK8Derived24funcEii
+	.cfi_endproc
+                                        # -- End function
+	.section	.text.unlikely._ZN8Derived2D0Ev,"axG", at progbits,_ZN8Derived2D0Ev,comdat
+	.weak	_ZN8Derived2D0Ev                # -- Begin function _ZN8Derived2D0Ev
+	.p2align	4, 0x90
+	.type	_ZN8Derived2D0Ev, at function
+_ZN8Derived2D0Ev:                       # @_ZN8Derived2D0Ev
+	.cfi_startproc
+# %bb.0:                                # %entry
+	movl	$16, %esi
+	jmp	_ZdlPvm at PLT                     # TAILCALL
+.Lfunc_end3:
+	.size	_ZN8Derived2D0Ev, .Lfunc_end3-_ZN8Derived2D0Ev
+	.cfi_endproc
+                                        # -- End function
+	.section	.text.hot._ZNK8Derived34funcEii,"axG", at progbits,_ZNK8Derived34funcEii,comdat
+	.weak	_ZNK8Derived34funcEii           # -- Begin function _ZNK8Derived34funcEii
+	.p2align	4, 0x90
+	.type	_ZNK8Derived34funcEii, at function
+_ZNK8Derived34funcEii:                  # @_ZNK8Derived34funcEii
+	.cfi_startproc
+# %bb.0:                                # %entry
+	movl	%esi, %eax
+	subl	%edx, %eax
+	imull	%esi, %eax
+	addl	8(%rdi), %eax
+	retq
+.Lfunc_end4:
+	.size	_ZNK8Derived34funcEii, .Lfunc_end4-_ZNK8Derived34funcEii
+	.cfi_endproc
+                                        # -- End function
+	.section	.text.unlikely._ZN4BaseD2Ev,"axG", at progbits,_ZN4BaseD2Ev,comdat
+	.weak	_ZN4BaseD2Ev                    # -- Begin function _ZN4BaseD2Ev
+	.p2align	4, 0x90
+	.type	_ZN4BaseD2Ev, at function
+_ZN4BaseD2Ev:                           # @_ZN4BaseD2Ev
+	.cfi_startproc
+# %bb.0:                                # %entry
+	retq
+.Lfunc_end5:
+	.size	_ZN4BaseD2Ev, .Lfunc_end5-_ZN4BaseD2Ev
+	.cfi_endproc
+                                        # -- End function
+	.section	.text.unlikely._ZN8Derived3D0Ev,"axG", at progbits,_ZN8Derived3D0Ev,comdat
+	.weak	_ZN8Derived3D0Ev                # -- Begin function _ZN8Derived3D0Ev
+	.p2align	4, 0x90
+	.type	_ZN8Derived3D0Ev, at function
+_ZN8Derived3D0Ev:                       # @_ZN8Derived3D0Ev
+	.cfi_startproc
+# %bb.0:                                # %entry
+	movl	$16, %esi
+	jmp	_ZdlPvm at PLT                     # TAILCALL
+.Lfunc_end6:
+	.size	_ZN8Derived3D0Ev, .Lfunc_end6-_ZN8Derived3D0Ev
+	.cfi_endproc
+                                        # -- End function
+	.type	_ZTV8Derived2, at object           # @_ZTV8Derived2
+	.section	.data.rel.ro._ZTV8Derived2,"awG", at progbits,_ZTV8Derived2,comdat
+	.weak	_ZTV8Derived2
+	.p2align	3, 0x0
+_ZTV8Derived2:
+	.quad	0
+	.quad	_ZTI8Derived2
+	.quad	_ZNK8Derived24funcEii
+	.quad	_ZN4BaseD2Ev
+	.quad	_ZN8Derived2D0Ev
+	.size	_ZTV8Derived2, 40
+
+	.type	_ZTS8Derived2, at object           # @_ZTS8Derived2
+	.section	.rodata._ZTS8Derived2,"aG", at progbits,_ZTS8Derived2,comdat
+	.weak	_ZTS8Derived2
+_ZTS8Derived2:
+	.asciz	"8Derived2"
+	.size	_ZTS8Derived2, 10
+
+	.type	_ZTS4Base, at object               # @_ZTS4Base
+	.section	.rodata._ZTS4Base,"aG", at progbits,_ZTS4Base,comdat
+	.weak	_ZTS4Base
+_ZTS4Base:
+	.asciz	"4Base"
+	.size	_ZTS4Base, 6
+
+	.type	_ZTI4Base, at object               # @_ZTI4Base
+	.section	.data.rel.ro._ZTI4Base,"awG", at progbits,_ZTI4Base,comdat
+	.weak	_ZTI4Base
+	.p2align	3, 0x0
+_ZTI4Base:
+	.quad	_ZTVN10__cxxabiv117__class_type_infoE+16
+	.quad	_ZTS4Base
+	.size	_ZTI4Base, 16
+
+	.type	_ZTI8Derived2, at object           # @_ZTI8Derived2
+	.section	.data.rel.ro._ZTI8Derived2,"awG", at progbits,_ZTI8Derived2,comdat
+	.weak	_ZTI8Derived2
+	.p2align	3, 0x0
+_ZTI8Derived2:
+	.quad	_ZTVN10__cxxabiv120__si_class_type_infoE+16
+	.quad	_ZTS8Derived2
+	.quad	_ZTI4Base
+	.size	_ZTI8Derived2, 24
+
+	.type	_ZTV8Derived3, at object           # @_ZTV8Derived3
+	.section	.data.rel.ro._ZTV8Derived3,"awG", at progbits,_ZTV8Derived3,comdat
+	.weak	_ZTV8Derived3
+	.p2align	3, 0x0
+_ZTV8Derived3:
+	.quad	0
+	.quad	_ZTI8Derived3
+	.quad	_ZNK8Derived34funcEii
+	.quad	_ZN4BaseD2Ev
+	.quad	_ZN8Derived3D0Ev
+	.size	_ZTV8Derived3, 40
+
+	.type	_ZTS8Derived3, at object           # @_ZTS8Derived3
+	.section	.rodata._ZTS8Derived3,"aG", at progbits,_ZTS8Derived3,comdat
+	.weak	_ZTS8Derived3
+_ZTS8Derived3:
+	.asciz	"8Derived3"
+	.size	_ZTS8Derived3, 10
+
+	.type	_ZTI8Derived3, at object           # @_ZTI8Derived3
+	.section	.data.rel.ro._ZTI8Derived3,"awG", at progbits,_ZTI8Derived3,comdat
+	.weak	_ZTI8Derived3
+	.p2align	3, 0x0
+_ZTI8Derived3:
+	.quad	_ZTVN10__cxxabiv120__si_class_type_infoE+16
+	.quad	_ZTS8Derived3
+	.quad	_ZTI4Base
+	.size	_ZTI8Derived3, 24
+
+	.cg_profile _Z10createTypei, _Znwm, 2
+	.cg_profile main, _Z16returnFourOrFivei, 1
+	.cg_profile main, _Z10returnFivev, 1
+	.cg_profile main, _Z10createTypei, 2
+	.cg_profile main, _ZNK8Derived24funcEii, 1
+	.cg_profile main, _ZNK8Derived34funcEii, 1
+	.ident	"clang version 20.0.0git"
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.addrsig_sym _ZTVN10__cxxabiv120__si_class_type_infoE
+	.addrsig_sym _ZTS8Derived2
+	.addrsig_sym _ZTVN10__cxxabiv117__class_type_infoE
+	.addrsig_sym _ZTS4Base
+	.addrsig_sym _ZTI4Base
+	.addrsig_sym _ZTI8Derived2
+	.addrsig_sym _ZTS8Derived3
+	.addrsig_sym _ZTI8Derived3
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest1.s b/bolt/test/X86/Inputs/mainSafeICFTest1.s
new file mode 100644
index 00000000000000..7d38f0bd190fd8
--- /dev/null
+++ b/bolt/test/X86/Inputs/mainSafeICFTest1.s
@@ -0,0 +1,345 @@
+# clang++ -c main.cpp -o main.o
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# int fooSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int barSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int helper1(int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# int helper2(int (*func)(int, int), int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# int main(int argc, char **argv) {
+#   int temp = helper1(barAdd, FooVar, BarVar) +
+#              helper2(fooMul, barMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
+#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#   return temp;
+# }
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.p2align	4, 0x90
+	.type	_Z6fooSubii, at function
+_Z6fooSubii:                            # @_Z6fooSubii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	subl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end0:
+	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+	.p2align	4, 0x90
+	.type	_Z6barSubii, at function
+_Z6barSubii:                            # @_Z6barSubii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	subl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end1:
+	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	imull	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end2:
+	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	imull	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end3:
+	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end4:
+	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end5:
+	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFiiiEii, at function
+_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$32, %rsp
+	movq	%rdi, -16(%rbp)
+	movl	%esi, -20(%rbp)
+	movl	%edx, -24(%rbp)
+	leaq	_Z6barAddii(%rip), %rax
+	cmpq	%rax, -16(%rbp)
+	jne	.LBB6_2
+# %bb.1:
+	movl	$1, -4(%rbp)
+	jmp	.LBB6_3
+.LBB6_2:
+	movq	-16(%rbp), %rax
+	movl	-20(%rbp), %edi
+	movl	-24(%rbp), %esi
+	callq	*%rax
+	subl	$4, %eax
+	movl	%eax, -4(%rbp)
+.LBB6_3:
+	movl	-4(%rbp), %eax
+	addq	$32, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end6:
+	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFiiiES0_ii, at function
+_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$48, %rsp
+	movq	%rdi, -16(%rbp)
+	movq	%rsi, -24(%rbp)
+	movl	%edx, -28(%rbp)
+	movl	%ecx, -32(%rbp)
+	movq	-16(%rbp), %rax
+	cmpq	-24(%rbp), %rax
+	jne	.LBB7_2
+# %bb.1:
+	movl	$2, -4(%rbp)
+	jmp	.LBB7_3
+.LBB7_2:
+	movq	-16(%rbp), %rax
+	movl	-28(%rbp), %edi
+	movl	-32(%rbp), %esi
+	callq	*%rax
+	movl	%eax, -36(%rbp)                 # 4-byte Spill
+	movq	-24(%rbp), %rax
+	movl	-28(%rbp), %edi
+	movl	-32(%rbp), %esi
+	callq	*%rax
+	movl	%eax, %ecx
+	movl	-36(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -4(%rbp)
+.LBB7_3:
+	movl	-4(%rbp), %eax
+	addq	$48, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end7:
+	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$48, %rsp
+	movl	$0, -4(%rbp)
+	movl	%edi, -8(%rbp)
+	movq	%rsi, -16(%rbp)
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edx
+	leaq	_Z6barAddii(%rip), %rdi
+	callq	_Z7helper1PFiiiEii
+	movl	%eax, -36(%rbp)                 # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edx
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %ecx
+	leaq	_Z6fooMulii(%rip), %rdi
+	leaq	_Z6barMulii(%rip), %rsi
+	callq	_Z7helper2PFiiiES0_ii
+	movl	%eax, %ecx
+	movl	-36(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -32(%rbp)                 # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	callq	_Z6fooSubii
+	movl	%eax, %ecx
+	movl	-32(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -28(%rbp)                 # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	callq	_Z6barSubii
+	movl	%eax, %ecx
+	movl	-28(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -24(%rbp)                 # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	callq	_Z6fooAddii
+	movl	%eax, %ecx
+	movl	-24(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -20(%rbp)
+	movl	-20(%rbp), %eax
+	addq	$48, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end8:
+	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+                                        # -- End function
+	.ident	"clang version 20.0.0git"
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.addrsig_sym _Z6fooSubii
+	.addrsig_sym _Z6barSubii
+	.addrsig_sym _Z6fooMulii
+	.addrsig_sym _Z6barMulii
+	.addrsig_sym _Z6fooAddii
+	.addrsig_sym _Z6barAddii
+	.addrsig_sym _Z7helper1PFiiiEii
+	.addrsig_sym _Z7helper2PFiiiES0_ii
+	.addrsig_sym FooVar
+	.addrsig_sym BarVar
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO0.s b/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO0.s
new file mode 100644
index 00000000000000..5d5d00c12320be
--- /dev/null
+++ b/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO0.s
@@ -0,0 +1,363 @@
+# clang++ -c main.cpp -o main.o
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# int fooSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int barSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int helper1(int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# int helper2(int (*func)(int, int), int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# static int (*funcGlobalBarAdd)(int, int) = barAdd;
+# int (*funcGlobalBarMul)(int, int) = barMul;
+# int main(int argc, char **argv) {
+#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
+#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
+#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#   return temp;
+# }
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.p2align	4, 0x90
+	.type	_Z6fooSubii, at function
+_Z6fooSubii:                            # @_Z6fooSubii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	subl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end0:
+	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+	.p2align	4, 0x90
+	.type	_Z6barSubii, at function
+_Z6barSubii:                            # @_Z6barSubii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	subl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end1:
+	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	imull	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end2:
+	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	imull	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end3:
+	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end4:
+	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end5:
+	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFiiiEii, at function
+_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$32, %rsp
+	movq	%rdi, -16(%rbp)
+	movl	%esi, -20(%rbp)
+	movl	%edx, -24(%rbp)
+	leaq	_Z6barAddii(%rip), %rax
+	cmpq	%rax, -16(%rbp)
+	jne	.LBB6_2
+# %bb.1:
+	movl	$1, -4(%rbp)
+	jmp	.LBB6_3
+.LBB6_2:
+	movq	-16(%rbp), %rax
+	movl	-20(%rbp), %edi
+	movl	-24(%rbp), %esi
+	callq	*%rax
+	subl	$4, %eax
+	movl	%eax, -4(%rbp)
+.LBB6_3:
+	movl	-4(%rbp), %eax
+	addq	$32, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end6:
+	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFiiiES0_ii, at function
+_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$48, %rsp
+	movq	%rdi, -16(%rbp)
+	movq	%rsi, -24(%rbp)
+	movl	%edx, -28(%rbp)
+	movl	%ecx, -32(%rbp)
+	movq	-16(%rbp), %rax
+	cmpq	-24(%rbp), %rax
+	jne	.LBB7_2
+# %bb.1:
+	movl	$2, -4(%rbp)
+	jmp	.LBB7_3
+.LBB7_2:
+	movq	-16(%rbp), %rax
+	movl	-28(%rbp), %edi
+	movl	-32(%rbp), %esi
+	callq	*%rax
+	movl	%eax, -36(%rbp)                 # 4-byte Spill
+	movq	-24(%rbp), %rax
+	movl	-28(%rbp), %edi
+	movl	-32(%rbp), %esi
+	callq	*%rax
+	movl	%eax, %ecx
+	movl	-36(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -4(%rbp)
+.LBB7_3:
+	movl	-4(%rbp), %eax
+	addq	$48, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end7:
+	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$48, %rsp
+	movl	$0, -4(%rbp)
+	movl	%edi, -8(%rbp)
+	movq	%rsi, -16(%rbp)
+	movq	_ZL16funcGlobalBarAdd(%rip), %rdi
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edx
+	callq	_Z7helper1PFiiiEii
+	movl	%eax, -36(%rbp)                 # 4-byte Spill
+	movq	funcGlobalBarMul(%rip), %rsi
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edx
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %ecx
+	leaq	_Z6fooMulii(%rip), %rdi
+	callq	_Z7helper2PFiiiES0_ii
+	movl	%eax, %ecx
+	movl	-36(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -32(%rbp)                 # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	callq	_Z6fooSubii
+	movl	%eax, %ecx
+	movl	-32(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -28(%rbp)                 # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	callq	_Z6barSubii
+	movl	%eax, %ecx
+	movl	-28(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -24(%rbp)                 # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	callq	_Z6fooAddii
+	movl	%eax, %ecx
+	movl	-24(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -20(%rbp)
+	movl	-20(%rbp), %eax
+	addq	$48, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end8:
+	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+                                        # -- End function
+	.type	funcGlobalBarMul, at object        # @funcGlobalBarMul
+	.data
+	.globl	funcGlobalBarMul
+	.p2align	3, 0x0
+funcGlobalBarMul:
+	.quad	_Z6barMulii
+	.size	funcGlobalBarMul, 8
+
+	.type	_ZL16funcGlobalBarAdd, at object   # @_ZL16funcGlobalBarAdd
+	.p2align	3, 0x0
+_ZL16funcGlobalBarAdd:
+	.quad	_Z6barAddii
+	.size	_ZL16funcGlobalBarAdd, 8
+
+	.ident	"clang version 20.0.0git"
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.addrsig_sym _Z6fooSubii
+	.addrsig_sym _Z6barSubii
+	.addrsig_sym _Z6fooMulii
+	.addrsig_sym _Z6barMulii
+	.addrsig_sym _Z6fooAddii
+	.addrsig_sym _Z6barAddii
+	.addrsig_sym _Z7helper1PFiiiEii
+	.addrsig_sym _Z7helper2PFiiiES0_ii
+	.addrsig_sym funcGlobalBarMul
+	.addrsig_sym _ZL16funcGlobalBarAdd
+	.addrsig_sym FooVar
+	.addrsig_sym BarVar
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO3.s b/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO3.s
new file mode 100644
index 00000000000000..3579fa2eae293b
--- /dev/null
+++ b/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO3.s
@@ -0,0 +1,293 @@
+# clang++ -O3 -c main.cpp -o main.o
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# int fooSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int barSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int helper1(int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# int helper2(int (*func)(int, int), int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# static int (*funcGlobalBarAdd)(int, int) = barAdd;
+# int (*funcGlobalBarMul)(int, int) = barMul;
+# int main(int argc, char **argv) {
+#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
+#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
+#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#   return temp;
+# }
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.p2align	4, 0x90
+	.type	_Z6fooSubii, at function
+_Z6fooSubii:                            # @_Z6fooSubii
+	.cfi_startproc
+# %bb.0:
+	movl	%edi, %eax
+	subl	%esi, %eax
+	retq
+.Lfunc_end0:
+	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+	.p2align	4, 0x90
+	.type	_Z6barSubii, at function
+_Z6barSubii:                            # @_Z6barSubii
+	.cfi_startproc
+# %bb.0:
+	movl	%edi, %eax
+	subl	%esi, %eax
+	retq
+.Lfunc_end1:
+	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+# %bb.0:
+	movl	%edi, %eax
+	imull	%esi, %eax
+	retq
+.Lfunc_end2:
+	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+# %bb.0:
+	movl	%edi, %eax
+	imull	%esi, %eax
+	retq
+.Lfunc_end3:
+	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+# %bb.0:
+                                        # kill: def $esi killed $esi def $rsi
+                                        # kill: def $edi killed $edi def $rdi
+	leal	(%rdi,%rsi), %eax
+	retq
+.Lfunc_end4:
+	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+# %bb.0:
+                                        # kill: def $esi killed $esi def $rsi
+                                        # kill: def $edi killed $edi def $rdi
+	leal	(%rdi,%rsi), %eax
+	retq
+.Lfunc_end5:
+	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFiiiEii, at function
+_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.cfi_startproc
+# %bb.0:
+	leaq	_Z6barAddii(%rip), %rcx
+	cmpq	%rcx, %rdi
+	je	.LBB6_1
+# %bb.2:
+	pushq	%rax
+	.cfi_def_cfa_offset 16
+	movq	%rdi, %rax
+	movl	%esi, %edi
+	movl	%edx, %esi
+	callq	*%rax
+	addl	$-4, %eax
+	addq	$8, %rsp
+	.cfi_def_cfa_offset 8
+	retq
+.LBB6_1:
+	movl	$1, %eax
+	retq
+.Lfunc_end6:
+	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFiiiES0_ii, at function
+_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.cfi_startproc
+# %bb.0:
+	cmpq	%rsi, %rdi
+	je	.LBB7_1
+# %bb.2:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	pushq	%r15
+	.cfi_def_cfa_offset 24
+	pushq	%r14
+	.cfi_def_cfa_offset 32
+	pushq	%rbx
+	.cfi_def_cfa_offset 40
+	pushq	%rax
+	.cfi_def_cfa_offset 48
+	.cfi_offset %rbx, -40
+	.cfi_offset %r14, -32
+	.cfi_offset %r15, -24
+	.cfi_offset %rbp, -16
+	movl	%ecx, %ebx
+	movl	%edx, %ebp
+	movq	%rsi, %r14
+	movq	%rdi, %rax
+	movl	%edx, %edi
+	movl	%ecx, %esi
+	callq	*%rax
+	movl	%eax, %r15d
+	movl	%ebp, %edi
+	movl	%ebx, %esi
+	callq	*%r14
+	addl	%r15d, %eax
+	addq	$8, %rsp
+	.cfi_def_cfa_offset 40
+	popq	%rbx
+	.cfi_def_cfa_offset 32
+	popq	%r14
+	.cfi_def_cfa_offset 24
+	popq	%r15
+	.cfi_def_cfa_offset 16
+	popq	%rbp
+	.cfi_def_cfa_offset 8
+	.cfi_restore %rbx
+	.cfi_restore %r14
+	.cfi_restore %r15
+	.cfi_restore %rbp
+	retq
+.LBB7_1:
+	movl	$2, %eax
+	retq
+.Lfunc_end7:
+	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	pushq	%r15
+	.cfi_def_cfa_offset 24
+	pushq	%r14
+	.cfi_def_cfa_offset 32
+	pushq	%r12
+	.cfi_def_cfa_offset 40
+	pushq	%rbx
+	.cfi_def_cfa_offset 48
+	.cfi_offset %rbx, -48
+	.cfi_offset %r12, -40
+	.cfi_offset %r14, -32
+	.cfi_offset %r15, -24
+	.cfi_offset %rbp, -16
+	movq	FooVar at GOTPCREL(%rip), %r14
+	movl	(%r14), %esi
+	movq	BarVar at GOTPCREL(%rip), %r15
+	movl	(%r15), %edx
+	leaq	_Z6barAddii(%rip), %rdi
+	callq	_Z7helper1PFiiiEii
+	movl	%eax, %ebx
+	movq	funcGlobalBarMul(%rip), %rsi
+	movl	(%r14), %edx
+	movl	(%r15), %ecx
+	leaq	_Z6fooMulii(%rip), %rdi
+	callq	_Z7helper2PFiiiES0_ii
+	movl	%eax, %ebp
+	addl	%ebx, %ebp
+	movl	(%r14), %ebx
+	movl	(%r15), %r14d
+	movl	%ebx, %edi
+	movl	%r14d, %esi
+	callq	_Z6fooSubii
+	movl	%eax, %r15d
+	movl	%ebx, %edi
+	movl	%r14d, %esi
+	callq	_Z6barSubii
+	movl	%eax, %r12d
+	addl	%r15d, %r12d
+	addl	%ebp, %r12d
+	movl	%ebx, %edi
+	movl	%r14d, %esi
+	callq	_Z6fooAddii
+	addl	%r12d, %eax
+	popq	%rbx
+	.cfi_def_cfa_offset 40
+	popq	%r12
+	.cfi_def_cfa_offset 32
+	popq	%r14
+	.cfi_def_cfa_offset 24
+	popq	%r15
+	.cfi_def_cfa_offset 16
+	popq	%rbp
+	.cfi_def_cfa_offset 8
+	retq
+.Lfunc_end8:
+	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+                                        # -- End function
+	.type	funcGlobalBarMul, at object        # @funcGlobalBarMul
+	.data
+	.globl	funcGlobalBarMul
+	.p2align	3, 0x0
+funcGlobalBarMul:
+	.quad	_Z6barMulii
+	.size	funcGlobalBarMul, 8
+
+	.ident	"clang version 20.0.0git"
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.addrsig_sym _Z6fooMulii
+	.addrsig_sym _Z6barMulii
+	.addrsig_sym _Z6barAddii
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO0.s b/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO0.s
new file mode 100644
index 00000000000000..56036d1b14e2b9
--- /dev/null
+++ b/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO0.s
@@ -0,0 +1,359 @@
+
+# clang++ -c main.cpp -o main.o
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# int fooSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int barSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int helper1(int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# int helper2(int (*func)(int, int), int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# int main(int argc, char **argv) {
+#   static int (*funcGlobalBarAdd)(int, int) = barAdd;
+#   int (*funcGlobalBarMul)(int, int) = barMul;
+#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
+#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
+#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#   MY_PRINTF("val: %d", temp);
+#   return temp;
+# }
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.p2align	4, 0x90
+	.type	_Z6fooSubii, at function
+_Z6fooSubii:                            # @_Z6fooSubii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	subl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end0:
+	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+	.p2align	4, 0x90
+	.type	_Z6barSubii, at function
+_Z6barSubii:                            # @_Z6barSubii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	subl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end1:
+	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	imull	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end2:
+	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	imull	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end3:
+	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end4:
+	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end5:
+	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFiiiEii, at function
+_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$32, %rsp
+	movq	%rdi, -16(%rbp)
+	movl	%esi, -20(%rbp)
+	movl	%edx, -24(%rbp)
+	leaq	_Z6barAddii(%rip), %rax
+	cmpq	%rax, -16(%rbp)
+	jne	.LBB6_2
+# %bb.1:
+	movl	$1, -4(%rbp)
+	jmp	.LBB6_3
+.LBB6_2:
+	movq	-16(%rbp), %rax
+	movl	-20(%rbp), %edi
+	movl	-24(%rbp), %esi
+	callq	*%rax
+	subl	$4, %eax
+	movl	%eax, -4(%rbp)
+.LBB6_3:
+	movl	-4(%rbp), %eax
+	addq	$32, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end6:
+	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFiiiES0_ii, at function
+_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$48, %rsp
+	movq	%rdi, -16(%rbp)
+	movq	%rsi, -24(%rbp)
+	movl	%edx, -28(%rbp)
+	movl	%ecx, -32(%rbp)
+	movq	-16(%rbp), %rax
+	cmpq	-24(%rbp), %rax
+	jne	.LBB7_2
+# %bb.1:
+	movl	$2, -4(%rbp)
+	jmp	.LBB7_3
+.LBB7_2:
+	movq	-16(%rbp), %rax
+	movl	-28(%rbp), %edi
+	movl	-32(%rbp), %esi
+	callq	*%rax
+	movl	%eax, -36(%rbp)                 # 4-byte Spill
+	movq	-24(%rbp), %rax
+	movl	-28(%rbp), %edi
+	movl	-32(%rbp), %esi
+	callq	*%rax
+	movl	%eax, %ecx
+	movl	-36(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -4(%rbp)
+.LBB7_3:
+	movl	-4(%rbp), %eax
+	addq	$48, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end7:
+	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$48, %rsp
+	movl	$0, -4(%rbp)
+	movl	%edi, -8(%rbp)
+	movq	%rsi, -16(%rbp)
+	leaq	_Z6barMulii(%rip), %rax
+	movq	%rax, -24(%rbp)
+	movq	_ZZ4mainE16funcGlobalBarAdd(%rip), %rdi
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edx
+	callq	_Z7helper1PFiiiEii
+	movl	%eax, -44(%rbp)                 # 4-byte Spill
+	movq	-24(%rbp), %rsi
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edx
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %ecx
+	leaq	_Z6fooMulii(%rip), %rdi
+	callq	_Z7helper2PFiiiES0_ii
+	movl	%eax, %ecx
+	movl	-44(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -40(%rbp)                 # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	callq	_Z6fooSubii
+	movl	%eax, %ecx
+	movl	-40(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -36(%rbp)                 # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	callq	_Z6barSubii
+	movl	%eax, %ecx
+	movl	-36(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -32(%rbp)                 # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	callq	_Z6fooAddii
+	movl	%eax, %ecx
+	movl	-32(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -28(%rbp)
+	movl	-28(%rbp), %eax
+	addq	$48, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end8:
+	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+                                        # -- End function
+	.type	_ZZ4mainE16funcGlobalBarAdd, at object # @_ZZ4mainE16funcGlobalBarAdd
+	.data
+	.p2align	3, 0x0
+_ZZ4mainE16funcGlobalBarAdd:
+	.quad	_Z6barAddii
+	.size	_ZZ4mainE16funcGlobalBarAdd, 8
+
+	.ident	"clang version 20.0.0git"
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.addrsig_sym _Z6fooSubii
+	.addrsig_sym _Z6barSubii
+	.addrsig_sym _Z6fooMulii
+	.addrsig_sym _Z6barMulii
+	.addrsig_sym _Z6fooAddii
+	.addrsig_sym _Z6barAddii
+	.addrsig_sym _Z7helper1PFiiiEii
+	.addrsig_sym _Z7helper2PFiiiES0_ii
+	.addrsig_sym _ZZ4mainE16funcGlobalBarAdd
+	.addrsig_sym FooVar
+	.addrsig_sym BarVar
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO3.s b/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO3.s
new file mode 100644
index 00000000000000..aedad906912654
--- /dev/null
+++ b/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO3.s
@@ -0,0 +1,286 @@
+# clang++ -O3 -c main.cpp -o main.o
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# int fooSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int barSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int helper1(int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# int helper2(int (*func)(int, int), int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# int main(int argc, char **argv) {
+#   static int (*funcGlobalBarAdd)(int, int) = barAdd;
+#   int (*funcGlobalBarMul)(int, int) = barMul;
+#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
+#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
+#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#   MY_PRINTF("val: %d", temp);
+#   return temp;
+# }
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.p2align	4, 0x90
+	.type	_Z6fooSubii, at function
+_Z6fooSubii:                            # @_Z6fooSubii
+	.cfi_startproc
+# %bb.0:
+	movl	%edi, %eax
+	subl	%esi, %eax
+	retq
+.Lfunc_end0:
+	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+	.p2align	4, 0x90
+	.type	_Z6barSubii, at function
+_Z6barSubii:                            # @_Z6barSubii
+	.cfi_startproc
+# %bb.0:
+	movl	%edi, %eax
+	subl	%esi, %eax
+	retq
+.Lfunc_end1:
+	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+# %bb.0:
+	movl	%edi, %eax
+	imull	%esi, %eax
+	retq
+.Lfunc_end2:
+	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+# %bb.0:
+	movl	%edi, %eax
+	imull	%esi, %eax
+	retq
+.Lfunc_end3:
+	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+# %bb.0:
+                                        # kill: def $esi killed $esi def $rsi
+                                        # kill: def $edi killed $edi def $rdi
+	leal	(%rdi,%rsi), %eax
+	retq
+.Lfunc_end4:
+	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+# %bb.0:
+                                        # kill: def $esi killed $esi def $rsi
+                                        # kill: def $edi killed $edi def $rdi
+	leal	(%rdi,%rsi), %eax
+	retq
+.Lfunc_end5:
+	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFiiiEii, at function
+_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.cfi_startproc
+# %bb.0:
+	leaq	_Z6barAddii(%rip), %rcx
+	cmpq	%rcx, %rdi
+	je	.LBB6_1
+# %bb.2:
+	pushq	%rax
+	.cfi_def_cfa_offset 16
+	movq	%rdi, %rax
+	movl	%esi, %edi
+	movl	%edx, %esi
+	callq	*%rax
+	addl	$-4, %eax
+	addq	$8, %rsp
+	.cfi_def_cfa_offset 8
+	retq
+.LBB6_1:
+	movl	$1, %eax
+	retq
+.Lfunc_end6:
+	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFiiiES0_ii, at function
+_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.cfi_startproc
+# %bb.0:
+	cmpq	%rsi, %rdi
+	je	.LBB7_1
+# %bb.2:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	pushq	%r15
+	.cfi_def_cfa_offset 24
+	pushq	%r14
+	.cfi_def_cfa_offset 32
+	pushq	%rbx
+	.cfi_def_cfa_offset 40
+	pushq	%rax
+	.cfi_def_cfa_offset 48
+	.cfi_offset %rbx, -40
+	.cfi_offset %r14, -32
+	.cfi_offset %r15, -24
+	.cfi_offset %rbp, -16
+	movl	%ecx, %ebx
+	movl	%edx, %ebp
+	movq	%rsi, %r14
+	movq	%rdi, %rax
+	movl	%edx, %edi
+	movl	%ecx, %esi
+	callq	*%rax
+	movl	%eax, %r15d
+	movl	%ebp, %edi
+	movl	%ebx, %esi
+	callq	*%r14
+	addl	%r15d, %eax
+	addq	$8, %rsp
+	.cfi_def_cfa_offset 40
+	popq	%rbx
+	.cfi_def_cfa_offset 32
+	popq	%r14
+	.cfi_def_cfa_offset 24
+	popq	%r15
+	.cfi_def_cfa_offset 16
+	popq	%rbp
+	.cfi_def_cfa_offset 8
+	.cfi_restore %rbx
+	.cfi_restore %r14
+	.cfi_restore %r15
+	.cfi_restore %rbp
+	retq
+.LBB7_1:
+	movl	$2, %eax
+	retq
+.Lfunc_end7:
+	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	pushq	%r15
+	.cfi_def_cfa_offset 24
+	pushq	%r14
+	.cfi_def_cfa_offset 32
+	pushq	%r12
+	.cfi_def_cfa_offset 40
+	pushq	%rbx
+	.cfi_def_cfa_offset 48
+	.cfi_offset %rbx, -48
+	.cfi_offset %r12, -40
+	.cfi_offset %r14, -32
+	.cfi_offset %r15, -24
+	.cfi_offset %rbp, -16
+	movq	FooVar at GOTPCREL(%rip), %r14
+	movl	(%r14), %esi
+	movq	BarVar at GOTPCREL(%rip), %r15
+	movl	(%r15), %edx
+	leaq	_Z6barAddii(%rip), %rdi
+	callq	_Z7helper1PFiiiEii
+	movl	%eax, %ebx
+	movl	(%r14), %edx
+	movl	(%r15), %ecx
+	leaq	_Z6fooMulii(%rip), %rdi
+	leaq	_Z6barMulii(%rip), %rsi
+	callq	_Z7helper2PFiiiES0_ii
+	movl	%eax, %ebp
+	addl	%ebx, %ebp
+	movl	(%r14), %ebx
+	movl	(%r15), %r14d
+	movl	%ebx, %edi
+	movl	%r14d, %esi
+	callq	_Z6fooSubii
+	movl	%eax, %r15d
+	movl	%ebx, %edi
+	movl	%r14d, %esi
+	callq	_Z6barSubii
+	movl	%eax, %r12d
+	addl	%r15d, %r12d
+	addl	%ebp, %r12d
+	movl	%ebx, %edi
+	movl	%r14d, %esi
+	callq	_Z6fooAddii
+	addl	%r12d, %eax
+	popq	%rbx
+	.cfi_def_cfa_offset 40
+	popq	%r12
+	.cfi_def_cfa_offset 32
+	popq	%r14
+	.cfi_def_cfa_offset 24
+	popq	%r15
+	.cfi_def_cfa_offset 16
+	popq	%rbp
+	.cfi_def_cfa_offset 8
+	retq
+.Lfunc_end8:
+	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+                                        # -- End function
+	.ident	"clang version 20.0.0git"
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.addrsig_sym _Z6fooMulii
+	.addrsig_sym _Z6barMulii
+	.addrsig_sym _Z6barAddii
diff --git a/bolt/test/X86/icf-safe-icp.test b/bolt/test/X86/icf-safe-icp.test
new file mode 100644
index 00000000000000..efeaf469eedeea
--- /dev/null
+++ b/bolt/test/X86/icf-safe-icp.test
@@ -0,0 +1,20 @@
+## Check that BOLT handles correctly folding functions with --icf-safe that can be referenced.
+# The compare is generated by the ICP path with instrumentation profiling.
+
+# REQUIRES: system-linux
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFICPTest.s    -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICFICPTest.s  -o %t2.o
+# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
+# RUN: llvm-bolt --no-threads %t.exe --icf      -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --safe-icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+
+## Check that BOLT successfully folded a function with jump table:
+# ICFCHECK:      ICF iteration 1
+# ICFCHECK-NEXT: folding _ZN8Derived3D0Ev into _ZN8Derived2D0Ev
+# ICFCHECK-NEXT: folding _ZNK8Derived34funcEii into _ZNK8Derived24funcEii
+
+# SAFEICFCHECK:      skipping function _ZNK8Derived24funcEii
+# SAFEICFCHECK-NEXT: skipping function _ZNK8Derived34funcEii
+# SAFEICFCHECK-NEXT: ICF iteration 1
+# SAFEICFCHECK-NEXT: folding _ZN8Derived3D0Ev into _ZN8Derived2D0Ev
+# SAFEICFCHECK-NEXT: ===---------
diff --git a/bolt/test/X86/icf-safe-test1-no-cfg.test b/bolt/test/X86/icf-safe-test1-no-cfg.test
new file mode 100644
index 00000000000000..37c5debe8c814b
--- /dev/null
+++ b/bolt/test/X86/icf-safe-test1-no-cfg.test
@@ -0,0 +1,21 @@
+## Check that BOLT handles correctly folding functions with --icf-safe that can be referenced.
+
+# REQUIRES: system-linux
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest1.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
+# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
+# RUN: llvm-bolt --no-threads %t.exe --icf      -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --safe-icf -debug -debug-only=bolt-icf --skip-funcs=_Z7helper1PFiiiEii,main -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+
+## Check that BOLT successfully folded a function with jump table:
+# ICFCHECK:      ICF iteration 1
+# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
+# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
+# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+
+# SAFEICFCHECK:      skipping function _Z6barAddii
+# SAFEICFCHECK-NEXT: skipping function _Z6barMulii
+# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: ICF iteration 1
+# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# SAFEICFCHECK-NEXT: ===---------
diff --git a/bolt/test/X86/icf-safe-test1-no-relocs.test b/bolt/test/X86/icf-safe-test1-no-relocs.test
new file mode 100644
index 00000000000000..3b5d7400d85115
--- /dev/null
+++ b/bolt/test/X86/icf-safe-test1-no-relocs.test
@@ -0,0 +1,16 @@
+## Checks that BOLT handles correctly with no relocations with --safe-icf option.
+
+# REQUIRES: system-linux
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest1.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
+# RUN: %clang %cflags %t1.o %t2.o -o %t.exe
+# RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
+# RUN: not llvm-bolt --no-threads %t.exe --safe-icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+
+## Check that BOLT successfully folded a function with jump table:
+# ICFCHECK:      ICF iteration 1
+# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
+# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
+# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+
+# SAFEICFCHECK: BOLT-ERROR: Binary built without relocations. Safe ICF is not supported
diff --git a/bolt/test/X86/icf-safe-test1.test b/bolt/test/X86/icf-safe-test1.test
new file mode 100644
index 00000000000000..2b41633d07bf93
--- /dev/null
+++ b/bolt/test/X86/icf-safe-test1.test
@@ -0,0 +1,21 @@
+## Check that BOLT handles correctly folding functions with --icf-safe that can be referenced.
+
+# REQUIRES: system-linux
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest1.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
+# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
+# RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --safe-icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+
+## Check that BOLT successfully folded a function with jump table:
+# ICFCHECK:      ICF iteration 1
+# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
+# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
+# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+
+# SAFEICFCHECK:      skipping function _Z6barAddii
+# SAFEICFCHECK-NEXT: skipping function _Z6barMulii
+# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: ICF iteration 1
+# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# SAFEICFCHECK-NEXT: ===---------
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO0.test b/bolt/test/X86/icf-safe-test2GlobalVarO0.test
new file mode 100644
index 00000000000000..904d792e225b9c
--- /dev/null
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO0.test
@@ -0,0 +1,21 @@
+## Check that BOLT handles correctly folding functions with --icf-safe that can be referenced.
+
+# REQUIRES: system-linux
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest2GlobalVarO0.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
+# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
+# RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --safe-icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+
+## Check that BOLT successfully folded a function with jump table:
+# ICFCHECK:      ICF iteration 1
+# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
+# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
+# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+
+# SAFEICFCHECK:      skipping function _Z6barAddii
+# SAFEICFCHECK-NEXT: skipping function _Z6barMulii
+# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: ICF iteration 1
+# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# SAFEICFCHECK-NEXT: ===---------
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO3.test b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
new file mode 100644
index 00000000000000..288faf252ad745
--- /dev/null
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
@@ -0,0 +1,21 @@
+## Check that BOLT handles correctly folding functions with --icf-safe that can be referenced.
+
+# REQUIRES: system-linux
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest2GlobalVarO3.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
+# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
+# RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --safe-icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+
+## Check that BOLT successfully folded a function with jump table:
+# ICFCHECK:      ICF iteration 1
+# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
+# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
+# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+
+# SAFEICFCHECK:      skipping function _Z6barAddii
+# SAFEICFCHECK-NEXT: skipping function _Z6barMulii
+# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: ICF iteration 1
+# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# SAFEICFCHECK-NEXT: ===---------
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO0.test b/bolt/test/X86/icf-safe-test3LocalVarO0.test
new file mode 100644
index 00000000000000..56a329b2f7a598
--- /dev/null
+++ b/bolt/test/X86/icf-safe-test3LocalVarO0.test
@@ -0,0 +1,21 @@
+## Check that BOLT handles correctly folding functions with --icf-safe that can be referenced.
+
+# REQUIRES: system-linux
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest3LocalVarO0.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
+# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
+# RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --safe-icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+
+## Check that BOLT successfully folded a function with jump table:
+# ICFCHECK:      ICF iteration 1
+# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
+# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
+# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+
+# SAFEICFCHECK:      skipping function _Z6barAddii
+# SAFEICFCHECK-NEXT: skipping function _Z6barMulii
+# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: ICF iteration 1
+# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# SAFEICFCHECK-NEXT: ===---------
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO3.test b/bolt/test/X86/icf-safe-test3LocalVarO3.test
new file mode 100644
index 00000000000000..d0782e46b17e06
--- /dev/null
+++ b/bolt/test/X86/icf-safe-test3LocalVarO3.test
@@ -0,0 +1,21 @@
+## Check that BOLT handles correctly folding functions with --icf-safe that can be referenced.
+
+# REQUIRES: system-linux
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest3LocalVarO3.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
+# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
+# RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --safe-icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+
+## Check that BOLT successfully folded a function with jump table:
+# ICFCHECK:      ICF iteration 1
+# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
+# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
+# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+
+# SAFEICFCHECK:      skipping function _Z6barAddii
+# SAFEICFCHECK-NEXT: skipping function _Z6barMulii
+# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: ICF iteration 1
+# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# SAFEICFCHECK-NEXT: ===---------

>From 237c02e48825e2e42ec7cee62ef4a83ad0a8c4b1 Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Thu, 14 Nov 2024 17:38:10 -0800
Subject: [PATCH 02/18] Changed icf option

---
 bolt/include/bolt/Core/BinaryContext.h        | 11 ++++++++++
 .../bolt/Passes/IdenticalCodeFolding.h        |  6 ++----
 bolt/lib/Core/BinaryContext.cpp               | 21 ++++++++++++-------
 bolt/lib/Passes/IdenticalCodeFolding.cpp      |  2 +-
 bolt/lib/Rewrite/BinaryPassManager.cpp        | 12 ++++-------
 bolt/lib/Rewrite/BoltDiff.cpp                 |  4 ++--
 bolt/test/X86/icf-safe-icp.test               |  2 +-
 bolt/test/X86/icf-safe-test1-no-cfg.test      |  4 ++--
 bolt/test/X86/icf-safe-test1-no-relocs.test   |  4 ++--
 bolt/test/X86/icf-safe-test1.test             |  2 +-
 bolt/test/X86/icf-safe-test2GlobalVarO0.test  |  2 +-
 bolt/test/X86/icf-safe-test2GlobalVarO3.test  |  2 +-
 bolt/test/X86/icf-safe-test3LocalVarO0.test   |  2 +-
 bolt/test/X86/icf-safe-test3LocalVarO3.test   |  2 +-
 14 files changed, 44 insertions(+), 32 deletions(-)

diff --git a/bolt/include/bolt/Core/BinaryContext.h b/bolt/include/bolt/Core/BinaryContext.h
index 92889ffe162ae1..3e58ec502acd09 100644
--- a/bolt/include/bolt/Core/BinaryContext.h
+++ b/bolt/include/bolt/Core/BinaryContext.h
@@ -276,6 +276,12 @@ class BinaryContext {
   void deregisterSectionName(const BinarySection &Section);
 
 public:
+  enum class ICFLevel {
+    None,
+    Safe, // Safe ICF for all sections.
+    All,  // Aggressive ICF for code, but safe ICF for data, similar to MSVC's
+          // behavior.
+  };
   static Expected<std::unique_ptr<BinaryContext>>
   createBinaryContext(Triple TheTriple, StringRef InputFileName,
                       SubtargetFeatures *Features, bool IsPIC,
@@ -666,6 +672,9 @@ class BinaryContext {
 
   std::unique_ptr<MCAsmBackend> MAB;
 
+  /// ICF level to use for this binary.
+  ICFLevel ICFLevelVar{ICFLevel::None};
+
   /// Allows BOLT to print to log whenever it is necessary (with or without
   /// const references)
   mutable JournalingStreams Logger;
@@ -1485,6 +1494,8 @@ class BinaryContext {
     return *IOAddressMap;
   }
 
+  ICFLevel getICFLevel() const { return ICFLevelVar; }
+
   raw_ostream &outs() const { return Logger.Out; }
 
   raw_ostream &errs() const { return Logger.Err; }
diff --git a/bolt/include/bolt/Passes/IdenticalCodeFolding.h b/bolt/include/bolt/Passes/IdenticalCodeFolding.h
index 75d5f19ddfc7be..41fb17408d5876 100644
--- a/bolt/include/bolt/Passes/IdenticalCodeFolding.h
+++ b/bolt/include/bolt/Passes/IdenticalCodeFolding.h
@@ -31,8 +31,8 @@ class IdenticalCodeFolding : public BinaryFunctionPass {
   }
 
 public:
-  explicit IdenticalCodeFolding(const cl::opt<bool> &PrintPass, bool IsSafeICF)
-      : BinaryFunctionPass(PrintPass), IsSafeICF(IsSafeICF) {}
+  explicit IdenticalCodeFolding(const cl::opt<bool> &PrintPass)
+      : BinaryFunctionPass(PrintPass) {}
 
   const char *getName() const override { return "identical-code-folding"; }
   Error runOnFunctions(BinaryContext &BC) override;
@@ -44,8 +44,6 @@ class IdenticalCodeFolding : public BinaryFunctionPass {
   /// references.
   void processDataRelocations(BinaryContext &BC,
                               const SectionRef &SecRefRelData);
-
-  bool IsSafeICF;
 };
 
 } // namespace bolt
diff --git a/bolt/lib/Core/BinaryContext.cpp b/bolt/lib/Core/BinaryContext.cpp
index 31352bed6fdab7..6cf1562735eb45 100644
--- a/bolt/lib/Core/BinaryContext.cpp
+++ b/bolt/lib/Core/BinaryContext.cpp
@@ -76,12 +76,8 @@ cl::opt<std::string> CompDirOverride(
              "to *.dwo files."),
     cl::Hidden, cl::init(""), cl::cat(BoltCategory));
 
-cl::opt<bool> ICF("icf", cl::desc("fold functions with identical code"),
-                  cl::cat(BoltOptCategory));
-
-cl::opt<bool> SafeICF("safe-icf",
-                      cl::desc("Enable safe identical code folding"),
-                      cl::cat(BoltOptCategory));
+cl::opt<std::string> ICF("icf", cl::desc("fold functions with identical code"),
+                         cl::ValueOptional, cl::cat(BoltOptCategory));
 } // namespace opts
 
 namespace {
@@ -175,6 +171,16 @@ void BinaryContext::logBOLTErrorsAndQuitOnFatal(Error E) {
   });
 }
 
+static BinaryContext::ICFLevel parseICFLevel() {
+  if (!opts::ICF.getNumOccurrences())
+    return BinaryContext::ICFLevel::None;
+  std::string Str = StringRef(opts::ICF).lower();
+  return StringSwitch<BinaryContext::ICFLevel>(Str)
+      .Case("all", BinaryContext::ICFLevel::All)
+      .Case("safe", BinaryContext::ICFLevel::Safe)
+      .Default(BinaryContext::ICFLevel::All);
+}
+
 BinaryContext::BinaryContext(std::unique_ptr<MCContext> Ctx,
                              std::unique_ptr<DWARFContext> DwCtx,
                              std::unique_ptr<Triple> TheTriple,
@@ -199,6 +205,7 @@ BinaryContext::BinaryContext(std::unique_ptr<MCContext> Ctx,
       Logger(Logger), InitialDynoStats(isAArch64()) {
   RegularPageSize = isAArch64() ? RegularPageSizeAArch64 : RegularPageSizeX86;
   PageAlign = opts::NoHugePages ? RegularPageSize : HugePageSize;
+  ICFLevelVar = parseICFLevel();
 }
 
 BinaryContext::~BinaryContext() {
@@ -2017,7 +2024,7 @@ static bool skipInstruction(const MCInst &Inst, const BinaryContext &BC) {
           BC.MIB->isCall(Inst) || BC.MIB->isBranch(Inst));
 }
 void BinaryContext::processInstructionForFuncReferences(const MCInst &Inst) {
-  if (!opts::SafeICF || skipInstruction(Inst, *this))
+  if (ICFLevelVar != ICFLevel::Safe || skipInstruction(Inst, *this))
     return;
   for (const MCOperand &Op : MCPlus::primeOperands(Inst)) {
     if (Op.isExpr()) {
diff --git a/bolt/lib/Passes/IdenticalCodeFolding.cpp b/bolt/lib/Passes/IdenticalCodeFolding.cpp
index f09482dc08c212..6e00ccda338556 100644
--- a/bolt/lib/Passes/IdenticalCodeFolding.cpp
+++ b/bolt/lib/Passes/IdenticalCodeFolding.cpp
@@ -550,7 +550,7 @@ Error IdenticalCodeFolding::runOnFunctions(BinaryContext &BC) {
 
     LLVM_DEBUG(SinglePass.stopTimer());
   };
-  if (IsSafeICF) {
+  if (BC.getICFLevel() == BinaryContext::ICFLevel::Safe) {
     if (Error Err = createFoldSkipList(BC)) {
       return Err;
     }
diff --git a/bolt/lib/Rewrite/BinaryPassManager.cpp b/bolt/lib/Rewrite/BinaryPassManager.cpp
index df612c0a8f2e51..e5fb1f5b257850 100644
--- a/bolt/lib/Rewrite/BinaryPassManager.cpp
+++ b/bolt/lib/Rewrite/BinaryPassManager.cpp
@@ -54,8 +54,6 @@ extern cl::opt<bool> PrintDynoStats;
 extern cl::opt<bool> DumpDotAll;
 extern cl::opt<std::string> AsmDump;
 extern cl::opt<bolt::PLTCall::OptType> PLT;
-extern cl::opt<bool> ICF;
-extern cl::opt<bool> SafeICF;
 
 static cl::opt<bool>
 DynoStatsAll("dyno-stats-all",
@@ -396,9 +394,8 @@ Error BinaryFunctionPassManager::runAllPasses(BinaryContext &BC) {
     Manager.registerPass(std::make_unique<StripRepRet>(NeverPrint),
                          opts::StripRepRet);
 
-  Manager.registerPass(
-      std::make_unique<IdenticalCodeFolding>(PrintICF, opts::SafeICF),
-      opts::ICF || opts::SafeICF);
+  Manager.registerPass(std::make_unique<IdenticalCodeFolding>(PrintICF),
+                       BC.getICFLevel() != BinaryContext::ICFLevel::None);
 
   Manager.registerPass(
       std::make_unique<SpecializeMemcpy1>(NeverPrint, opts::SpecializeMemcpy1),
@@ -422,9 +419,8 @@ Error BinaryFunctionPassManager::runAllPasses(BinaryContext &BC) {
 
   Manager.registerPass(std::make_unique<Inliner>(PrintInline));
 
-  Manager.registerPass(
-      std::make_unique<IdenticalCodeFolding>(PrintICF, opts::SafeICF),
-      opts::ICF || opts::SafeICF);
+  Manager.registerPass(std::make_unique<IdenticalCodeFolding>(PrintICF),
+                       BC.getICFLevel() != BinaryContext::ICFLevel::None);
 
   Manager.registerPass(std::make_unique<PLTCall>(PrintPLT));
 
diff --git a/bolt/lib/Rewrite/BoltDiff.cpp b/bolt/lib/Rewrite/BoltDiff.cpp
index 1a8eb5cd2ce39d..5d3021ea845e7e 100644
--- a/bolt/lib/Rewrite/BoltDiff.cpp
+++ b/bolt/lib/Rewrite/BoltDiff.cpp
@@ -698,8 +698,8 @@ void RewriteInstance::compare(RewriteInstance &RI2) {
   }
 
   // Pre-pass ICF
-  if (opts::ICF) {
-    IdenticalCodeFolding ICF(opts::NeverPrint, opts::SafeICF);
+  if (BC->getICFLevel() != BinaryContext::ICFLevel::None) {
+    IdenticalCodeFolding ICF(opts::NeverPrint);
     outs() << "BOLT-DIFF: Starting ICF pass for binary 1";
     BC->logBOLTErrorsAndQuitOnFatal(ICF.runOnFunctions(*BC));
     outs() << "BOLT-DIFF: Starting ICF pass for binary 2";
diff --git a/bolt/test/X86/icf-safe-icp.test b/bolt/test/X86/icf-safe-icp.test
index efeaf469eedeea..7b46c6297a40ec 100644
--- a/bolt/test/X86/icf-safe-icp.test
+++ b/bolt/test/X86/icf-safe-icp.test
@@ -6,7 +6,7 @@
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICFICPTest.s  -o %t2.o
 # RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf      -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
-# RUN: llvm-bolt --no-threads %t.exe --safe-icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 ## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
diff --git a/bolt/test/X86/icf-safe-test1-no-cfg.test b/bolt/test/X86/icf-safe-test1-no-cfg.test
index 37c5debe8c814b..5efbff9b3f3f76 100644
--- a/bolt/test/X86/icf-safe-test1-no-cfg.test
+++ b/bolt/test/X86/icf-safe-test1-no-cfg.test
@@ -4,8 +4,8 @@
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest1.s -o %t1.o
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
 # RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
-# RUN: llvm-bolt --no-threads %t.exe --icf      -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
-# RUN: llvm-bolt --no-threads %t.exe --safe-icf -debug -debug-only=bolt-icf --skip-funcs=_Z7helper1PFiiiEii,main -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --icf=all      -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf --skip-funcs=_Z7helper1PFiiiEii,main -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 ## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
diff --git a/bolt/test/X86/icf-safe-test1-no-relocs.test b/bolt/test/X86/icf-safe-test1-no-relocs.test
index 3b5d7400d85115..c80d35a5f576ff 100644
--- a/bolt/test/X86/icf-safe-test1-no-relocs.test
+++ b/bolt/test/X86/icf-safe-test1-no-relocs.test
@@ -1,11 +1,11 @@
-## Checks that BOLT handles correctly with no relocations with --safe-icf option.
+## Checks that BOLT handles correctly with no relocations with --icf=safe option.
 
 # REQUIRES: system-linux
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest1.s -o %t1.o
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
 # RUN: %clang %cflags %t1.o %t2.o -o %t.exe
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
-# RUN: not llvm-bolt --no-threads %t.exe --safe-icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+# RUN: not llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 ## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
diff --git a/bolt/test/X86/icf-safe-test1.test b/bolt/test/X86/icf-safe-test1.test
index 2b41633d07bf93..96986dec1e1922 100644
--- a/bolt/test/X86/icf-safe-test1.test
+++ b/bolt/test/X86/icf-safe-test1.test
@@ -5,7 +5,7 @@
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
 # RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
-# RUN: llvm-bolt --no-threads %t.exe --safe-icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 ## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO0.test b/bolt/test/X86/icf-safe-test2GlobalVarO0.test
index 904d792e225b9c..9464dc05782ee5 100644
--- a/bolt/test/X86/icf-safe-test2GlobalVarO0.test
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO0.test
@@ -5,7 +5,7 @@
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
 # RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
-# RUN: llvm-bolt --no-threads %t.exe --safe-icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 ## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO3.test b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
index 288faf252ad745..935a5ddb189ef7 100644
--- a/bolt/test/X86/icf-safe-test2GlobalVarO3.test
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
@@ -5,7 +5,7 @@
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
 # RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
-# RUN: llvm-bolt --no-threads %t.exe --safe-icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 ## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO0.test b/bolt/test/X86/icf-safe-test3LocalVarO0.test
index 56a329b2f7a598..9fb783539da39f 100644
--- a/bolt/test/X86/icf-safe-test3LocalVarO0.test
+++ b/bolt/test/X86/icf-safe-test3LocalVarO0.test
@@ -5,7 +5,7 @@
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
 # RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
-# RUN: llvm-bolt --no-threads %t.exe --safe-icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 ## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO3.test b/bolt/test/X86/icf-safe-test3LocalVarO3.test
index d0782e46b17e06..55fa11ada15490 100644
--- a/bolt/test/X86/icf-safe-test3LocalVarO3.test
+++ b/bolt/test/X86/icf-safe-test3LocalVarO3.test
@@ -5,7 +5,7 @@
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
 # RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
-# RUN: llvm-bolt --no-threads %t.exe --safe-icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 ## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1

>From d794fb02ad8312892a4d935a77ac03e4cdf98522 Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Fri, 15 Nov 2024 14:29:54 -0800
Subject: [PATCH 03/18] addressed comments

---
 bolt/include/bolt/Core/BinaryContext.h         |  9 ++++-----
 bolt/include/bolt/Core/BinaryFunction.h        |  2 +-
 .../include/bolt/Passes/IdenticalCodeFolding.h |  5 +++--
 bolt/lib/Core/BinaryContext.cpp                | 18 +++++++++---------
 bolt/lib/Passes/IdenticalCodeFolding.cpp       |  8 ++++----
 5 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/bolt/include/bolt/Core/BinaryContext.h b/bolt/include/bolt/Core/BinaryContext.h
index 3e58ec502acd09..318535b2fac239 100644
--- a/bolt/include/bolt/Core/BinaryContext.h
+++ b/bolt/include/bolt/Core/BinaryContext.h
@@ -278,9 +278,8 @@ class BinaryContext {
 public:
   enum class ICFLevel {
     None,
-    Safe, // Safe ICF for all sections.
-    All,  // Aggressive ICF for code, but safe ICF for data, similar to MSVC's
-          // behavior.
+    Safe,
+    All,
   };
   static Expected<std::unique_ptr<BinaryContext>>
   createBinaryContext(Triple TheTriple, StringRef InputFileName,
@@ -673,7 +672,7 @@ class BinaryContext {
   std::unique_ptr<MCAsmBackend> MAB;
 
   /// ICF level to use for this binary.
-  ICFLevel ICFLevelVar{ICFLevel::None};
+  ICFLevel CurrICFLevel{ICFLevel::None};
 
   /// Allows BOLT to print to log whenever it is necessary (with or without
   /// const references)
@@ -1494,7 +1493,7 @@ class BinaryContext {
     return *IOAddressMap;
   }
 
-  ICFLevel getICFLevel() const { return ICFLevelVar; }
+  ICFLevel getICFLevel() const { return CurrICFLevel; }
 
   raw_ostream &outs() const { return Logger.Out; }
 
diff --git a/bolt/include/bolt/Core/BinaryFunction.h b/bolt/include/bolt/Core/BinaryFunction.h
index 5e1ddcc6bff9a2..f05ea40cfb1334 100644
--- a/bolt/include/bolt/Core/BinaryFunction.h
+++ b/bolt/include/bolt/Core/BinaryFunction.h
@@ -824,7 +824,7 @@ class BinaryFunction {
   bool isSafeToICF() const { return IsSafeToICF; }
 
   /// Sets the function is not safe to fold.
-  void setUnsetToICF() { IsSafeToICF = false; }
+  void setUnsafeICF() { IsSafeToICF = false; }
 
   /// Returns the raw binary encoding of this function.
   ErrorOr<ArrayRef<uint8_t>> getData() const;
diff --git a/bolt/include/bolt/Passes/IdenticalCodeFolding.h b/bolt/include/bolt/Passes/IdenticalCodeFolding.h
index 41fb17408d5876..eb803031bf0f0e 100644
--- a/bolt/include/bolt/Passes/IdenticalCodeFolding.h
+++ b/bolt/include/bolt/Passes/IdenticalCodeFolding.h
@@ -38,8 +38,9 @@ class IdenticalCodeFolding : public BinaryFunctionPass {
   Error runOnFunctions(BinaryContext &BC) override;
 
 private:
-  /// Create a skip list of functions that should not be folded.
-  Error createFoldSkipList(BinaryContext &BC);
+  /// Analyses .text section and relocations and marks functions that are not
+  /// safe to fold.
+  Error markFunctionsUnsafeToFold(BinaryContext &BC);
   /// Processes relocations in the .data section to identify function
   /// references.
   void processDataRelocations(BinaryContext &BC,
diff --git a/bolt/lib/Core/BinaryContext.cpp b/bolt/lib/Core/BinaryContext.cpp
index 6cf1562735eb45..960849371660b2 100644
--- a/bolt/lib/Core/BinaryContext.cpp
+++ b/bolt/lib/Core/BinaryContext.cpp
@@ -205,7 +205,7 @@ BinaryContext::BinaryContext(std::unique_ptr<MCContext> Ctx,
       Logger(Logger), InitialDynoStats(isAArch64()) {
   RegularPageSize = isAArch64() ? RegularPageSizeAArch64 : RegularPageSizeX86;
   PageAlign = opts::NoHugePages ? RegularPageSize : HugePageSize;
-  ICFLevelVar = parseICFLevel();
+  CurrICFLevel = parseICFLevel();
 }
 
 BinaryContext::~BinaryContext() {
@@ -2024,16 +2024,16 @@ static bool skipInstruction(const MCInst &Inst, const BinaryContext &BC) {
           BC.MIB->isCall(Inst) || BC.MIB->isBranch(Inst));
 }
 void BinaryContext::processInstructionForFuncReferences(const MCInst &Inst) {
-  if (ICFLevelVar != ICFLevel::Safe || skipInstruction(Inst, *this))
+  if (CurrICFLevel != ICFLevel::Safe || skipInstruction(Inst, *this))
     return;
   for (const MCOperand &Op : MCPlus::primeOperands(Inst)) {
-    if (Op.isExpr()) {
-      const MCExpr &Expr = *Op.getExpr();
-      if (Expr.getKind() == MCExpr::SymbolRef) {
-        const MCSymbol &Symbol = cast<MCSymbolRefExpr>(Expr).getSymbol();
-        if (BinaryFunction *BF = getFunctionForSymbol(&Symbol))
-          BF->setUnsetToICF();
-      }
+    if (!Op.isExpr())
+      continue;
+    const MCExpr &Expr = *Op.getExpr();
+    if (Expr.getKind() == MCExpr::SymbolRef) {
+      const MCSymbol &Symbol = cast<MCSymbolRefExpr>(Expr).getSymbol();
+      if (BinaryFunction *BF = getFunctionForSymbol(&Symbol))
+        BF->setUnsafeICF();
     }
   }
 }
diff --git a/bolt/lib/Passes/IdenticalCodeFolding.cpp b/bolt/lib/Passes/IdenticalCodeFolding.cpp
index 6e00ccda338556..8fb22897a44f62 100644
--- a/bolt/lib/Passes/IdenticalCodeFolding.cpp
+++ b/bolt/lib/Passes/IdenticalCodeFolding.cpp
@@ -355,16 +355,16 @@ void IdenticalCodeFolding::processDataRelocations(
     const uint64_t SymbolAddress = cantFail(Symbol.getAddress());
     const ELFObjectFileBase *ELFObj = dyn_cast<ELFObjectFileBase>(OwningObj);
     if (!ELFObj)
-      assert(false && "Only ELFObjectFileBase is supported");
+      llvm_unreachable("Only ELFObjectFileBase is supported");
     const int64_t Addend = BinaryContext::getRelocationAddend(ELFObj, Rel);
     BinaryFunction *BF = BC.getBinaryFunctionAtAddress(SymbolAddress + Addend);
     if (!BF)
       continue;
-    BF->setUnsetToICF();
+    BF->setUnsafeICF();
   }
 }
 
-Error IdenticalCodeFolding::createFoldSkipList(BinaryContext &BC) {
+Error IdenticalCodeFolding::markFunctionsUnsafeToFold(BinaryContext &BC) {
   Error ErrorStatus = Error::success();
   ErrorOr<BinarySection &> SecRelData = BC.getUniqueSectionByName(".rela.data");
   if (!BC.HasRelocations)
@@ -551,7 +551,7 @@ Error IdenticalCodeFolding::runOnFunctions(BinaryContext &BC) {
     LLVM_DEBUG(SinglePass.stopTimer());
   };
   if (BC.getICFLevel() == BinaryContext::ICFLevel::Safe) {
-    if (Error Err = createFoldSkipList(BC)) {
+    if (Error Err = markFunctionsUnsafeToFold(BC)) {
       return Err;
     }
   }

>From 6e853ca31324fdc32a172fb9c48d550ceab3547c Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Fri, 15 Nov 2024 16:41:00 -0800
Subject: [PATCH 04/18] Added four tests for pic/no-pic mode. Tests for global
 const function pointer

---
 .../Inputs/helperSafeICFGlobalConstPtrNoPic.s |  83 ++++
 ...lperSafeICFGlobalConstPtrNoPicExtFuncRef.s |  84 ++++
 .../Inputs/helperSafeICFGlobalConstPtrPic.s   |  84 ++++
 ...helperSafeICFGlobalConstPtrPicExtFuncRef.s |  84 ++++
 .../Inputs/mainSafeICFGlobalConstPtrNoPic.s   | 339 ++++++++++++++++
 ...mainSafeICFGlobalConstPtrNoPicExtFuncRef.s | 343 +++++++++++++++++
 .../X86/Inputs/mainSafeICFGlobalConstPtrPic.s | 350 +++++++++++++++++
 .../mainSafeICFGlobalConstPtrPicExtFuncRef.s  | 364 ++++++++++++++++++
 .../icf-safe-test2GlobalConstPtrNoPic.test    |  24 ++
 ...fe-test2GlobalConstPtrNoPicExtFuncRef.test |  24 ++
 .../X86/icf-safe-test2GlobalConstPtrPic.test  |  24 ++
 ...safe-test2GlobalConstPtrPicExtFuncRef.test |  24 ++
 12 files changed, 1827 insertions(+)
 create mode 100644 bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPic.s
 create mode 100644 bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPicExtFuncRef.s
 create mode 100644 bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPic.s
 create mode 100644 bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPicExtFuncRef.s
 create mode 100644 bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s
 create mode 100644 bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s
 create mode 100644 bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s
 create mode 100644 bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s
 create mode 100644 bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
 create mode 100644 bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
 create mode 100644 bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
 create mode 100644 bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test

diff --git a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPic.s b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPic.s
new file mode 100644
index 00000000000000..8697f77862e66f
--- /dev/null
+++ b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPic.s
@@ -0,0 +1,83 @@
+# clang++ helper.cpp -c -o
+# #define MY_CONST const
+# int FooVar = 1;
+# int BarVar = 2;
+# [[clang::noinline]]
+# MY_CONST int barAddHdlper(int a, int b) {
+#   return a + b;
+# }
+#
+# MY_CONST int (*const funcGlobalBarMulExt)(int, int) = barAddHdlper;
+# MY_CONST int fooGlobalFuncHelper(int a, int b) {
+#   return 5 + funcGlobalBarMulExt(a, b);
+# }
+
+	.text
+	.file	"helper.cpp"
+	.globl	_Z12barAddHdlperii              # -- Begin function _Z12barAddHdlperii
+	.p2align	4, 0x90
+	.type	_Z12barAddHdlperii, at function
+_Z12barAddHdlperii:                     # @_Z12barAddHdlperii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end0:
+	.size	_Z12barAddHdlperii, .Lfunc_end0-_Z12barAddHdlperii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.p2align	4, 0x90
+	.type	_Z19fooGlobalFuncHelperii, at function
+_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$16, %rsp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %edi
+	movl	-8(%rbp), %esi
+	callq	_Z12barAddHdlperii
+	addl	$5, %eax
+	addq	$16, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end1:
+	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end1-_Z19fooGlobalFuncHelperii
+	.cfi_endproc
+                                        # -- End function
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
+
+	.ident	"clang version 20.0.0git"
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.addrsig_sym _Z12barAddHdlperii
diff --git a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPicExtFuncRef.s b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPicExtFuncRef.s
new file mode 100644
index 00000000000000..489400c3ccaa63
--- /dev/null
+++ b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPicExtFuncRef.s
@@ -0,0 +1,84 @@
+# clang++ helper.cpp -c -o
+# #define MY_CONST const
+# int FooVar = 1;
+# int BarVar = 2;
+# [[clang::noinline]]
+# MY_CONST int barAddHdlper(int a, int b) {
+#   return a + b;
+# }
+#
+# MY_CONST int (*const funcGlobalBarMulExt)(int, int) = barAddHdlper;
+# MY_CONST int fooGlobalFuncHelper(int a, int b) {
+#   return 5 + funcGlobalBarMulExt(a, b);
+# }
+
+
+	.text
+	.file	"helper.cpp"
+	.globl	_Z12barAddHdlperii              # -- Begin function _Z12barAddHdlperii
+	.p2align	4, 0x90
+	.type	_Z12barAddHdlperii, at function
+_Z12barAddHdlperii:                     # @_Z12barAddHdlperii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end0:
+	.size	_Z12barAddHdlperii, .Lfunc_end0-_Z12barAddHdlperii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.p2align	4, 0x90
+	.type	_Z19fooGlobalFuncHelperii, at function
+_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$16, %rsp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %edi
+	movl	-8(%rbp), %esi
+	callq	_Z12barAddHdlperii
+	addl	$5, %eax
+	addq	$16, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end1:
+	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end1-_Z19fooGlobalFuncHelperii
+	.cfi_endproc
+                                        # -- End function
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
+
+	.ident	"clang version 20.0.0git"
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.addrsig_sym _Z12barAddHdlperii
diff --git a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPic.s b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPic.s
new file mode 100644
index 00000000000000..489400c3ccaa63
--- /dev/null
+++ b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPic.s
@@ -0,0 +1,84 @@
+# clang++ helper.cpp -c -o
+# #define MY_CONST const
+# int FooVar = 1;
+# int BarVar = 2;
+# [[clang::noinline]]
+# MY_CONST int barAddHdlper(int a, int b) {
+#   return a + b;
+# }
+#
+# MY_CONST int (*const funcGlobalBarMulExt)(int, int) = barAddHdlper;
+# MY_CONST int fooGlobalFuncHelper(int a, int b) {
+#   return 5 + funcGlobalBarMulExt(a, b);
+# }
+
+
+	.text
+	.file	"helper.cpp"
+	.globl	_Z12barAddHdlperii              # -- Begin function _Z12barAddHdlperii
+	.p2align	4, 0x90
+	.type	_Z12barAddHdlperii, at function
+_Z12barAddHdlperii:                     # @_Z12barAddHdlperii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end0:
+	.size	_Z12barAddHdlperii, .Lfunc_end0-_Z12barAddHdlperii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.p2align	4, 0x90
+	.type	_Z19fooGlobalFuncHelperii, at function
+_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$16, %rsp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %edi
+	movl	-8(%rbp), %esi
+	callq	_Z12barAddHdlperii
+	addl	$5, %eax
+	addq	$16, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end1:
+	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end1-_Z19fooGlobalFuncHelperii
+	.cfi_endproc
+                                        # -- End function
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
+
+	.ident	"clang version 20.0.0git"
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.addrsig_sym _Z12barAddHdlperii
diff --git a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPicExtFuncRef.s b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPicExtFuncRef.s
new file mode 100644
index 00000000000000..489400c3ccaa63
--- /dev/null
+++ b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPicExtFuncRef.s
@@ -0,0 +1,84 @@
+# clang++ helper.cpp -c -o
+# #define MY_CONST const
+# int FooVar = 1;
+# int BarVar = 2;
+# [[clang::noinline]]
+# MY_CONST int barAddHdlper(int a, int b) {
+#   return a + b;
+# }
+#
+# MY_CONST int (*const funcGlobalBarMulExt)(int, int) = barAddHdlper;
+# MY_CONST int fooGlobalFuncHelper(int a, int b) {
+#   return 5 + funcGlobalBarMulExt(a, b);
+# }
+
+
+	.text
+	.file	"helper.cpp"
+	.globl	_Z12barAddHdlperii              # -- Begin function _Z12barAddHdlperii
+	.p2align	4, 0x90
+	.type	_Z12barAddHdlperii, at function
+_Z12barAddHdlperii:                     # @_Z12barAddHdlperii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end0:
+	.size	_Z12barAddHdlperii, .Lfunc_end0-_Z12barAddHdlperii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.p2align	4, 0x90
+	.type	_Z19fooGlobalFuncHelperii, at function
+_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$16, %rsp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %edi
+	movl	-8(%rbp), %esi
+	callq	_Z12barAddHdlperii
+	addl	$5, %eax
+	addq	$16, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end1:
+	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end1-_Z19fooGlobalFuncHelperii
+	.cfi_endproc
+                                        # -- End function
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
+
+	.ident	"clang version 20.0.0git"
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.addrsig_sym _Z12barAddHdlperii
diff --git a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s
new file mode 100644
index 00000000000000..c113f1b45ac1a2
--- /dev/null
+++ b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s
@@ -0,0 +1,339 @@
+# clang++ main.cpp -c -o
+# #define MY_CONST const
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# MY_CONST int fooSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# MY_CONST int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# MY_CONST int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# MY_CONST int helper1(MY_CONST int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# MY_CONST int helper2(MY_CONST int (*func)(int, int), MY_CONST int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# MY_CONST static int (*MY_CONST funcGlobalBarAdd)(int, int) = barAdd;
+# MY_CONST int (*MY_CONST funcGlobalBarMul)(int, int) = barMul;
+# int main(int argc, char **argv) {
+#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
+#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
+#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#   MY_PRINTF("val: %d", temp);
+#   return temp;
+# }
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.p2align	4, 0x90
+	.type	_Z6fooSubii, at function
+_Z6fooSubii:                            # @_Z6fooSubii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	subl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end0:
+	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+	.p2align	4, 0x90
+	.type	_Z6barSubii, at function
+_Z6barSubii:                            # @_Z6barSubii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	subl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end1:
+	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	imull	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end2:
+	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	imull	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end3:
+	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end4:
+	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end5:
+	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFKiiiEii             # -- Begin function _Z7helper1PFKiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFKiiiEii, at function
+_Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$32, %rsp
+	movq	%rdi, -16(%rbp)
+	movl	%esi, -20(%rbp)
+	movl	%edx, -24(%rbp)
+	movabsq	$_Z6barAddii, %rax
+	cmpq	%rax, -16(%rbp)
+	jne	.LBB6_2
+# %bb.1:
+	movl	$1, -4(%rbp)
+	jmp	.LBB6_3
+.LBB6_2:
+	movq	-16(%rbp), %rax
+	movl	-20(%rbp), %edi
+	movl	-24(%rbp), %esi
+	callq	*%rax
+	subl	$4, %eax
+	movl	%eax, -4(%rbp)
+.LBB6_3:
+	movl	-4(%rbp), %eax
+	addq	$32, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end6:
+	.size	_Z7helper1PFKiiiEii, .Lfunc_end6-_Z7helper1PFKiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFKiiiES1_ii          # -- Begin function _Z7helper2PFKiiiES1_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFKiiiES1_ii, at function
+_Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$48, %rsp
+	movq	%rdi, -16(%rbp)
+	movq	%rsi, -24(%rbp)
+	movl	%edx, -28(%rbp)
+	movl	%ecx, -32(%rbp)
+	movq	-16(%rbp), %rax
+	cmpq	-24(%rbp), %rax
+	jne	.LBB7_2
+# %bb.1:
+	movl	$2, -4(%rbp)
+	jmp	.LBB7_3
+.LBB7_2:
+	movq	-16(%rbp), %rax
+	movl	-28(%rbp), %edi
+	movl	-32(%rbp), %esi
+	callq	*%rax
+	movl	%eax, -36(%rbp)                 # 4-byte Spill
+	movq	-24(%rbp), %rax
+	movl	-28(%rbp), %edi
+	movl	-32(%rbp), %esi
+	callq	*%rax
+	movl	%eax, %ecx
+	movl	-36(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -4(%rbp)
+.LBB7_3:
+	movl	-4(%rbp), %eax
+	addq	$48, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end7:
+	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end7-_Z7helper2PFKiiiES1_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$48, %rsp
+	movl	$0, -4(%rbp)
+	movl	%edi, -8(%rbp)
+	movq	%rsi, -16(%rbp)
+	movl	FooVar, %esi
+	movl	BarVar, %edx
+	movabsq	$_Z6barAddii, %rdi
+	callq	_Z7helper1PFKiiiEii
+	movl	%eax, -36(%rbp)                 # 4-byte Spill
+	movl	FooVar, %edx
+	movl	BarVar, %ecx
+	movabsq	$_Z6fooMulii, %rdi
+	movabsq	$_Z6barMulii, %rsi
+	callq	_Z7helper2PFKiiiES1_ii
+	movl	%eax, %ecx
+	movl	-36(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -32(%rbp)                 # 4-byte Spill
+	movl	FooVar, %edi
+	movl	BarVar, %esi
+	callq	_Z6fooSubii
+	movl	%eax, %ecx
+	movl	-32(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -28(%rbp)                 # 4-byte Spill
+	movl	FooVar, %edi
+	movl	BarVar, %esi
+	callq	_Z6barSubii
+	movl	%eax, %ecx
+	movl	-28(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -24(%rbp)                 # 4-byte Spill
+	movl	FooVar, %edi
+	movl	BarVar, %esi
+	callq	_Z6fooAddii
+	movl	%eax, %ecx
+	movl	-24(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -20(%rbp)
+	movl	-20(%rbp), %eax
+	addq	$48, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end8:
+	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+                                        # -- End function
+	.ident	"clang version 20.0.0git"
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.addrsig_sym _Z6fooSubii
+	.addrsig_sym _Z6barSubii
+	.addrsig_sym _Z6fooMulii
+	.addrsig_sym _Z6barMulii
+	.addrsig_sym _Z6fooAddii
+	.addrsig_sym _Z6barAddii
+	.addrsig_sym _Z7helper1PFKiiiEii
+	.addrsig_sym _Z7helper2PFKiiiES1_ii
+	.addrsig_sym FooVar
+	.addrsig_sym BarVar
diff --git a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s
new file mode 100644
index 00000000000000..40f30cbbc30550
--- /dev/null
+++ b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s
@@ -0,0 +1,343 @@
+# clang++ main.cpp -c -o
+# #define MY_CONST const
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# MY_CONST int fooSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# MY_CONST int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# MY_CONST int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# MY_CONST int helper1(MY_CONST int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# MY_CONST int helper2(MY_CONST int (*func)(int, int), MY_CONST int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# extern MY_CONST int barAddHdlper(int a, int b);
+# extern MY_CONST int fooGlobalFuncHelper(int a, int b);
+# MY_CONST static int (*const funcGlobalBarAdd)(int, int) = barAddHdlper;
+# MY_CONST int (* const funcGlobalBarMul)(int, int) = fooGlobalFuncHelper;
+# int main(int argc, char **argv) {
+#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
+#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
+#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#   MY_PRINTF("val: %d", temp);
+#   return temp;
+# }
+
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.p2align	4, 0x90
+	.type	_Z6fooSubii, at function
+_Z6fooSubii:                            # @_Z6fooSubii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	subl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end0:
+	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+	.p2align	4, 0x90
+	.type	_Z6barSubii, at function
+_Z6barSubii:                            # @_Z6barSubii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	subl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end1:
+	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	imull	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end2:
+	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	imull	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end3:
+	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end4:
+	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end5:
+	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFKiiiEii             # -- Begin function _Z7helper1PFKiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFKiiiEii, at function
+_Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$32, %rsp
+	movq	%rdi, -16(%rbp)
+	movl	%esi, -20(%rbp)
+	movl	%edx, -24(%rbp)
+	movabsq	$_Z6barAddii, %rax
+	cmpq	%rax, -16(%rbp)
+	jne	.LBB6_2
+# %bb.1:
+	movl	$1, -4(%rbp)
+	jmp	.LBB6_3
+.LBB6_2:
+	movq	-16(%rbp), %rax
+	movl	-20(%rbp), %edi
+	movl	-24(%rbp), %esi
+	callq	*%rax
+	subl	$4, %eax
+	movl	%eax, -4(%rbp)
+.LBB6_3:
+	movl	-4(%rbp), %eax
+	addq	$32, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end6:
+	.size	_Z7helper1PFKiiiEii, .Lfunc_end6-_Z7helper1PFKiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFKiiiES1_ii          # -- Begin function _Z7helper2PFKiiiES1_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFKiiiES1_ii, at function
+_Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$48, %rsp
+	movq	%rdi, -16(%rbp)
+	movq	%rsi, -24(%rbp)
+	movl	%edx, -28(%rbp)
+	movl	%ecx, -32(%rbp)
+	movq	-16(%rbp), %rax
+	cmpq	-24(%rbp), %rax
+	jne	.LBB7_2
+# %bb.1:
+	movl	$2, -4(%rbp)
+	jmp	.LBB7_3
+.LBB7_2:
+	movq	-16(%rbp), %rax
+	movl	-28(%rbp), %edi
+	movl	-32(%rbp), %esi
+	callq	*%rax
+	movl	%eax, -36(%rbp)                 # 4-byte Spill
+	movq	-24(%rbp), %rax
+	movl	-28(%rbp), %edi
+	movl	-32(%rbp), %esi
+	callq	*%rax
+	movl	%eax, %ecx
+	movl	-36(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -4(%rbp)
+.LBB7_3:
+	movl	-4(%rbp), %eax
+	addq	$48, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end7:
+	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end7-_Z7helper2PFKiiiES1_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$48, %rsp
+	movl	$0, -4(%rbp)
+	movl	%edi, -8(%rbp)
+	movq	%rsi, -16(%rbp)
+	movl	FooVar, %esi
+	movl	BarVar, %edx
+	movabsq	$_Z12barAddHdlperii, %rdi
+	callq	_Z7helper1PFKiiiEii
+	movl	%eax, -36(%rbp)                 # 4-byte Spill
+	movl	FooVar, %edx
+	movl	BarVar, %ecx
+	movabsq	$_Z6fooMulii, %rdi
+	movabsq	$_Z19fooGlobalFuncHelperii, %rsi
+	callq	_Z7helper2PFKiiiES1_ii
+	movl	%eax, %ecx
+	movl	-36(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -32(%rbp)                 # 4-byte Spill
+	movl	FooVar, %edi
+	movl	BarVar, %esi
+	callq	_Z6fooSubii
+	movl	%eax, %ecx
+	movl	-32(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -28(%rbp)                 # 4-byte Spill
+	movl	FooVar, %edi
+	movl	BarVar, %esi
+	callq	_Z6barSubii
+	movl	%eax, %ecx
+	movl	-28(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -24(%rbp)                 # 4-byte Spill
+	movl	FooVar, %edi
+	movl	BarVar, %esi
+	callq	_Z6fooAddii
+	movl	%eax, %ecx
+	movl	-24(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -20(%rbp)
+	movl	-20(%rbp), %eax
+	addq	$48, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end8:
+	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+                                        # -- End function
+	.ident	"clang version 20.0.0git"
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.addrsig_sym _Z6fooSubii
+	.addrsig_sym _Z6barSubii
+	.addrsig_sym _Z6fooMulii
+	.addrsig_sym _Z6fooAddii
+	.addrsig_sym _Z6barAddii
+	.addrsig_sym _Z7helper1PFKiiiEii
+	.addrsig_sym _Z7helper2PFKiiiES1_ii
+	.addrsig_sym _Z12barAddHdlperii
+	.addrsig_sym _Z19fooGlobalFuncHelperii
+	.addrsig_sym FooVar
+	.addrsig_sym BarVar
diff --git a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s
new file mode 100644
index 00000000000000..16976abc7d081c
--- /dev/null
+++ b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s
@@ -0,0 +1,350 @@
+# clang++ main.cpp -c -o
+# #define MY_CONST const
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# MY_CONST int fooSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# MY_CONST int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# MY_CONST int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# MY_CONST int helper1(MY_CONST int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# MY_CONST int helper2(MY_CONST int (*func)(int, int), MY_CONST int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# MY_CONST static int (*MY_CONST funcGlobalBarAdd)(int, int) = barAdd;
+# MY_CONST int (*MY_CONST funcGlobalBarMul)(int, int) = barMul;
+# int main(int argc, char **argv) {
+#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
+#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
+#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#   MY_PRINTF("val: %d", temp);
+#   return temp;
+# }
+
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.p2align	4, 0x90
+	.type	_Z6fooSubii, at function
+_Z6fooSubii:                            # @_Z6fooSubii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	subl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end0:
+	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+	.p2align	4, 0x90
+	.type	_Z6barSubii, at function
+_Z6barSubii:                            # @_Z6barSubii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	subl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end1:
+	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	imull	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end2:
+	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	imull	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end3:
+	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end4:
+	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end5:
+	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFKiiiEii             # -- Begin function _Z7helper1PFKiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFKiiiEii, at function
+_Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$32, %rsp
+	movq	%rdi, -16(%rbp)
+	movl	%esi, -20(%rbp)
+	movl	%edx, -24(%rbp)
+	leaq	_Z6barAddii(%rip), %rax
+	cmpq	%rax, -16(%rbp)
+	jne	.LBB6_2
+# %bb.1:
+	movl	$1, -4(%rbp)
+	jmp	.LBB6_3
+.LBB6_2:
+	movq	-16(%rbp), %rax
+	movl	-20(%rbp), %edi
+	movl	-24(%rbp), %esi
+	callq	*%rax
+	subl	$4, %eax
+	movl	%eax, -4(%rbp)
+.LBB6_3:
+	movl	-4(%rbp), %eax
+	addq	$32, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end6:
+	.size	_Z7helper1PFKiiiEii, .Lfunc_end6-_Z7helper1PFKiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFKiiiES1_ii          # -- Begin function _Z7helper2PFKiiiES1_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFKiiiES1_ii, at function
+_Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$48, %rsp
+	movq	%rdi, -16(%rbp)
+	movq	%rsi, -24(%rbp)
+	movl	%edx, -28(%rbp)
+	movl	%ecx, -32(%rbp)
+	movq	-16(%rbp), %rax
+	cmpq	-24(%rbp), %rax
+	jne	.LBB7_2
+# %bb.1:
+	movl	$2, -4(%rbp)
+	jmp	.LBB7_3
+.LBB7_2:
+	movq	-16(%rbp), %rax
+	movl	-28(%rbp), %edi
+	movl	-32(%rbp), %esi
+	callq	*%rax
+	movl	%eax, -36(%rbp)                 # 4-byte Spill
+	movq	-24(%rbp), %rax
+	movl	-28(%rbp), %edi
+	movl	-32(%rbp), %esi
+	callq	*%rax
+	movl	%eax, %ecx
+	movl	-36(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -4(%rbp)
+.LBB7_3:
+	movl	-4(%rbp), %eax
+	addq	$48, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end7:
+	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end7-_Z7helper2PFKiiiES1_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$48, %rsp
+	movl	$0, -4(%rbp)
+	movl	%edi, -8(%rbp)
+	movq	%rsi, -16(%rbp)
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edx
+	leaq	_Z6barAddii(%rip), %rdi
+	callq	_Z7helper1PFKiiiEii
+	movl	%eax, -36(%rbp)                 # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edx
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %ecx
+	leaq	_Z6fooMulii(%rip), %rdi
+	leaq	_Z6barMulii(%rip), %rsi
+	callq	_Z7helper2PFKiiiES1_ii
+	movl	%eax, %ecx
+	movl	-36(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -32(%rbp)                 # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	callq	_Z6fooSubii
+	movl	%eax, %ecx
+	movl	-32(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -28(%rbp)                 # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	callq	_Z6barSubii
+	movl	%eax, %ecx
+	movl	-28(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -24(%rbp)                 # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	callq	_Z6fooAddii
+	movl	%eax, %ecx
+	movl	-24(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -20(%rbp)
+	movl	-20(%rbp), %eax
+	addq	$48, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end8:
+	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+                                        # -- End function
+	.ident	"clang version 20.0.0git"
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.addrsig_sym _Z6fooSubii
+	.addrsig_sym _Z6barSubii
+	.addrsig_sym _Z6fooMulii
+	.addrsig_sym _Z6barMulii
+	.addrsig_sym _Z6fooAddii
+	.addrsig_sym _Z6barAddii
+	.addrsig_sym _Z7helper1PFKiiiEii
+	.addrsig_sym _Z7helper2PFKiiiES1_ii
+	.addrsig_sym FooVar
+	.addrsig_sym BarVar
diff --git a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s
new file mode 100644
index 00000000000000..a7da985b93bc38
--- /dev/null
+++ b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s
@@ -0,0 +1,364 @@
+# clang++ main.cpp -c -o
+# #define MY_CONST const
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# MY_CONST int fooSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# MY_CONST int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# MY_CONST int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# MY_CONST int helper1(MY_CONST int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# MY_CONST int helper2(MY_CONST int (*func)(int, int), MY_CONST int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# extern MY_CONST int barAddHdlper(int a, int b);
+# extern MY_CONST int fooGlobalFuncHelper(int a, int b);
+# MY_CONST static int (*const funcGlobalBarAdd)(int, int) = barAddHdlper;
+# MY_CONST int (* const funcGlobalBarMul)(int, int) = fooGlobalFuncHelper;
+# int main(int argc, char **argv) {
+#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
+#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
+#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#   MY_PRINTF("val: %d", temp);
+#   return temp;
+# }
+
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.p2align	4, 0x90
+	.type	_Z6fooSubii, at function
+_Z6fooSubii:                            # @_Z6fooSubii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	subl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end0:
+	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+	.p2align	4, 0x90
+	.type	_Z6barSubii, at function
+_Z6barSubii:                            # @_Z6barSubii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	subl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end1:
+	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	imull	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end2:
+	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	imull	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end3:
+	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end4:
+	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	movl	%edi, -4(%rbp)
+	movl	%esi, -8(%rbp)
+	movl	-4(%rbp), %eax
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end5:
+	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFKiiiEii             # -- Begin function _Z7helper1PFKiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFKiiiEii, at function
+_Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$32, %rsp
+	movq	%rdi, -16(%rbp)
+	movl	%esi, -20(%rbp)
+	movl	%edx, -24(%rbp)
+	leaq	_Z6barAddii(%rip), %rax
+	cmpq	%rax, -16(%rbp)
+	jne	.LBB6_2
+# %bb.1:
+	movl	$1, -4(%rbp)
+	jmp	.LBB6_3
+.LBB6_2:
+	movq	-16(%rbp), %rax
+	movl	-20(%rbp), %edi
+	movl	-24(%rbp), %esi
+	callq	*%rax
+	subl	$4, %eax
+	movl	%eax, -4(%rbp)
+.LBB6_3:
+	movl	-4(%rbp), %eax
+	addq	$32, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end6:
+	.size	_Z7helper1PFKiiiEii, .Lfunc_end6-_Z7helper1PFKiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFKiiiES1_ii          # -- Begin function _Z7helper2PFKiiiES1_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFKiiiES1_ii, at function
+_Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$48, %rsp
+	movq	%rdi, -16(%rbp)
+	movq	%rsi, -24(%rbp)
+	movl	%edx, -28(%rbp)
+	movl	%ecx, -32(%rbp)
+	movq	-16(%rbp), %rax
+	cmpq	-24(%rbp), %rax
+	jne	.LBB7_2
+# %bb.1:
+	movl	$2, -4(%rbp)
+	jmp	.LBB7_3
+.LBB7_2:
+	movq	-16(%rbp), %rax
+	movl	-28(%rbp), %edi
+	movl	-32(%rbp), %esi
+	callq	*%rax
+	movl	%eax, -36(%rbp)                 # 4-byte Spill
+	movq	-24(%rbp), %rax
+	movl	-28(%rbp), %edi
+	movl	-32(%rbp), %esi
+	callq	*%rax
+	movl	%eax, %ecx
+	movl	-36(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -4(%rbp)
+.LBB7_3:
+	movl	-4(%rbp), %eax
+	addq	$48, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end7:
+	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end7-_Z7helper2PFKiiiES1_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+# %bb.0:
+	pushq	%rbp
+	.cfi_def_cfa_offset 16
+	.cfi_offset %rbp, -16
+	movq	%rsp, %rbp
+	.cfi_def_cfa_register %rbp
+	subq	$48, %rsp
+	movl	$0, -4(%rbp)
+	movl	%edi, -8(%rbp)
+	movq	%rsi, -16(%rbp)
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edx
+	movq	_Z12barAddHdlperii at GOTPCREL(%rip), %rdi
+	callq	_Z7helper1PFKiiiEii
+	movl	%eax, -36(%rbp)                 # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edx
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %ecx
+	leaq	_Z6fooMulii(%rip), %rdi
+	movq	_Z19fooGlobalFuncHelperii at GOTPCREL(%rip), %rsi
+	callq	_Z7helper2PFKiiiES1_ii
+	movl	%eax, %ecx
+	movl	-36(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -32(%rbp)                 # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	callq	_Z6fooSubii
+	movl	%eax, %ecx
+	movl	-32(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -28(%rbp)                 # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	callq	_Z6barSubii
+	movl	%eax, %ecx
+	movl	-28(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -24(%rbp)                 # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %edi
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movl	(%rax), %esi
+	callq	_Z6fooAddii
+	movl	%eax, %ecx
+	movl	-24(%rbp), %eax                 # 4-byte Reload
+	addl	%ecx, %eax
+	movl	%eax, -20(%rbp)
+	movl	-20(%rbp), %esi
+	leaq	.L.str(%rip), %rdi
+	movb	$0, %al
+	callq	printf at PLT
+	movl	-20(%rbp), %eax
+	addq	$48, %rsp
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end8:
+	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+                                        # -- End function
+	.type	.L.str, at object                  # @.str
+	.section	.rodata.str1.1,"aMS", at progbits,1
+.L.str:
+	.asciz	"val: %d\n"
+	.size	.L.str, 9
+
+	.ident	"clang version 20.0.0git"
+	.section	".note.GNU-stack","", at progbits
+	.addrsig
+	.addrsig_sym _Z6fooSubii
+	.addrsig_sym _Z6barSubii
+	.addrsig_sym _Z6fooMulii
+	.addrsig_sym _Z6fooAddii
+	.addrsig_sym _Z6barAddii
+	.addrsig_sym _Z7helper1PFKiiiEii
+	.addrsig_sym _Z7helper2PFKiiiES1_ii
+	.addrsig_sym _Z12barAddHdlperii
+	.addrsig_sym _Z19fooGlobalFuncHelperii
+	.addrsig_sym printf
+	.addrsig_sym FooVar
+	.addrsig_sym BarVar
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
new file mode 100644
index 00000000000000..332c4296f45e5f
--- /dev/null
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
@@ -0,0 +1,24 @@
+## Check that BOLT handles correctly folding functions with --icf-safe that can be referenced.
+## This checks global const function pointer in -fno-pic mode is handled correctly.
+
+# REQUIRES: system-linux
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFGlobalConstPtrNoPic.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICFGlobalConstPtrNoPic.s    -o %t2.o
+# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q -no-pie
+# RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+
+## Check that BOLT successfully folded a function with jump table:
+# ICFCHECK:      ICF iteration 1
+# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
+# ICFCHECK-NEXT: folding _Z12barAddHdlperii into _Z6fooAddii
+# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
+# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+
+# SAFEICFCHECK:      skipping function _Z6barAddii
+# SAFEICFCHECK-NEXT: skipping function _Z6barMulii
+# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: ICF iteration 1
+# SAFEICFCHECK-NEXT: folding _Z12barAddHdlperii into _Z6fooAddii
+# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# SAFEICFCHECK-NEXT: ===---------
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
new file mode 100644
index 00000000000000..a46fdb86574c0b
--- /dev/null
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
@@ -0,0 +1,24 @@
+## Check that BOLT handles correctly folding functions with --icf-safe that can be referenced.
+## This checks global const function pointer in -fno-pic mode is handled correctly.
+
+# REQUIRES: system-linux
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICFGlobalConstPtrNoPicExtFuncRef.s    -o %t2.o
+# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q -no-pie
+# RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+
+## Check that BOLT successfully folded a function with jump table:
+# ICFCHECK:      ICF iteration 1
+# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
+# ICFCHECK-NEXT: folding _Z12barAddHdlperii into _Z6fooAddii
+# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
+# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+
+# SAFEICFCHECK:      skipping function _Z12barAddHdlperii
+# SAFEICFCHECK-NEXT: skipping function _Z19fooGlobalFuncHelperii
+# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
+# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: ICF iteration 1
+# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# SAFEICFCHECK-NEXT: ===---------
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
new file mode 100644
index 00000000000000..ab84fdc619ae9b
--- /dev/null
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
@@ -0,0 +1,24 @@
+## Check that BOLT handles correctly folding functions with --icf-safe that can be referenced.
+## This checks global const function pointer in -fpic mode is handled correctly.
+
+# REQUIRES: system-linux
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFGlobalConstPtrPic.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICFGlobalConstPtrPic.s    -o %t2.o
+# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
+# RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+
+## Check that BOLT successfully folded a function with jump table:
+# ICFCHECK:      ICF iteration 1
+# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
+# ICFCHECK-NEXT: folding _Z12barAddHdlperii into _Z6fooAddii
+# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
+# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+
+# SAFEICFCHECK:      skipping function _Z6barAddii
+# SAFEICFCHECK-NEXT: skipping function _Z6barMulii
+# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: ICF iteration 1
+# SAFEICFCHECK-NEXT: folding _Z12barAddHdlperii into _Z6fooAddii
+# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# SAFEICFCHECK-NEXT: ===---------
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
new file mode 100644
index 00000000000000..f416f8f5f4f9c8
--- /dev/null
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
@@ -0,0 +1,24 @@
+## Check that BOLT handles correctly folding functions with --icf-safe that can be referenced.
+## This checks global const function pointer with external function reference in -fpic mode is handled correctly.
+
+# REQUIRES: system-linux
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICFGlobalConstPtrPicExtFuncRef.s    -o %t2.o
+# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
+# RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+
+## Check that BOLT successfully folded a function with jump table:
+# ICFCHECK:      ICF iteration 1
+# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
+# ICFCHECK-NEXT: folding _Z12barAddHdlperii into _Z6fooAddii
+# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
+# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+
+# SAFEICFCHECK:      skipping function _Z12barAddHdlperii
+# SAFEICFCHECK-NEXT: skipping function _Z19fooGlobalFuncHelperii
+# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
+# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: ICF iteration 1
+# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# SAFEICFCHECK-NEXT: ===---------

>From e36ec02bfeb440e56a9b8593f454a9e7f2fe7ed5 Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Fri, 15 Nov 2024 18:17:01 -0800
Subject: [PATCH 05/18] switched to enum version of icf compile option

---
 bolt/lib/Core/BinaryContext.cpp     | 24 +++++++++++-------------
 bolt/test/X86/shared_object_entry.s |  2 +-
 2 files changed, 12 insertions(+), 14 deletions(-)

diff --git a/bolt/lib/Core/BinaryContext.cpp b/bolt/lib/Core/BinaryContext.cpp
index 960849371660b2..aaa7a125e94147 100644
--- a/bolt/lib/Core/BinaryContext.cpp
+++ b/bolt/lib/Core/BinaryContext.cpp
@@ -76,8 +76,16 @@ cl::opt<std::string> CompDirOverride(
              "to *.dwo files."),
     cl::Hidden, cl::init(""), cl::cat(BoltCategory));
 
-cl::opt<std::string> ICF("icf", cl::desc("fold functions with identical code"),
-                         cl::ValueOptional, cl::cat(BoltOptCategory));
+cl::opt<bolt::BinaryContext::ICFLevel> ICF(
+    "icf", cl::desc("fold functions with identical code"),
+    cl::init(bolt::BinaryContext::ICFLevel::None),
+    cl::values(
+        clEnumValN(bolt::BinaryContext::ICFLevel::All, "all", "enable ICF"),
+        clEnumValN(bolt::BinaryContext::ICFLevel::All, "", "enable ICF"),
+        clEnumValN(bolt::BinaryContext::ICFLevel::None, "none", "disable ICF"),
+        clEnumValN(bolt::BinaryContext::ICFLevel::Safe, "safe",
+                   "enable safe ICF")),
+    cl::ZeroOrMore, cl::ValueOptional, cl::cat(BoltOptCategory));
 } // namespace opts
 
 namespace {
@@ -171,16 +179,6 @@ void BinaryContext::logBOLTErrorsAndQuitOnFatal(Error E) {
   });
 }
 
-static BinaryContext::ICFLevel parseICFLevel() {
-  if (!opts::ICF.getNumOccurrences())
-    return BinaryContext::ICFLevel::None;
-  std::string Str = StringRef(opts::ICF).lower();
-  return StringSwitch<BinaryContext::ICFLevel>(Str)
-      .Case("all", BinaryContext::ICFLevel::All)
-      .Case("safe", BinaryContext::ICFLevel::Safe)
-      .Default(BinaryContext::ICFLevel::All);
-}
-
 BinaryContext::BinaryContext(std::unique_ptr<MCContext> Ctx,
                              std::unique_ptr<DWARFContext> DwCtx,
                              std::unique_ptr<Triple> TheTriple,
@@ -205,7 +203,7 @@ BinaryContext::BinaryContext(std::unique_ptr<MCContext> Ctx,
       Logger(Logger), InitialDynoStats(isAArch64()) {
   RegularPageSize = isAArch64() ? RegularPageSizeAArch64 : RegularPageSizeX86;
   PageAlign = opts::NoHugePages ? RegularPageSize : HugePageSize;
-  CurrICFLevel = parseICFLevel();
+  CurrICFLevel = opts::ICF;
 }
 
 BinaryContext::~BinaryContext() {
diff --git a/bolt/test/X86/shared_object_entry.s b/bolt/test/X86/shared_object_entry.s
index 87a3c0655533d1..2caab5afdb7805 100644
--- a/bolt/test/X86/shared_object_entry.s
+++ b/bolt/test/X86/shared_object_entry.s
@@ -2,7 +2,7 @@
 # RUN: ld.lld %t.o -o %t.so --shared --entry=func1.cold.1 --emit-relocs
 # RUN: llvm-bolt -relocs %t.so -o %t -reorder-functions=hfsort+ \
 # RUN:    -split-functions -reorder-blocks=ext-tsp -split-all-cold \
-# RUN:    -dyno-stats -icf=1 -use-gnu-stack
+# RUN:    -dyno-stats -icf -use-gnu-stack
 
 ## Check that an entry point is a cold symbol
 # RUN: llvm-readelf -h %t.so > %t.log

>From b83c3350ec08623350c1639347cb9f8e71850fba Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Tue, 19 Nov 2024 16:21:32 -0800
Subject: [PATCH 06/18] simplified debug print, removed shared func

---
 .../bolt/Passes/IdenticalCodeFolding.h        |  2 ++
 bolt/lib/Passes/IdenticalCodeFolding.cpp      | 29 +++++--------------
 bolt/test/X86/icf-safe-test1-no-cfg.test      |  4 +--
 bolt/test/X86/icf-safe-test1.test             |  4 +--
 .../icf-safe-test2GlobalConstPtrNoPic.test    |  4 +--
 ...fe-test2GlobalConstPtrNoPicExtFuncRef.test |  6 ++--
 .../X86/icf-safe-test2GlobalConstPtrPic.test  |  4 +--
 ...safe-test2GlobalConstPtrPicExtFuncRef.test |  6 ++--
 bolt/test/X86/icf-safe-test2GlobalVarO0.test  |  4 +--
 bolt/test/X86/icf-safe-test2GlobalVarO3.test  |  4 +--
 bolt/test/X86/icf-safe-test3LocalVarO0.test   |  4 +--
 bolt/test/X86/icf-safe-test3LocalVarO3.test   |  4 +--
 12 files changed, 32 insertions(+), 43 deletions(-)

diff --git a/bolt/include/bolt/Passes/IdenticalCodeFolding.h b/bolt/include/bolt/Passes/IdenticalCodeFolding.h
index eb803031bf0f0e..9d8d3ece1a2edf 100644
--- a/bolt/include/bolt/Passes/IdenticalCodeFolding.h
+++ b/bolt/include/bolt/Passes/IdenticalCodeFolding.h
@@ -27,6 +27,8 @@ class IdenticalCodeFolding : public BinaryFunctionPass {
       return false;
     if (BF.hasSDTMarker())
       return false;
+    if (!BF.isSafeToICF())
+      return false;
     return BinaryFunctionPass::shouldOptimize(BF);
   }
 
diff --git a/bolt/lib/Passes/IdenticalCodeFolding.cpp b/bolt/lib/Passes/IdenticalCodeFolding.cpp
index 8fb22897a44f62..2114bfe874bd18 100644
--- a/bolt/lib/Passes/IdenticalCodeFolding.cpp
+++ b/bolt/lib/Passes/IdenticalCodeFolding.cpp
@@ -393,22 +393,12 @@ Error IdenticalCodeFolding::markFunctionsUnsafeToFold(BinaryContext &BC) {
       "markUnsafe", /*ForceSequential*/ false, 2);
 
   LLVM_DEBUG({
-    std::vector<StringRef> Vect;
-    std::mutex PrintMutex;
-    ParallelUtilities::WorkFuncTy WorkFun = [&](BinaryFunction &BF) {
-      if (BF.isSafeToICF())
-        return;
-      std::lock_guard<std::mutex> Lock(PrintMutex);
-      Vect.push_back(BF.getOneName());
-    };
-    ParallelUtilities::PredicateTy SkipFunc =
-        [&](const BinaryFunction &BF) -> bool { return false; };
-    ParallelUtilities::runOnEachFunction(
-        BC, ParallelUtilities::SchedulingPolicy::SP_TRIVIAL, WorkFun, SkipFunc,
-        "markUnsafe", /*ForceSequential*/ false, 2);
-    llvm::sort(Vect);
-    for (const auto &FuncName : Vect)
-      dbgs() << "BOLT-DEBUG: skipping function " << FuncName << '\n';
+    for (auto &BFIter : BC.getBinaryFunctions()) {
+      if (BFIter.second.isSafeToICF())
+        continue;
+      dbgs() << "BOLT-DEBUG: skipping function " << BFIter.second.getOneName()
+             << '\n';
+    }
   });
   return ErrorStatus;
 }
@@ -422,9 +412,6 @@ Error IdenticalCodeFolding::runOnFunctions(BinaryContext &BC) {
   std::atomic<uint64_t> NumFoldedLastIteration{0};
   CongruentBucketsMap CongruentBuckets;
 
-  auto SkipFuncShared = [&](const BinaryFunction &BF) {
-    return !shouldOptimize(BF) || !BF.isSafeToICF();
-  };
   // Hash all the functions
   auto hashFunctions = [&]() {
     NamedRegionTimer HashFunctionsTimer("hashing", "hashing", "ICF breakdown",
@@ -444,7 +431,7 @@ Error IdenticalCodeFolding::runOnFunctions(BinaryContext &BC) {
     };
 
     ParallelUtilities::PredicateTy SkipFunc = [&](const BinaryFunction &BF) {
-      return SkipFuncShared(BF);
+      return !shouldOptimize(BF);
     };
 
     ParallelUtilities::runOnEachFunction(
@@ -460,7 +447,7 @@ Error IdenticalCodeFolding::runOnFunctions(BinaryContext &BC) {
                                            "ICF breakdown", opts::TimeICF);
     for (auto &BFI : BC.getBinaryFunctions()) {
       BinaryFunction &BF = BFI.second;
-      if (SkipFuncShared(BF))
+      if (!shouldOptimize(BF))
         continue;
       CongruentBuckets[&BF].emplace(&BF);
     }
diff --git a/bolt/test/X86/icf-safe-test1-no-cfg.test b/bolt/test/X86/icf-safe-test1-no-cfg.test
index 5efbff9b3f3f76..8617dfa590d941 100644
--- a/bolt/test/X86/icf-safe-test1-no-cfg.test
+++ b/bolt/test/X86/icf-safe-test1-no-cfg.test
@@ -13,9 +13,9 @@
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
 # ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 
-# SAFEICFCHECK:      skipping function _Z6barAddii
+# SAFEICFCHECK:      skipping function _Z6fooMulii
 # SAFEICFCHECK-NEXT: skipping function _Z6barMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 # SAFEICFCHECK-NEXT: ===---------
diff --git a/bolt/test/X86/icf-safe-test1.test b/bolt/test/X86/icf-safe-test1.test
index 96986dec1e1922..b60795d7fa3bee 100644
--- a/bolt/test/X86/icf-safe-test1.test
+++ b/bolt/test/X86/icf-safe-test1.test
@@ -13,9 +13,9 @@
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
 # ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 
-# SAFEICFCHECK:      skipping function _Z6barAddii
+# SAFEICFCHECK:      skipping function _Z6fooMulii
 # SAFEICFCHECK-NEXT: skipping function _Z6barMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 # SAFEICFCHECK-NEXT: ===---------
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
index 332c4296f45e5f..83e7e798afcd8c 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
@@ -15,9 +15,9 @@
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
 # ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 
-# SAFEICFCHECK:      skipping function _Z6barAddii
+# SAFEICFCHECK:      skipping function _Z6fooMulii
 # SAFEICFCHECK-NEXT: skipping function _Z6barMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _Z12barAddHdlperii into _Z6fooAddii
 # SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
index a46fdb86574c0b..bef5b71a25c4f6 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
@@ -15,10 +15,10 @@
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
 # ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 
-# SAFEICFCHECK:      skipping function _Z12barAddHdlperii
-# SAFEICFCHECK-NEXT: skipping function _Z19fooGlobalFuncHelperii
+# SAFEICFCHECK:      skipping function _Z6fooMulii
 # SAFEICFCHECK-NEXT: skipping function _Z6barAddii
-# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: skipping function _Z12barAddHdlperii
+# SAFEICFCHECK-NEXT: skipping function _Z19fooGlobalFuncHelperii
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 # SAFEICFCHECK-NEXT: ===---------
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
index ab84fdc619ae9b..d2c039769e8d23 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
@@ -15,9 +15,9 @@
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
 # ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 
-# SAFEICFCHECK:      skipping function _Z6barAddii
+# SAFEICFCHECK:      skipping function _Z6fooMulii
 # SAFEICFCHECK-NEXT: skipping function _Z6barMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _Z12barAddHdlperii into _Z6fooAddii
 # SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
index f416f8f5f4f9c8..2a93af6d44220c 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
@@ -15,10 +15,10 @@
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
 # ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 
-# SAFEICFCHECK:      skipping function _Z12barAddHdlperii
-# SAFEICFCHECK-NEXT: skipping function _Z19fooGlobalFuncHelperii
+# SAFEICFCHECK:      skipping function _Z6fooMulii
 # SAFEICFCHECK-NEXT: skipping function _Z6barAddii
-# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: skipping function _Z12barAddHdlperii
+# SAFEICFCHECK-NEXT: skipping function _Z19fooGlobalFuncHelperii
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 # SAFEICFCHECK-NEXT: ===---------
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO0.test b/bolt/test/X86/icf-safe-test2GlobalVarO0.test
index 9464dc05782ee5..de5c1ebca81e17 100644
--- a/bolt/test/X86/icf-safe-test2GlobalVarO0.test
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO0.test
@@ -13,9 +13,9 @@
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
 # ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 
-# SAFEICFCHECK:      skipping function _Z6barAddii
+# SAFEICFCHECK:      skipping function _Z6fooMulii
 # SAFEICFCHECK-NEXT: skipping function _Z6barMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 # SAFEICFCHECK-NEXT: ===---------
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO3.test b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
index 935a5ddb189ef7..06853bfe328904 100644
--- a/bolt/test/X86/icf-safe-test2GlobalVarO3.test
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
@@ -13,9 +13,9 @@
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
 # ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 
-# SAFEICFCHECK:      skipping function _Z6barAddii
+# SAFEICFCHECK:      skipping function _Z6fooMulii
 # SAFEICFCHECK-NEXT: skipping function _Z6barMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 # SAFEICFCHECK-NEXT: ===---------
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO0.test b/bolt/test/X86/icf-safe-test3LocalVarO0.test
index 9fb783539da39f..0a88cca49e1bd4 100644
--- a/bolt/test/X86/icf-safe-test3LocalVarO0.test
+++ b/bolt/test/X86/icf-safe-test3LocalVarO0.test
@@ -13,9 +13,9 @@
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
 # ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 
-# SAFEICFCHECK:      skipping function _Z6barAddii
+# SAFEICFCHECK:      skipping function _Z6fooMulii
 # SAFEICFCHECK-NEXT: skipping function _Z6barMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 # SAFEICFCHECK-NEXT: ===---------
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO3.test b/bolt/test/X86/icf-safe-test3LocalVarO3.test
index 55fa11ada15490..d961980df15be6 100644
--- a/bolt/test/X86/icf-safe-test3LocalVarO3.test
+++ b/bolt/test/X86/icf-safe-test3LocalVarO3.test
@@ -13,9 +13,9 @@
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
 # ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 
-# SAFEICFCHECK:      skipping function _Z6barAddii
+# SAFEICFCHECK:      skipping function _Z6fooMulii
 # SAFEICFCHECK-NEXT: skipping function _Z6barMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6fooMulii
+# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 # SAFEICFCHECK-NEXT: ===---------

>From 39c79029a60b07646bcd764b469057a05f3a659e Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Tue, 19 Nov 2024 17:59:05 -0800
Subject: [PATCH 07/18] updated tests

---
 .../Inputs/helperSafeICFGlobalConstPtrNoPic.s |  59 --------
 .../Inputs/helperSafeICFGlobalConstPtrPic.s   |  60 --------
 .../Inputs/mainSafeICFGlobalConstPtrNoPic.s   | 133 +++++-------------
 .../X86/Inputs/mainSafeICFGlobalConstPtrPic.s | 127 ++++-------------
 bolt/test/X86/icf-safe-icp.test               |   1 -
 bolt/test/X86/icf-safe-test1-no-cfg.test      |   1 -
 bolt/test/X86/icf-safe-test1-no-relocs.test   |   1 -
 bolt/test/X86/icf-safe-test1.test             |   1 -
 .../icf-safe-test2GlobalConstPtrNoPic.test    |   5 -
 ...fe-test2GlobalConstPtrNoPicExtFuncRef.test |   1 -
 .../X86/icf-safe-test2GlobalConstPtrPic.test  |   5 -
 ...safe-test2GlobalConstPtrPicExtFuncRef.test |   1 -
 bolt/test/X86/icf-safe-test2GlobalVarO0.test  |   1 -
 bolt/test/X86/icf-safe-test2GlobalVarO3.test  |   1 -
 bolt/test/X86/icf-safe-test3LocalVarO0.test   |   1 -
 bolt/test/X86/icf-safe-test3LocalVarO3.test   |   1 -
 16 files changed, 65 insertions(+), 334 deletions(-)

diff --git a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPic.s b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPic.s
index 8697f77862e66f..a970897fa0771b 100644
--- a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPic.s
+++ b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPic.s
@@ -2,66 +2,8 @@
 # #define MY_CONST const
 # int FooVar = 1;
 # int BarVar = 2;
-# [[clang::noinline]]
-# MY_CONST int barAddHdlper(int a, int b) {
-#   return a + b;
-# }
-#
-# MY_CONST int (*const funcGlobalBarMulExt)(int, int) = barAddHdlper;
-# MY_CONST int fooGlobalFuncHelper(int a, int b) {
-#   return 5 + funcGlobalBarMulExt(a, b);
-# }
-
 	.text
 	.file	"helper.cpp"
-	.globl	_Z12barAddHdlperii              # -- Begin function _Z12barAddHdlperii
-	.p2align	4, 0x90
-	.type	_Z12barAddHdlperii, at function
-_Z12barAddHdlperii:                     # @_Z12barAddHdlperii
-	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
-	addl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
-	retq
-.Lfunc_end0:
-	.size	_Z12barAddHdlperii, .Lfunc_end0-_Z12barAddHdlperii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
-	.p2align	4, 0x90
-	.type	_Z19fooGlobalFuncHelperii, at function
-_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
-	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$16, %rsp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %edi
-	movl	-8(%rbp), %esi
-	callq	_Z12barAddHdlperii
-	addl	$5, %eax
-	addq	$16, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
-	retq
-.Lfunc_end1:
-	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end1-_Z19fooGlobalFuncHelperii
-	.cfi_endproc
-                                        # -- End function
 	.type	FooVar, at object                  # @FooVar
 	.data
 	.globl	FooVar
@@ -80,4 +22,3 @@ BarVar:
 	.ident	"clang version 20.0.0git"
 	.section	".note.GNU-stack","", at progbits
 	.addrsig
-	.addrsig_sym _Z12barAddHdlperii
diff --git a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPic.s b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPic.s
index 489400c3ccaa63..a970897fa0771b 100644
--- a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPic.s
+++ b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPic.s
@@ -2,67 +2,8 @@
 # #define MY_CONST const
 # int FooVar = 1;
 # int BarVar = 2;
-# [[clang::noinline]]
-# MY_CONST int barAddHdlper(int a, int b) {
-#   return a + b;
-# }
-#
-# MY_CONST int (*const funcGlobalBarMulExt)(int, int) = barAddHdlper;
-# MY_CONST int fooGlobalFuncHelper(int a, int b) {
-#   return 5 + funcGlobalBarMulExt(a, b);
-# }
-
-
 	.text
 	.file	"helper.cpp"
-	.globl	_Z12barAddHdlperii              # -- Begin function _Z12barAddHdlperii
-	.p2align	4, 0x90
-	.type	_Z12barAddHdlperii, at function
-_Z12barAddHdlperii:                     # @_Z12barAddHdlperii
-	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
-	addl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
-	retq
-.Lfunc_end0:
-	.size	_Z12barAddHdlperii, .Lfunc_end0-_Z12barAddHdlperii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
-	.p2align	4, 0x90
-	.type	_Z19fooGlobalFuncHelperii, at function
-_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
-	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$16, %rsp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %edi
-	movl	-8(%rbp), %esi
-	callq	_Z12barAddHdlperii
-	addl	$5, %eax
-	addq	$16, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
-	retq
-.Lfunc_end1:
-	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end1-_Z19fooGlobalFuncHelperii
-	.cfi_endproc
-                                        # -- End function
 	.type	FooVar, at object                  # @FooVar
 	.data
 	.globl	FooVar
@@ -81,4 +22,3 @@ BarVar:
 	.ident	"clang version 20.0.0git"
 	.section	".note.GNU-stack","", at progbits
 	.addrsig
-	.addrsig_sym _Z12barAddHdlperii
diff --git a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s
index c113f1b45ac1a2..11465a0b1ffd0a 100644
--- a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s
+++ b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s
@@ -3,14 +3,6 @@
 # extern int FooVar;
 # extern int BarVar;
 # [[clang::noinline]]
-# MY_CONST int fooSub(int a, int b) {
-#   return a - b;
-# }
-# [[clang::noinline]]
-# MY_CONST int barSub(int a, int b) {
-#   return a - b;
-# }
-# [[clang::noinline]]
 # MY_CONST int fooMul(int a, int b) {
 #   return a * b;
 # }
@@ -42,57 +34,13 @@
 # MY_CONST int (*MY_CONST funcGlobalBarMul)(int, int) = barMul;
 # int main(int argc, char **argv) {
 #   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
-#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
-#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar)
+#              fooAdd(FooVar, BarVar);
 #   MY_PRINTF("val: %d", temp);
 #   return temp;
 # }
 	.text
 	.file	"main.cpp"
-	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
-	.p2align	4, 0x90
-	.type	_Z6fooSubii, at function
-_Z6fooSubii:                            # @_Z6fooSubii
-	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
-	subl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
-	retq
-.Lfunc_end0:
-	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
-	.p2align	4, 0x90
-	.type	_Z6barSubii, at function
-_Z6barSubii:                            # @_Z6barSubii
-	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
-	subl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
-	retq
-.Lfunc_end1:
-	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
-	.cfi_endproc
-                                        # -- End function
 	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
 	.p2align	4, 0x90
 	.type	_Z6fooMulii, at function
@@ -111,8 +59,8 @@ _Z6fooMulii:                            # @_Z6fooMulii
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
 	retq
-.Lfunc_end2:
-	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+.Lfunc_end0:
+	.size	_Z6fooMulii, .Lfunc_end0-_Z6fooMulii
 	.cfi_endproc
                                         # -- End function
 	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
@@ -133,8 +81,8 @@ _Z6barMulii:                            # @_Z6barMulii
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
 	retq
-.Lfunc_end3:
-	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+.Lfunc_end1:
+	.size	_Z6barMulii, .Lfunc_end1-_Z6barMulii
 	.cfi_endproc
                                         # -- End function
 	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
@@ -155,8 +103,8 @@ _Z6fooAddii:                            # @_Z6fooAddii
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
 	retq
-.Lfunc_end4:
-	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+.Lfunc_end2:
+	.size	_Z6fooAddii, .Lfunc_end2-_Z6fooAddii
 	.cfi_endproc
                                         # -- End function
 	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
@@ -177,8 +125,8 @@ _Z6barAddii:                            # @_Z6barAddii
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
 	retq
-.Lfunc_end5:
-	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+.Lfunc_end3:
+	.size	_Z6barAddii, .Lfunc_end3-_Z6barAddii
 	.cfi_endproc
                                         # -- End function
 	.globl	_Z7helper1PFKiiiEii             # -- Begin function _Z7helper1PFKiiiEii
@@ -198,25 +146,25 @@ _Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
 	movl	%edx, -24(%rbp)
 	movabsq	$_Z6barAddii, %rax
 	cmpq	%rax, -16(%rbp)
-	jne	.LBB6_2
+	jne	.LBB4_2
 # %bb.1:
 	movl	$1, -4(%rbp)
-	jmp	.LBB6_3
-.LBB6_2:
+	jmp	.LBB4_3
+.LBB4_2:
 	movq	-16(%rbp), %rax
 	movl	-20(%rbp), %edi
 	movl	-24(%rbp), %esi
 	callq	*%rax
 	subl	$4, %eax
 	movl	%eax, -4(%rbp)
-.LBB6_3:
+.LBB4_3:
 	movl	-4(%rbp), %eax
 	addq	$32, %rsp
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
 	retq
-.Lfunc_end6:
-	.size	_Z7helper1PFKiiiEii, .Lfunc_end6-_Z7helper1PFKiiiEii
+.Lfunc_end4:
+	.size	_Z7helper1PFKiiiEii, .Lfunc_end4-_Z7helper1PFKiiiEii
 	.cfi_endproc
                                         # -- End function
 	.globl	_Z7helper2PFKiiiES1_ii          # -- Begin function _Z7helper2PFKiiiES1_ii
@@ -237,11 +185,11 @@ _Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
 	movl	%ecx, -32(%rbp)
 	movq	-16(%rbp), %rax
 	cmpq	-24(%rbp), %rax
-	jne	.LBB7_2
+	jne	.LBB5_2
 # %bb.1:
 	movl	$2, -4(%rbp)
-	jmp	.LBB7_3
-.LBB7_2:
+	jmp	.LBB5_3
+.LBB5_2:
 	movq	-16(%rbp), %rax
 	movl	-28(%rbp), %edi
 	movl	-32(%rbp), %esi
@@ -255,14 +203,14 @@ _Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
 	movl	-36(%rbp), %eax                 # 4-byte Reload
 	addl	%ecx, %eax
 	movl	%eax, -4(%rbp)
-.LBB7_3:
+.LBB5_3:
 	movl	-4(%rbp), %eax
 	addq	$48, %rsp
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
 	retq
-.Lfunc_end7:
-	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end7-_Z7helper2PFKiiiES1_ii
+.Lfunc_end5:
+	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end5-_Z7helper2PFKiiiES1_ii
 	.cfi_endproc
                                         # -- End function
 	.globl	main                            # -- Begin function main
@@ -276,7 +224,7 @@ main:                                   # @main
 	.cfi_offset %rbp, -16
 	movq	%rsp, %rbp
 	.cfi_def_cfa_register %rbp
-	subq	$48, %rsp
+	subq	$32, %rsp
 	movl	$0, -4(%rbp)
 	movl	%edi, -8(%rbp)
 	movq	%rsi, -16(%rbp)
@@ -284,27 +232,13 @@ main:                                   # @main
 	movl	BarVar, %edx
 	movabsq	$_Z6barAddii, %rdi
 	callq	_Z7helper1PFKiiiEii
-	movl	%eax, -36(%rbp)                 # 4-byte Spill
+	movl	%eax, -28(%rbp)                 # 4-byte Spill
 	movl	FooVar, %edx
 	movl	BarVar, %ecx
 	movabsq	$_Z6fooMulii, %rdi
 	movabsq	$_Z6barMulii, %rsi
 	callq	_Z7helper2PFKiiiES1_ii
 	movl	%eax, %ecx
-	movl	-36(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -32(%rbp)                 # 4-byte Spill
-	movl	FooVar, %edi
-	movl	BarVar, %esi
-	callq	_Z6fooSubii
-	movl	%eax, %ecx
-	movl	-32(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -28(%rbp)                 # 4-byte Spill
-	movl	FooVar, %edi
-	movl	BarVar, %esi
-	callq	_Z6barSubii
-	movl	%eax, %ecx
 	movl	-28(%rbp), %eax                 # 4-byte Reload
 	addl	%ecx, %eax
 	movl	%eax, -24(%rbp)                 # 4-byte Spill
@@ -315,25 +249,34 @@ main:                                   # @main
 	movl	-24(%rbp), %eax                 # 4-byte Reload
 	addl	%ecx, %eax
 	movl	%eax, -20(%rbp)
+	movl	-20(%rbp), %esi
+	movabsq	$.L.str, %rdi
+	movb	$0, %al
+	callq	printf
 	movl	-20(%rbp), %eax
-	addq	$48, %rsp
+	addq	$32, %rsp
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
 	retq
-.Lfunc_end8:
-	.size	main, .Lfunc_end8-main
+.Lfunc_end6:
+	.size	main, .Lfunc_end6-main
 	.cfi_endproc
                                         # -- End function
+	.type	.L.str, at object                  # @.str
+	.section	.rodata.str1.1,"aMS", at progbits,1
+.L.str:
+	.asciz	"val: %d\n"
+	.size	.L.str, 9
+
 	.ident	"clang version 20.0.0git"
 	.section	".note.GNU-stack","", at progbits
 	.addrsig
-	.addrsig_sym _Z6fooSubii
-	.addrsig_sym _Z6barSubii
 	.addrsig_sym _Z6fooMulii
 	.addrsig_sym _Z6barMulii
 	.addrsig_sym _Z6fooAddii
 	.addrsig_sym _Z6barAddii
 	.addrsig_sym _Z7helper1PFKiiiEii
 	.addrsig_sym _Z7helper2PFKiiiES1_ii
+	.addrsig_sym printf
 	.addrsig_sym FooVar
 	.addrsig_sym BarVar
diff --git a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s
index 16976abc7d081c..3c878a7de8e6b8 100644
--- a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s
+++ b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s
@@ -3,14 +3,6 @@
 # extern int FooVar;
 # extern int BarVar;
 # [[clang::noinline]]
-# MY_CONST int fooSub(int a, int b) {
-#   return a - b;
-# }
-# [[clang::noinline]]
-# MY_CONST int barSub(int a, int b) {
-#   return a - b;
-# }
-# [[clang::noinline]]
 # MY_CONST int fooMul(int a, int b) {
 #   return a * b;
 # }
@@ -42,58 +34,13 @@
 # MY_CONST int (*MY_CONST funcGlobalBarMul)(int, int) = barMul;
 # int main(int argc, char **argv) {
 #   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
-#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
-#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) +
+#              fooAdd(FooVar, BarVar);
 #   MY_PRINTF("val: %d", temp);
 #   return temp;
 # }
-
 	.text
 	.file	"main.cpp"
-	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
-	.p2align	4, 0x90
-	.type	_Z6fooSubii, at function
-_Z6fooSubii:                            # @_Z6fooSubii
-	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
-	subl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
-	retq
-.Lfunc_end0:
-	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
-	.p2align	4, 0x90
-	.type	_Z6barSubii, at function
-_Z6barSubii:                            # @_Z6barSubii
-	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
-	subl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
-	retq
-.Lfunc_end1:
-	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
-	.cfi_endproc
-                                        # -- End function
 	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
 	.p2align	4, 0x90
 	.type	_Z6fooMulii, at function
@@ -112,8 +59,8 @@ _Z6fooMulii:                            # @_Z6fooMulii
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
 	retq
-.Lfunc_end2:
-	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+.Lfunc_end0:
+	.size	_Z6fooMulii, .Lfunc_end0-_Z6fooMulii
 	.cfi_endproc
                                         # -- End function
 	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
@@ -134,8 +81,8 @@ _Z6barMulii:                            # @_Z6barMulii
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
 	retq
-.Lfunc_end3:
-	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+.Lfunc_end1:
+	.size	_Z6barMulii, .Lfunc_end1-_Z6barMulii
 	.cfi_endproc
                                         # -- End function
 	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
@@ -156,8 +103,8 @@ _Z6fooAddii:                            # @_Z6fooAddii
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
 	retq
-.Lfunc_end4:
-	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+.Lfunc_end2:
+	.size	_Z6fooAddii, .Lfunc_end2-_Z6fooAddii
 	.cfi_endproc
                                         # -- End function
 	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
@@ -178,8 +125,8 @@ _Z6barAddii:                            # @_Z6barAddii
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
 	retq
-.Lfunc_end5:
-	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+.Lfunc_end3:
+	.size	_Z6barAddii, .Lfunc_end3-_Z6barAddii
 	.cfi_endproc
                                         # -- End function
 	.globl	_Z7helper1PFKiiiEii             # -- Begin function _Z7helper1PFKiiiEii
@@ -199,25 +146,25 @@ _Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
 	movl	%edx, -24(%rbp)
 	leaq	_Z6barAddii(%rip), %rax
 	cmpq	%rax, -16(%rbp)
-	jne	.LBB6_2
+	jne	.LBB4_2
 # %bb.1:
 	movl	$1, -4(%rbp)
-	jmp	.LBB6_3
-.LBB6_2:
+	jmp	.LBB4_3
+.LBB4_2:
 	movq	-16(%rbp), %rax
 	movl	-20(%rbp), %edi
 	movl	-24(%rbp), %esi
 	callq	*%rax
 	subl	$4, %eax
 	movl	%eax, -4(%rbp)
-.LBB6_3:
+.LBB4_3:
 	movl	-4(%rbp), %eax
 	addq	$32, %rsp
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
 	retq
-.Lfunc_end6:
-	.size	_Z7helper1PFKiiiEii, .Lfunc_end6-_Z7helper1PFKiiiEii
+.Lfunc_end4:
+	.size	_Z7helper1PFKiiiEii, .Lfunc_end4-_Z7helper1PFKiiiEii
 	.cfi_endproc
                                         # -- End function
 	.globl	_Z7helper2PFKiiiES1_ii          # -- Begin function _Z7helper2PFKiiiES1_ii
@@ -238,11 +185,11 @@ _Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
 	movl	%ecx, -32(%rbp)
 	movq	-16(%rbp), %rax
 	cmpq	-24(%rbp), %rax
-	jne	.LBB7_2
+	jne	.LBB5_2
 # %bb.1:
 	movl	$2, -4(%rbp)
-	jmp	.LBB7_3
-.LBB7_2:
+	jmp	.LBB5_3
+.LBB5_2:
 	movq	-16(%rbp), %rax
 	movl	-28(%rbp), %edi
 	movl	-32(%rbp), %esi
@@ -256,14 +203,14 @@ _Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
 	movl	-36(%rbp), %eax                 # 4-byte Reload
 	addl	%ecx, %eax
 	movl	%eax, -4(%rbp)
-.LBB7_3:
+.LBB5_3:
 	movl	-4(%rbp), %eax
 	addq	$48, %rsp
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
 	retq
-.Lfunc_end7:
-	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end7-_Z7helper2PFKiiiES1_ii
+.Lfunc_end5:
+	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end5-_Z7helper2PFKiiiES1_ii
 	.cfi_endproc
                                         # -- End function
 	.globl	main                            # -- Begin function main
@@ -277,7 +224,7 @@ main:                                   # @main
 	.cfi_offset %rbp, -16
 	movq	%rsp, %rbp
 	.cfi_def_cfa_register %rbp
-	subq	$48, %rsp
+	subq	$32, %rsp
 	movl	$0, -4(%rbp)
 	movl	%edi, -8(%rbp)
 	movq	%rsi, -16(%rbp)
@@ -287,7 +234,7 @@ main:                                   # @main
 	movl	(%rax), %edx
 	leaq	_Z6barAddii(%rip), %rdi
 	callq	_Z7helper1PFKiiiEii
-	movl	%eax, -36(%rbp)                 # 4-byte Spill
+	movl	%eax, -28(%rbp)                 # 4-byte Spill
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movl	(%rax), %edx
 	movq	BarVar at GOTPCREL(%rip), %rax
@@ -296,24 +243,6 @@ main:                                   # @main
 	leaq	_Z6barMulii(%rip), %rsi
 	callq	_Z7helper2PFKiiiES1_ii
 	movl	%eax, %ecx
-	movl	-36(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -32(%rbp)                 # 4-byte Spill
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edi
-	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
-	callq	_Z6fooSubii
-	movl	%eax, %ecx
-	movl	-32(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -28(%rbp)                 # 4-byte Spill
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edi
-	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
-	callq	_Z6barSubii
-	movl	%eax, %ecx
 	movl	-28(%rbp), %eax                 # 4-byte Reload
 	addl	%ecx, %eax
 	movl	%eax, -24(%rbp)                 # 4-byte Spill
@@ -327,19 +256,17 @@ main:                                   # @main
 	addl	%ecx, %eax
 	movl	%eax, -20(%rbp)
 	movl	-20(%rbp), %eax
-	addq	$48, %rsp
+	addq	$32, %rsp
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
 	retq
-.Lfunc_end8:
-	.size	main, .Lfunc_end8-main
+.Lfunc_end6:
+	.size	main, .Lfunc_end6-main
 	.cfi_endproc
                                         # -- End function
 	.ident	"clang version 20.0.0git"
 	.section	".note.GNU-stack","", at progbits
 	.addrsig
-	.addrsig_sym _Z6fooSubii
-	.addrsig_sym _Z6barSubii
 	.addrsig_sym _Z6fooMulii
 	.addrsig_sym _Z6barMulii
 	.addrsig_sym _Z6fooAddii
diff --git a/bolt/test/X86/icf-safe-icp.test b/bolt/test/X86/icf-safe-icp.test
index 7b46c6297a40ec..a88a31c620330c 100644
--- a/bolt/test/X86/icf-safe-icp.test
+++ b/bolt/test/X86/icf-safe-icp.test
@@ -8,7 +8,6 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf      -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
-## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
 # ICFCHECK-NEXT: folding _ZN8Derived3D0Ev into _ZN8Derived2D0Ev
 # ICFCHECK-NEXT: folding _ZNK8Derived34funcEii into _ZNK8Derived24funcEii
diff --git a/bolt/test/X86/icf-safe-test1-no-cfg.test b/bolt/test/X86/icf-safe-test1-no-cfg.test
index 8617dfa590d941..bbcac0a18977f1 100644
--- a/bolt/test/X86/icf-safe-test1-no-cfg.test
+++ b/bolt/test/X86/icf-safe-test1-no-cfg.test
@@ -7,7 +7,6 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf=all      -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf --skip-funcs=_Z7helper1PFiiiEii,main -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
-## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
 # ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
diff --git a/bolt/test/X86/icf-safe-test1-no-relocs.test b/bolt/test/X86/icf-safe-test1-no-relocs.test
index c80d35a5f576ff..43be7f19af4bc8 100644
--- a/bolt/test/X86/icf-safe-test1-no-relocs.test
+++ b/bolt/test/X86/icf-safe-test1-no-relocs.test
@@ -7,7 +7,6 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: not llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
-## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
 # ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
diff --git a/bolt/test/X86/icf-safe-test1.test b/bolt/test/X86/icf-safe-test1.test
index b60795d7fa3bee..89479102f1fda6 100644
--- a/bolt/test/X86/icf-safe-test1.test
+++ b/bolt/test/X86/icf-safe-test1.test
@@ -7,7 +7,6 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
-## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
 # ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
index 83e7e798afcd8c..fb72e8413ac8cc 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
@@ -8,17 +8,12 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
-## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
 # ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
-# ICFCHECK-NEXT: folding _Z12barAddHdlperii into _Z6fooAddii
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
-# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 
 # SAFEICFCHECK:      skipping function _Z6fooMulii
 # SAFEICFCHECK-NEXT: skipping function _Z6barMulii
 # SAFEICFCHECK-NEXT: skipping function _Z6barAddii
 # SAFEICFCHECK-NEXT: ICF iteration 1
-# SAFEICFCHECK-NEXT: folding _Z12barAddHdlperii into _Z6fooAddii
-# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 # SAFEICFCHECK-NEXT: ===---------
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
index bef5b71a25c4f6..fe8009d6087cc9 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
@@ -8,7 +8,6 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
-## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
 # ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
 # ICFCHECK-NEXT: folding _Z12barAddHdlperii into _Z6fooAddii
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
index d2c039769e8d23..22d85b92a0454a 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
@@ -8,17 +8,12 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
-## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
 # ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
-# ICFCHECK-NEXT: folding _Z12barAddHdlperii into _Z6fooAddii
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
-# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 
 # SAFEICFCHECK:      skipping function _Z6fooMulii
 # SAFEICFCHECK-NEXT: skipping function _Z6barMulii
 # SAFEICFCHECK-NEXT: skipping function _Z6barAddii
 # SAFEICFCHECK-NEXT: ICF iteration 1
-# SAFEICFCHECK-NEXT: folding _Z12barAddHdlperii into _Z6fooAddii
-# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 # SAFEICFCHECK-NEXT: ===---------
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
index 2a93af6d44220c..9482ac688d8a72 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
@@ -8,7 +8,6 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
-## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
 # ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
 # ICFCHECK-NEXT: folding _Z12barAddHdlperii into _Z6fooAddii
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO0.test b/bolt/test/X86/icf-safe-test2GlobalVarO0.test
index de5c1ebca81e17..cfe2dd0c745321 100644
--- a/bolt/test/X86/icf-safe-test2GlobalVarO0.test
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO0.test
@@ -7,7 +7,6 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
-## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
 # ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO3.test b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
index 06853bfe328904..6557bb9107517c 100644
--- a/bolt/test/X86/icf-safe-test2GlobalVarO3.test
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
@@ -7,7 +7,6 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
-## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
 # ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO0.test b/bolt/test/X86/icf-safe-test3LocalVarO0.test
index 0a88cca49e1bd4..88d6249f405144 100644
--- a/bolt/test/X86/icf-safe-test3LocalVarO0.test
+++ b/bolt/test/X86/icf-safe-test3LocalVarO0.test
@@ -7,7 +7,6 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
-## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
 # ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO3.test b/bolt/test/X86/icf-safe-test3LocalVarO3.test
index d961980df15be6..64419fb568c2b8 100644
--- a/bolt/test/X86/icf-safe-test3LocalVarO3.test
+++ b/bolt/test/X86/icf-safe-test3LocalVarO3.test
@@ -7,7 +7,6 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
-## Check that BOLT successfully folded a function with jump table:
 # ICFCHECK:      ICF iteration 1
 # ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii

>From 39586b3fdf46f1ccda67789e274239081a58677f Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Tue, 19 Nov 2024 18:09:52 -0800
Subject: [PATCH 08/18] addressed comments

---
 bolt/include/bolt/Core/BinaryContext.h          | 6 +++---
 bolt/include/bolt/Passes/IdenticalCodeFolding.h | 4 ++--
 bolt/lib/Core/BinaryContext.cpp                 | 1 +
 3 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/bolt/include/bolt/Core/BinaryContext.h b/bolt/include/bolt/Core/BinaryContext.h
index 318535b2fac239..b7bbf6dcc5808a 100644
--- a/bolt/include/bolt/Core/BinaryContext.h
+++ b/bolt/include/bolt/Core/BinaryContext.h
@@ -277,9 +277,9 @@ class BinaryContext {
 
 public:
   enum class ICFLevel {
-    None,
-    Safe,
-    All,
+    None, // No ICF. (Default)
+    Safe, // Safe ICF for all sections.
+    All,  // Aggressive ICF for code.
   };
   static Expected<std::unique_ptr<BinaryContext>>
   createBinaryContext(Triple TheTriple, StringRef InputFileName,
diff --git a/bolt/include/bolt/Passes/IdenticalCodeFolding.h b/bolt/include/bolt/Passes/IdenticalCodeFolding.h
index 9d8d3ece1a2edf..a7b49daa3cf6ad 100644
--- a/bolt/include/bolt/Passes/IdenticalCodeFolding.h
+++ b/bolt/include/bolt/Passes/IdenticalCodeFolding.h
@@ -40,10 +40,10 @@ class IdenticalCodeFolding : public BinaryFunctionPass {
   Error runOnFunctions(BinaryContext &BC) override;
 
 private:
-  /// Analyses .text section and relocations and marks functions that are not
+  /// Analyze .text section and relocations and mark functions that are not
   /// safe to fold.
   Error markFunctionsUnsafeToFold(BinaryContext &BC);
-  /// Processes relocations in the .data section to identify function
+  /// Process relocations in the .data section to identify function
   /// references.
   void processDataRelocations(BinaryContext &BC,
                               const SectionRef &SecRefRelData);
diff --git a/bolt/lib/Core/BinaryContext.cpp b/bolt/lib/Core/BinaryContext.cpp
index aaa7a125e94147..8e74d3e5d31e1c 100644
--- a/bolt/lib/Core/BinaryContext.cpp
+++ b/bolt/lib/Core/BinaryContext.cpp
@@ -2015,6 +2015,7 @@ static void printDebugInfo(raw_ostream &OS, const MCInst &Instruction,
     OS << " discriminator:" << Row.Discriminator;
 }
 
+/// Skip instructions that are not interesting for safe ICF.
 static bool skipInstruction(const MCInst &Inst, const BinaryContext &BC) {
   const bool IsX86 = BC.isX86();
   return (BC.MIB->isPseudo(Inst) || BC.MIB->isUnconditionalBranch(Inst) ||

>From debeb6f61b04f47120f9ce0f7995ed95251b6563 Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Tue, 19 Nov 2024 18:19:09 -0800
Subject: [PATCH 09/18] updated icf option descriptions

---
 bolt/docs/CommandLineArgumentReference.md |  5 ++++-
 bolt/lib/Core/BinaryContext.cpp           | 22 ++++++++++++----------
 2 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/bolt/docs/CommandLineArgumentReference.md b/bolt/docs/CommandLineArgumentReference.md
index 6d3b797da3787e..91918d614a90f1 100644
--- a/bolt/docs/CommandLineArgumentReference.md
+++ b/bolt/docs/CommandLineArgumentReference.md
@@ -498,9 +498,12 @@
   Automatically put hot code on 2MB page(s) (hugify) at runtime. No manual call
   to hugify is needed in the binary (which is what --hot-text relies on).
 
-- `--icf`
+- `--icf=<value>`
 
   Fold functions with identical code
+  - `all`:  Enable identical code folding
+  - `none`: Disable identical code folding (default)
+  - `safe`: Enable safe identical code folding
 
 - `--icp`
 
diff --git a/bolt/lib/Core/BinaryContext.cpp b/bolt/lib/Core/BinaryContext.cpp
index 8e74d3e5d31e1c..4f96c99e2bd5c9 100644
--- a/bolt/lib/Core/BinaryContext.cpp
+++ b/bolt/lib/Core/BinaryContext.cpp
@@ -76,16 +76,18 @@ cl::opt<std::string> CompDirOverride(
              "to *.dwo files."),
     cl::Hidden, cl::init(""), cl::cat(BoltCategory));
 
-cl::opt<bolt::BinaryContext::ICFLevel> ICF(
-    "icf", cl::desc("fold functions with identical code"),
-    cl::init(bolt::BinaryContext::ICFLevel::None),
-    cl::values(
-        clEnumValN(bolt::BinaryContext::ICFLevel::All, "all", "enable ICF"),
-        clEnumValN(bolt::BinaryContext::ICFLevel::All, "", "enable ICF"),
-        clEnumValN(bolt::BinaryContext::ICFLevel::None, "none", "disable ICF"),
-        clEnumValN(bolt::BinaryContext::ICFLevel::Safe, "safe",
-                   "enable safe ICF")),
-    cl::ZeroOrMore, cl::ValueOptional, cl::cat(BoltOptCategory));
+cl::opt<bolt::BinaryContext::ICFLevel>
+    ICF("icf", cl::desc("fold functions with identical code"),
+        cl::init(bolt::BinaryContext::ICFLevel::None),
+        cl::values(clEnumValN(bolt::BinaryContext::ICFLevel::All, "all",
+                              "Enable identical code folding"),
+                   clEnumValN(bolt::BinaryContext::ICFLevel::All, "",
+                              "Enable identical code folding"),
+                   clEnumValN(bolt::BinaryContext::ICFLevel::None, "none",
+                              "Disable identical code folding (default)"),
+                   clEnumValN(bolt::BinaryContext::ICFLevel::Safe, "safe",
+                              "Enable safe identical code folding")),
+        cl::ZeroOrMore, cl::ValueOptional, cl::cat(BoltOptCategory));
 } // namespace opts
 
 namespace {

>From 429075e4e0b0dc33b0c5e0c91bb8fdeca07d3392 Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Wed, 20 Nov 2024 14:59:19 -0800
Subject: [PATCH 10/18] moved getRelocation* to Relocs.cpp

---
 bolt/include/bolt/Core/BinaryContext.h   |  6 ---
 bolt/include/bolt/Core/Relocation.h      |  7 +++
 bolt/lib/Core/BinaryContext.cpp          | 58 ----------------------
 bolt/lib/Core/Relocation.cpp             | 62 ++++++++++++++++++++++++
 bolt/lib/Passes/IdenticalCodeFolding.cpp |  3 +-
 bolt/lib/Rewrite/RewriteInstance.cpp     |  6 +--
 6 files changed, 73 insertions(+), 69 deletions(-)

diff --git a/bolt/include/bolt/Core/BinaryContext.h b/bolt/include/bolt/Core/BinaryContext.h
index b7bbf6dcc5808a..0ea8276f4fe886 100644
--- a/bolt/include/bolt/Core/BinaryContext.h
+++ b/bolt/include/bolt/Core/BinaryContext.h
@@ -287,12 +287,6 @@ class BinaryContext {
                       std::unique_ptr<DWARFContext> DwCtx,
                       JournalingStreams Logger);
 
-  /// Returns addend of a relocation.
-  static int64_t getRelocationAddend(const ELFObjectFileBase *Obj,
-                                     const RelocationRef &Rel);
-  /// Returns symbol of a relocation.
-  static uint32_t getRelocationSymbol(const ELFObjectFileBase *Obj,
-                                      const RelocationRef &Rel);
   /// Superset of compiler units that will contain overwritten code that needs
   /// new debug info. In a few cases, functions may end up not being
   /// overwritten, but it is okay to re-generate debug info for them.
diff --git a/bolt/include/bolt/Core/Relocation.h b/bolt/include/bolt/Core/Relocation.h
index 933f62a31f8fd7..1fe22e09912f75 100644
--- a/bolt/include/bolt/Core/Relocation.h
+++ b/bolt/include/bolt/Core/Relocation.h
@@ -16,6 +16,8 @@
 
 #include "llvm/MC/MCExpr.h"
 #include "llvm/MC/MCStreamer.h"
+#include "llvm/Object/ELFObjectFile.h"
+#include "llvm/Object/ObjectFile.h"
 #include "llvm/TargetParser/Triple.h"
 
 namespace llvm {
@@ -178,6 +180,11 @@ inline raw_ostream &operator<<(raw_ostream &OS, const Relocation &Rel) {
   return OS;
 }
 
+uint32_t getRelocationSymbol(const object::ELFObjectFileBase *Obj,
+                             const object::RelocationRef &Rel);
+
+int64_t getRelocationAddend(const object::ELFObjectFileBase *Obj,
+                            const object::RelocationRef &Rel);
 } // namespace bolt
 } // namespace llvm
 
diff --git a/bolt/lib/Core/BinaryContext.cpp b/bolt/lib/Core/BinaryContext.cpp
index 4f96c99e2bd5c9..7489f9dc8c3d16 100644
--- a/bolt/lib/Core/BinaryContext.cpp
+++ b/bolt/lib/Core/BinaryContext.cpp
@@ -90,54 +90,6 @@ cl::opt<bolt::BinaryContext::ICFLevel>
         cl::ZeroOrMore, cl::ValueOptional, cl::cat(BoltOptCategory));
 } // namespace opts
 
-namespace {
-template <typename ELFT>
-int64_t getRelocationAddend(const ELFObjectFile<ELFT> *Obj,
-                            const RelocationRef &RelRef) {
-  using ELFShdrTy = typename ELFT::Shdr;
-  using Elf_Rela = typename ELFT::Rela;
-  int64_t Addend = 0;
-  const ELFFile<ELFT> &EF = Obj->getELFFile();
-  DataRefImpl Rel = RelRef.getRawDataRefImpl();
-  const ELFShdrTy *RelocationSection = cantFail(EF.getSection(Rel.d.a));
-  switch (RelocationSection->sh_type) {
-  default:
-    llvm_unreachable("unexpected relocation section type");
-  case ELF::SHT_REL:
-    break;
-  case ELF::SHT_RELA: {
-    const Elf_Rela *RelA = Obj->getRela(Rel);
-    Addend = RelA->r_addend;
-    break;
-  }
-  }
-
-  return Addend;
-}
-
-template <typename ELFT>
-uint32_t getRelocationSymbol(const ELFObjectFile<ELFT> *Obj,
-                             const RelocationRef &RelRef) {
-  using ELFShdrTy = typename ELFT::Shdr;
-  uint32_t Symbol = 0;
-  const ELFFile<ELFT> &EF = Obj->getELFFile();
-  DataRefImpl Rel = RelRef.getRawDataRefImpl();
-  const ELFShdrTy *RelocationSection = cantFail(EF.getSection(Rel.d.a));
-  switch (RelocationSection->sh_type) {
-  default:
-    llvm_unreachable("unexpected relocation section type");
-  case ELF::SHT_REL:
-    Symbol = Obj->getRel(Rel)->getSymbol(EF.isMips64EL());
-    break;
-  case ELF::SHT_RELA:
-    Symbol = Obj->getRela(Rel)->getSymbol(EF.isMips64EL());
-    break;
-  }
-
-  return Symbol;
-}
-} // anonymous namespace
-
 namespace llvm {
 namespace bolt {
 
@@ -218,16 +170,6 @@ BinaryContext::~BinaryContext() {
   clearBinaryData();
 }
 
-uint32_t BinaryContext::getRelocationSymbol(const ELFObjectFileBase *Obj,
-                                            const RelocationRef &Rel) {
-  return ::getRelocationSymbol(cast<ELF64LEObjectFile>(Obj), Rel);
-}
-
-int64_t BinaryContext::getRelocationAddend(const ELFObjectFileBase *Obj,
-                                           const RelocationRef &Rel) {
-  return ::getRelocationAddend(cast<ELF64LEObjectFile>(Obj), Rel);
-}
-
 /// Create BinaryContext for a given architecture \p ArchName and
 /// triple \p TripleName.
 Expected<std::unique_ptr<BinaryContext>> BinaryContext::createBinaryContext(
diff --git a/bolt/lib/Core/Relocation.cpp b/bolt/lib/Core/Relocation.cpp
index 4e888a5b147aca..c3c760d9262198 100644
--- a/bolt/lib/Core/Relocation.cpp
+++ b/bolt/lib/Core/Relocation.cpp
@@ -1115,3 +1115,65 @@ void Relocation::print(raw_ostream &OS) const {
     OS << ", 0x" << Twine::utohexstr(Addend);
   OS << ", 0x" << Twine::utohexstr(Value);
 }
+
+namespace {
+template <typename ELFT>
+int64_t getRelocationAddend(const llvm::object::ELFObjectFile<ELFT> *Obj,
+                            const llvm::object::RelocationRef &RelRef) {
+  using ELFShdrTy = typename ELFT::Shdr;
+  using Elf_Rela = typename ELFT::Rela;
+  int64_t Addend = 0;
+  const llvm::object::ELFFile<ELFT> &EF = Obj->getELFFile();
+  llvm::object::DataRefImpl Rel = RelRef.getRawDataRefImpl();
+  const ELFShdrTy *RelocationSection = cantFail(EF.getSection(Rel.d.a));
+  switch (RelocationSection->sh_type) {
+  default:
+    llvm_unreachable("unexpected relocation section type");
+  case ELF::SHT_REL:
+    break;
+  case ELF::SHT_RELA: {
+    const Elf_Rela *RelA = Obj->getRela(Rel);
+    Addend = RelA->r_addend;
+    break;
+  }
+  }
+
+  return Addend;
+}
+
+template <typename ELFT>
+uint32_t getRelocationSymbol(const llvm::object::ELFObjectFile<ELFT> *Obj,
+                             const llvm::object::RelocationRef &RelRef) {
+  using ELFShdrTy = typename ELFT::Shdr;
+  uint32_t Symbol = 0;
+  const llvm::object::ELFFile<ELFT> &EF = Obj->getELFFile();
+  llvm::object::DataRefImpl Rel = RelRef.getRawDataRefImpl();
+  const ELFShdrTy *RelocationSection = cantFail(EF.getSection(Rel.d.a));
+  switch (RelocationSection->sh_type) {
+  default:
+    llvm_unreachable("unexpected relocation section type");
+  case ELF::SHT_REL:
+    Symbol = Obj->getRel(Rel)->getSymbol(EF.isMips64EL());
+    break;
+  case ELF::SHT_RELA:
+    Symbol = Obj->getRela(Rel)->getSymbol(EF.isMips64EL());
+    break;
+  }
+
+  return Symbol;
+}
+} // namespace
+
+namespace llvm {
+namespace bolt {
+uint32_t getRelocationSymbol(const llvm::object::ELFObjectFileBase *Obj,
+                             const llvm::object::RelocationRef &Rel) {
+  return ::getRelocationSymbol(cast<llvm::object::ELF64LEObjectFile>(Obj), Rel);
+}
+
+int64_t getRelocationAddend(const llvm::object::ELFObjectFileBase *Obj,
+                            const llvm::object::RelocationRef &Rel) {
+  return ::getRelocationAddend(cast<llvm::object::ELF64LEObjectFile>(Obj), Rel);
+}
+} // namespace bolt
+} // namespace llvm
diff --git a/bolt/lib/Passes/IdenticalCodeFolding.cpp b/bolt/lib/Passes/IdenticalCodeFolding.cpp
index 2114bfe874bd18..66dbdbbeda43b7 100644
--- a/bolt/lib/Passes/IdenticalCodeFolding.cpp
+++ b/bolt/lib/Passes/IdenticalCodeFolding.cpp
@@ -11,7 +11,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "bolt/Passes/IdenticalCodeFolding.h"
-#include "bolt/Core/BinaryContext.h"
 #include "bolt/Core/HashUtilities.h"
 #include "bolt/Core/ParallelUtilities.h"
 #include "bolt/Rewrite/RewriteInstance.h"
@@ -356,7 +355,7 @@ void IdenticalCodeFolding::processDataRelocations(
     const ELFObjectFileBase *ELFObj = dyn_cast<ELFObjectFileBase>(OwningObj);
     if (!ELFObj)
       llvm_unreachable("Only ELFObjectFileBase is supported");
-    const int64_t Addend = BinaryContext::getRelocationAddend(ELFObj, Rel);
+    const int64_t Addend = getRelocationAddend(ELFObj, Rel);
     BinaryFunction *BF = BC.getBinaryFunctionAtAddress(SymbolAddress + Addend);
     if (!BF)
       continue;
diff --git a/bolt/lib/Rewrite/RewriteInstance.cpp b/bolt/lib/Rewrite/RewriteInstance.cpp
index 70c9eeef3cdc57..42e1231eeed1ab 100644
--- a/bolt/lib/Rewrite/RewriteInstance.cpp
+++ b/bolt/lib/Rewrite/RewriteInstance.cpp
@@ -2138,7 +2138,7 @@ bool RewriteInstance::analyzeRelocation(
     return true;
 
   ExtractedValue = Relocation::extractValue(RType, *Value, Rel.getOffset());
-  Addend = BinaryContext::getRelocationAddend(InputFile, Rel);
+  Addend = getRelocationAddend(InputFile, Rel);
 
   const bool IsPCRelative = Relocation::isPCRelative(RType);
   const uint64_t PCRelOffset = IsPCRelative && !IsAArch64 ? Rel.getOffset() : 0;
@@ -2338,7 +2338,7 @@ void RewriteInstance::readDynamicRelocations(const SectionRef &Section,
     StringRef SymbolName = "<none>";
     MCSymbol *Symbol = nullptr;
     uint64_t SymbolAddress = 0;
-    const uint64_t Addend = BinaryContext::getRelocationAddend(InputFile, Rel);
+    const uint64_t Addend = getRelocationAddend(InputFile, Rel);
 
     symbol_iterator SymbolIter = Rel.getSymbol();
     if (SymbolIter != InputFile->symbol_end()) {
@@ -2363,7 +2363,7 @@ void RewriteInstance::readDynamicRelocations(const SectionRef &Section,
       IsJmpRelocation[RType] = true;
 
     if (Symbol)
-      SymbolIndex[Symbol] = BinaryContext::getRelocationSymbol(InputFile, Rel);
+      SymbolIndex[Symbol] = getRelocationSymbol(InputFile, Rel);
 
     BC->addDynamicRelocation(Rel.getOffset(), Symbol, RType, Addend);
   }

>From 29cc4660efd53677a9fc60eef3ec6b6df5dd5e91 Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Wed, 20 Nov 2024 15:38:12 -0800
Subject: [PATCH 11/18] moved code around

---
 bolt/lib/Passes/IdenticalCodeFolding.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/bolt/lib/Passes/IdenticalCodeFolding.cpp b/bolt/lib/Passes/IdenticalCodeFolding.cpp
index 66dbdbbeda43b7..7d2560cca2d468 100644
--- a/bolt/lib/Passes/IdenticalCodeFolding.cpp
+++ b/bolt/lib/Passes/IdenticalCodeFolding.cpp
@@ -365,7 +365,6 @@ void IdenticalCodeFolding::processDataRelocations(
 
 Error IdenticalCodeFolding::markFunctionsUnsafeToFold(BinaryContext &BC) {
   Error ErrorStatus = Error::success();
-  ErrorOr<BinarySection &> SecRelData = BC.getUniqueSectionByName(".rela.data");
   if (!BC.HasRelocations)
     ErrorStatus = joinErrors(
         std::move(ErrorStatus),
@@ -373,6 +372,7 @@ Error IdenticalCodeFolding::markFunctionsUnsafeToFold(BinaryContext &BC) {
                                    "relocations. Safe ICF is not supported")));
   if (ErrorStatus)
     return ErrorStatus;
+  ErrorOr<BinarySection &> SecRelData = BC.getUniqueSectionByName(".rela.data");
   if (SecRelData) {
     SectionRef SecRefRelData = SecRelData->getSectionRef();
     processDataRelocations(BC, SecRefRelData);

>From bf3bf2b413b8df2aa3ed11dab4a4380a6c25f7e4 Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Thu, 21 Nov 2024 17:54:07 -0800
Subject: [PATCH 12/18] simplified assembly

---
 ...lperSafeICFGlobalConstPtrNoPicExtFuncRef.s |  31 +--
 ...helperSafeICFGlobalConstPtrPicExtFuncRef.s |  29 ---
 .../Inputs/mainSafeICFGlobalConstPtrNoPic.s   | 142 +------------
 ...mainSafeICFGlobalConstPtrNoPicExtFuncRef.s | 188 +----------------
 .../X86/Inputs/mainSafeICFGlobalConstPtrPic.s | 150 +-------------
 .../mainSafeICFGlobalConstPtrPicExtFuncRef.s  | 190 +-----------------
 bolt/test/X86/Inputs/mainSafeICFICPTest.s     |  84 +-------
 bolt/test/X86/Inputs/mainSafeICFTest1.s       | 177 +---------------
 .../X86/Inputs/mainSafeICFTest2GlobalVarO0.s  | 185 +----------------
 .../X86/Inputs/mainSafeICFTest2GlobalVarO3.s  | 119 +----------
 .../X86/Inputs/mainSafeICFTest3LocalVarO0.s   | 185 +----------------
 .../X86/Inputs/mainSafeICFTest3LocalVarO3.s   | 119 +----------
 bolt/test/X86/icf-safe-test2GlobalVarO3.test  |   2 +-
 bolt/test/X86/icf-safe-test3LocalVarO3.test   |   2 +-
 14 files changed, 21 insertions(+), 1582 deletions(-)

diff --git a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPicExtFuncRef.s b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPicExtFuncRef.s
index 489400c3ccaa63..09259e0c3cd2d7 100644
--- a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPicExtFuncRef.s
+++ b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPicExtFuncRef.s
@@ -11,7 +11,7 @@
 # MY_CONST int fooGlobalFuncHelper(int a, int b) {
 #   return 5 + funcGlobalBarMulExt(a, b);
 # }
-
+# Manually modified to remove "extra" assembly.
 
 	.text
 	.file	"helper.cpp"
@@ -20,18 +20,7 @@
 	.type	_Z12barAddHdlperii, at function
 _Z12barAddHdlperii:                     # @_Z12barAddHdlperii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	addl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end0:
 	.size	_Z12barAddHdlperii, .Lfunc_end0-_Z12barAddHdlperii
@@ -42,22 +31,7 @@ _Z12barAddHdlperii:                     # @_Z12barAddHdlperii
 	.type	_Z19fooGlobalFuncHelperii, at function
 _Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$16, %rsp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %edi
-	movl	-8(%rbp), %esi
 	callq	_Z12barAddHdlperii
-	addl	$5, %eax
-	addq	$16, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end1:
 	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end1-_Z19fooGlobalFuncHelperii
@@ -79,6 +53,3 @@ BarVar:
 	.size	BarVar, 4
 
 	.ident	"clang version 20.0.0git"
-	.section	".note.GNU-stack","", at progbits
-	.addrsig
-	.addrsig_sym _Z12barAddHdlperii
diff --git a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPicExtFuncRef.s b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPicExtFuncRef.s
index 489400c3ccaa63..836ff0e247ce79 100644
--- a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPicExtFuncRef.s
+++ b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPicExtFuncRef.s
@@ -20,18 +20,7 @@
 	.type	_Z12barAddHdlperii, at function
 _Z12barAddHdlperii:                     # @_Z12barAddHdlperii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	addl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end0:
 	.size	_Z12barAddHdlperii, .Lfunc_end0-_Z12barAddHdlperii
@@ -42,22 +31,7 @@ _Z12barAddHdlperii:                     # @_Z12barAddHdlperii
 	.type	_Z19fooGlobalFuncHelperii, at function
 _Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$16, %rsp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %edi
-	movl	-8(%rbp), %esi
 	callq	_Z12barAddHdlperii
-	addl	$5, %eax
-	addq	$16, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end1:
 	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end1-_Z19fooGlobalFuncHelperii
@@ -79,6 +53,3 @@ BarVar:
 	.size	BarVar, 4
 
 	.ident	"clang version 20.0.0git"
-	.section	".note.GNU-stack","", at progbits
-	.addrsig
-	.addrsig_sym _Z12barAddHdlperii
diff --git a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s
index 11465a0b1ffd0a..ddc1906d8c5818 100644
--- a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s
+++ b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s
@@ -39,6 +39,7 @@
 #   MY_PRINTF("val: %d", temp);
 #   return temp;
 # }
+# Manually modified to remove "extra" assembly.
 	.text
 	.file	"main.cpp"
 	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
@@ -46,15 +47,6 @@
 	.type	_Z6fooMulii, at function
 _Z6fooMulii:                            # @_Z6fooMulii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	imull	-8(%rbp), %eax
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
@@ -68,15 +60,6 @@ _Z6fooMulii:                            # @_Z6fooMulii
 	.type	_Z6barMulii, at function
 _Z6barMulii:                            # @_Z6barMulii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	imull	-8(%rbp), %eax
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
@@ -90,15 +73,6 @@ _Z6barMulii:                            # @_Z6barMulii
 	.type	_Z6fooAddii, at function
 _Z6fooAddii:                            # @_Z6fooAddii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	addl	-8(%rbp), %eax
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
@@ -112,15 +86,6 @@ _Z6fooAddii:                            # @_Z6fooAddii
 	.type	_Z6barAddii, at function
 _Z6barAddii:                            # @_Z6barAddii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	addl	-8(%rbp), %eax
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
@@ -134,34 +99,8 @@ _Z6barAddii:                            # @_Z6barAddii
 	.type	_Z7helper1PFKiiiEii, at function
 _Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$32, %rsp
-	movq	%rdi, -16(%rbp)
-	movl	%esi, -20(%rbp)
-	movl	%edx, -24(%rbp)
 	movabsq	$_Z6barAddii, %rax
 	cmpq	%rax, -16(%rbp)
-	jne	.LBB4_2
-# %bb.1:
-	movl	$1, -4(%rbp)
-	jmp	.LBB4_3
-.LBB4_2:
-	movq	-16(%rbp), %rax
-	movl	-20(%rbp), %edi
-	movl	-24(%rbp), %esi
-	callq	*%rax
-	subl	$4, %eax
-	movl	%eax, -4(%rbp)
-.LBB4_3:
-	movl	-4(%rbp), %eax
-	addq	$32, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end4:
 	.size	_Z7helper1PFKiiiEii, .Lfunc_end4-_Z7helper1PFKiiiEii
@@ -171,43 +110,8 @@ _Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
 	.p2align	4, 0x90
 	.type	_Z7helper2PFKiiiES1_ii, at function
 _Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
-	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$48, %rsp
-	movq	%rdi, -16(%rbp)
-	movq	%rsi, -24(%rbp)
-	movl	%edx, -28(%rbp)
-	movl	%ecx, -32(%rbp)
-	movq	-16(%rbp), %rax
-	cmpq	-24(%rbp), %rax
-	jne	.LBB5_2
-# %bb.1:
-	movl	$2, -4(%rbp)
-	jmp	.LBB5_3
-.LBB5_2:
-	movq	-16(%rbp), %rax
-	movl	-28(%rbp), %edi
-	movl	-32(%rbp), %esi
-	callq	*%rax
-	movl	%eax, -36(%rbp)                 # 4-byte Spill
-	movq	-24(%rbp), %rax
-	movl	-28(%rbp), %edi
-	movl	-32(%rbp), %esi
-	callq	*%rax
-	movl	%eax, %ecx
-	movl	-36(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -4(%rbp)
-.LBB5_3:
-	movl	-4(%rbp), %eax
-	addq	$48, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
+  .cfi_startproc
+  # no direct function references.
 	retq
 .Lfunc_end5:
 	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end5-_Z7helper2PFKiiiES1_ii
@@ -218,16 +122,6 @@ _Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
 	.type	main, at function
 main:                                   # @main
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$32, %rsp
-	movl	$0, -4(%rbp)
-	movl	%edi, -8(%rbp)
-	movq	%rsi, -16(%rbp)
 	movl	FooVar, %esi
 	movl	BarVar, %edx
 	movabsq	$_Z6barAddii, %rdi
@@ -238,25 +132,6 @@ main:                                   # @main
 	movabsq	$_Z6fooMulii, %rdi
 	movabsq	$_Z6barMulii, %rsi
 	callq	_Z7helper2PFKiiiES1_ii
-	movl	%eax, %ecx
-	movl	-28(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -24(%rbp)                 # 4-byte Spill
-	movl	FooVar, %edi
-	movl	BarVar, %esi
-	callq	_Z6fooAddii
-	movl	%eax, %ecx
-	movl	-24(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -20(%rbp)
-	movl	-20(%rbp), %esi
-	movabsq	$.L.str, %rdi
-	movb	$0, %al
-	callq	printf
-	movl	-20(%rbp), %eax
-	addq	$32, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end6:
 	.size	main, .Lfunc_end6-main
@@ -269,14 +144,3 @@ main:                                   # @main
 	.size	.L.str, 9
 
 	.ident	"clang version 20.0.0git"
-	.section	".note.GNU-stack","", at progbits
-	.addrsig
-	.addrsig_sym _Z6fooMulii
-	.addrsig_sym _Z6barMulii
-	.addrsig_sym _Z6fooAddii
-	.addrsig_sym _Z6barAddii
-	.addrsig_sym _Z7helper1PFKiiiEii
-	.addrsig_sym _Z7helper2PFKiiiES1_ii
-	.addrsig_sym printf
-	.addrsig_sym FooVar
-	.addrsig_sym BarVar
diff --git a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s
index 40f30cbbc30550..44d4a388995028 100644
--- a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s
+++ b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s
@@ -49,7 +49,7 @@
 #   MY_PRINTF("val: %d", temp);
 #   return temp;
 # }
-
+# Manually modified to remove "extra" assembly.
 	.text
 	.file	"main.cpp"
 	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
@@ -57,18 +57,7 @@
 	.type	_Z6fooSubii, at function
 _Z6fooSubii:                            # @_Z6fooSubii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	subl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end0:
 	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
@@ -79,18 +68,7 @@ _Z6fooSubii:                            # @_Z6fooSubii
 	.type	_Z6barSubii, at function
 _Z6barSubii:                            # @_Z6barSubii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	subl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end1:
 	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
@@ -101,18 +79,7 @@ _Z6barSubii:                            # @_Z6barSubii
 	.type	_Z6fooMulii, at function
 _Z6fooMulii:                            # @_Z6fooMulii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	imull	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end2:
 	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
@@ -123,18 +90,7 @@ _Z6fooMulii:                            # @_Z6fooMulii
 	.type	_Z6barMulii, at function
 _Z6barMulii:                            # @_Z6barMulii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	imull	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end3:
 	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
@@ -145,18 +101,7 @@ _Z6barMulii:                            # @_Z6barMulii
 	.type	_Z6fooAddii, at function
 _Z6fooAddii:                            # @_Z6fooAddii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	addl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end4:
 	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
@@ -165,20 +110,9 @@ _Z6fooAddii:                            # @_Z6fooAddii
 	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
 	.p2align	4, 0x90
 	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
-	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
+_Z6barAddii:
+  .cfi_startproc                           # @_Z6barAddii
 	addl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end5:
 	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
@@ -189,34 +123,8 @@ _Z6barAddii:                            # @_Z6barAddii
 	.type	_Z7helper1PFKiiiEii, at function
 _Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$32, %rsp
-	movq	%rdi, -16(%rbp)
-	movl	%esi, -20(%rbp)
-	movl	%edx, -24(%rbp)
 	movabsq	$_Z6barAddii, %rax
 	cmpq	%rax, -16(%rbp)
-	jne	.LBB6_2
-# %bb.1:
-	movl	$1, -4(%rbp)
-	jmp	.LBB6_3
-.LBB6_2:
-	movq	-16(%rbp), %rax
-	movl	-20(%rbp), %edi
-	movl	-24(%rbp), %esi
-	callq	*%rax
-	subl	$4, %eax
-	movl	%eax, -4(%rbp)
-.LBB6_3:
-	movl	-4(%rbp), %eax
-	addq	$32, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end6:
 	.size	_Z7helper1PFKiiiEii, .Lfunc_end6-_Z7helper1PFKiiiEii
@@ -227,42 +135,7 @@ _Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
 	.type	_Z7helper2PFKiiiES1_ii, at function
 _Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$48, %rsp
-	movq	%rdi, -16(%rbp)
-	movq	%rsi, -24(%rbp)
-	movl	%edx, -28(%rbp)
-	movl	%ecx, -32(%rbp)
-	movq	-16(%rbp), %rax
-	cmpq	-24(%rbp), %rax
-	jne	.LBB7_2
-# %bb.1:
-	movl	$2, -4(%rbp)
-	jmp	.LBB7_3
-.LBB7_2:
-	movq	-16(%rbp), %rax
-	movl	-28(%rbp), %edi
-	movl	-32(%rbp), %esi
-	callq	*%rax
-	movl	%eax, -36(%rbp)                 # 4-byte Spill
-	movq	-24(%rbp), %rax
-	movl	-28(%rbp), %edi
-	movl	-32(%rbp), %esi
-	callq	*%rax
-	movl	%eax, %ecx
-	movl	-36(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -4(%rbp)
-.LBB7_3:
-	movl	-4(%rbp), %eax
-	addq	$48, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
+  # All operations on registers.
 	retq
 .Lfunc_end7:
 	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end7-_Z7helper2PFKiiiES1_ii
@@ -273,71 +146,18 @@ _Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
 	.type	main, at function
 main:                                   # @main
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$48, %rsp
-	movl	$0, -4(%rbp)
-	movl	%edi, -8(%rbp)
-	movq	%rsi, -16(%rbp)
 	movl	FooVar, %esi
 	movl	BarVar, %edx
 	movabsq	$_Z12barAddHdlperii, %rdi
 	callq	_Z7helper1PFKiiiEii
-	movl	%eax, -36(%rbp)                 # 4-byte Spill
 	movl	FooVar, %edx
 	movl	BarVar, %ecx
 	movabsq	$_Z6fooMulii, %rdi
 	movabsq	$_Z19fooGlobalFuncHelperii, %rsi
 	callq	_Z7helper2PFKiiiES1_ii
-	movl	%eax, %ecx
-	movl	-36(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -32(%rbp)                 # 4-byte Spill
-	movl	FooVar, %edi
-	movl	BarVar, %esi
-	callq	_Z6fooSubii
-	movl	%eax, %ecx
-	movl	-32(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -28(%rbp)                 # 4-byte Spill
-	movl	FooVar, %edi
-	movl	BarVar, %esi
-	callq	_Z6barSubii
-	movl	%eax, %ecx
-	movl	-28(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -24(%rbp)                 # 4-byte Spill
-	movl	FooVar, %edi
-	movl	BarVar, %esi
-	callq	_Z6fooAddii
-	movl	%eax, %ecx
-	movl	-24(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -20(%rbp)
-	movl	-20(%rbp), %eax
-	addq	$48, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
 	.cfi_endproc
                                         # -- End function
 	.ident	"clang version 20.0.0git"
-	.section	".note.GNU-stack","", at progbits
-	.addrsig
-	.addrsig_sym _Z6fooSubii
-	.addrsig_sym _Z6barSubii
-	.addrsig_sym _Z6fooMulii
-	.addrsig_sym _Z6fooAddii
-	.addrsig_sym _Z6barAddii
-	.addrsig_sym _Z7helper1PFKiiiEii
-	.addrsig_sym _Z7helper2PFKiiiES1_ii
-	.addrsig_sym _Z12barAddHdlperii
-	.addrsig_sym _Z19fooGlobalFuncHelperii
-	.addrsig_sym FooVar
-	.addrsig_sym BarVar
diff --git a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s
index 3c878a7de8e6b8..3366b94f3ac9b5 100644
--- a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s
+++ b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s
@@ -39,6 +39,7 @@
 #   MY_PRINTF("val: %d", temp);
 #   return temp;
 # }
+# Manually modified to remove "extra" assembly.
 	.text
 	.file	"main.cpp"
 	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
@@ -46,18 +47,7 @@
 	.type	_Z6fooMulii, at function
 _Z6fooMulii:                            # @_Z6fooMulii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	imull	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end0:
 	.size	_Z6fooMulii, .Lfunc_end0-_Z6fooMulii
@@ -68,18 +58,7 @@ _Z6fooMulii:                            # @_Z6fooMulii
 	.type	_Z6barMulii, at function
 _Z6barMulii:                            # @_Z6barMulii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	imull	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end1:
 	.size	_Z6barMulii, .Lfunc_end1-_Z6barMulii
@@ -90,18 +69,7 @@ _Z6barMulii:                            # @_Z6barMulii
 	.type	_Z6fooAddii, at function
 _Z6fooAddii:                            # @_Z6fooAddii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	addl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end2:
 	.size	_Z6fooAddii, .Lfunc_end2-_Z6fooAddii
@@ -112,18 +80,7 @@ _Z6fooAddii:                            # @_Z6fooAddii
 	.type	_Z6barAddii, at function
 _Z6barAddii:                            # @_Z6barAddii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	addl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end3:
 	.size	_Z6barAddii, .Lfunc_end3-_Z6barAddii
@@ -134,34 +91,8 @@ _Z6barAddii:                            # @_Z6barAddii
 	.type	_Z7helper1PFKiiiEii, at function
 _Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$32, %rsp
-	movq	%rdi, -16(%rbp)
-	movl	%esi, -20(%rbp)
-	movl	%edx, -24(%rbp)
 	leaq	_Z6barAddii(%rip), %rax
 	cmpq	%rax, -16(%rbp)
-	jne	.LBB4_2
-# %bb.1:
-	movl	$1, -4(%rbp)
-	jmp	.LBB4_3
-.LBB4_2:
-	movq	-16(%rbp), %rax
-	movl	-20(%rbp), %edi
-	movl	-24(%rbp), %esi
-	callq	*%rax
-	subl	$4, %eax
-	movl	%eax, -4(%rbp)
-.LBB4_3:
-	movl	-4(%rbp), %eax
-	addq	$32, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end4:
 	.size	_Z7helper1PFKiiiEii, .Lfunc_end4-_Z7helper1PFKiiiEii
@@ -172,42 +103,7 @@ _Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
 	.type	_Z7helper2PFKiiiES1_ii, at function
 _Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$48, %rsp
-	movq	%rdi, -16(%rbp)
-	movq	%rsi, -24(%rbp)
-	movl	%edx, -28(%rbp)
-	movl	%ecx, -32(%rbp)
-	movq	-16(%rbp), %rax
-	cmpq	-24(%rbp), %rax
-	jne	.LBB5_2
-# %bb.1:
-	movl	$2, -4(%rbp)
-	jmp	.LBB5_3
-.LBB5_2:
-	movq	-16(%rbp), %rax
-	movl	-28(%rbp), %edi
-	movl	-32(%rbp), %esi
-	callq	*%rax
-	movl	%eax, -36(%rbp)                 # 4-byte Spill
-	movq	-24(%rbp), %rax
-	movl	-28(%rbp), %edi
-	movl	-32(%rbp), %esi
-	callq	*%rax
-	movl	%eax, %ecx
-	movl	-36(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -4(%rbp)
-.LBB5_3:
-	movl	-4(%rbp), %eax
-	addq	$48, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
+  # Operates on registers.
 	retq
 .Lfunc_end5:
 	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end5-_Z7helper2PFKiiiES1_ii
@@ -218,60 +114,18 @@ _Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
 	.type	main, at function
 main:                                   # @main
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$32, %rsp
-	movl	$0, -4(%rbp)
-	movl	%edi, -8(%rbp)
-	movq	%rsi, -16(%rbp)
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edx
 	leaq	_Z6barAddii(%rip), %rdi
 	callq	_Z7helper1PFKiiiEii
-	movl	%eax, -28(%rbp)                 # 4-byte Spill
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edx
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %ecx
 	leaq	_Z6fooMulii(%rip), %rdi
 	leaq	_Z6barMulii(%rip), %rsi
 	callq	_Z7helper2PFKiiiES1_ii
-	movl	%eax, %ecx
-	movl	-28(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -24(%rbp)                 # 4-byte Spill
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edi
-	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
-	callq	_Z6fooAddii
-	movl	%eax, %ecx
-	movl	-24(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -20(%rbp)
-	movl	-20(%rbp), %eax
-	addq	$32, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end6:
 	.size	main, .Lfunc_end6-main
 	.cfi_endproc
                                         # -- End function
 	.ident	"clang version 20.0.0git"
-	.section	".note.GNU-stack","", at progbits
-	.addrsig
-	.addrsig_sym _Z6fooMulii
-	.addrsig_sym _Z6barMulii
-	.addrsig_sym _Z6fooAddii
-	.addrsig_sym _Z6barAddii
-	.addrsig_sym _Z7helper1PFKiiiEii
-	.addrsig_sym _Z7helper2PFKiiiES1_ii
-	.addrsig_sym FooVar
-	.addrsig_sym BarVar
diff --git a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s
index a7da985b93bc38..913a1349312a29 100644
--- a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s
+++ b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s
@@ -57,18 +57,7 @@
 	.type	_Z6fooSubii, at function
 _Z6fooSubii:                            # @_Z6fooSubii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	subl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end0:
 	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
@@ -79,18 +68,7 @@ _Z6fooSubii:                            # @_Z6fooSubii
 	.type	_Z6barSubii, at function
 _Z6barSubii:                            # @_Z6barSubii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	subl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end1:
 	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
@@ -101,18 +79,7 @@ _Z6barSubii:                            # @_Z6barSubii
 	.type	_Z6fooMulii, at function
 _Z6fooMulii:                            # @_Z6fooMulii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	imull	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end2:
 	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
@@ -123,18 +90,7 @@ _Z6fooMulii:                            # @_Z6fooMulii
 	.type	_Z6barMulii, at function
 _Z6barMulii:                            # @_Z6barMulii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	imull	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end3:
 	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
@@ -145,18 +101,7 @@ _Z6barMulii:                            # @_Z6barMulii
 	.type	_Z6fooAddii, at function
 _Z6fooAddii:                            # @_Z6fooAddii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	addl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end4:
 	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
@@ -167,18 +112,7 @@ _Z6fooAddii:                            # @_Z6fooAddii
 	.type	_Z6barAddii, at function
 _Z6barAddii:                            # @_Z6barAddii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	addl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end5:
 	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
@@ -189,34 +123,8 @@ _Z6barAddii:                            # @_Z6barAddii
 	.type	_Z7helper1PFKiiiEii, at function
 _Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$32, %rsp
-	movq	%rdi, -16(%rbp)
-	movl	%esi, -20(%rbp)
-	movl	%edx, -24(%rbp)
 	leaq	_Z6barAddii(%rip), %rax
 	cmpq	%rax, -16(%rbp)
-	jne	.LBB6_2
-# %bb.1:
-	movl	$1, -4(%rbp)
-	jmp	.LBB6_3
-.LBB6_2:
-	movq	-16(%rbp), %rax
-	movl	-20(%rbp), %edi
-	movl	-24(%rbp), %esi
-	callq	*%rax
-	subl	$4, %eax
-	movl	%eax, -4(%rbp)
-.LBB6_3:
-	movl	-4(%rbp), %eax
-	addq	$32, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end6:
 	.size	_Z7helper1PFKiiiEii, .Lfunc_end6-_Z7helper1PFKiiiEii
@@ -227,42 +135,7 @@ _Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
 	.type	_Z7helper2PFKiiiES1_ii, at function
 _Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$48, %rsp
-	movq	%rdi, -16(%rbp)
-	movq	%rsi, -24(%rbp)
-	movl	%edx, -28(%rbp)
-	movl	%ecx, -32(%rbp)
-	movq	-16(%rbp), %rax
-	cmpq	-24(%rbp), %rax
-	jne	.LBB7_2
-# %bb.1:
-	movl	$2, -4(%rbp)
-	jmp	.LBB7_3
-.LBB7_2:
-	movq	-16(%rbp), %rax
-	movl	-28(%rbp), %edi
-	movl	-32(%rbp), %esi
-	callq	*%rax
-	movl	%eax, -36(%rbp)                 # 4-byte Spill
-	movq	-24(%rbp), %rax
-	movl	-28(%rbp), %edi
-	movl	-32(%rbp), %esi
-	callq	*%rax
-	movl	%eax, %ecx
-	movl	-36(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -4(%rbp)
-.LBB7_3:
-	movl	-4(%rbp), %eax
-	addq	$48, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
+  # Operates on registers.
 	retq
 .Lfunc_end7:
 	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end7-_Z7helper2PFKiiiES1_ii
@@ -273,69 +146,24 @@ _Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
 	.type	main, at function
 main:                                   # @main
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$48, %rsp
-	movl	$0, -4(%rbp)
-	movl	%edi, -8(%rbp)
-	movq	%rsi, -16(%rbp)
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edx
 	movq	_Z12barAddHdlperii at GOTPCREL(%rip), %rdi
 	callq	_Z7helper1PFKiiiEii
-	movl	%eax, -36(%rbp)                 # 4-byte Spill
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edx
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %ecx
 	leaq	_Z6fooMulii(%rip), %rdi
 	movq	_Z19fooGlobalFuncHelperii at GOTPCREL(%rip), %rsi
 	callq	_Z7helper2PFKiiiES1_ii
-	movl	%eax, %ecx
-	movl	-36(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -32(%rbp)                 # 4-byte Spill
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edi
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
 	callq	_Z6fooSubii
-	movl	%eax, %ecx
-	movl	-32(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -28(%rbp)                 # 4-byte Spill
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edi
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
-	callq	_Z6barSubii
-	movl	%eax, %ecx
-	movl	-28(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -24(%rbp)                 # 4-byte Spill
+	callq	_Z6barSubii               # 4-byte Spill
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edi
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
 	callq	_Z6fooAddii
-	movl	%eax, %ecx
-	movl	-24(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -20(%rbp)
-	movl	-20(%rbp), %esi
-	leaq	.L.str(%rip), %rdi
-	movb	$0, %al
-	callq	printf at PLT
-	movl	-20(%rbp), %eax
-	addq	$48, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
@@ -348,17 +176,3 @@ main:                                   # @main
 	.size	.L.str, 9
 
 	.ident	"clang version 20.0.0git"
-	.section	".note.GNU-stack","", at progbits
-	.addrsig
-	.addrsig_sym _Z6fooSubii
-	.addrsig_sym _Z6barSubii
-	.addrsig_sym _Z6fooMulii
-	.addrsig_sym _Z6fooAddii
-	.addrsig_sym _Z6barAddii
-	.addrsig_sym _Z7helper1PFKiiiEii
-	.addrsig_sym _Z7helper2PFKiiiES1_ii
-	.addrsig_sym _Z12barAddHdlperii
-	.addrsig_sym _Z19fooGlobalFuncHelperii
-	.addrsig_sym printf
-	.addrsig_sym FooVar
-	.addrsig_sym BarVar
diff --git a/bolt/test/X86/Inputs/mainSafeICFICPTest.s b/bolt/test/X86/Inputs/mainSafeICFICPTest.s
index 4b12acdeae0995..665256da48e777 100644
--- a/bolt/test/X86/Inputs/mainSafeICFICPTest.s
+++ b/bolt/test/X86/Inputs/mainSafeICFICPTest.s
@@ -60,6 +60,7 @@
 #   sum += ptr->func(b, a) + ptr2->func(b, a);
 #   return 0;
 # }
+# Manually modified to remove "extra" assembly.
   .text
 	.file	"main.cpp"
 	.section	.text.hot.,"ax", at progbits
@@ -68,26 +69,10 @@
 	.type	_Z10createTypei, at function
 _Z10createTypei:                        # @_Z10createTypei
 	.cfi_startproc
-# %bb.0:                                # %entry
-	pushq	%rbx
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbx, -16
-	movl	%edi, %ebx
-	movl	$16, %edi
 	callq	_Znwm at PLT
-	cmpl	$4, %ebx
-	xorps	%xmm0, %xmm0
 	leaq	_ZTV8Derived2+16(%rip), %rcx
 	leaq	_ZTV8Derived3+16(%rip), %rdx
 	cmoveq	%rcx, %rdx
-	movl	$5, %ecx
-	movl	$500, %esi                      # imm = 0x1F4
-	cmovel	%ecx, %esi
-	movaps	%xmm0, (%rax)
-	movq	%rdx, (%rax)
-	movl	%esi, 8(%rax)
-	popq	%rbx
-	.cfi_def_cfa_offset 8
 	retq
 .Lfunc_end0:
 	.size	_Z10createTypei, .Lfunc_end0-_Z10createTypei
@@ -98,71 +83,22 @@ _Z10createTypei:                        # @_Z10createTypei
 	.type	main, at function
 main:                                   # @main
 	.cfi_startproc
-# %bb.0:                                # %entry
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	pushq	%r15
-	.cfi_def_cfa_offset 24
-	pushq	%r14
-	.cfi_def_cfa_offset 32
-	pushq	%rbx
-	.cfi_def_cfa_offset 40
-	pushq	%rax
-	.cfi_def_cfa_offset 48
-	.cfi_offset %rbx, -40
-	.cfi_offset %r14, -32
-	.cfi_offset %r15, -24
-	.cfi_offset %rbp, -16
 	callq	_Z16returnFourOrFivei at PLT
-	movl	%eax, %ebx
 	callq	_Z10returnFivev at PLT
-	movl	%eax, %ebp
-	movl	%ebx, %edi
 	callq	_Z10createTypei
-	movq	%rax, %r15
-	movl	%ebp, %edi
 	callq	_Z10createTypei
-	movq	%rax, %r14
-	movq	(%r15), %rax
-	movq	(%rax), %rax
 	leaq	_ZNK8Derived24funcEii(%rip), %rcx
-	movq	%r15, %rdi
-	movl	%ebp, %esi
-	movl	%ebx, %edx
-	cmpq	%rcx, %rax
 	jne	.LBB1_2
-# %bb.1:                                # %if.true.direct_targ
 	callq	_ZNK8Derived24funcEii
 .LBB1_3:                                # %if.end.icp
-	movq	(%r14), %rax
-	movq	(%rax), %rax
 	leaq	_ZNK8Derived34funcEii(%rip), %rcx
-	movq	%r14, %rdi
-	movl	%ebp, %esi
-	movl	%ebx, %edx
-	cmpq	%rcx, %rax
 	jne	.LBB1_5
-# %bb.4:                                # %if.true.direct_targ1
 	callq	_ZNK8Derived34funcEii
 .LBB1_6:                                # %if.end.icp3
-	xorl	%eax, %eax
-	addq	$8, %rsp
-	.cfi_def_cfa_offset 40
-	popq	%rbx
-	.cfi_def_cfa_offset 32
-	popq	%r14
-	.cfi_def_cfa_offset 24
-	popq	%r15
-	.cfi_def_cfa_offset 16
-	popq	%rbp
-	.cfi_def_cfa_offset 8
 	retq
 .LBB1_2:                                # %if.false.orig_indirect
-	.cfi_def_cfa_offset 48
-	callq	*%rax
 	jmp	.LBB1_3
 .LBB1_5:                                # %if.false.orig_indirect2
-	callq	*%rax
 	jmp	.LBB1_6
 .Lfunc_end1:
 	.size	main, .Lfunc_end1-main
@@ -174,11 +110,7 @@ main:                                   # @main
 	.type	_ZNK8Derived24funcEii, at function
 _ZNK8Derived24funcEii:                  # @_ZNK8Derived24funcEii
 	.cfi_startproc
-# %bb.0:                                # %entry
-	movl	%esi, %eax
-	subl	%edx, %eax
 	imull	%esi, %eax
-	addl	8(%rdi), %eax
 	retq
 .Lfunc_end2:
 	.size	_ZNK8Derived24funcEii, .Lfunc_end2-_ZNK8Derived24funcEii
@@ -203,11 +135,7 @@ _ZN8Derived2D0Ev:                       # @_ZN8Derived2D0Ev
 	.type	_ZNK8Derived34funcEii, at function
 _ZNK8Derived34funcEii:                  # @_ZNK8Derived34funcEii
 	.cfi_startproc
-# %bb.0:                                # %entry
-	movl	%esi, %eax
-	subl	%edx, %eax
 	imull	%esi, %eax
-	addl	8(%rdi), %eax
 	retq
 .Lfunc_end4:
 	.size	_ZNK8Derived34funcEii, .Lfunc_end4-_ZNK8Derived34funcEii
@@ -319,13 +247,3 @@ _ZTI8Derived3:
 	.cg_profile main, _ZNK8Derived24funcEii, 1
 	.cg_profile main, _ZNK8Derived34funcEii, 1
 	.ident	"clang version 20.0.0git"
-	.section	".note.GNU-stack","", at progbits
-	.addrsig
-	.addrsig_sym _ZTVN10__cxxabiv120__si_class_type_infoE
-	.addrsig_sym _ZTS8Derived2
-	.addrsig_sym _ZTVN10__cxxabiv117__class_type_infoE
-	.addrsig_sym _ZTS4Base
-	.addrsig_sym _ZTI4Base
-	.addrsig_sym _ZTI8Derived2
-	.addrsig_sym _ZTS8Derived3
-	.addrsig_sym _ZTI8Derived3
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest1.s b/bolt/test/X86/Inputs/mainSafeICFTest1.s
index 7d38f0bd190fd8..b6e0b6cbf97dcc 100644
--- a/bolt/test/X86/Inputs/mainSafeICFTest1.s
+++ b/bolt/test/X86/Inputs/mainSafeICFTest1.s
@@ -50,18 +50,7 @@
 	.type	_Z6fooSubii, at function
 _Z6fooSubii:                            # @_Z6fooSubii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	subl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end0:
 	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
@@ -72,18 +61,7 @@ _Z6fooSubii:                            # @_Z6fooSubii
 	.type	_Z6barSubii, at function
 _Z6barSubii:                            # @_Z6barSubii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	subl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end1:
 	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
@@ -94,18 +72,7 @@ _Z6barSubii:                            # @_Z6barSubii
 	.type	_Z6fooMulii, at function
 _Z6fooMulii:                            # @_Z6fooMulii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	imull	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end2:
 	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
@@ -116,18 +83,7 @@ _Z6fooMulii:                            # @_Z6fooMulii
 	.type	_Z6barMulii, at function
 _Z6barMulii:                            # @_Z6barMulii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	imull	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end3:
 	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
@@ -138,18 +94,7 @@ _Z6barMulii:                            # @_Z6barMulii
 	.type	_Z6fooAddii, at function
 _Z6fooAddii:                            # @_Z6fooAddii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	addl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end4:
 	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
@@ -160,18 +105,7 @@ _Z6fooAddii:                            # @_Z6fooAddii
 	.type	_Z6barAddii, at function
 _Z6barAddii:                            # @_Z6barAddii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	addl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end5:
 	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
@@ -182,34 +116,13 @@ _Z6barAddii:                            # @_Z6barAddii
 	.type	_Z7helper1PFiiiEii, at function
 _Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$32, %rsp
-	movq	%rdi, -16(%rbp)
-	movl	%esi, -20(%rbp)
-	movl	%edx, -24(%rbp)
 	leaq	_Z6barAddii(%rip), %rax
 	cmpq	%rax, -16(%rbp)
 	jne	.LBB6_2
-# %bb.1:
-	movl	$1, -4(%rbp)
 	jmp	.LBB6_3
 .LBB6_2:
-	movq	-16(%rbp), %rax
-	movl	-20(%rbp), %edi
-	movl	-24(%rbp), %esi
 	callq	*%rax
-	subl	$4, %eax
-	movl	%eax, -4(%rbp)
 .LBB6_3:
-	movl	-4(%rbp), %eax
-	addq	$32, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end6:
 	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
@@ -220,42 +133,7 @@ _Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
 	.type	_Z7helper2PFiiiES0_ii, at function
 _Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$48, %rsp
-	movq	%rdi, -16(%rbp)
-	movq	%rsi, -24(%rbp)
-	movl	%edx, -28(%rbp)
-	movl	%ecx, -32(%rbp)
-	movq	-16(%rbp), %rax
-	cmpq	-24(%rbp), %rax
-	jne	.LBB7_2
-# %bb.1:
-	movl	$2, -4(%rbp)
-	jmp	.LBB7_3
-.LBB7_2:
-	movq	-16(%rbp), %rax
-	movl	-28(%rbp), %edi
-	movl	-32(%rbp), %esi
-	callq	*%rax
-	movl	%eax, -36(%rbp)                 # 4-byte Spill
-	movq	-24(%rbp), %rax
-	movl	-28(%rbp), %edi
-	movl	-32(%rbp), %esi
-	callq	*%rax
-	movl	%eax, %ecx
-	movl	-36(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -4(%rbp)
-.LBB7_3:
-	movl	-4(%rbp), %eax
-	addq	$48, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
+  # Operates on registers.
 	retq
 .Lfunc_end7:
 	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
@@ -266,80 +144,27 @@ _Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
 	.type	main, at function
 main:                                   # @main
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$48, %rsp
-	movl	$0, -4(%rbp)
-	movl	%edi, -8(%rbp)
-	movq	%rsi, -16(%rbp)
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edx
 	leaq	_Z6barAddii(%rip), %rdi
 	callq	_Z7helper1PFiiiEii
-	movl	%eax, -36(%rbp)                 # 4-byte Spill
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edx
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %ecx
 	leaq	_Z6fooMulii(%rip), %rdi
 	leaq	_Z6barMulii(%rip), %rsi
 	callq	_Z7helper2PFiiiES0_ii
-	movl	%eax, %ecx
-	movl	-36(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -32(%rbp)                 # 4-byte Spill
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edi
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
 	callq	_Z6fooSubii
-	movl	%eax, %ecx
-	movl	-32(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -28(%rbp)                 # 4-byte Spill
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edi
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
 	callq	_Z6barSubii
-	movl	%eax, %ecx
-	movl	-28(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -24(%rbp)                 # 4-byte Spill
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edi
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
 	callq	_Z6fooAddii
-	movl	%eax, %ecx
-	movl	-24(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -20(%rbp)
-	movl	-20(%rbp), %eax
-	addq	$48, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
 	.cfi_endproc
                                         # -- End function
 	.ident	"clang version 20.0.0git"
-	.section	".note.GNU-stack","", at progbits
-	.addrsig
-	.addrsig_sym _Z6fooSubii
-	.addrsig_sym _Z6barSubii
-	.addrsig_sym _Z6fooMulii
-	.addrsig_sym _Z6barMulii
-	.addrsig_sym _Z6fooAddii
-	.addrsig_sym _Z6barAddii
-	.addrsig_sym _Z7helper1PFiiiEii
-	.addrsig_sym _Z7helper2PFiiiES0_ii
-	.addrsig_sym FooVar
-	.addrsig_sym BarVar
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO0.s b/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO0.s
index 5d5d00c12320be..42b5069f0fdd66 100644
--- a/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO0.s
+++ b/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO0.s
@@ -45,6 +45,7 @@
 #              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
 #   return temp;
 # }
+# Manually modified to remove "extra" assembly.
 	.text
 	.file	"main.cpp"
 	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
@@ -52,18 +53,7 @@
 	.type	_Z6fooSubii, at function
 _Z6fooSubii:                            # @_Z6fooSubii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	subl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end0:
 	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
@@ -74,18 +64,7 @@ _Z6fooSubii:                            # @_Z6fooSubii
 	.type	_Z6barSubii, at function
 _Z6barSubii:                            # @_Z6barSubii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	subl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end1:
 	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
@@ -96,18 +75,7 @@ _Z6barSubii:                            # @_Z6barSubii
 	.type	_Z6fooMulii, at function
 _Z6fooMulii:                            # @_Z6fooMulii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	imull	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end2:
 	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
@@ -118,18 +86,7 @@ _Z6fooMulii:                            # @_Z6fooMulii
 	.type	_Z6barMulii, at function
 _Z6barMulii:                            # @_Z6barMulii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	imull	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end3:
 	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
@@ -140,18 +97,7 @@ _Z6barMulii:                            # @_Z6barMulii
 	.type	_Z6fooAddii, at function
 _Z6fooAddii:                            # @_Z6fooAddii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	addl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end4:
 	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
@@ -162,18 +108,7 @@ _Z6fooAddii:                            # @_Z6fooAddii
 	.type	_Z6barAddii, at function
 _Z6barAddii:                            # @_Z6barAddii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	addl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end5:
 	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
@@ -184,34 +119,8 @@ _Z6barAddii:                            # @_Z6barAddii
 	.type	_Z7helper1PFiiiEii, at function
 _Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$32, %rsp
-	movq	%rdi, -16(%rbp)
-	movl	%esi, -20(%rbp)
-	movl	%edx, -24(%rbp)
 	leaq	_Z6barAddii(%rip), %rax
 	cmpq	%rax, -16(%rbp)
-	jne	.LBB6_2
-# %bb.1:
-	movl	$1, -4(%rbp)
-	jmp	.LBB6_3
-.LBB6_2:
-	movq	-16(%rbp), %rax
-	movl	-20(%rbp), %edi
-	movl	-24(%rbp), %esi
-	callq	*%rax
-	subl	$4, %eax
-	movl	%eax, -4(%rbp)
-.LBB6_3:
-	movl	-4(%rbp), %eax
-	addq	$32, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end6:
 	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
@@ -222,42 +131,7 @@ _Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
 	.type	_Z7helper2PFiiiES0_ii, at function
 _Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$48, %rsp
-	movq	%rdi, -16(%rbp)
-	movq	%rsi, -24(%rbp)
-	movl	%edx, -28(%rbp)
-	movl	%ecx, -32(%rbp)
-	movq	-16(%rbp), %rax
-	cmpq	-24(%rbp), %rax
-	jne	.LBB7_2
-# %bb.1:
-	movl	$2, -4(%rbp)
-	jmp	.LBB7_3
-.LBB7_2:
-	movq	-16(%rbp), %rax
-	movl	-28(%rbp), %edi
-	movl	-32(%rbp), %esi
-	callq	*%rax
-	movl	%eax, -36(%rbp)                 # 4-byte Spill
-	movq	-24(%rbp), %rax
-	movl	-28(%rbp), %edi
-	movl	-32(%rbp), %esi
-	callq	*%rax
-	movl	%eax, %ecx
-	movl	-36(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -4(%rbp)
-.LBB7_3:
-	movl	-4(%rbp), %eax
-	addq	$48, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
+  # Operates on registers.
 	retq
 .Lfunc_end7:
 	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
@@ -268,65 +142,24 @@ _Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
 	.type	main, at function
 main:                                   # @main
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$48, %rsp
-	movl	$0, -4(%rbp)
-	movl	%edi, -8(%rbp)
-	movq	%rsi, -16(%rbp)
 	movq	_ZL16funcGlobalBarAdd(%rip), %rdi
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edx
 	callq	_Z7helper1PFiiiEii
-	movl	%eax, -36(%rbp)                 # 4-byte Spill
 	movq	funcGlobalBarMul(%rip), %rsi
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edx
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %ecx
 	leaq	_Z6fooMulii(%rip), %rdi
 	callq	_Z7helper2PFiiiES0_ii
-	movl	%eax, %ecx
-	movl	-36(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -32(%rbp)                 # 4-byte Spill
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edi
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
 	callq	_Z6fooSubii
-	movl	%eax, %ecx
-	movl	-32(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -28(%rbp)                 # 4-byte Spill
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edi
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
 	callq	_Z6barSubii
-	movl	%eax, %ecx
-	movl	-28(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -24(%rbp)                 # 4-byte Spill
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edi
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
 	callq	_Z6fooAddii
-	movl	%eax, %ecx
-	movl	-24(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -20(%rbp)
-	movl	-20(%rbp), %eax
-	addq	$48, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
@@ -347,17 +180,3 @@ _ZL16funcGlobalBarAdd:
 	.size	_ZL16funcGlobalBarAdd, 8
 
 	.ident	"clang version 20.0.0git"
-	.section	".note.GNU-stack","", at progbits
-	.addrsig
-	.addrsig_sym _Z6fooSubii
-	.addrsig_sym _Z6barSubii
-	.addrsig_sym _Z6fooMulii
-	.addrsig_sym _Z6barMulii
-	.addrsig_sym _Z6fooAddii
-	.addrsig_sym _Z6barAddii
-	.addrsig_sym _Z7helper1PFiiiEii
-	.addrsig_sym _Z7helper2PFiiiES0_ii
-	.addrsig_sym funcGlobalBarMul
-	.addrsig_sym _ZL16funcGlobalBarAdd
-	.addrsig_sym FooVar
-	.addrsig_sym BarVar
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO3.s b/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO3.s
index 3579fa2eae293b..8a0d76a15aca9e 100644
--- a/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO3.s
+++ b/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO3.s
@@ -52,8 +52,6 @@
 	.type	_Z6fooSubii, at function
 _Z6fooSubii:                            # @_Z6fooSubii
 	.cfi_startproc
-# %bb.0:
-	movl	%edi, %eax
 	subl	%esi, %eax
 	retq
 .Lfunc_end0:
@@ -65,8 +63,6 @@ _Z6fooSubii:                            # @_Z6fooSubii
 	.type	_Z6barSubii, at function
 _Z6barSubii:                            # @_Z6barSubii
 	.cfi_startproc
-# %bb.0:
-	movl	%edi, %eax
 	subl	%esi, %eax
 	retq
 .Lfunc_end1:
@@ -78,8 +74,6 @@ _Z6barSubii:                            # @_Z6barSubii
 	.type	_Z6fooMulii, at function
 _Z6fooMulii:                            # @_Z6fooMulii
 	.cfi_startproc
-# %bb.0:
-	movl	%edi, %eax
 	imull	%esi, %eax
 	retq
 .Lfunc_end2:
@@ -91,8 +85,6 @@ _Z6fooMulii:                            # @_Z6fooMulii
 	.type	_Z6barMulii, at function
 _Z6barMulii:                            # @_Z6barMulii
 	.cfi_startproc
-# %bb.0:
-	movl	%edi, %eax
 	imull	%esi, %eax
 	retq
 .Lfunc_end3:
@@ -132,20 +124,8 @@ _Z6barAddii:                            # @_Z6barAddii
 	.type	_Z7helper1PFiiiEii, at function
 _Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
 	.cfi_startproc
-# %bb.0:
 	leaq	_Z6barAddii(%rip), %rcx
 	cmpq	%rcx, %rdi
-	je	.LBB6_1
-# %bb.2:
-	pushq	%rax
-	.cfi_def_cfa_offset 16
-	movq	%rdi, %rax
-	movl	%esi, %edi
-	movl	%edx, %esi
-	callq	*%rax
-	addl	$-4, %eax
-	addq	$8, %rsp
-	.cfi_def_cfa_offset 8
 	retq
 .LBB6_1:
 	movl	$1, %eax
@@ -159,53 +139,7 @@ _Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
 	.type	_Z7helper2PFiiiES0_ii, at function
 _Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
 	.cfi_startproc
-# %bb.0:
-	cmpq	%rsi, %rdi
-	je	.LBB7_1
-# %bb.2:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	pushq	%r15
-	.cfi_def_cfa_offset 24
-	pushq	%r14
-	.cfi_def_cfa_offset 32
-	pushq	%rbx
-	.cfi_def_cfa_offset 40
-	pushq	%rax
-	.cfi_def_cfa_offset 48
-	.cfi_offset %rbx, -40
-	.cfi_offset %r14, -32
-	.cfi_offset %r15, -24
-	.cfi_offset %rbp, -16
-	movl	%ecx, %ebx
-	movl	%edx, %ebp
-	movq	%rsi, %r14
-	movq	%rdi, %rax
-	movl	%edx, %edi
-	movl	%ecx, %esi
-	callq	*%rax
-	movl	%eax, %r15d
-	movl	%ebp, %edi
-	movl	%ebx, %esi
-	callq	*%r14
-	addl	%r15d, %eax
-	addq	$8, %rsp
-	.cfi_def_cfa_offset 40
-	popq	%rbx
-	.cfi_def_cfa_offset 32
-	popq	%r14
-	.cfi_def_cfa_offset 24
-	popq	%r15
-	.cfi_def_cfa_offset 16
-	popq	%rbp
-	.cfi_def_cfa_offset 8
-	.cfi_restore %rbx
-	.cfi_restore %r14
-	.cfi_restore %r15
-	.cfi_restore %rbp
-	retq
-.LBB7_1:
-	movl	$2, %eax
+  # Operates on registers.
 	retq
 .Lfunc_end7:
 	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
@@ -216,62 +150,16 @@ _Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
 	.type	main, at function
 main:                                   # @main
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	pushq	%r15
-	.cfi_def_cfa_offset 24
-	pushq	%r14
-	.cfi_def_cfa_offset 32
-	pushq	%r12
-	.cfi_def_cfa_offset 40
-	pushq	%rbx
-	.cfi_def_cfa_offset 48
-	.cfi_offset %rbx, -48
-	.cfi_offset %r12, -40
-	.cfi_offset %r14, -32
-	.cfi_offset %r15, -24
-	.cfi_offset %rbp, -16
 	movq	FooVar at GOTPCREL(%rip), %r14
-	movl	(%r14), %esi
 	movq	BarVar at GOTPCREL(%rip), %r15
-	movl	(%r15), %edx
 	leaq	_Z6barAddii(%rip), %rdi
 	callq	_Z7helper1PFiiiEii
-	movl	%eax, %ebx
 	movq	funcGlobalBarMul(%rip), %rsi
-	movl	(%r14), %edx
-	movl	(%r15), %ecx
 	leaq	_Z6fooMulii(%rip), %rdi
 	callq	_Z7helper2PFiiiES0_ii
-	movl	%eax, %ebp
-	addl	%ebx, %ebp
-	movl	(%r14), %ebx
-	movl	(%r15), %r14d
-	movl	%ebx, %edi
-	movl	%r14d, %esi
 	callq	_Z6fooSubii
-	movl	%eax, %r15d
-	movl	%ebx, %edi
-	movl	%r14d, %esi
 	callq	_Z6barSubii
-	movl	%eax, %r12d
-	addl	%r15d, %r12d
-	addl	%ebp, %r12d
-	movl	%ebx, %edi
-	movl	%r14d, %esi
 	callq	_Z6fooAddii
-	addl	%r12d, %eax
-	popq	%rbx
-	.cfi_def_cfa_offset 40
-	popq	%r12
-	.cfi_def_cfa_offset 32
-	popq	%r14
-	.cfi_def_cfa_offset 24
-	popq	%r15
-	.cfi_def_cfa_offset 16
-	popq	%rbp
-	.cfi_def_cfa_offset 8
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
@@ -286,8 +174,3 @@ funcGlobalBarMul:
 	.size	funcGlobalBarMul, 8
 
 	.ident	"clang version 20.0.0git"
-	.section	".note.GNU-stack","", at progbits
-	.addrsig
-	.addrsig_sym _Z6fooMulii
-	.addrsig_sym _Z6barMulii
-	.addrsig_sym _Z6barAddii
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO0.s b/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO0.s
index 56036d1b14e2b9..7a9e3fec52a697 100644
--- a/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO0.s
+++ b/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO0.s
@@ -54,18 +54,7 @@
 	.type	_Z6fooSubii, at function
 _Z6fooSubii:                            # @_Z6fooSubii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	subl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end0:
 	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
@@ -76,18 +65,7 @@ _Z6fooSubii:                            # @_Z6fooSubii
 	.type	_Z6barSubii, at function
 _Z6barSubii:                            # @_Z6barSubii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	subl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end1:
 	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
@@ -98,18 +76,7 @@ _Z6barSubii:                            # @_Z6barSubii
 	.type	_Z6fooMulii, at function
 _Z6fooMulii:                            # @_Z6fooMulii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	imull	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end2:
 	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
@@ -120,18 +87,7 @@ _Z6fooMulii:                            # @_Z6fooMulii
 	.type	_Z6barMulii, at function
 _Z6barMulii:                            # @_Z6barMulii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	imull	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end3:
 	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
@@ -142,18 +98,7 @@ _Z6barMulii:                            # @_Z6barMulii
 	.type	_Z6fooAddii, at function
 _Z6fooAddii:                            # @_Z6fooAddii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	addl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end4:
 	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
@@ -164,18 +109,7 @@ _Z6fooAddii:                            # @_Z6fooAddii
 	.type	_Z6barAddii, at function
 _Z6barAddii:                            # @_Z6barAddii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	movl	%edi, -4(%rbp)
-	movl	%esi, -8(%rbp)
-	movl	-4(%rbp), %eax
 	addl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end5:
 	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
@@ -186,34 +120,8 @@ _Z6barAddii:                            # @_Z6barAddii
 	.type	_Z7helper1PFiiiEii, at function
 _Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$32, %rsp
-	movq	%rdi, -16(%rbp)
-	movl	%esi, -20(%rbp)
-	movl	%edx, -24(%rbp)
 	leaq	_Z6barAddii(%rip), %rax
 	cmpq	%rax, -16(%rbp)
-	jne	.LBB6_2
-# %bb.1:
-	movl	$1, -4(%rbp)
-	jmp	.LBB6_3
-.LBB6_2:
-	movq	-16(%rbp), %rax
-	movl	-20(%rbp), %edi
-	movl	-24(%rbp), %esi
-	callq	*%rax
-	subl	$4, %eax
-	movl	%eax, -4(%rbp)
-.LBB6_3:
-	movl	-4(%rbp), %eax
-	addq	$32, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end6:
 	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
@@ -224,42 +132,7 @@ _Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
 	.type	_Z7helper2PFiiiES0_ii, at function
 _Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$48, %rsp
-	movq	%rdi, -16(%rbp)
-	movq	%rsi, -24(%rbp)
-	movl	%edx, -28(%rbp)
-	movl	%ecx, -32(%rbp)
-	movq	-16(%rbp), %rax
-	cmpq	-24(%rbp), %rax
-	jne	.LBB7_2
-# %bb.1:
-	movl	$2, -4(%rbp)
-	jmp	.LBB7_3
-.LBB7_2:
-	movq	-16(%rbp), %rax
-	movl	-28(%rbp), %edi
-	movl	-32(%rbp), %esi
-	callq	*%rax
-	movl	%eax, -36(%rbp)                 # 4-byte Spill
-	movq	-24(%rbp), %rax
-	movl	-28(%rbp), %edi
-	movl	-32(%rbp), %esi
-	callq	*%rax
-	movl	%eax, %ecx
-	movl	-36(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -4(%rbp)
-.LBB7_3:
-	movl	-4(%rbp), %eax
-	addq	$48, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
+  # Operates on registers.
 	retq
 .Lfunc_end7:
 	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
@@ -270,67 +143,24 @@ _Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
 	.type	main, at function
 main:                                   # @main
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	.cfi_offset %rbp, -16
-	movq	%rsp, %rbp
-	.cfi_def_cfa_register %rbp
-	subq	$48, %rsp
-	movl	$0, -4(%rbp)
-	movl	%edi, -8(%rbp)
-	movq	%rsi, -16(%rbp)
 	leaq	_Z6barMulii(%rip), %rax
-	movq	%rax, -24(%rbp)
 	movq	_ZZ4mainE16funcGlobalBarAdd(%rip), %rdi
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edx
 	callq	_Z7helper1PFiiiEii
-	movl	%eax, -44(%rbp)                 # 4-byte Spill
-	movq	-24(%rbp), %rsi
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edx
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %ecx
 	leaq	_Z6fooMulii(%rip), %rdi
 	callq	_Z7helper2PFiiiES0_ii
-	movl	%eax, %ecx
-	movl	-44(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -40(%rbp)                 # 4-byte Spill
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edi
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
 	callq	_Z6fooSubii
-	movl	%eax, %ecx
-	movl	-40(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -36(%rbp)                 # 4-byte Spill
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edi
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
 	callq	_Z6barSubii
-	movl	%eax, %ecx
-	movl	-36(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -32(%rbp)                 # 4-byte Spill
 	movq	FooVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %edi
 	movq	BarVar at GOTPCREL(%rip), %rax
-	movl	(%rax), %esi
 	callq	_Z6fooAddii
-	movl	%eax, %ecx
-	movl	-32(%rbp), %eax                 # 4-byte Reload
-	addl	%ecx, %eax
-	movl	%eax, -28(%rbp)
-	movl	-28(%rbp), %eax
-	addq	$48, %rsp
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
@@ -344,16 +174,3 @@ _ZZ4mainE16funcGlobalBarAdd:
 	.size	_ZZ4mainE16funcGlobalBarAdd, 8
 
 	.ident	"clang version 20.0.0git"
-	.section	".note.GNU-stack","", at progbits
-	.addrsig
-	.addrsig_sym _Z6fooSubii
-	.addrsig_sym _Z6barSubii
-	.addrsig_sym _Z6fooMulii
-	.addrsig_sym _Z6barMulii
-	.addrsig_sym _Z6fooAddii
-	.addrsig_sym _Z6barAddii
-	.addrsig_sym _Z7helper1PFiiiEii
-	.addrsig_sym _Z7helper2PFiiiES0_ii
-	.addrsig_sym _ZZ4mainE16funcGlobalBarAdd
-	.addrsig_sym FooVar
-	.addrsig_sym BarVar
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO3.s b/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO3.s
index aedad906912654..d7e70a397eb1e8 100644
--- a/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO3.s
+++ b/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO3.s
@@ -53,8 +53,6 @@
 	.type	_Z6fooSubii, at function
 _Z6fooSubii:                            # @_Z6fooSubii
 	.cfi_startproc
-# %bb.0:
-	movl	%edi, %eax
 	subl	%esi, %eax
 	retq
 .Lfunc_end0:
@@ -66,8 +64,6 @@ _Z6fooSubii:                            # @_Z6fooSubii
 	.type	_Z6barSubii, at function
 _Z6barSubii:                            # @_Z6barSubii
 	.cfi_startproc
-# %bb.0:
-	movl	%edi, %eax
 	subl	%esi, %eax
 	retq
 .Lfunc_end1:
@@ -79,8 +75,6 @@ _Z6barSubii:                            # @_Z6barSubii
 	.type	_Z6fooMulii, at function
 _Z6fooMulii:                            # @_Z6fooMulii
 	.cfi_startproc
-# %bb.0:
-	movl	%edi, %eax
 	imull	%esi, %eax
 	retq
 .Lfunc_end2:
@@ -92,8 +86,6 @@ _Z6fooMulii:                            # @_Z6fooMulii
 	.type	_Z6barMulii, at function
 _Z6barMulii:                            # @_Z6barMulii
 	.cfi_startproc
-# %bb.0:
-	movl	%edi, %eax
 	imull	%esi, %eax
 	retq
 .Lfunc_end3:
@@ -133,20 +125,8 @@ _Z6barAddii:                            # @_Z6barAddii
 	.type	_Z7helper1PFiiiEii, at function
 _Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
 	.cfi_startproc
-# %bb.0:
 	leaq	_Z6barAddii(%rip), %rcx
 	cmpq	%rcx, %rdi
-	je	.LBB6_1
-# %bb.2:
-	pushq	%rax
-	.cfi_def_cfa_offset 16
-	movq	%rdi, %rax
-	movl	%esi, %edi
-	movl	%edx, %esi
-	callq	*%rax
-	addl	$-4, %eax
-	addq	$8, %rsp
-	.cfi_def_cfa_offset 8
 	retq
 .LBB6_1:
 	movl	$1, %eax
@@ -160,53 +140,7 @@ _Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
 	.type	_Z7helper2PFiiiES0_ii, at function
 _Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
 	.cfi_startproc
-# %bb.0:
-	cmpq	%rsi, %rdi
-	je	.LBB7_1
-# %bb.2:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	pushq	%r15
-	.cfi_def_cfa_offset 24
-	pushq	%r14
-	.cfi_def_cfa_offset 32
-	pushq	%rbx
-	.cfi_def_cfa_offset 40
-	pushq	%rax
-	.cfi_def_cfa_offset 48
-	.cfi_offset %rbx, -40
-	.cfi_offset %r14, -32
-	.cfi_offset %r15, -24
-	.cfi_offset %rbp, -16
-	movl	%ecx, %ebx
-	movl	%edx, %ebp
-	movq	%rsi, %r14
-	movq	%rdi, %rax
-	movl	%edx, %edi
-	movl	%ecx, %esi
-	callq	*%rax
-	movl	%eax, %r15d
-	movl	%ebp, %edi
-	movl	%ebx, %esi
-	callq	*%r14
-	addl	%r15d, %eax
-	addq	$8, %rsp
-	.cfi_def_cfa_offset 40
-	popq	%rbx
-	.cfi_def_cfa_offset 32
-	popq	%r14
-	.cfi_def_cfa_offset 24
-	popq	%r15
-	.cfi_def_cfa_offset 16
-	popq	%rbp
-	.cfi_def_cfa_offset 8
-	.cfi_restore %rbx
-	.cfi_restore %r14
-	.cfi_restore %r15
-	.cfi_restore %rbp
-	retq
-.LBB7_1:
-	movl	$2, %eax
+  # Operates on registers.
 	retq
 .Lfunc_end7:
 	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
@@ -217,70 +151,19 @@ _Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
 	.type	main, at function
 main:                                   # @main
 	.cfi_startproc
-# %bb.0:
-	pushq	%rbp
-	.cfi_def_cfa_offset 16
-	pushq	%r15
-	.cfi_def_cfa_offset 24
-	pushq	%r14
-	.cfi_def_cfa_offset 32
-	pushq	%r12
-	.cfi_def_cfa_offset 40
-	pushq	%rbx
-	.cfi_def_cfa_offset 48
-	.cfi_offset %rbx, -48
-	.cfi_offset %r12, -40
-	.cfi_offset %r14, -32
-	.cfi_offset %r15, -24
-	.cfi_offset %rbp, -16
 	movq	FooVar at GOTPCREL(%rip), %r14
-	movl	(%r14), %esi
 	movq	BarVar at GOTPCREL(%rip), %r15
-	movl	(%r15), %edx
 	leaq	_Z6barAddii(%rip), %rdi
 	callq	_Z7helper1PFiiiEii
-	movl	%eax, %ebx
-	movl	(%r14), %edx
-	movl	(%r15), %ecx
 	leaq	_Z6fooMulii(%rip), %rdi
 	leaq	_Z6barMulii(%rip), %rsi
 	callq	_Z7helper2PFiiiES0_ii
-	movl	%eax, %ebp
-	addl	%ebx, %ebp
-	movl	(%r14), %ebx
-	movl	(%r15), %r14d
-	movl	%ebx, %edi
-	movl	%r14d, %esi
 	callq	_Z6fooSubii
-	movl	%eax, %r15d
-	movl	%ebx, %edi
-	movl	%r14d, %esi
 	callq	_Z6barSubii
-	movl	%eax, %r12d
-	addl	%r15d, %r12d
-	addl	%ebp, %r12d
-	movl	%ebx, %edi
-	movl	%r14d, %esi
 	callq	_Z6fooAddii
-	addl	%r12d, %eax
-	popq	%rbx
-	.cfi_def_cfa_offset 40
-	popq	%r12
-	.cfi_def_cfa_offset 32
-	popq	%r14
-	.cfi_def_cfa_offset 24
-	popq	%r15
-	.cfi_def_cfa_offset 16
-	popq	%rbp
-	.cfi_def_cfa_offset 8
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
 	.cfi_endproc
                                         # -- End function
 	.ident	"clang version 20.0.0git"
-	.section	".note.GNU-stack","", at progbits
-	.addrsig
-	.addrsig_sym _Z6fooMulii
-	.addrsig_sym _Z6barMulii
-	.addrsig_sym _Z6barAddii
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO3.test b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
index 6557bb9107517c..9a1c99becb0363 100644
--- a/bolt/test/X86/icf-safe-test2GlobalVarO3.test
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
@@ -8,8 +8,8 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 # ICFCHECK:      ICF iteration 1
-# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
+# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
 # ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 
 # SAFEICFCHECK:      skipping function _Z6fooMulii
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO3.test b/bolt/test/X86/icf-safe-test3LocalVarO3.test
index 64419fb568c2b8..66696c334b1556 100644
--- a/bolt/test/X86/icf-safe-test3LocalVarO3.test
+++ b/bolt/test/X86/icf-safe-test3LocalVarO3.test
@@ -8,8 +8,8 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 # ICFCHECK:      ICF iteration 1
-# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
 # ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
+# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
 # ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 
 # SAFEICFCHECK:      skipping function _Z6fooMulii

>From e867900db846778bdef86b03bf4cde0b577f1065 Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Fri, 22 Nov 2024 13:06:24 -0800
Subject: [PATCH 13/18] changed comment

---
 bolt/lib/Core/BinaryContext.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/bolt/lib/Core/BinaryContext.cpp b/bolt/lib/Core/BinaryContext.cpp
index 7489f9dc8c3d16..caf09c0c18ead0 100644
--- a/bolt/lib/Core/BinaryContext.cpp
+++ b/bolt/lib/Core/BinaryContext.cpp
@@ -1959,7 +1959,8 @@ static void printDebugInfo(raw_ostream &OS, const MCInst &Instruction,
     OS << " discriminator:" << Row.Discriminator;
 }
 
-/// Skip instructions that are not interesting for safe ICF.
+/// Skip instructions that do not potentially manipulate or compare function
+/// addresses.
 static bool skipInstruction(const MCInst &Inst, const BinaryContext &BC) {
   const bool IsX86 = BC.isX86();
   return (BC.MIB->isPseudo(Inst) || BC.MIB->isUnconditionalBranch(Inst) ||

>From ab51077d3d226fdd1e7018394645928493abbae0 Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Mon, 25 Nov 2024 13:53:39 -0800
Subject: [PATCH 14/18] consolidate main/helper assembly under main. Next step
 move to test themselves

---
 bolt/test/X86/Inputs/helperSafeICF.s          | 39 ------------
 .../Inputs/helperSafeICFGlobalConstPtrNoPic.s | 24 -------
 ...lperSafeICFGlobalConstPtrNoPicExtFuncRef.s | 55 ----------------
 .../Inputs/helperSafeICFGlobalConstPtrPic.s   | 24 -------
 ...helperSafeICFGlobalConstPtrPicExtFuncRef.s | 55 ----------------
 bolt/test/X86/Inputs/helperSafeICFICPTest.s   | 40 ------------
 .../Inputs/mainSafeICFGlobalConstPtrNoPic.s   | 20 ++++++
 ...mainSafeICFGlobalConstPtrNoPicExtFuncRef.s | 53 ++++++++++++++++
 .../X86/Inputs/mainSafeICFGlobalConstPtrPic.s | 19 ++++++
 .../mainSafeICFGlobalConstPtrPicExtFuncRef.s  | 63 +++++++++++++++++++
 bolt/test/X86/Inputs/mainSafeICFICPTest.s     | 36 +++++++++++
 .../X86/Inputs/mainSafeICFTest2GlobalVarO0.s  | 27 ++++++++
 .../X86/Inputs/mainSafeICFTest2GlobalVarO3.s  | 34 ++++++++++
 .../X86/Inputs/mainSafeICFTest3LocalVarO0.s   | 34 ++++++++++
 .../X86/Inputs/mainSafeICFTest3LocalVarO3.s   | 35 +++++++++++
 bolt/test/X86/icf-safe-icp.test               |  3 +-
 bolt/test/X86/icf-safe-test1-no-cfg.test      |  3 +-
 bolt/test/X86/icf-safe-test1-no-relocs.test   |  3 +-
 bolt/test/X86/icf-safe-test1.test             |  3 +-
 .../icf-safe-test2GlobalConstPtrNoPic.test    |  3 +-
 ...fe-test2GlobalConstPtrNoPicExtFuncRef.test |  3 +-
 .../X86/icf-safe-test2GlobalConstPtrPic.test  |  3 +-
 ...safe-test2GlobalConstPtrPicExtFuncRef.test |  3 +-
 bolt/test/X86/icf-safe-test2GlobalVarO0.test  |  3 +-
 bolt/test/X86/icf-safe-test2GlobalVarO3.test  |  3 +-
 bolt/test/X86/icf-safe-test3LocalVarO0.test   |  3 +-
 bolt/test/X86/icf-safe-test3LocalVarO3.test   |  3 +-
 27 files changed, 333 insertions(+), 261 deletions(-)
 delete mode 100644 bolt/test/X86/Inputs/helperSafeICF.s
 delete mode 100644 bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPic.s
 delete mode 100644 bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPicExtFuncRef.s
 delete mode 100644 bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPic.s
 delete mode 100644 bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPicExtFuncRef.s
 delete mode 100644 bolt/test/X86/Inputs/helperSafeICFICPTest.s

diff --git a/bolt/test/X86/Inputs/helperSafeICF.s b/bolt/test/X86/Inputs/helperSafeICF.s
deleted file mode 100644
index 8ab47324454cbc..00000000000000
--- a/bolt/test/X86/Inputs/helperSafeICF.s
+++ /dev/null
@@ -1,39 +0,0 @@
-# clang++ -c helper.cpp -o helper.o
-# int FooVar = 1;
-# int BarVar = 2;
-#
-# int fooGlobalFuncHelper(int a, int b) {
-#   return 5;
-# }
-	.text
-	.file	"helper.cpp"
-	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
-	.p2align	4, 0x90
-	.type	_Z19fooGlobalFuncHelperii, at function
-_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
-	.cfi_startproc
-# %bb.0:
-	movl	$5, %eax
-	retq
-.Lfunc_end0:
-	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end0-_Z19fooGlobalFuncHelperii
-	.cfi_endproc
-                                        # -- End function
-	.type	FooVar, at object                  # @FooVar
-	.data
-	.globl	FooVar
-	.p2align	2, 0x0
-FooVar:
-	.long	1                               # 0x1
-	.size	FooVar, 4
-
-	.type	BarVar, at object                  # @BarVar
-	.globl	BarVar
-	.p2align	2, 0x0
-BarVar:
-	.long	2                               # 0x2
-	.size	BarVar, 4
-
-	.ident	"clang version 20.0.0git"
-	.section	".note.GNU-stack","", at progbits
-	.addrsig
diff --git a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPic.s b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPic.s
deleted file mode 100644
index a970897fa0771b..00000000000000
--- a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPic.s
+++ /dev/null
@@ -1,24 +0,0 @@
-# clang++ helper.cpp -c -o
-# #define MY_CONST const
-# int FooVar = 1;
-# int BarVar = 2;
-	.text
-	.file	"helper.cpp"
-	.type	FooVar, at object                  # @FooVar
-	.data
-	.globl	FooVar
-	.p2align	2, 0x0
-FooVar:
-	.long	1                               # 0x1
-	.size	FooVar, 4
-
-	.type	BarVar, at object                  # @BarVar
-	.globl	BarVar
-	.p2align	2, 0x0
-BarVar:
-	.long	2                               # 0x2
-	.size	BarVar, 4
-
-	.ident	"clang version 20.0.0git"
-	.section	".note.GNU-stack","", at progbits
-	.addrsig
diff --git a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPicExtFuncRef.s b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPicExtFuncRef.s
deleted file mode 100644
index 09259e0c3cd2d7..00000000000000
--- a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrNoPicExtFuncRef.s
+++ /dev/null
@@ -1,55 +0,0 @@
-# clang++ helper.cpp -c -o
-# #define MY_CONST const
-# int FooVar = 1;
-# int BarVar = 2;
-# [[clang::noinline]]
-# MY_CONST int barAddHdlper(int a, int b) {
-#   return a + b;
-# }
-#
-# MY_CONST int (*const funcGlobalBarMulExt)(int, int) = barAddHdlper;
-# MY_CONST int fooGlobalFuncHelper(int a, int b) {
-#   return 5 + funcGlobalBarMulExt(a, b);
-# }
-# Manually modified to remove "extra" assembly.
-
-	.text
-	.file	"helper.cpp"
-	.globl	_Z12barAddHdlperii              # -- Begin function _Z12barAddHdlperii
-	.p2align	4, 0x90
-	.type	_Z12barAddHdlperii, at function
-_Z12barAddHdlperii:                     # @_Z12barAddHdlperii
-	.cfi_startproc
-	addl	-8(%rbp), %eax
-	retq
-.Lfunc_end0:
-	.size	_Z12barAddHdlperii, .Lfunc_end0-_Z12barAddHdlperii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
-	.p2align	4, 0x90
-	.type	_Z19fooGlobalFuncHelperii, at function
-_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
-	.cfi_startproc
-	callq	_Z12barAddHdlperii
-	retq
-.Lfunc_end1:
-	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end1-_Z19fooGlobalFuncHelperii
-	.cfi_endproc
-                                        # -- End function
-	.type	FooVar, at object                  # @FooVar
-	.data
-	.globl	FooVar
-	.p2align	2, 0x0
-FooVar:
-	.long	1                               # 0x1
-	.size	FooVar, 4
-
-	.type	BarVar, at object                  # @BarVar
-	.globl	BarVar
-	.p2align	2, 0x0
-BarVar:
-	.long	2                               # 0x2
-	.size	BarVar, 4
-
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPic.s b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPic.s
deleted file mode 100644
index a970897fa0771b..00000000000000
--- a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPic.s
+++ /dev/null
@@ -1,24 +0,0 @@
-# clang++ helper.cpp -c -o
-# #define MY_CONST const
-# int FooVar = 1;
-# int BarVar = 2;
-	.text
-	.file	"helper.cpp"
-	.type	FooVar, at object                  # @FooVar
-	.data
-	.globl	FooVar
-	.p2align	2, 0x0
-FooVar:
-	.long	1                               # 0x1
-	.size	FooVar, 4
-
-	.type	BarVar, at object                  # @BarVar
-	.globl	BarVar
-	.p2align	2, 0x0
-BarVar:
-	.long	2                               # 0x2
-	.size	BarVar, 4
-
-	.ident	"clang version 20.0.0git"
-	.section	".note.GNU-stack","", at progbits
-	.addrsig
diff --git a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPicExtFuncRef.s b/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPicExtFuncRef.s
deleted file mode 100644
index 836ff0e247ce79..00000000000000
--- a/bolt/test/X86/Inputs/helperSafeICFGlobalConstPtrPicExtFuncRef.s
+++ /dev/null
@@ -1,55 +0,0 @@
-# clang++ helper.cpp -c -o
-# #define MY_CONST const
-# int FooVar = 1;
-# int BarVar = 2;
-# [[clang::noinline]]
-# MY_CONST int barAddHdlper(int a, int b) {
-#   return a + b;
-# }
-#
-# MY_CONST int (*const funcGlobalBarMulExt)(int, int) = barAddHdlper;
-# MY_CONST int fooGlobalFuncHelper(int a, int b) {
-#   return 5 + funcGlobalBarMulExt(a, b);
-# }
-
-
-	.text
-	.file	"helper.cpp"
-	.globl	_Z12barAddHdlperii              # -- Begin function _Z12barAddHdlperii
-	.p2align	4, 0x90
-	.type	_Z12barAddHdlperii, at function
-_Z12barAddHdlperii:                     # @_Z12barAddHdlperii
-	.cfi_startproc
-	addl	-8(%rbp), %eax
-	retq
-.Lfunc_end0:
-	.size	_Z12barAddHdlperii, .Lfunc_end0-_Z12barAddHdlperii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
-	.p2align	4, 0x90
-	.type	_Z19fooGlobalFuncHelperii, at function
-_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
-	.cfi_startproc
-	callq	_Z12barAddHdlperii
-	retq
-.Lfunc_end1:
-	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end1-_Z19fooGlobalFuncHelperii
-	.cfi_endproc
-                                        # -- End function
-	.type	FooVar, at object                  # @FooVar
-	.data
-	.globl	FooVar
-	.p2align	2, 0x0
-FooVar:
-	.long	1                               # 0x1
-	.size	FooVar, 4
-
-	.type	BarVar, at object                  # @BarVar
-	.globl	BarVar
-	.p2align	2, 0x0
-BarVar:
-	.long	2                               # 0x2
-	.size	BarVar, 4
-
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/Inputs/helperSafeICFICPTest.s b/bolt/test/X86/Inputs/helperSafeICFICPTest.s
deleted file mode 100644
index ae62b4f292656f..00000000000000
--- a/bolt/test/X86/Inputs/helperSafeICFICPTest.s
+++ /dev/null
@@ -1,40 +0,0 @@
-# clang++ -O2 helper.cpp -c -o helperProf.o
-# int returnFive() {
-#   return 5;
-# }
-# int returnFourOrFive(int val) {
-#   return val == 1 ? 4 : 5;
-# }
-
-	.text
-	.file	"helper.cpp"
-	.globl	_Z10returnFivev                 # -- Begin function _Z10returnFivev
-	.p2align	4, 0x90
-	.type	_Z10returnFivev, at function
-_Z10returnFivev:                        # @_Z10returnFivev
-	.cfi_startproc
-# %bb.0:                                # %entry
-	movl	$5, %eax
-	retq
-.Lfunc_end0:
-	.size	_Z10returnFivev, .Lfunc_end0-_Z10returnFivev
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z16returnFourOrFivei           # -- Begin function _Z16returnFourOrFivei
-	.p2align	4, 0x90
-	.type	_Z16returnFourOrFivei, at function
-_Z16returnFourOrFivei:                  # @_Z16returnFourOrFivei
-	.cfi_startproc
-# %bb.0:                                # %entry
-	xorl	%eax, %eax
-	cmpl	$1, %edi
-	sete	%al
-	xorl	$5, %eax
-	retq
-.Lfunc_end1:
-	.size	_Z16returnFourOrFivei, .Lfunc_end1-_Z16returnFourOrFivei
-	.cfi_endproc
-                                        # -- End function
-	.ident	"clang version 20.0.0git"
-	.section	".note.GNU-stack","", at progbits
-	.addrsig
diff --git a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s
index ddc1906d8c5818..0a46d1d9243ddb 100644
--- a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s
+++ b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s
@@ -39,6 +39,10 @@
 #   MY_PRINTF("val: %d", temp);
 #   return temp;
 # }
+# clang++ helper.cpp -c -o
+# #define MY_CONST const
+# int FooVar = 1;
+# int BarVar = 2;
 # Manually modified to remove "extra" assembly.
 	.text
 	.file	"main.cpp"
@@ -136,6 +140,21 @@ main:                                   # @main
 .Lfunc_end6:
 	.size	main, .Lfunc_end6-main
 	.cfi_endproc
+
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
                                         # -- End function
 	.type	.L.str, at object                  # @.str
 	.section	.rodata.str1.1,"aMS", at progbits,1
@@ -143,4 +162,5 @@ main:                                   # @main
 	.asciz	"val: %d\n"
 	.size	.L.str, 9
 
+
 	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s
index 44d4a388995028..0556e1b9bea287 100644
--- a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s
+++ b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s
@@ -49,6 +49,19 @@
 #   MY_PRINTF("val: %d", temp);
 #   return temp;
 # }
+# clang++ helper.cpp -c -o
+# #define MY_CONST const
+# int FooVar = 1;
+# int BarVar = 2;
+# [[clang::noinline]]
+# MY_CONST int barAddHdlper(int a, int b) {
+#   return a + b;
+# }
+#
+# MY_CONST int (*const funcGlobalBarMulExt)(int, int) = barAddHdlper;
+# MY_CONST int fooGlobalFuncHelper(int a, int b) {
+#   return 5 + funcGlobalBarMulExt(a, b);
+# }
 # Manually modified to remove "extra" assembly.
 	.text
 	.file	"main.cpp"
@@ -159,5 +172,45 @@ main:                                   # @main
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
 	.cfi_endproc
+
+
+  	.globl	_Z12barAddHdlperii              # -- Begin function _Z12barAddHdlperii
+	.p2align	4, 0x90
+	.type	_Z12barAddHdlperii, at function
+_Z12barAddHdlperii:                     # @_Z12barAddHdlperii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end01:
+	.size	_Z12barAddHdlperii, .Lfunc_end01-_Z12barAddHdlperii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.p2align	4, 0x90
+	.type	_Z19fooGlobalFuncHelperii, at function
+_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.cfi_startproc
+	callq	_Z12barAddHdlperii
+	retq
+.Lfunc_end11:
+	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end11-_Z19fooGlobalFuncHelperii
+	.cfi_endproc
+                                        # -- End function
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
+
+
                                         # -- End function
 	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s
index 3366b94f3ac9b5..d9c1197ac18192 100644
--- a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s
+++ b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s
@@ -39,6 +39,10 @@
 #   MY_PRINTF("val: %d", temp);
 #   return temp;
 # }
+# clang++ helper.cpp -c -o
+# #define MY_CONST const
+# int FooVar = 1;
+# int BarVar = 2;
 # Manually modified to remove "extra" assembly.
 	.text
 	.file	"main.cpp"
@@ -127,5 +131,20 @@ main:                                   # @main
 .Lfunc_end6:
 	.size	main, .Lfunc_end6-main
 	.cfi_endproc
+
+  	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
                                         # -- End function
 	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s
index 913a1349312a29..834342fd095728 100644
--- a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s
+++ b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s
@@ -48,6 +48,32 @@
 #              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
 #   MY_PRINTF("val: %d", temp);
 #   return temp;
+# }
+# clang++ helper.cpp -c -o
+# #define MY_CONST const
+# int FooVar = 1;
+# int BarVar = 2;
+# [[clang::noinline]]
+# MY_CONST int barAddHdlper(int a, int b) {
+#   return a + b;
+# }
+#
+# MY_CONST int (*const funcGlobalBarMulExt)(int, int) = barAddHdlper;
+# MY_CONST int fooGlobalFuncHelper(int a, int b) {
+#   return 5 + funcGlobalBarMulExt(a, b);
+# }
+# clang++ helper.cpp -c -o
+# #define MY_CONST const
+# int FooVar = 1;
+# int BarVar = 2;
+# [[clang::noinline]]
+# MY_CONST int barAddHdlper(int a, int b) {
+#   return a + b;
+# }
+#
+# MY_CONST int (*const funcGlobalBarMulExt)(int, int) = barAddHdlper;
+# MY_CONST int fooGlobalFuncHelper(int a, int b) {
+#   return 5 + funcGlobalBarMulExt(a, b);
 # }
 
 	.text
@@ -168,6 +194,43 @@ main:                                   # @main
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
 	.cfi_endproc
+
+	.globl	_Z12barAddHdlperii              # -- Begin function _Z12barAddHdlperii
+	.p2align	4, 0x90
+	.type	_Z12barAddHdlperii, at function
+_Z12barAddHdlperii:                     # @_Z12barAddHdlperii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end01:
+	.size	_Z12barAddHdlperii, .Lfunc_end01-_Z12barAddHdlperii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.p2align	4, 0x90
+	.type	_Z19fooGlobalFuncHelperii, at function
+_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.cfi_startproc
+	callq	_Z12barAddHdlperii
+	retq
+.Lfunc_end11:
+	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end11-_Z19fooGlobalFuncHelperii
+	.cfi_endproc
+                                        # -- End function
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
                                         # -- End function
 	.type	.L.str, at object                  # @.str
 	.section	.rodata.str1.1,"aMS", at progbits,1
diff --git a/bolt/test/X86/Inputs/mainSafeICFICPTest.s b/bolt/test/X86/Inputs/mainSafeICFICPTest.s
index 665256da48e777..0479fe56514c55 100644
--- a/bolt/test/X86/Inputs/mainSafeICFICPTest.s
+++ b/bolt/test/X86/Inputs/mainSafeICFICPTest.s
@@ -60,6 +60,13 @@
 #   sum += ptr->func(b, a) + ptr2->func(b, a);
 #   return 0;
 # }
+# clang++ -c helper.cpp -o helper.o
+# int FooVar = 1;
+# int BarVar = 2;
+#
+# int fooGlobalFuncHelper(int a, int b) {
+#   return 5;
+# }
 # Manually modified to remove "extra" assembly.
   .text
 	.file	"main.cpp"
@@ -78,6 +85,35 @@ _Z10createTypei:                        # @_Z10createTypei
 	.size	_Z10createTypei, .Lfunc_end0-_Z10createTypei
 	.cfi_endproc
                                         # -- End function
+
+	.globl	_Z10returnFivev                 # -- Begin function _Z10returnFivev
+	.p2align	4, 0x90
+	.type	_Z10returnFivev, at function
+_Z10returnFivev:                        # @_Z10returnFivev
+	.cfi_startproc
+# %bb.0:                                # %entry
+	movl	$5, %eax
+	retq
+.Lfunc_end01:
+	.size	_Z10returnFivev, .Lfunc_end01-_Z10returnFivev
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z16returnFourOrFivei           # -- Begin function _Z16returnFourOrFivei
+	.p2align	4, 0x90
+	.type	_Z16returnFourOrFivei, at function
+_Z16returnFourOrFivei:                  # @_Z16returnFourOrFivei
+	.cfi_startproc
+# %bb.0:                                # %entry
+	xorl	%eax, %eax
+	cmpl	$1, %edi
+	sete	%al
+	xorl	$5, %eax
+	retq
+.Lfunc_end11:
+	.size	_Z16returnFourOrFivei, .Lfunc_end11-_Z16returnFourOrFivei
+	.cfi_endproc
+
+
 	.globl	main                            # -- Begin function main
 	.p2align	4, 0x90
 	.type	main, at function
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO0.s b/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO0.s
index 42b5069f0fdd66..072901b2319a4e 100644
--- a/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO0.s
+++ b/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO0.s
@@ -163,8 +163,35 @@ main:                                   # @main
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+
+	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.p2align	4, 0x90
+	.type	_Z19fooGlobalFuncHelperii, at function
+_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.cfi_startproc
+# %bb.0:
+	movl	$5, %eax
+	retq
+.Lfunc_end01:
+	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end01-_Z19fooGlobalFuncHelperii
 	.cfi_endproc
                                         # -- End function
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
+
 	.type	funcGlobalBarMul, at object        # @funcGlobalBarMul
 	.data
 	.globl	funcGlobalBarMul
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO3.s b/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO3.s
index 8a0d76a15aca9e..f8c9fe390fea42 100644
--- a/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO3.s
+++ b/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO3.s
@@ -44,6 +44,13 @@
 #              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
 #              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
 #   return temp;
+# }
+# clang++ -c helper.cpp -o helper.o
+# int FooVar = 1;
+# int BarVar = 2;
+#
+# int fooGlobalFuncHelper(int a, int b) {
+#   return 5;
 # }
 	.text
 	.file	"main.cpp"
@@ -163,8 +170,35 @@ main:                                   # @main
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+
+	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.p2align	4, 0x90
+	.type	_Z19fooGlobalFuncHelperii, at function
+_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.cfi_startproc
+# %bb.0:
+	movl	$5, %eax
+	retq
+.Lfunc_end01:
+	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end01-_Z19fooGlobalFuncHelperii
 	.cfi_endproc
                                         # -- End function
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
+
 	.type	funcGlobalBarMul, at object        # @funcGlobalBarMul
 	.data
 	.globl	funcGlobalBarMul
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO0.s b/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO0.s
index 7a9e3fec52a697..a47e7348143630 100644
--- a/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO0.s
+++ b/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO0.s
@@ -46,6 +46,13 @@
 #              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
 #   MY_PRINTF("val: %d", temp);
 #   return temp;
+# }
+# clang++ -c helper.cpp -o helper.o
+# int FooVar = 1;
+# int BarVar = 2;
+#
+# int fooGlobalFuncHelper(int a, int b) {
+#   return 5;
 # }
 	.text
 	.file	"main.cpp"
@@ -164,8 +171,35 @@ main:                                   # @main
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+
+	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.p2align	4, 0x90
+	.type	_Z19fooGlobalFuncHelperii, at function
+_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.cfi_startproc
+# %bb.0:
+	movl	$5, %eax
+	retq
+.Lfunc_end01:
+	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end01-_Z19fooGlobalFuncHelperii
 	.cfi_endproc
                                         # -- End function
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
+
 	.type	_ZZ4mainE16funcGlobalBarAdd, at object # @_ZZ4mainE16funcGlobalBarAdd
 	.data
 	.p2align	3, 0x0
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO3.s b/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO3.s
index d7e70a397eb1e8..d4292fb9b65eee 100644
--- a/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO3.s
+++ b/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO3.s
@@ -45,6 +45,13 @@
 #              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
 #   MY_PRINTF("val: %d", temp);
 #   return temp;
+# }
+# clang++ -c helper.cpp -o helper.o
+# int FooVar = 1;
+# int BarVar = 2;
+#
+# int fooGlobalFuncHelper(int a, int b) {
+#   return 5;
 # }
 	.text
 	.file	"main.cpp"
@@ -164,6 +171,34 @@ main:                                   # @main
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+
+
+	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.p2align	4, 0x90
+	.type	_Z19fooGlobalFuncHelperii, at function
+_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.cfi_startproc
+# %bb.0:
+	movl	$5, %eax
+	retq
+.Lfunc_end01:
+	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end01-_Z19fooGlobalFuncHelperii
 	.cfi_endproc
                                         # -- End function
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
+
 	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-icp.test b/bolt/test/X86/icf-safe-icp.test
index a88a31c620330c..543d61a1f0734f 100644
--- a/bolt/test/X86/icf-safe-icp.test
+++ b/bolt/test/X86/icf-safe-icp.test
@@ -3,8 +3,7 @@
 
 # REQUIRES: system-linux
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFICPTest.s    -o %t1.o
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICFICPTest.s  -o %t2.o
-# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
+# RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf      -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
diff --git a/bolt/test/X86/icf-safe-test1-no-cfg.test b/bolt/test/X86/icf-safe-test1-no-cfg.test
index bbcac0a18977f1..5a147c792eae03 100644
--- a/bolt/test/X86/icf-safe-test1-no-cfg.test
+++ b/bolt/test/X86/icf-safe-test1-no-cfg.test
@@ -2,8 +2,7 @@
 
 # REQUIRES: system-linux
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest1.s -o %t1.o
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
-# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
+# RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf=all      -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf --skip-funcs=_Z7helper1PFiiiEii,main -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
diff --git a/bolt/test/X86/icf-safe-test1-no-relocs.test b/bolt/test/X86/icf-safe-test1-no-relocs.test
index 43be7f19af4bc8..fbaccebe30a957 100644
--- a/bolt/test/X86/icf-safe-test1-no-relocs.test
+++ b/bolt/test/X86/icf-safe-test1-no-relocs.test
@@ -2,8 +2,7 @@
 
 # REQUIRES: system-linux
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest1.s -o %t1.o
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
-# RUN: %clang %cflags %t1.o %t2.o -o %t.exe
+# RUN: %clang %cflags %t1.o -o %t.exe
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: not llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
diff --git a/bolt/test/X86/icf-safe-test1.test b/bolt/test/X86/icf-safe-test1.test
index 89479102f1fda6..e991f2126cf3fb 100644
--- a/bolt/test/X86/icf-safe-test1.test
+++ b/bolt/test/X86/icf-safe-test1.test
@@ -2,8 +2,7 @@
 
 # REQUIRES: system-linux
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest1.s -o %t1.o
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
-# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
+# RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
index fb72e8413ac8cc..eddc3e64650eef 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
@@ -3,8 +3,7 @@
 
 # REQUIRES: system-linux
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFGlobalConstPtrNoPic.s -o %t1.o
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICFGlobalConstPtrNoPic.s    -o %t2.o
-# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q -no-pie
+# RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q -no-pie
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
index fe8009d6087cc9..8c33059c1213f3 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
@@ -3,8 +3,7 @@
 
 # REQUIRES: system-linux
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s -o %t1.o
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICFGlobalConstPtrNoPicExtFuncRef.s    -o %t2.o
-# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q -no-pie
+# RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q -no-pie
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
index 22d85b92a0454a..99e633102f3ce5 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
@@ -3,8 +3,7 @@
 
 # REQUIRES: system-linux
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFGlobalConstPtrPic.s -o %t1.o
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICFGlobalConstPtrPic.s    -o %t2.o
-# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
+# RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
index 9482ac688d8a72..23a94d3e11879b 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
@@ -3,8 +3,7 @@
 
 # REQUIRES: system-linux
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s -o %t1.o
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICFGlobalConstPtrPicExtFuncRef.s    -o %t2.o
-# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
+# RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO0.test b/bolt/test/X86/icf-safe-test2GlobalVarO0.test
index cfe2dd0c745321..6666e488fa7e23 100644
--- a/bolt/test/X86/icf-safe-test2GlobalVarO0.test
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO0.test
@@ -2,8 +2,7 @@
 
 # REQUIRES: system-linux
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest2GlobalVarO0.s -o %t1.o
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
-# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
+# RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO3.test b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
index 9a1c99becb0363..0c8857960e41e9 100644
--- a/bolt/test/X86/icf-safe-test2GlobalVarO3.test
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
@@ -2,8 +2,7 @@
 
 # REQUIRES: system-linux
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest2GlobalVarO3.s -o %t1.o
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
-# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
+# RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO0.test b/bolt/test/X86/icf-safe-test3LocalVarO0.test
index 88d6249f405144..4172b32002b36b 100644
--- a/bolt/test/X86/icf-safe-test3LocalVarO0.test
+++ b/bolt/test/X86/icf-safe-test3LocalVarO0.test
@@ -2,8 +2,7 @@
 
 # REQUIRES: system-linux
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest3LocalVarO0.s -o %t1.o
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
-# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
+# RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO3.test b/bolt/test/X86/icf-safe-test3LocalVarO3.test
index 66696c334b1556..04809ad6dab701 100644
--- a/bolt/test/X86/icf-safe-test3LocalVarO3.test
+++ b/bolt/test/X86/icf-safe-test3LocalVarO3.test
@@ -2,8 +2,7 @@
 
 # REQUIRES: system-linux
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest3LocalVarO3.s -o %t1.o
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/helperSafeICF.s    -o %t2.o
-# RUN: %clang %cflags %t1.o %t2.o -o %t.exe -Wl,-q
+# RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 

>From 8fe4b3cf37ad39cc056f46ffc8c0bcf86865119e Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Mon, 25 Nov 2024 16:26:51 -0800
Subject: [PATCH 15/18] move assembly into test

---
 .../Inputs/mainSafeICFGlobalConstPtrNoPic.s   | 166 ----------
 ...mainSafeICFGlobalConstPtrNoPicExtFuncRef.s | 216 -------------
 .../X86/Inputs/mainSafeICFGlobalConstPtrPic.s | 150 ---------
 .../mainSafeICFGlobalConstPtrPicExtFuncRef.s  | 241 ---------------
 bolt/test/X86/Inputs/mainSafeICFICPTest.s     | 285 -----------------
 bolt/test/X86/Inputs/mainSafeICFTest1.s       | 170 -----------
 .../X86/Inputs/mainSafeICFTest2GlobalVarO0.s  | 209 -------------
 .../X86/Inputs/mainSafeICFTest2GlobalVarO3.s  | 210 -------------
 .../X86/Inputs/mainSafeICFTest3LocalVarO0.s   | 210 -------------
 .../X86/Inputs/mainSafeICFTest3LocalVarO3.s   | 204 -------------
 bolt/test/X86/icf-safe-icp.test               | 289 +++++++++++++++++-
 bolt/test/X86/icf-safe-test1-no-cfg.test      | 173 ++++++++++-
 bolt/test/X86/icf-safe-test1-no-relocs.test   | 173 ++++++++++-
 bolt/test/X86/icf-safe-test1.test             | 173 ++++++++++-
 .../icf-safe-test2GlobalConstPtrNoPic.test    | 169 +++++++++-
 ...fe-test2GlobalConstPtrNoPicExtFuncRef.test | 219 ++++++++++++-
 .../X86/icf-safe-test2GlobalConstPtrPic.test  | 153 +++++++++-
 ...safe-test2GlobalConstPtrPicExtFuncRef.test | 245 ++++++++++++++-
 bolt/test/X86/icf-safe-test2GlobalVarO0.test  | 213 ++++++++++++-
 bolt/test/X86/icf-safe-test2GlobalVarO3.test  | 213 ++++++++++++-
 bolt/test/X86/icf-safe-test3LocalVarO0.test   | 213 ++++++++++++-
 bolt/test/X86/icf-safe-test3LocalVarO3.test   | 207 ++++++++++++-
 22 files changed, 2428 insertions(+), 2073 deletions(-)
 delete mode 100644 bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s
 delete mode 100644 bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s
 delete mode 100644 bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s
 delete mode 100644 bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s
 delete mode 100644 bolt/test/X86/Inputs/mainSafeICFICPTest.s
 delete mode 100644 bolt/test/X86/Inputs/mainSafeICFTest1.s
 delete mode 100644 bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO0.s
 delete mode 100644 bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO3.s
 delete mode 100644 bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO0.s
 delete mode 100644 bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO3.s

diff --git a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s
deleted file mode 100644
index 0a46d1d9243ddb..00000000000000
--- a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPic.s
+++ /dev/null
@@ -1,166 +0,0 @@
-# clang++ main.cpp -c -o
-# #define MY_CONST const
-# extern int FooVar;
-# extern int BarVar;
-# [[clang::noinline]]
-# MY_CONST int fooMul(int a, int b) {
-#   return a * b;
-# }
-# [[clang::noinline]]
-# MY_CONST int barMul(int a, int b) {
-#   return a * b;
-# }
-# [[clang::noinline]]
-# MY_CONST int fooAdd(int a, int b) {
-#   return a + b;
-# }
-# [[clang::noinline]]
-# MY_CONST int barAdd(int a, int b) {
-#   return a + b;
-# }
-# [[clang::noinline]]
-# MY_CONST int helper1(MY_CONST int (*func)(int, int), int a, int b) {
-#   if (func == barAdd)
-#     return 1;
-#   return func(a, b) - 4;
-# }
-# [[clang::noinline]]
-# MY_CONST int helper2(MY_CONST int (*func)(int, int), MY_CONST int (*func2)(int, int), int a, int b) {
-#   if (func == func2)
-#     return 2;
-#   return func(a, b) + func2(a, b);
-# }
-# MY_CONST static int (*MY_CONST funcGlobalBarAdd)(int, int) = barAdd;
-# MY_CONST int (*MY_CONST funcGlobalBarMul)(int, int) = barMul;
-# int main(int argc, char **argv) {
-#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
-#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar)
-#              fooAdd(FooVar, BarVar);
-#   MY_PRINTF("val: %d", temp);
-#   return temp;
-# }
-# clang++ helper.cpp -c -o
-# #define MY_CONST const
-# int FooVar = 1;
-# int BarVar = 2;
-# Manually modified to remove "extra" assembly.
-	.text
-	.file	"main.cpp"
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
-	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
-	.cfi_startproc
-	imull	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
-	retq
-.Lfunc_end0:
-	.size	_Z6fooMulii, .Lfunc_end0-_Z6fooMulii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
-	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
-	.cfi_startproc
-	imull	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
-	retq
-.Lfunc_end1:
-	.size	_Z6barMulii, .Lfunc_end1-_Z6barMulii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
-	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
-	.cfi_startproc
-	addl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
-	retq
-.Lfunc_end2:
-	.size	_Z6fooAddii, .Lfunc_end2-_Z6fooAddii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
-	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
-	.cfi_startproc
-	addl	-8(%rbp), %eax
-	popq	%rbp
-	.cfi_def_cfa %rsp, 8
-	retq
-.Lfunc_end3:
-	.size	_Z6barAddii, .Lfunc_end3-_Z6barAddii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFKiiiEii             # -- Begin function _Z7helper1PFKiiiEii
-	.p2align	4, 0x90
-	.type	_Z7helper1PFKiiiEii, at function
-_Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
-	.cfi_startproc
-	movabsq	$_Z6barAddii, %rax
-	cmpq	%rax, -16(%rbp)
-	retq
-.Lfunc_end4:
-	.size	_Z7helper1PFKiiiEii, .Lfunc_end4-_Z7helper1PFKiiiEii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFKiiiES1_ii          # -- Begin function _Z7helper2PFKiiiES1_ii
-	.p2align	4, 0x90
-	.type	_Z7helper2PFKiiiES1_ii, at function
-_Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
-  .cfi_startproc
-  # no direct function references.
-	retq
-.Lfunc_end5:
-	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end5-_Z7helper2PFKiiiES1_ii
-	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
-	.p2align	4, 0x90
-	.type	main, at function
-main:                                   # @main
-	.cfi_startproc
-	movl	FooVar, %esi
-	movl	BarVar, %edx
-	movabsq	$_Z6barAddii, %rdi
-	callq	_Z7helper1PFKiiiEii
-	movl	%eax, -28(%rbp)                 # 4-byte Spill
-	movl	FooVar, %edx
-	movl	BarVar, %ecx
-	movabsq	$_Z6fooMulii, %rdi
-	movabsq	$_Z6barMulii, %rsi
-	callq	_Z7helper2PFKiiiES1_ii
-	retq
-.Lfunc_end6:
-	.size	main, .Lfunc_end6-main
-	.cfi_endproc
-
-	.type	FooVar, at object                  # @FooVar
-	.data
-	.globl	FooVar
-	.p2align	2, 0x0
-FooVar:
-	.long	1                               # 0x1
-	.size	FooVar, 4
-
-	.type	BarVar, at object                  # @BarVar
-	.globl	BarVar
-	.p2align	2, 0x0
-BarVar:
-	.long	2                               # 0x2
-	.size	BarVar, 4
-                                        # -- End function
-	.type	.L.str, at object                  # @.str
-	.section	.rodata.str1.1,"aMS", at progbits,1
-.L.str:
-	.asciz	"val: %d\n"
-	.size	.L.str, 9
-
-
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s
deleted file mode 100644
index 0556e1b9bea287..00000000000000
--- a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s
+++ /dev/null
@@ -1,216 +0,0 @@
-# clang++ main.cpp -c -o
-# #define MY_CONST const
-# extern int FooVar;
-# extern int BarVar;
-# [[clang::noinline]]
-# MY_CONST int fooSub(int a, int b) {
-#   return a - b;
-# }
-# [[clang::noinline]]
-# MY_CONST int barSub(int a, int b) {
-#   return a - b;
-# }
-# [[clang::noinline]]
-# MY_CONST int fooMul(int a, int b) {
-#   return a * b;
-# }
-# [[clang::noinline]]
-# MY_CONST int barMul(int a, int b) {
-#   return a * b;
-# }
-# [[clang::noinline]]
-# MY_CONST int fooAdd(int a, int b) {
-#   return a + b;
-# }
-# [[clang::noinline]]
-# MY_CONST int barAdd(int a, int b) {
-#   return a + b;
-# }
-# [[clang::noinline]]
-# MY_CONST int helper1(MY_CONST int (*func)(int, int), int a, int b) {
-#   if (func == barAdd)
-#     return 1;
-#   return func(a, b) - 4;
-# }
-# [[clang::noinline]]
-# MY_CONST int helper2(MY_CONST int (*func)(int, int), MY_CONST int (*func2)(int, int), int a, int b) {
-#   if (func == func2)
-#     return 2;
-#   return func(a, b) + func2(a, b);
-# }
-# extern MY_CONST int barAddHdlper(int a, int b);
-# extern MY_CONST int fooGlobalFuncHelper(int a, int b);
-# MY_CONST static int (*const funcGlobalBarAdd)(int, int) = barAddHdlper;
-# MY_CONST int (* const funcGlobalBarMul)(int, int) = fooGlobalFuncHelper;
-# int main(int argc, char **argv) {
-#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
-#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
-#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
-#   MY_PRINTF("val: %d", temp);
-#   return temp;
-# }
-# clang++ helper.cpp -c -o
-# #define MY_CONST const
-# int FooVar = 1;
-# int BarVar = 2;
-# [[clang::noinline]]
-# MY_CONST int barAddHdlper(int a, int b) {
-#   return a + b;
-# }
-#
-# MY_CONST int (*const funcGlobalBarMulExt)(int, int) = barAddHdlper;
-# MY_CONST int fooGlobalFuncHelper(int a, int b) {
-#   return 5 + funcGlobalBarMulExt(a, b);
-# }
-# Manually modified to remove "extra" assembly.
-	.text
-	.file	"main.cpp"
-	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
-	.p2align	4, 0x90
-	.type	_Z6fooSubii, at function
-_Z6fooSubii:                            # @_Z6fooSubii
-	.cfi_startproc
-	subl	-8(%rbp), %eax
-	retq
-.Lfunc_end0:
-	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
-	.p2align	4, 0x90
-	.type	_Z6barSubii, at function
-_Z6barSubii:                            # @_Z6barSubii
-	.cfi_startproc
-	subl	-8(%rbp), %eax
-	retq
-.Lfunc_end1:
-	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
-	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
-	.cfi_startproc
-	imull	-8(%rbp), %eax
-	retq
-.Lfunc_end2:
-	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
-	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
-	.cfi_startproc
-	imull	-8(%rbp), %eax
-	retq
-.Lfunc_end3:
-	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
-	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
-	.cfi_startproc
-	addl	-8(%rbp), %eax
-	retq
-.Lfunc_end4:
-	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
-	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:
-  .cfi_startproc                           # @_Z6barAddii
-	addl	-8(%rbp), %eax
-	retq
-.Lfunc_end5:
-	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFKiiiEii             # -- Begin function _Z7helper1PFKiiiEii
-	.p2align	4, 0x90
-	.type	_Z7helper1PFKiiiEii, at function
-_Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
-	.cfi_startproc
-	movabsq	$_Z6barAddii, %rax
-	cmpq	%rax, -16(%rbp)
-	retq
-.Lfunc_end6:
-	.size	_Z7helper1PFKiiiEii, .Lfunc_end6-_Z7helper1PFKiiiEii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFKiiiES1_ii          # -- Begin function _Z7helper2PFKiiiES1_ii
-	.p2align	4, 0x90
-	.type	_Z7helper2PFKiiiES1_ii, at function
-_Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
-	.cfi_startproc
-  # All operations on registers.
-	retq
-.Lfunc_end7:
-	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end7-_Z7helper2PFKiiiES1_ii
-	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
-	.p2align	4, 0x90
-	.type	main, at function
-main:                                   # @main
-	.cfi_startproc
-	movl	FooVar, %esi
-	movl	BarVar, %edx
-	movabsq	$_Z12barAddHdlperii, %rdi
-	callq	_Z7helper1PFKiiiEii
-	movl	FooVar, %edx
-	movl	BarVar, %ecx
-	movabsq	$_Z6fooMulii, %rdi
-	movabsq	$_Z19fooGlobalFuncHelperii, %rsi
-	callq	_Z7helper2PFKiiiES1_ii
-	retq
-.Lfunc_end8:
-	.size	main, .Lfunc_end8-main
-	.cfi_endproc
-
-
-  	.globl	_Z12barAddHdlperii              # -- Begin function _Z12barAddHdlperii
-	.p2align	4, 0x90
-	.type	_Z12barAddHdlperii, at function
-_Z12barAddHdlperii:                     # @_Z12barAddHdlperii
-	.cfi_startproc
-	addl	-8(%rbp), %eax
-	retq
-.Lfunc_end01:
-	.size	_Z12barAddHdlperii, .Lfunc_end01-_Z12barAddHdlperii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
-	.p2align	4, 0x90
-	.type	_Z19fooGlobalFuncHelperii, at function
-_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
-	.cfi_startproc
-	callq	_Z12barAddHdlperii
-	retq
-.Lfunc_end11:
-	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end11-_Z19fooGlobalFuncHelperii
-	.cfi_endproc
-                                        # -- End function
-	.type	FooVar, at object                  # @FooVar
-	.data
-	.globl	FooVar
-	.p2align	2, 0x0
-FooVar:
-	.long	1                               # 0x1
-	.size	FooVar, 4
-
-	.type	BarVar, at object                  # @BarVar
-	.globl	BarVar
-	.p2align	2, 0x0
-BarVar:
-	.long	2                               # 0x2
-	.size	BarVar, 4
-
-
-                                        # -- End function
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s
deleted file mode 100644
index d9c1197ac18192..00000000000000
--- a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPic.s
+++ /dev/null
@@ -1,150 +0,0 @@
-# clang++ main.cpp -c -o
-# #define MY_CONST const
-# extern int FooVar;
-# extern int BarVar;
-# [[clang::noinline]]
-# MY_CONST int fooMul(int a, int b) {
-#   return a * b;
-# }
-# [[clang::noinline]]
-# MY_CONST int barMul(int a, int b) {
-#   return a * b;
-# }
-# [[clang::noinline]]
-# MY_CONST int fooAdd(int a, int b) {
-#   return a + b;
-# }
-# [[clang::noinline]]
-# MY_CONST int barAdd(int a, int b) {
-#   return a + b;
-# }
-# [[clang::noinline]]
-# MY_CONST int helper1(MY_CONST int (*func)(int, int), int a, int b) {
-#   if (func == barAdd)
-#     return 1;
-#   return func(a, b) - 4;
-# }
-# [[clang::noinline]]
-# MY_CONST int helper2(MY_CONST int (*func)(int, int), MY_CONST int (*func2)(int, int), int a, int b) {
-#   if (func == func2)
-#     return 2;
-#   return func(a, b) + func2(a, b);
-# }
-# MY_CONST static int (*MY_CONST funcGlobalBarAdd)(int, int) = barAdd;
-# MY_CONST int (*MY_CONST funcGlobalBarMul)(int, int) = barMul;
-# int main(int argc, char **argv) {
-#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
-#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) +
-#              fooAdd(FooVar, BarVar);
-#   MY_PRINTF("val: %d", temp);
-#   return temp;
-# }
-# clang++ helper.cpp -c -o
-# #define MY_CONST const
-# int FooVar = 1;
-# int BarVar = 2;
-# Manually modified to remove "extra" assembly.
-	.text
-	.file	"main.cpp"
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
-	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
-	.cfi_startproc
-	imull	-8(%rbp), %eax
-	retq
-.Lfunc_end0:
-	.size	_Z6fooMulii, .Lfunc_end0-_Z6fooMulii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
-	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
-	.cfi_startproc
-	imull	-8(%rbp), %eax
-	retq
-.Lfunc_end1:
-	.size	_Z6barMulii, .Lfunc_end1-_Z6barMulii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
-	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
-	.cfi_startproc
-	addl	-8(%rbp), %eax
-	retq
-.Lfunc_end2:
-	.size	_Z6fooAddii, .Lfunc_end2-_Z6fooAddii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
-	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
-	.cfi_startproc
-	addl	-8(%rbp), %eax
-	retq
-.Lfunc_end3:
-	.size	_Z6barAddii, .Lfunc_end3-_Z6barAddii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFKiiiEii             # -- Begin function _Z7helper1PFKiiiEii
-	.p2align	4, 0x90
-	.type	_Z7helper1PFKiiiEii, at function
-_Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
-	.cfi_startproc
-	leaq	_Z6barAddii(%rip), %rax
-	cmpq	%rax, -16(%rbp)
-	retq
-.Lfunc_end4:
-	.size	_Z7helper1PFKiiiEii, .Lfunc_end4-_Z7helper1PFKiiiEii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFKiiiES1_ii          # -- Begin function _Z7helper2PFKiiiES1_ii
-	.p2align	4, 0x90
-	.type	_Z7helper2PFKiiiES1_ii, at function
-_Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
-	.cfi_startproc
-  # Operates on registers.
-	retq
-.Lfunc_end5:
-	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end5-_Z7helper2PFKiiiES1_ii
-	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
-	.p2align	4, 0x90
-	.type	main, at function
-main:                                   # @main
-	.cfi_startproc
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	leaq	_Z6barAddii(%rip), %rdi
-	callq	_Z7helper1PFKiiiEii
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	leaq	_Z6fooMulii(%rip), %rdi
-	leaq	_Z6barMulii(%rip), %rsi
-	callq	_Z7helper2PFKiiiES1_ii
-	retq
-.Lfunc_end6:
-	.size	main, .Lfunc_end6-main
-	.cfi_endproc
-
-  	.type	FooVar, at object                  # @FooVar
-	.data
-	.globl	FooVar
-	.p2align	2, 0x0
-FooVar:
-	.long	1                               # 0x1
-	.size	FooVar, 4
-
-	.type	BarVar, at object                  # @BarVar
-	.globl	BarVar
-	.p2align	2, 0x0
-BarVar:
-	.long	2                               # 0x2
-	.size	BarVar, 4
-                                        # -- End function
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s b/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s
deleted file mode 100644
index 834342fd095728..00000000000000
--- a/bolt/test/X86/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s
+++ /dev/null
@@ -1,241 +0,0 @@
-# clang++ main.cpp -c -o
-# #define MY_CONST const
-# extern int FooVar;
-# extern int BarVar;
-# [[clang::noinline]]
-# MY_CONST int fooSub(int a, int b) {
-#   return a - b;
-# }
-# [[clang::noinline]]
-# MY_CONST int barSub(int a, int b) {
-#   return a - b;
-# }
-# [[clang::noinline]]
-# MY_CONST int fooMul(int a, int b) {
-#   return a * b;
-# }
-# [[clang::noinline]]
-# MY_CONST int barMul(int a, int b) {
-#   return a * b;
-# }
-# [[clang::noinline]]
-# MY_CONST int fooAdd(int a, int b) {
-#   return a + b;
-# }
-# [[clang::noinline]]
-# MY_CONST int barAdd(int a, int b) {
-#   return a + b;
-# }
-# [[clang::noinline]]
-# MY_CONST int helper1(MY_CONST int (*func)(int, int), int a, int b) {
-#   if (func == barAdd)
-#     return 1;
-#   return func(a, b) - 4;
-# }
-# [[clang::noinline]]
-# MY_CONST int helper2(MY_CONST int (*func)(int, int), MY_CONST int (*func2)(int, int), int a, int b) {
-#   if (func == func2)
-#     return 2;
-#   return func(a, b) + func2(a, b);
-# }
-# extern MY_CONST int barAddHdlper(int a, int b);
-# extern MY_CONST int fooGlobalFuncHelper(int a, int b);
-# MY_CONST static int (*const funcGlobalBarAdd)(int, int) = barAddHdlper;
-# MY_CONST int (* const funcGlobalBarMul)(int, int) = fooGlobalFuncHelper;
-# int main(int argc, char **argv) {
-#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
-#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
-#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
-#   MY_PRINTF("val: %d", temp);
-#   return temp;
-# }
-# clang++ helper.cpp -c -o
-# #define MY_CONST const
-# int FooVar = 1;
-# int BarVar = 2;
-# [[clang::noinline]]
-# MY_CONST int barAddHdlper(int a, int b) {
-#   return a + b;
-# }
-#
-# MY_CONST int (*const funcGlobalBarMulExt)(int, int) = barAddHdlper;
-# MY_CONST int fooGlobalFuncHelper(int a, int b) {
-#   return 5 + funcGlobalBarMulExt(a, b);
-# }
-# clang++ helper.cpp -c -o
-# #define MY_CONST const
-# int FooVar = 1;
-# int BarVar = 2;
-# [[clang::noinline]]
-# MY_CONST int barAddHdlper(int a, int b) {
-#   return a + b;
-# }
-#
-# MY_CONST int (*const funcGlobalBarMulExt)(int, int) = barAddHdlper;
-# MY_CONST int fooGlobalFuncHelper(int a, int b) {
-#   return 5 + funcGlobalBarMulExt(a, b);
-# }
-
-	.text
-	.file	"main.cpp"
-	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
-	.p2align	4, 0x90
-	.type	_Z6fooSubii, at function
-_Z6fooSubii:                            # @_Z6fooSubii
-	.cfi_startproc
-	subl	-8(%rbp), %eax
-	retq
-.Lfunc_end0:
-	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
-	.p2align	4, 0x90
-	.type	_Z6barSubii, at function
-_Z6barSubii:                            # @_Z6barSubii
-	.cfi_startproc
-	subl	-8(%rbp), %eax
-	retq
-.Lfunc_end1:
-	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
-	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
-	.cfi_startproc
-	imull	-8(%rbp), %eax
-	retq
-.Lfunc_end2:
-	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
-	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
-	.cfi_startproc
-	imull	-8(%rbp), %eax
-	retq
-.Lfunc_end3:
-	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
-	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
-	.cfi_startproc
-	addl	-8(%rbp), %eax
-	retq
-.Lfunc_end4:
-	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
-	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
-	.cfi_startproc
-	addl	-8(%rbp), %eax
-	retq
-.Lfunc_end5:
-	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFKiiiEii             # -- Begin function _Z7helper1PFKiiiEii
-	.p2align	4, 0x90
-	.type	_Z7helper1PFKiiiEii, at function
-_Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
-	.cfi_startproc
-	leaq	_Z6barAddii(%rip), %rax
-	cmpq	%rax, -16(%rbp)
-	retq
-.Lfunc_end6:
-	.size	_Z7helper1PFKiiiEii, .Lfunc_end6-_Z7helper1PFKiiiEii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFKiiiES1_ii          # -- Begin function _Z7helper2PFKiiiES1_ii
-	.p2align	4, 0x90
-	.type	_Z7helper2PFKiiiES1_ii, at function
-_Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
-	.cfi_startproc
-  # Operates on registers.
-	retq
-.Lfunc_end7:
-	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end7-_Z7helper2PFKiiiES1_ii
-	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
-	.p2align	4, 0x90
-	.type	main, at function
-main:                                   # @main
-	.cfi_startproc
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	movq	_Z12barAddHdlperii at GOTPCREL(%rip), %rdi
-	callq	_Z7helper1PFKiiiEii
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	leaq	_Z6fooMulii(%rip), %rdi
-	movq	_Z19fooGlobalFuncHelperii at GOTPCREL(%rip), %rsi
-	callq	_Z7helper2PFKiiiES1_ii
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooSubii
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6barSubii               # 4-byte Spill
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooAddii
-	retq
-.Lfunc_end8:
-	.size	main, .Lfunc_end8-main
-	.cfi_endproc
-
-	.globl	_Z12barAddHdlperii              # -- Begin function _Z12barAddHdlperii
-	.p2align	4, 0x90
-	.type	_Z12barAddHdlperii, at function
-_Z12barAddHdlperii:                     # @_Z12barAddHdlperii
-	.cfi_startproc
-	addl	-8(%rbp), %eax
-	retq
-.Lfunc_end01:
-	.size	_Z12barAddHdlperii, .Lfunc_end01-_Z12barAddHdlperii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
-	.p2align	4, 0x90
-	.type	_Z19fooGlobalFuncHelperii, at function
-_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
-	.cfi_startproc
-	callq	_Z12barAddHdlperii
-	retq
-.Lfunc_end11:
-	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end11-_Z19fooGlobalFuncHelperii
-	.cfi_endproc
-                                        # -- End function
-	.type	FooVar, at object                  # @FooVar
-	.data
-	.globl	FooVar
-	.p2align	2, 0x0
-FooVar:
-	.long	1                               # 0x1
-	.size	FooVar, 4
-
-	.type	BarVar, at object                  # @BarVar
-	.globl	BarVar
-	.p2align	2, 0x0
-BarVar:
-	.long	2                               # 0x2
-	.size	BarVar, 4
-                                        # -- End function
-	.type	.L.str, at object                  # @.str
-	.section	.rodata.str1.1,"aMS", at progbits,1
-.L.str:
-	.asciz	"val: %d\n"
-	.size	.L.str, 9
-
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/Inputs/mainSafeICFICPTest.s b/bolt/test/X86/Inputs/mainSafeICFICPTest.s
deleted file mode 100644
index 0479fe56514c55..00000000000000
--- a/bolt/test/X86/Inputs/mainSafeICFICPTest.s
+++ /dev/null
@@ -1,285 +0,0 @@
-# generate profile
-# clang++ -O2 -fprofile-generate=. main.cpp   -c -o mainProf.o
-# PROF=test.profdata
-# clang++ -m64  -fprofile-use=$PROF \
-#   -mllvm -disable-icp=true -mllvm -print-after-all \
-#   -g0 -flto=thin -fwhole-program-vtables -fno-split-lto-unit -O2 \
-#   -fdebug-types-section \
-#   main.cpp -c -o mainProfLTO.bc
-# PASS='pgo-icall-prom'
-# clang++ -m64  -fprofile-use=$PROF \
-#   -O3 -Rpass=$PASS \
-#   -mllvm -print-before=$PASS \
-#   -mllvm -print-after=$PASS \
-#   -mllvm -filter-print-funcs=main \
-#   -mllvm -debug-only=$PASS \
-#   -x ir \
-#   mainProfLTO.bc -c -o mainProfFinal.o
-
-# class Base {
-# public:
-#   virtual int func(int a, int b) const = 0;
-#
-#   virtual ~Base() {};
-# };
-#
-# //namespace {
-# class Derived2 : public Base {
-#   int c = 5;
-# public:
-#   __attribute__((noinline)) int func(int a, int b)const override { return a * (a - b) + this->c; }
-#
-#   ~Derived2() {}
-# };
-#
-# class Derived3 : public Base {
-#   int c = 500;
-# public:
-#   __attribute__((noinline)) int func(int a, int b) const override { return a * (a - b) + this->c; }
-#   ~Derived3() {}
-# };
-# //} // namespace//
-#
-# __attribute__((noinline)) Base *createType(int a) {
-#     Base *base = nullptr;
-#     if (a == 4)
-#       base = new Derived2();
-#     else
-#       base = new Derived3();
-#     return base;
-# }
-#
-# extern int returnFive();
-# extern int returnFourOrFive(int val);
-# int main(int argc, char **argv) {
-#   int sum = 0;
-#   int a = returnFourOrFive(argc);
-#   int b = returnFive();
-#   Base *ptr = createType(a);
-#   Base *ptr2 = createType(b);
-#   sum += ptr->func(b, a) + ptr2->func(b, a);
-#   return 0;
-# }
-# clang++ -c helper.cpp -o helper.o
-# int FooVar = 1;
-# int BarVar = 2;
-#
-# int fooGlobalFuncHelper(int a, int b) {
-#   return 5;
-# }
-# Manually modified to remove "extra" assembly.
-  .text
-	.file	"main.cpp"
-	.section	.text.hot.,"ax", at progbits
-	.globl	_Z10createTypei                 # -- Begin function _Z10createTypei
-	.p2align	4, 0x90
-	.type	_Z10createTypei, at function
-_Z10createTypei:                        # @_Z10createTypei
-	.cfi_startproc
-	callq	_Znwm at PLT
-	leaq	_ZTV8Derived2+16(%rip), %rcx
-	leaq	_ZTV8Derived3+16(%rip), %rdx
-	cmoveq	%rcx, %rdx
-	retq
-.Lfunc_end0:
-	.size	_Z10createTypei, .Lfunc_end0-_Z10createTypei
-	.cfi_endproc
-                                        # -- End function
-
-	.globl	_Z10returnFivev                 # -- Begin function _Z10returnFivev
-	.p2align	4, 0x90
-	.type	_Z10returnFivev, at function
-_Z10returnFivev:                        # @_Z10returnFivev
-	.cfi_startproc
-# %bb.0:                                # %entry
-	movl	$5, %eax
-	retq
-.Lfunc_end01:
-	.size	_Z10returnFivev, .Lfunc_end01-_Z10returnFivev
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z16returnFourOrFivei           # -- Begin function _Z16returnFourOrFivei
-	.p2align	4, 0x90
-	.type	_Z16returnFourOrFivei, at function
-_Z16returnFourOrFivei:                  # @_Z16returnFourOrFivei
-	.cfi_startproc
-# %bb.0:                                # %entry
-	xorl	%eax, %eax
-	cmpl	$1, %edi
-	sete	%al
-	xorl	$5, %eax
-	retq
-.Lfunc_end11:
-	.size	_Z16returnFourOrFivei, .Lfunc_end11-_Z16returnFourOrFivei
-	.cfi_endproc
-
-
-	.globl	main                            # -- Begin function main
-	.p2align	4, 0x90
-	.type	main, at function
-main:                                   # @main
-	.cfi_startproc
-	callq	_Z16returnFourOrFivei at PLT
-	callq	_Z10returnFivev at PLT
-	callq	_Z10createTypei
-	callq	_Z10createTypei
-	leaq	_ZNK8Derived24funcEii(%rip), %rcx
-	jne	.LBB1_2
-	callq	_ZNK8Derived24funcEii
-.LBB1_3:                                # %if.end.icp
-	leaq	_ZNK8Derived34funcEii(%rip), %rcx
-	jne	.LBB1_5
-	callq	_ZNK8Derived34funcEii
-.LBB1_6:                                # %if.end.icp3
-	retq
-.LBB1_2:                                # %if.false.orig_indirect
-	jmp	.LBB1_3
-.LBB1_5:                                # %if.false.orig_indirect2
-	jmp	.LBB1_6
-.Lfunc_end1:
-	.size	main, .Lfunc_end1-main
-	.cfi_endproc
-                                        # -- End function
-	.section	.text.hot._ZNK8Derived24funcEii,"axG", at progbits,_ZNK8Derived24funcEii,comdat
-	.weak	_ZNK8Derived24funcEii           # -- Begin function _ZNK8Derived24funcEii
-	.p2align	4, 0x90
-	.type	_ZNK8Derived24funcEii, at function
-_ZNK8Derived24funcEii:                  # @_ZNK8Derived24funcEii
-	.cfi_startproc
-	imull	%esi, %eax
-	retq
-.Lfunc_end2:
-	.size	_ZNK8Derived24funcEii, .Lfunc_end2-_ZNK8Derived24funcEii
-	.cfi_endproc
-                                        # -- End function
-	.section	.text.unlikely._ZN8Derived2D0Ev,"axG", at progbits,_ZN8Derived2D0Ev,comdat
-	.weak	_ZN8Derived2D0Ev                # -- Begin function _ZN8Derived2D0Ev
-	.p2align	4, 0x90
-	.type	_ZN8Derived2D0Ev, at function
-_ZN8Derived2D0Ev:                       # @_ZN8Derived2D0Ev
-	.cfi_startproc
-# %bb.0:                                # %entry
-	movl	$16, %esi
-	jmp	_ZdlPvm at PLT                     # TAILCALL
-.Lfunc_end3:
-	.size	_ZN8Derived2D0Ev, .Lfunc_end3-_ZN8Derived2D0Ev
-	.cfi_endproc
-                                        # -- End function
-	.section	.text.hot._ZNK8Derived34funcEii,"axG", at progbits,_ZNK8Derived34funcEii,comdat
-	.weak	_ZNK8Derived34funcEii           # -- Begin function _ZNK8Derived34funcEii
-	.p2align	4, 0x90
-	.type	_ZNK8Derived34funcEii, at function
-_ZNK8Derived34funcEii:                  # @_ZNK8Derived34funcEii
-	.cfi_startproc
-	imull	%esi, %eax
-	retq
-.Lfunc_end4:
-	.size	_ZNK8Derived34funcEii, .Lfunc_end4-_ZNK8Derived34funcEii
-	.cfi_endproc
-                                        # -- End function
-	.section	.text.unlikely._ZN4BaseD2Ev,"axG", at progbits,_ZN4BaseD2Ev,comdat
-	.weak	_ZN4BaseD2Ev                    # -- Begin function _ZN4BaseD2Ev
-	.p2align	4, 0x90
-	.type	_ZN4BaseD2Ev, at function
-_ZN4BaseD2Ev:                           # @_ZN4BaseD2Ev
-	.cfi_startproc
-# %bb.0:                                # %entry
-	retq
-.Lfunc_end5:
-	.size	_ZN4BaseD2Ev, .Lfunc_end5-_ZN4BaseD2Ev
-	.cfi_endproc
-                                        # -- End function
-	.section	.text.unlikely._ZN8Derived3D0Ev,"axG", at progbits,_ZN8Derived3D0Ev,comdat
-	.weak	_ZN8Derived3D0Ev                # -- Begin function _ZN8Derived3D0Ev
-	.p2align	4, 0x90
-	.type	_ZN8Derived3D0Ev, at function
-_ZN8Derived3D0Ev:                       # @_ZN8Derived3D0Ev
-	.cfi_startproc
-# %bb.0:                                # %entry
-	movl	$16, %esi
-	jmp	_ZdlPvm at PLT                     # TAILCALL
-.Lfunc_end6:
-	.size	_ZN8Derived3D0Ev, .Lfunc_end6-_ZN8Derived3D0Ev
-	.cfi_endproc
-                                        # -- End function
-	.type	_ZTV8Derived2, at object           # @_ZTV8Derived2
-	.section	.data.rel.ro._ZTV8Derived2,"awG", at progbits,_ZTV8Derived2,comdat
-	.weak	_ZTV8Derived2
-	.p2align	3, 0x0
-_ZTV8Derived2:
-	.quad	0
-	.quad	_ZTI8Derived2
-	.quad	_ZNK8Derived24funcEii
-	.quad	_ZN4BaseD2Ev
-	.quad	_ZN8Derived2D0Ev
-	.size	_ZTV8Derived2, 40
-
-	.type	_ZTS8Derived2, at object           # @_ZTS8Derived2
-	.section	.rodata._ZTS8Derived2,"aG", at progbits,_ZTS8Derived2,comdat
-	.weak	_ZTS8Derived2
-_ZTS8Derived2:
-	.asciz	"8Derived2"
-	.size	_ZTS8Derived2, 10
-
-	.type	_ZTS4Base, at object               # @_ZTS4Base
-	.section	.rodata._ZTS4Base,"aG", at progbits,_ZTS4Base,comdat
-	.weak	_ZTS4Base
-_ZTS4Base:
-	.asciz	"4Base"
-	.size	_ZTS4Base, 6
-
-	.type	_ZTI4Base, at object               # @_ZTI4Base
-	.section	.data.rel.ro._ZTI4Base,"awG", at progbits,_ZTI4Base,comdat
-	.weak	_ZTI4Base
-	.p2align	3, 0x0
-_ZTI4Base:
-	.quad	_ZTVN10__cxxabiv117__class_type_infoE+16
-	.quad	_ZTS4Base
-	.size	_ZTI4Base, 16
-
-	.type	_ZTI8Derived2, at object           # @_ZTI8Derived2
-	.section	.data.rel.ro._ZTI8Derived2,"awG", at progbits,_ZTI8Derived2,comdat
-	.weak	_ZTI8Derived2
-	.p2align	3, 0x0
-_ZTI8Derived2:
-	.quad	_ZTVN10__cxxabiv120__si_class_type_infoE+16
-	.quad	_ZTS8Derived2
-	.quad	_ZTI4Base
-	.size	_ZTI8Derived2, 24
-
-	.type	_ZTV8Derived3, at object           # @_ZTV8Derived3
-	.section	.data.rel.ro._ZTV8Derived3,"awG", at progbits,_ZTV8Derived3,comdat
-	.weak	_ZTV8Derived3
-	.p2align	3, 0x0
-_ZTV8Derived3:
-	.quad	0
-	.quad	_ZTI8Derived3
-	.quad	_ZNK8Derived34funcEii
-	.quad	_ZN4BaseD2Ev
-	.quad	_ZN8Derived3D0Ev
-	.size	_ZTV8Derived3, 40
-
-	.type	_ZTS8Derived3, at object           # @_ZTS8Derived3
-	.section	.rodata._ZTS8Derived3,"aG", at progbits,_ZTS8Derived3,comdat
-	.weak	_ZTS8Derived3
-_ZTS8Derived3:
-	.asciz	"8Derived3"
-	.size	_ZTS8Derived3, 10
-
-	.type	_ZTI8Derived3, at object           # @_ZTI8Derived3
-	.section	.data.rel.ro._ZTI8Derived3,"awG", at progbits,_ZTI8Derived3,comdat
-	.weak	_ZTI8Derived3
-	.p2align	3, 0x0
-_ZTI8Derived3:
-	.quad	_ZTVN10__cxxabiv120__si_class_type_infoE+16
-	.quad	_ZTS8Derived3
-	.quad	_ZTI4Base
-	.size	_ZTI8Derived3, 24
-
-	.cg_profile _Z10createTypei, _Znwm, 2
-	.cg_profile main, _Z16returnFourOrFivei, 1
-	.cg_profile main, _Z10returnFivev, 1
-	.cg_profile main, _Z10createTypei, 2
-	.cg_profile main, _ZNK8Derived24funcEii, 1
-	.cg_profile main, _ZNK8Derived34funcEii, 1
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest1.s b/bolt/test/X86/Inputs/mainSafeICFTest1.s
deleted file mode 100644
index b6e0b6cbf97dcc..00000000000000
--- a/bolt/test/X86/Inputs/mainSafeICFTest1.s
+++ /dev/null
@@ -1,170 +0,0 @@
-# clang++ -c main.cpp -o main.o
-# extern int FooVar;
-# extern int BarVar;
-# [[clang::noinline]]
-# int fooSub(int a, int b) {
-#   return a - b;
-# }
-# [[clang::noinline]]
-# int barSub(int a, int b) {
-#   return a - b;
-# }
-# [[clang::noinline]]
-# int fooMul(int a, int b) {
-#   return a * b;
-# }
-# [[clang::noinline]]
-# int barMul(int a, int b) {
-#   return a * b;
-# }
-# [[clang::noinline]]
-# int fooAdd(int a, int b) {
-#   return a + b;
-# }
-# [[clang::noinline]]
-# int barAdd(int a, int b) {
-#   return a + b;
-# }
-# [[clang::noinline]]
-# int helper1(int (*func)(int, int), int a, int b) {
-#   if (func == barAdd)
-#     return 1;
-#   return func(a, b) - 4;
-# }
-# [[clang::noinline]]
-# int helper2(int (*func)(int, int), int (*func2)(int, int), int a, int b) {
-#   if (func == func2)
-#     return 2;
-#   return func(a, b) + func2(a, b);
-# }
-# int main(int argc, char **argv) {
-#   int temp = helper1(barAdd, FooVar, BarVar) +
-#              helper2(fooMul, barMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
-#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
-#   return temp;
-# }
-	.text
-	.file	"main.cpp"
-	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
-	.p2align	4, 0x90
-	.type	_Z6fooSubii, at function
-_Z6fooSubii:                            # @_Z6fooSubii
-	.cfi_startproc
-	subl	-8(%rbp), %eax
-	retq
-.Lfunc_end0:
-	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
-	.p2align	4, 0x90
-	.type	_Z6barSubii, at function
-_Z6barSubii:                            # @_Z6barSubii
-	.cfi_startproc
-	subl	-8(%rbp), %eax
-	retq
-.Lfunc_end1:
-	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
-	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
-	.cfi_startproc
-	imull	-8(%rbp), %eax
-	retq
-.Lfunc_end2:
-	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
-	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
-	.cfi_startproc
-	imull	-8(%rbp), %eax
-	retq
-.Lfunc_end3:
-	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
-	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
-	.cfi_startproc
-	addl	-8(%rbp), %eax
-	retq
-.Lfunc_end4:
-	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
-	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
-	.cfi_startproc
-	addl	-8(%rbp), %eax
-	retq
-.Lfunc_end5:
-	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
-	.p2align	4, 0x90
-	.type	_Z7helper1PFiiiEii, at function
-_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
-	.cfi_startproc
-	leaq	_Z6barAddii(%rip), %rax
-	cmpq	%rax, -16(%rbp)
-	jne	.LBB6_2
-	jmp	.LBB6_3
-.LBB6_2:
-	callq	*%rax
-.LBB6_3:
-	retq
-.Lfunc_end6:
-	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
-	.p2align	4, 0x90
-	.type	_Z7helper2PFiiiES0_ii, at function
-_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
-	.cfi_startproc
-  # Operates on registers.
-	retq
-.Lfunc_end7:
-	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
-	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
-	.p2align	4, 0x90
-	.type	main, at function
-main:                                   # @main
-	.cfi_startproc
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	leaq	_Z6barAddii(%rip), %rdi
-	callq	_Z7helper1PFiiiEii
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	leaq	_Z6fooMulii(%rip), %rdi
-	leaq	_Z6barMulii(%rip), %rsi
-	callq	_Z7helper2PFiiiES0_ii
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooSubii
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6barSubii
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooAddii
-	retq
-.Lfunc_end8:
-	.size	main, .Lfunc_end8-main
-	.cfi_endproc
-                                        # -- End function
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO0.s b/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO0.s
deleted file mode 100644
index 072901b2319a4e..00000000000000
--- a/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO0.s
+++ /dev/null
@@ -1,209 +0,0 @@
-# clang++ -c main.cpp -o main.o
-# extern int FooVar;
-# extern int BarVar;
-# [[clang::noinline]]
-# int fooSub(int a, int b) {
-#   return a - b;
-# }
-# [[clang::noinline]]
-# int barSub(int a, int b) {
-#   return a - b;
-# }
-# [[clang::noinline]]
-# int fooMul(int a, int b) {
-#   return a * b;
-# }
-# [[clang::noinline]]
-# int barMul(int a, int b) {
-#   return a * b;
-# }
-# [[clang::noinline]]
-# int fooAdd(int a, int b) {
-#   return a + b;
-# }
-# [[clang::noinline]]
-# int barAdd(int a, int b) {
-#   return a + b;
-# }
-# [[clang::noinline]]
-# int helper1(int (*func)(int, int), int a, int b) {
-#   if (func == barAdd)
-#     return 1;
-#   return func(a, b) - 4;
-# }
-# [[clang::noinline]]
-# int helper2(int (*func)(int, int), int (*func2)(int, int), int a, int b) {
-#   if (func == func2)
-#     return 2;
-#   return func(a, b) + func2(a, b);
-# }
-# static int (*funcGlobalBarAdd)(int, int) = barAdd;
-# int (*funcGlobalBarMul)(int, int) = barMul;
-# int main(int argc, char **argv) {
-#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
-#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
-#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
-#   return temp;
-# }
-# Manually modified to remove "extra" assembly.
-	.text
-	.file	"main.cpp"
-	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
-	.p2align	4, 0x90
-	.type	_Z6fooSubii, at function
-_Z6fooSubii:                            # @_Z6fooSubii
-	.cfi_startproc
-	subl	-8(%rbp), %eax
-	retq
-.Lfunc_end0:
-	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
-	.p2align	4, 0x90
-	.type	_Z6barSubii, at function
-_Z6barSubii:                            # @_Z6barSubii
-	.cfi_startproc
-	subl	-8(%rbp), %eax
-	retq
-.Lfunc_end1:
-	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
-	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
-	.cfi_startproc
-	imull	-8(%rbp), %eax
-	retq
-.Lfunc_end2:
-	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
-	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
-	.cfi_startproc
-	imull	-8(%rbp), %eax
-	retq
-.Lfunc_end3:
-	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
-	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
-	.cfi_startproc
-	addl	-8(%rbp), %eax
-	retq
-.Lfunc_end4:
-	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
-	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
-	.cfi_startproc
-	addl	-8(%rbp), %eax
-	retq
-.Lfunc_end5:
-	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
-	.p2align	4, 0x90
-	.type	_Z7helper1PFiiiEii, at function
-_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
-	.cfi_startproc
-	leaq	_Z6barAddii(%rip), %rax
-	cmpq	%rax, -16(%rbp)
-	retq
-.Lfunc_end6:
-	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
-	.p2align	4, 0x90
-	.type	_Z7helper2PFiiiES0_ii, at function
-_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
-	.cfi_startproc
-  # Operates on registers.
-	retq
-.Lfunc_end7:
-	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
-	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
-	.p2align	4, 0x90
-	.type	main, at function
-main:                                   # @main
-	.cfi_startproc
-	movq	_ZL16funcGlobalBarAdd(%rip), %rdi
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z7helper1PFiiiEii
-	movq	funcGlobalBarMul(%rip), %rsi
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	leaq	_Z6fooMulii(%rip), %rdi
-	callq	_Z7helper2PFiiiES0_ii
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooSubii
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6barSubii
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooAddii
-	retq
-.Lfunc_end8:
-	.size	main, .Lfunc_end8-main
-	.cfi_endproc
-
-	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
-	.p2align	4, 0x90
-	.type	_Z19fooGlobalFuncHelperii, at function
-_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
-	.cfi_startproc
-# %bb.0:
-	movl	$5, %eax
-	retq
-.Lfunc_end01:
-	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end01-_Z19fooGlobalFuncHelperii
-	.cfi_endproc
-                                        # -- End function
-	.type	FooVar, at object                  # @FooVar
-	.data
-	.globl	FooVar
-	.p2align	2, 0x0
-FooVar:
-	.long	1                               # 0x1
-	.size	FooVar, 4
-
-	.type	BarVar, at object                  # @BarVar
-	.globl	BarVar
-	.p2align	2, 0x0
-BarVar:
-	.long	2                               # 0x2
-	.size	BarVar, 4
-
-	.type	funcGlobalBarMul, at object        # @funcGlobalBarMul
-	.data
-	.globl	funcGlobalBarMul
-	.p2align	3, 0x0
-funcGlobalBarMul:
-	.quad	_Z6barMulii
-	.size	funcGlobalBarMul, 8
-
-	.type	_ZL16funcGlobalBarAdd, at object   # @_ZL16funcGlobalBarAdd
-	.p2align	3, 0x0
-_ZL16funcGlobalBarAdd:
-	.quad	_Z6barAddii
-	.size	_ZL16funcGlobalBarAdd, 8
-
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO3.s b/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO3.s
deleted file mode 100644
index f8c9fe390fea42..00000000000000
--- a/bolt/test/X86/Inputs/mainSafeICFTest2GlobalVarO3.s
+++ /dev/null
@@ -1,210 +0,0 @@
-# clang++ -O3 -c main.cpp -o main.o
-# extern int FooVar;
-# extern int BarVar;
-# [[clang::noinline]]
-# int fooSub(int a, int b) {
-#   return a - b;
-# }
-# [[clang::noinline]]
-# int barSub(int a, int b) {
-#   return a - b;
-# }
-# [[clang::noinline]]
-# int fooMul(int a, int b) {
-#   return a * b;
-# }
-# [[clang::noinline]]
-# int barMul(int a, int b) {
-#   return a * b;
-# }
-# [[clang::noinline]]
-# int fooAdd(int a, int b) {
-#   return a + b;
-# }
-# [[clang::noinline]]
-# int barAdd(int a, int b) {
-#   return a + b;
-# }
-# [[clang::noinline]]
-# int helper1(int (*func)(int, int), int a, int b) {
-#   if (func == barAdd)
-#     return 1;
-#   return func(a, b) - 4;
-# }
-# [[clang::noinline]]
-# int helper2(int (*func)(int, int), int (*func2)(int, int), int a, int b) {
-#   if (func == func2)
-#     return 2;
-#   return func(a, b) + func2(a, b);
-# }
-# static int (*funcGlobalBarAdd)(int, int) = barAdd;
-# int (*funcGlobalBarMul)(int, int) = barMul;
-# int main(int argc, char **argv) {
-#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
-#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
-#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
-#   return temp;
-# }
-# clang++ -c helper.cpp -o helper.o
-# int FooVar = 1;
-# int BarVar = 2;
-#
-# int fooGlobalFuncHelper(int a, int b) {
-#   return 5;
-# }
-	.text
-	.file	"main.cpp"
-	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
-	.p2align	4, 0x90
-	.type	_Z6fooSubii, at function
-_Z6fooSubii:                            # @_Z6fooSubii
-	.cfi_startproc
-	subl	%esi, %eax
-	retq
-.Lfunc_end0:
-	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
-	.p2align	4, 0x90
-	.type	_Z6barSubii, at function
-_Z6barSubii:                            # @_Z6barSubii
-	.cfi_startproc
-	subl	%esi, %eax
-	retq
-.Lfunc_end1:
-	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
-	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
-	.cfi_startproc
-	imull	%esi, %eax
-	retq
-.Lfunc_end2:
-	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
-	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
-	.cfi_startproc
-	imull	%esi, %eax
-	retq
-.Lfunc_end3:
-	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
-	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
-	.cfi_startproc
-# %bb.0:
-                                        # kill: def $esi killed $esi def $rsi
-                                        # kill: def $edi killed $edi def $rdi
-	leal	(%rdi,%rsi), %eax
-	retq
-.Lfunc_end4:
-	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
-	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
-	.cfi_startproc
-# %bb.0:
-                                        # kill: def $esi killed $esi def $rsi
-                                        # kill: def $edi killed $edi def $rdi
-	leal	(%rdi,%rsi), %eax
-	retq
-.Lfunc_end5:
-	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
-	.p2align	4, 0x90
-	.type	_Z7helper1PFiiiEii, at function
-_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
-	.cfi_startproc
-	leaq	_Z6barAddii(%rip), %rcx
-	cmpq	%rcx, %rdi
-	retq
-.LBB6_1:
-	movl	$1, %eax
-	retq
-.Lfunc_end6:
-	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
-	.p2align	4, 0x90
-	.type	_Z7helper2PFiiiES0_ii, at function
-_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
-	.cfi_startproc
-  # Operates on registers.
-	retq
-.Lfunc_end7:
-	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
-	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
-	.p2align	4, 0x90
-	.type	main, at function
-main:                                   # @main
-	.cfi_startproc
-	movq	FooVar at GOTPCREL(%rip), %r14
-	movq	BarVar at GOTPCREL(%rip), %r15
-	leaq	_Z6barAddii(%rip), %rdi
-	callq	_Z7helper1PFiiiEii
-	movq	funcGlobalBarMul(%rip), %rsi
-	leaq	_Z6fooMulii(%rip), %rdi
-	callq	_Z7helper2PFiiiES0_ii
-	callq	_Z6fooSubii
-	callq	_Z6barSubii
-	callq	_Z6fooAddii
-	retq
-.Lfunc_end8:
-	.size	main, .Lfunc_end8-main
-	.cfi_endproc
-
-	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
-	.p2align	4, 0x90
-	.type	_Z19fooGlobalFuncHelperii, at function
-_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
-	.cfi_startproc
-# %bb.0:
-	movl	$5, %eax
-	retq
-.Lfunc_end01:
-	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end01-_Z19fooGlobalFuncHelperii
-	.cfi_endproc
-                                        # -- End function
-	.type	FooVar, at object                  # @FooVar
-	.data
-	.globl	FooVar
-	.p2align	2, 0x0
-FooVar:
-	.long	1                               # 0x1
-	.size	FooVar, 4
-
-	.type	BarVar, at object                  # @BarVar
-	.globl	BarVar
-	.p2align	2, 0x0
-BarVar:
-	.long	2                               # 0x2
-	.size	BarVar, 4
-
-	.type	funcGlobalBarMul, at object        # @funcGlobalBarMul
-	.data
-	.globl	funcGlobalBarMul
-	.p2align	3, 0x0
-funcGlobalBarMul:
-	.quad	_Z6barMulii
-	.size	funcGlobalBarMul, 8
-
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO0.s b/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO0.s
deleted file mode 100644
index a47e7348143630..00000000000000
--- a/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO0.s
+++ /dev/null
@@ -1,210 +0,0 @@
-
-# clang++ -c main.cpp -o main.o
-# extern int FooVar;
-# extern int BarVar;
-# [[clang::noinline]]
-# int fooSub(int a, int b) {
-#   return a - b;
-# }
-# [[clang::noinline]]
-# int barSub(int a, int b) {
-#   return a - b;
-# }
-# [[clang::noinline]]
-# int fooMul(int a, int b) {
-#   return a * b;
-# }
-# [[clang::noinline]]
-# int barMul(int a, int b) {
-#   return a * b;
-# }
-# [[clang::noinline]]
-# int fooAdd(int a, int b) {
-#   return a + b;
-# }
-# [[clang::noinline]]
-# int barAdd(int a, int b) {
-#   return a + b;
-# }
-# [[clang::noinline]]
-# int helper1(int (*func)(int, int), int a, int b) {
-#   if (func == barAdd)
-#     return 1;
-#   return func(a, b) - 4;
-# }
-# [[clang::noinline]]
-# int helper2(int (*func)(int, int), int (*func2)(int, int), int a, int b) {
-#   if (func == func2)
-#     return 2;
-#   return func(a, b) + func2(a, b);
-# }
-# int main(int argc, char **argv) {
-#   static int (*funcGlobalBarAdd)(int, int) = barAdd;
-#   int (*funcGlobalBarMul)(int, int) = barMul;
-#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
-#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
-#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
-#   MY_PRINTF("val: %d", temp);
-#   return temp;
-# }
-# clang++ -c helper.cpp -o helper.o
-# int FooVar = 1;
-# int BarVar = 2;
-#
-# int fooGlobalFuncHelper(int a, int b) {
-#   return 5;
-# }
-	.text
-	.file	"main.cpp"
-	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
-	.p2align	4, 0x90
-	.type	_Z6fooSubii, at function
-_Z6fooSubii:                            # @_Z6fooSubii
-	.cfi_startproc
-	subl	-8(%rbp), %eax
-	retq
-.Lfunc_end0:
-	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
-	.p2align	4, 0x90
-	.type	_Z6barSubii, at function
-_Z6barSubii:                            # @_Z6barSubii
-	.cfi_startproc
-	subl	-8(%rbp), %eax
-	retq
-.Lfunc_end1:
-	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
-	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
-	.cfi_startproc
-	imull	-8(%rbp), %eax
-	retq
-.Lfunc_end2:
-	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
-	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
-	.cfi_startproc
-	imull	-8(%rbp), %eax
-	retq
-.Lfunc_end3:
-	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
-	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
-	.cfi_startproc
-	addl	-8(%rbp), %eax
-	retq
-.Lfunc_end4:
-	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
-	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
-	.cfi_startproc
-	addl	-8(%rbp), %eax
-	retq
-.Lfunc_end5:
-	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
-	.p2align	4, 0x90
-	.type	_Z7helper1PFiiiEii, at function
-_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
-	.cfi_startproc
-	leaq	_Z6barAddii(%rip), %rax
-	cmpq	%rax, -16(%rbp)
-	retq
-.Lfunc_end6:
-	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
-	.p2align	4, 0x90
-	.type	_Z7helper2PFiiiES0_ii, at function
-_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
-	.cfi_startproc
-  # Operates on registers.
-	retq
-.Lfunc_end7:
-	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
-	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
-	.p2align	4, 0x90
-	.type	main, at function
-main:                                   # @main
-	.cfi_startproc
-	leaq	_Z6barMulii(%rip), %rax
-	movq	_ZZ4mainE16funcGlobalBarAdd(%rip), %rdi
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z7helper1PFiiiEii
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	leaq	_Z6fooMulii(%rip), %rdi
-	callq	_Z7helper2PFiiiES0_ii
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooSubii
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6barSubii
-	movq	FooVar at GOTPCREL(%rip), %rax
-	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooAddii
-	retq
-.Lfunc_end8:
-	.size	main, .Lfunc_end8-main
-	.cfi_endproc
-
-	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
-	.p2align	4, 0x90
-	.type	_Z19fooGlobalFuncHelperii, at function
-_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
-	.cfi_startproc
-# %bb.0:
-	movl	$5, %eax
-	retq
-.Lfunc_end01:
-	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end01-_Z19fooGlobalFuncHelperii
-	.cfi_endproc
-                                        # -- End function
-	.type	FooVar, at object                  # @FooVar
-	.data
-	.globl	FooVar
-	.p2align	2, 0x0
-FooVar:
-	.long	1                               # 0x1
-	.size	FooVar, 4
-
-	.type	BarVar, at object                  # @BarVar
-	.globl	BarVar
-	.p2align	2, 0x0
-BarVar:
-	.long	2                               # 0x2
-	.size	BarVar, 4
-
-	.type	_ZZ4mainE16funcGlobalBarAdd, at object # @_ZZ4mainE16funcGlobalBarAdd
-	.data
-	.p2align	3, 0x0
-_ZZ4mainE16funcGlobalBarAdd:
-	.quad	_Z6barAddii
-	.size	_ZZ4mainE16funcGlobalBarAdd, 8
-
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO3.s b/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO3.s
deleted file mode 100644
index d4292fb9b65eee..00000000000000
--- a/bolt/test/X86/Inputs/mainSafeICFTest3LocalVarO3.s
+++ /dev/null
@@ -1,204 +0,0 @@
-# clang++ -O3 -c main.cpp -o main.o
-# extern int FooVar;
-# extern int BarVar;
-# [[clang::noinline]]
-# int fooSub(int a, int b) {
-#   return a - b;
-# }
-# [[clang::noinline]]
-# int barSub(int a, int b) {
-#   return a - b;
-# }
-# [[clang::noinline]]
-# int fooMul(int a, int b) {
-#   return a * b;
-# }
-# [[clang::noinline]]
-# int barMul(int a, int b) {
-#   return a * b;
-# }
-# [[clang::noinline]]
-# int fooAdd(int a, int b) {
-#   return a + b;
-# }
-# [[clang::noinline]]
-# int barAdd(int a, int b) {
-#   return a + b;
-# }
-# [[clang::noinline]]
-# int helper1(int (*func)(int, int), int a, int b) {
-#   if (func == barAdd)
-#     return 1;
-#   return func(a, b) - 4;
-# }
-# [[clang::noinline]]
-# int helper2(int (*func)(int, int), int (*func2)(int, int), int a, int b) {
-#   if (func == func2)
-#     return 2;
-#   return func(a, b) + func2(a, b);
-# }
-# int main(int argc, char **argv) {
-#   static int (*funcGlobalBarAdd)(int, int) = barAdd;
-#   int (*funcGlobalBarMul)(int, int) = barMul;
-#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
-#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
-#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
-#   MY_PRINTF("val: %d", temp);
-#   return temp;
-# }
-# clang++ -c helper.cpp -o helper.o
-# int FooVar = 1;
-# int BarVar = 2;
-#
-# int fooGlobalFuncHelper(int a, int b) {
-#   return 5;
-# }
-	.text
-	.file	"main.cpp"
-	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
-	.p2align	4, 0x90
-	.type	_Z6fooSubii, at function
-_Z6fooSubii:                            # @_Z6fooSubii
-	.cfi_startproc
-	subl	%esi, %eax
-	retq
-.Lfunc_end0:
-	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
-	.p2align	4, 0x90
-	.type	_Z6barSubii, at function
-_Z6barSubii:                            # @_Z6barSubii
-	.cfi_startproc
-	subl	%esi, %eax
-	retq
-.Lfunc_end1:
-	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
-	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
-	.cfi_startproc
-	imull	%esi, %eax
-	retq
-.Lfunc_end2:
-	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
-	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
-	.cfi_startproc
-	imull	%esi, %eax
-	retq
-.Lfunc_end3:
-	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
-	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
-	.cfi_startproc
-# %bb.0:
-                                        # kill: def $esi killed $esi def $rsi
-                                        # kill: def $edi killed $edi def $rdi
-	leal	(%rdi,%rsi), %eax
-	retq
-.Lfunc_end4:
-	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
-	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
-	.cfi_startproc
-# %bb.0:
-                                        # kill: def $esi killed $esi def $rsi
-                                        # kill: def $edi killed $edi def $rdi
-	leal	(%rdi,%rsi), %eax
-	retq
-.Lfunc_end5:
-	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
-	.p2align	4, 0x90
-	.type	_Z7helper1PFiiiEii, at function
-_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
-	.cfi_startproc
-	leaq	_Z6barAddii(%rip), %rcx
-	cmpq	%rcx, %rdi
-	retq
-.LBB6_1:
-	movl	$1, %eax
-	retq
-.Lfunc_end6:
-	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
-	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
-	.p2align	4, 0x90
-	.type	_Z7helper2PFiiiES0_ii, at function
-_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
-	.cfi_startproc
-  # Operates on registers.
-	retq
-.Lfunc_end7:
-	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
-	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
-	.p2align	4, 0x90
-	.type	main, at function
-main:                                   # @main
-	.cfi_startproc
-	movq	FooVar at GOTPCREL(%rip), %r14
-	movq	BarVar at GOTPCREL(%rip), %r15
-	leaq	_Z6barAddii(%rip), %rdi
-	callq	_Z7helper1PFiiiEii
-	leaq	_Z6fooMulii(%rip), %rdi
-	leaq	_Z6barMulii(%rip), %rsi
-	callq	_Z7helper2PFiiiES0_ii
-	callq	_Z6fooSubii
-	callq	_Z6barSubii
-	callq	_Z6fooAddii
-	retq
-.Lfunc_end8:
-	.size	main, .Lfunc_end8-main
-	.cfi_endproc
-
-
-	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
-	.p2align	4, 0x90
-	.type	_Z19fooGlobalFuncHelperii, at function
-_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
-	.cfi_startproc
-# %bb.0:
-	movl	$5, %eax
-	retq
-.Lfunc_end01:
-	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end01-_Z19fooGlobalFuncHelperii
-	.cfi_endproc
-                                        # -- End function
-	.type	FooVar, at object                  # @FooVar
-	.data
-	.globl	FooVar
-	.p2align	2, 0x0
-FooVar:
-	.long	1                               # 0x1
-	.size	FooVar, 4
-
-	.type	BarVar, at object                  # @BarVar
-	.globl	BarVar
-	.p2align	2, 0x0
-BarVar:
-	.long	2                               # 0x2
-	.size	BarVar, 4
-
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-icp.test b/bolt/test/X86/icf-safe-icp.test
index 543d61a1f0734f..bd6e486700e933 100644
--- a/bolt/test/X86/icf-safe-icp.test
+++ b/bolt/test/X86/icf-safe-icp.test
@@ -2,7 +2,7 @@
 # The compare is generated by the ICP path with instrumentation profiling.
 
 # REQUIRES: system-linux
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFICPTest.s    -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %s -o %t1.o
 # RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf      -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
@@ -16,3 +16,290 @@
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _ZN8Derived3D0Ev into _ZN8Derived2D0Ev
 # SAFEICFCHECK-NEXT: ===---------
+
+
+# generate profile
+# clang++ -O2 -fprofile-generate=. main.cpp   -c -o mainProf.o
+# PROF=test.profdata
+# clang++ -m64  -fprofile-use=$PROF \
+#   -mllvm -disable-icp=true -mllvm -print-after-all \
+#   -g0 -flto=thin -fwhole-program-vtables -fno-split-lto-unit -O2 \
+#   -fdebug-types-section \
+#   main.cpp -c -o mainProfLTO.bc
+# PASS='pgo-icall-prom'
+# clang++ -m64  -fprofile-use=$PROF \
+#   -O3 -Rpass=$PASS \
+#   -mllvm -print-before=$PASS \
+#   -mllvm -print-after=$PASS \
+#   -mllvm -filter-print-funcs=main \
+#   -mllvm -debug-only=$PASS \
+#   -x ir \
+#   mainProfLTO.bc -c -o mainProfFinal.o
+
+# class Base {
+# public:
+#   virtual int func(int a, int b) const = 0;
+#
+#   virtual ~Base() {};
+# };
+#
+# //namespace {
+# class Derived2 : public Base {
+#   int c = 5;
+# public:
+#   __attribute__((noinline)) int func(int a, int b)const override { return a * (a - b) + this->c; }
+#
+#   ~Derived2() {}
+# };
+#
+# class Derived3 : public Base {
+#   int c = 500;
+# public:
+#   __attribute__((noinline)) int func(int a, int b) const override { return a * (a - b) + this->c; }
+#   ~Derived3() {}
+# };
+# //} // namespace//
+#
+# __attribute__((noinline)) Base *createType(int a) {
+#     Base *base = nullptr;
+#     if (a == 4)
+#       base = new Derived2();
+#     else
+#       base = new Derived3();
+#     return base;
+# }
+#
+# extern int returnFive();
+# extern int returnFourOrFive(int val);
+# int main(int argc, char **argv) {
+#   int sum = 0;
+#   int a = returnFourOrFive(argc);
+#   int b = returnFive();
+#   Base *ptr = createType(a);
+#   Base *ptr2 = createType(b);
+#   sum += ptr->func(b, a) + ptr2->func(b, a);
+#   return 0;
+# }
+# clang++ -c helper.cpp -o helper.o
+# int FooVar = 1;
+# int BarVar = 2;
+#
+# int fooGlobalFuncHelper(int a, int b) {
+#   return 5;
+# }
+# Manually modified to remove "extra" assembly.
+  .text
+	.file	"main.cpp"
+	.section	.text.hot.,"ax", at progbits
+	.globl	_Z10createTypei                 # -- Begin function _Z10createTypei
+	.p2align	4, 0x90
+	.type	_Z10createTypei, at function
+_Z10createTypei:                        # @_Z10createTypei
+	.cfi_startproc
+	callq	_Znwm at PLT
+	leaq	_ZTV8Derived2+16(%rip), %rcx
+	leaq	_ZTV8Derived3+16(%rip), %rdx
+	cmoveq	%rcx, %rdx
+	retq
+.Lfunc_end0:
+	.size	_Z10createTypei, .Lfunc_end0-_Z10createTypei
+	.cfi_endproc
+                                        # -- End function
+
+	.globl	_Z10returnFivev                 # -- Begin function _Z10returnFivev
+	.p2align	4, 0x90
+	.type	_Z10returnFivev, at function
+_Z10returnFivev:                        # @_Z10returnFivev
+	.cfi_startproc
+# %bb.0:                                # %entry
+	movl	$5, %eax
+	retq
+.Lfunc_end01:
+	.size	_Z10returnFivev, .Lfunc_end01-_Z10returnFivev
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z16returnFourOrFivei           # -- Begin function _Z16returnFourOrFivei
+	.p2align	4, 0x90
+	.type	_Z16returnFourOrFivei, at function
+_Z16returnFourOrFivei:                  # @_Z16returnFourOrFivei
+	.cfi_startproc
+# %bb.0:                                # %entry
+	xorl	%eax, %eax
+	cmpl	$1, %edi
+	sete	%al
+	xorl	$5, %eax
+	retq
+.Lfunc_end11:
+	.size	_Z16returnFourOrFivei, .Lfunc_end11-_Z16returnFourOrFivei
+	.cfi_endproc
+
+
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+	callq	_Z16returnFourOrFivei at PLT
+	callq	_Z10returnFivev at PLT
+	callq	_Z10createTypei
+	callq	_Z10createTypei
+	leaq	_ZNK8Derived24funcEii(%rip), %rcx
+	jne	.LBB1_2
+	callq	_ZNK8Derived24funcEii
+.LBB1_3:                                # %if.end.icp
+	leaq	_ZNK8Derived34funcEii(%rip), %rcx
+	jne	.LBB1_5
+	callq	_ZNK8Derived34funcEii
+.LBB1_6:                                # %if.end.icp3
+	retq
+.LBB1_2:                                # %if.false.orig_indirect
+	jmp	.LBB1_3
+.LBB1_5:                                # %if.false.orig_indirect2
+	jmp	.LBB1_6
+.Lfunc_end1:
+	.size	main, .Lfunc_end1-main
+	.cfi_endproc
+                                        # -- End function
+	.section	.text.hot._ZNK8Derived24funcEii,"axG", at progbits,_ZNK8Derived24funcEii,comdat
+	.weak	_ZNK8Derived24funcEii           # -- Begin function _ZNK8Derived24funcEii
+	.p2align	4, 0x90
+	.type	_ZNK8Derived24funcEii, at function
+_ZNK8Derived24funcEii:                  # @_ZNK8Derived24funcEii
+	.cfi_startproc
+	imull	%esi, %eax
+	retq
+.Lfunc_end2:
+	.size	_ZNK8Derived24funcEii, .Lfunc_end2-_ZNK8Derived24funcEii
+	.cfi_endproc
+                                        # -- End function
+	.section	.text.unlikely._ZN8Derived2D0Ev,"axG", at progbits,_ZN8Derived2D0Ev,comdat
+	.weak	_ZN8Derived2D0Ev                # -- Begin function _ZN8Derived2D0Ev
+	.p2align	4, 0x90
+	.type	_ZN8Derived2D0Ev, at function
+_ZN8Derived2D0Ev:                       # @_ZN8Derived2D0Ev
+	.cfi_startproc
+# %bb.0:                                # %entry
+	movl	$16, %esi
+	jmp	_ZdlPvm at PLT                     # TAILCALL
+.Lfunc_end3:
+	.size	_ZN8Derived2D0Ev, .Lfunc_end3-_ZN8Derived2D0Ev
+	.cfi_endproc
+                                        # -- End function
+	.section	.text.hot._ZNK8Derived34funcEii,"axG", at progbits,_ZNK8Derived34funcEii,comdat
+	.weak	_ZNK8Derived34funcEii           # -- Begin function _ZNK8Derived34funcEii
+	.p2align	4, 0x90
+	.type	_ZNK8Derived34funcEii, at function
+_ZNK8Derived34funcEii:                  # @_ZNK8Derived34funcEii
+	.cfi_startproc
+	imull	%esi, %eax
+	retq
+.Lfunc_end4:
+	.size	_ZNK8Derived34funcEii, .Lfunc_end4-_ZNK8Derived34funcEii
+	.cfi_endproc
+                                        # -- End function
+	.section	.text.unlikely._ZN4BaseD2Ev,"axG", at progbits,_ZN4BaseD2Ev,comdat
+	.weak	_ZN4BaseD2Ev                    # -- Begin function _ZN4BaseD2Ev
+	.p2align	4, 0x90
+	.type	_ZN4BaseD2Ev, at function
+_ZN4BaseD2Ev:                           # @_ZN4BaseD2Ev
+	.cfi_startproc
+# %bb.0:                                # %entry
+	retq
+.Lfunc_end5:
+	.size	_ZN4BaseD2Ev, .Lfunc_end5-_ZN4BaseD2Ev
+	.cfi_endproc
+                                        # -- End function
+	.section	.text.unlikely._ZN8Derived3D0Ev,"axG", at progbits,_ZN8Derived3D0Ev,comdat
+	.weak	_ZN8Derived3D0Ev                # -- Begin function _ZN8Derived3D0Ev
+	.p2align	4, 0x90
+	.type	_ZN8Derived3D0Ev, at function
+_ZN8Derived3D0Ev:                       # @_ZN8Derived3D0Ev
+	.cfi_startproc
+# %bb.0:                                # %entry
+	movl	$16, %esi
+	jmp	_ZdlPvm at PLT                     # TAILCALL
+.Lfunc_end6:
+	.size	_ZN8Derived3D0Ev, .Lfunc_end6-_ZN8Derived3D0Ev
+	.cfi_endproc
+                                        # -- End function
+	.type	_ZTV8Derived2, at object           # @_ZTV8Derived2
+	.section	.data.rel.ro._ZTV8Derived2,"awG", at progbits,_ZTV8Derived2,comdat
+	.weak	_ZTV8Derived2
+	.p2align	3, 0x0
+_ZTV8Derived2:
+	.quad	0
+	.quad	_ZTI8Derived2
+	.quad	_ZNK8Derived24funcEii
+	.quad	_ZN4BaseD2Ev
+	.quad	_ZN8Derived2D0Ev
+	.size	_ZTV8Derived2, 40
+
+	.type	_ZTS8Derived2, at object           # @_ZTS8Derived2
+	.section	.rodata._ZTS8Derived2,"aG", at progbits,_ZTS8Derived2,comdat
+	.weak	_ZTS8Derived2
+_ZTS8Derived2:
+	.asciz	"8Derived2"
+	.size	_ZTS8Derived2, 10
+
+	.type	_ZTS4Base, at object               # @_ZTS4Base
+	.section	.rodata._ZTS4Base,"aG", at progbits,_ZTS4Base,comdat
+	.weak	_ZTS4Base
+_ZTS4Base:
+	.asciz	"4Base"
+	.size	_ZTS4Base, 6
+
+	.type	_ZTI4Base, at object               # @_ZTI4Base
+	.section	.data.rel.ro._ZTI4Base,"awG", at progbits,_ZTI4Base,comdat
+	.weak	_ZTI4Base
+	.p2align	3, 0x0
+_ZTI4Base:
+	.quad	_ZTVN10__cxxabiv117__class_type_infoE+16
+	.quad	_ZTS4Base
+	.size	_ZTI4Base, 16
+
+	.type	_ZTI8Derived2, at object           # @_ZTI8Derived2
+	.section	.data.rel.ro._ZTI8Derived2,"awG", at progbits,_ZTI8Derived2,comdat
+	.weak	_ZTI8Derived2
+	.p2align	3, 0x0
+_ZTI8Derived2:
+	.quad	_ZTVN10__cxxabiv120__si_class_type_infoE+16
+	.quad	_ZTS8Derived2
+	.quad	_ZTI4Base
+	.size	_ZTI8Derived2, 24
+
+	.type	_ZTV8Derived3, at object           # @_ZTV8Derived3
+	.section	.data.rel.ro._ZTV8Derived3,"awG", at progbits,_ZTV8Derived3,comdat
+	.weak	_ZTV8Derived3
+	.p2align	3, 0x0
+_ZTV8Derived3:
+	.quad	0
+	.quad	_ZTI8Derived3
+	.quad	_ZNK8Derived34funcEii
+	.quad	_ZN4BaseD2Ev
+	.quad	_ZN8Derived3D0Ev
+	.size	_ZTV8Derived3, 40
+
+	.type	_ZTS8Derived3, at object           # @_ZTS8Derived3
+	.section	.rodata._ZTS8Derived3,"aG", at progbits,_ZTS8Derived3,comdat
+	.weak	_ZTS8Derived3
+_ZTS8Derived3:
+	.asciz	"8Derived3"
+	.size	_ZTS8Derived3, 10
+
+	.type	_ZTI8Derived3, at object           # @_ZTI8Derived3
+	.section	.data.rel.ro._ZTI8Derived3,"awG", at progbits,_ZTI8Derived3,comdat
+	.weak	_ZTI8Derived3
+	.p2align	3, 0x0
+_ZTI8Derived3:
+	.quad	_ZTVN10__cxxabiv120__si_class_type_infoE+16
+	.quad	_ZTS8Derived3
+	.quad	_ZTI4Base
+	.size	_ZTI8Derived3, 24
+
+	.cg_profile _Z10createTypei, _Znwm, 2
+	.cg_profile main, _Z16returnFourOrFivei, 1
+	.cg_profile main, _Z10returnFivev, 1
+	.cg_profile main, _Z10createTypei, 2
+	.cg_profile main, _ZNK8Derived24funcEii, 1
+	.cg_profile main, _ZNK8Derived34funcEii, 1
+	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test1-no-cfg.test b/bolt/test/X86/icf-safe-test1-no-cfg.test
index 5a147c792eae03..4abfdb2df538ee 100644
--- a/bolt/test/X86/icf-safe-test1-no-cfg.test
+++ b/bolt/test/X86/icf-safe-test1-no-cfg.test
@@ -1,7 +1,7 @@
 ## Check that BOLT handles correctly folding functions with --icf-safe that can be referenced.
 
 # REQUIRES: system-linux
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest1.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %s -o %t1.o
 # RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf=all      -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf --skip-funcs=_Z7helper1PFiiiEii,main -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
@@ -17,3 +17,174 @@
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 # SAFEICFCHECK-NEXT: ===---------
+
+# clang++ -c main.cpp -o main.o
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# int fooSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int barSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int helper1(int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# int helper2(int (*func)(int, int), int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# int main(int argc, char **argv) {
+#   int temp = helper1(barAdd, FooVar, BarVar) +
+#              helper2(fooMul, barMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
+#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#   return temp;
+# }
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.p2align	4, 0x90
+	.type	_Z6fooSubii, at function
+_Z6fooSubii:                            # @_Z6fooSubii
+	.cfi_startproc
+	subl	-8(%rbp), %eax
+	retq
+.Lfunc_end0:
+	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+	.p2align	4, 0x90
+	.type	_Z6barSubii, at function
+_Z6barSubii:                            # @_Z6barSubii
+	.cfi_startproc
+	subl	-8(%rbp), %eax
+	retq
+.Lfunc_end1:
+	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+	imull	-8(%rbp), %eax
+	retq
+.Lfunc_end2:
+	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+	imull	-8(%rbp), %eax
+	retq
+.Lfunc_end3:
+	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end4:
+	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end5:
+	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFiiiEii, at function
+_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.cfi_startproc
+	leaq	_Z6barAddii(%rip), %rax
+	cmpq	%rax, -16(%rbp)
+	jne	.LBB6_2
+	jmp	.LBB6_3
+.LBB6_2:
+	callq	*%rax
+.LBB6_3:
+	retq
+.Lfunc_end6:
+	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFiiiES0_ii, at function
+_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.cfi_startproc
+  # Operates on registers.
+	retq
+.Lfunc_end7:
+	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	leaq	_Z6barAddii(%rip), %rdi
+	callq	_Z7helper1PFiiiEii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	leaq	_Z6fooMulii(%rip), %rdi
+	leaq	_Z6barMulii(%rip), %rsi
+	callq	_Z7helper2PFiiiES0_ii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z6fooSubii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z6barSubii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z6fooAddii
+	retq
+.Lfunc_end8:
+	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+                                        # -- End function
+	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test1-no-relocs.test b/bolt/test/X86/icf-safe-test1-no-relocs.test
index fbaccebe30a957..f773d10b941684 100644
--- a/bolt/test/X86/icf-safe-test1-no-relocs.test
+++ b/bolt/test/X86/icf-safe-test1-no-relocs.test
@@ -1,7 +1,7 @@
 ## Checks that BOLT handles correctly with no relocations with --icf=safe option.
 
 # REQUIRES: system-linux
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest1.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %s -o %t1.o
 # RUN: %clang %cflags %t1.o -o %t.exe
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: not llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
@@ -12,3 +12,174 @@
 # ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 
 # SAFEICFCHECK: BOLT-ERROR: Binary built without relocations. Safe ICF is not supported
+
+# clang++ -c main.cpp -o main.o
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# int fooSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int barSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int helper1(int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# int helper2(int (*func)(int, int), int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# int main(int argc, char **argv) {
+#   int temp = helper1(barAdd, FooVar, BarVar) +
+#              helper2(fooMul, barMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
+#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#   return temp;
+# }
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.p2align	4, 0x90
+	.type	_Z6fooSubii, at function
+_Z6fooSubii:                            # @_Z6fooSubii
+	.cfi_startproc
+	subl	-8(%rbp), %eax
+	retq
+.Lfunc_end0:
+	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+	.p2align	4, 0x90
+	.type	_Z6barSubii, at function
+_Z6barSubii:                            # @_Z6barSubii
+	.cfi_startproc
+	subl	-8(%rbp), %eax
+	retq
+.Lfunc_end1:
+	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+	imull	-8(%rbp), %eax
+	retq
+.Lfunc_end2:
+	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+	imull	-8(%rbp), %eax
+	retq
+.Lfunc_end3:
+	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end4:
+	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end5:
+	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFiiiEii, at function
+_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.cfi_startproc
+	leaq	_Z6barAddii(%rip), %rax
+	cmpq	%rax, -16(%rbp)
+	jne	.LBB6_2
+	jmp	.LBB6_3
+.LBB6_2:
+	callq	*%rax
+.LBB6_3:
+	retq
+.Lfunc_end6:
+	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFiiiES0_ii, at function
+_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.cfi_startproc
+  # Operates on registers.
+	retq
+.Lfunc_end7:
+	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	leaq	_Z6barAddii(%rip), %rdi
+	callq	_Z7helper1PFiiiEii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	leaq	_Z6fooMulii(%rip), %rdi
+	leaq	_Z6barMulii(%rip), %rsi
+	callq	_Z7helper2PFiiiES0_ii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z6fooSubii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z6barSubii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z6fooAddii
+	retq
+.Lfunc_end8:
+	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+                                        # -- End function
+	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test1.test b/bolt/test/X86/icf-safe-test1.test
index e991f2126cf3fb..f09117fe1a1783 100644
--- a/bolt/test/X86/icf-safe-test1.test
+++ b/bolt/test/X86/icf-safe-test1.test
@@ -1,7 +1,7 @@
 ## Check that BOLT handles correctly folding functions with --icf-safe that can be referenced.
 
 # REQUIRES: system-linux
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest1.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %s -o %t1.o
 # RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
@@ -17,3 +17,174 @@
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 # SAFEICFCHECK-NEXT: ===---------
+
+# clang++ -c main.cpp -o main.o
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# int fooSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int barSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int helper1(int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# int helper2(int (*func)(int, int), int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# int main(int argc, char **argv) {
+#   int temp = helper1(barAdd, FooVar, BarVar) +
+#              helper2(fooMul, barMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
+#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#   return temp;
+# }
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.p2align	4, 0x90
+	.type	_Z6fooSubii, at function
+_Z6fooSubii:                            # @_Z6fooSubii
+	.cfi_startproc
+	subl	-8(%rbp), %eax
+	retq
+.Lfunc_end0:
+	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+	.p2align	4, 0x90
+	.type	_Z6barSubii, at function
+_Z6barSubii:                            # @_Z6barSubii
+	.cfi_startproc
+	subl	-8(%rbp), %eax
+	retq
+.Lfunc_end1:
+	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+	imull	-8(%rbp), %eax
+	retq
+.Lfunc_end2:
+	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+	imull	-8(%rbp), %eax
+	retq
+.Lfunc_end3:
+	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end4:
+	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end5:
+	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFiiiEii, at function
+_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.cfi_startproc
+	leaq	_Z6barAddii(%rip), %rax
+	cmpq	%rax, -16(%rbp)
+	jne	.LBB6_2
+	jmp	.LBB6_3
+.LBB6_2:
+	callq	*%rax
+.LBB6_3:
+	retq
+.Lfunc_end6:
+	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFiiiES0_ii, at function
+_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.cfi_startproc
+  # Operates on registers.
+	retq
+.Lfunc_end7:
+	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	leaq	_Z6barAddii(%rip), %rdi
+	callq	_Z7helper1PFiiiEii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	leaq	_Z6fooMulii(%rip), %rdi
+	leaq	_Z6barMulii(%rip), %rsi
+	callq	_Z7helper2PFiiiES0_ii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z6fooSubii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z6barSubii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z6fooAddii
+	retq
+.Lfunc_end8:
+	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+                                        # -- End function
+	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
index eddc3e64650eef..fee72ec53143ec 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
@@ -2,7 +2,7 @@
 ## This checks global const function pointer in -fno-pic mode is handled correctly.
 
 # REQUIRES: system-linux
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFGlobalConstPtrNoPic.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %s -o %t1.o
 # RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q -no-pie
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
@@ -16,3 +16,170 @@
 # SAFEICFCHECK-NEXT: skipping function _Z6barAddii
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: ===---------
+
+# clang++ main.cpp -c -o
+# #define MY_CONST const
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# MY_CONST int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# MY_CONST int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# MY_CONST int helper1(MY_CONST int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# MY_CONST int helper2(MY_CONST int (*func)(int, int), MY_CONST int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# MY_CONST static int (*MY_CONST funcGlobalBarAdd)(int, int) = barAdd;
+# MY_CONST int (*MY_CONST funcGlobalBarMul)(int, int) = barMul;
+# int main(int argc, char **argv) {
+#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
+#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar)
+#              fooAdd(FooVar, BarVar);
+#   MY_PRINTF("val: %d", temp);
+#   return temp;
+# }
+# clang++ helper.cpp -c -o
+# #define MY_CONST const
+# int FooVar = 1;
+# int BarVar = 2;
+# Manually modified to remove "extra" assembly.
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+	imull	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end0:
+	.size	_Z6fooMulii, .Lfunc_end0-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+	imull	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end1:
+	.size	_Z6barMulii, .Lfunc_end1-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end2:
+	.size	_Z6fooAddii, .Lfunc_end2-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	popq	%rbp
+	.cfi_def_cfa %rsp, 8
+	retq
+.Lfunc_end3:
+	.size	_Z6barAddii, .Lfunc_end3-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFKiiiEii             # -- Begin function _Z7helper1PFKiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFKiiiEii, at function
+_Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
+	.cfi_startproc
+	movabsq	$_Z6barAddii, %rax
+	cmpq	%rax, -16(%rbp)
+	retq
+.Lfunc_end4:
+	.size	_Z7helper1PFKiiiEii, .Lfunc_end4-_Z7helper1PFKiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFKiiiES1_ii          # -- Begin function _Z7helper2PFKiiiES1_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFKiiiES1_ii, at function
+_Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
+  .cfi_startproc
+  # no direct function references.
+	retq
+.Lfunc_end5:
+	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end5-_Z7helper2PFKiiiES1_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+	movl	FooVar, %esi
+	movl	BarVar, %edx
+	movabsq	$_Z6barAddii, %rdi
+	callq	_Z7helper1PFKiiiEii
+	movl	%eax, -28(%rbp)                 # 4-byte Spill
+	movl	FooVar, %edx
+	movl	BarVar, %ecx
+	movabsq	$_Z6fooMulii, %rdi
+	movabsq	$_Z6barMulii, %rsi
+	callq	_Z7helper2PFKiiiES1_ii
+	retq
+.Lfunc_end6:
+	.size	main, .Lfunc_end6-main
+	.cfi_endproc
+
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
+                                        # -- End function
+	.type	.L.str, at object                  # @.str
+	.section	.rodata.str1.1,"aMS", at progbits,1
+.L.str:
+	.asciz	"val: %d\n"
+	.size	.L.str, 9
+
+
+	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
index 8c33059c1213f3..4e6a292b530420 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
@@ -2,7 +2,7 @@
 ## This checks global const function pointer in -fno-pic mode is handled correctly.
 
 # REQUIRES: system-linux
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFGlobalConstPtrNoPicExtFuncRef.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %s -o %t1.o
 # RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q -no-pie
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
@@ -20,3 +20,220 @@
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 # SAFEICFCHECK-NEXT: ===---------
+
+# clang++ main.cpp -c -o
+# #define MY_CONST const
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# MY_CONST int fooSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# MY_CONST int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# MY_CONST int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# MY_CONST int helper1(MY_CONST int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# MY_CONST int helper2(MY_CONST int (*func)(int, int), MY_CONST int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# extern MY_CONST int barAddHdlper(int a, int b);
+# extern MY_CONST int fooGlobalFuncHelper(int a, int b);
+# MY_CONST static int (*const funcGlobalBarAdd)(int, int) = barAddHdlper;
+# MY_CONST int (* const funcGlobalBarMul)(int, int) = fooGlobalFuncHelper;
+# int main(int argc, char **argv) {
+#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
+#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
+#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#   MY_PRINTF("val: %d", temp);
+#   return temp;
+# }
+# clang++ helper.cpp -c -o
+# #define MY_CONST const
+# int FooVar = 1;
+# int BarVar = 2;
+# [[clang::noinline]]
+# MY_CONST int barAddHdlper(int a, int b) {
+#   return a + b;
+# }
+#
+# MY_CONST int (*const funcGlobalBarMulExt)(int, int) = barAddHdlper;
+# MY_CONST int fooGlobalFuncHelper(int a, int b) {
+#   return 5 + funcGlobalBarMulExt(a, b);
+# }
+# Manually modified to remove "extra" assembly.
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.p2align	4, 0x90
+	.type	_Z6fooSubii, at function
+_Z6fooSubii:                            # @_Z6fooSubii
+	.cfi_startproc
+	subl	-8(%rbp), %eax
+	retq
+.Lfunc_end0:
+	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+	.p2align	4, 0x90
+	.type	_Z6barSubii, at function
+_Z6barSubii:                            # @_Z6barSubii
+	.cfi_startproc
+	subl	-8(%rbp), %eax
+	retq
+.Lfunc_end1:
+	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+	imull	-8(%rbp), %eax
+	retq
+.Lfunc_end2:
+	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+	imull	-8(%rbp), %eax
+	retq
+.Lfunc_end3:
+	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end4:
+	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:
+  .cfi_startproc                           # @_Z6barAddii
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end5:
+	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFKiiiEii             # -- Begin function _Z7helper1PFKiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFKiiiEii, at function
+_Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
+	.cfi_startproc
+	movabsq	$_Z6barAddii, %rax
+	cmpq	%rax, -16(%rbp)
+	retq
+.Lfunc_end6:
+	.size	_Z7helper1PFKiiiEii, .Lfunc_end6-_Z7helper1PFKiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFKiiiES1_ii          # -- Begin function _Z7helper2PFKiiiES1_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFKiiiES1_ii, at function
+_Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
+	.cfi_startproc
+  # All operations on registers.
+	retq
+.Lfunc_end7:
+	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end7-_Z7helper2PFKiiiES1_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+	movl	FooVar, %esi
+	movl	BarVar, %edx
+	movabsq	$_Z12barAddHdlperii, %rdi
+	callq	_Z7helper1PFKiiiEii
+	movl	FooVar, %edx
+	movl	BarVar, %ecx
+	movabsq	$_Z6fooMulii, %rdi
+	movabsq	$_Z19fooGlobalFuncHelperii, %rsi
+	callq	_Z7helper2PFKiiiES1_ii
+	retq
+.Lfunc_end8:
+	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+
+
+  	.globl	_Z12barAddHdlperii              # -- Begin function _Z12barAddHdlperii
+	.p2align	4, 0x90
+	.type	_Z12barAddHdlperii, at function
+_Z12barAddHdlperii:                     # @_Z12barAddHdlperii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end01:
+	.size	_Z12barAddHdlperii, .Lfunc_end01-_Z12barAddHdlperii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.p2align	4, 0x90
+	.type	_Z19fooGlobalFuncHelperii, at function
+_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.cfi_startproc
+	callq	_Z12barAddHdlperii
+	retq
+.Lfunc_end11:
+	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end11-_Z19fooGlobalFuncHelperii
+	.cfi_endproc
+                                        # -- End function
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
+
+
+                                        # -- End function
+	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
index 99e633102f3ce5..fedd7e6a508884 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
@@ -2,7 +2,7 @@
 ## This checks global const function pointer in -fpic mode is handled correctly.
 
 # REQUIRES: system-linux
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFGlobalConstPtrPic.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %s -o %t1.o
 # RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
@@ -16,3 +16,154 @@
 # SAFEICFCHECK-NEXT: skipping function _Z6barAddii
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: ===---------
+
+# clang++ main.cpp -c -o
+# #define MY_CONST const
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# MY_CONST int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# MY_CONST int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# MY_CONST int helper1(MY_CONST int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# MY_CONST int helper2(MY_CONST int (*func)(int, int), MY_CONST int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# MY_CONST static int (*MY_CONST funcGlobalBarAdd)(int, int) = barAdd;
+# MY_CONST int (*MY_CONST funcGlobalBarMul)(int, int) = barMul;
+# int main(int argc, char **argv) {
+#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
+#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) +
+#              fooAdd(FooVar, BarVar);
+#   MY_PRINTF("val: %d", temp);
+#   return temp;
+# }
+# clang++ helper.cpp -c -o
+# #define MY_CONST const
+# int FooVar = 1;
+# int BarVar = 2;
+# Manually modified to remove "extra" assembly.
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+	imull	-8(%rbp), %eax
+	retq
+.Lfunc_end0:
+	.size	_Z6fooMulii, .Lfunc_end0-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+	imull	-8(%rbp), %eax
+	retq
+.Lfunc_end1:
+	.size	_Z6barMulii, .Lfunc_end1-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end2:
+	.size	_Z6fooAddii, .Lfunc_end2-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end3:
+	.size	_Z6barAddii, .Lfunc_end3-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFKiiiEii             # -- Begin function _Z7helper1PFKiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFKiiiEii, at function
+_Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
+	.cfi_startproc
+	leaq	_Z6barAddii(%rip), %rax
+	cmpq	%rax, -16(%rbp)
+	retq
+.Lfunc_end4:
+	.size	_Z7helper1PFKiiiEii, .Lfunc_end4-_Z7helper1PFKiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFKiiiES1_ii          # -- Begin function _Z7helper2PFKiiiES1_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFKiiiES1_ii, at function
+_Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
+	.cfi_startproc
+  # Operates on registers.
+	retq
+.Lfunc_end5:
+	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end5-_Z7helper2PFKiiiES1_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	leaq	_Z6barAddii(%rip), %rdi
+	callq	_Z7helper1PFKiiiEii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	leaq	_Z6fooMulii(%rip), %rdi
+	leaq	_Z6barMulii(%rip), %rsi
+	callq	_Z7helper2PFKiiiES1_ii
+	retq
+.Lfunc_end6:
+	.size	main, .Lfunc_end6-main
+	.cfi_endproc
+
+  	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
+                                        # -- End function
+	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
index 23a94d3e11879b..956b7037fc2e98 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
@@ -2,7 +2,7 @@
 ## This checks global const function pointer with external function reference in -fpic mode is handled correctly.
 
 # REQUIRES: system-linux
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFGlobalConstPtrPicExtFuncRef.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %s -o %t1.o
 # RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
@@ -20,3 +20,246 @@
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 # SAFEICFCHECK-NEXT: ===---------
+
+
+# clang++ main.cpp -c -o
+# #define MY_CONST const
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# MY_CONST int fooSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# MY_CONST int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# MY_CONST int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# MY_CONST int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# MY_CONST int helper1(MY_CONST int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# MY_CONST int helper2(MY_CONST int (*func)(int, int), MY_CONST int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# extern MY_CONST int barAddHdlper(int a, int b);
+# extern MY_CONST int fooGlobalFuncHelper(int a, int b);
+# MY_CONST static int (*const funcGlobalBarAdd)(int, int) = barAddHdlper;
+# MY_CONST int (* const funcGlobalBarMul)(int, int) = fooGlobalFuncHelper;
+# int main(int argc, char **argv) {
+#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
+#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
+#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#   MY_PRINTF("val: %d", temp);
+#   return temp;
+# }
+# clang++ helper.cpp -c -o
+# #define MY_CONST const
+# int FooVar = 1;
+# int BarVar = 2;
+# [[clang::noinline]]
+# MY_CONST int barAddHdlper(int a, int b) {
+#   return a + b;
+# }
+#
+# MY_CONST int (*const funcGlobalBarMulExt)(int, int) = barAddHdlper;
+# MY_CONST int fooGlobalFuncHelper(int a, int b) {
+#   return 5 + funcGlobalBarMulExt(a, b);
+# }
+# clang++ helper.cpp -c -o
+# #define MY_CONST const
+# int FooVar = 1;
+# int BarVar = 2;
+# [[clang::noinline]]
+# MY_CONST int barAddHdlper(int a, int b) {
+#   return a + b;
+# }
+#
+# MY_CONST int (*const funcGlobalBarMulExt)(int, int) = barAddHdlper;
+# MY_CONST int fooGlobalFuncHelper(int a, int b) {
+#   return 5 + funcGlobalBarMulExt(a, b);
+# }
+
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.p2align	4, 0x90
+	.type	_Z6fooSubii, at function
+_Z6fooSubii:                            # @_Z6fooSubii
+	.cfi_startproc
+	subl	-8(%rbp), %eax
+	retq
+.Lfunc_end0:
+	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+	.p2align	4, 0x90
+	.type	_Z6barSubii, at function
+_Z6barSubii:                            # @_Z6barSubii
+	.cfi_startproc
+	subl	-8(%rbp), %eax
+	retq
+.Lfunc_end1:
+	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+	imull	-8(%rbp), %eax
+	retq
+.Lfunc_end2:
+	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+	imull	-8(%rbp), %eax
+	retq
+.Lfunc_end3:
+	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end4:
+	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end5:
+	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFKiiiEii             # -- Begin function _Z7helper1PFKiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFKiiiEii, at function
+_Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
+	.cfi_startproc
+	leaq	_Z6barAddii(%rip), %rax
+	cmpq	%rax, -16(%rbp)
+	retq
+.Lfunc_end6:
+	.size	_Z7helper1PFKiiiEii, .Lfunc_end6-_Z7helper1PFKiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFKiiiES1_ii          # -- Begin function _Z7helper2PFKiiiES1_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFKiiiES1_ii, at function
+_Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
+	.cfi_startproc
+  # Operates on registers.
+	retq
+.Lfunc_end7:
+	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end7-_Z7helper2PFKiiiES1_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	movq	_Z12barAddHdlperii at GOTPCREL(%rip), %rdi
+	callq	_Z7helper1PFKiiiEii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	leaq	_Z6fooMulii(%rip), %rdi
+	movq	_Z19fooGlobalFuncHelperii at GOTPCREL(%rip), %rsi
+	callq	_Z7helper2PFKiiiES1_ii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z6fooSubii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z6barSubii               # 4-byte Spill
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z6fooAddii
+	retq
+.Lfunc_end8:
+	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+
+	.globl	_Z12barAddHdlperii              # -- Begin function _Z12barAddHdlperii
+	.p2align	4, 0x90
+	.type	_Z12barAddHdlperii, at function
+_Z12barAddHdlperii:                     # @_Z12barAddHdlperii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end01:
+	.size	_Z12barAddHdlperii, .Lfunc_end01-_Z12barAddHdlperii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.p2align	4, 0x90
+	.type	_Z19fooGlobalFuncHelperii, at function
+_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.cfi_startproc
+	callq	_Z12barAddHdlperii
+	retq
+.Lfunc_end11:
+	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end11-_Z19fooGlobalFuncHelperii
+	.cfi_endproc
+                                        # -- End function
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
+                                        # -- End function
+	.type	.L.str, at object                  # @.str
+	.section	.rodata.str1.1,"aMS", at progbits,1
+.L.str:
+	.asciz	"val: %d\n"
+	.size	.L.str, 9
+
+	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO0.test b/bolt/test/X86/icf-safe-test2GlobalVarO0.test
index 6666e488fa7e23..4ebe647eccf01f 100644
--- a/bolt/test/X86/icf-safe-test2GlobalVarO0.test
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO0.test
@@ -1,7 +1,7 @@
 ## Check that BOLT handles correctly folding functions with --icf-safe that can be referenced.
 
 # REQUIRES: system-linux
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest2GlobalVarO0.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %s -o %t1.o
 # RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
@@ -17,3 +17,214 @@
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 # SAFEICFCHECK-NEXT: ===---------
+
+
+# clang++ -c main.cpp -o main.o
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# int fooSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int barSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int helper1(int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# int helper2(int (*func)(int, int), int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# static int (*funcGlobalBarAdd)(int, int) = barAdd;
+# int (*funcGlobalBarMul)(int, int) = barMul;
+# int main(int argc, char **argv) {
+#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
+#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
+#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#   return temp;
+# }
+# Manually modified to remove "extra" assembly.
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.p2align	4, 0x90
+	.type	_Z6fooSubii, at function
+_Z6fooSubii:                            # @_Z6fooSubii
+	.cfi_startproc
+	subl	-8(%rbp), %eax
+	retq
+.Lfunc_end0:
+	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+	.p2align	4, 0x90
+	.type	_Z6barSubii, at function
+_Z6barSubii:                            # @_Z6barSubii
+	.cfi_startproc
+	subl	-8(%rbp), %eax
+	retq
+.Lfunc_end1:
+	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+	imull	-8(%rbp), %eax
+	retq
+.Lfunc_end2:
+	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+	imull	-8(%rbp), %eax
+	retq
+.Lfunc_end3:
+	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end4:
+	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end5:
+	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFiiiEii, at function
+_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.cfi_startproc
+	leaq	_Z6barAddii(%rip), %rax
+	cmpq	%rax, -16(%rbp)
+	retq
+.Lfunc_end6:
+	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFiiiES0_ii, at function
+_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.cfi_startproc
+  # Operates on registers.
+	retq
+.Lfunc_end7:
+	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+	movq	_ZL16funcGlobalBarAdd(%rip), %rdi
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z7helper1PFiiiEii
+	movq	funcGlobalBarMul(%rip), %rsi
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	leaq	_Z6fooMulii(%rip), %rdi
+	callq	_Z7helper2PFiiiES0_ii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z6fooSubii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z6barSubii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z6fooAddii
+	retq
+.Lfunc_end8:
+	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+
+	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.p2align	4, 0x90
+	.type	_Z19fooGlobalFuncHelperii, at function
+_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.cfi_startproc
+# %bb.0:
+	movl	$5, %eax
+	retq
+.Lfunc_end01:
+	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end01-_Z19fooGlobalFuncHelperii
+	.cfi_endproc
+                                        # -- End function
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
+
+	.type	funcGlobalBarMul, at object        # @funcGlobalBarMul
+	.data
+	.globl	funcGlobalBarMul
+	.p2align	3, 0x0
+funcGlobalBarMul:
+	.quad	_Z6barMulii
+	.size	funcGlobalBarMul, 8
+
+	.type	_ZL16funcGlobalBarAdd, at object   # @_ZL16funcGlobalBarAdd
+	.p2align	3, 0x0
+_ZL16funcGlobalBarAdd:
+	.quad	_Z6barAddii
+	.size	_ZL16funcGlobalBarAdd, 8
+
+	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO3.test b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
index 0c8857960e41e9..b25e66c704a3df 100644
--- a/bolt/test/X86/icf-safe-test2GlobalVarO3.test
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
@@ -1,7 +1,7 @@
 ## Check that BOLT handles correctly folding functions with --icf-safe that can be referenced.
 
 # REQUIRES: system-linux
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest2GlobalVarO3.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %s -o %t1.o
 # RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
@@ -17,3 +17,214 @@
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 # SAFEICFCHECK-NEXT: ===---------
+
+# clang++ -O3 -c main.cpp -o main.o
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# int fooSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int barSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int helper1(int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# int helper2(int (*func)(int, int), int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# static int (*funcGlobalBarAdd)(int, int) = barAdd;
+# int (*funcGlobalBarMul)(int, int) = barMul;
+# int main(int argc, char **argv) {
+#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
+#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
+#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#   return temp;
+# }
+# clang++ -c helper.cpp -o helper.o
+# int FooVar = 1;
+# int BarVar = 2;
+#
+# int fooGlobalFuncHelper(int a, int b) {
+#   return 5;
+# }
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.p2align	4, 0x90
+	.type	_Z6fooSubii, at function
+_Z6fooSubii:                            # @_Z6fooSubii
+	.cfi_startproc
+	subl	%esi, %eax
+	retq
+.Lfunc_end0:
+	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+	.p2align	4, 0x90
+	.type	_Z6barSubii, at function
+_Z6barSubii:                            # @_Z6barSubii
+	.cfi_startproc
+	subl	%esi, %eax
+	retq
+.Lfunc_end1:
+	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+	imull	%esi, %eax
+	retq
+.Lfunc_end2:
+	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+	imull	%esi, %eax
+	retq
+.Lfunc_end3:
+	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+# %bb.0:
+                                        # kill: def $esi killed $esi def $rsi
+                                        # kill: def $edi killed $edi def $rdi
+	leal	(%rdi,%rsi), %eax
+	retq
+.Lfunc_end4:
+	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+# %bb.0:
+                                        # kill: def $esi killed $esi def $rsi
+                                        # kill: def $edi killed $edi def $rdi
+	leal	(%rdi,%rsi), %eax
+	retq
+.Lfunc_end5:
+	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFiiiEii, at function
+_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.cfi_startproc
+	leaq	_Z6barAddii(%rip), %rcx
+	cmpq	%rcx, %rdi
+	retq
+.LBB6_1:
+	movl	$1, %eax
+	retq
+.Lfunc_end6:
+	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFiiiES0_ii, at function
+_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.cfi_startproc
+  # Operates on registers.
+	retq
+.Lfunc_end7:
+	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+	movq	FooVar at GOTPCREL(%rip), %r14
+	movq	BarVar at GOTPCREL(%rip), %r15
+	leaq	_Z6barAddii(%rip), %rdi
+	callq	_Z7helper1PFiiiEii
+	movq	funcGlobalBarMul(%rip), %rsi
+	leaq	_Z6fooMulii(%rip), %rdi
+	callq	_Z7helper2PFiiiES0_ii
+	callq	_Z6fooSubii
+	callq	_Z6barSubii
+	callq	_Z6fooAddii
+	retq
+.Lfunc_end8:
+	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+
+	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.p2align	4, 0x90
+	.type	_Z19fooGlobalFuncHelperii, at function
+_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.cfi_startproc
+# %bb.0:
+	movl	$5, %eax
+	retq
+.Lfunc_end01:
+	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end01-_Z19fooGlobalFuncHelperii
+	.cfi_endproc
+                                        # -- End function
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
+
+	.type	funcGlobalBarMul, at object        # @funcGlobalBarMul
+	.data
+	.globl	funcGlobalBarMul
+	.p2align	3, 0x0
+funcGlobalBarMul:
+	.quad	_Z6barMulii
+	.size	funcGlobalBarMul, 8
+
+	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO0.test b/bolt/test/X86/icf-safe-test3LocalVarO0.test
index 4172b32002b36b..9e6e52c64a533b 100644
--- a/bolt/test/X86/icf-safe-test3LocalVarO0.test
+++ b/bolt/test/X86/icf-safe-test3LocalVarO0.test
@@ -1,7 +1,7 @@
 ## Check that BOLT handles correctly folding functions with --icf-safe that can be referenced.
 
 # REQUIRES: system-linux
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest3LocalVarO0.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %s -o %t1.o
 # RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
@@ -17,3 +17,214 @@
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 # SAFEICFCHECK-NEXT: ===---------
+
+
+# clang++ -c main.cpp -o main.o
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# int fooSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int barSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int helper1(int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# int helper2(int (*func)(int, int), int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# int main(int argc, char **argv) {
+#   static int (*funcGlobalBarAdd)(int, int) = barAdd;
+#   int (*funcGlobalBarMul)(int, int) = barMul;
+#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
+#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
+#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#   MY_PRINTF("val: %d", temp);
+#   return temp;
+# }
+# clang++ -c helper.cpp -o helper.o
+# int FooVar = 1;
+# int BarVar = 2;
+#
+# int fooGlobalFuncHelper(int a, int b) {
+#   return 5;
+# }
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.p2align	4, 0x90
+	.type	_Z6fooSubii, at function
+_Z6fooSubii:                            # @_Z6fooSubii
+	.cfi_startproc
+	subl	-8(%rbp), %eax
+	retq
+.Lfunc_end0:
+	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+	.p2align	4, 0x90
+	.type	_Z6barSubii, at function
+_Z6barSubii:                            # @_Z6barSubii
+	.cfi_startproc
+	subl	-8(%rbp), %eax
+	retq
+.Lfunc_end1:
+	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+	imull	-8(%rbp), %eax
+	retq
+.Lfunc_end2:
+	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+	imull	-8(%rbp), %eax
+	retq
+.Lfunc_end3:
+	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end4:
+	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+	addl	-8(%rbp), %eax
+	retq
+.Lfunc_end5:
+	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFiiiEii, at function
+_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.cfi_startproc
+	leaq	_Z6barAddii(%rip), %rax
+	cmpq	%rax, -16(%rbp)
+	retq
+.Lfunc_end6:
+	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFiiiES0_ii, at function
+_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.cfi_startproc
+  # Operates on registers.
+	retq
+.Lfunc_end7:
+	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+	leaq	_Z6barMulii(%rip), %rax
+	movq	_ZZ4mainE16funcGlobalBarAdd(%rip), %rdi
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z7helper1PFiiiEii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	leaq	_Z6fooMulii(%rip), %rdi
+	callq	_Z7helper2PFiiiES0_ii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z6fooSubii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z6barSubii
+	movq	FooVar at GOTPCREL(%rip), %rax
+	movq	BarVar at GOTPCREL(%rip), %rax
+	callq	_Z6fooAddii
+	retq
+.Lfunc_end8:
+	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+
+	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.p2align	4, 0x90
+	.type	_Z19fooGlobalFuncHelperii, at function
+_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.cfi_startproc
+# %bb.0:
+	movl	$5, %eax
+	retq
+.Lfunc_end01:
+	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end01-_Z19fooGlobalFuncHelperii
+	.cfi_endproc
+                                        # -- End function
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
+
+	.type	_ZZ4mainE16funcGlobalBarAdd, at object # @_ZZ4mainE16funcGlobalBarAdd
+	.data
+	.p2align	3, 0x0
+_ZZ4mainE16funcGlobalBarAdd:
+	.quad	_Z6barAddii
+	.size	_ZZ4mainE16funcGlobalBarAdd, 8
+
+	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO3.test b/bolt/test/X86/icf-safe-test3LocalVarO3.test
index 04809ad6dab701..693888493caf78 100644
--- a/bolt/test/X86/icf-safe-test3LocalVarO3.test
+++ b/bolt/test/X86/icf-safe-test3LocalVarO3.test
@@ -1,7 +1,7 @@
 ## Check that BOLT handles correctly folding functions with --icf-safe that can be referenced.
 
 # REQUIRES: system-linux
-# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %p/Inputs/mainSafeICFTest3LocalVarO3.s -o %t1.o
+# RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %s -o %t1.o
 # RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
@@ -17,3 +17,208 @@
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
 # SAFEICFCHECK-NEXT: ===---------
+
+# clang++ -O3 -c main.cpp -o main.o
+# extern int FooVar;
+# extern int BarVar;
+# [[clang::noinline]]
+# int fooSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int barSub(int a, int b) {
+#   return a - b;
+# }
+# [[clang::noinline]]
+# int fooMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int barMul(int a, int b) {
+#   return a * b;
+# }
+# [[clang::noinline]]
+# int fooAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int barAdd(int a, int b) {
+#   return a + b;
+# }
+# [[clang::noinline]]
+# int helper1(int (*func)(int, int), int a, int b) {
+#   if (func == barAdd)
+#     return 1;
+#   return func(a, b) - 4;
+# }
+# [[clang::noinline]]
+# int helper2(int (*func)(int, int), int (*func2)(int, int), int a, int b) {
+#   if (func == func2)
+#     return 2;
+#   return func(a, b) + func2(a, b);
+# }
+# int main(int argc, char **argv) {
+#   static int (*funcGlobalBarAdd)(int, int) = barAdd;
+#   int (*funcGlobalBarMul)(int, int) = barMul;
+#   int temp = helper1(funcGlobalBarAdd, FooVar, BarVar) +
+#              helper2(fooMul, funcGlobalBarMul, FooVar, BarVar) + fooSub(FooVar, BarVar) +
+#              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
+#   MY_PRINTF("val: %d", temp);
+#   return temp;
+# }
+# clang++ -c helper.cpp -o helper.o
+# int FooVar = 1;
+# int BarVar = 2;
+#
+# int fooGlobalFuncHelper(int a, int b) {
+#   return 5;
+# }
+	.text
+	.file	"main.cpp"
+	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.p2align	4, 0x90
+	.type	_Z6fooSubii, at function
+_Z6fooSubii:                            # @_Z6fooSubii
+	.cfi_startproc
+	subl	%esi, %eax
+	retq
+.Lfunc_end0:
+	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+	.p2align	4, 0x90
+	.type	_Z6barSubii, at function
+_Z6barSubii:                            # @_Z6barSubii
+	.cfi_startproc
+	subl	%esi, %eax
+	retq
+.Lfunc_end1:
+	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.p2align	4, 0x90
+	.type	_Z6fooMulii, at function
+_Z6fooMulii:                            # @_Z6fooMulii
+	.cfi_startproc
+	imull	%esi, %eax
+	retq
+.Lfunc_end2:
+	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+	.p2align	4, 0x90
+	.type	_Z6barMulii, at function
+_Z6barMulii:                            # @_Z6barMulii
+	.cfi_startproc
+	imull	%esi, %eax
+	retq
+.Lfunc_end3:
+	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+	.p2align	4, 0x90
+	.type	_Z6fooAddii, at function
+_Z6fooAddii:                            # @_Z6fooAddii
+	.cfi_startproc
+# %bb.0:
+                                        # kill: def $esi killed $esi def $rsi
+                                        # kill: def $edi killed $edi def $rdi
+	leal	(%rdi,%rsi), %eax
+	retq
+.Lfunc_end4:
+	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+	.p2align	4, 0x90
+	.type	_Z6barAddii, at function
+_Z6barAddii:                            # @_Z6barAddii
+	.cfi_startproc
+# %bb.0:
+                                        # kill: def $esi killed $esi def $rsi
+                                        # kill: def $edi killed $edi def $rdi
+	leal	(%rdi,%rsi), %eax
+	retq
+.Lfunc_end5:
+	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+	.p2align	4, 0x90
+	.type	_Z7helper1PFiiiEii, at function
+_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.cfi_startproc
+	leaq	_Z6barAddii(%rip), %rcx
+	cmpq	%rcx, %rdi
+	retq
+.LBB6_1:
+	movl	$1, %eax
+	retq
+.Lfunc_end6:
+	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.cfi_endproc
+                                        # -- End function
+	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+	.p2align	4, 0x90
+	.type	_Z7helper2PFiiiES0_ii, at function
+_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.cfi_startproc
+  # Operates on registers.
+	retq
+.Lfunc_end7:
+	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.cfi_endproc
+                                        # -- End function
+	.globl	main                            # -- Begin function main
+	.p2align	4, 0x90
+	.type	main, at function
+main:                                   # @main
+	.cfi_startproc
+	movq	FooVar at GOTPCREL(%rip), %r14
+	movq	BarVar at GOTPCREL(%rip), %r15
+	leaq	_Z6barAddii(%rip), %rdi
+	callq	_Z7helper1PFiiiEii
+	leaq	_Z6fooMulii(%rip), %rdi
+	leaq	_Z6barMulii(%rip), %rsi
+	callq	_Z7helper2PFiiiES0_ii
+	callq	_Z6fooSubii
+	callq	_Z6barSubii
+	callq	_Z6fooAddii
+	retq
+.Lfunc_end8:
+	.size	main, .Lfunc_end8-main
+	.cfi_endproc
+
+
+	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.p2align	4, 0x90
+	.type	_Z19fooGlobalFuncHelperii, at function
+_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.cfi_startproc
+# %bb.0:
+	movl	$5, %eax
+	retq
+.Lfunc_end01:
+	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end01-_Z19fooGlobalFuncHelperii
+	.cfi_endproc
+                                        # -- End function
+	.type	FooVar, at object                  # @FooVar
+	.data
+	.globl	FooVar
+	.p2align	2, 0x0
+FooVar:
+	.long	1                               # 0x1
+	.size	FooVar, 4
+
+	.type	BarVar, at object                  # @BarVar
+	.globl	BarVar
+	.p2align	2, 0x0
+BarVar:
+	.long	2                               # 0x2
+	.size	BarVar, 4
+
+	.ident	"clang version 20.0.0git"

>From dc41c580850bccd5ce1284956b5cf26801bd992e Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Mon, 25 Nov 2024 16:36:42 -0800
Subject: [PATCH 16/18] removed some lines from assembly

---
 bolt/test/X86/icf-safe-icp.test                        | 10 +---------
 bolt/test/X86/icf-safe-test1-no-cfg.test               |  2 --
 bolt/test/X86/icf-safe-test1-no-relocs.test            |  2 --
 bolt/test/X86/icf-safe-test1.test                      |  2 --
 bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test   |  3 ---
 .../icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test   |  4 ----
 bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test     |  2 --
 .../X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test |  2 --
 bolt/test/X86/icf-safe-test2GlobalVarO0.test           |  2 --
 bolt/test/X86/icf-safe-test2GlobalVarO3.test           |  2 --
 bolt/test/X86/icf-safe-test3LocalVarO0.test            |  2 --
 bolt/test/X86/icf-safe-test3LocalVarO3.test            |  2 --
 12 files changed, 1 insertion(+), 34 deletions(-)

diff --git a/bolt/test/X86/icf-safe-icp.test b/bolt/test/X86/icf-safe-icp.test
index bd6e486700e933..c810e87f73cab6 100644
--- a/bolt/test/X86/icf-safe-icp.test
+++ b/bolt/test/X86/icf-safe-icp.test
@@ -8,8 +8,8 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 # ICFCHECK:      ICF iteration 1
-# ICFCHECK-NEXT: folding _ZN8Derived3D0Ev into _ZN8Derived2D0Ev
 # ICFCHECK-NEXT: folding _ZNK8Derived34funcEii into _ZNK8Derived24funcEii
+# ICFCHECK-NEXT: folding _ZN8Derived3D0Ev into _ZN8Derived2D0Ev
 
 # SAFEICFCHECK:      skipping function _ZNK8Derived24funcEii
 # SAFEICFCHECK-NEXT: skipping function _ZNK8Derived34funcEii
@@ -295,11 +295,3 @@ _ZTI8Derived3:
 	.quad	_ZTS8Derived3
 	.quad	_ZTI4Base
 	.size	_ZTI8Derived3, 24
-
-	.cg_profile _Z10createTypei, _Znwm, 2
-	.cg_profile main, _Z16returnFourOrFivei, 1
-	.cg_profile main, _Z10returnFivev, 1
-	.cg_profile main, _Z10createTypei, 2
-	.cg_profile main, _ZNK8Derived24funcEii, 1
-	.cg_profile main, _ZNK8Derived34funcEii, 1
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test1-no-cfg.test b/bolt/test/X86/icf-safe-test1-no-cfg.test
index 4abfdb2df538ee..d8fa1ef4a89dba 100644
--- a/bolt/test/X86/icf-safe-test1-no-cfg.test
+++ b/bolt/test/X86/icf-safe-test1-no-cfg.test
@@ -186,5 +186,3 @@ main:                                   # @main
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
 	.cfi_endproc
-                                        # -- End function
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test1-no-relocs.test b/bolt/test/X86/icf-safe-test1-no-relocs.test
index f773d10b941684..6f8889f1ffe699 100644
--- a/bolt/test/X86/icf-safe-test1-no-relocs.test
+++ b/bolt/test/X86/icf-safe-test1-no-relocs.test
@@ -181,5 +181,3 @@ main:                                   # @main
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
 	.cfi_endproc
-                                        # -- End function
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test1.test b/bolt/test/X86/icf-safe-test1.test
index f09117fe1a1783..203da0fd928510 100644
--- a/bolt/test/X86/icf-safe-test1.test
+++ b/bolt/test/X86/icf-safe-test1.test
@@ -186,5 +186,3 @@ main:                                   # @main
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
 	.cfi_endproc
-                                        # -- End function
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
index fee72ec53143ec..1f58477d36ca6a 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
@@ -180,6 +180,3 @@ BarVar:
 .L.str:
 	.asciz	"val: %d\n"
 	.size	.L.str, 9
-
-
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
index 4e6a292b530420..44c9a8f08eb67e 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
@@ -233,7 +233,3 @@ FooVar:
 BarVar:
 	.long	2                               # 0x2
 	.size	BarVar, 4
-
-
-                                        # -- End function
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
index fedd7e6a508884..80478833c44d23 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
@@ -165,5 +165,3 @@ FooVar:
 BarVar:
 	.long	2                               # 0x2
 	.size	BarVar, 4
-                                        # -- End function
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
index 956b7037fc2e98..bddfe258109aaf 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
@@ -261,5 +261,3 @@ BarVar:
 .L.str:
 	.asciz	"val: %d\n"
 	.size	.L.str, 9
-
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO0.test b/bolt/test/X86/icf-safe-test2GlobalVarO0.test
index 4ebe647eccf01f..84264cf62bfacb 100644
--- a/bolt/test/X86/icf-safe-test2GlobalVarO0.test
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO0.test
@@ -226,5 +226,3 @@ funcGlobalBarMul:
 _ZL16funcGlobalBarAdd:
 	.quad	_Z6barAddii
 	.size	_ZL16funcGlobalBarAdd, 8
-
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO3.test b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
index b25e66c704a3df..0003d4d5adc68f 100644
--- a/bolt/test/X86/icf-safe-test2GlobalVarO3.test
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
@@ -226,5 +226,3 @@ BarVar:
 funcGlobalBarMul:
 	.quad	_Z6barMulii
 	.size	funcGlobalBarMul, 8
-
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO0.test b/bolt/test/X86/icf-safe-test3LocalVarO0.test
index 9e6e52c64a533b..f95dbc9c683194 100644
--- a/bolt/test/X86/icf-safe-test3LocalVarO0.test
+++ b/bolt/test/X86/icf-safe-test3LocalVarO0.test
@@ -226,5 +226,3 @@ BarVar:
 _ZZ4mainE16funcGlobalBarAdd:
 	.quad	_Z6barAddii
 	.size	_ZZ4mainE16funcGlobalBarAdd, 8
-
-	.ident	"clang version 20.0.0git"
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO3.test b/bolt/test/X86/icf-safe-test3LocalVarO3.test
index 693888493caf78..9d51d1e563d49b 100644
--- a/bolt/test/X86/icf-safe-test3LocalVarO3.test
+++ b/bolt/test/X86/icf-safe-test3LocalVarO3.test
@@ -220,5 +220,3 @@ FooVar:
 BarVar:
 	.long	2                               # 0x2
 	.size	BarVar, 4
-
-	.ident	"clang version 20.0.0git"

>From 6287a7f7b68702aef415502fea1c0ef56b432afe Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Mon, 25 Nov 2024 17:45:30 -0800
Subject: [PATCH 17/18] removed comments, changed demangled names for key
 functions

---
 bolt/test/X86/icf-safe-icp.test               |  96 ++++++------
 bolt/test/X86/icf-safe-test1-no-cfg.test      | 118 +++++++--------
 bolt/test/X86/icf-safe-test1-no-relocs.test   | 108 +++++++-------
 bolt/test/X86/icf-safe-test1.test             | 116 +++++++--------
 .../icf-safe-test2GlobalConstPtrNoPic.test    |  88 +++++------
 ...fe-test2GlobalConstPtrNoPicExtFuncRef.test | 124 ++++++++--------
 .../X86/icf-safe-test2GlobalConstPtrPic.test  |  82 +++++-----
 ...safe-test2GlobalConstPtrPicExtFuncRef.test | 132 ++++++++---------
 bolt/test/X86/icf-safe-test2GlobalVarO0.test  | 138 ++++++++---------
 bolt/test/X86/icf-safe-test2GlobalVarO3.test  | 140 +++++++++---------
 bolt/test/X86/icf-safe-test3LocalVarO0.test   | 136 ++++++++---------
 bolt/test/X86/icf-safe-test3LocalVarO3.test   | 138 +++++++++--------
 12 files changed, 704 insertions(+), 712 deletions(-)

diff --git a/bolt/test/X86/icf-safe-icp.test b/bolt/test/X86/icf-safe-icp.test
index c810e87f73cab6..645266ca287730 100644
--- a/bolt/test/X86/icf-safe-icp.test
+++ b/bolt/test/X86/icf-safe-icp.test
@@ -91,10 +91,10 @@
   .text
 	.file	"main.cpp"
 	.section	.text.hot.,"ax", at progbits
-	.globl	_Z10createTypei                 # -- Begin function _Z10createTypei
+	.globl	_Z10createTypei
 	.p2align	4, 0x90
 	.type	_Z10createTypei, at function
-_Z10createTypei:                        # @_Z10createTypei
+_Z10createTypei:
 	.cfi_startproc
 	callq	_Znwm at PLT
 	leaq	_ZTV8Derived2+16(%rip), %rcx
@@ -104,125 +104,125 @@ _Z10createTypei:                        # @_Z10createTypei
 .Lfunc_end0:
 	.size	_Z10createTypei, .Lfunc_end0-_Z10createTypei
 	.cfi_endproc
-                                        # -- End function
 
-	.globl	_Z10returnFivev                 # -- Begin function _Z10returnFivev
+
+	.globl	_Z10returnFivev
 	.p2align	4, 0x90
 	.type	_Z10returnFivev, at function
-_Z10returnFivev:                        # @_Z10returnFivev
+_Z10returnFivev:
 	.cfi_startproc
-# %bb.0:                                # %entry
+# %bb.0:
 	movl	$5, %eax
 	retq
 .Lfunc_end01:
 	.size	_Z10returnFivev, .Lfunc_end01-_Z10returnFivev
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z16returnFourOrFivei           # -- Begin function _Z16returnFourOrFivei
+
+	.globl	returnFourOrFiveFunc
 	.p2align	4, 0x90
-	.type	_Z16returnFourOrFivei, at function
-_Z16returnFourOrFivei:                  # @_Z16returnFourOrFivei
+	.type	returnFourOrFiveFunc, at function
+returnFourOrFiveFunc:
 	.cfi_startproc
-# %bb.0:                                # %entry
+# %bb.0:
 	xorl	%eax, %eax
 	cmpl	$1, %edi
 	sete	%al
 	xorl	$5, %eax
 	retq
 .Lfunc_end11:
-	.size	_Z16returnFourOrFivei, .Lfunc_end11-_Z16returnFourOrFivei
+	.size	returnFourOrFiveFunc, .Lfunc_end11-returnFourOrFiveFunc
 	.cfi_endproc
 
 
-	.globl	main                            # -- Begin function main
+	.globl	main
 	.p2align	4, 0x90
 	.type	main, at function
-main:                                   # @main
+main:
 	.cfi_startproc
-	callq	_Z16returnFourOrFivei at PLT
+	callq	returnFourOrFiveFunc at PLT
 	callq	_Z10returnFivev at PLT
 	callq	_Z10createTypei
 	callq	_Z10createTypei
 	leaq	_ZNK8Derived24funcEii(%rip), %rcx
 	jne	.LBB1_2
 	callq	_ZNK8Derived24funcEii
-.LBB1_3:                                # %if.end.icp
+.LBB1_3:
 	leaq	_ZNK8Derived34funcEii(%rip), %rcx
 	jne	.LBB1_5
 	callq	_ZNK8Derived34funcEii
-.LBB1_6:                                # %if.end.icp3
+.LBB1_6:
 	retq
-.LBB1_2:                                # %if.false.orig_indirect
+.LBB1_2:
 	jmp	.LBB1_3
-.LBB1_5:                                # %if.false.orig_indirect2
+.LBB1_5:
 	jmp	.LBB1_6
 .Lfunc_end1:
 	.size	main, .Lfunc_end1-main
 	.cfi_endproc
-                                        # -- End function
+
 	.section	.text.hot._ZNK8Derived24funcEii,"axG", at progbits,_ZNK8Derived24funcEii,comdat
-	.weak	_ZNK8Derived24funcEii           # -- Begin function _ZNK8Derived24funcEii
+	.weak	_ZNK8Derived24funcEii
 	.p2align	4, 0x90
 	.type	_ZNK8Derived24funcEii, at function
-_ZNK8Derived24funcEii:                  # @_ZNK8Derived24funcEii
+_ZNK8Derived24funcEii:                  #
 	.cfi_startproc
 	imull	%esi, %eax
 	retq
 .Lfunc_end2:
 	.size	_ZNK8Derived24funcEii, .Lfunc_end2-_ZNK8Derived24funcEii
 	.cfi_endproc
-                                        # -- End function
+
 	.section	.text.unlikely._ZN8Derived2D0Ev,"axG", at progbits,_ZN8Derived2D0Ev,comdat
-	.weak	_ZN8Derived2D0Ev                # -- Begin function _ZN8Derived2D0Ev
+	.weak	_ZN8Derived2D0Ev
 	.p2align	4, 0x90
 	.type	_ZN8Derived2D0Ev, at function
-_ZN8Derived2D0Ev:                       # @_ZN8Derived2D0Ev
+_ZN8Derived2D0Ev:
 	.cfi_startproc
-# %bb.0:                                # %entry
+# %bb.0:
 	movl	$16, %esi
-	jmp	_ZdlPvm at PLT                     # TAILCALL
+	jmp	_ZdlPvm at PLT
 .Lfunc_end3:
 	.size	_ZN8Derived2D0Ev, .Lfunc_end3-_ZN8Derived2D0Ev
 	.cfi_endproc
-                                        # -- End function
+
 	.section	.text.hot._ZNK8Derived34funcEii,"axG", at progbits,_ZNK8Derived34funcEii,comdat
-	.weak	_ZNK8Derived34funcEii           # -- Begin function _ZNK8Derived34funcEii
+	.weak	_ZNK8Derived34funcEii
 	.p2align	4, 0x90
 	.type	_ZNK8Derived34funcEii, at function
-_ZNK8Derived34funcEii:                  # @_ZNK8Derived34funcEii
+_ZNK8Derived34funcEii:
 	.cfi_startproc
 	imull	%esi, %eax
 	retq
 .Lfunc_end4:
 	.size	_ZNK8Derived34funcEii, .Lfunc_end4-_ZNK8Derived34funcEii
 	.cfi_endproc
-                                        # -- End function
+
 	.section	.text.unlikely._ZN4BaseD2Ev,"axG", at progbits,_ZN4BaseD2Ev,comdat
-	.weak	_ZN4BaseD2Ev                    # -- Begin function _ZN4BaseD2Ev
+	.weak	_ZN4BaseD2Ev
 	.p2align	4, 0x90
 	.type	_ZN4BaseD2Ev, at function
-_ZN4BaseD2Ev:                           # @_ZN4BaseD2Ev
+_ZN4BaseD2Ev:
 	.cfi_startproc
-# %bb.0:                                # %entry
+# %bb.0:
 	retq
 .Lfunc_end5:
 	.size	_ZN4BaseD2Ev, .Lfunc_end5-_ZN4BaseD2Ev
 	.cfi_endproc
-                                        # -- End function
+
 	.section	.text.unlikely._ZN8Derived3D0Ev,"axG", at progbits,_ZN8Derived3D0Ev,comdat
-	.weak	_ZN8Derived3D0Ev                # -- Begin function _ZN8Derived3D0Ev
+	.weak	_ZN8Derived3D0Ev
 	.p2align	4, 0x90
 	.type	_ZN8Derived3D0Ev, at function
-_ZN8Derived3D0Ev:                       # @_ZN8Derived3D0Ev
+_ZN8Derived3D0Ev:
 	.cfi_startproc
-# %bb.0:                                # %entry
+# %bb.0:
 	movl	$16, %esi
-	jmp	_ZdlPvm at PLT                     # TAILCALL
+	jmp	_ZdlPvm at PLT
 .Lfunc_end6:
 	.size	_ZN8Derived3D0Ev, .Lfunc_end6-_ZN8Derived3D0Ev
 	.cfi_endproc
-                                        # -- End function
-	.type	_ZTV8Derived2, at object           # @_ZTV8Derived2
+
+	.type	_ZTV8Derived2, at object
 	.section	.data.rel.ro._ZTV8Derived2,"awG", at progbits,_ZTV8Derived2,comdat
 	.weak	_ZTV8Derived2
 	.p2align	3, 0x0
@@ -234,21 +234,21 @@ _ZTV8Derived2:
 	.quad	_ZN8Derived2D0Ev
 	.size	_ZTV8Derived2, 40
 
-	.type	_ZTS8Derived2, at object           # @_ZTS8Derived2
+	.type	_ZTS8Derived2, at object
 	.section	.rodata._ZTS8Derived2,"aG", at progbits,_ZTS8Derived2,comdat
 	.weak	_ZTS8Derived2
 _ZTS8Derived2:
 	.asciz	"8Derived2"
 	.size	_ZTS8Derived2, 10
 
-	.type	_ZTS4Base, at object               # @_ZTS4Base
+	.type	_ZTS4Base, at object
 	.section	.rodata._ZTS4Base,"aG", at progbits,_ZTS4Base,comdat
 	.weak	_ZTS4Base
 _ZTS4Base:
 	.asciz	"4Base"
 	.size	_ZTS4Base, 6
 
-	.type	_ZTI4Base, at object               # @_ZTI4Base
+	.type	_ZTI4Base, at object
 	.section	.data.rel.ro._ZTI4Base,"awG", at progbits,_ZTI4Base,comdat
 	.weak	_ZTI4Base
 	.p2align	3, 0x0
@@ -257,7 +257,7 @@ _ZTI4Base:
 	.quad	_ZTS4Base
 	.size	_ZTI4Base, 16
 
-	.type	_ZTI8Derived2, at object           # @_ZTI8Derived2
+	.type	_ZTI8Derived2, at object
 	.section	.data.rel.ro._ZTI8Derived2,"awG", at progbits,_ZTI8Derived2,comdat
 	.weak	_ZTI8Derived2
 	.p2align	3, 0x0
@@ -267,7 +267,7 @@ _ZTI8Derived2:
 	.quad	_ZTI4Base
 	.size	_ZTI8Derived2, 24
 
-	.type	_ZTV8Derived3, at object           # @_ZTV8Derived3
+	.type	_ZTV8Derived3, at object
 	.section	.data.rel.ro._ZTV8Derived3,"awG", at progbits,_ZTV8Derived3,comdat
 	.weak	_ZTV8Derived3
 	.p2align	3, 0x0
@@ -279,14 +279,14 @@ _ZTV8Derived3:
 	.quad	_ZN8Derived3D0Ev
 	.size	_ZTV8Derived3, 40
 
-	.type	_ZTS8Derived3, at object           # @_ZTS8Derived3
+	.type	_ZTS8Derived3, at object
 	.section	.rodata._ZTS8Derived3,"aG", at progbits,_ZTS8Derived3,comdat
 	.weak	_ZTS8Derived3
 _ZTS8Derived3:
 	.asciz	"8Derived3"
 	.size	_ZTS8Derived3, 10
 
-	.type	_ZTI8Derived3, at object           # @_ZTI8Derived3
+	.type	_ZTI8Derived3, at object
 	.section	.data.rel.ro._ZTI8Derived3,"awG", at progbits,_ZTI8Derived3,comdat
 	.weak	_ZTI8Derived3
 	.p2align	3, 0x0
diff --git a/bolt/test/X86/icf-safe-test1-no-cfg.test b/bolt/test/X86/icf-safe-test1-no-cfg.test
index d8fa1ef4a89dba..65d3868fe14b90 100644
--- a/bolt/test/X86/icf-safe-test1-no-cfg.test
+++ b/bolt/test/X86/icf-safe-test1-no-cfg.test
@@ -4,18 +4,18 @@
 # RUN: llvm-mc -filetype=obj -triple x86_64-unknown-linux %s -o %t1.o
 # RUN: %clang %cflags %t1.o -o %t.exe -Wl,-q
 # RUN: llvm-bolt --no-threads %t.exe --icf=all      -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=ICFCHECK %s
-# RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf --skip-funcs=_Z7helper1PFiiiEii,main -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
+# RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf --skip-funcs=helper1Func,main -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 # ICFCHECK:      ICF iteration 1
-# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
-# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
-# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# ICFCHECK-NEXT: folding barAddFunc into fooAddFunc
+# ICFCHECK-NEXT: folding barMulFunc into fooMulFunc
+# ICFCHECK-NEXT: folding barSubFunc into fooSubFunc
 
-# SAFEICFCHECK:      skipping function _Z6fooMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6barMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
+# SAFEICFCHECK:      skipping function fooMulFunc
+# SAFEICFCHECK-NEXT: skipping function barMulFunc
+# SAFEICFCHECK-NEXT: skipping function barAddFunc
 # SAFEICFCHECK-NEXT: ICF iteration 1
-# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# SAFEICFCHECK-NEXT: folding barSubFunc into fooSubFunc
 # SAFEICFCHECK-NEXT: ===---------
 
 # clang++ -c main.cpp -o main.o
@@ -65,78 +65,78 @@
 # }
 	.text
 	.file	"main.cpp"
-	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.globl	fooSubFunc
 	.p2align	4, 0x90
-	.type	_Z6fooSubii, at function
-_Z6fooSubii:                            # @_Z6fooSubii
+	.type	fooSubFunc, at function
+fooSubFunc:
 	.cfi_startproc
 	subl	-8(%rbp), %eax
 	retq
 .Lfunc_end0:
-	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.size	fooSubFunc, .Lfunc_end0-fooSubFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+
+	.globl	barSubFunc
 	.p2align	4, 0x90
-	.type	_Z6barSubii, at function
-_Z6barSubii:                            # @_Z6barSubii
+	.type	barSubFunc, at function
+barSubFunc:
 	.cfi_startproc
 	subl	-8(%rbp), %eax
 	retq
 .Lfunc_end1:
-	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.size	barSubFunc, .Lfunc_end1-barSubFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+
+	.globl	fooMulFunc
 	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
+	.type	fooMulFunc, at function
+fooMulFunc:
 	.cfi_startproc
 	imull	-8(%rbp), %eax
 	retq
 .Lfunc_end2:
-	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.size	fooMulFunc, .Lfunc_end2-fooMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+
+	.globl	barMulFunc
 	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
+	.type	barMulFunc, at function
+barMulFunc:
 	.cfi_startproc
 	imull	-8(%rbp), %eax
 	retq
 .Lfunc_end3:
-	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.size	barMulFunc, .Lfunc_end3-barMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+
+	.globl	fooAddFunc
 	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
+	.type	fooAddFunc, at function
+fooAddFunc:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	retq
 .Lfunc_end4:
-	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.size	fooAddFunc, .Lfunc_end4-fooAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+
+	.globl	barAddFunc
 	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
+	.type	barAddFunc, at function
+barAddFunc:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	retq
 .Lfunc_end5:
-	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.size	barAddFunc, .Lfunc_end5-barAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+
+	.globl	helper1Func
 	.p2align	4, 0x90
-	.type	_Z7helper1PFiiiEii, at function
-_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.type	helper1Func, at function
+helper1Func:
 	.cfi_startproc
-	leaq	_Z6barAddii(%rip), %rax
+	leaq	barAddFunc(%rip), %rax
 	cmpq	%rax, -16(%rbp)
 	jne	.LBB6_2
 	jmp	.LBB6_3
@@ -145,43 +145,43 @@ _Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
 .LBB6_3:
 	retq
 .Lfunc_end6:
-	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.size	helper1Func, .Lfunc_end6-helper1Func
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+
+	.globl	helper2Func
 	.p2align	4, 0x90
-	.type	_Z7helper2PFiiiES0_ii, at function
-_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.type	helper2Func, at function
+helper2Func:
 	.cfi_startproc
   # Operates on registers.
 	retq
 .Lfunc_end7:
-	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.size	helper2Func, .Lfunc_end7-helper2Func
 	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
+
+	.globl	main
 	.p2align	4, 0x90
 	.type	main, at function
-main:                                   # @main
+main:
 	.cfi_startproc
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	leaq	_Z6barAddii(%rip), %rdi
-	callq	_Z7helper1PFiiiEii
+	leaq	barAddFunc(%rip), %rdi
+	callq	helper1Func
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	leaq	_Z6fooMulii(%rip), %rdi
-	leaq	_Z6barMulii(%rip), %rsi
-	callq	_Z7helper2PFiiiES0_ii
+	leaq	fooMulFunc(%rip), %rdi
+	leaq	barMulFunc(%rip), %rsi
+	callq	helper2Func
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooSubii
+	callq	fooSubFunc
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6barSubii
+	callq	barSubFunc
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooAddii
+	callq	fooAddFunc
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
diff --git a/bolt/test/X86/icf-safe-test1-no-relocs.test b/bolt/test/X86/icf-safe-test1-no-relocs.test
index 6f8889f1ffe699..10ef5e6c5e7ed2 100644
--- a/bolt/test/X86/icf-safe-test1-no-relocs.test
+++ b/bolt/test/X86/icf-safe-test1-no-relocs.test
@@ -7,9 +7,9 @@
 # RUN: not llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 # ICFCHECK:      ICF iteration 1
-# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
-# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
-# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# ICFCHECK-NEXT: folding barAddFunc into fooAddFunc
+# ICFCHECK-NEXT: folding barMulFunc into fooMulFunc
+# ICFCHECK-NEXT: folding barSubFunc into fooSubFunc
 
 # SAFEICFCHECK: BOLT-ERROR: Binary built without relocations. Safe ICF is not supported
 
@@ -60,78 +60,78 @@
 # }
 	.text
 	.file	"main.cpp"
-	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.globl	fooSubFunc
 	.p2align	4, 0x90
-	.type	_Z6fooSubii, at function
-_Z6fooSubii:                            # @_Z6fooSubii
+	.type	fooSubFunc, at function
+fooSubFunc:
 	.cfi_startproc
 	subl	-8(%rbp), %eax
 	retq
 .Lfunc_end0:
-	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.size	fooSubFunc, .Lfunc_end0-fooSubFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+
+	.globl	barSubFunc
 	.p2align	4, 0x90
-	.type	_Z6barSubii, at function
-_Z6barSubii:                            # @_Z6barSubii
+	.type	barSubFunc, at function
+barSubFunc:
 	.cfi_startproc
 	subl	-8(%rbp), %eax
 	retq
 .Lfunc_end1:
-	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.size	barSubFunc, .Lfunc_end1-barSubFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+
+	.globl	fooMulFunc
 	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
+	.type	fooMulFunc, at function
+fooMulFunc:
 	.cfi_startproc
 	imull	-8(%rbp), %eax
 	retq
 .Lfunc_end2:
-	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.size	fooMulFunc, .Lfunc_end2-fooMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+
+	.globl	barMulFunc
 	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
+	.type	barMulFunc, at function
+barMulFunc:
 	.cfi_startproc
 	imull	-8(%rbp), %eax
 	retq
 .Lfunc_end3:
-	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.size	barMulFunc, .Lfunc_end3-barMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+
+	.globl	fooAddFunc
 	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
+	.type	fooAddFunc, at function
+fooAddFunc:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	retq
 .Lfunc_end4:
-	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.size	fooAddFunc, .Lfunc_end4-fooAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+
+	.globl	barAddFunc
 	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
+	.type	barAddFunc, at function
+barAddFunc:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	retq
 .Lfunc_end5:
-	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.size	barAddFunc, .Lfunc_end5-barAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+
+	.globl	helper1Func
 	.p2align	4, 0x90
-	.type	_Z7helper1PFiiiEii, at function
-_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.type	helper1Func, at function
+helper1Func:
 	.cfi_startproc
-	leaq	_Z6barAddii(%rip), %rax
+	leaq	barAddFunc(%rip), %rax
 	cmpq	%rax, -16(%rbp)
 	jne	.LBB6_2
 	jmp	.LBB6_3
@@ -140,43 +140,43 @@ _Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
 .LBB6_3:
 	retq
 .Lfunc_end6:
-	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.size	helper1Func, .Lfunc_end6-helper1Func
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+
+	.globl	helper2Func
 	.p2align	4, 0x90
-	.type	_Z7helper2PFiiiES0_ii, at function
-_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.type	helper2Func, at function
+helper2Func:
 	.cfi_startproc
   # Operates on registers.
 	retq
 .Lfunc_end7:
-	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.size	helper2Func, .Lfunc_end7-helper2Func
 	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
+
+	.globl	main
 	.p2align	4, 0x90
 	.type	main, at function
-main:                                   # @main
+main:
 	.cfi_startproc
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	leaq	_Z6barAddii(%rip), %rdi
-	callq	_Z7helper1PFiiiEii
+	leaq	barAddFunc(%rip), %rdi
+	callq	helper1Func
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	leaq	_Z6fooMulii(%rip), %rdi
-	leaq	_Z6barMulii(%rip), %rsi
-	callq	_Z7helper2PFiiiES0_ii
+	leaq	fooMulFunc(%rip), %rdi
+	leaq	barMulFunc(%rip), %rsi
+	callq	helper2Func
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooSubii
+	callq	fooSubFunc
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6barSubii
+	callq	barSubFunc
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooAddii
+	callq	fooAddFunc
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
diff --git a/bolt/test/X86/icf-safe-test1.test b/bolt/test/X86/icf-safe-test1.test
index 203da0fd928510..3807a1d1f10c10 100644
--- a/bolt/test/X86/icf-safe-test1.test
+++ b/bolt/test/X86/icf-safe-test1.test
@@ -7,15 +7,15 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 # ICFCHECK:      ICF iteration 1
-# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
-# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
-# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# ICFCHECK-NEXT: folding barAddFunc into fooAddFunc
+# ICFCHECK-NEXT: folding barMulFunc into fooMulFunc
+# ICFCHECK-NEXT: folding barSubFunc into fooSubFunc
 
-# SAFEICFCHECK:      skipping function _Z6fooMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6barMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
+# SAFEICFCHECK:      skipping function fooMulFunc
+# SAFEICFCHECK-NEXT: skipping function barMulFunc
+# SAFEICFCHECK-NEXT: skipping function barAddFunc
 # SAFEICFCHECK-NEXT: ICF iteration 1
-# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# SAFEICFCHECK-NEXT: folding barSubFunc into fooSubFunc
 # SAFEICFCHECK-NEXT: ===---------
 
 # clang++ -c main.cpp -o main.o
@@ -65,78 +65,78 @@
 # }
 	.text
 	.file	"main.cpp"
-	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.globl	fooSubFunc
 	.p2align	4, 0x90
-	.type	_Z6fooSubii, at function
-_Z6fooSubii:                            # @_Z6fooSubii
+	.type	fooSubFunc, at function
+fooSubFunc:
 	.cfi_startproc
 	subl	-8(%rbp), %eax
 	retq
 .Lfunc_end0:
-	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.size	fooSubFunc, .Lfunc_end0-fooSubFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+
+	.globl	barSubFunc
 	.p2align	4, 0x90
-	.type	_Z6barSubii, at function
-_Z6barSubii:                            # @_Z6barSubii
+	.type	barSubFunc, at function
+barSubFunc:
 	.cfi_startproc
 	subl	-8(%rbp), %eax
 	retq
 .Lfunc_end1:
-	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.size	barSubFunc, .Lfunc_end1-barSubFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+
+	.globl	fooMulFunc
 	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
+	.type	fooMulFunc, at function
+fooMulFunc:
 	.cfi_startproc
 	imull	-8(%rbp), %eax
 	retq
 .Lfunc_end2:
-	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.size	fooMulFunc, .Lfunc_end2-fooMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+
+	.globl	barMulFunc
 	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
+	.type	barMulFunc, at function
+barMulFunc:
 	.cfi_startproc
 	imull	-8(%rbp), %eax
 	retq
 .Lfunc_end3:
-	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.size	barMulFunc, .Lfunc_end3-barMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+
+	.globl	fooAddFunc
 	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
+	.type	fooAddFunc, at function
+fooAddFunc:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	retq
 .Lfunc_end4:
-	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.size	fooAddFunc, .Lfunc_end4-fooAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+
+	.globl	barAddFunc
 	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
+	.type	barAddFunc, at function
+barAddFunc:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	retq
 .Lfunc_end5:
-	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.size	barAddFunc, .Lfunc_end5-barAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+
+	.globl	helper1Func
 	.p2align	4, 0x90
-	.type	_Z7helper1PFiiiEii, at function
-_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.type	helper1Func, at function
+helper1Func:
 	.cfi_startproc
-	leaq	_Z6barAddii(%rip), %rax
+	leaq	barAddFunc(%rip), %rax
 	cmpq	%rax, -16(%rbp)
 	jne	.LBB6_2
 	jmp	.LBB6_3
@@ -145,43 +145,43 @@ _Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
 .LBB6_3:
 	retq
 .Lfunc_end6:
-	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.size	helper1Func, .Lfunc_end6-helper1Func
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+
+	.globl	helper2Func
 	.p2align	4, 0x90
-	.type	_Z7helper2PFiiiES0_ii, at function
-_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.type	helper2Func, at function
+helper2Func:
 	.cfi_startproc
   # Operates on registers.
 	retq
 .Lfunc_end7:
-	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.size	helper2Func, .Lfunc_end7-helper2Func
 	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
+
+	.globl	main
 	.p2align	4, 0x90
 	.type	main, at function
-main:                                   # @main
+main:
 	.cfi_startproc
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	leaq	_Z6barAddii(%rip), %rdi
-	callq	_Z7helper1PFiiiEii
+	leaq	barAddFunc(%rip), %rdi
+	callq	helper1Func
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	leaq	_Z6fooMulii(%rip), %rdi
-	leaq	_Z6barMulii(%rip), %rsi
-	callq	_Z7helper2PFiiiES0_ii
+	leaq	fooMulFunc(%rip), %rdi
+	leaq	barMulFunc(%rip), %rsi
+	callq	helper2Func
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooSubii
+	callq	fooSubFunc
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6barSubii
+	callq	barSubFunc
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooAddii
+	callq	fooAddFunc
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
index 1f58477d36ca6a..a6f97031a2a320 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
@@ -8,12 +8,12 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 # ICFCHECK:      ICF iteration 1
-# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
-# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
+# ICFCHECK-NEXT: folding barAddFunc into fooAddFunc
+# ICFCHECK-NEXT: folding barMulFunc into fooMulFunc
 
-# SAFEICFCHECK:      skipping function _Z6fooMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6barMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
+# SAFEICFCHECK:      skipping function fooMulFunc
+# SAFEICFCHECK-NEXT: skipping function barMulFunc
+# SAFEICFCHECK-NEXT: skipping function barAddFunc
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: ===---------
 
@@ -65,117 +65,117 @@
 # Manually modified to remove "extra" assembly.
 	.text
 	.file	"main.cpp"
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.globl	fooMulFunc
 	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
+	.type	fooMulFunc, at function
+fooMulFunc:
 	.cfi_startproc
 	imull	-8(%rbp), %eax
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end0:
-	.size	_Z6fooMulii, .Lfunc_end0-_Z6fooMulii
+	.size	fooMulFunc, .Lfunc_end0-fooMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+
+	.globl	barMulFunc
 	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
+	.type	barMulFunc, at function
+barMulFunc:
 	.cfi_startproc
 	imull	-8(%rbp), %eax
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end1:
-	.size	_Z6barMulii, .Lfunc_end1-_Z6barMulii
+	.size	barMulFunc, .Lfunc_end1-barMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+
+	.globl	fooAddFunc
 	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
+	.type	fooAddFunc, at function
+fooAddFunc:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end2:
-	.size	_Z6fooAddii, .Lfunc_end2-_Z6fooAddii
+	.size	fooAddFunc, .Lfunc_end2-fooAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+
+	.globl	barAddFunc
 	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
+	.type	barAddFunc, at function
+barAddFunc:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	popq	%rbp
 	.cfi_def_cfa %rsp, 8
 	retq
 .Lfunc_end3:
-	.size	_Z6barAddii, .Lfunc_end3-_Z6barAddii
+	.size	barAddFunc, .Lfunc_end3-barAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFKiiiEii             # -- Begin function _Z7helper1PFKiiiEii
+
+	.globl	_Z7helper1PFKiiiEii
 	.p2align	4, 0x90
 	.type	_Z7helper1PFKiiiEii, at function
-_Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
+_Z7helper1PFKiiiEii:
 	.cfi_startproc
-	movabsq	$_Z6barAddii, %rax
+	movabsq	$barAddFunc, %rax
 	cmpq	%rax, -16(%rbp)
 	retq
 .Lfunc_end4:
 	.size	_Z7helper1PFKiiiEii, .Lfunc_end4-_Z7helper1PFKiiiEii
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFKiiiES1_ii          # -- Begin function _Z7helper2PFKiiiES1_ii
+
+	.globl	_Z7helper2PFKiiiES1_ii
 	.p2align	4, 0x90
 	.type	_Z7helper2PFKiiiES1_ii, at function
-_Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
+_Z7helper2PFKiiiES1_ii:
   .cfi_startproc
   # no direct function references.
 	retq
 .Lfunc_end5:
 	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end5-_Z7helper2PFKiiiES1_ii
 	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
+
+	.globl	main
 	.p2align	4, 0x90
 	.type	main, at function
-main:                                   # @main
+main:
 	.cfi_startproc
 	movl	FooVar, %esi
 	movl	BarVar, %edx
-	movabsq	$_Z6barAddii, %rdi
+	movabsq	$barAddFunc, %rdi
 	callq	_Z7helper1PFKiiiEii
-	movl	%eax, -28(%rbp)                 # 4-byte Spill
+	movl	%eax, -28(%rbp)
 	movl	FooVar, %edx
 	movl	BarVar, %ecx
-	movabsq	$_Z6fooMulii, %rdi
-	movabsq	$_Z6barMulii, %rsi
+	movabsq	$fooMulFunc, %rdi
+	movabsq	$barMulFunc, %rsi
 	callq	_Z7helper2PFKiiiES1_ii
 	retq
 .Lfunc_end6:
 	.size	main, .Lfunc_end6-main
 	.cfi_endproc
 
-	.type	FooVar, at object                  # @FooVar
+	.type	FooVar, at object
 	.data
 	.globl	FooVar
 	.p2align	2, 0x0
 FooVar:
-	.long	1                               # 0x1
+	.long	1
 	.size	FooVar, 4
 
-	.type	BarVar, at object                  # @BarVar
+	.type	BarVar, at object
 	.globl	BarVar
 	.p2align	2, 0x0
 BarVar:
-	.long	2                               # 0x2
+	.long	2
 	.size	BarVar, 4
-                                        # -- End function
-	.type	.L.str, at object                  # @.str
+
+	.type	.L.str, at object
 	.section	.rodata.str1.1,"aMS", at progbits,1
 .L.str:
 	.asciz	"val: %d\n"
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
index 44c9a8f08eb67e..f3c351fc87461f 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
@@ -8,17 +8,17 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 # ICFCHECK:      ICF iteration 1
-# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
-# ICFCHECK-NEXT: folding _Z12barAddHdlperii into _Z6fooAddii
-# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
-# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# ICFCHECK-NEXT: folding barAddFunc into fooAddFunc
+# ICFCHECK-NEXT: folding _Z12barAddHdlperii into fooAddFunc
+# ICFCHECK-NEXT: folding barMulFunc into fooMulFunc
+# ICFCHECK-NEXT: folding barSubFunc into fooSubFunc
 
-# SAFEICFCHECK:      skipping function _Z6fooMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
+# SAFEICFCHECK:      skipping function fooMulFunc
+# SAFEICFCHECK-NEXT: skipping function barAddFunc
 # SAFEICFCHECK-NEXT: skipping function _Z12barAddHdlperii
-# SAFEICFCHECK-NEXT: skipping function _Z19fooGlobalFuncHelperii
+# SAFEICFCHECK-NEXT: skipping function fooGlobalFuncHelperFunc
 # SAFEICFCHECK-NEXT: ICF iteration 1
-# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# SAFEICFCHECK-NEXT: folding barSubFunc into fooSubFunc
 # SAFEICFCHECK-NEXT: ===---------
 
 # clang++ main.cpp -c -o
@@ -88,99 +88,99 @@
 # Manually modified to remove "extra" assembly.
 	.text
 	.file	"main.cpp"
-	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.globl	fooSubFunc
 	.p2align	4, 0x90
-	.type	_Z6fooSubii, at function
-_Z6fooSubii:                            # @_Z6fooSubii
+	.type	fooSubFunc, at function
+fooSubFunc:
 	.cfi_startproc
 	subl	-8(%rbp), %eax
 	retq
 .Lfunc_end0:
-	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.size	fooSubFunc, .Lfunc_end0-fooSubFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+
+	.globl	barSubFunc
 	.p2align	4, 0x90
-	.type	_Z6barSubii, at function
-_Z6barSubii:                            # @_Z6barSubii
+	.type	barSubFunc, at function
+barSubFunc:
 	.cfi_startproc
 	subl	-8(%rbp), %eax
 	retq
 .Lfunc_end1:
-	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.size	barSubFunc, .Lfunc_end1-barSubFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+
+	.globl	fooMulFunc
 	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
+	.type	fooMulFunc, at function
+fooMulFunc:
 	.cfi_startproc
 	imull	-8(%rbp), %eax
 	retq
 .Lfunc_end2:
-	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.size	fooMulFunc, .Lfunc_end2-fooMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+
+	.globl	barMulFunc
 	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
+	.type	barMulFunc, at function
+barMulFunc:
 	.cfi_startproc
 	imull	-8(%rbp), %eax
 	retq
 .Lfunc_end3:
-	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.size	barMulFunc, .Lfunc_end3-barMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+
+	.globl	fooAddFunc
 	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
+	.type	fooAddFunc, at function
+fooAddFunc:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	retq
 .Lfunc_end4:
-	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.size	fooAddFunc, .Lfunc_end4-fooAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+
+	.globl	barAddFunc
 	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:
-  .cfi_startproc                           # @_Z6barAddii
+	.type	barAddFunc, at function
+barAddFunc:
+  .cfi_startproc
 	addl	-8(%rbp), %eax
 	retq
 .Lfunc_end5:
-	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.size	barAddFunc, .Lfunc_end5-barAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFKiiiEii             # -- Begin function _Z7helper1PFKiiiEii
+
+	.globl	_Z7helper1PFKiiiEii
 	.p2align	4, 0x90
 	.type	_Z7helper1PFKiiiEii, at function
-_Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
+_Z7helper1PFKiiiEii:
 	.cfi_startproc
-	movabsq	$_Z6barAddii, %rax
+	movabsq	$barAddFunc, %rax
 	cmpq	%rax, -16(%rbp)
 	retq
 .Lfunc_end6:
 	.size	_Z7helper1PFKiiiEii, .Lfunc_end6-_Z7helper1PFKiiiEii
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFKiiiES1_ii          # -- Begin function _Z7helper2PFKiiiES1_ii
+
+	.globl	_Z7helper2PFKiiiES1_ii
 	.p2align	4, 0x90
 	.type	_Z7helper2PFKiiiES1_ii, at function
-_Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
+_Z7helper2PFKiiiES1_ii:
 	.cfi_startproc
   # All operations on registers.
 	retq
 .Lfunc_end7:
 	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end7-_Z7helper2PFKiiiES1_ii
 	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
+
+	.globl	main
 	.p2align	4, 0x90
 	.type	main, at function
-main:                                   # @main
+main:
 	.cfi_startproc
 	movl	FooVar, %esi
 	movl	BarVar, %edx
@@ -188,8 +188,8 @@ main:                                   # @main
 	callq	_Z7helper1PFKiiiEii
 	movl	FooVar, %edx
 	movl	BarVar, %ecx
-	movabsq	$_Z6fooMulii, %rdi
-	movabsq	$_Z19fooGlobalFuncHelperii, %rsi
+	movabsq	$fooMulFunc, %rdi
+	movabsq	$fooGlobalFuncHelperFunc, %rsi
 	callq	_Z7helper2PFKiiiES1_ii
 	retq
 .Lfunc_end8:
@@ -197,39 +197,39 @@ main:                                   # @main
 	.cfi_endproc
 
 
-  	.globl	_Z12barAddHdlperii              # -- Begin function _Z12barAddHdlperii
+  	.globl	_Z12barAddHdlperii
 	.p2align	4, 0x90
 	.type	_Z12barAddHdlperii, at function
-_Z12barAddHdlperii:                     # @_Z12barAddHdlperii
+_Z12barAddHdlperii:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	retq
 .Lfunc_end01:
 	.size	_Z12barAddHdlperii, .Lfunc_end01-_Z12barAddHdlperii
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+
+	.globl	fooGlobalFuncHelperFunc
 	.p2align	4, 0x90
-	.type	_Z19fooGlobalFuncHelperii, at function
-_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.type	fooGlobalFuncHelperFunc, at function
+fooGlobalFuncHelperFunc:
 	.cfi_startproc
 	callq	_Z12barAddHdlperii
 	retq
 .Lfunc_end11:
-	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end11-_Z19fooGlobalFuncHelperii
+	.size	fooGlobalFuncHelperFunc, .Lfunc_end11-fooGlobalFuncHelperFunc
 	.cfi_endproc
-                                        # -- End function
-	.type	FooVar, at object                  # @FooVar
+
+	.type	FooVar, at object
 	.data
 	.globl	FooVar
 	.p2align	2, 0x0
 FooVar:
-	.long	1                               # 0x1
+	.long	1
 	.size	FooVar, 4
 
-	.type	BarVar, at object                  # @BarVar
+	.type	BarVar, at object
 	.globl	BarVar
 	.p2align	2, 0x0
 BarVar:
-	.long	2                               # 0x2
+	.long	2
 	.size	BarVar, 4
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
index 80478833c44d23..cee3e0a221a900 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
@@ -8,12 +8,12 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 # ICFCHECK:      ICF iteration 1
-# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
-# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
+# ICFCHECK-NEXT: folding barAddFunc into fooAddFunc
+# ICFCHECK-NEXT: folding barMulFunc into fooMulFunc
 
-# SAFEICFCHECK:      skipping function _Z6fooMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6barMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
+# SAFEICFCHECK:      skipping function fooMulFunc
+# SAFEICFCHECK-NEXT: skipping function barMulFunc
+# SAFEICFCHECK-NEXT: skipping function barAddFunc
 # SAFEICFCHECK-NEXT: ICF iteration 1
 # SAFEICFCHECK-NEXT: ===---------
 
@@ -65,103 +65,103 @@
 # Manually modified to remove "extra" assembly.
 	.text
 	.file	"main.cpp"
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+	.globl	fooMulFunc
 	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
+	.type	fooMulFunc, at function
+fooMulFunc:
 	.cfi_startproc
 	imull	-8(%rbp), %eax
 	retq
 .Lfunc_end0:
-	.size	_Z6fooMulii, .Lfunc_end0-_Z6fooMulii
+	.size	fooMulFunc, .Lfunc_end0-fooMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+
+	.globl	barMulFunc
 	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
+	.type	barMulFunc, at function
+barMulFunc:
 	.cfi_startproc
 	imull	-8(%rbp), %eax
 	retq
 .Lfunc_end1:
-	.size	_Z6barMulii, .Lfunc_end1-_Z6barMulii
+	.size	barMulFunc, .Lfunc_end1-barMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+
+	.globl	fooAddFunc
 	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
+	.type	fooAddFunc, at function
+fooAddFunc:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	retq
 .Lfunc_end2:
-	.size	_Z6fooAddii, .Lfunc_end2-_Z6fooAddii
+	.size	fooAddFunc, .Lfunc_end2-fooAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+
+	.globl	barAddFunc
 	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
+	.type	barAddFunc, at function
+barAddFunc:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	retq
 .Lfunc_end3:
-	.size	_Z6barAddii, .Lfunc_end3-_Z6barAddii
+	.size	barAddFunc, .Lfunc_end3-barAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFKiiiEii             # -- Begin function _Z7helper1PFKiiiEii
+
+	.globl	_Z7helper1PFKiiiEii
 	.p2align	4, 0x90
 	.type	_Z7helper1PFKiiiEii, at function
-_Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
+_Z7helper1PFKiiiEii:
 	.cfi_startproc
-	leaq	_Z6barAddii(%rip), %rax
+	leaq	barAddFunc(%rip), %rax
 	cmpq	%rax, -16(%rbp)
 	retq
 .Lfunc_end4:
 	.size	_Z7helper1PFKiiiEii, .Lfunc_end4-_Z7helper1PFKiiiEii
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFKiiiES1_ii          # -- Begin function _Z7helper2PFKiiiES1_ii
+
+	.globl	_Z7helper2PFKiiiES1_ii
 	.p2align	4, 0x90
 	.type	_Z7helper2PFKiiiES1_ii, at function
-_Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
+_Z7helper2PFKiiiES1_ii:
 	.cfi_startproc
   # Operates on registers.
 	retq
 .Lfunc_end5:
 	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end5-_Z7helper2PFKiiiES1_ii
 	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
+
+	.globl	main
 	.p2align	4, 0x90
 	.type	main, at function
-main:                                   # @main
+main:
 	.cfi_startproc
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	leaq	_Z6barAddii(%rip), %rdi
+	leaq	barAddFunc(%rip), %rdi
 	callq	_Z7helper1PFKiiiEii
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	leaq	_Z6fooMulii(%rip), %rdi
-	leaq	_Z6barMulii(%rip), %rsi
+	leaq	fooMulFunc(%rip), %rdi
+	leaq	barMulFunc(%rip), %rsi
 	callq	_Z7helper2PFKiiiES1_ii
 	retq
 .Lfunc_end6:
 	.size	main, .Lfunc_end6-main
 	.cfi_endproc
 
-  	.type	FooVar, at object                  # @FooVar
+  	.type	FooVar, at object
 	.data
 	.globl	FooVar
 	.p2align	2, 0x0
 FooVar:
-	.long	1                               # 0x1
+	.long	1
 	.size	FooVar, 4
 
-	.type	BarVar, at object                  # @BarVar
+	.type	BarVar, at object
 	.globl	BarVar
 	.p2align	2, 0x0
 BarVar:
-	.long	2                               # 0x2
+	.long	2
 	.size	BarVar, 4
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
index bddfe258109aaf..2b7ac08e066447 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
@@ -8,17 +8,17 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 # ICFCHECK:      ICF iteration 1
-# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
-# ICFCHECK-NEXT: folding _Z12barAddHdlperii into _Z6fooAddii
-# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
-# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# ICFCHECK-NEXT: folding barAddFunc into fooAddFunc
+# ICFCHECK-NEXT: folding _Z12barAddHdlperii into fooAddFunc
+# ICFCHECK-NEXT: folding barMulFunc into fooMulFunc
+# ICFCHECK-NEXT: folding barSubFunc into fooSubFunc
 
-# SAFEICFCHECK:      skipping function _Z6fooMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
+# SAFEICFCHECK:      skipping function fooMulFunc
+# SAFEICFCHECK-NEXT: skipping function barAddFunc
 # SAFEICFCHECK-NEXT: skipping function _Z12barAddHdlperii
-# SAFEICFCHECK-NEXT: skipping function _Z19fooGlobalFuncHelperii
+# SAFEICFCHECK-NEXT: skipping function fooGlobalFuncHelperFunc
 # SAFEICFCHECK-NEXT: ICF iteration 1
-# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# SAFEICFCHECK-NEXT: folding barSubFunc into fooSubFunc
 # SAFEICFCHECK-NEXT: ===---------
 
 
@@ -102,99 +102,99 @@
 
 	.text
 	.file	"main.cpp"
-	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.globl	fooSubFunc
 	.p2align	4, 0x90
-	.type	_Z6fooSubii, at function
-_Z6fooSubii:                            # @_Z6fooSubii
+	.type	fooSubFunc, at function
+fooSubFunc:
 	.cfi_startproc
 	subl	-8(%rbp), %eax
 	retq
 .Lfunc_end0:
-	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.size	fooSubFunc, .Lfunc_end0-fooSubFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+
+	.globl	barSubFunc
 	.p2align	4, 0x90
-	.type	_Z6barSubii, at function
-_Z6barSubii:                            # @_Z6barSubii
+	.type	barSubFunc, at function
+barSubFunc:
 	.cfi_startproc
 	subl	-8(%rbp), %eax
 	retq
 .Lfunc_end1:
-	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.size	barSubFunc, .Lfunc_end1-barSubFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+
+	.globl	fooMulFunc
 	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
+	.type	fooMulFunc, at function
+fooMulFunc:
 	.cfi_startproc
 	imull	-8(%rbp), %eax
 	retq
 .Lfunc_end2:
-	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.size	fooMulFunc, .Lfunc_end2-fooMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+
+	.globl	barMulFunc
 	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
+	.type	barMulFunc, at function
+barMulFunc:
 	.cfi_startproc
 	imull	-8(%rbp), %eax
 	retq
 .Lfunc_end3:
-	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.size	barMulFunc, .Lfunc_end3-barMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+
+	.globl	fooAddFunc
 	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
+	.type	fooAddFunc, at function
+fooAddFunc:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	retq
 .Lfunc_end4:
-	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.size	fooAddFunc, .Lfunc_end4-fooAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+
+	.globl	barAddFunc
 	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
+	.type	barAddFunc, at function
+barAddFunc:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	retq
 .Lfunc_end5:
-	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.size	barAddFunc, .Lfunc_end5-barAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFKiiiEii             # -- Begin function _Z7helper1PFKiiiEii
+
+	.globl	_Z7helper1PFKiiiEii
 	.p2align	4, 0x90
 	.type	_Z7helper1PFKiiiEii, at function
-_Z7helper1PFKiiiEii:                    # @_Z7helper1PFKiiiEii
+_Z7helper1PFKiiiEii:
 	.cfi_startproc
-	leaq	_Z6barAddii(%rip), %rax
+	leaq	barAddFunc(%rip), %rax
 	cmpq	%rax, -16(%rbp)
 	retq
 .Lfunc_end6:
 	.size	_Z7helper1PFKiiiEii, .Lfunc_end6-_Z7helper1PFKiiiEii
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFKiiiES1_ii          # -- Begin function _Z7helper2PFKiiiES1_ii
+
+	.globl	_Z7helper2PFKiiiES1_ii
 	.p2align	4, 0x90
 	.type	_Z7helper2PFKiiiES1_ii, at function
-_Z7helper2PFKiiiES1_ii:                 # @_Z7helper2PFKiiiES1_ii
+_Z7helper2PFKiiiES1_ii:
 	.cfi_startproc
   # Operates on registers.
 	retq
 .Lfunc_end7:
 	.size	_Z7helper2PFKiiiES1_ii, .Lfunc_end7-_Z7helper2PFKiiiES1_ii
 	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
+
+	.globl	main
 	.p2align	4, 0x90
 	.type	main, at function
-main:                                   # @main
+main:
 	.cfi_startproc
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
@@ -202,61 +202,61 @@ main:                                   # @main
 	callq	_Z7helper1PFKiiiEii
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	leaq	_Z6fooMulii(%rip), %rdi
-	movq	_Z19fooGlobalFuncHelperii at GOTPCREL(%rip), %rsi
+	leaq	fooMulFunc(%rip), %rdi
+	movq	fooGlobalFuncHelperFunc at GOTPCREL(%rip), %rsi
 	callq	_Z7helper2PFKiiiES1_ii
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooSubii
+	callq	fooSubFunc
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6barSubii               # 4-byte Spill
+	callq	barSubFunc
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooAddii
+	callq	fooAddFunc
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
 	.cfi_endproc
 
-	.globl	_Z12barAddHdlperii              # -- Begin function _Z12barAddHdlperii
+	.globl	_Z12barAddHdlperii
 	.p2align	4, 0x90
 	.type	_Z12barAddHdlperii, at function
-_Z12barAddHdlperii:                     # @_Z12barAddHdlperii
+_Z12barAddHdlperii:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	retq
 .Lfunc_end01:
 	.size	_Z12barAddHdlperii, .Lfunc_end01-_Z12barAddHdlperii
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+
+	.globl	fooGlobalFuncHelperFunc
 	.p2align	4, 0x90
-	.type	_Z19fooGlobalFuncHelperii, at function
-_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.type	fooGlobalFuncHelperFunc, at function
+fooGlobalFuncHelperFunc:
 	.cfi_startproc
 	callq	_Z12barAddHdlperii
 	retq
 .Lfunc_end11:
-	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end11-_Z19fooGlobalFuncHelperii
+	.size	fooGlobalFuncHelperFunc, .Lfunc_end11-fooGlobalFuncHelperFunc
 	.cfi_endproc
-                                        # -- End function
-	.type	FooVar, at object                  # @FooVar
+
+	.type	FooVar, at object
 	.data
 	.globl	FooVar
 	.p2align	2, 0x0
 FooVar:
-	.long	1                               # 0x1
+	.long	1
 	.size	FooVar, 4
 
-	.type	BarVar, at object                  # @BarVar
+	.type	BarVar, at object
 	.globl	BarVar
 	.p2align	2, 0x0
 BarVar:
-	.long	2                               # 0x2
+	.long	2
 	.size	BarVar, 4
-                                        # -- End function
-	.type	.L.str, at object                  # @.str
+
+	.type	.L.str, at object
 	.section	.rodata.str1.1,"aMS", at progbits,1
 .L.str:
 	.asciz	"val: %d\n"
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO0.test b/bolt/test/X86/icf-safe-test2GlobalVarO0.test
index 84264cf62bfacb..df74e950754d80 100644
--- a/bolt/test/X86/icf-safe-test2GlobalVarO0.test
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO0.test
@@ -7,15 +7,15 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 # ICFCHECK:      ICF iteration 1
-# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
-# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
-# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# ICFCHECK-NEXT: folding barAddFunc into fooAddFunc
+# ICFCHECK-NEXT: folding barMulFunc into fooMulFunc
+# ICFCHECK-NEXT: folding barSubFunc into fooSubFunc
 
-# SAFEICFCHECK:      skipping function _Z6fooMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6barMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
+# SAFEICFCHECK:      skipping function fooMulFunc
+# SAFEICFCHECK-NEXT: skipping function barMulFunc
+# SAFEICFCHECK-NEXT: skipping function barAddFunc
 # SAFEICFCHECK-NEXT: ICF iteration 1
-# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# SAFEICFCHECK-NEXT: folding barSubFunc into fooSubFunc
 # SAFEICFCHECK-NEXT: ===---------
 
 
@@ -69,160 +69,160 @@
 # Manually modified to remove "extra" assembly.
 	.text
 	.file	"main.cpp"
-	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.globl	fooSubFunc
 	.p2align	4, 0x90
-	.type	_Z6fooSubii, at function
-_Z6fooSubii:                            # @_Z6fooSubii
+	.type	fooSubFunc, at function
+fooSubFunc:
 	.cfi_startproc
 	subl	-8(%rbp), %eax
 	retq
 .Lfunc_end0:
-	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.size	fooSubFunc, .Lfunc_end0-fooSubFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+
+	.globl	barSubFunc
 	.p2align	4, 0x90
-	.type	_Z6barSubii, at function
-_Z6barSubii:                            # @_Z6barSubii
+	.type	barSubFunc, at function
+barSubFunc:
 	.cfi_startproc
 	subl	-8(%rbp), %eax
 	retq
 .Lfunc_end1:
-	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.size	barSubFunc, .Lfunc_end1-barSubFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+
+	.globl	fooMulFunc
 	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
+	.type	fooMulFunc, at function
+fooMulFunc:
 	.cfi_startproc
 	imull	-8(%rbp), %eax
 	retq
 .Lfunc_end2:
-	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.size	fooMulFunc, .Lfunc_end2-fooMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+
+	.globl	barMulFunc
 	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
+	.type	barMulFunc, at function
+barMulFunc:
 	.cfi_startproc
 	imull	-8(%rbp), %eax
 	retq
 .Lfunc_end3:
-	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.size	barMulFunc, .Lfunc_end3-barMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+
+	.globl	fooAddFunc
 	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
+	.type	fooAddFunc, at function
+fooAddFunc:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	retq
 .Lfunc_end4:
-	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.size	fooAddFunc, .Lfunc_end4-fooAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+
+	.globl	barAddFunc
 	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
+	.type	barAddFunc, at function
+barAddFunc:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	retq
 .Lfunc_end5:
-	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.size	barAddFunc, .Lfunc_end5-barAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+
+	.globl	helper1Func
 	.p2align	4, 0x90
-	.type	_Z7helper1PFiiiEii, at function
-_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.type	helper1Func, at function
+helper1Func:
 	.cfi_startproc
-	leaq	_Z6barAddii(%rip), %rax
+	leaq	barAddFunc(%rip), %rax
 	cmpq	%rax, -16(%rbp)
 	retq
 .Lfunc_end6:
-	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.size	helper1Func, .Lfunc_end6-helper1Func
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+
+	.globl	helper2Func
 	.p2align	4, 0x90
-	.type	_Z7helper2PFiiiES0_ii, at function
-_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.type	helper2Func, at function
+helper2Func:
 	.cfi_startproc
   # Operates on registers.
 	retq
 .Lfunc_end7:
-	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.size	helper2Func, .Lfunc_end7-helper2Func
 	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
+
+	.globl	main
 	.p2align	4, 0x90
 	.type	main, at function
-main:                                   # @main
+main:
 	.cfi_startproc
 	movq	_ZL16funcGlobalBarAdd(%rip), %rdi
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z7helper1PFiiiEii
+	callq	helper1Func
 	movq	funcGlobalBarMul(%rip), %rsi
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	leaq	_Z6fooMulii(%rip), %rdi
-	callq	_Z7helper2PFiiiES0_ii
+	leaq	fooMulFunc(%rip), %rdi
+	callq	helper2Func
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooSubii
+	callq	fooSubFunc
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6barSubii
+	callq	barSubFunc
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooAddii
+	callq	fooAddFunc
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
 	.cfi_endproc
 
-	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.globl	fooGlobalFuncHelperFunc
 	.p2align	4, 0x90
-	.type	_Z19fooGlobalFuncHelperii, at function
-_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.type	fooGlobalFuncHelperFunc, at function
+fooGlobalFuncHelperFunc:
 	.cfi_startproc
 # %bb.0:
 	movl	$5, %eax
 	retq
 .Lfunc_end01:
-	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end01-_Z19fooGlobalFuncHelperii
+	.size	fooGlobalFuncHelperFunc, .Lfunc_end01-fooGlobalFuncHelperFunc
 	.cfi_endproc
-                                        # -- End function
-	.type	FooVar, at object                  # @FooVar
+
+	.type	FooVar, at object
 	.data
 	.globl	FooVar
 	.p2align	2, 0x0
 FooVar:
-	.long	1                               # 0x1
+	.long	1
 	.size	FooVar, 4
 
-	.type	BarVar, at object                  # @BarVar
+	.type	BarVar, at object
 	.globl	BarVar
 	.p2align	2, 0x0
 BarVar:
-	.long	2                               # 0x2
+	.long	2
 	.size	BarVar, 4
 
-	.type	funcGlobalBarMul, at object        # @funcGlobalBarMul
+	.type	funcGlobalBarMul, at object
 	.data
 	.globl	funcGlobalBarMul
 	.p2align	3, 0x0
 funcGlobalBarMul:
-	.quad	_Z6barMulii
+	.quad	barMulFunc
 	.size	funcGlobalBarMul, 8
 
-	.type	_ZL16funcGlobalBarAdd, at object   # @_ZL16funcGlobalBarAdd
+	.type	_ZL16funcGlobalBarAdd, at object
 	.p2align	3, 0x0
 _ZL16funcGlobalBarAdd:
-	.quad	_Z6barAddii
+	.quad	barAddFunc
 	.size	_ZL16funcGlobalBarAdd, 8
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO3.test b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
index 0003d4d5adc68f..d8de30813809ac 100644
--- a/bolt/test/X86/icf-safe-test2GlobalVarO3.test
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
@@ -7,15 +7,15 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 # ICFCHECK:      ICF iteration 1
-# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
-# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
-# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# ICFCHECK-NEXT: folding barMulFunc into fooMulFunc
+# ICFCHECK-NEXT: folding barAddFunc into fooAddFunc
+# ICFCHECK-NEXT: folding barSubFunc into fooSubFunc
 
-# SAFEICFCHECK:      skipping function _Z6fooMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6barMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
+# SAFEICFCHECK:      skipping function fooMulFunc
+# SAFEICFCHECK-NEXT: skipping function barMulFunc
+# SAFEICFCHECK-NEXT: skipping function barAddFunc
 # SAFEICFCHECK-NEXT: ICF iteration 1
-# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# SAFEICFCHECK-NEXT: folding barSubFunc into fooSubFunc
 # SAFEICFCHECK-NEXT: ===---------
 
 # clang++ -O3 -c main.cpp -o main.o
@@ -74,155 +74,151 @@
 # }
 	.text
 	.file	"main.cpp"
-	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.globl	fooSubFunc
 	.p2align	4, 0x90
-	.type	_Z6fooSubii, at function
-_Z6fooSubii:                            # @_Z6fooSubii
+	.type	fooSubFunc, at function
+fooSubFunc:
 	.cfi_startproc
 	subl	%esi, %eax
 	retq
 .Lfunc_end0:
-	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.size	fooSubFunc, .Lfunc_end0-fooSubFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+
+	.globl	barSubFunc
 	.p2align	4, 0x90
-	.type	_Z6barSubii, at function
-_Z6barSubii:                            # @_Z6barSubii
+	.type	barSubFunc, at function
+barSubFunc:
 	.cfi_startproc
 	subl	%esi, %eax
 	retq
 .Lfunc_end1:
-	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.size	barSubFunc, .Lfunc_end1-barSubFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+
+	.globl	fooMulFunc
 	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
+	.type	fooMulFunc, at function
+fooMulFunc:
 	.cfi_startproc
 	imull	%esi, %eax
 	retq
 .Lfunc_end2:
-	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.size	fooMulFunc, .Lfunc_end2-fooMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+
+	.globl	barMulFunc
 	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
+	.type	barMulFunc, at function
+barMulFunc:
 	.cfi_startproc
 	imull	%esi, %eax
 	retq
 .Lfunc_end3:
-	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.size	barMulFunc, .Lfunc_end3-barMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+
+	.globl	fooAddFunc
 	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
+	.type	fooAddFunc, at function
+fooAddFunc:
 	.cfi_startproc
 # %bb.0:
-                                        # kill: def $esi killed $esi def $rsi
-                                        # kill: def $edi killed $edi def $rdi
 	leal	(%rdi,%rsi), %eax
 	retq
 .Lfunc_end4:
-	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.size	fooAddFunc, .Lfunc_end4-fooAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+
+	.globl	barAddFunc
 	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
+	.type	barAddFunc, at function
+barAddFunc:
 	.cfi_startproc
 # %bb.0:
-                                        # kill: def $esi killed $esi def $rsi
-                                        # kill: def $edi killed $edi def $rdi
 	leal	(%rdi,%rsi), %eax
 	retq
 .Lfunc_end5:
-	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.size	barAddFunc, .Lfunc_end5-barAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+
+	.globl	helper1Func
 	.p2align	4, 0x90
-	.type	_Z7helper1PFiiiEii, at function
-_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.type	helper1Func, at function
+helper1Func:
 	.cfi_startproc
-	leaq	_Z6barAddii(%rip), %rcx
+	leaq	barAddFunc(%rip), %rcx
 	cmpq	%rcx, %rdi
 	retq
 .LBB6_1:
 	movl	$1, %eax
 	retq
 .Lfunc_end6:
-	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.size	helper1Func, .Lfunc_end6-helper1Func
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+
+	.globl	helper2Func
 	.p2align	4, 0x90
-	.type	_Z7helper2PFiiiES0_ii, at function
-_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.type	helper2Func, at function
+helper2Func:
 	.cfi_startproc
   # Operates on registers.
 	retq
 .Lfunc_end7:
-	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.size	helper2Func, .Lfunc_end7-helper2Func
 	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
+
+	.globl	main
 	.p2align	4, 0x90
 	.type	main, at function
-main:                                   # @main
+main:
 	.cfi_startproc
 	movq	FooVar at GOTPCREL(%rip), %r14
 	movq	BarVar at GOTPCREL(%rip), %r15
-	leaq	_Z6barAddii(%rip), %rdi
-	callq	_Z7helper1PFiiiEii
+	leaq	barAddFunc(%rip), %rdi
+	callq	helper1Func
 	movq	funcGlobalBarMul(%rip), %rsi
-	leaq	_Z6fooMulii(%rip), %rdi
-	callq	_Z7helper2PFiiiES0_ii
-	callq	_Z6fooSubii
-	callq	_Z6barSubii
-	callq	_Z6fooAddii
+	leaq	fooMulFunc(%rip), %rdi
+	callq	helper2Func
+	callq	fooSubFunc
+	callq	barSubFunc
+	callq	fooAddFunc
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
 	.cfi_endproc
 
-	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.globl	fooGlobalFuncHelperFunc
 	.p2align	4, 0x90
-	.type	_Z19fooGlobalFuncHelperii, at function
-_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.type	fooGlobalFuncHelperFunc, at function
+fooGlobalFuncHelperFunc:
 	.cfi_startproc
 # %bb.0:
 	movl	$5, %eax
 	retq
 .Lfunc_end01:
-	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end01-_Z19fooGlobalFuncHelperii
+	.size	fooGlobalFuncHelperFunc, .Lfunc_end01-fooGlobalFuncHelperFunc
 	.cfi_endproc
-                                        # -- End function
-	.type	FooVar, at object                  # @FooVar
+
+	.type	FooVar, at object
 	.data
 	.globl	FooVar
 	.p2align	2, 0x0
 FooVar:
-	.long	1                               # 0x1
+	.long	1
 	.size	FooVar, 4
 
-	.type	BarVar, at object                  # @BarVar
+	.type	BarVar, at object
 	.globl	BarVar
 	.p2align	2, 0x0
 BarVar:
-	.long	2                               # 0x2
+	.long	2
 	.size	BarVar, 4
 
-	.type	funcGlobalBarMul, at object        # @funcGlobalBarMul
+	.type	funcGlobalBarMul, at object
 	.data
 	.globl	funcGlobalBarMul
 	.p2align	3, 0x0
 funcGlobalBarMul:
-	.quad	_Z6barMulii
+	.quad	barMulFunc
 	.size	funcGlobalBarMul, 8
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO0.test b/bolt/test/X86/icf-safe-test3LocalVarO0.test
index f95dbc9c683194..b7eb36fbad8e2c 100644
--- a/bolt/test/X86/icf-safe-test3LocalVarO0.test
+++ b/bolt/test/X86/icf-safe-test3LocalVarO0.test
@@ -7,15 +7,15 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 # ICFCHECK:      ICF iteration 1
-# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
-# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
-# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# ICFCHECK-NEXT: folding barAddFunc into fooAddFunc
+# ICFCHECK-NEXT: folding barMulFunc into fooMulFunc
+# ICFCHECK-NEXT: folding barSubFunc into fooSubFunc
 
-# SAFEICFCHECK:      skipping function _Z6fooMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6barMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
+# SAFEICFCHECK:      skipping function fooMulFunc
+# SAFEICFCHECK-NEXT: skipping function barMulFunc
+# SAFEICFCHECK-NEXT: skipping function barAddFunc
 # SAFEICFCHECK-NEXT: ICF iteration 1
-# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# SAFEICFCHECK-NEXT: folding barSubFunc into fooSubFunc
 # SAFEICFCHECK-NEXT: ===---------
 
 
@@ -76,153 +76,153 @@
 # }
 	.text
 	.file	"main.cpp"
-	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.globl	fooSubFunc
 	.p2align	4, 0x90
-	.type	_Z6fooSubii, at function
-_Z6fooSubii:                            # @_Z6fooSubii
+	.type	fooSubFunc, at function
+fooSubFunc:
 	.cfi_startproc
 	subl	-8(%rbp), %eax
 	retq
 .Lfunc_end0:
-	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.size	fooSubFunc, .Lfunc_end0-fooSubFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+
+	.globl	barSubFunc
 	.p2align	4, 0x90
-	.type	_Z6barSubii, at function
-_Z6barSubii:                            # @_Z6barSubii
+	.type	barSubFunc, at function
+barSubFunc:
 	.cfi_startproc
 	subl	-8(%rbp), %eax
 	retq
 .Lfunc_end1:
-	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.size	barSubFunc, .Lfunc_end1-barSubFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+
+	.globl	fooMulFunc
 	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
+	.type	fooMulFunc, at function
+fooMulFunc:
 	.cfi_startproc
 	imull	-8(%rbp), %eax
 	retq
 .Lfunc_end2:
-	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.size	fooMulFunc, .Lfunc_end2-fooMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+
+	.globl	barMulFunc
 	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
+	.type	barMulFunc, at function
+barMulFunc:
 	.cfi_startproc
 	imull	-8(%rbp), %eax
 	retq
 .Lfunc_end3:
-	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.size	barMulFunc, .Lfunc_end3-barMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+
+	.globl	fooAddFunc
 	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
+	.type	fooAddFunc, at function
+fooAddFunc:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	retq
 .Lfunc_end4:
-	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.size	fooAddFunc, .Lfunc_end4-fooAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+
+	.globl	barAddFunc
 	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
+	.type	barAddFunc, at function
+barAddFunc:
 	.cfi_startproc
 	addl	-8(%rbp), %eax
 	retq
 .Lfunc_end5:
-	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.size	barAddFunc, .Lfunc_end5-barAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+
+	.globl	helper1Func
 	.p2align	4, 0x90
-	.type	_Z7helper1PFiiiEii, at function
-_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.type	helper1Func, at function
+helper1Func:
 	.cfi_startproc
-	leaq	_Z6barAddii(%rip), %rax
+	leaq	barAddFunc(%rip), %rax
 	cmpq	%rax, -16(%rbp)
 	retq
 .Lfunc_end6:
-	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.size	helper1Func, .Lfunc_end6-helper1Func
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+
+	.globl	helper2Func
 	.p2align	4, 0x90
-	.type	_Z7helper2PFiiiES0_ii, at function
-_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.type	helper2Func, at function
+helper2Func:
 	.cfi_startproc
   # Operates on registers.
 	retq
 .Lfunc_end7:
-	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.size	helper2Func, .Lfunc_end7-helper2Func
 	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
+
+	.globl	main
 	.p2align	4, 0x90
 	.type	main, at function
-main:                                   # @main
+main:
 	.cfi_startproc
-	leaq	_Z6barMulii(%rip), %rax
+	leaq	barMulFunc(%rip), %rax
 	movq	_ZZ4mainE16funcGlobalBarAdd(%rip), %rdi
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z7helper1PFiiiEii
+	callq	helper1Func
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	leaq	_Z6fooMulii(%rip), %rdi
-	callq	_Z7helper2PFiiiES0_ii
+	leaq	fooMulFunc(%rip), %rdi
+	callq	helper2Func
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooSubii
+	callq	fooSubFunc
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6barSubii
+	callq	barSubFunc
 	movq	FooVar at GOTPCREL(%rip), %rax
 	movq	BarVar at GOTPCREL(%rip), %rax
-	callq	_Z6fooAddii
+	callq	fooAddFunc
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
 	.cfi_endproc
 
-	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.globl	fooGlobalFuncHelperFunc
 	.p2align	4, 0x90
-	.type	_Z19fooGlobalFuncHelperii, at function
-_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.type	fooGlobalFuncHelperFunc, at function
+fooGlobalFuncHelperFunc:
 	.cfi_startproc
 # %bb.0:
 	movl	$5, %eax
 	retq
 .Lfunc_end01:
-	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end01-_Z19fooGlobalFuncHelperii
+	.size	fooGlobalFuncHelperFunc, .Lfunc_end01-fooGlobalFuncHelperFunc
 	.cfi_endproc
-                                        # -- End function
-	.type	FooVar, at object                  # @FooVar
+
+	.type	FooVar, at object
 	.data
 	.globl	FooVar
 	.p2align	2, 0x0
 FooVar:
-	.long	1                               # 0x1
+	.long	1
 	.size	FooVar, 4
 
-	.type	BarVar, at object                  # @BarVar
+	.type	BarVar, at object
 	.globl	BarVar
 	.p2align	2, 0x0
 BarVar:
-	.long	2                               # 0x2
+	.long	2
 	.size	BarVar, 4
 
-	.type	_ZZ4mainE16funcGlobalBarAdd, at object # @_ZZ4mainE16funcGlobalBarAdd
+	.type	_ZZ4mainE16funcGlobalBarAdd, at object
 	.data
 	.p2align	3, 0x0
 _ZZ4mainE16funcGlobalBarAdd:
-	.quad	_Z6barAddii
+	.quad	barAddFunc
 	.size	_ZZ4mainE16funcGlobalBarAdd, 8
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO3.test b/bolt/test/X86/icf-safe-test3LocalVarO3.test
index 9d51d1e563d49b..4241766dbdcd1a 100644
--- a/bolt/test/X86/icf-safe-test3LocalVarO3.test
+++ b/bolt/test/X86/icf-safe-test3LocalVarO3.test
@@ -7,15 +7,15 @@
 # RUN: llvm-bolt --no-threads %t.exe --icf=safe -debug -debug-only=bolt-icf -o %t.bolt 2>&1 | FileCheck --check-prefix=SAFEICFCHECK %s
 
 # ICFCHECK:      ICF iteration 1
-# ICFCHECK-NEXT: folding _Z6barMulii into _Z6fooMulii
-# ICFCHECK-NEXT: folding _Z6barAddii into _Z6fooAddii
-# ICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# ICFCHECK-NEXT: folding barMulFunc into fooMulFunc
+# ICFCHECK-NEXT: folding barAddFunc into fooAddFunc
+# ICFCHECK-NEXT: folding barSubFunc into fooSubFunc
 
-# SAFEICFCHECK:      skipping function _Z6fooMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6barMulii
-# SAFEICFCHECK-NEXT: skipping function _Z6barAddii
+# SAFEICFCHECK:      skipping function fooMulFunc
+# SAFEICFCHECK-NEXT: skipping function barMulFunc
+# SAFEICFCHECK-NEXT: skipping function barAddFunc
 # SAFEICFCHECK-NEXT: ICF iteration 1
-# SAFEICFCHECK-NEXT: folding _Z6barSubii into _Z6fooSubii
+# SAFEICFCHECK-NEXT: folding barSubFunc into fooSubFunc
 # SAFEICFCHECK-NEXT: ===---------
 
 # clang++ -O3 -c main.cpp -o main.o
@@ -75,148 +75,144 @@
 # }
 	.text
 	.file	"main.cpp"
-	.globl	_Z6fooSubii                     # -- Begin function _Z6fooSubii
+	.globl	fooSubFunc
 	.p2align	4, 0x90
-	.type	_Z6fooSubii, at function
-_Z6fooSubii:                            # @_Z6fooSubii
+	.type	fooSubFunc, at function
+fooSubFunc:
 	.cfi_startproc
 	subl	%esi, %eax
 	retq
 .Lfunc_end0:
-	.size	_Z6fooSubii, .Lfunc_end0-_Z6fooSubii
+	.size	fooSubFunc, .Lfunc_end0-fooSubFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barSubii                     # -- Begin function _Z6barSubii
+
+	.globl	barSubFunc
 	.p2align	4, 0x90
-	.type	_Z6barSubii, at function
-_Z6barSubii:                            # @_Z6barSubii
+	.type	barSubFunc, at function
+barSubFunc:
 	.cfi_startproc
 	subl	%esi, %eax
 	retq
 .Lfunc_end1:
-	.size	_Z6barSubii, .Lfunc_end1-_Z6barSubii
+	.size	barSubFunc, .Lfunc_end1-barSubFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooMulii                     # -- Begin function _Z6fooMulii
+
+	.globl	fooMulFunc
 	.p2align	4, 0x90
-	.type	_Z6fooMulii, at function
-_Z6fooMulii:                            # @_Z6fooMulii
+	.type	fooMulFunc, at function
+fooMulFunc:
 	.cfi_startproc
 	imull	%esi, %eax
 	retq
 .Lfunc_end2:
-	.size	_Z6fooMulii, .Lfunc_end2-_Z6fooMulii
+	.size	fooMulFunc, .Lfunc_end2-fooMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barMulii                     # -- Begin function _Z6barMulii
+
+	.globl	barMulFunc
 	.p2align	4, 0x90
-	.type	_Z6barMulii, at function
-_Z6barMulii:                            # @_Z6barMulii
+	.type	barMulFunc, at function
+barMulFunc:
 	.cfi_startproc
 	imull	%esi, %eax
 	retq
 .Lfunc_end3:
-	.size	_Z6barMulii, .Lfunc_end3-_Z6barMulii
+	.size	barMulFunc, .Lfunc_end3-barMulFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6fooAddii                     # -- Begin function _Z6fooAddii
+
+	.globl	fooAddFunc
 	.p2align	4, 0x90
-	.type	_Z6fooAddii, at function
-_Z6fooAddii:                            # @_Z6fooAddii
+	.type	fooAddFunc, at function
+fooAddFunc:
 	.cfi_startproc
 # %bb.0:
-                                        # kill: def $esi killed $esi def $rsi
-                                        # kill: def $edi killed $edi def $rdi
 	leal	(%rdi,%rsi), %eax
 	retq
 .Lfunc_end4:
-	.size	_Z6fooAddii, .Lfunc_end4-_Z6fooAddii
+	.size	fooAddFunc, .Lfunc_end4-fooAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z6barAddii                     # -- Begin function _Z6barAddii
+
+	.globl	barAddFunc
 	.p2align	4, 0x90
-	.type	_Z6barAddii, at function
-_Z6barAddii:                            # @_Z6barAddii
+	.type	barAddFunc, at function
+barAddFunc:
 	.cfi_startproc
 # %bb.0:
-                                        # kill: def $esi killed $esi def $rsi
-                                        # kill: def $edi killed $edi def $rdi
 	leal	(%rdi,%rsi), %eax
 	retq
 .Lfunc_end5:
-	.size	_Z6barAddii, .Lfunc_end5-_Z6barAddii
+	.size	barAddFunc, .Lfunc_end5-barAddFunc
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper1PFiiiEii              # -- Begin function _Z7helper1PFiiiEii
+
+	.globl	helper1Func
 	.p2align	4, 0x90
-	.type	_Z7helper1PFiiiEii, at function
-_Z7helper1PFiiiEii:                     # @_Z7helper1PFiiiEii
+	.type	helper1Func, at function
+helper1Func:
 	.cfi_startproc
-	leaq	_Z6barAddii(%rip), %rcx
+	leaq	barAddFunc(%rip), %rcx
 	cmpq	%rcx, %rdi
 	retq
 .LBB6_1:
 	movl	$1, %eax
 	retq
 .Lfunc_end6:
-	.size	_Z7helper1PFiiiEii, .Lfunc_end6-_Z7helper1PFiiiEii
+	.size	helper1Func, .Lfunc_end6-helper1Func
 	.cfi_endproc
-                                        # -- End function
-	.globl	_Z7helper2PFiiiES0_ii           # -- Begin function _Z7helper2PFiiiES0_ii
+
+	.globl	helper2Func
 	.p2align	4, 0x90
-	.type	_Z7helper2PFiiiES0_ii, at function
-_Z7helper2PFiiiES0_ii:                  # @_Z7helper2PFiiiES0_ii
+	.type	helper2Func, at function
+helper2Func:
 	.cfi_startproc
   # Operates on registers.
 	retq
 .Lfunc_end7:
-	.size	_Z7helper2PFiiiES0_ii, .Lfunc_end7-_Z7helper2PFiiiES0_ii
+	.size	helper2Func, .Lfunc_end7-helper2Func
 	.cfi_endproc
-                                        # -- End function
-	.globl	main                            # -- Begin function main
+
+	.globl	main
 	.p2align	4, 0x90
 	.type	main, at function
-main:                                   # @main
+main:
 	.cfi_startproc
 	movq	FooVar at GOTPCREL(%rip), %r14
 	movq	BarVar at GOTPCREL(%rip), %r15
-	leaq	_Z6barAddii(%rip), %rdi
-	callq	_Z7helper1PFiiiEii
-	leaq	_Z6fooMulii(%rip), %rdi
-	leaq	_Z6barMulii(%rip), %rsi
-	callq	_Z7helper2PFiiiES0_ii
-	callq	_Z6fooSubii
-	callq	_Z6barSubii
-	callq	_Z6fooAddii
+	leaq	barAddFunc(%rip), %rdi
+	callq	helper1Func
+	leaq	fooMulFunc(%rip), %rdi
+	leaq	barMulFunc(%rip), %rsi
+	callq	helper2Func
+	callq	fooSubFunc
+	callq	barSubFunc
+	callq	fooAddFunc
 	retq
 .Lfunc_end8:
 	.size	main, .Lfunc_end8-main
 	.cfi_endproc
 
 
-	.globl	_Z19fooGlobalFuncHelperii       # -- Begin function _Z19fooGlobalFuncHelperii
+	.globl	fooGlobalFuncHelperFunc
 	.p2align	4, 0x90
-	.type	_Z19fooGlobalFuncHelperii, at function
-_Z19fooGlobalFuncHelperii:              # @_Z19fooGlobalFuncHelperii
+	.type	fooGlobalFuncHelperFunc, at function
+fooGlobalFuncHelperFunc:
 	.cfi_startproc
 # %bb.0:
 	movl	$5, %eax
 	retq
 .Lfunc_end01:
-	.size	_Z19fooGlobalFuncHelperii, .Lfunc_end01-_Z19fooGlobalFuncHelperii
+	.size	fooGlobalFuncHelperFunc, .Lfunc_end01-fooGlobalFuncHelperFunc
 	.cfi_endproc
-                                        # -- End function
-	.type	FooVar, at object                  # @FooVar
+
+	.type	FooVar, at object
 	.data
 	.globl	FooVar
 	.p2align	2, 0x0
 FooVar:
-	.long	1                               # 0x1
+	.long	1
 	.size	FooVar, 4
 
-	.type	BarVar, at object                  # @BarVar
+	.type	BarVar, at object
 	.globl	BarVar
 	.p2align	2, 0x0
 BarVar:
-	.long	2                               # 0x2
+	.long	2
 	.size	BarVar, 4

>From c6a196594b708b9fb46f4fdff885bd16939452ad Mon Sep 17 00:00:00 2001
From: Alexander Yermolovich <ayermolo at meta.com>
Date: Mon, 25 Nov 2024 17:51:36 -0800
Subject: [PATCH 18/18] removed .text and .file

---
 bolt/test/X86/icf-safe-icp.test                                | 2 --
 bolt/test/X86/icf-safe-test1-no-cfg.test                       | 2 --
 bolt/test/X86/icf-safe-test1-no-relocs.test                    | 2 --
 bolt/test/X86/icf-safe-test1.test                              | 2 --
 bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test           | 2 --
 bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test | 2 --
 bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test             | 2 --
 bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test   | 3 ---
 bolt/test/X86/icf-safe-test2GlobalVarO0.test                   | 2 --
 bolt/test/X86/icf-safe-test2GlobalVarO3.test                   | 2 --
 bolt/test/X86/icf-safe-test3LocalVarO0.test                    | 2 --
 bolt/test/X86/icf-safe-test3LocalVarO3.test                    | 2 --
 12 files changed, 25 deletions(-)

diff --git a/bolt/test/X86/icf-safe-icp.test b/bolt/test/X86/icf-safe-icp.test
index 645266ca287730..b9427bf7b09944 100644
--- a/bolt/test/X86/icf-safe-icp.test
+++ b/bolt/test/X86/icf-safe-icp.test
@@ -88,8 +88,6 @@
 #   return 5;
 # }
 # Manually modified to remove "extra" assembly.
-  .text
-	.file	"main.cpp"
 	.section	.text.hot.,"ax", at progbits
 	.globl	_Z10createTypei
 	.p2align	4, 0x90
diff --git a/bolt/test/X86/icf-safe-test1-no-cfg.test b/bolt/test/X86/icf-safe-test1-no-cfg.test
index 65d3868fe14b90..337e04e0c5407b 100644
--- a/bolt/test/X86/icf-safe-test1-no-cfg.test
+++ b/bolt/test/X86/icf-safe-test1-no-cfg.test
@@ -63,8 +63,6 @@
 #              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
 #   return temp;
 # }
-	.text
-	.file	"main.cpp"
 	.globl	fooSubFunc
 	.p2align	4, 0x90
 	.type	fooSubFunc, at function
diff --git a/bolt/test/X86/icf-safe-test1-no-relocs.test b/bolt/test/X86/icf-safe-test1-no-relocs.test
index 10ef5e6c5e7ed2..ec47108da24ccb 100644
--- a/bolt/test/X86/icf-safe-test1-no-relocs.test
+++ b/bolt/test/X86/icf-safe-test1-no-relocs.test
@@ -58,8 +58,6 @@
 #              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
 #   return temp;
 # }
-	.text
-	.file	"main.cpp"
 	.globl	fooSubFunc
 	.p2align	4, 0x90
 	.type	fooSubFunc, at function
diff --git a/bolt/test/X86/icf-safe-test1.test b/bolt/test/X86/icf-safe-test1.test
index 3807a1d1f10c10..68c37c1ce01f2e 100644
--- a/bolt/test/X86/icf-safe-test1.test
+++ b/bolt/test/X86/icf-safe-test1.test
@@ -63,8 +63,6 @@
 #              barSub(FooVar, BarVar) + fooAdd(FooVar, BarVar);
 #   return temp;
 # }
-	.text
-	.file	"main.cpp"
 	.globl	fooSubFunc
 	.p2align	4, 0x90
 	.type	fooSubFunc, at function
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
index a6f97031a2a320..4ca6eb2665270c 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPic.test
@@ -63,8 +63,6 @@
 # int FooVar = 1;
 # int BarVar = 2;
 # Manually modified to remove "extra" assembly.
-	.text
-	.file	"main.cpp"
 	.globl	fooMulFunc
 	.p2align	4, 0x90
 	.type	fooMulFunc, at function
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
index f3c351fc87461f..c55ca49964a938 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrNoPicExtFuncRef.test
@@ -86,8 +86,6 @@
 #   return 5 + funcGlobalBarMulExt(a, b);
 # }
 # Manually modified to remove "extra" assembly.
-	.text
-	.file	"main.cpp"
 	.globl	fooSubFunc
 	.p2align	4, 0x90
 	.type	fooSubFunc, at function
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
index cee3e0a221a900..ebcd224542d238 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrPic.test
@@ -63,8 +63,6 @@
 # int FooVar = 1;
 # int BarVar = 2;
 # Manually modified to remove "extra" assembly.
-	.text
-	.file	"main.cpp"
 	.globl	fooMulFunc
 	.p2align	4, 0x90
 	.type	fooMulFunc, at function
diff --git a/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test b/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
index 2b7ac08e066447..8e02c30aa5e2a8 100644
--- a/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
+++ b/bolt/test/X86/icf-safe-test2GlobalConstPtrPicExtFuncRef.test
@@ -99,9 +99,6 @@
 # MY_CONST int fooGlobalFuncHelper(int a, int b) {
 #   return 5 + funcGlobalBarMulExt(a, b);
 # }
-
-	.text
-	.file	"main.cpp"
 	.globl	fooSubFunc
 	.p2align	4, 0x90
 	.type	fooSubFunc, at function
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO0.test b/bolt/test/X86/icf-safe-test2GlobalVarO0.test
index df74e950754d80..e73ac27d065134 100644
--- a/bolt/test/X86/icf-safe-test2GlobalVarO0.test
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO0.test
@@ -67,8 +67,6 @@
 #   return temp;
 # }
 # Manually modified to remove "extra" assembly.
-	.text
-	.file	"main.cpp"
 	.globl	fooSubFunc
 	.p2align	4, 0x90
 	.type	fooSubFunc, at function
diff --git a/bolt/test/X86/icf-safe-test2GlobalVarO3.test b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
index d8de30813809ac..bfc6218d813af8 100644
--- a/bolt/test/X86/icf-safe-test2GlobalVarO3.test
+++ b/bolt/test/X86/icf-safe-test2GlobalVarO3.test
@@ -72,8 +72,6 @@
 # int fooGlobalFuncHelper(int a, int b) {
 #   return 5;
 # }
-	.text
-	.file	"main.cpp"
 	.globl	fooSubFunc
 	.p2align	4, 0x90
 	.type	fooSubFunc, at function
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO0.test b/bolt/test/X86/icf-safe-test3LocalVarO0.test
index b7eb36fbad8e2c..65e4ed5bfb084e 100644
--- a/bolt/test/X86/icf-safe-test3LocalVarO0.test
+++ b/bolt/test/X86/icf-safe-test3LocalVarO0.test
@@ -74,8 +74,6 @@
 # int fooGlobalFuncHelper(int a, int b) {
 #   return 5;
 # }
-	.text
-	.file	"main.cpp"
 	.globl	fooSubFunc
 	.p2align	4, 0x90
 	.type	fooSubFunc, at function
diff --git a/bolt/test/X86/icf-safe-test3LocalVarO3.test b/bolt/test/X86/icf-safe-test3LocalVarO3.test
index 4241766dbdcd1a..6e06e03898f40c 100644
--- a/bolt/test/X86/icf-safe-test3LocalVarO3.test
+++ b/bolt/test/X86/icf-safe-test3LocalVarO3.test
@@ -73,8 +73,6 @@
 # int fooGlobalFuncHelper(int a, int b) {
 #   return 5;
 # }
-	.text
-	.file	"main.cpp"
 	.globl	fooSubFunc
 	.p2align	4, 0x90
 	.type	fooSubFunc, at function



More information about the llvm-commits mailing list