From c24a4dcffae67ad72dbf83ee872abe34acaa725e Mon Sep 17 00:00:00 2001 From: Kazu Hirata Date: Fri, 29 Oct 2004 14:05:43 +0000 Subject: [PATCH] tree-phinodes.c (make_phi_node, [...]): Don't zero the whole PHI node. * tree-phinodes.c (make_phi_node, resize_phi_node): Don't zero the whole PHI node. * tree.h (tree_phi_node): Tell the garbage collector to chase num_args arguments. From-SVN: r89844 --- gcc/ChangeLog | 7 +++++++ gcc/tree-phinodes.c | 17 +++++++---------- gcc/tree.h | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b88ed38..fb4b35c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-10-29 Kazu Hirata + + * tree-phinodes.c (make_phi_node, resize_phi_node): Don't zero + the whole PHI node. + * tree.h (tree_phi_node): Tell the garbage collector to chase + num_args arguments. + 2004-10-29 Richard Earnshaw * opts.c (decode_options): Lower the crossjump threshold for -Os. diff --git a/gcc/tree-phinodes.c b/gcc/tree-phinodes.c index 1cc613c..f45479e 100644 --- a/gcc/tree-phinodes.c +++ b/gcc/tree-phinodes.c @@ -199,7 +199,12 @@ make_phi_node (tree var, int len) } - memset (phi, 0, size); + /* We do not have to clear a part of the PHI node that stores PHI + arguments, which is safe because we tell the garbage collector to + scan up to num_args elements in the array of PHI arguments. In + other words, the garbage collector will not follow garbage + pointers in the unused portion of the array. */ + memset (phi, 0, sizeof (struct tree_phi_node) - sizeof (struct phi_arg_d)); TREE_SET_CODE (phi, PHI_NODE); PHI_ARG_CAPACITY (phi) = len; TREE_TYPE (phi) = TREE_TYPE (var); @@ -234,7 +239,7 @@ resize_phi_node (tree *phi, int len) { int size, old_size; tree new_phi; - int i, old_len, bucket = NUM_BUCKETS - 2; + int bucket = NUM_BUCKETS - 2; gcc_assert (len >= PHI_ARG_CAPACITY (*phi)); @@ -271,16 +276,8 @@ resize_phi_node (tree *phi, int len) memcpy (new_phi, *phi, old_size); - old_len = PHI_ARG_CAPACITY (new_phi); PHI_ARG_CAPACITY (new_phi) = len; - for (i = old_len; i < len; i++) - { - SET_PHI_ARG_DEF (new_phi, i, NULL_TREE); - PHI_ARG_EDGE (new_phi, i) = NULL; - PHI_ARG_NONZERO (new_phi, i) = false; - } - *phi = new_phi; } diff --git a/gcc/tree.h b/gcc/tree.h index 9f74ef9..001c967 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -1405,7 +1405,7 @@ struct tree_phi_node GTY(()) /* Dataflow information. */ struct dataflow_d *df; - struct phi_arg_d GTY ((length ("((tree)&%h)->phi.capacity"))) a[1]; + struct phi_arg_d GTY ((length ("((tree)&%h)->phi.num_args"))) a[1]; }; -- 2.7.4