llvm.org GIT mirror llvm / 33ec7a1
[SCEV] Limit max size of AddRecExpr during evolving When SCEV calculates product of two SCEVAddRecs from the same loop, it tries to combine them into one big AddRecExpr. If the sizes of the initial SCEVs were `S1` and `S2`, the size of their product is `S1 + S2 - 1`, and every operand of the resulting SCEV is combined from operands of initial SCEV and has much higher complexity than they have. As result, if we try to calculate something like: %x1 = {a,+,b} %x2 = mul i32 %x1, %x1 %x3 = mul i32 %x2, %x1 %x4 = mul i32 %x3, %x2 ... The size of such SCEVs grows as `2^N`, and the arguments become more and more complex as we go forth. This leads to long compilation and huge memory consumption. This patch sets a limit after which we don't try to combine two `SCEVAddRecExpr`s into one. By default, max allowed size of the resulting AddRecExpr is set to 16. Differential Revision: https://reviews.llvm.org/D35664 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@308847 91177308-0d34-0410-b5e6-96231b3b80d8 Max Kazantsev 2 years ago
2 changed file(s) with 44 addition(s) and 0 deletion(s). Raw diff Collapse all Expand all
161161 cl::desc("Maximum depth of recursive SExt/ZExt"),
162162 cl::init(8));
163163
164 static cl::opt
165 MaxAddRecSize("scalar-evolution-max-add-rec-size", cl::Hidden,
166 cl::desc("Max coefficients in AddRec during evolving"),
167 cl::init(16));
168
164169 //===----------------------------------------------------------------------===//
165170 // SCEV class definitions
166171 //===----------------------------------------------------------------------===//
28752880 const SCEVAddRecExpr *OtherAddRec =
28762881 dyn_cast(Ops[OtherIdx]);
28772882 if (!OtherAddRec || OtherAddRec->getLoop() != AddRecLoop)
2883 continue;
2884
2885 // Limit max number of arguments to avoid creation of unreasonably big
2886 // SCEVAddRecs with very complex operands.
2887 if (AddRec->getNumOperands() + OtherAddRec->getNumOperands() - 1 >
2888 MaxAddRecSize)
28782889 continue;
28792890
28802891 bool Overflow = false;
0 ; RUN: opt -analyze -scalar-evolution -scalar-evolution-max-add-rec-size=3 < %s | FileCheck %s
1
2 ; Show that we are able to avoid creation of huge SCEVs by capping the max
3 ; AddRec size.
4 define i32 @test_01(i32 %a, i32 %b) {
5
6 ; CHECK-LABEL: Classifying expressions for: @test_01
7 ; CHECK-NEXT: %iv = phi i32 [ %a, %entry ], [ %iv.next, %loop ]
8 ; CHECK-NEXT: --> {%a,+,%b}<%loop> U: full-set S: full-set
9 ; CHECK-NEXT: %iv.next = add i32 %iv, %b
10 ; CHECK-NEXT: --> {(%a + %b),+,%b}<%loop> U: full-set S: full-set
11 ; CHECK-NEXT: %x1 = mul i32 %iv, %iv.next
12 ; CHECK-NEXT: --> {((%a + %b) * %a),+,(((2 * %a) + (2 * %b)) * %b),+,(2 * %b * %b)}<%loop> U: full-set S: full-set
13 ; CHECK-NEXT: %x2 = mul i32 %x1, %x1
14 ; CHECK-NEXT: --> ({((%a + %b) * %a),+,(((2 * %a) + (2 * %b)) * %b),+,(2 * %b * %b)}<%loop> * {((%a + %b) * %a),+,(((2 * %a) + (2 * %b)) * %b),+,(2 * %b * %b)}<%loop>) U: full-set S: full-set
15 ; CHECK-NEXT: %x3 = mul i32 %x2, %x1
16 ; CHECK-NEXT: --> ({((%a + %b) * %a),+,(((2 * %a) + (2 * %b)) * %b),+,(2 * %b * %b)}<%loop> * {((%a + %b) * %a),+,(((2 * %a) + (2 * %b)) * %b),+,(2 * %b * %b)}<%loop> * {((%a + %b) * %a),+,(((2 * %a) + (2 * %b)) * %b),+,(2 * %b * %b)}<%loop>) U: full-set S: full-set
17
18 entry:
19 br label %loop
20
21 loop:
22 %iv = phi i32 [ %a, %entry ], [ %iv.next, %loop ]
23 %iv.next = add i32 %iv, %b
24 %cond = icmp slt i32 %iv.next, 1000
25 br i1 %cond, label %loop, label %exit
26
27 exit:
28 %x1 = mul i32 %iv, %iv.next
29 %x2 = mul i32 %x1, %x1
30 %x3 = mul i32 %x2, %x1
31 ret i32 %x3
32 }