aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2013-06-06 20:58:46 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2013-06-06 20:58:46 +0000
commitd89ae27c44d32ceac427719bf9eceb42be6b20c1 (patch)
treee472bba6d84147b0e2bda095d0fd1175ec819a3f /gcc
parent3597e1135e5dce1fa8a7d69d933ae5dea2177591 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/lra-constraints.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr57459.c60
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;
+}
+