Path: blob/main/contrib/llvm-project/llvm/lib/Target/AMDGPU/AMDGPUAnnotateUniformValues.cpp
35294 views
//===-- AMDGPUAnnotateUniformValues.cpp - ---------------------------------===//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/// \file9/// This pass adds amdgpu.uniform metadata to IR values so this information10/// can be used during instruction selection.11//12//===----------------------------------------------------------------------===//1314#include "AMDGPU.h"15#include "Utils/AMDGPUBaseInfo.h"16#include "Utils/AMDGPUMemoryUtils.h"17#include "llvm/Analysis/AliasAnalysis.h"18#include "llvm/Analysis/MemorySSA.h"19#include "llvm/Analysis/UniformityAnalysis.h"20#include "llvm/IR/InstVisitor.h"21#include "llvm/InitializePasses.h"2223#define DEBUG_TYPE "amdgpu-annotate-uniform"2425using namespace llvm;2627namespace {2829class AMDGPUAnnotateUniformValues : public FunctionPass,30public InstVisitor<AMDGPUAnnotateUniformValues> {31UniformityInfo *UA;32MemorySSA *MSSA;33AliasAnalysis *AA;34bool isEntryFunc;35bool Changed;3637void setUniformMetadata(Instruction *I) {38I->setMetadata("amdgpu.uniform", MDNode::get(I->getContext(), {}));39Changed = true;40}4142void setNoClobberMetadata(Instruction *I) {43I->setMetadata("amdgpu.noclobber", MDNode::get(I->getContext(), {}));44Changed = true;45}4647public:48static char ID;49AMDGPUAnnotateUniformValues() :50FunctionPass(ID) { }51bool doInitialization(Module &M) override;52bool runOnFunction(Function &F) override;53StringRef getPassName() const override {54return "AMDGPU Annotate Uniform Values";55}56void getAnalysisUsage(AnalysisUsage &AU) const override {57AU.addRequired<UniformityInfoWrapperPass>();58AU.addRequired<MemorySSAWrapperPass>();59AU.addRequired<AAResultsWrapperPass>();60AU.setPreservesAll();61}6263void visitBranchInst(BranchInst &I);64void visitLoadInst(LoadInst &I);65};6667} // End anonymous namespace6869INITIALIZE_PASS_BEGIN(AMDGPUAnnotateUniformValues, DEBUG_TYPE,70"Add AMDGPU uniform metadata", false, false)71INITIALIZE_PASS_DEPENDENCY(UniformityInfoWrapperPass)72INITIALIZE_PASS_DEPENDENCY(MemorySSAWrapperPass)73INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)74INITIALIZE_PASS_END(AMDGPUAnnotateUniformValues, DEBUG_TYPE,75"Add AMDGPU uniform metadata", false, false)7677char AMDGPUAnnotateUniformValues::ID = 0;7879void AMDGPUAnnotateUniformValues::visitBranchInst(BranchInst &I) {80if (UA->isUniform(&I))81setUniformMetadata(&I);82}8384void AMDGPUAnnotateUniformValues::visitLoadInst(LoadInst &I) {85Value *Ptr = I.getPointerOperand();86if (!UA->isUniform(Ptr))87return;88Instruction *PtrI = dyn_cast<Instruction>(Ptr);89if (PtrI)90setUniformMetadata(PtrI);9192// We're tracking up to the Function boundaries, and cannot go beyond because93// of FunctionPass restrictions. We can ensure that is memory not clobbered94// for memory operations that are live in to entry points only.95if (!isEntryFunc)96return;97bool GlobalLoad = I.getPointerAddressSpace() == AMDGPUAS::GLOBAL_ADDRESS;98if (GlobalLoad && !AMDGPU::isClobberedInFunction(&I, MSSA, AA))99setNoClobberMetadata(&I);100}101102bool AMDGPUAnnotateUniformValues::doInitialization(Module &M) {103return false;104}105106bool AMDGPUAnnotateUniformValues::runOnFunction(Function &F) {107if (skipFunction(F))108return false;109110UA = &getAnalysis<UniformityInfoWrapperPass>().getUniformityInfo();111MSSA = &getAnalysis<MemorySSAWrapperPass>().getMSSA();112AA = &getAnalysis<AAResultsWrapperPass>().getAAResults();113isEntryFunc = AMDGPU::isEntryFunctionCC(F.getCallingConv());114115Changed = false;116visit(F);117return Changed;118}119120FunctionPass *121llvm::createAMDGPUAnnotateUniformValues() {122return new AMDGPUAnnotateUniformValues();123}124125126