diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2006-05-03 17:13:37 +0000 |
---|---|---|
committer | Andrew Macleod <amacleod@gcc.gnu.org> | 2006-05-03 17:13:37 +0000 |
commit | afd83fe4394ec1ad673e4930573eac6e64a11a01 (patch) | |
tree | 667bf75460841ac25534c9906889dabd781ce40d /gcc/tree-phinodes.c | |
parent | 693d710f2ad03341b24d45d1b2ab75533d67687e (diff) | |
download | gcc-afd83fe4394ec1ad673e4930573eac6e64a11a01.zip gcc-afd83fe4394ec1ad673e4930573eac6e64a11a01.tar.gz gcc-afd83fe4394ec1ad673e4930573eac6e64a11a01.tar.bz2 |
re PR tree-optimization/27381 (ice on valid code with -O)
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.
From-SVN: r113499
Diffstat (limited to 'gcc/tree-phinodes.c')
-rw-r--r-- | gcc/tree-phinodes.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/gcc/tree-phinodes.c b/gcc/tree-phinodes.c index 75e7630..5e85aea 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 |