This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: Fix constant folding of SWTCH statements
- From: Richard Guenther <rguenther at suse dot de>
- To: Jan Hubicka <hubicka at ucw dot cz>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Sat, 4 Sep 2010 10:32:10 +0200 (CEST)
- Subject: Re: Fix constant folding of SWTCH statements
- References: <20100903233447.GR1664@kam.mff.cuni.cz>
On Sat, 4 Sep 2010, Jan Hubicka wrote:
> Hi,
> the following testcase from testsuite fails to get switch value folded
> to constant before it reach cfgexpand. The problem is twofold. First
> we require ctor to have TREE_STATIC (for some reason) that is not set by
> tree-switch-conversion.c. Secondly we screw up for variables introduced
> late because we do not compute varpool_decide_const_value_known.
>
> Fixed thus,
> Bootstrapped/regtested x86_64-linux, OK?
Ok.
Thanks,
Richard.
> Honza
> /* { dg-do compile } */
> /* { dg-options "-O2 -fdump-tree-optimized" } */
> void bar (unsigned int);
>
> void
> foo (void)
> {
> char buf[1] = { 3 };
> const char *p = buf;
> const char **q = &p;
> unsigned int ch;
> switch (**q)
> {
> case 1: ch = 5; break;
> case 2: ch = 4; break;
> case 3: ch = 3; break;
> case 4: ch = 2; break;
> case 5: ch = 1; break;
> default: ch = 0; break;
> }
> bar (ch);
> }
> /* The switch should be switch converted and later constant propagated. */
> /* { dg-final { scan-tree-dump-not "CSWTCH.1.2" "optimized"} } */
>
> * tree-switch-conversion.c (build_one_array): Set ctor static flag.
> * varpool.c (varpool_finalize_decl): Set const_value_known.
> Index: tree-switch-conversion.c
> ===================================================================
> --- tree-switch-conversion.c (revision 163808)
> +++ tree-switch-conversion.c (working copy)
> @@ -518,6 +518,7 @@ build_one_array (gimple swtch, int num,
> array_type = build_array_type (value_type, arr_index_type);
> ctor = build_constructor (array_type, info.constructors[num]);
> TREE_CONSTANT (ctor) = true;
> + TREE_STATIC (ctor) = true;
>
> decl = build_decl (loc, VAR_DECL, NULL_TREE, array_type);
> TREE_STATIC (decl) = 1;
> Index: varpool.c
> ===================================================================
> --- varpool.c (revision 163808)
> +++ varpool.c (working copy)
> @@ -423,6 +423,7 @@ varpool_finalize_decl (tree decl)
> there. */
> else if (TREE_PUBLIC (decl) && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl))
> varpool_mark_needed_node (node);
> + node->const_value_known |= varpool_decide_const_value_known (node);
> if (cgraph_global_info_ready)
> varpool_assemble_pending_decls ();
> }
>
>
--
Richard Guenther <rguenther@suse.de>
Novell / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 - GF: Markus Rex