This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Random cleanups [2/4]: canonicalize ctor values
On Thu, 31 Mar 2011, Richard Guenther wrote:
> > canonicalize_constructor_val may be doing useful things on ADDR_EXPR
> > too, but you don't call it in that case because you only added your
> > code in the default case. ÂYou only reach it when the ADDR_EXPR is
> > wrapped in a cast.
> >
> > Any reason why you didn't add it (possibly wrapped in a loop) _before_
> > the switch statement?
Nope, probably I didn't want to pay the cost each time, but you're right.
> Indeed. This comment needs adjustment, too:
>
> /* We never have the chance to fixup types in global initializers
> during gimplification. Do so here. */
Done in new patch.
> as we now sort-of do this. In fact it looks like all existing
> canonicalize_constructor_val calls are subsumed by the lowering, so,
> eventually remove those and move this function to a local place next to
> its sole caller.
Yeah. I couldn't immediately convince myself that all simplifications
will also be done on local vars (for which record_reference won't run), so
I'll leave this for later (I'm for instance doubtful about the NULL return
for when the current unit "can't" refer to a symbol). FWIW I'm currently
testing with these asserts which should tell me:
-----------------------------------------------------
@@ -152,7 +151,8 @@ get_symbol_constant_value (tree sym)
tree val = DECL_INITIAL (sym);
if (val)
{
- val = canonicalize_constructor_val (val);
+ tree newval = canonicalize_constructor_val (val);
+ gcc_assert (newval == val);
if (val && is_gimple_min_invariant (val))
return val;
else
@@ -3164,7 +3164,11 @@ fold_ctor_reference (tree type, tree cto
/* We found the field with exact match. */
if (useless_type_conversion_p (type, TREE_TYPE (ctor))
&& !offset)
- return canonicalize_constructor_val (ctor);
+ {
+ tree newctor = canonicalize_constructor_val (ctor);
+ gcc_assert (newctor == ctor);
+ return newctor;
+ }
/* We are at the end of walk, see if we can view convert the
result. */
@@ -3174,6 +3178,7 @@ fold_ctor_reference (tree type, tree cto
TYPE_SIZE (TREE_TYPE (ctor)), 0))
{
ret = canonicalize_constructor_val (ctor);
+ gcc_assert (ret == ctor);
ret = fold_unary (VIEW_CONVERT_EXPR, type, ret);
if (ret)
STRIP_NOPS (ret);
-----------------------------------------------------
In the meanwhile, is the below version okay?
Ciao,
Michael.
--
* cgraphbuild.c (record_reference): Canonicalize constructor
values.
* gimple-fold.c (canonicalize_constructor_val): Accept being called
without function context.
java/
* jcf-parse.c (java_emit_static_constructor): Clear cfun and
current_function_decl.
Index: cgraphbuild.c
===================================================================
--- cgraphbuild.c.orig 2011-03-29 17:08:15.000000000 +0200
+++ cgraphbuild.c 2011-03-31 17:43:29.000000000 +0200
@@ -53,6 +53,12 @@ record_reference (tree *tp, int *walk_su
tree decl;
struct record_reference_ctx *ctx = (struct record_reference_ctx *)data;
+ t = canonicalize_constructor_val (t);
+ if (!t)
+ t = *tp;
+ else if (t != *tp)
+ *tp = t;
+
switch (TREE_CODE (t))
{
case VAR_DECL:
Index: gimple-fold.c
===================================================================
--- gimple-fold.c.orig 2011-03-29 17:08:15.000000000 +0200
+++ gimple-fold.c 2011-03-31 17:42:45.000000000 +0200
@@ -106,7 +106,7 @@ can_refer_decl_in_current_unit_p (tree d
return true;
}
-/* CVAL is value taken from DECL_INITIAL of variable. Try to transorm it into
+/* CVAL is value taken from DECL_INITIAL of variable. Try to transform it into
acceptable form for is_gimple_min_invariant. */
tree
@@ -131,10 +131,9 @@ canonicalize_constructor_val (tree cval)
|| TREE_CODE (base) == FUNCTION_DECL)
&& !can_refer_decl_in_current_unit_p (base))
return NULL_TREE;
- if (base && TREE_CODE (base) == VAR_DECL)
+ if (cfun && base && TREE_CODE (base) == VAR_DECL)
add_referenced_var (base);
- /* We never have the chance to fixup types in global initializers
- during gimplification. Do so here. */
+ /* Fixup types in global initializers. */
if (TREE_TYPE (TREE_TYPE (cval)) != TREE_TYPE (TREE_OPERAND (cval, 0)))
cval = build_fold_addr_expr (TREE_OPERAND (cval, 0));
}
Index: java/jcf-parse.c
===================================================================
--- java/jcf-parse.c.orig 2011-03-29 17:08:15.000000000 +0200
+++ java/jcf-parse.c 2011-03-29 17:12:05.000000000 +0200
@@ -1725,6 +1725,8 @@ java_emit_static_constructor (void)
DECL_STATIC_CONSTRUCTOR (decl) = 1;
java_genericize (decl);
cgraph_finalize_function (decl, false);
+ current_function_decl = NULL;
+ set_cfun (NULL);
}
}