Commit 1a02f6c1 by Richard Biener Committed by Richard Biener

re PR tree-optimization/66772 (ICE at -O2 and -O3 on x86_64-linux-gnu)

2015-07-06  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/66772
	* tree-ssa-ccp.c (ccp_visit_phi_node): Make sure that copy
	values are available in the PHI node BB when there are
	still unexecutable edges.

	* gcc.dg/torture/pr66772-1.c: New testcase.
	* gcc.dg/torture/pr66772-2.c: Likewise.

From-SVN: r225459
parent fe55a823
2015-07-06 Richard Biener <rguenther@suse.de> 2015-07-06 Richard Biener <rguenther@suse.de>
PR tree-optimization/66772
* tree-ssa-ccp.c (ccp_visit_phi_node): Make sure that copy
values are available in the PHI node BB when there are
still unexecutable edges.
2015-07-06 Richard Biener <rguenther@suse.de>
PR tree-optimization/66767 PR tree-optimization/66767
* tree-vect-loop-manip.c (vect_create_cond_for_align_checks): * tree-vect-loop-manip.c (vect_create_cond_for_align_checks):
Make sure to build the alignment test on a SSA name without Make sure to build the alignment test on a SSA name without
......
2015-07-06 Richard Biener <rguenther@suse.de>
PR tree-optimization/66772
* gcc.dg/torture/pr66772-1.c: New testcase.
* gcc.dg/torture/pr66772-2.c: Likewise.
2015-07-06 Andrew Bennett <andrew.bennett@imgtec.com> 2015-07-06 Andrew Bennett <andrew.bennett@imgtec.com>
* gcc.target/mips/near-far-3.c: Allow the call to near_func to use * gcc.target/mips/near-far-3.c: Allow the call to near_func to use
......
/* { dg-do compile } */
int a;
int
fn1 ()
{
return 1;
}
void
fn2 ()
{
int b, j;
for (;;)
{
int c = 1;
if (j)
{
if (c)
break;
}
else
b = a;
fn1 () && b;
j = fn1 ();
}
}
/* { dg-do compile } */
int a, b, c, e, f;
void fn1 (int p) { }
int
fn2 (int p)
{
return a ? p % a : 0;
}
short
fn3 (int p)
{
return (1 >> p) < 1 ? 1 : p;
}
int
fn4 ()
{
int g = 0, h = 1;
if (b)
goto lbl;
fn2 (0);
if (fn3 (1))
fn1 (e && c);
if (h)
{
int i = 1;
lbl:
if (i)
return 0;
for (; g < 1; g++)
;
}
for (;;)
f || g > 0;
}
int
main ()
{
fn4 ();
return 0;
}
...@@ -1081,6 +1081,7 @@ ccp_visit_phi_node (gphi *phi) ...@@ -1081,6 +1081,7 @@ ccp_visit_phi_node (gphi *phi)
new_val.mask = 0; new_val.mask = 0;
bool first = true; bool first = true;
bool non_exec_edge = false;
for (i = 0; i < gimple_phi_num_args (phi); i++) for (i = 0; i < gimple_phi_num_args (phi); i++)
{ {
/* Compute the meet operator over all the PHI arguments flowing /* Compute the meet operator over all the PHI arguments flowing
...@@ -1121,6 +1122,22 @@ ccp_visit_phi_node (gphi *phi) ...@@ -1121,6 +1122,22 @@ ccp_visit_phi_node (gphi *phi)
if (new_val.lattice_val == VARYING) if (new_val.lattice_val == VARYING)
break; break;
} }
else
non_exec_edge = true;
}
/* In case there were non-executable edges and the value is a copy
make sure its definition dominates the PHI node. */
if (non_exec_edge
&& new_val.lattice_val == CONSTANT
&& TREE_CODE (new_val.value) == SSA_NAME
&& ! SSA_NAME_IS_DEFAULT_DEF (new_val.value)
&& ! dominated_by_p (CDI_DOMINATORS, gimple_bb (phi),
gimple_bb (SSA_NAME_DEF_STMT (new_val.value))))
{
new_val.lattice_val = VARYING;
new_val.value = NULL_TREE;
new_val.mask = -1;
} }
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
......
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