summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/Makefile.in5
-rw-r--r--gcc/common.opt4
-rw-r--r--gcc/opts.c1
-rw-r--r--gcc/passes.c1
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/sra-2.c4
-rw-r--r--gcc/timevar.def1
-rw-r--r--gcc/tree-pass.h1
-rw-r--r--gcc/tree-promote-statics.c597
10 files changed, 20 insertions, 611 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5cd749b6eff..3e3c6e3b1cb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+2005-07-19 Danny Berlin <dberlin@dberlin.org>
+ Kenneth Zadeck <zadeck@naturalbridge.com>
+
+ * Makefile.in: Removed tree-promote-statics.c
+ * tree-promote-statics.c: Removed.
+ * common.opt: Removed flag-promote-statics.
+ * opts.c: Ditto.
+ * passes.c: Removed tree-promote-statics pass.
+ * tree-pass.h: Ditto.
+ * timevar.def: Removed TV_PROMOTE_STATICS.
+
+
2005-07-19 Gerald Pfeifer <gerald@pfeifer.com>
* config.gcc: Add support for *-*-freebsd7, *-*-freebsd8,
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 910cdc8b89f..cc52cc3ea13 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -948,7 +948,7 @@ OBJS-common = \
integrate.o intl.o jump.o langhooks.o lcm.o lists.o local-alloc.o \
loop.o mode-switching.o modulo-sched.o optabs.o options.o opts.o \
params.o postreload.o postreload-gcse.o predict.o \
- insn-preds.o pointer-set.o tree-promote-statics.o \
+ insn-preds.o pointer-set.o \
print-rtl.o print-tree.o profile.o value-prof.o var-tracking.o \
real.o recog.o reg-stack.o regclass.o regmove.o regrename.o \
reload.o reload1.o reorg.o resource.o rtl.o rtlanal.o rtl-error.o \
@@ -2218,9 +2218,6 @@ tree-vect-generic.o : tree-vect-generic.c $(CONFIG_H) $(SYSTEM_H) $(TREE_H) \
$(FLAGS_H) $(OPTABS_H) $(RTL_H) $(MACHMODE_H) $(EXPR_H) \
langhooks.h $(FLAGS_H) $(DIAGNOSTIC_H) gt-tree-vect-generic.h $(GGC_H) \
coretypes.h insn-codes.h
-tree-promote-statics.o : tree-promote-statics.c $(CONFIG_H) system.h \
- $(TREE_H) $(TM_H) $(BASIC_BLOCK_H) $(TREE_FLOW_H) $(IPA_UTILS_H) \
- $(IPA_REFERENCE_H) bitmap.h tree-pass.h $(FLAGS_H) $(TIMEVAR_H)
df.o : df.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
insn-config.h $(RECOG_H) function.h $(REGS_H) alloc-pool.h hard-reg-set.h \
$(BASIC_BLOCK_H) $(DF_H) bitmap.h sbitmap.h $(TM_P_H)
diff --git a/gcc/common.opt b/gcc/common.opt
index 4af5f506cdc..c6ab1091be7 100644
--- a/gcc/common.opt
+++ b/gcc/common.opt
@@ -927,10 +927,6 @@ ftree-pre
Common Report Var(flag_tree_pre)
Enable SSA-PRE optimization on trees
-ftree-promote-statics
-Common Report Var(flag_tree_promote_statics) Init(0)
-Enable promotion of static variables
-
ftree-salias
Common Report Var(flag_tree_salias)
Perform structural alias analysis
diff --git a/gcc/opts.c b/gcc/opts.c
index b7948f63e92..afa25d5bc48 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -586,7 +586,6 @@ decode_options (unsigned int argc, const char **argv)
if (optimize >= 3)
{
- flag_tree_promote_statics = 1;
flag_inline_functions = 1;
flag_unswitch_loops = 1;
flag_gcse_after_reload = 1;
diff --git a/gcc/passes.c b/gcc/passes.c
index efe3e5b9421..ee060f5960e 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -472,7 +472,6 @@ init_optimization_passes (void)
p = &pass_all_optimizations.sub;
NEXT_PASS (pass_referenced_vars);
- NEXT_PASS (pass_promote_statics);
NEXT_PASS (pass_create_structure_vars);
NEXT_PASS (pass_build_ssa);
NEXT_PASS (pass_may_alias);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3032a0afda5..745f2b135c4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-07-19 Danny Berlin <dberlin@dberlin.org>
+ Kenneth Zadeck <zadeck@naturalbridge.com>
+
+ * gcc.dg/tree-ssa/sra-2.c: Changed back to -O1 and added xfail.
+
2005-07-19 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* gcc.dg/format/miss-1.c, gcc.dg/format/miss-2.c: Don't
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/sra-2.c b/gcc/testsuite/gcc.dg/tree-ssa/sra-2.c
index 548a026f715..ec30bc904d7 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/sra-2.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/sra-2.c
@@ -1,5 +1,5 @@
/* { dg-do compile } */
-/* { dg-options "-O3 -fdump-tree-optimized --param sra-max-structure-size=32" } */
+/* { dg-options "-O1 -fdump-tree-optimized --param sra-max-structure-size=32" } */
/* Test for SRA. */
@@ -22,5 +22,5 @@ copystruct11 (teststruct *param)
/* There should be no reference to link_error. */
-/* { dg-final { scan-tree-dump-times "link_error" 0 "optimized" } } */
+/* { dg-final { scan-tree-dump-times "link_error" 0 "optimized" { xfail *-*-* } } } */
/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/timevar.def b/gcc/timevar.def
index 66574f5b6ab..05d8b386246 100644
--- a/gcc/timevar.def
+++ b/gcc/timevar.def
@@ -69,7 +69,6 @@ DEFTIMEVAR (TV_TREE_GIMPLIFY , "tree gimplify")
DEFTIMEVAR (TV_TREE_EH , "tree eh")
DEFTIMEVAR (TV_TREE_CFG , "tree CFG construction")
DEFTIMEVAR (TV_TREE_CLEANUP_CFG , "tree CFG cleanup")
-DEFTIMEVAR (TV_TREE_PROMOTE_STATICS , "tree promote statics")
DEFTIMEVAR (TV_TREE_VRP , "tree VRP")
DEFTIMEVAR (TV_TREE_COPY_PROP , "tree copy propagation")
DEFTIMEVAR (TV_TREE_STORE_COPY_PROP , "tree store copy prop")
diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h
index e5056377f92..a51054df246 100644
--- a/gcc/tree-pass.h
+++ b/gcc/tree-pass.h
@@ -278,7 +278,6 @@ extern struct tree_opt_pass pass_store_copy_prop;
extern struct tree_opt_pass pass_vrp;
extern struct tree_opt_pass pass_create_structure_vars;
extern struct tree_opt_pass pass_uncprop;
-extern struct tree_opt_pass pass_promote_statics;
extern struct tree_opt_pass pass_return_slot;
extern struct tree_opt_pass pass_reassoc;
extern struct tree_opt_pass pass_rebuild_cgraph_edges;
diff --git a/gcc/tree-promote-statics.c b/gcc/tree-promote-statics.c
deleted file mode 100644
index a4ac8b79305..00000000000
--- a/gcc/tree-promote-statics.c
+++ /dev/null
@@ -1,597 +0,0 @@
-/* Promotion of static variables to ssa registers
- Copyright (C) 2004-2005 Free Software Foundation, Inc.
- Contributed by Kenneth Zadeck <zadeck@naturalbridge.com>
-
-This file is part of GCC.
-
-GCC is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-GCC is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING. If not, write to
-the Free Software Foundation, 59 Temple Place - Suite 330,
-Boston, MA 02111-1307, USA. */
-
-#include "config.h"
-#include "system.h"
-#include "coretypes.h"
-#include "tm.h"
-#include "tree.h"
-#include "basic-block.h"
-#include "tree-flow.h"
-#include "ipa-utils.h"
-#include "ipa-reference.h"
-#include "bitmap.h"
-#include "tree-pass.h"
-#include "flags.h"
-#include "timevar.h"
-#include "langhooks.h"
-
-/*
-The main idea is to promote some static variables from memory to SSA
-registers. This transformation is only applied to those static
-variables for which the effects of subroutine calls can be understood.
-Such infomation is provided by functions in cgraphunit.c.
-
-The following table shows the actions that are taken to promote
-variables. The analysis in cgraphunit constructs information about
-both local usage and the effect of any particular call. Variables are
-broken into 4 categories: only-read, only-write, read-write, and no
-information. (No information variables are never promoted.)
-
-All information is of the "may" variety: if a function is marked read,
-it means the call may read the variable, but it also may not read the
-variable.
-
-There are two possible ways to perform the promotion: assume that the
-static is live everywhere or compute the minimal live range for the
-static variable.
-
-The minimal live range path has a lot of problems:
-
-1) live variables and upwards exposed uses must be first comuputed.
-2) new machiney must be invented to prevent code motion algorithms
-from floating a use of the surrogate register across a register
-function call that clobbers the variable, but was not in any minimal
-live range at the time of this analysis.
-
-While the first problem is simply a lot of code, the second problem
-requires a new mechanism for pinning code and teaching all passes that
-can move code to obey this new fenceposts.
-
-The maximum live range path has the problem that this technique can
-create many false live ranges where the register is loaded after on
-call only to be stored back right before the next call. This will eat
-a certain amount of space and requires special smarts to get rid of them.
-
-There are really 7 situations to cover in the following table.
-
-action read write read-write
-
- -+---------------------------------------------------------------
-
-entry | load load load
- |
-load | getfromreg xxxxx getfromreg
- |
-store | xxxx puttoreg puttoreg
- |
-call-read | noaction store before store before
- |
-call-write | load after store before store before
- | load after load after
-call-readwrite| load after store before store before
- | load after load after
- |
-return | no action store store
-
-
-l-r l-w c-r c-w store-b load-a
-
-0 0 0 0 | 0 0
-0 0 0 1 | 0 0
-0 0 1 0 | 0 0
-0 0 1 1 | 0 0
-0 1 0 0 | 0 0
-0 1 0 1 | 1 1
-0 1 1 0 | 1 0
-0 1 1 1 | 1 1
-1 0 0 0 | 0 0
-1 0 0 1 | 0 1
-1 0 1 0 | 0 0
-1 0 1 1 | 0 1
-1 1 0 0 | 0 0
-1 1 0 1 | 1 1
-1 1 1 0 | 1 0
-1 1 1 1 | 1 1
-
-store_before = local_written & (callee_read | callee_written)
-load_after = (local_read | local_written) & callee_written
-*/
-
-static bitmap_obstack promote_obstack;
-
-/* All of the static variables under consideration by this pass that
- do reads or writes withing this function. */
-static bitmap local_read;
-static bitmap local_written;
-static bitmap local_all;
-
-/* Return true if the asm STMT clobbers memory. */
-
-static bool
-asm_clobbers_mem (tree stmt)
-{
- tree link;
- for (link = ASM_CLOBBERS (stmt); link; link = TREE_CHAIN (link))
- if (simple_cst_equal(TREE_VALUE (link), memory_identifier_string) == 1)
- return true;
-
- return false;
-}
-
-/* Return a INPUT_BITMAP for the asm inputs and OUTPUT_BITMAP for the
- asm outputs of variables written by the asm STMT. */
-
-static void
-get_asm_read_and_write (bitmap input_bitmap, bitmap output_bitmap, tree stmt)
-{
- int noutputs = list_length (ASM_OUTPUTS (stmt));
- const char **oconstraints
- = (const char **) alloca ((noutputs) * sizeof (const char *));
- int i;
- tree link;
- const char *constraint;
- bool allows_mem, allows_reg, is_inout;
-
- for (i=0, link = ASM_OUTPUTS (stmt); link; ++i, link = TREE_CHAIN (link))
- {
- oconstraints[i] = constraint
- = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
- parse_output_constraint (&constraint, i, 0, 0,
- &allows_mem, &allows_reg, &is_inout);
-
- /* The variable is only added to the bitmap if there is an aux
- field, ie.this is a variable we care about. */
- if (!allows_reg && allows_mem)
- {
- tree var = TREE_VALUE (link);
- var = get_base_address (var);
- if (TREE_CODE (var) == VAR_DECL)
- {
- var_ann_t va = var_ann (var);
- if (va && va->common.aux)
- bitmap_set_bit(output_bitmap, DECL_UID (var));
- }
- }
- }
-
- for (link = ASM_INPUTS (stmt); link; link = TREE_CHAIN (link))
- {
- constraint
- = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (link)));
- parse_input_constraint (&constraint, 0, 0, noutputs, 0,
- oconstraints, &allows_mem, &allows_reg);
-
- /* The variable is only added to the bitmap if there is an aux
- field, ie.this is a variable we care about. */
- if (!allows_reg && allows_mem)
- {
- tree var = TREE_VALUE (link);
- var = get_base_address (var);
- if (TREE_CODE (var) == VAR_DECL)
- {
- var_ann_t va = var_ann (var);
- if (va && va->common.aux)
- bitmap_set_bit(input_bitmap, DECL_UID (var));
- }
- }
- }
-}
-
-/* Generate a series of loads from the static variables pointed to by
- B1 && B2 or just B1 (if B2 is NULL) and insert them after
- BSI). */
-
-static void
-gen_loads (bitmap b1, bitmap b2, block_stmt_iterator *bsi)
-{
- bitmap result;
- bitmap_iterator bi;
- unsigned int index;
- tree list = NULL;
-
- if (b2)
- {
- result = BITMAP_ALLOC (&promote_obstack);
- bitmap_and (result, b1, b2);
- }
- else
- result = b1;
-
- EXECUTE_IF_SET_IN_BITMAP(result, 0, index, bi)
- {
- tree src = referenced_var (index);
- tree dest = (tree) (var_ann (src)->common.aux);
- tree stmt = build (MODIFY_EXPR, TREE_TYPE (src), dest, src);
- append_to_statement_list (stmt, &list);
- }
-
- if (list)
- sra_insert_after (bsi, list);
-
- if (b2)
- BITMAP_FREE (result);
-}
-
-/* Generate a series of stores to the static variables pointed to by
- B1 && B2 or just B1 (if B2 is NULL) and insert them before
- BSI). */
-
-static void
-gen_stores (bitmap b1, bitmap b2, block_stmt_iterator *bsi)
-{
- bitmap result;
- bitmap_iterator bi;
- unsigned int index;
- tree list = NULL;
-
- if (b2)
- {
- result = BITMAP_ALLOC (&promote_obstack);
- bitmap_and (result, b1, b2);
- }
- else
- result = b1;
-
- EXECUTE_IF_SET_IN_BITMAP(result, 0, index, bi)
- {
- tree dest = referenced_var (index);
- tree src = (tree) (var_ann (dest)->common.aux);
- tree stmt = build (MODIFY_EXPR, TREE_TYPE (src), dest, src);
- append_to_statement_list (stmt, &list);
- }
-
- if (list)
- sra_insert_before (bsi, list);
-
- if (b2)
- BITMAP_FREE (result);
-}
-
-/* Replace the static references if it exists in the TPTR. */
-
-static void
-try_replace_operand(tree * tptr)
-{
- tree t = *tptr;
- if (TREE_CODE (t) == VAR_DECL)
- {
- var_ann_t va = var_ann (t);
- tree replacement = (tree) (va->common.aux);
- if (replacement)
- *tptr = replacement;
- }
-}
-
-/* Walk an expression TPTR replacing all of the static references. */
-
-static void
-try_replace (tree *tptr)
-{
- tree t = *tptr;
- if ((TREE_CODE (t) == EXC_PTR_EXPR) || (TREE_CODE (t) == FILTER_EXPR))
- return;
-
- /* The INTEGER_CST is because some people use cute things like &0->a
- for offsetof. */
- while (t && !SSA_VAR_P (t)
- && (!CONSTANT_CLASS_P (t))
- && TREE_CODE (t) != LABEL_DECL
- && TREE_CODE (t) != CONST_DECL
- && TREE_CODE (t) != FUNCTION_DECL
- && TREE_CODE (t) != EXC_PTR_EXPR)
- {
- if (TREE_CODE (t) == ARRAY_REF)
- try_replace_operand (&TREE_OPERAND (t, 1));
-
- tptr = &TREE_OPERAND (t, 0);
- t = *tptr;
- }
- if (t)
- try_replace_operand (tptr);
-}
-
-/* Repalce the static references that exist in a constructor. */
-
-static void
-try_replace_constructor (tree ctor)
-{
- tree t;
- for (t = TREE_OPERAND (ctor, 0); t; t = TREE_CHAIN (t))
- {
- try_replace (&TREE_VALUE (t));
- }
-}
-
-/* Replace all the static references in the operand list of
- CALL_EXPR. */
-
-static void
-try_replace_call_operands (tree call_expr)
-{
- tree operandList = TREE_OPERAND (call_expr, 1);
- tree operand;
-
- for (operand = operandList;
- operand != NULL_TREE;
- operand = TREE_CHAIN (operand))
-
- if (TREE_CODE(TREE_VALUE (operand)) != FUNCTION_DECL)
- try_replace (&TREE_VALUE (operand));
-}
-
-/* Generate loads and stores and replace all the static references in
- function FN using statement iterator SI. This form is used when
- there is not info available about the caller. */
-
-static void
-gen_dumb_call (tree fn, block_stmt_iterator si)
-{
- gen_stores (local_written, NULL, &si);
- try_replace (&TREE_OPERAND (fn, 0));
- try_replace_call_operands (fn);
- gen_loads (local_all, NULL, &si);
-}
-
-
-/* Generate loads and stores and replace all the static references in
- function FN using statement iterator SI. */
-
-static void
-try_replace_call (tree fn, block_stmt_iterator si)
-{
- /* Store intersection of call_read and local_written
- registers back to memory before calling. */
- /* int call_flags = call_expr_flags (fn); */
- tree callee = get_callee_fndecl (fn);
- if (callee)
- {
- bitmap callee_all = BITMAP_ALLOC (&promote_obstack);
- bitmap callee_written = ipa_reference_get_written_global (callee);
- if (callee_written)
- {
- bitmap_ior (callee_all,
- ipa_reference_get_read_global (callee),
- callee_written);
-
- gen_stores (local_written, callee_all, &si);
-
- if (TREE_CODE (callee) != FUNCTION_DECL)
- try_replace (&TREE_OPERAND (fn, 0));
- try_replace_call_operands (fn);
-
- /* This is a hack required because the call_flags are set on a
- function by function basis during compilation. Thus these
- flags are only set if the callee has already been compiled. */
- /* if (!(call_flags & (ECF_PURE | ECF_CONST | ECF_NORETURN))) */
- gen_loads (local_all, callee_written, &si);
- BITMAP_FREE (callee_all);
- }
- else
- gen_dumb_call (fn, si);
- }
- else
- gen_dumb_call (fn, si);
-}
-
-
-/* Walk the entire function looking uses or stores to global variables
- and changing them to use ssa shadow registers. */
-
-static void
-walk_function (void)
-{
- basic_block bb;
- block_stmt_iterator si, ni;
-
- FOR_EACH_BB (bb)
- for (si = bsi_start (bb); !bsi_end_p (si); si = ni)
- {
- tree stmt = bsi_stmt (si);
-
- ni = si;
- bsi_next (&ni);
-
- switch (TREE_CODE (stmt))
- {
- case RETURN_EXPR:
- /* Store all of the local_written registers back to memory
- before returning. */
- gen_stores (local_written, NULL, &si);
- break;
-
- case MODIFY_EXPR:
- /* Change load of static to use of reg. Change store of
- static to store of reg. */
- {
- tree rhs = TREE_OPERAND (stmt, 1);
- tree *rhsp = &TREE_OPERAND (stmt, 1);
- tree *lhsp = &TREE_OPERAND (stmt, 0);
-
- /* If we have a call on the rhs, try to replace the arguments.
- Otherwise, try to replace the operand on the LHS and the operand on
- the RHS. */
- if (TREE_CODE (rhs) == CALL_EXPR)
- try_replace_call (rhs, si);
- else if (TREE_CODE (rhs) == CONSTRUCTOR)
- try_replace_constructor (rhs);
- else
- try_replace (rhsp);
- try_replace (lhsp);
- }
- break;
- case CALL_EXPR:
- try_replace_call (stmt, si);
-
- break;
- case ASM_EXPR:
- /* If the asm clobbers memory, just store everything and
- load it back. */
- if (asm_clobbers_mem (stmt))
- {
- gen_stores (local_written, NULL, &si);
- gen_loads (local_all, NULL, &si);
- }
- else
- {
- bitmap store_bitmap = BITMAP_ALLOC (&promote_obstack);
- bitmap load_bitmap = BITMAP_ALLOC (&promote_obstack);
- bitmap all_bitmap = BITMAP_ALLOC (&promote_obstack);
- /* The asm read generates a stores before, and the asm
- write generates loads after. */
- get_asm_read_and_write (store_bitmap, load_bitmap, stmt);
- bitmap_ior (all_bitmap, store_bitmap, load_bitmap);
-
- gen_stores (local_written, all_bitmap , &si);
- gen_loads (local_all, load_bitmap, &si);
-
- BITMAP_FREE (store_bitmap);
- BITMAP_FREE (load_bitmap);
- BITMAP_FREE (all_bitmap);
- }
- break;
-
- default:
- break;
- }
- }
-}
-
-/* Main entry point for the promotion of statics to ssa regsisters. */
-
-static void
-execute_promote_statics (void)
-{
- unsigned int index;
- bitmap_iterator bi;
- bitmap tb = ipa_reference_get_read_local (current_function_decl);
-
-
- /* There are some options that cause this pass to run even if file
- at a time is not set. */
- if (!tb)
- return;
-
- bitmap_obstack_initialize (&promote_obstack);
- sra_init_cache ();
-
- local_read = BITMAP_ALLOC (&promote_obstack);
- bitmap_copy (local_read, tb);
- tb = ipa_reference_get_written_local (current_function_decl);
- local_written = BITMAP_ALLOC (&promote_obstack);
- bitmap_copy (local_written, tb);
-
- local_all = BITMAP_ALLOC (&promote_obstack);
- tb = BITMAP_ALLOC (&promote_obstack);
- bitmap_ior (local_all, local_read, local_written);
-
- if (dump_file)
- fprintf (dump_file, "promoting in %s\n",
- lang_hooks.decl_printable_name (current_function_decl, 2));
-
- EXECUTE_IF_SET_IN_BITMAP (local_all, 0, index, bi)
- {
- tree svar = referenced_var_lookup_if_exists (index);
- if (svar)
- {
- tree type = TREE_TYPE (svar);
- /* We only promote variables that are either scalars or if
- they are aggregrates, they must be a type that sra is
- willing to scalarize. Otherwise there is no reason to
- promote it a register.
-
- We also do not promote anything that is marked READONLY
- since there is little gain. The optimizations should
- generally be able to look thru the operations and find the
- constants. */
- if ((!TREE_READONLY(svar))
- && (TREE_CODE (type) != ARRAY_TYPE)
- && ((!AGGREGATE_TYPE_P (type))
- || (sra_type_can_be_decomposed_p (type))))
- {
- tree tmp = create_tmp_var (type, get_name (svar));
- add_referenced_tmp_var (tmp);
- var_ann (svar)->common.aux = tmp;
-
- /* Insert loads from all read statics in the entry
- block. */
- insert_edge_copies (build (MODIFY_EXPR, TREE_TYPE (svar),
- tmp, svar),
- ENTRY_BLOCK_PTR);
- if (dump_file)
- fprintf (dump_file, " var=%s, read=%d,write=%d\n",
- get_name (svar),
- bitmap_bit_p (local_read, index),
- bitmap_bit_p (local_written, index));
- }
- else
- /* There is nothing to be done with this variable. */
- bitmap_set_bit (tb, index);
- }
- else
- /* There is nothing to be done with this variable because the
- reference was optimized out before we got here. */
- bitmap_set_bit (tb, index);
- }
-
- /* Clear the to be ignored variables from the local maps. */
- bitmap_and_compl_into (local_read, tb);
- bitmap_and_compl_into (local_written, tb);
- bitmap_and_compl_into (local_all, tb);
-
- walk_function ();
- bsi_commit_edge_inserts ();
-
- EXECUTE_IF_SET_IN_BITMAP (local_all, 0, index, bi)
- {
- tree svar = referenced_var (index);
- var_ann (svar)->common.aux = NULL;
- }
-
- bitmap_obstack_release (&promote_obstack);
-}
-
-static bool
-gate_promote_statics (void)
-{
- return flag_unit_at_a_time != 0
- && flag_ipa_reference
- && flag_tree_promote_statics;
-}
-
-struct tree_opt_pass pass_promote_statics =
-{
- "promote-statics", /* name */
- gate_promote_statics, /* gate */
- execute_promote_statics, /* execute */
- NULL, /* sub */
- NULL, /* next */
- 0, /* static_pass_number */
- TV_TREE_PROMOTE_STATICS, /* tv_id */
- PROP_cfg, /* properties_required */
- 0, /* properties_provided */
- 0, /* properties_destroyed */
- 0, /* todo_flags_start */
- TODO_dump_func, /* todo_flags_finish */
- 0 /* letter */
-};
-
-