LLVM 20.0.0git
NVPTXAtomicLower.cpp
Go to the documentation of this file.
1//===-- NVPTXAtomicLower.cpp - Lower atomics of local memory ----*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Lower atomics of local memory to simple load/stores
10//
11//===----------------------------------------------------------------------===//
12
13#include "NVPTXAtomicLower.h"
15#include "llvm/IR/Function.h"
19
21using namespace llvm;
22
23namespace {
24// Hoisting the alloca instructions in the non-entry blocks to the entry
25// block.
26class NVPTXAtomicLower : public FunctionPass {
27public:
28 static char ID; // Pass ID
29 NVPTXAtomicLower() : FunctionPass(ID) {}
30
31 void getAnalysisUsage(AnalysisUsage &AU) const override {
32 AU.setPreservesCFG();
33 }
34
35 StringRef getPassName() const override {
36 return "NVPTX lower atomics of local memory";
37 }
38
39 bool runOnFunction(Function &F) override;
40};
41} // namespace
42
43bool NVPTXAtomicLower::runOnFunction(Function &F) {
44 SmallVector<AtomicRMWInst *> LocalMemoryAtomics;
45 for (Instruction &I : instructions(F))
46 if (AtomicRMWInst *RMWI = dyn_cast<AtomicRMWInst>(&I))
47 if (RMWI->getPointerAddressSpace() == ADDRESS_SPACE_LOCAL)
48 LocalMemoryAtomics.push_back(RMWI);
49
50 bool Changed = false;
51 for (AtomicRMWInst *RMWI : LocalMemoryAtomics)
52 Changed |= lowerAtomicRMWInst(RMWI);
53 return Changed;
54}
55
56char NVPTXAtomicLower::ID = 0;
57
58namespace llvm {
60}
61
62INITIALIZE_PASS(NVPTXAtomicLower, "nvptx-atomic-lower",
63 "Lower atomics of local memory to simple load/stores", false,
64 false)
65
67 return new NVPTXAtomicLower();
68}
Expand Atomic instructions
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:38
Represent the analysis usage information of a pass.
void setPreservesCFG()
This function should be called by the pass, iff they do not:
Definition: Pass.cpp:256
an instruction that atomically reads a memory location, combines it with another value,...
Definition: Instructions.h:704
FunctionPass class - This class is used to implement most global optimizations.
Definition: Pass.h:310
virtual bool runOnFunction(Function &F)=0
runOnFunction - Virtual method overriden by subclasses to do the per-function processing of the pass.
PassRegistry - This class manages the registration and intitialization of the pass subsystem as appli...
Definition: PassRegistry.h:37
virtual void getAnalysisUsage(AnalysisUsage &) const
getAnalysisUsage - This function should be overriden by passes that need analysis information to do t...
Definition: Pass.cpp:98
virtual StringRef getPassName() const
getPassName - Return a nice clean name for a pass.
Definition: Pass.cpp:81
void push_back(const T &Elt)
Definition: SmallVector.h:413
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1196
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition: CallingConv.h:24
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
FunctionPass * createNVPTXAtomicLowerPass()
bool lowerAtomicRMWInst(AtomicRMWInst *RMWI)
Convert the given RMWI into primitive load and stores, assuming that doing so is legal.
void initializeNVPTXAtomicLowerPass(PassRegistry &)