re PR tree-optimization/84841 (ICE: tree check: expected ssa_name, have real_cst...
authorJakub Jelinek <jakub@redhat.com>
Fri, 16 Mar 2018 08:06:41 +0000 (09:06 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 16 Mar 2018 08:06:41 +0000 (09:06 +0100)
PR tree-optimization/84841
* tree-ssa-reassoc.c (INTEGER_CONST_TYPE): Change to 1 << 4 from
1 << 3.
(FLOAT_ONE_CONST_TYPE): Define.
(constant_type): Return FLOAT_ONE_CONST_TYPE for -1.0 and 1.0.
(sort_by_operand_rank): Put entries with higher constant_type last
rather than first to match comments.

* gcc.dg/pr84841.c: New test.

From-SVN: r258586

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr84841.c [new file with mode: 0644]
gcc/tree-ssa-reassoc.c

index 060d7e5b96abf60af2d13a1b0344b217eb1b8544..57e92ac762af037649509c3cc5039781c3d60c60 100644 (file)
@@ -1,3 +1,13 @@
+2018-03-16  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/84841
+       * tree-ssa-reassoc.c (INTEGER_CONST_TYPE): Change to 1 << 4 from
+       1 << 3.
+       (FLOAT_ONE_CONST_TYPE): Define.
+       (constant_type): Return FLOAT_ONE_CONST_TYPE for -1.0 and 1.0.
+       (sort_by_operand_rank): Put entries with higher constant_type last
+       rather than first to match comments.
+
 2018-03-15  Sandra Loosemore  <sandra@codesourcery.com>
 
        * config/nios2/nios2.md (movsi_internal): Fix thinko in 
index dbd764002538defbcd17dc9f97087b1689719ea4..4c03ff22ea7f1fd1d18a36f377e38555f4e64bca 100644 (file)
@@ -1,5 +1,8 @@
 2018-03-16  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/84841
+       * gcc.dg/pr84841.c: New test.
+
        PR c++/84874
        * g++.dg/cpp2a/desig7.C: New test.
 
diff --git a/gcc/testsuite/gcc.dg/pr84841.c b/gcc/testsuite/gcc.dg/pr84841.c
new file mode 100644 (file)
index 0000000..4f7422a
--- /dev/null
@@ -0,0 +1,9 @@
+/* PR tree-optimization/84841 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fassociative-math -frounding-math -fno-signed-zeros -fno-trapping-math -fno-tree-forwprop" } */
+
+double
+foo (double x)
+{
+  return -x * 0.1 * 0.1;
+}
index f41b1207ed8c546ae5b8d3e67d58d93a13064259..0e59bb595ea7c034fb49cf8583d0a8567c3edf12 100644 (file)
@@ -470,7 +470,8 @@ get_rank (tree e)
 
 /* We want integer ones to end up last no matter what, since they are
    the ones we can do the most with.  */
-#define INTEGER_CONST_TYPE 1 << 3
+#define INTEGER_CONST_TYPE 1 << 4
+#define FLOAT_ONE_CONST_TYPE 1 << 3
 #define FLOAT_CONST_TYPE 1 << 2
 #define OTHER_CONST_TYPE 1 << 1
 
@@ -482,7 +483,14 @@ constant_type (tree t)
   if (INTEGRAL_TYPE_P (TREE_TYPE (t)))
     return INTEGER_CONST_TYPE;
   else if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (t)))
-    return FLOAT_CONST_TYPE;
+    {
+      /* Sort -1.0 and 1.0 constants last, while in some cases
+        const_binop can't optimize some inexact operations, multiplication
+        by -1.0 or 1.0 can be always merged with others.  */
+      if (real_onep (t) || real_minus_onep (t))
+       return FLOAT_ONE_CONST_TYPE;
+      return FLOAT_CONST_TYPE;
+    }
   else
     return OTHER_CONST_TYPE;
 }
@@ -504,7 +512,7 @@ sort_by_operand_rank (const void *pa, const void *pb)
   if (oea->rank == 0)
     {
       if (constant_type (oeb->op) != constant_type (oea->op))
-       return constant_type (oeb->op) - constant_type (oea->op);
+       return constant_type (oea->op) - constant_type (oeb->op);
       else
        /* To make sorting result stable, we use unique IDs to determine
           order.  */