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; + } + } +}