Commit 95831c01 by Vladimir Makarov Committed by Vladimir Makarov

re PR target/69461 (ICE in lra_set_insn_recog_data, at lra.c:964)

2016-02-03  Vladimir Makarov  <vmakarov@redhat.com>
	    Alexandre Oliva  <aoliva@redhat.com>

	PR target/69461
	* lra-constraints.c (simplify_operand_subreg): Check additionally
	address validity after potential reloading.
	(process_address_1): Check insns validity.  In case of failure do
	nothing.

2016-02-03  Vladimir Makarov  <vmakarov@redhat.com>
	    Alexandre Oliva  <aoliva@redhat.com>

	PR target/69461
	* gcc.target/powerpc/pr69461.c: New.


Co-Authored-By: Alexandre Oliva <aoliva@redhat.com>

From-SVN: r233107
parent ccc71ab8
2016-02-03 Vladimir Makarov <vmakarov@redhat.com>
Alexandre Oliva <aoliva@redhat.com>
PR target/69461
* lra-constraints.c (simplify_operand_subreg): Check additionally
address validity after potential reloading.
(process_address_1): Check insns validity. In case of failure do
nothing.
2016-02-03 Kirill Yukhin <kirill.yukhin@intel.com> 2016-02-03 Kirill Yukhin <kirill.yukhin@intel.com>
PR target/69118 PR target/69118
......
...@@ -1411,6 +1411,21 @@ simplify_operand_subreg (int nop, machine_mode reg_mode) ...@@ -1411,6 +1411,21 @@ simplify_operand_subreg (int nop, machine_mode reg_mode)
|| valid_address_p (GET_MODE (subst), XEXP (subst, 0), || valid_address_p (GET_MODE (subst), XEXP (subst, 0),
MEM_ADDR_SPACE (subst))) MEM_ADDR_SPACE (subst)))
return true; return true;
else if ((get_constraint_type (lookup_constraint
(curr_static_id->operand[nop].constraint))
!= CT_SPECIAL_MEMORY)
/* We still can reload address and if the address is
valid, we can remove subreg without reloading its
inner memory. */
&& valid_address_p (GET_MODE (subst),
regno_reg_rtx
[ira_class_hard_regs
[base_reg_class (GET_MODE (subst),
MEM_ADDR_SPACE (subst),
ADDRESS, SCRATCH)][0]],
MEM_ADDR_SPACE (subst)))
return true;
/* If the address was valid and became invalid, prefer to reload /* If the address was valid and became invalid, prefer to reload
the memory. Typical case is when the index scale should the memory. Typical case is when the index scale should
correspond the memory. */ correspond the memory. */
...@@ -2958,6 +2973,8 @@ process_address_1 (int nop, bool check_only_p, ...@@ -2958,6 +2973,8 @@ process_address_1 (int nop, bool check_only_p,
{ {
if (ad.index == NULL) if (ad.index == NULL)
{ {
rtx_insn *insn;
rtx_insn *last = get_last_insn ();
int code = -1; int code = -1;
enum reg_class cl = base_reg_class (ad.mode, ad.as, enum reg_class cl = base_reg_class (ad.mode, ad.as,
SCRATCH, SCRATCH); SCRATCH, SCRATCH);
...@@ -2966,9 +2983,6 @@ process_address_1 (int nop, bool check_only_p, ...@@ -2966,9 +2983,6 @@ process_address_1 (int nop, bool check_only_p,
new_reg = lra_create_new_reg (Pmode, NULL_RTX, cl, "addr"); new_reg = lra_create_new_reg (Pmode, NULL_RTX, cl, "addr");
if (HAVE_lo_sum) if (HAVE_lo_sum)
{ {
rtx_insn *insn;
rtx_insn *last = get_last_insn ();
/* addr => lo_sum (new_base, addr), case (2) above. */ /* addr => lo_sum (new_base, addr), case (2) above. */
insn = emit_insn (gen_rtx_SET insn = emit_insn (gen_rtx_SET
(new_reg, (new_reg,
...@@ -3004,6 +3018,20 @@ process_address_1 (int nop, bool check_only_p, ...@@ -3004,6 +3018,20 @@ process_address_1 (int nop, bool check_only_p,
{ {
/* addr => new_base, case (2) above. */ /* addr => new_base, case (2) above. */
lra_emit_move (new_reg, addr); lra_emit_move (new_reg, addr);
for (insn = last == NULL_RTX ? get_insns () : NEXT_INSN (last);
insn != NULL_RTX;
insn = NEXT_INSN (insn))
if (recog_memoized (insn) < 0)
break;
if (insn != NULL_RTX)
{
/* Do nothing if we cannot generate right insns.
This is analogous to reload pass behaviour. */
delete_insns_since (last);
end_sequence ();
return false;
}
*ad.inner = new_reg; *ad.inner = new_reg;
} }
} }
......
2016-02-03 Vladimir Makarov <vmakarov@redhat.com>
Alexandre Oliva <aoliva@redhat.com>
PR target/69461
* gcc.target/powerpc/pr69461.c: New.
2016-02-03 Uros Bizjak <ubizjak@gmail.com> 2016-02-03 Uros Bizjak <ubizjak@gmail.com>
* lib/tsan-dg.exp (tsan_init): Move check if tsan executable * lib/tsan-dg.exp (tsan_init): Move check if tsan executable
......
/* { dg-do compile } */
/* { dg-options "-O3 -mlra" } */
extern void _setjmp (void);
typedef struct {
double real;
double imag;
} Py_complex;
Py_complex a;
Py_complex fn1();
Py_complex fn2() { return fn1(); }
void fn3() {
_setjmp();
a = fn2();
}
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