summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/tree-phinodes.c16
-rw-r--r--gcc/tree-ssa-operands.c9
3 files changed, 25 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 902857b933f..8f29f82529c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2006-05-02 Andrew MacLeod <amacleod@redhat.com>
+
+ PR tree-optimization/27381
+ * tree-phinodes.c (remove_phi_arg_num): When moving a phi argument,
+ maintain the same immediate_use links.
+ * tree-ssa-operands.c (dump_immediate_uses_for): Show iteration marker
+ node rather than segfaulting.
+
2006-05-03 Jakub Jelinek <jakub@redhat.com>
PR fortran/27395
diff --git a/gcc/tree-phinodes.c b/gcc/tree-phinodes.c
index 75e76308470..5e85aea64e4 100644
--- a/gcc/tree-phinodes.c
+++ b/gcc/tree-phinodes.c
@@ -406,14 +406,20 @@ remove_phi_arg_num (tree phi, int i)
gcc_assert (i < num_elem);
- /* Delink the last item, which is being removed. */
- delink_imm_use (&(PHI_ARG_IMM_USE_NODE (phi, num_elem - 1)));
- /* If we are not at the last element, switch the last element
- with the element we want to delete. */
+ /* Delink the item which is being removed. */
+ delink_imm_use (&(PHI_ARG_IMM_USE_NODE (phi, i)));
+
+ /* If it is not the last element, move the last element
+ to the element we want to delete, resetting all the links. */
if (i != num_elem - 1)
{
- SET_PHI_ARG_DEF (phi, i, PHI_ARG_DEF (phi, num_elem - 1));
+ use_operand_p old_p, new_p;
+ old_p = &PHI_ARG_IMM_USE_NODE (phi, num_elem - 1);
+ new_p = &PHI_ARG_IMM_USE_NODE (phi, i);
+ /* Set use on new node, and link into last elements's place. */
+ *(new_p->use) = *(old_p->use);
+ relink_imm_use (new_p, old_p);
}
/* Shrink the vector and return. Note that we do not have to clear
diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c
index 68613fe9564..3cd8c45aaf1 100644
--- a/gcc/tree-ssa-operands.c
+++ b/gcc/tree-ssa-operands.c
@@ -2513,10 +2513,13 @@ dump_immediate_uses_for (FILE *file, tree var)
FOR_EACH_IMM_USE_FAST (use_p, iter, var)
{
- if (!is_gimple_reg (USE_FROM_PTR (use_p)))
- print_generic_stmt (file, USE_STMT (use_p), TDF_VOPS);
+ if (use_p->stmt == NULL && use_p->use == NULL)
+ fprintf (file, "***end of stmt iterator marker***\n");
else
- print_generic_stmt (file, USE_STMT (use_p), TDF_SLIM);
+ if (!is_gimple_reg (USE_FROM_PTR (use_p)))
+ print_generic_stmt (file, USE_STMT (use_p), TDF_VOPS);
+ else
+ print_generic_stmt (file, USE_STMT (use_p), TDF_SLIM);
}
fprintf(file, "\n");
}