diff options
author | Jeff Law <law@redhat.com> | 2004-06-14 14:41:41 -0600 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2004-06-14 14:41:41 -0600 |
commit | daa2b95a4f0e16d75fe83a5d4a38d72c1bbce097 (patch) | |
tree | 2a6b012635368f8e3f24c906ad8fc525270e4b0b | |
parent | d962e073a077fe4066b937412d0f6d435f2f4f92 (diff) | |
download | gcc-daa2b95a4f0e16d75fe83a5d4a38d72c1bbce097.zip gcc-daa2b95a4f0e16d75fe83a5d4a38d72c1bbce097.tar.gz gcc-daa2b95a4f0e16d75fe83a5d4a38d72c1bbce097.tar.bz2 |
tree-ssa.c (kill_redundant_phi_nodes): More correctly handle PHIs where the destination or an argument is marked with...
* 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.
* gcc.c-torture/20040614-1.c: New test.
From-SVN: r83132
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/20040614-1.c | 20 | ||||
-rw-r--r-- | gcc/tree-ssa.c | 24 |
4 files changed, 50 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d7faa5d..1973374 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-06-14 Jeff Law <law@redhat.com> + + * 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 <jakub@redhat.com> PR middle-end/15945 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 36cb478..9c8a040 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2004-06-14 Jeff Law <law@redhat.com> + + * gcc.c-torture/compile/20040614-1.c: New test. + 2004-06-14 Tobias Schlueter <tobias.schlueter@physik.uni-muenchen.de> 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 0000000..d99d278 --- /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 d553676..9cec5d5 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); |