Commit 00f615af by Bin Cheng Committed by Bin Cheng

re PR tree-optimization/70771 (ICE on valid code at -O3 on x86_64-linux-gnu in…

re PR tree-optimization/70771 (ICE on valid code at -O3 on x86_64-linux-gnu in operator[], at vec.h:714)

	PR tree-optimization/70771
	PR tree-optimization/70775
	* tree-if-conv.c (if_convertible_phi_p): Remove check on special
	virtual PHI nodes.  Delete parameter.
	(if_convertible_loop_p_1): Delete argument to above function.
	(predicate_all_scalar_phis): Delete code handling single-argument
	PHIs.
	(tree_if_conversion): Mark and update virtual SSA.

	gcc/testsuite/ChangeLog
	PR tree-optimization/70771
	PR tree-optimization/70775
	* gcc.dg/pr70771.c: New test.
	* gcc.dg/pr70771.c: New test.

From-SVN: r235436
parent 901f29c8
2016-04-26 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/70771
PR tree-optimization/70775
* tree-if-conv.c (if_convertible_phi_p): Remove check on special
virtual PHI nodes. Delete parameter.
(if_convertible_loop_p_1): Delete argument to above function.
(predicate_all_scalar_phis): Delete code handling single-argument
PHIs.
(tree_if_conversion): Mark and update virtual SSA.
2016-04-26 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> 2016-04-26 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
PR target/61821 PR target/61821
......
2016-04-26 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/70771
PR tree-optimization/70775
* gcc.dg/pr70771.c: New test.
* gcc.dg/pr70771.c: New test.
2016-04-26 Bernd Schmidt <bschmidt@redhat.com> 2016-04-26 Bernd Schmidt <bschmidt@redhat.com>
* gcc.target/i386/lzcnt-1.c: Allow a different lzcntw output register. * gcc.target/i386/lzcnt-1.c: Allow a different lzcntw output register.
......
/* { dg-do compile } */
/* { dg-options "-O3" } */
int a, b, c, d;
static void
fn1 ()
{
for (b = 0; b < 1; b++)
for (c = 0; c < 1; c++)
{
if (a)
break;
b = 1;
}
for (;;)
;
}
int
main ()
{
if (d)
fn1 ();
return 0;
}
/* { dg-do compile } */
/* { dg-options "-O3" } */
struct S
{
int f1;
int f2;
} a;
int b, c, d, e;
short f;
int
fn1 (int p1, unsigned p2)
{
return p1 + p2;
}
void
fn2 ()
{
struct S g;
int h;
for (; c; c++)
for (f = -3; f < 3; f = fn1 (f, 8))
{
a.f1 = e;
if (b)
a = g;
else
for (; h; h++)
d = b;
}
}
...@@ -640,16 +640,11 @@ phi_convertible_by_degenerating_args (gphi *phi) ...@@ -640,16 +640,11 @@ phi_convertible_by_degenerating_args (gphi *phi)
PHI is not if-convertible if: PHI is not if-convertible if:
- it has more than 2 arguments. - it has more than 2 arguments.
When we didn't see if-convertible stores, PHI is not
if-convertible if:
- a virtual PHI is immediately used in another PHI node,
- there is a virtual PHI in a BB other than the loop->header.
When the aggressive_if_conv is set, PHI can have more than When the aggressive_if_conv is set, PHI can have more than
two arguments. */ two arguments. */
static bool static bool
if_convertible_phi_p (struct loop *loop, basic_block bb, gphi *phi, if_convertible_phi_p (struct loop *loop, basic_block bb, gphi *phi)
bool any_mask_load_store)
{ {
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
{ {
...@@ -669,36 +664,6 @@ if_convertible_phi_p (struct loop *loop, basic_block bb, gphi *phi, ...@@ -669,36 +664,6 @@ if_convertible_phi_p (struct loop *loop, basic_block bb, gphi *phi,
} }
} }
if (any_mask_load_store)
return true;
/* When there were no if-convertible stores, check
that there are no memory writes in the branches of the loop to be
if-converted. */
if (virtual_operand_p (gimple_phi_result (phi)))
{
imm_use_iterator imm_iter;
use_operand_p use_p;
if (bb != loop->header)
{
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "Virtual phi not on loop->header.\n");
return false;
}
FOR_EACH_IMM_USE_FAST (use_p, imm_iter, gimple_phi_result (phi))
{
if (gimple_code (USE_STMT (use_p)) == GIMPLE_PHI
&& USE_STMT (use_p) != phi)
{
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "Difficult to handle this virtual phi.\n");
return false;
}
}
}
return true; return true;
} }
...@@ -1405,8 +1370,7 @@ if_convertible_loop_p_1 (struct loop *loop, ...@@ -1405,8 +1370,7 @@ if_convertible_loop_p_1 (struct loop *loop,
gphi_iterator itr; gphi_iterator itr;
for (itr = gsi_start_phis (bb); !gsi_end_p (itr); gsi_next (&itr)) for (itr = gsi_start_phis (bb); !gsi_end_p (itr); gsi_next (&itr))
if (!if_convertible_phi_p (loop, bb, itr.phi (), if (!if_convertible_phi_p (loop, bb, itr.phi ()))
*any_mask_load_store))
return false; return false;
} }
...@@ -1915,27 +1879,13 @@ predicate_all_scalar_phis (struct loop *loop) ...@@ -1915,27 +1879,13 @@ predicate_all_scalar_phis (struct loop *loop)
if (gsi_end_p (phi_gsi)) if (gsi_end_p (phi_gsi))
continue; continue;
if (EDGE_COUNT (bb->preds) == 1) gsi = gsi_after_labels (bb);
while (!gsi_end_p (phi_gsi))
{ {
/* Propagate degenerate PHIs. */ phi = phi_gsi.phi ();
for (phi_gsi = gsi_start_phis (bb); !gsi_end_p (phi_gsi); predicate_scalar_phi (phi, &gsi);
gsi_next (&phi_gsi)) release_phi_node (phi);
{ gsi_next (&phi_gsi);
gphi *phi = phi_gsi.phi ();
replace_uses_by (gimple_phi_result (phi),
gimple_phi_arg_def (phi, 0));
}
}
else
{
gsi = gsi_after_labels (bb);
while (!gsi_end_p (phi_gsi))
{
phi = phi_gsi.phi ();
predicate_scalar_phi (phi, &gsi);
release_phi_node (phi);
gsi_next (&phi_gsi);
}
} }
set_phi_nodes (bb, NULL); set_phi_nodes (bb, NULL);
...@@ -2808,11 +2758,8 @@ tree_if_conversion (struct loop *loop) ...@@ -2808,11 +2758,8 @@ tree_if_conversion (struct loop *loop)
} }
todo |= TODO_cleanup_cfg; todo |= TODO_cleanup_cfg;
if (any_mask_load_store) mark_virtual_operands_for_renaming (cfun);
{ todo |= TODO_update_ssa_only_virtuals;
mark_virtual_operands_for_renaming (cfun);
todo |= TODO_update_ssa_only_virtuals;
}
cleanup: cleanup:
if (ifc_bbs) if (ifc_bbs)
......
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