diff options
-rw-r--r-- | gcc/testsuite/gcc.dg/pr97897.c | 13 | ||||
-rw-r--r-- | gcc/tree-complex.c | 5 | ||||
-rw-r--r-- | gcc/tree-ssa.c | 6 |
3 files changed, 23 insertions, 1 deletions
diff --git a/gcc/testsuite/gcc.dg/pr97897.c b/gcc/testsuite/gcc.dg/pr97897.c new file mode 100644 index 0000000..775f34c --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr97897.c @@ -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 (); + } +} diff --git a/gcc/tree-complex.c b/gcc/tree-complex.c index f132e0f..1cfb3e8 100644 --- a/gcc/tree-complex.c +++ b/gcc/tree-complex.c @@ -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) diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index c47b963..b44361f 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -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))); |