+2005-12-20 Kazu Hirata <kazu@codesourcery.com>
+
+ PR tree-optimization/25501
+ * tree-cfgcleanup.c (merge_phi_nodes): Check that RESULT is
+ used in the PHI argument corresponding to the edge from BB to
+ DEST.
+
2005-12-20 Richard Guenther <rguenther@suse.de>
Revert
+2005-12-20 Kazu Hirata <kazu@codesourcery.com>
+
+ PR tree-optimization/25501
+ * testsuite/gcc.dg/tree-ssa/pr25501.c: New.
+
2005-12-20 Richard Guenther <rguenther@suse.de>
Revert
--- /dev/null
+/* PR tree-optimization/25501
+ The PHI merge pass used to try to merge PHI nodes that cannot
+ actually merged, causing a segfault later. Make sure that does not
+ happen any more. */
+
+/* { dg-options "-O1 -fdump-tree-mergephi" } */
+
+int
+foo (int a)
+{
+ int b;
+ int c;
+ int d;
+
+ if (a == 2)
+ b = 3;
+ else
+ b = 5;
+
+ c = 7;
+
+ d = 11;
+
+ for (;;)
+ {
+ if (d == 5)
+ break;
+
+ d = b;
+ }
+
+ return 13;
+}
+
+/* { dg-final { scan-tree-dump-times "Removing basic block" 0 "mergephi"} } */
+/* { dg-final { cleanup-tree-dump "mergephi" } } */
else
{
tree phi;
+ unsigned int dest_idx = single_succ_edge (bb)->dest_idx;
/* BB dominates DEST. There may be many users of the PHI
nodes in BB. However, there is still a trivial case we
/* Get the single use of the result of this PHI node. */
if (!single_imm_use (result, &imm_use, &use_stmt)
|| TREE_CODE (use_stmt) != PHI_NODE
- || bb_for_stmt (use_stmt) != dest)
+ || bb_for_stmt (use_stmt) != dest
+ || PHI_ARG_DEF (use_stmt, dest_idx) != result)
break;
}