Bernd Schmidt writes: > On 10/18/2016 02:15 PM, Senthil Kumar Selvaraj wrote: >> Will do both the changes and re-run the reg tests. Ok for trunk if the >> tests pass for x86_64-pc-linux and avr? >> > Probably but let's see the patch first.
How does this look? Bootstrapped and reg tested x86_64-pc-linux on top of trunk@190252 with the in_hard_reg_set_p patch backport - there were no failures. Also ran regtests for avr on trunk, no failures there as well. Ok to commit to trunk? Regards Senthil gcc/ChangeLog: 2016-10-21 Senthil Kumar Selvaraj <senthil_kumar.selva...@atmel.com> * reload.c (find_valid_class_1): Allow regclass if atleast one regno in class is ok. Compute and use rclass size based on actually available regnos for mode in rclass. gcc/testsuite/ChangeLog: 2016-10-21 Senthil Kumar Selvaraj <senthil_kumar.selva...@atmel.com> * gcc.target/avr/pr71627.c: New test. diff --git gcc/reload.c gcc/reload.c index 9a859e5..880099e 100644 --- gcc/reload.c +++ gcc/reload.c @@ -715,25 +715,23 @@ find_valid_class_1 (machine_mode outer ATTRIBUTE_UNUSED, for (rclass = 1; rclass < N_REG_CLASSES; rclass++) { - int bad = 0; - for (regno = 0; regno < FIRST_PSEUDO_REGISTER && !bad; regno++) - { - if (in_hard_reg_set_p (reg_class_contents[rclass], mode, regno) - && !HARD_REGNO_MODE_OK (regno, mode)) - bad = 1; - } - - if (bad) - continue; + unsigned int computed_rclass_size = 0; + + for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) + { + if (in_hard_reg_set_p (reg_class_contents[rclass], mode, regno) + && (HARD_REGNO_MODE_OK (regno, mode))) + computed_rclass_size++; + } cost = register_move_cost (outer, (enum reg_class) rclass, dest_class); - if ((reg_class_size[rclass] > best_size + if ((computed_rclass_size > best_size && (best_cost < 0 || best_cost >= cost)) || best_cost > cost) { best_class = (enum reg_class) rclass; - best_size = reg_class_size[rclass]; + best_size = computed_rclass_size; best_cost = register_move_cost (outer, (enum reg_class) rclass, dest_class); } diff --git gcc/testsuite/gcc.target/avr/pr71627.c gcc/testsuite/gcc.target/avr/pr71627.c new file mode 100644 index 0000000..eaef3d2 --- /dev/null +++ gcc/testsuite/gcc.target/avr/pr71627.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O1" } */ + + +extern volatile __memx const long a, b, c, d, e, f; +extern volatile long result; + +extern void vfunc (const char*, ...); + +void foo (void) +{ + result = a + b + c + d + e + f; + vfunc ("text", a, b, c, d, e, f, result); +}