aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2005-11-30 01:53:22 -0700
committerJeff Law <law@gcc.gnu.org>2005-11-30 01:53:22 -0700
commit224b4faf2097f0ed0e5a058ffee9e35fe3827bde (patch)
treec6ed79a7b936bd0665b1b0861c8b1441c7c1598a
parenta488b14d1bf6f3238680f9c97cc0ce40cef3f797 (diff)
downloadgcc-224b4faf2097f0ed0e5a058ffee9e35fe3827bde.zip
gcc-224b4faf2097f0ed0e5a058ffee9e35fe3827bde.tar.gz
gcc-224b4faf2097f0ed0e5a058ffee9e35fe3827bde.tar.bz2
tree-ssa-uncprop.c (associate_equivalences_with_edges): Properly handle SSA_NAME_OCCURS_IN_ABNORMAL_PHI.
* tree-ssa-uncprop.c (associate_equivalences_with_edges): Properly handle SSA_NAME_OCCURS_IN_ABNORMAL_PHI. * g++.old-deja/g++.law/pr25000.C: New test. From-SVN: r107710
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.old-deja/g++.law/pr25000.C24
-rw-r--r--gcc/tree-ssa-uncprop.c11
4 files changed, 41 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4c2e7be..8cf398b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2005-11-30 Jeff Law <law@redhat.com>
+
+ * tree-ssa-uncprop.c (associate_equivalences_with_edges): Properly
+ handle SSA_NAME_OCCURS_IN_ABNORMAL_PHI.
+
2005-11-30 Jakub Jelinek <jakub@redhat.com>
* config/ia64/ia64.c (ia64_expand_tls_address): Add ORIG_OP1 argument.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 57ea16d..bca19a5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2005-11-30 Jeff Law <law@redhat.com>
+
+ * g++.old-deja/g++.law/pr25000.C: New test.
+
2005-11-30 Jakub Jelinek <jakub@redhat.com>
* gcc.dg/tls/opt-11.c: New test.
diff --git a/gcc/testsuite/g++.old-deja/g++.law/pr25000.C b/gcc/testsuite/g++.old-deja/g++.law/pr25000.C
new file mode 100644
index 0000000..45d4680
--- /dev/null
+++ b/gcc/testsuite/g++.old-deja/g++.law/pr25000.C
@@ -0,0 +1,24 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+int * f(void);
+void g(int*);
+bool h(void);
+void Find( )
+{
+ int * pRes = f();
+ if( !pRes ) {
+ if( h()){
+ if( h()){
+ try
+ {
+ pRes = new int();
+ f();
+ }catch(int& e1 ){}
+ }
+ if( !pRes )
+ f();
+ }
+ g(pRes);
+ }
+}
+
diff --git a/gcc/tree-ssa-uncprop.c b/gcc/tree-ssa-uncprop.c
index 4ca90c2..28d3850 100644
--- a/gcc/tree-ssa-uncprop.c
+++ b/gcc/tree-ssa-uncprop.c
@@ -92,7 +92,8 @@ associate_equivalences_with_edges (void)
/* If the conditional is a single variable 'X', record 'X = 1'
for the true edge and 'X = 0' on the false edge. */
- if (TREE_CODE (cond) == SSA_NAME)
+ if (TREE_CODE (cond) == SSA_NAME
+ && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (cond))
{
equivalency = xmalloc (sizeof (struct edge_equivalency));
equivalency->rhs = constant_boolean_node (1, TREE_TYPE (cond));
@@ -114,6 +115,7 @@ associate_equivalences_with_edges (void)
know the value of OP0 on both arms of the branch. i.e., we
can record an equivalence for OP0 rather than COND. */
if (TREE_CODE (op0) == SSA_NAME
+ && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op0)
&& TREE_CODE (TREE_TYPE (op0)) == BOOLEAN_TYPE
&& is_gimple_min_invariant (op1))
{
@@ -152,8 +154,10 @@ associate_equivalences_with_edges (void)
}
if (TREE_CODE (op0) == SSA_NAME
+ && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op0)
&& (is_gimple_min_invariant (op1)
- || TREE_CODE (op1) == SSA_NAME))
+ || (TREE_CODE (op1) == SSA_NAME
+ && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (op1))))
{
/* For IEEE, -0.0 == 0.0, so we don't necessarily know
the sign of a variable compared against zero. If
@@ -185,7 +189,8 @@ associate_equivalences_with_edges (void)
{
tree cond = SWITCH_COND (stmt);
- if (TREE_CODE (cond) == SSA_NAME)
+ if (TREE_CODE (cond) == SSA_NAME
+ && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (cond))
{
tree labels = SWITCH_LABELS (stmt);
int i, n_labels = TREE_VEC_LENGTH (labels);