re PR tree-optimization/85475 (Compile time hog w/ -O1 -fpeel-loops)
authorRichard Biener <rguenther@suse.de>
Fri, 20 Apr 2018 10:31:23 +0000 (10:31 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 20 Apr 2018 10:31:23 +0000 (10:31 +0000)
2018-04-20  Richard Biener <rguenther@suse.de>

PR middle-end/85475
* match.pd ((X * CST) * Y -> (X * Y) * CST): Avoid exponential
complexity by forcing a single use of the multiply operand.

* gcc.dg/torture/pr85475.c: New testcase.

From-SVN: r259519

gcc/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr85475.c [new file with mode: 0644]

index e06c6bc76cd1ba87a76e415dd91c417b87cf9e3a..6309170f0b902d405320dc36c8d97d40409b1f69 100644 (file)
@@ -1,3 +1,9 @@
+2018-04-20  Richard Biener <rguenther@suse.de>
+
+       PR middle-end/85475
+       * match.pd ((X * CST) * Y -> (X * Y) * CST): Avoid exponential
+       complexity by forcing a single use of the multiply operand.
+
 2018-04-20  Martin Jambor  <mjambor@suse.cz>
 
        ipa/85449
index 442aad15e2cde2f1746b21a64095289d8f4b8d5b..0de4432d925623b127b14a192d9fe1f7f9ce0a53 100644 (file)
@@ -2578,8 +2578,9 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
 /* Reassociate (X * CST) * Y to (X * Y) * CST.  This does not introduce
    signed overflow for CST != 0 && CST != -1.  */
 (simplify
- (mult:c (mult:s @0 INTEGER_CST@1) @2)
+ (mult:c (mult:s@3 @0 INTEGER_CST@1) @2)
  (if (TREE_CODE (@2) != INTEGER_CST
+      && single_use (@3)
       && !integer_zerop (@1) && !integer_minus_onep (@1))
   (mult (mult @0 @2) @1)))
 
index 4e66877a9b149e5d5220c3461f1c6890d8b752e1..dc5f7e766a52d355f9530fd7c79737136f657e55 100644 (file)
@@ -1,3 +1,8 @@
+2018-04-20  Richard Biener <rguenther@suse.de>
+
+       PR middle-end/85475
+       * gcc.dg/torture/pr85475.c: New testcase.
+
 2018-04-20  Martin Jambor  <mjambor@suse.cz>
 
        ipa/85449
diff --git a/gcc/testsuite/gcc.dg/torture/pr85475.c b/gcc/testsuite/gcc.dg/torture/pr85475.c
new file mode 100644 (file)
index 0000000..0d475df
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fpeel-loops" } */
+
+int
+nj (int le)
+{
+  int zb;
+
+  for (zb = 0; zb < 16; ++zb)
+    le += le;
+
+  return le * le;
+}