diff --git a/llvm/lib/Target/Hexagon/HexagonOptAddrMode.cpp b/llvm/lib/Target/Hexagon/HexagonOptAddrMode.cpp index aa31762a96960..0e82bf6e5331d 100644 --- a/llvm/lib/Target/Hexagon/HexagonOptAddrMode.cpp +++ b/llvm/lib/Target/Hexagon/HexagonOptAddrMode.cpp @@ -47,6 +47,8 @@ static cl::opt CodeGrowthLimit("hexagon-amode-growth-limit", cl::Hidden, cl::init(0), cl::desc("Code growth limit for address mode " "optimization")); +extern cl::opt RDFFuncBlockLimit; + namespace llvm { FunctionPass *createHexagonOptAddrMode(); @@ -856,6 +858,14 @@ bool HexagonOptAddrMode::runOnMachineFunction(MachineFunction &MF) { if (skipFunction(MF.getFunction())) return false; + // Perform RDF optimizations only if number of basic blocks in the + // function is less than the limit + if (MF.size() > RDFFuncBlockLimit) { + LLVM_DEBUG(dbgs() << "Skipping " << getPassName() + << ": too many basic blocks\n"); + return false; + } + bool Changed = false; auto &HST = MF.getSubtarget(); MRI = &MF.getRegInfo(); diff --git a/llvm/lib/Target/Hexagon/HexagonRDFOpt.cpp b/llvm/lib/Target/Hexagon/HexagonRDFOpt.cpp index 7eccbd2cb0236..4131f2a31755f 100644 --- a/llvm/lib/Target/Hexagon/HexagonRDFOpt.cpp +++ b/llvm/lib/Target/Hexagon/HexagonRDFOpt.cpp @@ -50,6 +50,9 @@ static unsigned RDFCount = 0; static cl::opt RDFLimit("hexagon-rdf-limit", cl::init(std::numeric_limits::max())); + +extern cl::opt RDFFuncBlockLimit; + static cl::opt RDFDump("hexagon-rdf-dump", cl::Hidden); static cl::opt RDFTrackReserved("hexagon-rdf-track-reserved", cl::Hidden); @@ -285,6 +288,14 @@ bool HexagonRDFOpt::runOnMachineFunction(MachineFunction &MF) { if (skipFunction(MF.getFunction())) return false; + // Perform RDF optimizations only if number of basic blocks in the + // function is less than the limit + if (MF.size() > RDFFuncBlockLimit) { + if (RDFDump) + dbgs() << "Skipping " << getPassName() << ": too many basic blocks\n"; + return false; + } + if (RDFLimit.getPosition()) { if (RDFCount >= RDFLimit) return false; diff --git a/llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp b/llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp index e7a692d67ba01..7d4b420071c4a 100644 --- a/llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp +++ b/llvm/lib/Target/Hexagon/HexagonTargetMachine.cpp @@ -39,6 +39,10 @@ static cl::opt static cl::opt EnableRDFOpt("rdf-opt", cl::Hidden, cl::init(true), cl::desc("Enable RDF-based optimizations")); +cl::opt RDFFuncBlockLimit( + "rdf-bb-limit", cl::Hidden, cl::init(1000), + cl::desc("Basic block limit for a function for RDF optimizations")); + static cl::opt DisableHardwareLoops("disable-hexagon-hwloops", cl::Hidden, cl::desc("Disable Hardware Loops for Hexagon target"));