diff options
author | vmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-10-25 21:34:26 +0000 |
---|---|---|
committer | vmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-10-25 21:34:26 +0000 |
commit | e454a550477a651f415f7b67cced72ee01d2d1da (patch) | |
tree | 3ea933d09d48793f3d02906e2059a2fde73bc441 | |
parent | bcdf945cc95bc6963d77bdf2ae868be1d221ad81 (diff) | |
download | gcc-e454a550477a651f415f7b67cced72ee01d2d1da.tar.gz |
2013-10-25 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/58759
* lra-constraints.c (lra_constraints): Remove wrong condition to
remove insn setting up an equivalent pseudo.
2013-10-25 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/58759
* gcc.target/i386/pr58759.c: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@204080 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/lra-constraints.c | 16 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr58759.c | 38 |
4 files changed, 52 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d12077147cb..29035aa7997 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2013-10-25 Vladimir Makarov <vmakarov@redhat.com> + PR rtl-optimization/58759 + * lra-constraints.c (lra_constraints): Remove wrong condition to + remove insn setting up an equivalent pseudo. + +2013-10-25 Vladimir Makarov <vmakarov@redhat.com> + * config/rs6000/rs6000-protos.h (rs6000_secondary_memory_needed_mode): New prototype. * config/rs6000/rs6000.c: Include ira.h. diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c index e741dd60a73..a2d348d8dfe 100644 --- a/gcc/lra-constraints.c +++ b/gcc/lra-constraints.c @@ -3975,18 +3975,6 @@ lra_constraints (bool first_p) dest_reg = SUBREG_REG (dest_reg); if ((REG_P (dest_reg) && (x = get_equiv_substitution (dest_reg)) != dest_reg - /* Check that this is actually an insn setting up - the equivalence. */ - && (in_list_p (curr_insn, - ira_reg_equiv - [REGNO (dest_reg)].init_insns) - /* Init insns may contain not all insns setting - up equivalence as we have live range - splitting. So here we use another condition - to check insn setting up the equivalence - which should be removed, e.g. in case when - the equivalence is a constant. */ - || ! MEM_P (x)) /* Remove insns which set up a pseudo whose value can not be changed. Such insns might be not in init_insns because we don't update equiv data @@ -3999,8 +3987,10 @@ lra_constraints (bool first_p) secondary memory movement. Then the pseudo is spilled and we use the equiv constant. In this case we should remove the additional insn and - this insn is not init_insns list. */ + this insn is not init_insns list. */ && (! MEM_P (x) || MEM_READONLY_P (x) + /* Check that this is actually an insn setting + up the equivalence. */ || in_list_p (curr_insn, ira_reg_equiv [REGNO (dest_reg)].init_insns))) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c8fb3cdfa44..6b981122ac9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-10-25 Vladimir Makarov <vmakarov@redhat.com> + + PR rtl-optimization/58759 + * gcc.target/i386/pr58759.c: New. + 2013-10-25 Tobias Burnus <burnus@net-b.de> * g++.dg/vect/pr33426-ivdep.cc: Use dg-options. diff --git a/gcc/testsuite/gcc.target/i386/pr58759.c b/gcc/testsuite/gcc.target/i386/pr58759.c new file mode 100644 index 00000000000..8257dde533d --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr58759.c @@ -0,0 +1,38 @@ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + + +int a, b, c, d, e, f, h, l, m, n, k, o; +long long g; + +struct S +{ + int f1; + int f2; + int f3; + int f4; +}; + +static struct S i = {0,0,0,0}, j; + +void +foo () +{ + m = 1 & d; + n = b + c; + o = k >> 1; + f = 0 == e; +} + +int +main () +{ + for (; h < 1; h++) + { + g = 1 | (0 > 1 - a ? 0 : a); + foo (); + for (l = 0; l < 3; l++) + j = i; + } + return 0; +} |