From 9e54ca12e91c054d5314629b66b0d78b0efeac0e Mon Sep 17 00:00:00 2001 From: Akshay Deodhar Date: Thu, 19 Mar 2026 17:31:34 -0700 Subject: [PATCH] [AtomicExpandPass] Remove AtomicExpandUtils.h (NFC) (#187609) The purpose of AtomicExpandUtils.h was to allow code reuse with [PNaCl ](https://en.wikipedia.org/wiki/Google_Native_Client)which has since been deprecated. This PR removes the file, and migrates the declarations to be visible only in the necessary scopes. --- llvm/include/llvm/CodeGen/AtomicExpandUtils.h | 64 ------------------- llvm/lib/CodeGen/AtomicExpandPass.cpp | 19 ++++-- 2 files changed, 12 insertions(+), 71 deletions(-) delete mode 100644 llvm/include/llvm/CodeGen/AtomicExpandUtils.h diff --git a/llvm/include/llvm/CodeGen/AtomicExpandUtils.h b/llvm/include/llvm/CodeGen/AtomicExpandUtils.h deleted file mode 100644 index 3a7eda68cdc2..000000000000 --- a/llvm/include/llvm/CodeGen/AtomicExpandUtils.h +++ /dev/null @@ -1,64 +0,0 @@ -//===- AtomicExpandUtils.h - Utilities for expanding atomic instructions --===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CODEGEN_ATOMICEXPANDUTILS_H -#define LLVM_CODEGEN_ATOMICEXPANDUTILS_H - -#include "llvm/ADT/STLExtras.h" -#include "llvm/IR/IRBuilder.h" -#include "llvm/Support/AtomicOrdering.h" - -namespace llvm { - -class AtomicRMWInst; -class Value; - -/// Parameters (see the expansion example below): -/// (the builder, %addr, %loaded, %new_val, ordering, -/// /* OUT */ %success, /* OUT */ %new_loaded, -/// %MetadataSrc) -using CreateCmpXchgInstFun = function_ref; - -/// Expand an atomic RMW instruction into a loop utilizing -/// cmpxchg. You'll want to make sure your target machine likes cmpxchg -/// instructions in the first place and that there isn't another, better, -/// transformation available (for example AArch32/AArch64 have linked loads). -/// -/// This is useful in passes which can't rewrite the more exotic RMW -/// instructions directly into a platform specific intrinsics (because, say, -/// those intrinsics don't exist). If such a pass is able to expand cmpxchg -/// instructions directly however, then, with this function, it could avoid two -/// extra module passes (avoiding passes by `-atomic-expand` and itself). -/// -/// Given: atomicrmw some_op iN* %addr, iN %incr ordering -/// -/// The standard expansion we produce is: -/// [...] -/// %init_loaded = load atomic iN* %addr -/// br label %loop -/// loop: -/// %loaded = phi iN [ %init_loaded, %entry ], [ %new_loaded, %loop ] -/// %new = some_op iN %loaded, %incr -/// ; This is what -atomic-expand will produce using this function on i686 -/// targets: -/// %pair = cmpxchg iN* %addr, iN %loaded, iN %new_val -/// %new_loaded = extractvalue { iN, i1 } %pair, 0 -/// %success = extractvalue { iN, i1 } %pair, 1 -/// ; End callback produced IR -/// br i1 %success, label %atomicrmw.end, label %loop -/// atomicrmw.end: -/// [...] -/// -/// Returns true if the containing function was modified. -bool expandAtomicRMWToCmpXchg(AtomicRMWInst *AI, CreateCmpXchgInstFun CreateCmpXchg); - -} // end namespace llvm - -#endif // LLVM_CODEGEN_ATOMICEXPANDUTILS_H diff --git a/llvm/lib/CodeGen/AtomicExpandPass.cpp b/llvm/lib/CodeGen/AtomicExpandPass.cpp index 2bcd7fb3f62e..9585ebae2482 100644 --- a/llvm/lib/CodeGen/AtomicExpandPass.cpp +++ b/llvm/lib/CodeGen/AtomicExpandPass.cpp @@ -20,7 +20,6 @@ #include "llvm/Analysis/InstSimplifyFolder.h" #include "llvm/Analysis/OptimizationRemarkEmitter.h" #include "llvm/CodeGen/AtomicExpand.h" -#include "llvm/CodeGen/AtomicExpandUtils.h" #include "llvm/CodeGen/TargetLowering.h" #include "llvm/CodeGen/TargetPassConfig.h" #include "llvm/CodeGen/TargetSubtargetInfo.h" @@ -67,6 +66,14 @@ class AtomicExpandImpl { const DataLayout *DL = nullptr; private: + /// Callback type for emitting a cmpxchg instruction during RMW expansion. + /// Parameters: (Builder, Addr, Loaded, NewVal, AddrAlign, MemOpOrder, + /// SSID, IsVolatile, /* OUT */ Success, /* OUT */ NewLoaded, + /// MetadataSrc) + using CreateCmpXchgInstFun = function_ref; + void handleFailure(Instruction &FailedInst, const Twine &Msg) const { LLVMContext &Ctx = FailedInst.getContext(); @@ -126,9 +133,8 @@ private: void expandAtomicRMWToLibcall(AtomicRMWInst *I); void expandAtomicCASToLibcall(AtomicCmpXchgInst *I); - friend bool - llvm::expandAtomicRMWToCmpXchg(AtomicRMWInst *AI, - CreateCmpXchgInstFun CreateCmpXchg); + bool expandAtomicRMWToCmpXchg(AtomicRMWInst *AI, + CreateCmpXchgInstFun CreateCmpXchg); bool processAtomicInstr(Instruction *I); @@ -1744,9 +1750,8 @@ bool AtomicExpandImpl::tryExpandAtomicCmpXchg(AtomicCmpXchgInst *CI) { } } -// Note: This function is exposed externally by AtomicExpandUtils.h -bool llvm::expandAtomicRMWToCmpXchg(AtomicRMWInst *AI, - CreateCmpXchgInstFun CreateCmpXchg) { +bool AtomicExpandImpl::expandAtomicRMWToCmpXchg( + AtomicRMWInst *AI, CreateCmpXchgInstFun CreateCmpXchg) { ReplacementIRBuilder Builder(AI, AI->getDataLayout()); Builder.setIsFPConstrained( AI->getFunction()->hasFnAttribute(Attribute::StrictFP));