Commit 987b67f1 by Vladimir Makarov Committed by Vladimir Makarov

re PR middle-end/70689 (ICE on valid code at -O1 in 32-bit mode on…

re PR middle-end/70689 (ICE on valid code at -O1 in 32-bit mode on x86_64-linux-gnu in curr_insn_transform, at lra-constraints.c:3564)

2016-04-18  Vladimir Makarov  <vmakarov@redhat.com>

	PR middle-end/70689
	* lra-constraints.c (equiv_substition_p): New.
	(process_alt_operands): Use it.
	(swap_operands): Swap it.
	(curr_insn_transform): Update it.

2016-04-18  Vladimir Makarov  <vmakarov@redhat.com>

	PR middle-end/70689
	* testsuite/gcc.target/i386/pr70689.c: New.

From-SVN: r235184
parent cd1c4ba8
2016-04-18 Vladimir Makarov <vmakarov@redhat.com>
PR middle-end/70689
* lra-constraints.c (equiv_substition_p): New.
(process_alt_operands): Use it.
(swap_operands): Swap it.
(curr_insn_transform): Update it.
2016-04-18 Michael Matz <matz@suse.de> 2016-04-18 Michael Matz <matz@suse.de>
* tree.h (TYPE_ALIGN, DECL_ALIGN): Return shifted amount. * tree.h (TYPE_ALIGN, DECL_ALIGN): Return shifted amount.
......
...@@ -1258,6 +1258,10 @@ static bool goal_alt_swapped; ...@@ -1258,6 +1258,10 @@ static bool goal_alt_swapped;
/* The chosen insn alternative. */ /* The chosen insn alternative. */
static int goal_alt_number; static int goal_alt_number;
/* True if the corresponding operand is the result of an equivalence
substitution. */
static bool equiv_substition_p[MAX_RECOG_OPERANDS];
/* The following five variables are used to choose the best insn /* The following five variables are used to choose the best insn
alternative. They reflect final characteristics of the best alternative. They reflect final characteristics of the best
alternative. */ alternative. */
...@@ -2064,7 +2068,10 @@ process_alt_operands (int only_alternative) ...@@ -2064,7 +2068,10 @@ process_alt_operands (int only_alternative)
memory, or make other memory by reloading the memory, or make other memory by reloading the
address like for 'o'. */ address like for 'o'. */
if (CONST_POOL_OK_P (mode, op) if (CONST_POOL_OK_P (mode, op)
|| MEM_P (op) || REG_P (op)) || MEM_P (op) || REG_P (op)
/* We can restore the equiv insn by a
reload. */
|| equiv_substition_p[nop])
badop = false; badop = false;
constmemok = true; constmemok = true;
offmemok = true; offmemok = true;
...@@ -3371,6 +3378,7 @@ swap_operands (int nop) ...@@ -3371,6 +3378,7 @@ swap_operands (int nop)
std::swap (curr_operand_mode[nop], curr_operand_mode[nop + 1]); std::swap (curr_operand_mode[nop], curr_operand_mode[nop + 1]);
std::swap (original_subreg_reg_mode[nop], original_subreg_reg_mode[nop + 1]); std::swap (original_subreg_reg_mode[nop], original_subreg_reg_mode[nop + 1]);
std::swap (*curr_id->operand_loc[nop], *curr_id->operand_loc[nop + 1]); std::swap (*curr_id->operand_loc[nop], *curr_id->operand_loc[nop + 1]);
std::swap (equiv_substition_p[nop], equiv_substition_p[nop + 1]);
/* Swap the duplicates too. */ /* Swap the duplicates too. */
lra_update_dup (curr_id, nop); lra_update_dup (curr_id, nop);
lra_update_dup (curr_id, nop + 1); lra_update_dup (curr_id, nop + 1);
...@@ -3473,8 +3481,10 @@ curr_insn_transform (bool check_only_p) ...@@ -3473,8 +3481,10 @@ curr_insn_transform (bool check_only_p)
old = SUBREG_REG (old); old = SUBREG_REG (old);
subst = get_equiv_with_elimination (old, curr_insn); subst = get_equiv_with_elimination (old, curr_insn);
original_subreg_reg_mode[i] = VOIDmode; original_subreg_reg_mode[i] = VOIDmode;
equiv_substition_p[i] = false;
if (subst != old) if (subst != old)
{ {
equiv_substition_p[i] = true;
subst = copy_rtx (subst); subst = copy_rtx (subst);
lra_assert (REG_P (old)); lra_assert (REG_P (old));
if (GET_CODE (op) != SUBREG) if (GET_CODE (op) != SUBREG)
......
2016-04-18 Vladimir Makarov <vmakarov@redhat.com>
PR middle-end/70689
* testsuite/gcc.target/i386/pr70689.c: New.
2016-04-18 H.J. Lu <hongjiu.lu@intel.com> 2016-04-18 H.J. Lu <hongjiu.lu@intel.com>
PR target/70708 PR target/70708
......
/* { dg-do compile } */
/* { dg-require-effective-target ia32 } */
/* { dg-options "-O1" } */
struct S
{
int f;
};
double a;
int c;
static
void fn1 (struct S *p1)
{
for (; c; )
if (p1->f++)
a = (int) p1;
}
int
main ()
{
struct S b = { 0 };
fn1 (&b);
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