Fix PR 71873 - ICE in push_reload
authorSenthil Kumar Selvaraj <senthil_kumar.selvaraj@atmel.com>
Wed, 10 Aug 2016 12:35:57 +0000 (12:35 +0000)
committerSenthil Kumar Selvaraj <saaadhu@gcc.gnu.org>
Wed, 10 Aug 2016 12:35:57 +0000 (12:35 +0000)
Extend computation of subreg_in_class to constants and plus expressions
inside SUBREGs, before recursively calling push_reload. SYMBOL_REFs are
also CONSTANT_P, so remove explicit handling of SYMBOL_REFs.

gcc/ChangeLog

PR target/71873
* reload.c (push_reload): Compute subreg_in_class for
subregs of constants and plus expressions. Remove special
handling of SYMBOL_REFs.

gcc/testsuite/ChangeLog

PR target/71873
* gcc.target/avr/pr71873.c: New test.

From-SVN: r239321

gcc/ChangeLog
gcc/reload.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/avr/pr71873.c [new file with mode: 0644]

index 7b8cbc7ad2fde9102adfb6f6d49c391ab327ecd8..17fa9faa002b2106c6f6003fbb949fb81c86b76e 100644 (file)
@@ -1,3 +1,10 @@
+2016-08-10  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
+
+       PR target/71873
+       * reload.c (push_reload): Compute subreg_in_class for
+       subregs of constants and plus expressions. Remove special
+       handling of SYMBOL_REFs.
+
 2016-08-10  Alan Modra  <amodra@gmail.com>
 
        PR target/71680
index 1945133baf67396a6c20545fcc1c3172a88f0589..afdd56dfeca86ce35b0e96b2c29f2ed8e4e2f651 100644 (file)
@@ -1141,7 +1141,8 @@ push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc,
                                                   SUBREG_BYTE (in),
                                                   GET_MODE (in)),
                              REGNO (SUBREG_REG (in)));
-      else if (GET_CODE (SUBREG_REG (in)) == SYMBOL_REF)
+      else if (CONSTANT_P (SUBREG_REG (in))
+               || GET_CODE (SUBREG_REG (in)) == PLUS)
        subreg_in_class = find_valid_class_1 (inmode,
                                              GET_MODE (SUBREG_REG (in)),
                                              rclass);
index f1465e878b98485d0163d79f5683465c7b469d5d..c9a4eedfb2643df54261e46eb0af3c312d3a69b9 100644 (file)
@@ -1,3 +1,8 @@
+2016-08-10  Senthil Kumar Selvaraj  <senthil_kumar.selvaraj@atmel.com>
+
+       PR target/71873
+       * gcc.target/avr/pr71873.c: New test.
+
 2016-08-09  Martin Liska  <mliska@suse.cz>
 
        * g++.dg/gcov/gcov-dump-1.C: New test.
diff --git a/gcc/testsuite/gcc.target/avr/pr71873.c b/gcc/testsuite/gcc.target/avr/pr71873.c
new file mode 100644 (file)
index 0000000..0791d92
--- /dev/null
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-Os -fcaller-saves" } */
+
+#include <stdint.h>
+
+typedef struct {
+  uint8_t x;
+  uint32_t y;
+} A;
+
+A a;
+
+extern int bar(int);
+extern int foo (char *s, ...);
+
+extern uint8_t param;
+extern uint8_t h,m,s,ld,lm;
+extern uint16_t d;
+
+void gps_parse_string(int z)
+{
+  while (bar(z))
+  {
+    switch (param)
+    {
+      case 0: foo("a", &h, &m, &s, &d); break;
+      case 1: foo("d", &ld, &lm, &a.y); break;
+    }
+  }
+}