Index: lib/CodeGen/CodeGenPrepare.cpp =================================================================== --- lib/CodeGen/CodeGenPrepare.cpp +++ lib/CodeGen/CodeGenPrepare.cpp @@ -192,6 +192,11 @@ cl::desc("Disables combining addressing modes with different parts " "in optimizeMemoryInst.")); +static cl::opt ComplexAddrModesThreshold( + "complex-addr-modes-threshold", cl::Hidden, cl::init(100), + cl::desc("Stop processing complex addressing mode optimization" + " if number of basic blocks to process exceeds threshold")); + static cl::opt AddrSinkNewPhis("addr-sink-new-phis", cl::Hidden, cl::init(false), cl::desc("Allow creation of Phis in Address sinking.")); @@ -3084,7 +3089,13 @@ // First step, DFS to create PHI nodes for all intermediate blocks. // Also fill traverse order for the second step. SmallVector TraverseOrder; - InsertPlaceholders(Map, TraverseOrder, ST); + if (!InsertPlaceholders(Map, TraverseOrder, ST)) { + LLVM_DEBUG( + dbgs() << "Stop complex addressing mode due to exceed of threshold: " + << TraverseOrder.size()); + ST.destroyNewNodes(CommonType); + return nullptr; + } // Second Step, fill new nodes by merged values and simplify if possible. FillPlaceholders(Map, TraverseOrder, ST); @@ -3258,7 +3269,8 @@ /// a placeholder Phi or Select. /// Reports all new created Phi/Select nodes by adding them to set. /// Also reports and order in what basic blocks have been traversed. - void InsertPlaceholders(FoldAddrToValueMapping &Map, + /// Return false if size of TraverseOrder exceeds threshold. + bool InsertPlaceholders(FoldAddrToValueMapping &Map, SmallVectorImpl &TraverseOrder, SimplificationTracker &ST) { SmallVector Worklist; @@ -3278,6 +3290,8 @@ if (Map.find(Current) != Map.end()) continue; TraverseOrder.push_back(Current); + if ((int)TraverseOrder.size() > ComplexAddrModesThreshold) + return false; Value *CurrentValue = Current.first; BasicBlock *CurrentBlock = Current.second; @@ -3327,6 +3341,7 @@ Worklist.push_back({ CurrentPhi->getIncomingValueForBlock(B), B }); } } + return true; } bool addrModeCombiningAllowed() {