Skip to content

Commit d6c4d4c

Browse files
authored
[polly][ScheduleOptimizer] Fix long compile time(hang) reported in polly (#75141)
There is no upper cap set on current Schedule Optimizer to compute schedule. In some cases a very long compile time taken to compute the schedule resulting in hang kind of behavior. This patch introduces a flag 'polly-schedule-computeout' to pass the capwhich is initialized to 300000. This patch handles the compute out cases by bailing out and exiting gracefully. Fixes #69090
1 parent 3caef46 commit d6c4d4c

File tree

2 files changed

+111
-1
lines changed

2 files changed

+111
-1
lines changed

polly/lib/Transform/ScheduleOptimizer.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,13 @@ static cl::opt<std::string>
9696
cl::desc("Maximize the band depth (yes/no)"), cl::Hidden,
9797
cl::init("yes"), cl::cat(PollyCategory));
9898

99+
static cl::opt<int>
100+
ScheduleComputeOut("polly-schedule-computeout",
101+
cl::desc("Bound the scheduler by maximal amount"
102+
"of computational steps. "),
103+
cl::Hidden, cl::init(300000), cl::ZeroOrMore,
104+
cl::cat(PollyCategory));
105+
99106
static cl::opt<bool>
100107
GreedyFusion("polly-loopfusion-greedy",
101108
cl::desc("Aggressively try to fuse everything"), cl::Hidden,
@@ -860,7 +867,16 @@ static void runIslScheduleOptimizer(
860867
SC = SC.set_proximity(Proximity);
861868
SC = SC.set_validity(Validity);
862869
SC = SC.set_coincidence(Validity);
863-
Schedule = SC.compute_schedule();
870+
871+
{
872+
IslMaxOperationsGuard MaxOpGuard(Ctx, ScheduleComputeOut);
873+
Schedule = SC.compute_schedule();
874+
875+
if (MaxOpGuard.hasQuotaExceeded())
876+
LLVM_DEBUG(
877+
dbgs() << "Schedule optimizer calculation exceeds ISL quota\n");
878+
}
879+
864880
isl_options_set_on_error(Ctx, OnErrorStatus);
865881

866882
ScopsRescheduled++;
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
; RUN: opt -S -polly-optree -polly-delicm -polly-opt-isl -polly-schedule-computeout=100000 -debug-only="polly-opt-isl" < %s 2>&1 | FileCheck %s
2+
; Bailout if the computations of schedule compute exceeds the max scheduling quota.
3+
; Max compute out is initialized to 300000, Here it is set to 100000 for test purpose.
4+
5+
@a = dso_local local_unnamed_addr global ptr null, align 8
6+
@b = dso_local local_unnamed_addr global ptr null, align 8
7+
@c = dso_local local_unnamed_addr global ptr null, align 8
8+
9+
define dso_local void @foo(i32 noundef %I, i32 noundef %J, i32 noundef %K1, i32 noundef %K2, i32 noundef %L1, i32 noundef %L2) local_unnamed_addr {
10+
entry:
11+
%j = alloca i32, align 4
12+
store volatile i32 0, ptr %j, align 4
13+
%j.0.j.0.j.0.54 = load volatile i32, ptr %j, align 4
14+
%cmp55 = icmp slt i32 %j.0.j.0.j.0.54, %J
15+
br i1 %cmp55, label %for.body.lr.ph, label %for.cond.cleanup
16+
17+
for.body.lr.ph: ; preds = %entry
18+
%0 = load ptr, ptr @a, align 8
19+
%1 = load ptr, ptr @b, align 8
20+
%2 = load ptr, ptr %1, align 8
21+
%cmp352 = icmp slt i32 %L1, %L2
22+
%cmp750 = icmp slt i32 %K1, %K2
23+
%3 = sext i32 %K1 to i64
24+
%4 = sext i32 %L1 to i64
25+
br label %for.body
26+
27+
for.cond.cleanup: ; preds = %for.cond.cleanup4, %entry
28+
ret void
29+
30+
for.body: ; preds = %for.cond.cleanup4, %for.body.lr.ph
31+
br i1 %cmp352, label %for.cond6.preheader.preheader, label %for.cond.cleanup4
32+
33+
for.cond6.preheader.preheader: ; preds = %for.body
34+
%wide.trip.count66 = sext i32 %L2 to i64
35+
br label %for.cond6.preheader
36+
37+
for.cond6.preheader: ; preds = %for.cond.cleanup8, %for.cond6.preheader.preheader
38+
%indvars.iv61 = phi i64 [ %4, %for.cond6.preheader.preheader ], [ %indvars.iv.next62, %for.cond.cleanup8 ]
39+
br i1 %cmp750, label %for.cond10.preheader.lr.ph, label %for.cond.cleanup8
40+
41+
for.cond10.preheader.lr.ph: ; preds = %for.cond6.preheader
42+
%5 = mul nsw i64 %indvars.iv61, 516
43+
%6 = mul nsw i64 %indvars.iv61, 516
44+
%wide.trip.count = sext i32 %K2 to i64
45+
br label %for.cond10.preheader
46+
47+
for.cond.cleanup4: ; preds = %for.cond.cleanup8, %for.body
48+
%j.0.j.0.j.0.45 = load volatile i32, ptr %j, align 4
49+
%inc34 = add nsw i32 %j.0.j.0.j.0.45, 1
50+
store volatile i32 %inc34, ptr %j, align 4
51+
%j.0.j.0.j.0. = load volatile i32, ptr %j, align 4
52+
%cmp = icmp slt i32 %j.0.j.0.j.0., %J
53+
br i1 %cmp, label %for.body, label %for.cond.cleanup
54+
55+
for.cond10.preheader: ; preds = %for.cond.cleanup12, %for.cond10.preheader.lr.ph
56+
%indvars.iv = phi i64 [ %3, %for.cond10.preheader.lr.ph ], [ %indvars.iv.next, %for.cond.cleanup12 ]
57+
%7 = getelementptr float, ptr %0, i64 %indvars.iv
58+
%arrayidx18 = getelementptr float, ptr %7, i64 %5
59+
%8 = load float, ptr %arrayidx18, align 4
60+
br label %for.cond14.preheader
61+
62+
for.cond.cleanup8: ; preds = %for.cond.cleanup12, %for.cond6.preheader
63+
%indvars.iv.next62 = add nsw i64 %indvars.iv61, 1
64+
%exitcond67.not = icmp eq i64 %indvars.iv.next62, %wide.trip.count66
65+
br i1 %exitcond67.not, label %for.cond.cleanup4, label %for.cond6.preheader
66+
67+
for.cond14.preheader: ; preds = %for.cond.cleanup16, %for.cond10.preheader
68+
%m.049 = phi i32 [ -2, %for.cond10.preheader ], [ %inc21, %for.cond.cleanup16 ]
69+
%sum.048 = phi float [ 0.000000e+00, %for.cond10.preheader ], [ %add19, %for.cond.cleanup16 ]
70+
br label %for.body17
71+
72+
for.cond.cleanup12: ; preds = %for.cond.cleanup16
73+
%9 = getelementptr float, ptr %2, i64 %indvars.iv
74+
%arrayidx26 = getelementptr float, ptr %9, i64 %6
75+
store float %add19, ptr %arrayidx26, align 4
76+
%indvars.iv.next = add nsw i64 %indvars.iv, 1
77+
%exitcond60.not = icmp eq i64 %indvars.iv.next, %wide.trip.count
78+
br i1 %exitcond60.not, label %for.cond.cleanup8, label %for.cond10.preheader
79+
80+
for.cond.cleanup16: ; preds = %for.body17
81+
%inc21 = add nsw i32 %m.049, 1
82+
%exitcond56.not = icmp eq i32 %inc21, 3
83+
br i1 %exitcond56.not, label %for.cond.cleanup12, label %for.cond14.preheader
84+
85+
for.body17: ; preds = %for.body17, %for.cond14.preheader
86+
%n.047 = phi i32 [ -2, %for.cond14.preheader ], [ %inc, %for.body17 ]
87+
%sum.146 = phi float [ %sum.048, %for.cond14.preheader ], [ %add19, %for.body17 ]
88+
%add19 = fadd float %sum.146, %8
89+
%inc = add nsw i32 %n.047, 1
90+
%exitcond.not = icmp eq i32 %inc, 3
91+
br i1 %exitcond.not, label %for.cond.cleanup16, label %for.body17
92+
}
93+
94+
; CHECK: Schedule optimizer calculation exceeds ISL quota

0 commit comments

Comments
 (0)