summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target
diff options
context:
space:
mode:
authorValery Pykhtin <Valery.Pykhtin@amd.com>2019-06-07 12:16:46 +0000
committerValery Pykhtin <Valery.Pykhtin@amd.com>2019-06-07 12:16:46 +0000
commitcb8de55f474984be7d21c4c43140e134af09bfa5 (patch)
tree545d669d1ba7509baa6452eabe78192b6e2cf02a /llvm/lib/Target
parent32742d8f368c315d0c31cb18abbaec32a1c059ff (diff)
downloadbcm5719-llvm-cb8de55f474984be7d21c4c43140e134af09bfa5.tar.gz
bcm5719-llvm-cb8de55f474984be7d21c4c43140e134af09bfa5.zip
[AMDGPU] Constrain the AMDGPU inliner on maximum number of basic blocks in a caller function (compile time performance)
Differential revision: https://reviews.llvm.org/D62917 llvm-svn: 362789
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r--llvm/lib/Target/AMDGPU/AMDGPUInline.cpp16
1 files changed, 15 insertions, 1 deletions
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUInline.cpp b/llvm/lib/Target/AMDGPU/AMDGPUInline.cpp
index 72388a195de..ba9fdf2dc60 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUInline.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUInline.cpp
@@ -49,6 +49,12 @@ static cl::opt<unsigned>
ArgAllocaCutoff("amdgpu-inline-arg-alloca-cutoff", cl::Hidden, cl::init(256),
cl::desc("Maximum alloca size to use for inline cost"));
+// Inliner constraint to achieve reasonable compilation time
+static cl::opt<size_t>
+MaxBB("amdgpu-inline-max-bb", cl::Hidden, cl::init(300),
+ cl::desc("Maximum BB number allowed in a function after inlining"
+ " (compile time constraint)"));
+
namespace {
class AMDGPUInliner : public LegacyInlinerBase {
@@ -208,7 +214,15 @@ InlineCost AMDGPUInliner::getInlineCost(CallSite CS) {
return ACT->getAssumptionCache(F);
};
- return llvm::getInlineCost(cast<CallBase>(*CS.getInstruction()), Callee,
+ auto IC = llvm::getInlineCost(cast<CallBase>(*CS.getInstruction()), Callee,
LocalParams, TTI, GetAssumptionCache, None, PSI,
RemarksEnabled ? &ORE : nullptr);
+
+ if (IC && !IC.isAlways()) {
+ // Single BB does not increase total BB amount, thus subtract 1
+ size_t Size = Caller->size() + Callee->size() - 1;
+ if (MaxBB && Size > MaxBB)
+ return llvm::InlineCost::getNever("max number of bb exceeded");
+ }
+ return IC;
}
OpenPOWER on IntegriCloud