Path: blob/main/contrib/llvm-project/llvm/lib/Target/NVPTX/NVPTXAtomicLower.cpp
35271 views
//===-- NVPTXAtomicLower.cpp - Lower atomics of local memory ----*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// Lower atomics of local memory to simple load/stores9//10//===----------------------------------------------------------------------===//1112#include "NVPTXAtomicLower.h"13#include "llvm/CodeGen/StackProtector.h"14#include "llvm/IR/Constants.h"15#include "llvm/IR/Function.h"16#include "llvm/IR/IRBuilder.h"17#include "llvm/IR/InstIterator.h"18#include "llvm/IR/Instructions.h"19#include "llvm/Transforms/Utils/LowerAtomic.h"2021#include "MCTargetDesc/NVPTXBaseInfo.h"22using namespace llvm;2324namespace {25// Hoisting the alloca instructions in the non-entry blocks to the entry26// block.27class NVPTXAtomicLower : public FunctionPass {28public:29static char ID; // Pass ID30NVPTXAtomicLower() : FunctionPass(ID) {}3132void getAnalysisUsage(AnalysisUsage &AU) const override {33AU.setPreservesCFG();34}3536StringRef getPassName() const override {37return "NVPTX lower atomics of local memory";38}3940bool runOnFunction(Function &F) override;41};42} // namespace4344bool NVPTXAtomicLower::runOnFunction(Function &F) {45SmallVector<AtomicRMWInst *> LocalMemoryAtomics;46for (Instruction &I : instructions(F))47if (AtomicRMWInst *RMWI = dyn_cast<AtomicRMWInst>(&I))48if (RMWI->getPointerAddressSpace() == ADDRESS_SPACE_LOCAL)49LocalMemoryAtomics.push_back(RMWI);5051bool Changed = false;52for (AtomicRMWInst *RMWI : LocalMemoryAtomics)53Changed |= lowerAtomicRMWInst(RMWI);54return Changed;55}5657char NVPTXAtomicLower::ID = 0;5859namespace llvm {60void initializeNVPTXAtomicLowerPass(PassRegistry &);61}6263INITIALIZE_PASS(NVPTXAtomicLower, "nvptx-atomic-lower",64"Lower atomics of local memory to simple load/stores", false,65false)6667FunctionPass *llvm::createNVPTXAtomicLowerPass() {68return new NVPTXAtomicLower();69}707172