Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit 926f393

Browse files
committed
Merging r308847:
------------------------------------------------------------------------ r308847 | mkazantsev | 2017-07-23 08:40:19 -0700 (Sun, 23 Jul 2017) | 24 lines [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/branches/release_50@310629 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent dc84a08 commit 926f393

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

lib/Analysis/ScalarEvolution.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,11 @@ static cl::opt<unsigned>
162162
cl::desc("Maximum depth of recursive SExt/ZExt"),
163163
cl::init(8));
164164

165+
static cl::opt<unsigned>
166+
MaxAddRecSize("scalar-evolution-max-add-rec-size", cl::Hidden,
167+
cl::desc("Max coefficients in AddRec during evolving"),
168+
cl::init(16));
169+
165170
//===----------------------------------------------------------------------===//
166171
// SCEV class definitions
167172
//===----------------------------------------------------------------------===//
@@ -2878,6 +2883,12 @@ const SCEV *ScalarEvolution::getMulExpr(SmallVectorImpl<const SCEV *> &Ops,
28782883
if (!OtherAddRec || OtherAddRec->getLoop() != AddRecLoop)
28792884
continue;
28802885

2886+
// Limit max number of arguments to avoid creation of unreasonably big
2887+
// SCEVAddRecs with very complex operands.
2888+
if (AddRec->getNumOperands() + OtherAddRec->getNumOperands() - 1 >
2889+
MaxAddRecSize)
2890+
continue;
2891+
28812892
bool Overflow = false;
28822893
Type *Ty = AddRec->getType();
28832894
bool LargerThan64Bits = getTypeSizeInBits(Ty) > 64;
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
; RUN: opt -analyze -scalar-evolution -scalar-evolution-max-add-rec-size=3 < %s | FileCheck %s
2+
3+
; Show that we are able to avoid creation of huge SCEVs by capping the max
4+
; AddRec size.
5+
define i32 @test_01(i32 %a, i32 %b) {
6+
7+
; CHECK-LABEL: Classifying expressions for: @test_01
8+
; CHECK-NEXT: %iv = phi i32 [ %a, %entry ], [ %iv.next, %loop ]
9+
; CHECK-NEXT: --> {%a,+,%b}<%loop> U: full-set S: full-set
10+
; CHECK-NEXT: %iv.next = add i32 %iv, %b
11+
; CHECK-NEXT: --> {(%a + %b),+,%b}<%loop> U: full-set S: full-set
12+
; CHECK-NEXT: %x1 = mul i32 %iv, %iv.next
13+
; CHECK-NEXT: --> {((%a + %b) * %a),+,(((2 * %a) + (2 * %b)) * %b),+,(2 * %b * %b)}<%loop> U: full-set S: full-set
14+
; CHECK-NEXT: %x2 = mul i32 %x1, %x1
15+
; 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
16+
; CHECK-NEXT: %x3 = mul i32 %x2, %x1
17+
; 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
18+
19+
entry:
20+
br label %loop
21+
22+
loop:
23+
%iv = phi i32 [ %a, %entry ], [ %iv.next, %loop ]
24+
%iv.next = add i32 %iv, %b
25+
%cond = icmp slt i32 %iv.next, 1000
26+
br i1 %cond, label %loop, label %exit
27+
28+
exit:
29+
%x1 = mul i32 %iv, %iv.next
30+
%x2 = mul i32 %x1, %x1
31+
%x3 = mul i32 %x2, %x1
32+
ret i32 %x3
33+
}

0 commit comments

Comments
 (0)