mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
e7084f2810
LLVM does not have valid assembly backends for atomicrmw on local memory. However, as this memory is thread local, we should be able to lower this to the relevant load/store. Differential Revision: https://reviews.llvm.org/D98650
71 lines
2.1 KiB
C++
71 lines
2.1 KiB
C++
//===-- NVPTXAtomicLower.cpp - Lower atomics of local memory ----*- C++ -*-===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Lower atomics of local memory to simple load/stores
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "NVPTXAtomicLower.h"
|
|
#include "llvm/CodeGen/StackProtector.h"
|
|
#include "llvm/IR/Constants.h"
|
|
#include "llvm/IR/Function.h"
|
|
#include "llvm/IR/IRBuilder.h"
|
|
#include "llvm/IR/InstIterator.h"
|
|
#include "llvm/IR/Instructions.h"
|
|
#include "llvm/Transforms/Scalar/LowerAtomic.h"
|
|
|
|
#include "MCTargetDesc/NVPTXBaseInfo.h"
|
|
using namespace llvm;
|
|
|
|
namespace {
|
|
// Hoisting the alloca instructions in the non-entry blocks to the entry
|
|
// block.
|
|
class NVPTXAtomicLower : public FunctionPass {
|
|
public:
|
|
static char ID; // Pass ID
|
|
NVPTXAtomicLower() : FunctionPass(ID) {}
|
|
|
|
void getAnalysisUsage(AnalysisUsage &AU) const override {
|
|
AU.setPreservesCFG();
|
|
}
|
|
|
|
StringRef getPassName() const override {
|
|
return "NVPTX lower atomics of local memory";
|
|
}
|
|
|
|
bool runOnFunction(Function &F) override;
|
|
};
|
|
} // namespace
|
|
|
|
bool NVPTXAtomicLower::runOnFunction(Function &F) {
|
|
SmallVector<AtomicRMWInst *> LocalMemoryAtomics;
|
|
for (Instruction &I : instructions(F))
|
|
if (AtomicRMWInst *RMWI = dyn_cast<AtomicRMWInst>(&I))
|
|
if (RMWI->getPointerAddressSpace() == ADDRESS_SPACE_LOCAL)
|
|
LocalMemoryAtomics.push_back(RMWI);
|
|
|
|
bool Changed = false;
|
|
for (AtomicRMWInst *RMWI : LocalMemoryAtomics)
|
|
Changed |= lowerAtomicRMWInst(RMWI);
|
|
return Changed;
|
|
}
|
|
|
|
char NVPTXAtomicLower::ID = 0;
|
|
|
|
namespace llvm {
|
|
void initializeNVPTXAtomicLowerPass(PassRegistry &);
|
|
}
|
|
|
|
INITIALIZE_PASS(NVPTXAtomicLower, "nvptx-atomic-lower",
|
|
"Lower atomics of local memory to simple load/stores", false,
|
|
false)
|
|
|
|
FunctionPass *llvm::createNVPTXAtomicLowerPass() {
|
|
return new NVPTXAtomicLower();
|
|
}
|