brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.7 KiB · 9da0d93 Raw
152 lines · cpp
1//===-- AMDGPUAnnotateUniformValues.cpp - ---------------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8//9/// \file10/// This pass adds amdgpu.uniform metadata to IR values so this information11/// can be used during instruction selection.12//13//===----------------------------------------------------------------------===//14 15#include "AMDGPU.h"16#include "AMDGPUMemoryUtils.h"17#include "Utils/AMDGPUBaseInfo.h"18#include "llvm/Analysis/AliasAnalysis.h"19#include "llvm/Analysis/MemorySSA.h"20#include "llvm/Analysis/UniformityAnalysis.h"21#include "llvm/IR/InstVisitor.h"22#include "llvm/InitializePasses.h"23 24#define DEBUG_TYPE "amdgpu-annotate-uniform"25 26using namespace llvm;27 28namespace {29 30class AMDGPUAnnotateUniformValues31    : public InstVisitor<AMDGPUAnnotateUniformValues> {32  UniformityInfo *UA;33  MemorySSA *MSSA;34  AliasAnalysis *AA;35  bool isEntryFunc;36  bool Changed = false;37 38  void setUniformMetadata(Instruction *I) {39    I->setMetadata("amdgpu.uniform", MDNode::get(I->getContext(), {}));40    Changed = true;41  }42 43  void setNoClobberMetadata(Instruction *I) {44    I->setMetadata("amdgpu.noclobber", MDNode::get(I->getContext(), {}));45    Changed = true;46  }47 48public:49  AMDGPUAnnotateUniformValues(UniformityInfo &UA, MemorySSA &MSSA,50                              AliasAnalysis &AA, const Function &F)51      : UA(&UA), MSSA(&MSSA), AA(&AA),52        isEntryFunc(AMDGPU::isEntryFunctionCC(F.getCallingConv())) {}53 54  void visitBranchInst(BranchInst &I);55  void visitLoadInst(LoadInst &I);56 57  bool changed() const { return Changed; }58};59 60} // End anonymous namespace61 62void AMDGPUAnnotateUniformValues::visitBranchInst(BranchInst &I) {63  if (UA->isUniform(&I))64    setUniformMetadata(&I);65}66 67void AMDGPUAnnotateUniformValues::visitLoadInst(LoadInst &I) {68  Value *Ptr = I.getPointerOperand();69  if (!UA->isUniform(Ptr))70    return;71  Instruction *PtrI = dyn_cast<Instruction>(Ptr);72  if (PtrI)73    setUniformMetadata(PtrI);74 75  // We're tracking up to the Function boundaries, and cannot go beyond because76  // of FunctionPass restrictions. We can ensure that is memory not clobbered77  // for memory operations that are live in to entry points only.78  if (!isEntryFunc)79    return;80  bool GlobalLoad = I.getPointerAddressSpace() == AMDGPUAS::GLOBAL_ADDRESS;81  if (GlobalLoad && !AMDGPU::isClobberedInFunction(&I, MSSA, AA))82    setNoClobberMetadata(&I);83}84 85PreservedAnalyses86AMDGPUAnnotateUniformValuesPass::run(Function &F,87                                     FunctionAnalysisManager &FAM) {88  UniformityInfo &UI = FAM.getResult<UniformityInfoAnalysis>(F);89  MemorySSA &MSSA = FAM.getResult<MemorySSAAnalysis>(F).getMSSA();90  AAResults &AA = FAM.getResult<AAManager>(F);91 92  AMDGPUAnnotateUniformValues Impl(UI, MSSA, AA, F);93  Impl.visit(F);94 95  if (!Impl.changed())96    return PreservedAnalyses::all();97 98  PreservedAnalyses PA = PreservedAnalyses::none();99  // TODO: Should preserve nearly everything100  PA.preserveSet<CFGAnalyses>();101  return PA;102}103 104class AMDGPUAnnotateUniformValuesLegacy : public FunctionPass {105public:106  static char ID;107 108  AMDGPUAnnotateUniformValuesLegacy() : FunctionPass(ID) {}109 110  bool doInitialization(Module &M) override { return false; }111 112  bool runOnFunction(Function &F) override;113  StringRef getPassName() const override {114    return "AMDGPU Annotate Uniform Values";115  }116 117  void getAnalysisUsage(AnalysisUsage &AU) const override {118    AU.addRequired<UniformityInfoWrapperPass>();119    AU.addRequired<MemorySSAWrapperPass>();120    AU.addRequired<AAResultsWrapperPass>();121    AU.setPreservesAll();122  }123};124 125bool AMDGPUAnnotateUniformValuesLegacy::runOnFunction(Function &F) {126  if (skipFunction(F))127    return false;128 129  UniformityInfo &UI =130      getAnalysis<UniformityInfoWrapperPass>().getUniformityInfo();131  MemorySSA &MSSA = getAnalysis<MemorySSAWrapperPass>().getMSSA();132  AliasAnalysis &AA = getAnalysis<AAResultsWrapperPass>().getAAResults();133 134  AMDGPUAnnotateUniformValues Impl(UI, MSSA, AA, F);135  Impl.visit(F);136  return Impl.changed();137}138 139INITIALIZE_PASS_BEGIN(AMDGPUAnnotateUniformValuesLegacy, DEBUG_TYPE,140                      "Add AMDGPU uniform metadata", false, false)141INITIALIZE_PASS_DEPENDENCY(UniformityInfoWrapperPass)142INITIALIZE_PASS_DEPENDENCY(MemorySSAWrapperPass)143INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)144INITIALIZE_PASS_END(AMDGPUAnnotateUniformValuesLegacy, DEBUG_TYPE,145                    "Add AMDGPU uniform metadata", false, false)146 147char AMDGPUAnnotateUniformValuesLegacy::ID = 0;148 149FunctionPass *llvm::createAMDGPUAnnotateUniformValuesLegacy() {150  return new AMDGPUAnnotateUniformValuesLegacy();151}152