]> granicus.if.org Git - llvm/commitdiff
[SCEV] Introduce add operation inlining limit
authorDaniil Fukalov <daniil.fukalov@amd.com>
Thu, 26 Jan 2017 13:33:17 +0000 (13:33 +0000)
committerDaniil Fukalov <daniil.fukalov@amd.com>
Thu, 26 Jan 2017 13:33:17 +0000 (13:33 +0000)
Inlining in getAddExpr() can cause abnormal computational time in some cases.
New parameter -scev-addops-inline-threshold is intruduced with default value 500.

Reviewers: sanjoy

Subscribers: mzolotukhin, llvm-commits

Differential Revision: https://reviews.llvm.org/D28812

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293176 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ScalarEvolution.cpp
test/Analysis/ScalarEvolution/max-addops-inline.ll [new file with mode: 0644]

index 18fcb0e85b626b7b266e74ff3fb2ce941c65c0d9..ee09c8f3c019d080b34555cdb6e28b91c10a5c51 100644 (file)
@@ -127,6 +127,11 @@ static cl::opt<unsigned> MulOpsInlineThreshold(
     cl::desc("Threshold for inlining multiplication operands into a SCEV"),
     cl::init(1000));
 
+static cl::opt<unsigned> AddOpsInlineThreshold(
+    "scev-addops-inline-threshold", cl::Hidden,
+    cl::desc("Threshold for inlining multiplication operands into a SCEV"),
+    cl::init(500));
+
 static cl::opt<unsigned>
     MaxCompareDepth("scalar-evolution-max-compare-depth", cl::Hidden,
                     cl::desc("Maximum depth of recursive compare complexity"),
@@ -2219,6 +2224,9 @@ const SCEV *ScalarEvolution::getAddExpr(SmallVectorImpl<const SCEV *> &Ops,
   if (Idx < Ops.size()) {
     bool DeletedAdd = false;
     while (const SCEVAddExpr *Add = dyn_cast<SCEVAddExpr>(Ops[Idx])) {
+      if (Ops.size() > AddOpsInlineThreshold ||
+          Add->getNumOperands() > AddOpsInlineThreshold)
+        break;
       // If we have an add, expand the add operands onto the end of the operands
       // list.
       Ops.erase(Ops.begin()+Idx);
diff --git a/test/Analysis/ScalarEvolution/max-addops-inline.ll b/test/Analysis/ScalarEvolution/max-addops-inline.ll
new file mode 100644 (file)
index 0000000..2701ed3
--- /dev/null
@@ -0,0 +1,17 @@
+; RUN: opt -analyze -scalar-evolution -scev-addops-inline-threshold=1 < %s | FileCheck --check-prefix=CHECK1 %s
+; RUN: opt -analyze -scalar-evolution -scev-addops-inline-threshold=10 < %s | FileCheck --check-prefix=CHECK10 %s
+
+define i32 @foo(i64 %p0, i32 %p1) {
+; CHECK1: %add2 = add nsw i32 %mul1, %add
+; CHECK1-NEXT: -->  ((trunc i64 %p0 to i32) * (1 + (trunc i64 %p0 to i32)) * (1 + %p1))
+
+; CHECK10: %add2 = add nsw i32 %mul1, %add
+; CHECK10-NEXT: -->  ((trunc i64 %p0 to i32) * (1 + ((trunc i64 %p0 to i32) * (1 + %p1)) + %p1))
+entry:
+  %tr = trunc i64 %p0 to i32
+  %mul = mul nsw i32 %tr, %p1
+  %add = add nsw i32 %mul, %tr
+  %mul1 = mul nsw i32 %add, %tr
+  %add2 = add nsw i32 %mul1, %add
+  ret i32 %add2
+}