re PR target/84899 (ICE: in final_scan_insn_1, at final.c:3139 (error: could not...
authorJakub Jelinek <jakub@redhat.com>
Fri, 16 Mar 2018 21:01:16 +0000 (22:01 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 16 Mar 2018 21:01:16 +0000 (22:01 +0100)
PR target/84899
* postreload.c (reload_combine_recognize_pattern): Perform
INTVAL addition in unsigned HOST_WIDE_INT type to avoid UB and
truncate_int_for_mode the result for the destination's mode.

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

From-SVN: r258610

gcc/ChangeLog
gcc/postreload.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr84899.c [new file with mode: 0644]

index 7aeedb76dad799631d492131786d0c1c8dbd2964..9188921bcae9bda3d0464459ad2c5183bdeb8759 100644 (file)
@@ -1,5 +1,10 @@
 2018-03-16  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/84899
+       * postreload.c (reload_combine_recognize_pattern): Perform
+       INTVAL addition in unsigned HOST_WIDE_INT type to avoid UB and
+       truncate_int_for_mode the result for the destination's mode.
+
        PR c/84909
        * hsa-gen.c (mem_type_for_type): Fix comment typo.
        * tree-vect-loop-manip.c (vect_create_cond_for_niters_checks):
index af9ad82dab12f9852e14e1aa305fc35869fdd80b..0638709639b1797563c6f1edfd67aa30cab16152 100644 (file)
@@ -1157,11 +1157,13 @@ reload_combine_recognize_pattern (rtx_insn *insn)
             value in PREV, the constant loading instruction.  */
          validate_change (prev, &SET_DEST (prev_set), index_reg, 1);
          if (reg_state[regno].offset != const0_rtx)
-           validate_change (prev,
-                            &SET_SRC (prev_set),
-                            GEN_INT (INTVAL (SET_SRC (prev_set))
-                                     + INTVAL (reg_state[regno].offset)),
-                            1);
+           {
+             HOST_WIDE_INT c
+               = trunc_int_for_mode (UINTVAL (SET_SRC (prev_set))
+                                     + UINTVAL (reg_state[regno].offset),
+                                     GET_MODE (index_reg));
+             validate_change (prev, &SET_SRC (prev_set), GEN_INT (c), 1);
+           }
 
          /* Now for every use of REG that we have recorded, replace REG
             with REG_SUM.  */
index 889e1102101e31c4c7abc48c969a67f85b42de97..85b41909c5e98f4f6505dce1bbcb535570c22db9 100644 (file)
@@ -1,3 +1,8 @@
+2018-03-16  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/84899
+       * gcc.dg/pr84899.c: New test.
+
 2018-03-16  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/69395
diff --git a/gcc/testsuite/gcc.dg/pr84899.c b/gcc/testsuite/gcc.dg/pr84899.c
new file mode 100644 (file)
index 0000000..0706fec
--- /dev/null
@@ -0,0 +1,12 @@
+/* PR target/84899 */
+/* { dg-do compile } */
+/* { dg-options "-O -funroll-all-loops -fno-move-loop-invariants" } */
+
+void
+foo (int x)
+{
+  int a = 1 / x, b = 0;
+
+  while ((a + b + 1) < x)
+    b = __INT_MAX__;
+}