Commit f6937e32 by Vladimir Makarov Committed by Vladimir Makarov

re PR rtl-optimization/58759 (wrong code (segfaults) at -O2 on x86_64-linux-gnu in 32-bit mode)

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.

From-SVN: r204080
parent 01b1efaa
2013-10-25 Vladimir Makarov <vmakarov@redhat.com> 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 * config/rs6000/rs6000-protos.h
(rs6000_secondary_memory_needed_mode): New prototype. (rs6000_secondary_memory_needed_mode): New prototype.
* config/rs6000/rs6000.c: Include ira.h. * config/rs6000/rs6000.c: Include ira.h.
...@@ -3975,18 +3975,6 @@ lra_constraints (bool first_p) ...@@ -3975,18 +3975,6 @@ lra_constraints (bool first_p)
dest_reg = SUBREG_REG (dest_reg); dest_reg = SUBREG_REG (dest_reg);
if ((REG_P (dest_reg) if ((REG_P (dest_reg)
&& (x = get_equiv_substitution (dest_reg)) != 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 /* Remove insns which set up a pseudo whose value
can not be changed. Such insns might be not in can not be changed. Such insns might be not in
init_insns because we don't update equiv data init_insns because we don't update equiv data
...@@ -3999,8 +3987,10 @@ lra_constraints (bool first_p) ...@@ -3999,8 +3987,10 @@ lra_constraints (bool first_p)
secondary memory movement. Then the pseudo is secondary memory movement. Then the pseudo is
spilled and we use the equiv constant. In this spilled and we use the equiv constant. In this
case we should remove the additional insn and 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) && (! MEM_P (x) || MEM_READONLY_P (x)
/* Check that this is actually an insn setting
up the equivalence. */
|| in_list_p (curr_insn, || in_list_p (curr_insn,
ira_reg_equiv ira_reg_equiv
[REGNO (dest_reg)].init_insns))) [REGNO (dest_reg)].init_insns)))
......
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> 2013-10-25 Tobias Burnus <burnus@net-b.de>
* g++.dg/vect/pr33426-ivdep.cc: Use dg-options. * g++.dg/vect/pr33426-ivdep.cc: Use dg-options.
......
/* { 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment