From 195da47bbbf6402e3147dc1e6be6cacde140f7f3 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Tue, 21 Sep 2004 22:07:23 -0600 Subject: [PATCH] tree-ssa-ccp.c (get_default_value): If we have a constant value recorded for an SSA_NAME... * tree-ssa-ccp.c (get_default_value): If we have a constant value recorded for an SSA_NAME, then use that constant as the initial lattice value. (substitute_and_fold): Transfer equivalences discovered into SSA_NAME_EQUIV. * tree.h (SSA_NAME_EQUIV): Add comments. (SET_SSA_NAME_EQUIV): Similarly. From-SVN: r87844 --- gcc/ChangeLog | 11 +++++++++++ gcc/tree-ssa-ccp.c | 29 ++++++++++++++++++++++++++++- gcc/tree.h | 5 ++++- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3047ad65847..b6ae90ac782 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2004-09-21 Jeff Law + + * tree-ssa-ccp.c (get_default_value): If we have a constant + value recorded for an SSA_NAME, then use that constant as + the initial lattice value. + (substitute_and_fold): Transfer equivalences discovered into + SSA_NAME_EQUIV. + + * tree.h (SSA_NAME_EQUIV): Add comments. + (SET_SSA_NAME_EQUIV): Similarly. + 2004-09-21 David Edelsohn * config/rs6000/linux64.h (PROCESSOR_DEFAULT64): Default to POWER4. diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index 81ce67321c5..5fe1e1de66f 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -135,7 +135,14 @@ get_default_value (tree var) val.lattice_val = UNDEFINED; val.const_val = NULL_TREE; - if (TREE_CODE (sym) == PARM_DECL || TREE_THIS_VOLATILE (sym)) + if (TREE_CODE (var) == SSA_NAME + && SSA_NAME_EQUIV (var) + && is_gimple_min_invariant (SSA_NAME_EQUIV (var))) + { + val.lattice_val = CONSTANT; + val.const_val = SSA_NAME_EQUIV (var); + } + else if (TREE_CODE (sym) == PARM_DECL || TREE_THIS_VOLATILE (sym)) { /* Function arguments and volatile variables are considered VARYING. */ val.lattice_val = VARYING; @@ -512,6 +519,7 @@ static void substitute_and_fold (void) { basic_block bb; + unsigned int i; if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, @@ -586,6 +594,25 @@ substitute_and_fold (void) } } } + + /* And transfer what we learned from VALUE_VECTOR into the + SSA_NAMEs themselves. This probably isn't terribly important + since we probably constant propagated the values to their + use sites above. */ + for (i = 0; i < num_ssa_names; i++) + { + tree name = ssa_name (i); + value *value; + + if (!name) + continue; + + value = get_value (name); + if (value->lattice_val == CONSTANT + && is_gimple_reg (name) + && is_gimple_min_invariant (value->const_val)) + SET_SSA_NAME_EQUIV (name, value->const_val) + } } diff --git a/gcc/tree.h b/gcc/tree.h index 0f78e743897..e2742bc5c68 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -1304,13 +1304,14 @@ struct tree_exp GTY(()) #define SSA_NAME_OCCURS_IN_ABNORMAL_PHI(NODE) \ SSA_NAME_CHECK (NODE)->common.asm_written_flag - /* Nonzero if this SSA_NAME expression is currently on the free list of SSA_NAMES. Using NOTHROW_FLAG seems reasonably safe since throwing has no meaning for an SSA_NAME. */ #define SSA_NAME_IN_FREE_LIST(NODE) \ SSA_NAME_CHECK (NODE)->common.nothrow_flag +/* If NAME is equivalent to some other SSA_NAME or an invariant, then + return the equivalent SSA_NAME or invariant, else return NULL. */ #define SSA_NAME_EQUIV(NAME) __extension__ \ ({ tree equiv = SSA_NAME_CHECK (NAME)->ssa_name.equiv; \ if (equiv && TREE_CODE (equiv) == SSA_NAME) \ @@ -1318,6 +1319,8 @@ struct tree_exp GTY(()) equiv; \ }) +/* Record that NAME (an SSA_NAME) is equivalent to EQUIV. */ + #define SET_SSA_NAME_EQUIV(NAME, EQUIV)\ SSA_NAME_CHECK (NAME)->ssa_name.equiv = (EQUIV); -- 2.30.2