Message ID | 20100903233447.GR1664@kam.mff.cuni.cz |
---|---|
State | New |
Headers | show |
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 (); > } > >
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 (); }