Message ID | BANLkTikGt_eSbSiB+-dJRBrs5ExrBiYfOg@mail.gmail.com |
---|---|
State | New |
Headers | show |
>>> Index: cgraphbuild.c >>> =================================================================== >>> --- cgraphbuild.c.orig 2011-04-03 11:28:45.000000000 +0200 >>> +++ cgraphbuild.c 2011-04-03 11:31:21.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: >> >> This change caused: >> >> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48440 >> > > This avoids canonicalizing constructor values for address conversion > if Pmode != ptr_mode. OK for trunk? Certainly the right place to fix it is in canonicalize_constructor_val itself. Paolo
On Tue, Apr 5, 2011 at 8:44 AM, Paolo Bonzini <bonzini@gnu.org> wrote: >>>> Index: cgraphbuild.c >>>> =================================================================== >>>> --- cgraphbuild.c.orig 2011-04-03 11:28:45.000000000 +0200 >>>> +++ cgraphbuild.c 2011-04-03 11:31:21.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: >>> >>> This change caused: >>> >>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48440 >>> >> >> This avoids canonicalizing constructor values for address conversion >> if Pmode != ptr_mode. OK for trunk? > > Certainly the right place to fix it is in canonicalize_constructor_val itself. There should never be any Pmode pointer types in the gimple IL. The proper place to fix it if any is in useless_type_conversion_p. Richard. > Paolo >
diff --git a/gcc/cgraphbuild.c b/gcc/cgraphbuild.c index 3948cf6..8ba7864 100644 --- a/gcc/cgraphbuild.c +++ b/gcc/cgraphbuild.c @@ -49,15 +49,20 @@ struct record_reference_ctx static tree record_reference (tree *tp, int *walk_subtrees, void *data) { - tree t = *tp; + tree t = *tp, tc; 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; + tc = canonicalize_constructor_val (t); + if (tc + && tc != t + && !(Pmode != ptr_mode + && TREE_CODE (tc) == ADDR_EXPR + && TREE_CODE (t) == CONVERT_EXPR)) + { + *tp = tc; + t = tc; + } switch (TREE_CODE (t)) {