diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d7faa5d7818..19733748c7a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-06-14 Jeff Law + + * tree-ssa.c (kill_redundant_phi_nodes): More correctly handle + PHIs where the destination or an argument is marked with + SSA_NAME_OCCURS_IN_ABNORMAL_PHI. + 2004-06-14 Jakub Jelinek PR middle-end/15945 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 36cb478b01c..9c8a040da2d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-06-14 Jeff Law + + * gcc.c-torture/compile/20040614-1.c: New test. + 2004-06-14 Tobias Schlueter PR fortran/15211 diff --git a/gcc/testsuite/gcc.c-torture/compile/20040614-1.c b/gcc/testsuite/gcc.c-torture/compile/20040614-1.c new file mode 100644 index 00000000000..d99d2789664 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20040614-1.c @@ -0,0 +1,20 @@ +#ifndef NO_LABEL_VALUES +void f(int r1, int *fp) +{ + void *hlbl_tbl[] = { &&label1 }; + goto *hlbl_tbl[r1]; + *fp = 0; + label0: + fp += 8; + label1: + *fp = 0; + if (r1) + goto label2; + if (r1) + goto label0; + label2: + ; +} +#else +int x; +#endif diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index d553676969f..9cec5d5087f 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -885,6 +885,14 @@ kill_redundant_phi_nodes (void) { var = PHI_RESULT (phi); + /* If the destination of the PHI is associated with an + abnormal edge, then we can not propagate this PHI away. */ + if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (var)) + { + raise_value (phi, var, eq_to); + continue; + } + for (i = 0; i < (unsigned) PHI_NUM_ARGS (phi); i++) { t = PHI_ARG_DEF (phi, i); @@ -897,12 +905,20 @@ kill_redundant_phi_nodes (void) stmt = SSA_NAME_DEF_STMT (t); + /* If any particular PHI argument is associated with + an abnormal edge, then we know that we should not + be propagating away this PHI. Go ahead and raise + the result of this PHI to the top of the lattice. */ + if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (t)) + { + raise_value (phi, var, eq_to); + continue; + } + /* If the defining statement for this argument is not a - phi node or the argument is associated with an abnormal - edge, then we need to recursively start the forward + phi node then we need to recursively start the forward dataflow starting with PHI. */ - if (TREE_CODE (stmt) != PHI_NODE - || SSA_NAME_OCCURS_IN_ABNORMAL_PHI (t)) + if (TREE_CODE (stmt) != PHI_NODE) { eq_to[SSA_NAME_VERSION (t)] = t; raise_value (phi, t, eq_to);