From 195da47bbbf6402e3147dc1e6be6cacde140f7f3 Mon Sep 17 00:00:00 2001
From: Jeff Law <law@redhat.com>
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 3047ad658471..b6ae90ac7821 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2004-09-21 Jeff Law  <law@redhat.com>
+
+	* 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  <edelsohn@gnu.org>
 
 	* config/rs6000/linux64.h (PROCESSOR_DEFAULT64): Default to POWER4.
diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c
index 81ce67321c57..5fe1e1de66ff 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 0f78e743897b..e2742bc5c684 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);
 
-- 
GitLab