Bernd Schmidt writes:

> On 08/08/2016 05:26 PM, Senthil Kumar Selvaraj wrote:
>
>> I picked out the commit where you'd added SYMBOL_REF handling (rev
>> #190252), and patched that with the below code. Bootstrapped and
>> regtested on x86_64-pc-linux - the results were identical with and
>> without the patch. Is this good enough for trunk?
>
>> -      else if (GET_CODE (SUBREG_REG (in)) == SYMBOL_REF)
>> +      else if (GET_CODE (SUBREG_REG (in)) == SYMBOL_REF
>> +               || 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);
>
> Actually SYMBOL_REF should also be CONSTANT_P. For integers it looks 
> like it'll pass VOIDmode to find_valid_class_1 and just return NO_REGS. 
> which I suppose is OK.
>
> Would you mind removing the SYMBOL_REF test and retesting? Ok with that 
> change.

Bootstrapped and reg tested below patch with same setup as above - no
regressions showed up.

Committed patch to trunk. Ok for backport to 6.x and 5.x branches as
well?

Regards
Senthil

gcc/ChangeLog

2016-08-10  Senthil Kumar Selvaraj  <senthil_kumar.selva...@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.


gcc/testsuite/ChangeLog

2016-08-10  Senthil Kumar Selvaraj  <senthil_kumar.selva...@atmel.com>

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



Index: gcc/reload.c
===================================================================
--- gcc/reload.c        (revision 239318)
+++ gcc/reload.c        (working copy)
@@ -1141,7 +1141,8 @@
                                                   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: gcc/testsuite/gcc.target/avr/pr71873.c
===================================================================
--- gcc/testsuite/gcc.target/avr/pr71873.c      (nonexistent)
+++ gcc/testsuite/gcc.target/avr/pr71873.c      (working copy)
@@ -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;
+    }
+  }
+}

Reply via email to