[llvm] [llvm] Fix string and Twine concatenation for C++26 P2591R5 (PR #227959)

via llvm-commits llvm-commits at lists.llvm.org
Sun Oct 4 13:07:44 PDT 2026


https://github.com/rdong8 updated https://github.com/llvm/llvm-project/pull/227959

>From f70e9a5c4dea74969fc7cb999db6fca5a59ed59e Mon Sep 17 00:00:00 2001
From: Richard Dong <rdong8 at protonmail.com>
Date: Thu, 1 Oct 2026 05:21:13 +0000
Subject: [PATCH 1/7] [llvm] Fix string and Twine concatenation for C++26
 P2591R5

P2591R5 ("Concatenation of strings and string views") adds operator+
overloads between std::string and std::string_view.

In LLVM, expressions concatenating a std::string and a StringRef
(or string literal / StringRef) chained with .str() (such as
`(Prefix + Name).str()`) previously relied on implicit conversions to
llvm::Twine to invoke llvm::operator+(const Twine&, const Twine&).

Under C++26 with P2591R5, StringRef's conversion to std::string_view
causes these expressions to either become ambiguous or resolve to
std::operator+(const std::string&, std::string_view), which returns
std::string (which does not have a .str() member).

Fix these by explicitly wrapping operands with Twine(...) or using
StringRef instead of std::string where appropriate.
---
 llvm/include/llvm/Analysis/ReleaseModeModelRunner.h        | 3 ++-
 llvm/lib/Analysis/CFGPrinter.cpp                           | 2 +-
 llvm/lib/Analysis/ReplayInlineAdvisor.cpp                  | 3 ++-
 llvm/lib/CodeGen/MachineCFGPrinter.cpp                     | 3 ++-
 llvm/lib/FileCheck/FileCheck.cpp                           | 7 ++++---
 llvm/lib/Frontend/OpenMP/OMP.cpp                           | 3 ++-
 llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp                  | 2 +-
 llvm/lib/IR/AutoUpgrade.cpp                                | 2 +-
 llvm/lib/Support/CodeGenCoverage.cpp                       | 5 ++---
 llvm/lib/Support/VirtualFileSystem.cpp                     | 4 ++--
 llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp       | 4 +++-
 llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp     | 3 ++-
 llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp                    | 5 +++--
 llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp      | 3 ++-
 .../Transforms/Instrumentation/SanitizerBinaryMetadata.cpp | 3 ++-
 15 files changed, 31 insertions(+), 21 deletions(-)

diff --git a/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h b/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
index ff423a9155b14..3ca3205406946 100644
--- a/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
+++ b/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
@@ -15,6 +15,7 @@
 #define LLVM_ANALYSIS_RELEASEMODEMODELRUNNER_H
 
 #include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/Analysis/MLModelRunner.h"
 #include "llvm/Analysis/TensorSpec.h"
 #include "llvm/Support/ErrorHandling.h"
@@ -119,7 +120,7 @@ class ReleaseModeModelRunner final : public MLModelRunner {
   void populateTensor(size_t Pos, const TensorSpec &Spec, StringRef Prefix,
                       bool &InputIsPresent) {
     const int Index =
-        CompiledModel->LookupArgIndex((Prefix + Spec.name()).str());
+        CompiledModel->LookupArgIndex((Twine(Prefix) + Spec.name()).str());
     void *Buffer = nullptr;
     InputIsPresent = Index >= 0;
     if (InputIsPresent)
diff --git a/llvm/lib/Analysis/CFGPrinter.cpp b/llvm/lib/Analysis/CFGPrinter.cpp
index 39108a906f081..25f3f95e47485 100644
--- a/llvm/lib/Analysis/CFGPrinter.cpp
+++ b/llvm/lib/Analysis/CFGPrinter.cpp
@@ -62,7 +62,7 @@ static void writeCFGToDotFile(Function &F, BlockFrequencyInfo *BFI,
                               BranchProbabilityInfo *BPI, uint64_t MaxFreq,
                               bool CFGOnly = false) {
   std::string Filename =
-      (CFGDotFilenamePrefix + "." + F.getName() + ".dot").str();
+      (Twine(CFGDotFilenamePrefix) + "." + F.getName() + ".dot").str();
   errs() << "Writing '" << Filename << "'...";
 
   std::error_code EC;
diff --git a/llvm/lib/Analysis/ReplayInlineAdvisor.cpp b/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
index 7253478a0eedf..1b4f159105342 100644
--- a/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
+++ b/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
@@ -14,6 +14,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/Analysis/ReplayInlineAdvisor.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/Analysis/OptimizationRemarkEmitter.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/LineIterator.h"
@@ -107,7 +108,7 @@ std::unique_ptr<InlineAdvice> ReplayInlineAdvisor::getAdviceImpl(CallBase &CB) {
   std::string CallSiteLoc =
       formatCallSiteLocation(CB.getDebugLoc(), ReplaySettings.ReplayFormat);
   StringRef Callee = CB.getCalledFunction()->getName();
-  std::string Combined = (Callee + CallSiteLoc).str();
+  std::string Combined = (Twine(Callee) + CallSiteLoc).str();
 
   // Replay decision, if it has one
   auto Iter = InlineSitesFromRemarks.find(Combined);
diff --git a/llvm/lib/CodeGen/MachineCFGPrinter.cpp b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
index c604d4fd6e1e6..dec83d49b99cb 100644
--- a/llvm/lib/CodeGen/MachineCFGPrinter.cpp
+++ b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
@@ -17,6 +17,7 @@
 #include "llvm/CodeGen/TargetSubtargetInfo.h"
 #include "llvm/InitializePasses.h"
 #include "llvm/Pass.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/Support/GraphWriter.h"
 
 using namespace llvm;
@@ -38,7 +39,7 @@ static cl::opt<bool>
 
 static void writeMCFGToDotFile(MachineFunction &MF) {
   std::string Filename =
-      (MCFGDotFilenamePrefix + "." + MF.getName() + ".dot").str();
+      (Twine(MCFGDotFilenamePrefix) + "." + MF.getName() + ".dot").str();
   errs() << "Writing '" << Filename << "'...";
 
   std::error_code EC;
diff --git a/llvm/lib/FileCheck/FileCheck.cpp b/llvm/lib/FileCheck/FileCheck.cpp
index b8dd76d91dee2..df220a9699f90 100644
--- a/llvm/lib/FileCheck/FileCheck.cpp
+++ b/llvm/lib/FileCheck/FileCheck.cpp
@@ -1843,8 +1843,8 @@ bool FileCheck::readCheckFile(
   for (StringRef PatternString : Req.ImplicitCheckNot) {
     // Create a buffer with fake command line content in order to display the
     // command line option responsible for the specific implicit CHECK-NOT.
-    std::string Prefix = "-implicit-check-not='";
-    std::string Suffix = "'";
+    StringRef Prefix = "-implicit-check-not='";
+    StringRef Suffix = "'";
     std::unique_ptr<MemoryBuffer> CmdLine = MemoryBuffer::getMemBufferCopy(
         (Prefix + PatternString + Suffix).str(), "command line");
 
@@ -2592,7 +2592,8 @@ Error FileCheckPatternContext::defineCmdlineVariables(
       // Append a copy of the command-line definition adapted to use the same
       // format as in the input file to be able to reuse
       // parseNumericSubstitutionBlock.
-      CmdlineDefsDiag += (DefPrefix + CmdlineDef + " (parsed as: [[").str();
+      CmdlineDefsDiag +=
+          (Twine(DefPrefix) + CmdlineDef + " (parsed as: [[").str();
       std::string SubstitutionStr = std::string(CmdlineDef);
       SubstitutionStr[EqIdx] = ':';
       CmdlineDefsIndices.push_back(
diff --git a/llvm/lib/Frontend/OpenMP/OMP.cpp b/llvm/lib/Frontend/OpenMP/OMP.cpp
index 8bfe3a6a7cc4a..ff584568d3cd9 100644
--- a/llvm/lib/Frontend/OpenMP/OMP.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMP.cpp
@@ -12,6 +12,7 @@
 #include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/Demangle/Demangle.h"
 #include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
 #include "llvm/Support/ErrorHandling.h"
@@ -241,7 +242,7 @@ std::string prettifyFunctionName(StringRef FunctionName) {
   auto ParentName = deconstructOpenMPKernelName(FunctionName, LineNo);
   if (LineNo == 0)
     return FunctionName.str();
-  return ("omp target in " + ParentName + " @ " + std::to_string(LineNo) +
+  return (Twine("omp target in ") + ParentName + " @ " + Twine(LineNo) +
           " (" + FunctionName + ")")
       .str();
 }
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index 3a8125b835e53..89dc139f80407 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -4656,7 +4656,7 @@ Expected<Function *> OpenMPIRBuilder::emitGlobalToListReduceFunction(
 std::string OpenMPIRBuilder::getReductionFuncName(StringRef Name) const {
   std::string Suffix =
       createPlatformSpecificName({"omp", "reduction", "reduction_func"});
-  return (Name + Suffix).str();
+  return (Twine(Name) + Suffix).str();
 }
 
 Expected<Function *> OpenMPIRBuilder::createReductionFunction(
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index 43651371e730d..dedbc55d51c00 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -7935,7 +7935,7 @@ std::string llvm::UpgradeDataLayoutString(StringRef DL, StringRef TT) {
   // to fix more IR than it breaks.
   // Intel MCU is an exception and uses 4-byte-alignment.
   if (!T.isOSIAMCU()) {
-    std::string I128 = "-i128:128";
+    StringRef I128 = "-i128:128";
     if (StringRef Ref = Res; !Ref.contains(I128)) {
       SmallVector<StringRef, 4> Groups;
       Regex R("^(e(-[mpi][^-]*)*)((-[^mpi][^-]*)*)$");
diff --git a/llvm/lib/Support/CodeGenCoverage.cpp b/llvm/lib/Support/CodeGenCoverage.cpp
index 2e35019e12c16..e1b04bbc64e16 100644
--- a/llvm/lib/Support/CodeGenCoverage.cpp
+++ b/llvm/lib/Support/CodeGenCoverage.cpp
@@ -83,9 +83,8 @@ bool CodeGenCoverage::emit(StringRef CoveragePrefix,
     // We can handle locking within a process easily enough but we don't want to
     // manage it between multiple processes. Use the process ID to ensure no
     // more than one process is ever writing to the same file at the same time.
-    std::string Pid = llvm::to_string(sys::Process::getProcessId());
-
-    std::string CoverageFilename = (CoveragePrefix + Pid).str();
+    std::string CoverageFilename =
+        (CoveragePrefix + Twine(sys::Process::getProcessId())).str();
 
     std::error_code EC;
     sys::fs::OpenFlags OpenFlags = sys::fs::OF_Append;
diff --git a/llvm/lib/Support/VirtualFileSystem.cpp b/llvm/lib/Support/VirtualFileSystem.cpp
index 5d0a3949e60ca..27004c0c0af13 100644
--- a/llvm/lib/Support/VirtualFileSystem.cpp
+++ b/llvm/lib/Support/VirtualFileSystem.cpp
@@ -707,7 +707,7 @@ class InMemoryFile : public InMemoryNode {
   llvm::MemoryBuffer *getBuffer() const { return Buffer.get(); }
 
   std::string toString(unsigned Indent) const override {
-    return (std::string(Indent, ' ') + Stat.getName() + "\n").str();
+    return (Twine(std::string(Indent, ' ')) + Stat.getName() + "\n").str();
   }
 
   static bool classof(const InMemoryNode *N) {
@@ -829,7 +829,7 @@ class InMemoryDirectory : public InMemoryNode {
 
   std::string toString(unsigned Indent) const override {
     std::string Result =
-        (std::string(Indent, ' ') + Stat.getName() + "\n").str();
+        (Twine(std::string(Indent, ' ')) + Stat.getName() + "\n").str();
     for (const auto &Entry : Entries)
       Result += Entry.second->toString(Indent + 2);
     return Result;
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
index 467fdbfd0e05b..e30c2a262eede 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
@@ -16,6 +16,7 @@
 #include "ARMInstPrinter.h"
 #include "ARMMCAsmInfo.h"
 #include "TargetInfo/ARMTargetInfo.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/DebugInfo/CodeView/CodeView.h"
 #include "llvm/MC/MCAsmBackend.h"
 #include "llvm/MC/MCCodeEmitter.h"
@@ -144,7 +145,8 @@ std::string ARM_MC::ParseARMTriple(const Triple &TT, StringRef CPU) {
 
   ARM::ArchKind ArchID = ARM::parseArch(TT.getArchName());
   if (ArchID != ARM::ArchKind::INVALID &&  (CPU.empty() || CPU == "generic"))
-    ARMArchFeature = (ARMArchFeature + "+" + ARM::getArchName(ArchID)).str();
+    ARMArchFeature =
+        (Twine(ARMArchFeature) + "+" + ARM::getArchName(ArchID)).str();
 
   if (TT.isThumb()) {
     if (!ARMArchFeature.empty())
diff --git a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
index 9d2904dec0ad0..0599796dc79dc 100644
--- a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
+++ b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
@@ -16,6 +16,7 @@
 #include "M68kMCAsmInfo.h"
 #include "TargetInfo/M68kTargetInfo.h"
 
+#include "llvm/ADT/Twine.h"
 #include "llvm/MC/MCELFStreamer.h"
 #include "llvm/MC/MCInstPrinter.h"
 #include "llvm/MC/MCInstrInfo.h"
@@ -62,7 +63,7 @@ static MCSubtargetInfo *createM68kMCSubtargetInfo(const Triple &TT,
   std::string ArchFS = ParseM68kTriple(TT, CPU);
   if (!FS.empty()) {
     if (!ArchFS.empty()) {
-      ArchFS = (ArchFS + "," + FS).str();
+      ArchFS = (Twine(ArchFS) + "," + FS).str();
     } else {
       ArchFS = FS.str();
     }
diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
index 84196697060e3..3a9301b664dab 100644
--- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
@@ -17,6 +17,7 @@
 #include "SPIRVUtils.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringTable.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/Analysis/ValueTracking.h"
 #include "llvm/IR/IntrinsicsSPIRV.h"
 #include <regex>
@@ -339,12 +340,12 @@ lookupBuiltin(StringRef DemangledCall,
 
     // If argument-type name prefix was added, look up the builtin again.
     if (!Prefix.empty() &&
-        (Builtin = SPIRV::lookupBuiltin((Prefix + BuiltinName).str(), Set)))
+        (Builtin = SPIRV::lookupBuiltin((Twine(Prefix) + BuiltinName).str(), Set)))
       return std::make_unique<SPIRV::IncomingCall>(
           BuiltinName, Builtin, ReturnRegister, ReturnType, Arguments);
 
     if (!Suffix.empty() &&
-        (Builtin = SPIRV::lookupBuiltin((BuiltinName + Suffix).str(), Set)))
+        (Builtin = SPIRV::lookupBuiltin((Twine(BuiltinName) + Suffix).str(), Set)))
       return std::make_unique<SPIRV::IncomingCall>(
           BuiltinName, Builtin, ReturnRegister, ReturnType, Arguments);
   }
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
index 84bab9487f0c8..44b756109e9b2 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
@@ -29,6 +29,7 @@
 #include "llvm/ADT/MapVector.h"
 #include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/Analysis/ValueTracking.h"
 #include "llvm/BinaryFormat/Wasm.h"
 #include "llvm/CodeGen/Analysis.h"
@@ -589,7 +590,7 @@ void WebAssemblyAsmPrinter::EmitTargetFeatures(Module &M) {
   // Read target features and linkage policies from module metadata
   SmallVector<FeatureEntry, 4> EmittedFeatures;
   auto EmitFeature = [&](std::string Feature) {
-    std::string MDKey = (StringRef("wasm-feature-") + Feature).str();
+    std::string MDKey = (Twine("wasm-feature-") + Feature).str();
     Metadata *Policy = M.getModuleFlag(MDKey);
     if (Policy == nullptr)
       return;
diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
index 210b1266de23c..c45c804ad6cca 100644
--- a/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
+++ b/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
@@ -213,7 +213,8 @@ bool SanitizerBinaryMetadata::run() {
     // Calls to the initialization functions with different versions cannot be
     // merged. Give the structors unique names based on the version, which will
     // also be used as the COMDAT key.
-    const std::string StructorPrefix = (MI->FunctionPrefix + VersionStr).str();
+    const std::string StructorPrefix =
+        (Twine(MI->FunctionPrefix) + VersionStr).str();
 
     // We declare the _add and _del functions as weak, and only call them if
     // there is a valid symbol linked. This allows building binaries with

>From 192be4e2233087a66389a596806a60d56e0383d1 Mon Sep 17 00:00:00 2001
From: Richard Dong <rdong8 at protonmail.com>
Date: Thu, 1 Oct 2026 16:33:15 +0000
Subject: [PATCH 2/7] Revert "[llvm] Fix string and Twine concatenation for
 C++26 P2591R5"

This reverts commit f70e9a5c4dea74969fc7cb999db6fca5a59ed59e.
---
 llvm/include/llvm/Analysis/ReleaseModeModelRunner.h        | 3 +--
 llvm/lib/Analysis/CFGPrinter.cpp                           | 2 +-
 llvm/lib/Analysis/ReplayInlineAdvisor.cpp                  | 3 +--
 llvm/lib/CodeGen/MachineCFGPrinter.cpp                     | 3 +--
 llvm/lib/FileCheck/FileCheck.cpp                           | 7 +++----
 llvm/lib/Frontend/OpenMP/OMP.cpp                           | 3 +--
 llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp                  | 2 +-
 llvm/lib/IR/AutoUpgrade.cpp                                | 2 +-
 llvm/lib/Support/CodeGenCoverage.cpp                       | 5 +++--
 llvm/lib/Support/VirtualFileSystem.cpp                     | 4 ++--
 llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp       | 4 +---
 llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp     | 3 +--
 llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp                    | 5 ++---
 llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp      | 3 +--
 .../Transforms/Instrumentation/SanitizerBinaryMetadata.cpp | 3 +--
 15 files changed, 21 insertions(+), 31 deletions(-)

diff --git a/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h b/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
index 3ca3205406946..ff423a9155b14 100644
--- a/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
+++ b/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
@@ -15,7 +15,6 @@
 #define LLVM_ANALYSIS_RELEASEMODEMODELRUNNER_H
 
 #include "llvm/ADT/StringExtras.h"
-#include "llvm/ADT/Twine.h"
 #include "llvm/Analysis/MLModelRunner.h"
 #include "llvm/Analysis/TensorSpec.h"
 #include "llvm/Support/ErrorHandling.h"
@@ -120,7 +119,7 @@ class ReleaseModeModelRunner final : public MLModelRunner {
   void populateTensor(size_t Pos, const TensorSpec &Spec, StringRef Prefix,
                       bool &InputIsPresent) {
     const int Index =
-        CompiledModel->LookupArgIndex((Twine(Prefix) + Spec.name()).str());
+        CompiledModel->LookupArgIndex((Prefix + Spec.name()).str());
     void *Buffer = nullptr;
     InputIsPresent = Index >= 0;
     if (InputIsPresent)
diff --git a/llvm/lib/Analysis/CFGPrinter.cpp b/llvm/lib/Analysis/CFGPrinter.cpp
index 25f3f95e47485..39108a906f081 100644
--- a/llvm/lib/Analysis/CFGPrinter.cpp
+++ b/llvm/lib/Analysis/CFGPrinter.cpp
@@ -62,7 +62,7 @@ static void writeCFGToDotFile(Function &F, BlockFrequencyInfo *BFI,
                               BranchProbabilityInfo *BPI, uint64_t MaxFreq,
                               bool CFGOnly = false) {
   std::string Filename =
-      (Twine(CFGDotFilenamePrefix) + "." + F.getName() + ".dot").str();
+      (CFGDotFilenamePrefix + "." + F.getName() + ".dot").str();
   errs() << "Writing '" << Filename << "'...";
 
   std::error_code EC;
diff --git a/llvm/lib/Analysis/ReplayInlineAdvisor.cpp b/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
index 1b4f159105342..7253478a0eedf 100644
--- a/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
+++ b/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
@@ -14,7 +14,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/Analysis/ReplayInlineAdvisor.h"
-#include "llvm/ADT/Twine.h"
 #include "llvm/Analysis/OptimizationRemarkEmitter.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/LineIterator.h"
@@ -108,7 +107,7 @@ std::unique_ptr<InlineAdvice> ReplayInlineAdvisor::getAdviceImpl(CallBase &CB) {
   std::string CallSiteLoc =
       formatCallSiteLocation(CB.getDebugLoc(), ReplaySettings.ReplayFormat);
   StringRef Callee = CB.getCalledFunction()->getName();
-  std::string Combined = (Twine(Callee) + CallSiteLoc).str();
+  std::string Combined = (Callee + CallSiteLoc).str();
 
   // Replay decision, if it has one
   auto Iter = InlineSitesFromRemarks.find(Combined);
diff --git a/llvm/lib/CodeGen/MachineCFGPrinter.cpp b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
index dec83d49b99cb..c604d4fd6e1e6 100644
--- a/llvm/lib/CodeGen/MachineCFGPrinter.cpp
+++ b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
@@ -17,7 +17,6 @@
 #include "llvm/CodeGen/TargetSubtargetInfo.h"
 #include "llvm/InitializePasses.h"
 #include "llvm/Pass.h"
-#include "llvm/ADT/Twine.h"
 #include "llvm/Support/GraphWriter.h"
 
 using namespace llvm;
@@ -39,7 +38,7 @@ static cl::opt<bool>
 
 static void writeMCFGToDotFile(MachineFunction &MF) {
   std::string Filename =
-      (Twine(MCFGDotFilenamePrefix) + "." + MF.getName() + ".dot").str();
+      (MCFGDotFilenamePrefix + "." + MF.getName() + ".dot").str();
   errs() << "Writing '" << Filename << "'...";
 
   std::error_code EC;
diff --git a/llvm/lib/FileCheck/FileCheck.cpp b/llvm/lib/FileCheck/FileCheck.cpp
index df220a9699f90..b8dd76d91dee2 100644
--- a/llvm/lib/FileCheck/FileCheck.cpp
+++ b/llvm/lib/FileCheck/FileCheck.cpp
@@ -1843,8 +1843,8 @@ bool FileCheck::readCheckFile(
   for (StringRef PatternString : Req.ImplicitCheckNot) {
     // Create a buffer with fake command line content in order to display the
     // command line option responsible for the specific implicit CHECK-NOT.
-    StringRef Prefix = "-implicit-check-not='";
-    StringRef Suffix = "'";
+    std::string Prefix = "-implicit-check-not='";
+    std::string Suffix = "'";
     std::unique_ptr<MemoryBuffer> CmdLine = MemoryBuffer::getMemBufferCopy(
         (Prefix + PatternString + Suffix).str(), "command line");
 
@@ -2592,8 +2592,7 @@ Error FileCheckPatternContext::defineCmdlineVariables(
       // Append a copy of the command-line definition adapted to use the same
       // format as in the input file to be able to reuse
       // parseNumericSubstitutionBlock.
-      CmdlineDefsDiag +=
-          (Twine(DefPrefix) + CmdlineDef + " (parsed as: [[").str();
+      CmdlineDefsDiag += (DefPrefix + CmdlineDef + " (parsed as: [[").str();
       std::string SubstitutionStr = std::string(CmdlineDef);
       SubstitutionStr[EqIdx] = ':';
       CmdlineDefsIndices.push_back(
diff --git a/llvm/lib/Frontend/OpenMP/OMP.cpp b/llvm/lib/Frontend/OpenMP/OMP.cpp
index ff584568d3cd9..8bfe3a6a7cc4a 100644
--- a/llvm/lib/Frontend/OpenMP/OMP.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMP.cpp
@@ -12,7 +12,6 @@
 #include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
-#include "llvm/ADT/Twine.h"
 #include "llvm/Demangle/Demangle.h"
 #include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
 #include "llvm/Support/ErrorHandling.h"
@@ -242,7 +241,7 @@ std::string prettifyFunctionName(StringRef FunctionName) {
   auto ParentName = deconstructOpenMPKernelName(FunctionName, LineNo);
   if (LineNo == 0)
     return FunctionName.str();
-  return (Twine("omp target in ") + ParentName + " @ " + Twine(LineNo) +
+  return ("omp target in " + ParentName + " @ " + std::to_string(LineNo) +
           " (" + FunctionName + ")")
       .str();
 }
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index 89dc139f80407..3a8125b835e53 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -4656,7 +4656,7 @@ Expected<Function *> OpenMPIRBuilder::emitGlobalToListReduceFunction(
 std::string OpenMPIRBuilder::getReductionFuncName(StringRef Name) const {
   std::string Suffix =
       createPlatformSpecificName({"omp", "reduction", "reduction_func"});
-  return (Twine(Name) + Suffix).str();
+  return (Name + Suffix).str();
 }
 
 Expected<Function *> OpenMPIRBuilder::createReductionFunction(
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index dedbc55d51c00..43651371e730d 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -7935,7 +7935,7 @@ std::string llvm::UpgradeDataLayoutString(StringRef DL, StringRef TT) {
   // to fix more IR than it breaks.
   // Intel MCU is an exception and uses 4-byte-alignment.
   if (!T.isOSIAMCU()) {
-    StringRef I128 = "-i128:128";
+    std::string I128 = "-i128:128";
     if (StringRef Ref = Res; !Ref.contains(I128)) {
       SmallVector<StringRef, 4> Groups;
       Regex R("^(e(-[mpi][^-]*)*)((-[^mpi][^-]*)*)$");
diff --git a/llvm/lib/Support/CodeGenCoverage.cpp b/llvm/lib/Support/CodeGenCoverage.cpp
index e1b04bbc64e16..2e35019e12c16 100644
--- a/llvm/lib/Support/CodeGenCoverage.cpp
+++ b/llvm/lib/Support/CodeGenCoverage.cpp
@@ -83,8 +83,9 @@ bool CodeGenCoverage::emit(StringRef CoveragePrefix,
     // We can handle locking within a process easily enough but we don't want to
     // manage it between multiple processes. Use the process ID to ensure no
     // more than one process is ever writing to the same file at the same time.
-    std::string CoverageFilename =
-        (CoveragePrefix + Twine(sys::Process::getProcessId())).str();
+    std::string Pid = llvm::to_string(sys::Process::getProcessId());
+
+    std::string CoverageFilename = (CoveragePrefix + Pid).str();
 
     std::error_code EC;
     sys::fs::OpenFlags OpenFlags = sys::fs::OF_Append;
diff --git a/llvm/lib/Support/VirtualFileSystem.cpp b/llvm/lib/Support/VirtualFileSystem.cpp
index 27004c0c0af13..5d0a3949e60ca 100644
--- a/llvm/lib/Support/VirtualFileSystem.cpp
+++ b/llvm/lib/Support/VirtualFileSystem.cpp
@@ -707,7 +707,7 @@ class InMemoryFile : public InMemoryNode {
   llvm::MemoryBuffer *getBuffer() const { return Buffer.get(); }
 
   std::string toString(unsigned Indent) const override {
-    return (Twine(std::string(Indent, ' ')) + Stat.getName() + "\n").str();
+    return (std::string(Indent, ' ') + Stat.getName() + "\n").str();
   }
 
   static bool classof(const InMemoryNode *N) {
@@ -829,7 +829,7 @@ class InMemoryDirectory : public InMemoryNode {
 
   std::string toString(unsigned Indent) const override {
     std::string Result =
-        (Twine(std::string(Indent, ' ')) + Stat.getName() + "\n").str();
+        (std::string(Indent, ' ') + Stat.getName() + "\n").str();
     for (const auto &Entry : Entries)
       Result += Entry.second->toString(Indent + 2);
     return Result;
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
index e30c2a262eede..467fdbfd0e05b 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
@@ -16,7 +16,6 @@
 #include "ARMInstPrinter.h"
 #include "ARMMCAsmInfo.h"
 #include "TargetInfo/ARMTargetInfo.h"
-#include "llvm/ADT/Twine.h"
 #include "llvm/DebugInfo/CodeView/CodeView.h"
 #include "llvm/MC/MCAsmBackend.h"
 #include "llvm/MC/MCCodeEmitter.h"
@@ -145,8 +144,7 @@ std::string ARM_MC::ParseARMTriple(const Triple &TT, StringRef CPU) {
 
   ARM::ArchKind ArchID = ARM::parseArch(TT.getArchName());
   if (ArchID != ARM::ArchKind::INVALID &&  (CPU.empty() || CPU == "generic"))
-    ARMArchFeature =
-        (Twine(ARMArchFeature) + "+" + ARM::getArchName(ArchID)).str();
+    ARMArchFeature = (ARMArchFeature + "+" + ARM::getArchName(ArchID)).str();
 
   if (TT.isThumb()) {
     if (!ARMArchFeature.empty())
diff --git a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
index 0599796dc79dc..9d2904dec0ad0 100644
--- a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
+++ b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
@@ -16,7 +16,6 @@
 #include "M68kMCAsmInfo.h"
 #include "TargetInfo/M68kTargetInfo.h"
 
-#include "llvm/ADT/Twine.h"
 #include "llvm/MC/MCELFStreamer.h"
 #include "llvm/MC/MCInstPrinter.h"
 #include "llvm/MC/MCInstrInfo.h"
@@ -63,7 +62,7 @@ static MCSubtargetInfo *createM68kMCSubtargetInfo(const Triple &TT,
   std::string ArchFS = ParseM68kTriple(TT, CPU);
   if (!FS.empty()) {
     if (!ArchFS.empty()) {
-      ArchFS = (Twine(ArchFS) + "," + FS).str();
+      ArchFS = (ArchFS + "," + FS).str();
     } else {
       ArchFS = FS.str();
     }
diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
index 3a9301b664dab..84196697060e3 100644
--- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
@@ -17,7 +17,6 @@
 #include "SPIRVUtils.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringTable.h"
-#include "llvm/ADT/Twine.h"
 #include "llvm/Analysis/ValueTracking.h"
 #include "llvm/IR/IntrinsicsSPIRV.h"
 #include <regex>
@@ -340,12 +339,12 @@ lookupBuiltin(StringRef DemangledCall,
 
     // If argument-type name prefix was added, look up the builtin again.
     if (!Prefix.empty() &&
-        (Builtin = SPIRV::lookupBuiltin((Twine(Prefix) + BuiltinName).str(), Set)))
+        (Builtin = SPIRV::lookupBuiltin((Prefix + BuiltinName).str(), Set)))
       return std::make_unique<SPIRV::IncomingCall>(
           BuiltinName, Builtin, ReturnRegister, ReturnType, Arguments);
 
     if (!Suffix.empty() &&
-        (Builtin = SPIRV::lookupBuiltin((Twine(BuiltinName) + Suffix).str(), Set)))
+        (Builtin = SPIRV::lookupBuiltin((BuiltinName + Suffix).str(), Set)))
       return std::make_unique<SPIRV::IncomingCall>(
           BuiltinName, Builtin, ReturnRegister, ReturnType, Arguments);
   }
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
index 44b756109e9b2..84bab9487f0c8 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
@@ -29,7 +29,6 @@
 #include "llvm/ADT/MapVector.h"
 #include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/StringExtras.h"
-#include "llvm/ADT/Twine.h"
 #include "llvm/Analysis/ValueTracking.h"
 #include "llvm/BinaryFormat/Wasm.h"
 #include "llvm/CodeGen/Analysis.h"
@@ -590,7 +589,7 @@ void WebAssemblyAsmPrinter::EmitTargetFeatures(Module &M) {
   // Read target features and linkage policies from module metadata
   SmallVector<FeatureEntry, 4> EmittedFeatures;
   auto EmitFeature = [&](std::string Feature) {
-    std::string MDKey = (Twine("wasm-feature-") + Feature).str();
+    std::string MDKey = (StringRef("wasm-feature-") + Feature).str();
     Metadata *Policy = M.getModuleFlag(MDKey);
     if (Policy == nullptr)
       return;
diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
index c45c804ad6cca..210b1266de23c 100644
--- a/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
+++ b/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
@@ -213,8 +213,7 @@ bool SanitizerBinaryMetadata::run() {
     // Calls to the initialization functions with different versions cannot be
     // merged. Give the structors unique names based on the version, which will
     // also be used as the COMDAT key.
-    const std::string StructorPrefix =
-        (Twine(MI->FunctionPrefix) + VersionStr).str();
+    const std::string StructorPrefix = (MI->FunctionPrefix + VersionStr).str();
 
     // We declare the _add and _del functions as weak, and only call them if
     // there is a valid symbol linked. This allows building binaries with

>From 1ed8666703afdbfaa3f78d3b0236bf8af9e907dc Mon Sep 17 00:00:00 2001
From: Richard Dong <rdong8 at protonmail.com>
Date: Thu, 1 Oct 2026 16:38:48 +0000
Subject: [PATCH 3/7] [ADT] Make StringRef to std::string_view conversion
 explicit

---
 llvm/include/llvm/ADT/StringRef.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/include/llvm/ADT/StringRef.h b/llvm/include/llvm/ADT/StringRef.h
index 724c27da0ee95..b21a73a2790d4 100644
--- a/llvm/include/llvm/ADT/StringRef.h
+++ b/llvm/include/llvm/ADT/StringRef.h
@@ -246,7 +246,7 @@ class LLVM_GSL_POINTER StringRef {
   /// @name Type Conversions
   /// @{
 
-  constexpr operator std::string_view() const {
+  explicit constexpr operator std::string_view() const {
     return std::string_view(data(), size());
   }
 

>From d484c977ecf4f7d316c1ce3c4962edc1680ca79f Mon Sep 17 00:00:00 2001
From: Richard Dong <rdong8 at protonmail.com>
Date: Fri, 2 Oct 2026 13:20:12 +0000
Subject: [PATCH 4/7] Revert "[ADT] Make StringRef to std::string_view
 conversion explicit"

This reverts commit 1ed8666703afdbfaa3f78d3b0236bf8af9e907dc.
---
 llvm/include/llvm/ADT/StringRef.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/include/llvm/ADT/StringRef.h b/llvm/include/llvm/ADT/StringRef.h
index b21a73a2790d4..724c27da0ee95 100644
--- a/llvm/include/llvm/ADT/StringRef.h
+++ b/llvm/include/llvm/ADT/StringRef.h
@@ -246,7 +246,7 @@ class LLVM_GSL_POINTER StringRef {
   /// @name Type Conversions
   /// @{
 
-  explicit constexpr operator std::string_view() const {
+  constexpr operator std::string_view() const {
     return std::string_view(data(), size());
   }
 

>From 20ee4f0f519fa4656049537cc57fbd728cd63113 Mon Sep 17 00:00:00 2001
From: Richard Dong <rdong8 at protonmail.com>
Date: Fri, 2 Oct 2026 13:20:27 +0000
Subject: [PATCH 5/7] Reapply "[llvm] Fix string and Twine concatenation for
 C++26 P2591R5"

This reverts commit 192be4e2233087a66389a596806a60d56e0383d1.
---
 llvm/include/llvm/Analysis/ReleaseModeModelRunner.h        | 3 ++-
 llvm/lib/Analysis/CFGPrinter.cpp                           | 2 +-
 llvm/lib/Analysis/ReplayInlineAdvisor.cpp                  | 3 ++-
 llvm/lib/CodeGen/MachineCFGPrinter.cpp                     | 3 ++-
 llvm/lib/FileCheck/FileCheck.cpp                           | 7 ++++---
 llvm/lib/Frontend/OpenMP/OMP.cpp                           | 3 ++-
 llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp                  | 2 +-
 llvm/lib/IR/AutoUpgrade.cpp                                | 2 +-
 llvm/lib/Support/CodeGenCoverage.cpp                       | 5 ++---
 llvm/lib/Support/VirtualFileSystem.cpp                     | 4 ++--
 llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp       | 4 +++-
 llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp     | 3 ++-
 llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp                    | 5 +++--
 llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp      | 3 ++-
 .../Transforms/Instrumentation/SanitizerBinaryMetadata.cpp | 3 ++-
 15 files changed, 31 insertions(+), 21 deletions(-)

diff --git a/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h b/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
index ff423a9155b14..3ca3205406946 100644
--- a/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
+++ b/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
@@ -15,6 +15,7 @@
 #define LLVM_ANALYSIS_RELEASEMODEMODELRUNNER_H
 
 #include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/Analysis/MLModelRunner.h"
 #include "llvm/Analysis/TensorSpec.h"
 #include "llvm/Support/ErrorHandling.h"
@@ -119,7 +120,7 @@ class ReleaseModeModelRunner final : public MLModelRunner {
   void populateTensor(size_t Pos, const TensorSpec &Spec, StringRef Prefix,
                       bool &InputIsPresent) {
     const int Index =
-        CompiledModel->LookupArgIndex((Prefix + Spec.name()).str());
+        CompiledModel->LookupArgIndex((Twine(Prefix) + Spec.name()).str());
     void *Buffer = nullptr;
     InputIsPresent = Index >= 0;
     if (InputIsPresent)
diff --git a/llvm/lib/Analysis/CFGPrinter.cpp b/llvm/lib/Analysis/CFGPrinter.cpp
index 39108a906f081..25f3f95e47485 100644
--- a/llvm/lib/Analysis/CFGPrinter.cpp
+++ b/llvm/lib/Analysis/CFGPrinter.cpp
@@ -62,7 +62,7 @@ static void writeCFGToDotFile(Function &F, BlockFrequencyInfo *BFI,
                               BranchProbabilityInfo *BPI, uint64_t MaxFreq,
                               bool CFGOnly = false) {
   std::string Filename =
-      (CFGDotFilenamePrefix + "." + F.getName() + ".dot").str();
+      (Twine(CFGDotFilenamePrefix) + "." + F.getName() + ".dot").str();
   errs() << "Writing '" << Filename << "'...";
 
   std::error_code EC;
diff --git a/llvm/lib/Analysis/ReplayInlineAdvisor.cpp b/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
index 7253478a0eedf..1b4f159105342 100644
--- a/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
+++ b/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
@@ -14,6 +14,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/Analysis/ReplayInlineAdvisor.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/Analysis/OptimizationRemarkEmitter.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/LineIterator.h"
@@ -107,7 +108,7 @@ std::unique_ptr<InlineAdvice> ReplayInlineAdvisor::getAdviceImpl(CallBase &CB) {
   std::string CallSiteLoc =
       formatCallSiteLocation(CB.getDebugLoc(), ReplaySettings.ReplayFormat);
   StringRef Callee = CB.getCalledFunction()->getName();
-  std::string Combined = (Callee + CallSiteLoc).str();
+  std::string Combined = (Twine(Callee) + CallSiteLoc).str();
 
   // Replay decision, if it has one
   auto Iter = InlineSitesFromRemarks.find(Combined);
diff --git a/llvm/lib/CodeGen/MachineCFGPrinter.cpp b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
index c604d4fd6e1e6..dec83d49b99cb 100644
--- a/llvm/lib/CodeGen/MachineCFGPrinter.cpp
+++ b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
@@ -17,6 +17,7 @@
 #include "llvm/CodeGen/TargetSubtargetInfo.h"
 #include "llvm/InitializePasses.h"
 #include "llvm/Pass.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/Support/GraphWriter.h"
 
 using namespace llvm;
@@ -38,7 +39,7 @@ static cl::opt<bool>
 
 static void writeMCFGToDotFile(MachineFunction &MF) {
   std::string Filename =
-      (MCFGDotFilenamePrefix + "." + MF.getName() + ".dot").str();
+      (Twine(MCFGDotFilenamePrefix) + "." + MF.getName() + ".dot").str();
   errs() << "Writing '" << Filename << "'...";
 
   std::error_code EC;
diff --git a/llvm/lib/FileCheck/FileCheck.cpp b/llvm/lib/FileCheck/FileCheck.cpp
index b8dd76d91dee2..df220a9699f90 100644
--- a/llvm/lib/FileCheck/FileCheck.cpp
+++ b/llvm/lib/FileCheck/FileCheck.cpp
@@ -1843,8 +1843,8 @@ bool FileCheck::readCheckFile(
   for (StringRef PatternString : Req.ImplicitCheckNot) {
     // Create a buffer with fake command line content in order to display the
     // command line option responsible for the specific implicit CHECK-NOT.
-    std::string Prefix = "-implicit-check-not='";
-    std::string Suffix = "'";
+    StringRef Prefix = "-implicit-check-not='";
+    StringRef Suffix = "'";
     std::unique_ptr<MemoryBuffer> CmdLine = MemoryBuffer::getMemBufferCopy(
         (Prefix + PatternString + Suffix).str(), "command line");
 
@@ -2592,7 +2592,8 @@ Error FileCheckPatternContext::defineCmdlineVariables(
       // Append a copy of the command-line definition adapted to use the same
       // format as in the input file to be able to reuse
       // parseNumericSubstitutionBlock.
-      CmdlineDefsDiag += (DefPrefix + CmdlineDef + " (parsed as: [[").str();
+      CmdlineDefsDiag +=
+          (Twine(DefPrefix) + CmdlineDef + " (parsed as: [[").str();
       std::string SubstitutionStr = std::string(CmdlineDef);
       SubstitutionStr[EqIdx] = ':';
       CmdlineDefsIndices.push_back(
diff --git a/llvm/lib/Frontend/OpenMP/OMP.cpp b/llvm/lib/Frontend/OpenMP/OMP.cpp
index 8bfe3a6a7cc4a..ff584568d3cd9 100644
--- a/llvm/lib/Frontend/OpenMP/OMP.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMP.cpp
@@ -12,6 +12,7 @@
 #include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/Demangle/Demangle.h"
 #include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
 #include "llvm/Support/ErrorHandling.h"
@@ -241,7 +242,7 @@ std::string prettifyFunctionName(StringRef FunctionName) {
   auto ParentName = deconstructOpenMPKernelName(FunctionName, LineNo);
   if (LineNo == 0)
     return FunctionName.str();
-  return ("omp target in " + ParentName + " @ " + std::to_string(LineNo) +
+  return (Twine("omp target in ") + ParentName + " @ " + Twine(LineNo) +
           " (" + FunctionName + ")")
       .str();
 }
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index 3a8125b835e53..89dc139f80407 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -4656,7 +4656,7 @@ Expected<Function *> OpenMPIRBuilder::emitGlobalToListReduceFunction(
 std::string OpenMPIRBuilder::getReductionFuncName(StringRef Name) const {
   std::string Suffix =
       createPlatformSpecificName({"omp", "reduction", "reduction_func"});
-  return (Name + Suffix).str();
+  return (Twine(Name) + Suffix).str();
 }
 
 Expected<Function *> OpenMPIRBuilder::createReductionFunction(
diff --git a/llvm/lib/IR/AutoUpgrade.cpp b/llvm/lib/IR/AutoUpgrade.cpp
index 43651371e730d..dedbc55d51c00 100644
--- a/llvm/lib/IR/AutoUpgrade.cpp
+++ b/llvm/lib/IR/AutoUpgrade.cpp
@@ -7935,7 +7935,7 @@ std::string llvm::UpgradeDataLayoutString(StringRef DL, StringRef TT) {
   // to fix more IR than it breaks.
   // Intel MCU is an exception and uses 4-byte-alignment.
   if (!T.isOSIAMCU()) {
-    std::string I128 = "-i128:128";
+    StringRef I128 = "-i128:128";
     if (StringRef Ref = Res; !Ref.contains(I128)) {
       SmallVector<StringRef, 4> Groups;
       Regex R("^(e(-[mpi][^-]*)*)((-[^mpi][^-]*)*)$");
diff --git a/llvm/lib/Support/CodeGenCoverage.cpp b/llvm/lib/Support/CodeGenCoverage.cpp
index 2e35019e12c16..e1b04bbc64e16 100644
--- a/llvm/lib/Support/CodeGenCoverage.cpp
+++ b/llvm/lib/Support/CodeGenCoverage.cpp
@@ -83,9 +83,8 @@ bool CodeGenCoverage::emit(StringRef CoveragePrefix,
     // We can handle locking within a process easily enough but we don't want to
     // manage it between multiple processes. Use the process ID to ensure no
     // more than one process is ever writing to the same file at the same time.
-    std::string Pid = llvm::to_string(sys::Process::getProcessId());
-
-    std::string CoverageFilename = (CoveragePrefix + Pid).str();
+    std::string CoverageFilename =
+        (CoveragePrefix + Twine(sys::Process::getProcessId())).str();
 
     std::error_code EC;
     sys::fs::OpenFlags OpenFlags = sys::fs::OF_Append;
diff --git a/llvm/lib/Support/VirtualFileSystem.cpp b/llvm/lib/Support/VirtualFileSystem.cpp
index 5d0a3949e60ca..27004c0c0af13 100644
--- a/llvm/lib/Support/VirtualFileSystem.cpp
+++ b/llvm/lib/Support/VirtualFileSystem.cpp
@@ -707,7 +707,7 @@ class InMemoryFile : public InMemoryNode {
   llvm::MemoryBuffer *getBuffer() const { return Buffer.get(); }
 
   std::string toString(unsigned Indent) const override {
-    return (std::string(Indent, ' ') + Stat.getName() + "\n").str();
+    return (Twine(std::string(Indent, ' ')) + Stat.getName() + "\n").str();
   }
 
   static bool classof(const InMemoryNode *N) {
@@ -829,7 +829,7 @@ class InMemoryDirectory : public InMemoryNode {
 
   std::string toString(unsigned Indent) const override {
     std::string Result =
-        (std::string(Indent, ' ') + Stat.getName() + "\n").str();
+        (Twine(std::string(Indent, ' ')) + Stat.getName() + "\n").str();
     for (const auto &Entry : Entries)
       Result += Entry.second->toString(Indent + 2);
     return Result;
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
index 467fdbfd0e05b..e30c2a262eede 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
@@ -16,6 +16,7 @@
 #include "ARMInstPrinter.h"
 #include "ARMMCAsmInfo.h"
 #include "TargetInfo/ARMTargetInfo.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/DebugInfo/CodeView/CodeView.h"
 #include "llvm/MC/MCAsmBackend.h"
 #include "llvm/MC/MCCodeEmitter.h"
@@ -144,7 +145,8 @@ std::string ARM_MC::ParseARMTriple(const Triple &TT, StringRef CPU) {
 
   ARM::ArchKind ArchID = ARM::parseArch(TT.getArchName());
   if (ArchID != ARM::ArchKind::INVALID &&  (CPU.empty() || CPU == "generic"))
-    ARMArchFeature = (ARMArchFeature + "+" + ARM::getArchName(ArchID)).str();
+    ARMArchFeature =
+        (Twine(ARMArchFeature) + "+" + ARM::getArchName(ArchID)).str();
 
   if (TT.isThumb()) {
     if (!ARMArchFeature.empty())
diff --git a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
index 9d2904dec0ad0..0599796dc79dc 100644
--- a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
+++ b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
@@ -16,6 +16,7 @@
 #include "M68kMCAsmInfo.h"
 #include "TargetInfo/M68kTargetInfo.h"
 
+#include "llvm/ADT/Twine.h"
 #include "llvm/MC/MCELFStreamer.h"
 #include "llvm/MC/MCInstPrinter.h"
 #include "llvm/MC/MCInstrInfo.h"
@@ -62,7 +63,7 @@ static MCSubtargetInfo *createM68kMCSubtargetInfo(const Triple &TT,
   std::string ArchFS = ParseM68kTriple(TT, CPU);
   if (!FS.empty()) {
     if (!ArchFS.empty()) {
-      ArchFS = (ArchFS + "," + FS).str();
+      ArchFS = (Twine(ArchFS) + "," + FS).str();
     } else {
       ArchFS = FS.str();
     }
diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
index 84196697060e3..3a9301b664dab 100644
--- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
@@ -17,6 +17,7 @@
 #include "SPIRVUtils.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringTable.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/Analysis/ValueTracking.h"
 #include "llvm/IR/IntrinsicsSPIRV.h"
 #include <regex>
@@ -339,12 +340,12 @@ lookupBuiltin(StringRef DemangledCall,
 
     // If argument-type name prefix was added, look up the builtin again.
     if (!Prefix.empty() &&
-        (Builtin = SPIRV::lookupBuiltin((Prefix + BuiltinName).str(), Set)))
+        (Builtin = SPIRV::lookupBuiltin((Twine(Prefix) + BuiltinName).str(), Set)))
       return std::make_unique<SPIRV::IncomingCall>(
           BuiltinName, Builtin, ReturnRegister, ReturnType, Arguments);
 
     if (!Suffix.empty() &&
-        (Builtin = SPIRV::lookupBuiltin((BuiltinName + Suffix).str(), Set)))
+        (Builtin = SPIRV::lookupBuiltin((Twine(BuiltinName) + Suffix).str(), Set)))
       return std::make_unique<SPIRV::IncomingCall>(
           BuiltinName, Builtin, ReturnRegister, ReturnType, Arguments);
   }
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
index 84bab9487f0c8..44b756109e9b2 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
@@ -29,6 +29,7 @@
 #include "llvm/ADT/MapVector.h"
 #include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/StringExtras.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/Analysis/ValueTracking.h"
 #include "llvm/BinaryFormat/Wasm.h"
 #include "llvm/CodeGen/Analysis.h"
@@ -589,7 +590,7 @@ void WebAssemblyAsmPrinter::EmitTargetFeatures(Module &M) {
   // Read target features and linkage policies from module metadata
   SmallVector<FeatureEntry, 4> EmittedFeatures;
   auto EmitFeature = [&](std::string Feature) {
-    std::string MDKey = (StringRef("wasm-feature-") + Feature).str();
+    std::string MDKey = (Twine("wasm-feature-") + Feature).str();
     Metadata *Policy = M.getModuleFlag(MDKey);
     if (Policy == nullptr)
       return;
diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
index 210b1266de23c..c45c804ad6cca 100644
--- a/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
+++ b/llvm/lib/Transforms/Instrumentation/SanitizerBinaryMetadata.cpp
@@ -213,7 +213,8 @@ bool SanitizerBinaryMetadata::run() {
     // Calls to the initialization functions with different versions cannot be
     // merged. Give the structors unique names based on the version, which will
     // also be used as the COMDAT key.
-    const std::string StructorPrefix = (MI->FunctionPrefix + VersionStr).str();
+    const std::string StructorPrefix =
+        (Twine(MI->FunctionPrefix) + VersionStr).str();
 
     // We declare the _add and _del functions as weak, and only call them if
     // there is a valid symbol linked. This allows building binaries with

>From 4d766e71a9125fd2e23ce9d440ffb586acfa929c Mon Sep 17 00:00:00 2001
From: Richard Dong <rdong8 at protonmail.com>
Date: Fri, 2 Oct 2026 13:21:13 +0000
Subject: [PATCH 6/7] format code

---
 llvm/lib/CodeGen/MachineCFGPrinter.cpp  | 2 +-
 llvm/lib/Frontend/OpenMP/OMP.cpp        | 4 ++--
 llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp | 8 ++++----
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/llvm/lib/CodeGen/MachineCFGPrinter.cpp b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
index dec83d49b99cb..e43be28e61f57 100644
--- a/llvm/lib/CodeGen/MachineCFGPrinter.cpp
+++ b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
@@ -12,12 +12,12 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/CodeGen/MachineCFGPrinter.h"
+#include "llvm/ADT/Twine.h"
 #include "llvm/CodeGen/MachineBasicBlock.h"
 #include "llvm/CodeGen/MachineFunctionPass.h"
 #include "llvm/CodeGen/TargetSubtargetInfo.h"
 #include "llvm/InitializePasses.h"
 #include "llvm/Pass.h"
-#include "llvm/ADT/Twine.h"
 #include "llvm/Support/GraphWriter.h"
 
 using namespace llvm;
diff --git a/llvm/lib/Frontend/OpenMP/OMP.cpp b/llvm/lib/Frontend/OpenMP/OMP.cpp
index ff584568d3cd9..936fb029ed757 100644
--- a/llvm/lib/Frontend/OpenMP/OMP.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMP.cpp
@@ -242,8 +242,8 @@ std::string prettifyFunctionName(StringRef FunctionName) {
   auto ParentName = deconstructOpenMPKernelName(FunctionName, LineNo);
   if (LineNo == 0)
     return FunctionName.str();
-  return (Twine("omp target in ") + ParentName + " @ " + Twine(LineNo) +
-          " (" + FunctionName + ")")
+  return (Twine("omp target in ") + ParentName + " @ " + Twine(LineNo) + " (" +
+          FunctionName + ")")
       .str();
 }
 
diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
index 3a9301b664dab..70971a08f6859 100644
--- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
@@ -339,13 +339,13 @@ lookupBuiltin(StringRef DemangledCall,
     }
 
     // If argument-type name prefix was added, look up the builtin again.
-    if (!Prefix.empty() &&
-        (Builtin = SPIRV::lookupBuiltin((Twine(Prefix) + BuiltinName).str(), Set)))
+    if (!Prefix.empty() && (Builtin = SPIRV::lookupBuiltin(
+                                (Twine(Prefix) + BuiltinName).str(), Set)))
       return std::make_unique<SPIRV::IncomingCall>(
           BuiltinName, Builtin, ReturnRegister, ReturnType, Arguments);
 
-    if (!Suffix.empty() &&
-        (Builtin = SPIRV::lookupBuiltin((Twine(BuiltinName) + Suffix).str(), Set)))
+    if (!Suffix.empty() && (Builtin = SPIRV::lookupBuiltin(
+                                (Twine(BuiltinName) + Suffix).str(), Set)))
       return std::make_unique<SPIRV::IncomingCall>(
           BuiltinName, Builtin, ReturnRegister, ReturnType, Arguments);
   }

>From 58e4ae3e0b10f6916bbe0a79d0423a65615865ea Mon Sep 17 00:00:00 2001
From: Richard Dong <rdong8 at protonmail.com>
Date: Sun, 4 Oct 2026 20:06:28 +0000
Subject: [PATCH 7/7] remove redundant includes

---
 llvm/include/llvm/Analysis/ReleaseModeModelRunner.h    | 1 -
 llvm/lib/Analysis/ReplayInlineAdvisor.cpp              | 1 -
 llvm/lib/CodeGen/MachineCFGPrinter.cpp                 | 1 -
 llvm/lib/Frontend/OpenMP/OMP.cpp                       | 1 -
 llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp   | 1 -
 llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp | 1 -
 llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp                | 1 -
 llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp  | 1 -
 8 files changed, 8 deletions(-)

diff --git a/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h b/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
index 3ca3205406946..9b9d1392371d6 100644
--- a/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
+++ b/llvm/include/llvm/Analysis/ReleaseModeModelRunner.h
@@ -15,7 +15,6 @@
 #define LLVM_ANALYSIS_RELEASEMODEMODELRUNNER_H
 
 #include "llvm/ADT/StringExtras.h"
-#include "llvm/ADT/Twine.h"
 #include "llvm/Analysis/MLModelRunner.h"
 #include "llvm/Analysis/TensorSpec.h"
 #include "llvm/Support/ErrorHandling.h"
diff --git a/llvm/lib/Analysis/ReplayInlineAdvisor.cpp b/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
index 1b4f159105342..842e9b5b676d2 100644
--- a/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
+++ b/llvm/lib/Analysis/ReplayInlineAdvisor.cpp
@@ -14,7 +14,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/Analysis/ReplayInlineAdvisor.h"
-#include "llvm/ADT/Twine.h"
 #include "llvm/Analysis/OptimizationRemarkEmitter.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/LineIterator.h"
diff --git a/llvm/lib/CodeGen/MachineCFGPrinter.cpp b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
index e43be28e61f57..196f7a42198ee 100644
--- a/llvm/lib/CodeGen/MachineCFGPrinter.cpp
+++ b/llvm/lib/CodeGen/MachineCFGPrinter.cpp
@@ -12,7 +12,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/CodeGen/MachineCFGPrinter.h"
-#include "llvm/ADT/Twine.h"
 #include "llvm/CodeGen/MachineBasicBlock.h"
 #include "llvm/CodeGen/MachineFunctionPass.h"
 #include "llvm/CodeGen/TargetSubtargetInfo.h"
diff --git a/llvm/lib/Frontend/OpenMP/OMP.cpp b/llvm/lib/Frontend/OpenMP/OMP.cpp
index 936fb029ed757..302a66c0af93f 100644
--- a/llvm/lib/Frontend/OpenMP/OMP.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMP.cpp
@@ -12,7 +12,6 @@
 #include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/StringRef.h"
-#include "llvm/ADT/Twine.h"
 #include "llvm/Demangle/Demangle.h"
 #include "llvm/Frontend/OpenMP/OMPIRBuilder.h"
 #include "llvm/Support/ErrorHandling.h"
diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
index e30c2a262eede..3bd39d2d97109 100644
--- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
+++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCTargetDesc.cpp
@@ -16,7 +16,6 @@
 #include "ARMInstPrinter.h"
 #include "ARMMCAsmInfo.h"
 #include "TargetInfo/ARMTargetInfo.h"
-#include "llvm/ADT/Twine.h"
 #include "llvm/DebugInfo/CodeView/CodeView.h"
 #include "llvm/MC/MCAsmBackend.h"
 #include "llvm/MC/MCCodeEmitter.h"
diff --git a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
index 0599796dc79dc..f43d56ad6baf3 100644
--- a/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
+++ b/llvm/lib/Target/M68k/MCTargetDesc/M68kMCTargetDesc.cpp
@@ -16,7 +16,6 @@
 #include "M68kMCAsmInfo.h"
 #include "TargetInfo/M68kTargetInfo.h"
 
-#include "llvm/ADT/Twine.h"
 #include "llvm/MC/MCELFStreamer.h"
 #include "llvm/MC/MCInstPrinter.h"
 #include "llvm/MC/MCInstrInfo.h"
diff --git a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
index 70971a08f6859..ef41e2fa63981 100644
--- a/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp
@@ -17,7 +17,6 @@
 #include "SPIRVUtils.h"
 #include "llvm/ADT/StringExtras.h"
 #include "llvm/ADT/StringTable.h"
-#include "llvm/ADT/Twine.h"
 #include "llvm/Analysis/ValueTracking.h"
 #include "llvm/IR/IntrinsicsSPIRV.h"
 #include <regex>
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
index 44b756109e9b2..1945a7f10909f 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyAsmPrinter.cpp
@@ -29,7 +29,6 @@
 #include "llvm/ADT/MapVector.h"
 #include "llvm/ADT/SmallSet.h"
 #include "llvm/ADT/StringExtras.h"
-#include "llvm/ADT/Twine.h"
 #include "llvm/Analysis/ValueTracking.h"
 #include "llvm/BinaryFormat/Wasm.h"
 #include "llvm/CodeGen/Analysis.h"



More information about the llvm-commits mailing list