1 //===-- NVPTXAtomicLower.cpp - Lower atomics of local memory ----*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 // Lower atomics of local memory to simple load/stores
11 //===----------------------------------------------------------------------===//
13 #include "NVPTXAtomicLower.h"
14 #include "llvm/CodeGen/StackProtector.h"
15 #include "llvm/IR/Constants.h"
16 #include "llvm/IR/Function.h"
17 #include "llvm/IR/IRBuilder.h"
18 #include "llvm/IR/InstIterator.h"
19 #include "llvm/IR/Instructions.h"
20 #include "llvm/Transforms/Utils/LowerAtomic.h"
22 #include "MCTargetDesc/NVPTXBaseInfo.h"
26 // Hoisting the alloca instructions in the non-entry blocks to the entry
28 class NVPTXAtomicLower
: public FunctionPass
{
30 static char ID
; // Pass ID
31 NVPTXAtomicLower() : FunctionPass(ID
) {}
33 void getAnalysisUsage(AnalysisUsage
&AU
) const override
{
37 StringRef
getPassName() const override
{
38 return "NVPTX lower atomics of local memory";
41 bool runOnFunction(Function
&F
) override
;
45 bool NVPTXAtomicLower::runOnFunction(Function
&F
) {
46 SmallVector
<AtomicRMWInst
*> LocalMemoryAtomics
;
47 for (Instruction
&I
: instructions(F
))
48 if (AtomicRMWInst
*RMWI
= dyn_cast
<AtomicRMWInst
>(&I
))
49 if (RMWI
->getPointerAddressSpace() == ADDRESS_SPACE_LOCAL
)
50 LocalMemoryAtomics
.push_back(RMWI
);
53 for (AtomicRMWInst
*RMWI
: LocalMemoryAtomics
)
54 Changed
|= lowerAtomicRMWInst(RMWI
);
58 char NVPTXAtomicLower::ID
= 0;
61 void initializeNVPTXAtomicLowerPass(PassRegistry
&);
64 INITIALIZE_PASS(NVPTXAtomicLower
, "nvptx-atomic-lower",
65 "Lower atomics of local memory to simple load/stores", false,
68 FunctionPass
*llvm::createNVPTXAtomicLowerPass() {
69 return new NVPTXAtomicLower();