From e454a550477a651f415f7b67cced72ee01d2d1da Mon Sep 17 00:00:00 2001 From: vmakarov Date: Fri, 25 Oct 2013 21:34:26 +0000 Subject: [PATCH] 2013-10-25 Vladimir Makarov 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 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 --- gcc/ChangeLog | 6 ++++++ gcc/lra-constraints.c | 16 +++----------- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.target/i386/pr58759.c | 38 +++++++++++++++++++++++++++++++++ 4 files changed, 52 insertions(+), 13 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr58759.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d120771..29035aa 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2013-10-25 Vladimir Makarov + 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 + * 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 e741dd6..a2d348d 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 c8fb3cd..6b98112 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-10-25 Vladimir Makarov + + PR rtl-optimization/58759 + * gcc.target/i386/pr58759.c: New. + 2013-10-25 Tobias Burnus * 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 0000000..8257dde --- /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; +} -- 2.7.4