mirror of
https://gcc.gnu.org/git/gcc.git
synced 2024-12-18 08:23:50 +08:00
tree-optimization/97897 - complex lowering on abnormal edges
This fixes complex lowering to not put constants into abnormal edge PHI values by making sure abnormally used SSA names are VARYING in its propagation lattice. 2020-11-19 Richard Biener <rguenther@suse.de> PR tree-optimization/97897 * tree-complex.c (complex_propagate::visit_stmt): Make sure abnormally used SSA names are VARYING. (complex_propagate::visit_phi): Likewise. * tree-ssa.c (verify_phi_args): Verify PHI arguments on abnormal edges are SSA names. * gcc.dg/pr97897.c: New testcase.
This commit is contained in:
parent
50134189a4
commit
0d8290959e
13
gcc/testsuite/gcc.dg/pr97897.c
Normal file
13
gcc/testsuite/gcc.dg/pr97897.c
Normal file
@ -0,0 +1,13 @@
|
||||
/* { dg-do compile } */
|
||||
|
||||
void h ();
|
||||
void f () __attribute__ ((returns_twice));
|
||||
void g (_Complex int a)
|
||||
{
|
||||
f ();
|
||||
if (a != 0)
|
||||
{
|
||||
a = 0;
|
||||
h ();
|
||||
}
|
||||
}
|
@ -318,7 +318,7 @@ complex_propagate::visit_stmt (gimple *stmt, edge *taken_edge_p ATTRIBUTE_UNUSED
|
||||
|
||||
lhs = gimple_get_lhs (stmt);
|
||||
/* Skip anything but GIMPLE_ASSIGN and GIMPLE_CALL with a lhs. */
|
||||
if (!lhs)
|
||||
if (!lhs || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
|
||||
return SSA_PROP_VARYING;
|
||||
|
||||
/* These conditions should be satisfied due to the initial filter
|
||||
@ -417,6 +417,9 @@ complex_propagate::visit_phi (gphi *phi)
|
||||
set up in init_dont_simulate_again. */
|
||||
gcc_assert (TREE_CODE (TREE_TYPE (lhs)) == COMPLEX_TYPE);
|
||||
|
||||
if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (lhs))
|
||||
return SSA_PROP_VARYING;
|
||||
|
||||
/* We've set up the lattice values such that IOR neatly models PHI meet. */
|
||||
new_l = UNINITIALIZED;
|
||||
for (i = gimple_phi_num_args (phi) - 1; i >= 0; --i)
|
||||
|
@ -987,6 +987,12 @@ verify_phi_args (gphi *phi, basic_block bb, basic_block *definition_block)
|
||||
err = true;
|
||||
}
|
||||
|
||||
if ((e->flags & EDGE_ABNORMAL) && TREE_CODE (op) != SSA_NAME)
|
||||
{
|
||||
error ("PHI argument on abnormal edge is not SSA_NAME");
|
||||
err = true;
|
||||
}
|
||||
|
||||
if (TREE_CODE (op) == SSA_NAME)
|
||||
{
|
||||
err = verify_ssa_name (op, virtual_operand_p (gimple_phi_result (phi)));
|
||||
|
Loading…
Reference in New Issue
Block a user