]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR rtl-optimization/85300 (ICE in exact_int_to_float_conversion_p, at...
authorJakub Jelinek <jakub@redhat.com>
Mon, 25 Jun 2018 17:47:56 +0000 (19:47 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 25 Jun 2018 17:47:56 +0000 (19:47 +0200)
Backported from mainline
2018-04-10  Jakub Jelinek  <jakub@redhat.com>

PR rtl-optimization/85300
* combine.c (subst): Handle subst of CONST_SCALAR_INT_P new_rtx also
into FLOAT and UNSIGNED_FLOAT like ZERO_EXTEND, return a CLOBBER if
simplify_unary_operation fails.

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

From-SVN: r262096

gcc/ChangeLog
gcc/combine.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr85300.c [new file with mode: 0644]

index d5e68d9164679284251d21cd9796b529c8209793..c204f20647ab7ce3a22c915aa2e7c3b5d133bd5f 100644 (file)
@@ -1,6 +1,13 @@
 2018-06-25  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2018-04-10  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/85300
+       * combine.c (subst): Handle subst of CONST_SCALAR_INT_P new_rtx also
+       into FLOAT and UNSIGNED_FLOAT like ZERO_EXTEND, return a CLOBBER if
+       simplify_unary_operation fails.
+
        2018-04-07  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/85257
index 8ffb21dc10a8072f73330979fed34e53fd84c53e..b6024bf075d8e241b9905348e8afc544b47d5d94 100644 (file)
@@ -5435,11 +5435,15 @@ subst (rtx x, rtx from, rtx to, int in_dest, int in_cond, int unique_copy)
                    x = gen_rtx_CLOBBER (mode, const0_rtx);
                }
              else if (CONST_SCALAR_INT_P (new_rtx)
-                      && GET_CODE (x) == ZERO_EXTEND)
+                      && (GET_CODE (x) == ZERO_EXTEND
+                          || GET_CODE (x) == FLOAT
+                          || GET_CODE (x) == UNSIGNED_FLOAT))
                {
-                 x = simplify_unary_operation (ZERO_EXTEND, GET_MODE (x),
-                                               new_rtx, GET_MODE (XEXP (x, 0)));
-                 gcc_assert (x);
+                 x = simplify_unary_operation (GET_CODE (x), GET_MODE (x),
+                                               new_rtx,
+                                               GET_MODE (XEXP (x, 0)));
+                 if (!x)
+                   return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
                }
              else
                SUBST (XEXP (x, i), new_rtx);
index 07ca2480ba5a3de3e9ae805744ef89b1564617d2..92d3b5aaeb35a3ef4fdef85f9057356d6be16d5e 100644 (file)
@@ -3,6 +3,9 @@
        Backported from mainline
        2018-04-10  Jakub Jelinek  <jakub@redhat.com>
 
+       PR rtl-optimization/85300
+       * gcc.dg/pr85300.c: New test.
+
        PR fortran/85313
        * gfortran.dg/gomp/pr85313.f90: New test.
 
diff --git a/gcc/testsuite/gcc.dg/pr85300.c b/gcc/testsuite/gcc.dg/pr85300.c
new file mode 100644 (file)
index 0000000..87a30b8
--- /dev/null
@@ -0,0 +1,16 @@
+/* PR rtl-optimization/85300 */
+/* { dg-do compile } */
+/* { dg-options "-O1 -g -funroll-all-loops -fno-tree-ter -fno-web" } */
+
+void
+foo (double x, unsigned char y)
+{
+  while ((int) x < 1)
+    {
+      float a;
+
+      a = y | 0x100;
+      y = 0;
+      x = a;
+    }
+}