[llvm] r373433 - [AMDGPU] Make printf lowering faster when there are no printfs
Jay Foad via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 2 01:44:15 PDT 2019
Author: foad
Date: Wed Oct 2 01:44:15 2019
New Revision: 373433
URL: http://llvm.org/viewvc/llvm-project?rev=373433&view=rev
Log:
[AMDGPU] Make printf lowering faster when there are no printfs
Summary:
Printf lowering unconditionally visited every instruction in the module.
To make it faster in the common case where there are no printfs, look up
the printf function (if any) and iterate over its users instead.
Reviewers: rampitec, kzhuravl, alex-t, arsenm
Subscribers: jvesely, wdng, nhaehnle, yaxunl, dstuttard, tpr, t-tye, hiraditya, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D68145
Modified:
llvm/trunk/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp
Modified: llvm/trunk/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp?rev=373433&r1=373432&r2=373433&view=diff
==============================================================================
--- llvm/trunk/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp (original)
+++ llvm/trunk/lib/Target/AMDGPU/AMDGPUPrintfRuntimeBinding.cpp Wed Oct 2 01:44:15 2019
@@ -30,7 +30,6 @@
#include "llvm/IR/Dominators.h"
#include "llvm/IR/GlobalVariable.h"
#include "llvm/IR/IRBuilder.h"
-#include "llvm/IR/InstVisitor.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
@@ -45,20 +44,13 @@ using namespace llvm;
namespace {
class LLVM_LIBRARY_VISIBILITY AMDGPUPrintfRuntimeBinding final
- : public ModulePass,
- public InstVisitor<AMDGPUPrintfRuntimeBinding> {
+ : public ModulePass {
public:
static char ID;
explicit AMDGPUPrintfRuntimeBinding();
- void visitCallSite(CallSite CS) {
- Function *F = CS.getCalledFunction();
- if (F && F->hasName() && F->getName() == "printf")
- Printfs.push_back(CS.getInstruction());
- }
-
private:
bool runOnModule(Module &M) override;
void getConversionSpecifiers(SmallVectorImpl<char> &OpConvSpecifiers,
@@ -80,7 +72,7 @@ private:
const DataLayout *TD;
const DominatorTree *DT;
- SmallVector<Value *, 32> Printfs;
+ SmallVector<CallInst *, 32> Printfs;
};
} // namespace
@@ -162,8 +154,7 @@ bool AMDGPUPrintfRuntimeBinding::lowerPr
// NB: This is important for this string size to be divizable by 4
const char NonLiteralStr[4] = "???";
- for (auto P : Printfs) {
- auto CI = cast<CallInst>(P);
+ for (auto CI : Printfs) {
unsigned NumOps = CI->getNumArgOperands();
SmallString<16> OpConvSpecifiers;
@@ -564,10 +555,8 @@ bool AMDGPUPrintfRuntimeBinding::lowerPr
}
// erase the printf calls
- for (auto P : Printfs) {
- auto CI = cast<CallInst>(P);
+ for (auto CI : Printfs)
CI->eraseFromParent();
- }
Printfs.clear();
return true;
@@ -578,7 +567,16 @@ bool AMDGPUPrintfRuntimeBinding::runOnMo
if (TT.getArch() == Triple::r600)
return false;
- visit(M);
+ auto PrintfFunction = M.getFunction("printf");
+ if (!PrintfFunction)
+ return false;
+
+ for (auto &U : PrintfFunction->uses()) {
+ if (auto *CI = dyn_cast<CallInst>(U.getUser())) {
+ if (CI->isCallee(&U))
+ Printfs.push_back(CI);
+ }
+ }
if (Printfs.empty())
return false;
More information about the llvm-commits
mailing list