]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/84899 (ICE: in final_scan_insn_1, at final.c:3139 (error:...
authorJakub Jelinek <jakub@redhat.com>
Mon, 25 Jun 2018 17:34:55 +0000 (19:34 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 25 Jun 2018 17:34:55 +0000 (19:34 +0200)
Backported from mainline
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.

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

From-SVN: r262079

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

index 070fee57a60baafcb2bb2c7c47b8c385bcbd92c4..7f3b127258d31cdc6663d2b32032752d995aa2ac 100644 (file)
@@ -1,6 +1,13 @@
 2018-06-25  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       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.
+
        2018-03-15  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/79085
index fb5913051b1f3505e286c3535581ac0527afd64b..50935d7ac16c4e6f45713bc53cf76e2c57ee4a63 100644 (file)
@@ -1166,11 +1166,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 a379993397326c8bdd325ea2b7db3e5caadeaca5..79f69dfc9276f4a36005d5bd37d1e76d8b9dfc41 100644 (file)
@@ -3,6 +3,9 @@
        Backported from mainline
        2018-03-16  Jakub Jelinek  <jakub@redhat.com>
 
+       PR target/84899
+       * gcc.dg/pr84899.c: New test.
+
        PR c++/84874
        * g++.dg/cpp1z/desig8.C: New test.
 
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__;
+}