This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: remove expand_constant lang_hook (was [RFC] Migrate pointers to members to the middle end)


On 8/10/07, Mark Mitchell <mark@codesourcery.com> wrote:
> Ollie Wild wrote:
>
> > Offhand, I don't remember what happened with the various other cases,
> > but my testing at the time wasn't particularly thorough.  The feedback
> > I've gotten so far seems overwhelmingly negative, so I think the next
> > step is to revisit the lowering approach, exercise the hell out of it,
> > and see what, if any, limitations pop up.
>
> Yes, I agree.  Again, thank you for being patient with the process.
>
> Let me know when you're at the point where you'd like me to review the
> front-end lowering patch again; send me a URL, and I'll be happy to do so.

OK.  I think I'm ready for another go.

This is a resubmission of my patch from
http://gcc.gnu.org/ml/gcc-patches/2007-03/msg01819.html.  It removes
the expand_constant language hook which was previously used to expand
C++ pointers to members.  This expansion is now done during
initializer storage.

Previously, this patch was put on hold to investigate ways to improve
optimization of pointers to members.  A middle end migration was
investigated but rejected by the GCC community.  Instead, I've opted
to improve GCC's ability to handle pointers to members in their
lowered form.

In conjunction with my patch for folding BIT_AND_EXPR's with ADDR_EXPR
operands (http://gcc.gnu.org/ml/gcc-patches/2007-09/msg00940.html) and
the -O2 optimization level, this code is able to convert:

   struct S { void f(); };  // optionally virtual
   typedef void (S::*P)(void);
   const P ps[2] = { &S::f, 0 };
   void g(S s) {
       P p = ps[0];
       (s.*p)();  // replace with s.f ()
   }

to the same code with (s.*p)() replaced by s.f ().  Furthermore, it
does so irrespective of whether f() is virtual or the value of
TARGET_PTRMEMFUNC_VBIT_LOCATION.

There is still room for additional pointer to member optimization.  In
particular, the following are on my queue: (a) fix comparison of
pointers to member functions, (b) enable simplification of
std::mem_fun_ref calls, and (c) investigate devirtualization.

Ollie


2007-09-24  Ollie Wild  <aaw@google.com>

    * varasm.c (compare_constant): Removed call to
    lang_hooks.expand_constant.
    (copy_constants): Removed call to lang_hooks.expand_constant.
    (compute_reloc_for_constant): Removed call to
    lang_hooks.expand_constant.
    (output_addressed_constants): Removed call to
    lang_hooks.expand_constant.
    (constructor_static_from_elts_p): Removed call to
    lang_hooks.expand_constant.
    (output_constant): Removed calls to lang_hooks.expand_constant.
    * langhooks.h (struct lang_hooks): Removed field expand_constant.
    * langhooks-def.h (lhd_return_tree): Removed.
    (LANG_HOOKS_EXPAND_CONSTANT): Removed.
    (LANG_HOOKS_INITIALIZER): Removed LANG_HOOKS_EXPAND_CONSTANT.
    * langhooks.c (lhd_return_tree): Removed.

2007-09-24  Ollie Wild  <aaw@google.com>

    * typeck2.c (digest_init): Call cplus_expand_constant after
    convert_for_initialization.
    * cp-objcp-common.h (LANG_HOOKS_EXPAND_CONSTANT): Removed.
    * expr.c (cplus_expand_constant): Updated function description.
diff --git a/gcc/cp/cp-objcp-common.h b/gcc/cp/cp-objcp-common.h
index dd23613..7e90208 100644
--- a/gcc/cp/cp-objcp-common.h
+++ b/gcc/cp/cp-objcp-common.h
@@ -50,8 +50,6 @@ extern tree objcp_tsubst_copy_and_build (tree, tree, tsubst_flags_t,
 #define LANG_HOOKS_POST_OPTIONS c_common_post_options
 #undef LANG_HOOKS_GET_ALIAS_SET
 #define LANG_HOOKS_GET_ALIAS_SET cxx_get_alias_set
-#undef LANG_HOOKS_EXPAND_CONSTANT
-#define LANG_HOOKS_EXPAND_CONSTANT cplus_expand_constant
 #undef LANG_HOOKS_EXPAND_EXPR
 #define LANG_HOOKS_EXPAND_EXPR cxx_expand_expr
 #undef LANG_HOOKS_EXPAND_DECL
diff --git a/gcc/cp/expr.c b/gcc/cp/expr.c
index 267b847..b518646 100644
--- a/gcc/cp/expr.c
+++ b/gcc/cp/expr.c
@@ -33,8 +33,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "except.h"
 #include "tm_p.h"
 
-/* Hook used by output_constant to expand language-specific
-   constants.  */
+/* Expand C++-specific constants.  Currently, this means PTRMEM_CST.  */
 
 tree
 cplus_expand_constant (tree cst)
diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index 53e2202..adbe9de 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -703,8 +703,23 @@ digest_init (tree type, tree init)
   /* Handle scalar types (including conversions) and references.  */
   if (TREE_CODE (type) != COMPLEX_TYPE
       && (SCALAR_TYPE_P (type) || code == REFERENCE_TYPE))
-    return convert_for_initialization (0, type, init, LOOKUP_NORMAL,
-				       "initialization", NULL_TREE, 0);
+    {
+      tree *exp;
+
+      init = convert_for_initialization (0, type, init, LOOKUP_NORMAL,
+					 "initialization", NULL_TREE, 0);
+      exp = &init;
+
+      /* Skip any conversions since we'll be outputting the underlying
+	 constant.  */
+      while (TREE_CODE (*exp) == NOP_EXPR || TREE_CODE (*exp) == CONVERT_EXPR
+	     || TREE_CODE (*exp) == NON_LVALUE_EXPR)
+	exp = &TREE_OPERAND (*exp, 0);
+
+      *exp = cplus_expand_constant (*exp);
+
+      return init;
+    }
 
   /* Come here only for aggregates: records, arrays, unions, complex numbers
      and vectors.  */
diff --git a/gcc/langhooks-def.h b/gcc/langhooks-def.h
index 523fc0b..9338010 100644
--- a/gcc/langhooks-def.h
+++ b/gcc/langhooks-def.h
@@ -40,7 +40,6 @@ extern void lhd_do_nothing_i (int);
 extern void lhd_do_nothing_f (struct function *);
 extern bool lhd_post_options (const char **);
 extern alias_set_type lhd_get_alias_set (tree);
-extern tree lhd_return_tree (tree);
 extern tree lhd_return_null_tree_v (void);
 extern tree lhd_return_null_tree (tree);
 extern tree lhd_return_null_const_tree (const_tree);
@@ -92,7 +91,6 @@ extern void lhd_omp_firstprivatize_type_sizes (struct gimplify_omp_ctx *,
 #define LANG_HOOKS_MISSING_ARGUMENT	hook_bool_constcharptr_size_t_false
 #define LANG_HOOKS_POST_OPTIONS		lhd_post_options
 #define LANG_HOOKS_GET_ALIAS_SET	lhd_get_alias_set
-#define LANG_HOOKS_EXPAND_CONSTANT	lhd_return_tree
 #define LANG_HOOKS_EXPAND_EXPR		lhd_expand_expr
 #define LANG_HOOKS_EXPAND_DECL		lhd_expand_decl
 #define LANG_HOOKS_FINISH_INCOMPLETE_DECL lhd_do_nothing_t
@@ -247,7 +245,6 @@ extern tree lhd_make_node (enum tree_code);
   LANG_HOOKS_PARSE_FILE, \
   LANG_HOOKS_CLEAR_BINDING_STACK, \
   LANG_HOOKS_GET_ALIAS_SET, \
-  LANG_HOOKS_EXPAND_CONSTANT, \
   LANG_HOOKS_EXPAND_EXPR, \
   LANG_HOOKS_EXPAND_DECL, \
   LANG_HOOKS_FINISH_INCOMPLETE_DECL, \
diff --git a/gcc/langhooks.c b/gcc/langhooks.c
index b8e7aaa..c661e33 100644
--- a/gcc/langhooks.c
+++ b/gcc/langhooks.c
@@ -76,14 +76,6 @@ lhd_do_nothing_f (struct function * ARG_UNUSED (f))
 {
 }
 
-/* Do nothing (return the tree node passed).  */
-
-tree
-lhd_return_tree (tree t)
-{
-  return t;
-}
-
 /* Do nothing (return NULL_TREE).  */
 
 tree
diff --git a/gcc/langhooks.h b/gcc/langhooks.h
index ad925a8..b321d20 100644
--- a/gcc/langhooks.h
+++ b/gcc/langhooks.h
@@ -280,11 +280,6 @@ struct lang_hooks
      Returns -1 if the language does nothing special for it.  */
   alias_set_type (*get_alias_set) (tree);
 
-  /* Called with an expression that is to be processed as a constant.
-     Returns either the same expression or a language-independent
-     constant equivalent to its input.  */
-  tree (*expand_constant) (tree);
-
   /* Called by expand_expr for language-specific tree codes.
      Fourth argument is actually an enum expand_modifier.  */
   rtx (*expand_expr) (tree, rtx, enum machine_mode, int, rtx *);
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 9dece23..e858245 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -2985,15 +2985,7 @@ compare_constant (const tree t1, const tree t2)
       return compare_constant (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
 
     default:
-      {
-	tree nt1, nt2;
-	nt1 = lang_hooks.expand_constant (t1);
-	nt2 = lang_hooks.expand_constant (t2);
-	if (nt1 != t1 || nt2 != t2)
-	  return compare_constant (nt1, nt2);
-	else
-	  return 0;
-      }
+      return 0;
     }
 
   gcc_unreachable ();
@@ -3061,12 +3053,7 @@ copy_constant (tree exp)
       }
 
     default:
-      {
-	tree t = lang_hooks.expand_constant (exp);
-
-	gcc_assert (t != exp);
-	return copy_constant (t);
-      }
+      gcc_unreachable ();
     }
 }
 
@@ -3910,10 +3897,6 @@ compute_reloc_for_constant (tree exp)
   int reloc = 0, reloc2;
   tree tem;
 
-  /* Give the front-end a chance to convert VALUE to something that
-     looks more like a constant to the back-end.  */
-  exp = lang_hooks.expand_constant (exp);
-
   switch (TREE_CODE (exp))
     {
     case ADDR_EXPR:
@@ -3978,10 +3961,6 @@ output_addressed_constants (tree exp)
 {
   tree tem;
 
-  /* Give the front-end a chance to convert VALUE to something that
-     looks more like a constant to the back-end.  */
-  exp = lang_hooks.expand_constant (exp);
-
   switch (TREE_CODE (exp))
     {
     case ADDR_EXPR:
@@ -4055,10 +4034,6 @@ constructor_static_from_elts_p (const_tree ctor)
 tree
 initializer_constant_valid_p (tree value, tree endtype)
 {
-  /* Give the front-end a chance to convert VALUE to something that
-     looks more like a constant to the back-end.  */
-  value = lang_hooks.expand_constant (value);
-
   switch (TREE_CODE (value))
     {
     case CONSTRUCTOR:
@@ -4317,11 +4292,6 @@ output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
   enum tree_code code;
   unsigned HOST_WIDE_INT thissize;
 
-  /* Some front-ends use constants other than the standard language-independent
-     varieties, but which may still be output directly.  Give the front-end a
-     chance to convert EXP to a language-independent representation.  */
-  exp = lang_hooks.expand_constant (exp);
-
   if (size == 0 || flag_syntax_only)
     return;
 
@@ -4378,9 +4348,6 @@ output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
   code = TREE_CODE (TREE_TYPE (exp));
   thissize = int_size_in_bytes (TREE_TYPE (exp));
 
-  /* Give the front end another chance to expand constants.  */
-  exp = lang_hooks.expand_constant (exp);
-
   /* Allow a constructor with no elements for any data type.
      This means to fill the space with zeros.  */
   if (TREE_CODE (exp) == CONSTRUCTOR

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]