diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2015-11-03 03:57:07 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2015-11-03 03:57:07 +0000 |
commit | 1b223a9f3489296c625bdb7cc764196d04fd9231 (patch) | |
tree | 1ca88d2602206178e1b174d26f9a22c25e3f13a8 /gcc/gimple-expr.c | |
parent | ec95cd47926915a7a50a5d94008b4fbfcd46eb46 (diff) | |
download | gcc-1b223a9f3489296c625bdb7cc764196d04fd9231.zip gcc-1b223a9f3489296c625bdb7cc764196d04fd9231.tar.gz gcc-1b223a9f3489296c625bdb7cc764196d04fd9231.tar.bz2 |
defer mark_addressable calls during expand till the end of expand
for gcc/ChangeLog
* gimple-expr.c: Include hash-set.h and rtl.h.
(mark_addressable_queue): New var.
(mark_addressable): Factor actual marking into...
(mark_addressable_1): ... this. Queue it up during expand.
(mark_addressable_2): New.
(flush_mark_addressable_queue): New.
* gimple-expr.h (flush_mark_addressable_queue): Declare.
* cfgexpand.c: Include gimple-expr.h.
(pass_expand::execute): Flush mark_addressable queue.
From-SVN: r229696
Diffstat (limited to 'gcc/gimple-expr.c')
-rw-r--r-- | gcc/gimple-expr.c | 57 |
1 files changed, 55 insertions, 2 deletions
diff --git a/gcc/gimple-expr.c b/gcc/gimple-expr.c index 44749b8..f5f9e87 100644 --- a/gcc/gimple-expr.c +++ b/gcc/gimple-expr.c @@ -32,6 +32,8 @@ along with GCC; see the file COPYING3. If not see #include "gimplify.h" #include "stor-layout.h" #include "demangle.h" +#include "hash-set.h" +#include "rtl.h" /* ----- Type related ----- */ @@ -817,6 +819,57 @@ is_gimple_mem_ref_addr (tree t) || decl_address_invariant_p (TREE_OPERAND (t, 0))))); } +/* Hold trees marked addressable during expand. */ + +static hash_set<tree> *mark_addressable_queue; + +/* Mark X as addressable or queue it up if called during expand. We + don't want to apply it immediately during expand because decls are + made addressable at that point due to RTL-only concerns, such as + uses of memcpy for block moves, and TREE_ADDRESSABLE changes + is_gimple_reg, which might make it seem like a variable that used + to be a gimple_reg shouldn't have been an SSA name. So we queue up + this flag setting and only apply it when we're done with GIMPLE and + only RTL issues matter. */ + +static void +mark_addressable_1 (tree x) +{ + if (!currently_expanding_to_rtl) + { + TREE_ADDRESSABLE (x) = 1; + return; + } + + if (!mark_addressable_queue) + mark_addressable_queue = new hash_set<tree>(); + mark_addressable_queue->add (x); +} + +/* Adaptor for mark_addressable_1 for use in hash_set traversal. */ + +bool +mark_addressable_2 (tree const &x, void * ATTRIBUTE_UNUSED = NULL) +{ + mark_addressable_1 (x); + return false; +} + +/* Mark all queued trees as addressable, and empty the queue. To be + called right after clearing CURRENTLY_EXPANDING_TO_RTL. */ + +void +flush_mark_addressable_queue () +{ + gcc_assert (!currently_expanding_to_rtl); + if (mark_addressable_queue) + { + mark_addressable_queue->traverse<void*, mark_addressable_2> (NULL); + delete mark_addressable_queue; + mark_addressable_queue = NULL; + } +} + /* Mark X addressable. Unlike the langhook we expect X to be in gimple form and we don't do any syntax checking. */ @@ -832,7 +885,7 @@ mark_addressable (tree x) && TREE_CODE (x) != PARM_DECL && TREE_CODE (x) != RESULT_DECL) return; - TREE_ADDRESSABLE (x) = 1; + mark_addressable_1 (x); /* Also mark the artificial SSA_NAME that points to the partition of X. */ if (TREE_CODE (x) == VAR_DECL @@ -843,7 +896,7 @@ mark_addressable (tree x) { tree *namep = cfun->gimple_df->decls_to_pointers->get (x); if (namep) - TREE_ADDRESSABLE (*namep) = 1; + mark_addressable_1 (*namep); } } |