]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR debug/70628 (ICE in get_reg_rtx, at emit-rtl.c:1025)
authorJakub Jelinek <jakub@redhat.com>
Wed, 13 Apr 2016 12:26:26 +0000 (14:26 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 13 Apr 2016 12:26:26 +0000 (14:26 +0200)
PR debug/70628
* rtl.h (convert_memory_address_addr_space_1): New prototype.
* explow.c (convert_memory_address_addr_space_1): No longer static,
add NO_EMIT argument and don't call convert_modes if true, pass
it down recursively, remove break after return.
(convert_memory_address_addr_space): Adjust caller.
* simplify-rtx.c (simplify_unary_operation_1): Call
convert_memory_address_addr_space_1 instead of convert_memory_address,
if it returns NULL, don't simplify.

* gcc.dg/torture/pr70628.c: New test.

From-SVN: r234933

gcc/ChangeLog
gcc/explow.c
gcc/rtl.h
gcc/simplify-rtx.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr70628.c [new file with mode: 0644]

index e4d0b0ffa4b028ef785b09fed97dccd26b5e54a1..1e03812a12a843c7b45c561c88e122953833af53 100644 (file)
@@ -1,3 +1,15 @@
+2016-04-13  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/70628
+       * rtl.h (convert_memory_address_addr_space_1): New prototype.
+       * explow.c (convert_memory_address_addr_space_1): No longer static,
+       add NO_EMIT argument and don't call convert_modes if true, pass
+       it down recursively, remove break after return.
+       (convert_memory_address_addr_space): Adjust caller.
+       * simplify-rtx.c (simplify_unary_operation_1): Call
+       convert_memory_address_addr_space_1 instead of convert_memory_address,
+       if it returns NULL, don't simplify.
+
 2016-04-12  Eric Botcazou  <ebotcazou@adacore.com>
 
        PR target/70630
index 249318f44b588d924deb491cd8e1abac62bf1d90..48acd36b405e07d1f492191480e85c01caceb480 100644 (file)
@@ -259,12 +259,14 @@ break_out_memory_refs (rtx x)
    which way).  We take advantage of the fact that pointers are not allowed to
    overflow by commuting arithmetic operations over conversions so that address
    arithmetic insns can be used. IN_CONST is true if this conversion is inside
-   a CONST.  */
+   a CONST. NO_EMIT is true if no insns should be emitted, and instead
+   it should return NULL if it can't be simplified without emitting insns.  */
 
-static rtx
+rtx
 convert_memory_address_addr_space_1 (machine_mode to_mode ATTRIBUTE_UNUSED,
                                     rtx x, addr_space_t as ATTRIBUTE_UNUSED,
-                                    bool in_const ATTRIBUTE_UNUSED)
+                                    bool in_const ATTRIBUTE_UNUSED,
+                                    bool no_emit ATTRIBUTE_UNUSED)
 {
 #ifndef POINTERS_EXTEND_UNSIGNED
   gcc_assert (GET_MODE (x) == to_mode || GET_MODE (x) == VOIDmode);
@@ -310,19 +312,16 @@ convert_memory_address_addr_space_1 (machine_mode to_mode ATTRIBUTE_UNUSED,
       temp = gen_rtx_LABEL_REF (to_mode, LABEL_REF_LABEL (x));
       LABEL_REF_NONLOCAL_P (temp) = LABEL_REF_NONLOCAL_P (x);
       return temp;
-      break;
 
     case SYMBOL_REF:
       temp = shallow_copy_rtx (x);
       PUT_MODE (temp, to_mode);
       return temp;
-      break;
 
     case CONST:
-      return gen_rtx_CONST (to_mode,
-                           convert_memory_address_addr_space_1
-                             (to_mode, XEXP (x, 0), as, true));
-      break;
+      temp = convert_memory_address_addr_space_1 (to_mode, XEXP (x, 0), as,
+                                                 true, no_emit);
+      return temp ? gen_rtx_CONST (to_mode, temp) : temp;
 
     case PLUS:
     case MULT:
@@ -338,18 +337,25 @@ convert_memory_address_addr_space_1 (machine_mode to_mode ATTRIBUTE_UNUSED,
              && CONST_INT_P (XEXP (x, 1))
              && ((in_const && POINTERS_EXTEND_UNSIGNED != 0)
                  || XEXP (x, 1) == convert_memory_address_addr_space_1
-                                    (to_mode, XEXP (x, 1), as, in_const)
+                                    (to_mode, XEXP (x, 1), as, in_const,
+                                     no_emit)
                   || POINTERS_EXTEND_UNSIGNED < 0)))
-       return gen_rtx_fmt_ee (GET_CODE (x), to_mode,
-                              convert_memory_address_addr_space_1
-                                (to_mode, XEXP (x, 0), as, in_const),
-                              XEXP (x, 1));
+       {
+         temp = convert_memory_address_addr_space_1 (to_mode, XEXP (x, 0),
+                                                     as, in_const, no_emit);
+         return temp ? gen_rtx_fmt_ee (GET_CODE (x), to_mode,
+                                       temp, XEXP (x, 1))
+                     : temp;
+       }
       break;
 
     default:
       break;
     }
 
+  if (no_emit)
+    return NULL_RTX;
+
   return convert_modes (to_mode, from_mode,
                        x, POINTERS_EXTEND_UNSIGNED);
 #endif /* defined(POINTERS_EXTEND_UNSIGNED) */
@@ -364,7 +370,7 @@ convert_memory_address_addr_space_1 (machine_mode to_mode ATTRIBUTE_UNUSED,
 rtx
 convert_memory_address_addr_space (machine_mode to_mode, rtx x, addr_space_t as)
 {
-  return convert_memory_address_addr_space_1 (to_mode, x, as, false);
+  return convert_memory_address_addr_space_1 (to_mode, x, as, false, false);
 }
 \f
 
index 79916ad844a2e9b3a0563d14f7447ceec62b7c51..8267252b19662c81de2ff16cee74e3bedf384530 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2747,6 +2747,8 @@ extern unsigned int subreg_highpart_offset (machine_mode,
                                            machine_mode);
 extern int byte_lowpart_offset (machine_mode, machine_mode);
 extern rtx make_safe_from (rtx, rtx);
+extern rtx convert_memory_address_addr_space_1 (machine_mode, rtx,
+                                               addr_space_t, bool, bool);
 extern rtx convert_memory_address_addr_space (machine_mode, rtx,
                                              addr_space_t);
 #define convert_memory_address(to_mode,x) \
index b1b993663f1b7b75491b53241adff923ef8dc30e..fdc4b366c74d9ff61f00c2d5b640c727d54535a2 100644 (file)
@@ -1482,7 +1482,14 @@ simplify_unary_operation_1 (enum rtx_code code, machine_mode mode, rtx op)
                  && REG_POINTER (SUBREG_REG (op))
                  && GET_MODE (SUBREG_REG (op)) == Pmode))
          && !targetm.have_ptr_extend ())
-       return convert_memory_address (Pmode, op);
+       {
+         temp
+           = convert_memory_address_addr_space_1 (Pmode, op,
+                                                  ADDR_SPACE_GENERIC, false,
+                                                  true);
+         if (temp)
+           return temp;
+       }
 #endif
       break;
 
@@ -1604,7 +1611,14 @@ simplify_unary_operation_1 (enum rtx_code code, machine_mode mode, rtx op)
                  && REG_POINTER (SUBREG_REG (op))
                  && GET_MODE (SUBREG_REG (op)) == Pmode))
          && !targetm.have_ptr_extend ())
-       return convert_memory_address (Pmode, op);
+       {
+         temp
+           = convert_memory_address_addr_space_1 (Pmode, op,
+                                                  ADDR_SPACE_GENERIC, false,
+                                                  true);
+         if (temp)
+           return temp;
+       }
 #endif
       break;
 
index 75c4fa810ccb270de0899f50213928b0f3d0f65d..427803644dac7aa8990a425eb15a8a1d0f9ac47b 100644 (file)
@@ -1,3 +1,8 @@
+2016-04-13  Jakub Jelinek  <jakub@redhat.com>
+
+       PR debug/70628
+       * gcc.dg/torture/pr70628.c: New test.
+
 2016-04-12  Patrick Palka  <ppalka@gcc.gnu.org>
 
        PR c++/70610
diff --git a/gcc/testsuite/gcc.dg/torture/pr70628.c b/gcc/testsuite/gcc.dg/torture/pr70628.c
new file mode 100644 (file)
index 0000000..00acae7
--- /dev/null
@@ -0,0 +1,46 @@
+/* PR debug/70628 */
+/* { dg-do compile } */
+/* { dg-options "-g -w" } */
+
+struct S { char s[64]; int *t; } *a;
+char b[64];
+int *foo (void);
+struct S *bar (int *);
+int baz (void);
+
+void
+test (const char *p, long q)
+{
+  int *c;
+  c = foo ();
+  while (a = bar (c))
+    {
+      if (__builtin_strstr (p, "ABCD")
+         || __builtin_strstr (p, "EFGHI")
+         || __builtin_strstr (p, "JKL")
+         || __builtin_strstr (p, "MNOPQR")
+         || __builtin_strstr (p, "STUV")
+         || __builtin_strstr (p, "WXYZabcd")
+         || __builtin_strstr (p, "efghij")
+         || __builtin_strstr (p, "klmno")
+         || __builtin_strstr (p, "pqrstuvw")
+         || __builtin_strstr (b, "MNOPQR") != "EFGHI"
+         || __builtin_strstr (b, "JKL"))
+       if (__builtin_strstr (a->s, "xyz12"))
+         continue;
+      __builtin_printf ("%p\n", a->t);
+    }
+  bar (c);
+  while (a)
+    if (__builtin_strstr (p, "ABCD")
+       || __builtin_strstr (p, "EFGHI")
+       || __builtin_strstr (p, "JKL")
+       || __builtin_strstr (p, "MNOPQR")
+       || __builtin_strstr (p, "STUV")
+       || __builtin_strstr (p, "WXYZabcd")
+       || __builtin_strstr (p, "efghij")
+       || __builtin_strstr (p, "klmno")
+       || __builtin_strstr (p, "pqrstuvw")
+       || __builtin_strstr ((const char *) q, "MNOPQR"))
+      baz ();
+}