mirror of
https://github.com/RPCS3/llvm.git
synced 2025-01-06 12:04:48 +00:00
loop-reduce: Add an early bailout to catch extremely large loops.
This introduces a threshold of 200 IV Users, which is very conservative but should be sufficient to avoid serious compile time sink or stack overflow. The llvm test-suite with LTO never exceeds 190 users per loop. The bug doesn't relate to a specific type of loop. Checking in an arbitrary giant loop as a unit test would be silly. Fixes rdar://11262507. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154983 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
575fcb38de
commit
b512263596
@ -77,6 +77,12 @@
|
||||
#include <algorithm>
|
||||
using namespace llvm;
|
||||
|
||||
/// MaxIVUsers is an arbitrary threshold that provides an early opportunitiy for
|
||||
/// bail out. This threshold is far beyond the number of users that LSR can
|
||||
/// conceivably solve, so it should not affect generated code, but catches the
|
||||
/// worst cases before LSR burns too much compile time and stack space.
|
||||
static const unsigned MaxIVUsers = 200;
|
||||
|
||||
// Temporary flag to cleanup congruent phis after LSR phi expansion.
|
||||
// It's currently disabled until we can determine whether it's truly useful or
|
||||
// not. The flag should be removed after the v3.0 release.
|
||||
@ -4519,6 +4525,17 @@ LSRInstance::LSRInstance(const TargetLowering *tli, Loop *l, Pass *P)
|
||||
// If there's no interesting work to be done, bail early.
|
||||
if (IU.empty()) return;
|
||||
|
||||
// If there's too much analysis to be done, bail early. We won't be able to
|
||||
// model the problem anyway.
|
||||
unsigned NumUsers = 0;
|
||||
for (IVUsers::const_iterator UI = IU.begin(), E = IU.end(); UI != E; ++UI) {
|
||||
if (++NumUsers > MaxIVUsers) {
|
||||
DEBUG(dbgs() << "LSR skipping loop, too many IV Users in " << *L
|
||||
<< "\n");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef NDEBUG
|
||||
// All dominating loops must have preheaders, or SCEVExpander may not be able
|
||||
// to materialize an AddRecExpr whose Start is an outer AddRecExpr.
|
||||
|
Loading…
Reference in New Issue
Block a user