[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.
This commit is contained in:
parent
edf0fb8132
commit
9e54ca12e9
@ -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<void(
|
||||
IRBuilderBase &, Value *, Value *, Value *, Align, AtomicOrdering,
|
||||
SyncScope::ID, Value *&, Value *&, Instruction *)>;
|
||||
|
||||
/// 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
|
||||
@ -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(
|
||||
IRBuilderBase &, Value *, Value *, Value *, Align, AtomicOrdering,
|
||||
SyncScope::ID, Value *&, Value *&, Instruction *)>;
|
||||
|
||||
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));
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user