Revert " [LoongArch][ISel] Check the number of sign bits in `PatGprGpr_32` (#107432)"
[llvm-project.git] / llvm / lib / Target / AMDGPU / AMDGPUAnnotateKernelFeatures.cpp
blob52791dfd9d93da028f73a5bd7c4c995ed56db3c8
1 //===- AMDGPUAnnotateKernelFeaturesPass.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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 /// \file This pass propagates the uniform-work-group-size attribute from
10 /// kernels to leaf functions when possible. It also adds additional attributes
11 /// to hint ABI lowering optimizations later.
13 //===----------------------------------------------------------------------===//
15 #include "AMDGPU.h"
16 #include "GCNSubtarget.h"
17 #include "llvm/Analysis/CallGraph.h"
18 #include "llvm/Analysis/CallGraphSCCPass.h"
19 #include "llvm/CodeGen/TargetPassConfig.h"
20 #include "llvm/IR/IntrinsicsAMDGPU.h"
21 #include "llvm/IR/IntrinsicsR600.h"
22 #include "llvm/Target/TargetMachine.h"
24 #define DEBUG_TYPE "amdgpu-annotate-kernel-features"
26 using namespace llvm;
28 namespace {
29 class AMDGPUAnnotateKernelFeatures : public CallGraphSCCPass {
30 private:
31 const TargetMachine *TM = nullptr;
33 bool addFeatureAttributes(Function &F);
35 public:
36 static char ID;
38 AMDGPUAnnotateKernelFeatures() : CallGraphSCCPass(ID) {}
40 bool doInitialization(CallGraph &CG) override;
41 bool runOnSCC(CallGraphSCC &SCC) override;
43 StringRef getPassName() const override {
44 return "AMDGPU Annotate Kernel Features";
47 void getAnalysisUsage(AnalysisUsage &AU) const override {
48 AU.setPreservesAll();
49 CallGraphSCCPass::getAnalysisUsage(AU);
53 } // end anonymous namespace
55 char AMDGPUAnnotateKernelFeatures::ID = 0;
57 char &llvm::AMDGPUAnnotateKernelFeaturesID = AMDGPUAnnotateKernelFeatures::ID;
59 INITIALIZE_PASS(AMDGPUAnnotateKernelFeatures, DEBUG_TYPE,
60 "Add AMDGPU function attributes", false, false)
62 bool AMDGPUAnnotateKernelFeatures::addFeatureAttributes(Function &F) {
63 bool HaveStackObjects = false;
64 bool Changed = false;
65 bool HaveCall = false;
66 bool IsFunc = !AMDGPU::isEntryFunctionCC(F.getCallingConv());
68 for (BasicBlock &BB : F) {
69 for (Instruction &I : BB) {
70 if (isa<AllocaInst>(I)) {
71 HaveStackObjects = true;
72 continue;
75 if (auto *CB = dyn_cast<CallBase>(&I)) {
76 const Function *Callee =
77 dyn_cast<Function>(CB->getCalledOperand()->stripPointerCasts());
79 // Note the occurrence of indirect call.
80 if (!Callee) {
81 if (!CB->isInlineAsm())
82 HaveCall = true;
84 continue;
87 Intrinsic::ID IID = Callee->getIntrinsicID();
88 if (IID == Intrinsic::not_intrinsic) {
89 HaveCall = true;
90 Changed = true;
96 // TODO: We could refine this to captured pointers that could possibly be
97 // accessed by flat instructions. For now this is mostly a poor way of
98 // estimating whether there are calls before argument lowering.
99 if (!IsFunc && HaveCall) {
100 F.addFnAttr("amdgpu-calls");
101 Changed = true;
104 if (HaveStackObjects) {
105 F.addFnAttr("amdgpu-stack-objects");
106 Changed = true;
109 return Changed;
112 bool AMDGPUAnnotateKernelFeatures::runOnSCC(CallGraphSCC &SCC) {
113 bool Changed = false;
115 for (CallGraphNode *I : SCC) {
116 Function *F = I->getFunction();
117 // Ignore functions with graphics calling conventions, these are currently
118 // not allowed to have kernel arguments.
119 if (!F || F->isDeclaration() || AMDGPU::isGraphics(F->getCallingConv()))
120 continue;
121 // Add feature attributes
122 Changed |= addFeatureAttributes(*F);
125 return Changed;
128 bool AMDGPUAnnotateKernelFeatures::doInitialization(CallGraph &CG) {
129 auto *TPC = getAnalysisIfAvailable<TargetPassConfig>();
130 if (!TPC)
131 report_fatal_error("TargetMachine is required");
133 TM = &TPC->getTM<TargetMachine>();
134 return false;
137 Pass *llvm::createAMDGPUAnnotateKernelFeaturesPass() {
138 return new AMDGPUAnnotateKernelFeatures();