diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2013-06-06 20:58:46 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@gcc.gnu.org> | 2013-06-06 20:58:46 +0000 |
commit | d89ae27c44d32ceac427719bf9eceb42be6b20c1 (patch) | |
tree | e472bba6d84147b0e2bda095d0fd1175ec819a3f /gcc | |
parent | 3597e1135e5dce1fa8a7d69d933ae5dea2177591 (diff) | |
download | gcc-d89ae27c44d32ceac427719bf9eceb42be6b20c1.zip gcc-d89ae27c44d32ceac427719bf9eceb42be6b20c1.tar.gz gcc-d89ae27c44d32ceac427719bf9eceb42be6b20c1.tar.bz2 |
re PR rtl-optimization/57459 (LRA inheritance bug)
2013-06-06 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/57459
* lra-constraints.c (update_ebb_live_info): Fix typo for operand
type when setting live regs.
2013-06-06 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/57459
* gcc.target/i386/pr57459.c: New test.
From-SVN: r199762
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/lra-constraints.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr57459.c | 60 |
4 files changed, 72 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6fe6b6d..aa76576 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2013-06-06 Vladimir Makarov <vmakarov@redhat.com> + PR rtl-optimization/57459 + * lra-constraints.c (update_ebb_live_info): Fix typo for operand + type when setting live regs. + +2013-06-06 Vladimir Makarov <vmakarov@redhat.com> + * config/s390/s390.opt (mlra): New option. * config/s390/s390.c (s390_decompose_address): Check displacement for all registers for LRA. diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c index ef6e07e..a9f91c4 100644 --- a/gcc/lra-constraints.c +++ b/gcc/lra-constraints.c @@ -4545,7 +4545,7 @@ update_ebb_live_info (rtx head, rtx tail) bitmap_clear_bit (&live_regs, reg->regno); /* Mark each used value as live. */ for (reg = curr_id->regs; reg != NULL; reg = reg->next) - if (reg->type == OP_IN + if (reg->type != OP_OUT && bitmap_bit_p (&check_only_regs, reg->regno)) bitmap_set_bit (&live_regs, reg->regno); /* It is quite important to remove dead move insns because it diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 035781b..bfd974e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-06-06 Vladimir Makarov <vmakarov@redhat.com> + + PR rtl-optimization/57459 + * gcc.target/i386/pr57459.c: New test. + 2013-06-06 Teresa Johnson <tejohnson@google.com> PR c++/53743 diff --git a/gcc/testsuite/gcc.target/i386/pr57459.c b/gcc/testsuite/gcc.target/i386/pr57459.c new file mode 100644 index 0000000..7510114 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr57459.c @@ -0,0 +1,60 @@ +/* PR rtl-optimization/57459 */ +/* { dg-do run } */ +/* { dg-options "-fno-inline -O2 -minline-all-stringops -fno-omit-frame-pointer" } */ + +int total1[10], total2[10], total3[10], total4[10], total5[10], a[20]; +int len; + +void stackclean() { + void *ptr = __builtin_alloca(20000); + __builtin_memset(ptr, 0, 20000); +} + +void foo(const char *s) { + int r1 = a[1]; + int r2 = a[2]; + int r3 = a[3]; + int r4 = a[4]; + int r5 = a[5]; + + len = __builtin_strlen(s); + + if (s != 0) + return; + + while (r1) { + total1[r1] = r1; + r1--; + } + + while (r2) { + total2[r2] = r2; + r2--; + } + + while (r3) { + total3[r3] = r3; + r3--; + } + + while (r4) { + total4[r4] = r4; + r4--; + } + + while (r5) { + total5[r5] = r5; + r5--; + } +} + +extern void abort (void); + +int main() { + stackclean(); + foo("abcdefgh"); + if (len != 8) + abort (); + return 0; +} + |