* PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk @ 2008-03-07 15:00 H.J. Lu 2008-03-07 15:19 ` Richard Guenther ` (2 more replies) 0 siblings, 3 replies; 16+ messages in thread From: H.J. Lu @ 2008-03-07 15:00 UTC (permalink / raw) To: gcc-patches We can't fold glocal variables with NULL DECL_INITIAL. I am testing it on Linux/x86 and Linux/Intel64 as well as 483.xalancbmk. OK to install if all pass? H.J. ---- gcc/testsuite/ 2008-03-07 H.J. Lu <hongjiu.lu@intel.com> PR tree-optimization/35494 * g++.dg/tree-ssa/ssa-store-ccp-1.C: New. * gcc.dg/tree-ssa/ssa-store-ccp-2.c: Likewise. gcc/ 2008-03-07 H.J. Lu <hongjiu.lu@intel.com> PR tree-optimization/35494 * tree-ssa-ccp.c (get_symbol_constant_value): Only fold local variables with NULL DECL_INITIAL. --- gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C.local 2008-03-07 06:45:42.000000000 -0800 +++ gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C 2008-03-07 06:44:53.000000000 -0800 @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +class bar +{ +public: + static const int conststaticvariable; +}; + + +int f(void) +{ + return bar::conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it is + global. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c.local 2008-03-07 06:58:07.000000000 -0800 +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c 2008-03-07 06:58:38.000000000 -0800 @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +const int conststaticvariable; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be 1 reference to conststaticvariable since it is + global. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/tree-ssa-ccp.c.local 2008-03-06 14:18:27.000000000 -0800 +++ gcc/tree-ssa-ccp.c 2008-03-07 06:21:57.000000000 -0800 @@ -306,9 +306,10 @@ get_symbol_constant_value (tree sym) if (val && ccp_decl_initial_min_invariant (val)) return val; - /* Variables declared 'const' without an initializer + /* Local variables declared 'const' without an initializer have zero as the intializer. */ if (!val + && !TREE_PUBLIC (sym) && (INTEGRAL_TYPE_P (TREE_TYPE (sym)) || SCALAR_FLOAT_TYPE_P (TREE_TYPE (sym)))) return fold_convert (TREE_TYPE (sym), integer_zero_node); ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk 2008-03-07 15:00 PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk H.J. Lu @ 2008-03-07 15:19 ` Richard Guenther 2008-03-07 15:30 ` H.J. Lu 2008-03-09 14:43 ` H.J. Lu 2008-03-07 16:39 ` Andrew Pinski 2008-03-07 17:00 ` Andrew Pinski 2 siblings, 2 replies; 16+ messages in thread From: Richard Guenther @ 2008-03-07 15:19 UTC (permalink / raw) To: H.J. Lu; +Cc: gcc-patches On Fri, Mar 7, 2008 at 4:00 PM, H.J. Lu <hjl.tools@gmail.com> wrote: > We can't fold glocal variables with NULL DECL_INITIAL. I am testing it > on Linux/x86 and Linux/Intel64 as well as 483.xalancbmk. OK to install > if all pass? Hm, use targetm.binds_local_p instead? Thanks, Richard. > H.J. > ---- > gcc/testsuite/ > > 2008-03-07 H.J. Lu <hongjiu.lu@intel.com> > > PR tree-optimization/35494 > * g++.dg/tree-ssa/ssa-store-ccp-1.C: New. > * gcc.dg/tree-ssa/ssa-store-ccp-2.c: Likewise. > > gcc/ > > 2008-03-07 H.J. Lu <hongjiu.lu@intel.com> > > PR tree-optimization/35494 > * tree-ssa-ccp.c (get_symbol_constant_value): Only fold local > variables with NULL DECL_INITIAL. > > --- gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C.local 2008-03-07 06:45:42.000000000 -0800 > +++ gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C 2008-03-07 06:44:53.000000000 -0800 > @@ -0,0 +1,19 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > + > +class bar > +{ > +public: > + static const int conststaticvariable; > +}; > + > + > +int f(void) > +{ > + return bar::conststaticvariable; > +} > + > +/* There should be a reference to conststaticvariable since it is > + global. */ > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c.local 2008-03-07 06:58:07.000000000 -0800 > +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c 2008-03-07 06:58:38.000000000 -0800 > @@ -0,0 +1,14 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > + > +const int conststaticvariable; > + > +int f(void) > +{ > + return conststaticvariable; > +} > + > +/* There should be 1 reference to conststaticvariable since it is > + global. */ > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/tree-ssa-ccp.c.local 2008-03-06 14:18:27.000000000 -0800 > +++ gcc/tree-ssa-ccp.c 2008-03-07 06:21:57.000000000 -0800 > @@ -306,9 +306,10 @@ get_symbol_constant_value (tree sym) > if (val > && ccp_decl_initial_min_invariant (val)) > return val; > - /* Variables declared 'const' without an initializer > + /* Local variables declared 'const' without an initializer > have zero as the intializer. */ > if (!val > + && !TREE_PUBLIC (sym) > && (INTEGRAL_TYPE_P (TREE_TYPE (sym)) > || SCALAR_FLOAT_TYPE_P (TREE_TYPE (sym)))) > return fold_convert (TREE_TYPE (sym), integer_zero_node); > ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk 2008-03-07 15:19 ` Richard Guenther @ 2008-03-07 15:30 ` H.J. Lu 2008-03-07 15:40 ` Richard Guenther 2008-03-09 14:43 ` H.J. Lu 1 sibling, 1 reply; 16+ messages in thread From: H.J. Lu @ 2008-03-07 15:30 UTC (permalink / raw) To: Richard Guenther; +Cc: gcc-patches On Fri, Mar 07, 2008 at 04:19:01PM +0100, Richard Guenther wrote: > On Fri, Mar 7, 2008 at 4:00 PM, H.J. Lu <hjl.tools@gmail.com> wrote: > > We can't fold glocal variables with NULL DECL_INITIAL. I am testing it > > on Linux/x86 and Linux/Intel64 as well as 483.xalancbmk. OK to install > > if all pass? > > Hm, use targetm.binds_local_p instead? > I don't think targetm.binds_local_p is appropriate here. targetm.binds_local_p tells me if a symbol is local to the module, which may consist of many files, and a symbol local to the module may be initialized to a different value in another file. But here we want to check if a symbol local to the file. H.J. ---- > Thanks, > Richard. > > > H.J. > > ---- > > gcc/testsuite/ > > > > 2008-03-07 H.J. Lu <hongjiu.lu@intel.com> > > > > PR tree-optimization/35494 > > * g++.dg/tree-ssa/ssa-store-ccp-1.C: New. > > * gcc.dg/tree-ssa/ssa-store-ccp-2.c: Likewise. > > > > gcc/ > > > > 2008-03-07 H.J. Lu <hongjiu.lu@intel.com> > > > > PR tree-optimization/35494 > > * tree-ssa-ccp.c (get_symbol_constant_value): Only fold local > > variables with NULL DECL_INITIAL. > > > > --- gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C.local 2008-03-07 06:45:42.000000000 -0800 > > +++ gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C 2008-03-07 06:44:53.000000000 -0800 > > @@ -0,0 +1,19 @@ > > +/* { dg-do compile } */ > > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > > + > > +class bar > > +{ > > +public: > > + static const int conststaticvariable; > > +}; > > + > > + > > +int f(void) > > +{ > > + return bar::conststaticvariable; > > +} > > + > > +/* There should be a reference to conststaticvariable since it is > > + global. */ > > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ > > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > > --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c.local 2008-03-07 06:58:07.000000000 -0800 > > +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c 2008-03-07 06:58:38.000000000 -0800 > > @@ -0,0 +1,14 @@ > > +/* { dg-do compile } */ > > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > > + > > +const int conststaticvariable; > > + > > +int f(void) > > +{ > > + return conststaticvariable; > > +} > > + > > +/* There should be 1 reference to conststaticvariable since it is > > + global. */ > > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ > > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > > --- gcc/tree-ssa-ccp.c.local 2008-03-06 14:18:27.000000000 -0800 > > +++ gcc/tree-ssa-ccp.c 2008-03-07 06:21:57.000000000 -0800 > > @@ -306,9 +306,10 @@ get_symbol_constant_value (tree sym) > > if (val > > && ccp_decl_initial_min_invariant (val)) > > return val; > > - /* Variables declared 'const' without an initializer > > + /* Local variables declared 'const' without an initializer > > have zero as the intializer. */ > > if (!val > > + && !TREE_PUBLIC (sym) > > && (INTEGRAL_TYPE_P (TREE_TYPE (sym)) > > || SCALAR_FLOAT_TYPE_P (TREE_TYPE (sym)))) > > return fold_convert (TREE_TYPE (sym), integer_zero_node); > > ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk 2008-03-07 15:30 ` H.J. Lu @ 2008-03-07 15:40 ` Richard Guenther 0 siblings, 0 replies; 16+ messages in thread From: Richard Guenther @ 2008-03-07 15:40 UTC (permalink / raw) To: H.J. Lu; +Cc: gcc-patches On Fri, Mar 7, 2008 at 4:30 PM, H.J. Lu <hjl.tools@gmail.com> wrote: > On Fri, Mar 07, 2008 at 04:19:01PM +0100, Richard Guenther wrote: > > On Fri, Mar 7, 2008 at 4:00 PM, H.J. Lu <hjl.tools@gmail.com> wrote: > > > We can't fold glocal variables with NULL DECL_INITIAL. I am testing it > > > on Linux/x86 and Linux/Intel64 as well as 483.xalancbmk. OK to install > > > if all pass? > > > > Hm, use targetm.binds_local_p instead? > > > > I don't think targetm.binds_local_p is appropriate here. > targetm.binds_local_p tells me if a symbol is local to > the module, which may consist of many files, and a symbol > local to the module may be initialized to a different value > in another file. But here we want to check if a symbol local > to the file. The patch is ok then if testing passes. Richard. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk 2008-03-07 15:19 ` Richard Guenther 2008-03-07 15:30 ` H.J. Lu @ 2008-03-09 14:43 ` H.J. Lu 2008-03-09 15:47 ` H.J. Lu 1 sibling, 1 reply; 16+ messages in thread From: H.J. Lu @ 2008-03-09 14:43 UTC (permalink / raw) To: Richard Guenther; +Cc: gcc-patches On Fri, Mar 07, 2008 at 04:19:01PM +0100, Richard Guenther wrote: > On Fri, Mar 7, 2008 at 4:00 PM, H.J. Lu <hjl.tools@gmail.com> wrote: > > We can't fold glocal variables with NULL DECL_INITIAL. I am testing it > > on Linux/x86 and Linux/Intel64 as well as 483.xalancbmk. OK to install > > if all pass? > > Hm, use targetm.binds_local_p instead? > It turns out that targetm.binds_local_p works since it returns false for common symbol, even if the symbol may be bound locally in executable. I am testing this patch now. H.J. --- gcc/ 2008-03-08 H.J. Lu <hongjiu.lu@intel.com> PR tree-optimization/35501 * c-typeck.c (decl_constant_value): Check if value may be overriden at run time. * tree-ssa-sccvn.c: Include "target.h". (try_to_simplify): Check if value may be overriden at run time. * varasm.c (default_binds_local_p_1): Return false for DECL_EXTERNAL only if it isn't read-only with initializer. PR tree-optimization/35494 PR tree-optimization/35501 * tree-ssa-ccp.c (get_symbol_constant_value): Check if value may be overriden at link and run time. gcc/testsuite/ 2008-03-07 H.J. Lu <hongjiu.lu@intel.com> PR tree-optimization/35494 * g++.dg/tree-ssa/ssa-store-ccp-1.C: New. * gcc.dg/tree-ssa/ssa-store-ccp-2.c: Likewise. * gcc.dg/tree-ssa/ssa-store-ccp-3.c: Likewise. * gcc.dg/tree-ssa/ssa-store-ccp-4.c: Likewise. PR tree-optimization/35501 * gcc.dg/pr35501-1.c: New. * gcc.dg/pr35501-2.c: Likewise. * gcc.dg/pr35501-3.c: Likewise. * gcc.dg/pr35501-4.c: Likewise. --- gcc/c-typeck.c.local 2008-02-26 09:27:22.000000000 -0800 +++ gcc/c-typeck.c 2008-03-08 18:11:53.000000000 -0800 @@ -1551,7 +1551,9 @@ decl_constant_value (tree decl) or a variable, then re-evaluating it could give different results. */ && TREE_CONSTANT (DECL_INITIAL (decl)) /* Check for cases where this is sub-optimal, even though valid. */ - && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR) + && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR + /* Check if it may be overriden at run time. */ + && targetm.binds_local_p (decl)) return DECL_INITIAL (decl); return decl; } --- gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C.local 2008-03-08 18:11:53.000000000 -0800 +++ gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C 2008-03-08 18:11:53.000000000 -0800 @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +class bar +{ +public: + static const int conststaticvariable; +}; + + +int f(void) +{ + return bar::conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it may + be overriden at link time. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/pr35501-1.c.local 2008-03-08 18:11:53.000000000 -0800 +++ gcc/testsuite/gcc.dg/pr35501-1.c 2008-03-08 18:11:53.000000000 -0800 @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +const int conststaticvariable = 1; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be no reference to conststaticvariable as we should have + inlined the 0. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 0 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/pr35501-2.c.local 2008-03-08 18:11:53.000000000 -0800 +++ gcc/testsuite/gcc.dg/pr35501-2.c 2008-03-08 18:11:53.000000000 -0800 @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +const int conststaticvariable = 1; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be no reference to conststaticvariable as we should have + inlined the 0. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 0 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/pr35501-3.c.local 2008-03-08 18:11:53.000000000 -0800 +++ gcc/testsuite/gcc.dg/pr35501-3.c 2008-03-08 18:11:53.000000000 -0800 @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target fpic } */ +/* { dg-options "-O -fpic -fdump-tree-optimized" } */ + +const int conststaticvariable = 1; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it may + may be overriden at run time. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/pr35501-4.c.local 2008-03-08 18:11:53.000000000 -0800 +++ gcc/testsuite/gcc.dg/pr35501-4.c 2008-03-08 18:11:53.000000000 -0800 @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target fpic } */ +/* { dg-options "-O2 -fpic -fdump-tree-optimized" } */ + +const int conststaticvariable = 1; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it may + may be overriden at run time. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c.local 2008-03-08 18:11:53.000000000 -0800 +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c 2008-03-08 18:11:53.000000000 -0800 @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +const int conststaticvariable; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it may + may be overriden at link time. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-3.c.local 2008-03-08 18:11:53.000000000 -0800 +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-3.c 2008-03-08 18:11:53.000000000 -0800 @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-common -fdump-tree-optimized" } */ + +const int conststaticvariable; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be no reference to conststaticvariable as we should have + inlined the 0. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 0 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-4.c.local 2008-03-08 18:11:53.000000000 -0800 +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-4.c 2008-03-08 18:11:53.000000000 -0800 @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target fpic } */ +/* { dg-options "-O2 -fno-common -fpic -fdump-tree-optimized" } */ + +const int conststaticvariable; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it may + may be overriden at run time. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/tree-ssa-ccp.c.local 2008-03-07 09:02:37.000000000 -0800 +++ gcc/tree-ssa-ccp.c 2008-03-09 06:58:50.000000000 -0700 @@ -300,7 +300,10 @@ get_symbol_constant_value (tree sym) { if (TREE_STATIC (sym) && TREE_READONLY (sym) - && !MTAG_P (sym)) + && !MTAG_P (sym) + /* Check if a read-only definition may be overridden at + link and run time. */ + && targetm.binds_local_p (sym)) { tree val = DECL_INITIAL (sym); if (val --- gcc/tree-ssa-sccvn.c.local 2008-03-08 14:41:18.000000000 -0800 +++ gcc/tree-ssa-sccvn.c 2008-03-08 18:11:53.000000000 -0800 @@ -45,6 +45,7 @@ along with GCC; see the file COPYING3. #include "params.h" #include "tree-ssa-propagate.h" #include "tree-ssa-sccvn.h" +#include "target.h" /* This algorithm is based on the SCC algorithm presented by Keith Cooper and L. Taylor Simpson in "SCC-Based Value numbering" @@ -1453,6 +1454,8 @@ try_to_simplify (tree stmt, tree rhs) if (TREE_READONLY (rhs) && TREE_STATIC (rhs) && DECL_INITIAL (rhs) + /* Check if it may be overriden at run time. */ + && targetm.binds_local_p (rhs) && valid_gimple_expression_p (DECL_INITIAL (rhs))) return DECL_INITIAL (rhs); --- gcc/varasm.c.local 2007-12-05 17:04:34.000000000 -0800 +++ gcc/varasm.c 2008-03-08 18:11:53.000000000 -0800 @@ -6186,7 +6186,10 @@ default_binds_local_p_1 (const_tree exp, && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT) local_p = true; /* Variables defined outside this object might not be local. */ - else if (DECL_EXTERNAL (exp)) + else if (DECL_EXTERNAL (exp) + && (!TREE_READONLY (exp) + || !TREE_STATIC (exp) + || !DECL_INITIAL (exp))) local_p = false; /* If defined in this object and visibility is not default, must be local. */ ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk 2008-03-09 14:43 ` H.J. Lu @ 2008-03-09 15:47 ` H.J. Lu 0 siblings, 0 replies; 16+ messages in thread From: H.J. Lu @ 2008-03-09 15:47 UTC (permalink / raw) To: Richard Guenther; +Cc: gcc-patches On Sun, Mar 9, 2008 at 6:43 AM, H.J. Lu <hjl.tools@gmail.com> wrote: > On Fri, Mar 07, 2008 at 04:19:01PM +0100, Richard Guenther wrote: > > > On Fri, Mar 7, 2008 at 4:00 PM, H.J. Lu <hjl.tools@gmail.com> wrote: > > > We can't fold glocal variables with NULL DECL_INITIAL. I am testing it > > > on Linux/x86 and Linux/Intel64 as well as 483.xalancbmk. OK to install > > > if all pass? > > > > Hm, use targetm.binds_local_p instead? > > > > It turns out that targetm.binds_local_p works since it returns > false for common symbol, even if the symbol may be bound locally > in executable. I am testing this patch now. All tests are passed on Linux/x86 and Linux/Intel64 as well as 483.xalancbmk. H.J. > > > H.J. > --- > gcc/ > > 2008-03-08 H.J. Lu <hongjiu.lu@intel.com> > > PR tree-optimization/35501 > * c-typeck.c (decl_constant_value): Check if value may be > overriden at run time. > > * tree-ssa-sccvn.c: Include "target.h". > (try_to_simplify): Check if value may be overriden at run time. > > * varasm.c (default_binds_local_p_1): Return false for > DECL_EXTERNAL only if it isn't read-only with initializer. > > PR tree-optimization/35494 > PR tree-optimization/35501 > * tree-ssa-ccp.c (get_symbol_constant_value): Check if value > may be overriden at link and run time. > > > gcc/testsuite/ > > 2008-03-07 H.J. Lu <hongjiu.lu@intel.com> > > PR tree-optimization/35494 > * g++.dg/tree-ssa/ssa-store-ccp-1.C: New. > * gcc.dg/tree-ssa/ssa-store-ccp-2.c: Likewise. > > * gcc.dg/tree-ssa/ssa-store-ccp-3.c: Likewise. > * gcc.dg/tree-ssa/ssa-store-ccp-4.c: Likewise. > > PR tree-optimization/35501 > * gcc.dg/pr35501-1.c: New. > * gcc.dg/pr35501-2.c: Likewise. > * gcc.dg/pr35501-3.c: Likewise. > * gcc.dg/pr35501-4.c: Likewise. > > > --- gcc/c-typeck.c.local 2008-02-26 09:27:22.000000000 -0800 > +++ gcc/c-typeck.c 2008-03-08 18:11:53.000000000 -0800 > > @@ -1551,7 +1551,9 @@ decl_constant_value (tree decl) > or a variable, then re-evaluating it could give different results. */ > && TREE_CONSTANT (DECL_INITIAL (decl)) > /* Check for cases where this is sub-optimal, even though valid. */ > - && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR) > + && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR > + /* Check if it may be overriden at run time. */ > + && targetm.binds_local_p (decl)) > return DECL_INITIAL (decl); > return decl; > } > --- gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C.local 2008-03-08 18:11:53.000000000 -0800 > +++ gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C 2008-03-08 18:11:53.000000000 -0800 > > @@ -0,0 +1,19 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > + > +class bar > +{ > +public: > + static const int conststaticvariable; > +}; > + > + > +int f(void) > +{ > + return bar::conststaticvariable; > +} > + > +/* There should be a reference to conststaticvariable since it may > + be overriden at link time. */ > > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/testsuite/gcc.dg/pr35501-1.c.local 2008-03-08 18:11:53.000000000 -0800 > +++ gcc/testsuite/gcc.dg/pr35501-1.c 2008-03-08 18:11:53.000000000 -0800 > > @@ -0,0 +1,14 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O -fdump-tree-optimized" } */ > + > +const int conststaticvariable = 1; > > + > +int f(void) > +{ > + return conststaticvariable; > +} > + > > +/* There should be no reference to conststaticvariable as we should have > + inlined the 0. */ > > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 0 "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/testsuite/gcc.dg/pr35501-2.c.local 2008-03-08 18:11:53.000000000 -0800 > +++ gcc/testsuite/gcc.dg/pr35501-2.c 2008-03-08 18:11:53.000000000 -0800 > > @@ -0,0 +1,14 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > + > +const int conststaticvariable = 1; > > + > +int f(void) > +{ > + return conststaticvariable; > +} > + > > +/* There should be no reference to conststaticvariable as we should have > + inlined the 0. */ > > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 0 "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/testsuite/gcc.dg/pr35501-3.c.local 2008-03-08 18:11:53.000000000 -0800 > +++ gcc/testsuite/gcc.dg/pr35501-3.c 2008-03-08 18:11:53.000000000 -0800 > > @@ -0,0 +1,15 @@ > +/* { dg-do compile } */ > +/* { dg-require-effective-target fpic } */ > +/* { dg-options "-O -fpic -fdump-tree-optimized" } */ > + > +const int conststaticvariable = 1; > > + > +int f(void) > +{ > + return conststaticvariable; > +} > + > +/* There should be a reference to conststaticvariable since it may > + may be overriden at run time. */ > > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/testsuite/gcc.dg/pr35501-4.c.local 2008-03-08 18:11:53.000000000 -0800 > +++ gcc/testsuite/gcc.dg/pr35501-4.c 2008-03-08 18:11:53.000000000 -0800 > > @@ -0,0 +1,15 @@ > +/* { dg-do compile } */ > +/* { dg-require-effective-target fpic } */ > +/* { dg-options "-O2 -fpic -fdump-tree-optimized" } */ > + > +const int conststaticvariable = 1; > > + > +int f(void) > +{ > + return conststaticvariable; > +} > + > +/* There should be a reference to conststaticvariable since it may > + may be overriden at run time. */ > > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c.local 2008-03-08 18:11:53.000000000 -0800 > +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c 2008-03-08 18:11:53.000000000 -0800 > > @@ -0,0 +1,14 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > + > +const int conststaticvariable; > + > +int f(void) > +{ > + return conststaticvariable; > +} > + > +/* There should be a reference to conststaticvariable since it may > + may be overriden at link time. */ > > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-3.c.local 2008-03-08 18:11:53.000000000 -0800 > +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-3.c 2008-03-08 18:11:53.000000000 -0800 > > @@ -0,0 +1,14 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fno-common -fdump-tree-optimized" } */ > > + > +const int conststaticvariable; > + > +int f(void) > +{ > + return conststaticvariable; > +} > + > > +/* There should be no reference to conststaticvariable as we should have > + inlined the 0. */ > > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 0 "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-4.c.local 2008-03-08 18:11:53.000000000 -0800 > +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-4.c 2008-03-08 18:11:53.000000000 -0800 > > @@ -0,0 +1,15 @@ > +/* { dg-do compile } */ > +/* { dg-require-effective-target fpic } */ > +/* { dg-options "-O2 -fno-common -fpic -fdump-tree-optimized" } */ > > + > +const int conststaticvariable; > + > +int f(void) > +{ > + return conststaticvariable; > +} > + > +/* There should be a reference to conststaticvariable since it may > + may be overriden at run time. */ > > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/tree-ssa-ccp.c.local 2008-03-07 09:02:37.000000000 -0800 > +++ gcc/tree-ssa-ccp.c 2008-03-09 06:58:50.000000000 -0700 > @@ -300,7 +300,10 @@ get_symbol_constant_value (tree sym) > > { > if (TREE_STATIC (sym) > && TREE_READONLY (sym) > - && !MTAG_P (sym)) > + && !MTAG_P (sym) > + /* Check if a read-only definition may be overridden at > + link and run time. */ > > + && targetm.binds_local_p (sym)) > { > tree val = DECL_INITIAL (sym); > if (val > > --- gcc/tree-ssa-sccvn.c.local 2008-03-08 14:41:18.000000000 -0800 > +++ gcc/tree-ssa-sccvn.c 2008-03-08 18:11:53.000000000 -0800 > > @@ -45,6 +45,7 @@ along with GCC; see the file COPYING3. > #include "params.h" > #include "tree-ssa-propagate.h" > #include "tree-ssa-sccvn.h" > +#include "target.h" > > /* This algorithm is based on the SCC algorithm presented by Keith > Cooper and L. Taylor Simpson in "SCC-Based Value numbering" > @@ -1453,6 +1454,8 @@ try_to_simplify (tree stmt, tree rhs) > if (TREE_READONLY (rhs) > && TREE_STATIC (rhs) > && DECL_INITIAL (rhs) > + /* Check if it may be overriden at run time. */ > + && targetm.binds_local_p (rhs) > && valid_gimple_expression_p (DECL_INITIAL (rhs))) > return DECL_INITIAL (rhs); > > --- gcc/varasm.c.local 2007-12-05 17:04:34.000000000 -0800 > +++ gcc/varasm.c 2008-03-08 18:11:53.000000000 -0800 > > > @@ -6186,7 +6186,10 @@ default_binds_local_p_1 (const_tree exp, > && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT) > local_p = true; > /* Variables defined outside this object might not be local. */ > - else if (DECL_EXTERNAL (exp)) > + else if (DECL_EXTERNAL (exp) > + && (!TREE_READONLY (exp) > + || !TREE_STATIC (exp) > + || !DECL_INITIAL (exp))) > local_p = false; > /* If defined in this object and visibility is not default, must be > local. */ > ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk 2008-03-07 15:00 PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk H.J. Lu 2008-03-07 15:19 ` Richard Guenther @ 2008-03-07 16:39 ` Andrew Pinski 2008-03-07 17:00 ` Andrew Pinski 2 siblings, 0 replies; 16+ messages in thread From: Andrew Pinski @ 2008-03-07 16:39 UTC (permalink / raw) To: H.J. Lu; +Cc: gcc-patches Sent from my iPhone On Mar 7, 2008, at 7:00, "H.J. Lu" <hjl.tools@gmail.com> wrote: > We can't fold glocal variables with NULL DECL_INITIAL. I am testing it > on Linux/x86 and Linux/Intel64 as well as 483.xalancbmk. OK to install > if all pass? > > > H.J. > ---- > gcc/testsuite/ > > 2008-03-07 H.J. Lu <hongjiu.lu@intel.com> > > PR tree-optimization/35494 > * g++.dg/tree-ssa/ssa-store-ccp-1.C: New. > * gcc.dg/tree-ssa/ssa-store-ccp-2.c: Likewise. > > gcc/ > > 2008-03-07 H.J. Lu <hongjiu.lu@intel.com> > > PR tree-optimization/35494 > * tree-ssa-ccp.c (get_symbol_constant_value): Only fold local > variables with NULL DECL_INITIAL. > > --- gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C.local > 2008-03-07 06:45:42.000000000 -0800 > +++ gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C 2008-03-07 > 06:44:53.000000000 -0800 > @@ -0,0 +1,19 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > + > +class bar > +{ > +public: > + static const int conststaticvariable; > +}; > + > + > +int f(void) > +{ > + return bar::conststaticvariable; > +} > + > +/* There should be a reference to conststaticvariable since it is > + global. */ > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 > "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c.local > 2008-03-07 06:58:07.000000000 -0800 > +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c 2008-03-07 > 06:58:38.000000000 -0800 > @@ -0,0 +1,14 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > + > +const int conststaticvariable; > + > +int f(void) > +{ > + return conststaticvariable; > +} > + > +/* There should be 1 reference to conststaticvariable since it is > + global. */ > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 > "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/tree-ssa-ccp.c.local 2008-03-06 14:18:27.000000000 -0800 > +++ gcc/tree-ssa-ccp.c 2008-03-07 06:21:57.000000000 -0800 > @@ -306,9 +306,10 @@ get_symbol_constant_value (tree sym) > if (val > && ccp_decl_initial_min_invariant (val)) > return val; > - /* Variables declared 'const' without an initializer > + /* Local variables declared 'const' without an initializer > have zero as the intializer. */ > if (!val > + && !TREE_PUBLIC (sym) This check should be early; for the case where it is initialized also. > > && (INTEGRAL_TYPE_P (TREE_TYPE (sym)) > || SCALAR_FLOAT_TYPE_P (TREE_TYPE (sym)))) > return fold_convert (TREE_TYPE (sym), integer_zero_node); ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk 2008-03-07 15:00 PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk H.J. Lu 2008-03-07 15:19 ` Richard Guenther 2008-03-07 16:39 ` Andrew Pinski @ 2008-03-07 17:00 ` Andrew Pinski 2008-03-07 19:11 ` H.J. Lu 2 siblings, 1 reply; 16+ messages in thread From: Andrew Pinski @ 2008-03-07 17:00 UTC (permalink / raw) To: H.J. Lu; +Cc: gcc-patches On 3/7/08, H.J. Lu <hjl.tools@gmail.com> wrote: > We can't fold glocal variables with NULL DECL_INITIAL. I am testing it > on Linux/x86 and Linux/Intel64 as well as 483.xalancbmk. OK to install > if all pass? This patch is wrong because currently we check TREE_STATIC which says we allocate space for the variable: /* In a VAR_DECL, nonzero means allocate static storage. In a FUNCTION_DECL, nonzero if function has been defined. In a CONSTRUCTOR, nonzero means allocate static storage. ??? This is also used in lots of other nodes in unclear ways which should be cleaned up some day. */ TREE_STATIC should not be set on those variables as there is no space allocated in the case of the C++ case (I think Ada case also). Also "const int conststaticvariable;" in C is global but it will be put in the common section and is called a tentative definition. So there needs to be another check for that instead of just TREE_PUBLIC. That is if you compile: const int conststaticvariable; int f(void) { return conststaticvariable; } With -fno-common, the tentative definition is no longer one and we should be able to optimize it. Thanks, Andrew Pinski ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk 2008-03-07 17:00 ` Andrew Pinski @ 2008-03-07 19:11 ` H.J. Lu 2008-03-07 22:07 ` H.J. Lu 0 siblings, 1 reply; 16+ messages in thread From: H.J. Lu @ 2008-03-07 19:11 UTC (permalink / raw) To: Andrew Pinski; +Cc: gcc-patches [-- Attachment #1: Type: text/plain, Size: 1584 bytes --] Compiler will allocate space for const int conststaticvariable; You just may not know what value will be in all cases. Here is the updated with additional testcases. OK to install if tests on Linux/x86 and Linux/Intel64 as well as 483.xalancbmk passes? H.J. On Fri, Mar 7, 2008 at 9:00 AM, Andrew Pinski <pinskia@gmail.com> wrote: > On 3/7/08, H.J. Lu <hjl.tools@gmail.com> wrote: > > We can't fold glocal variables with NULL DECL_INITIAL. I am testing it > > on Linux/x86 and Linux/Intel64 as well as 483.xalancbmk. OK to install > > if all pass? > > This patch is wrong because currently we check TREE_STATIC which says > we allocate space for the variable: > /* In a VAR_DECL, nonzero means allocate static storage. > In a FUNCTION_DECL, nonzero if function has been defined. > In a CONSTRUCTOR, nonzero means allocate static storage. > > ??? This is also used in lots of other nodes in unclear ways which > should be cleaned up some day. */ > > TREE_STATIC should not be set on those variables as there is no space > allocated in the case of the C++ case (I think Ada case also). > > Also "const int conststaticvariable;" in C is global but it will be > put in the common section and is called a tentative definition. So > there needs to be another check for that instead of just TREE_PUBLIC. > That is if you compile: > > const int conststaticvariable; > > int f(void) > { > return conststaticvariable; > } > With -fno-common, the tentative definition is no longer one and we > should be able to optimize it. > > Thanks, > Andrew Pinski > [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: gcc-local-3.patch --] [-- Type: text/x-patch; name=gcc-local-3.patch, Size: 3601 bytes --] gcc/testsuite/ 2008-03-07 H.J. Lu <hongjiu.lu@intel.com> PR tree-optimization/35494 * g++.dg/tree-ssa/ssa-store-ccp-1.C: New. * gcc.dg/tree-ssa/ssa-store-ccp-2.c: Likewise. * gcc.dg/tree-ssa/ssa-store-ccp-3.c: Likewise. * gcc.dg/tree-ssa/ssa-store-ccp-4.c: Likewise. gcc/ 2008-03-07 H.J. Lu <hongjiu.lu@intel.com> PR tree-optimization/35494 * tree-ssa-ccp.c (get_symbol_constant_value): Only fold local variables with NULL DECL_INITIAL. --- gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C.local 2008-03-07 09:28:35.000000000 -0800 +++ gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C 2008-03-07 09:28:35.000000000 -0800 @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +class bar +{ +public: + static const int conststaticvariable; +}; + + +int f(void) +{ + return bar::conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it is + global. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c.local 2008-03-07 09:28:35.000000000 -0800 +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c 2008-03-07 09:28:35.000000000 -0800 @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +const int conststaticvariable; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it is + global. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-3.c.local 2008-03-07 09:34:05.000000000 -0800 +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-3.c 2008-03-07 09:57:03.000000000 -0800 @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-common -fdump-tree-optimized" } */ + +const int conststaticvariable; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be no reference to conststaticvariable as we should have + inlined the 0. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 0 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-4.c.local 2008-03-07 11:03:04.000000000 -0800 +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-4.c 2008-03-07 11:02:00.000000000 -0800 @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target fpic } */ +/* { dg-options "-O2 -fno-common -fpic -fdump-tree-optimized" } */ + +const int conststaticvariable; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it is + global. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/tree-ssa-ccp.c.local 2008-03-07 09:02:37.000000000 -0800 +++ gcc/tree-ssa-ccp.c 2008-03-07 10:59:07.000000000 -0800 @@ -306,9 +306,12 @@ get_symbol_constant_value (tree sym) if (val && ccp_decl_initial_min_invariant (val)) return val; - /* Variables declared 'const' without an initializer + /* Local variables declared 'const' without an initializer have zero as the intializer. */ if (!val + && (!TREE_PUBLIC (sym) + || (!DECL_EXTERNAL (sym) + && targetm.binds_local_p (sym))) && (INTEGRAL_TYPE_P (TREE_TYPE (sym)) || SCALAR_FLOAT_TYPE_P (TREE_TYPE (sym)))) return fold_convert (TREE_TYPE (sym), integer_zero_node); ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk 2008-03-07 19:11 ` H.J. Lu @ 2008-03-07 22:07 ` H.J. Lu 2008-03-08 20:44 ` Richard Guenther 0 siblings, 1 reply; 16+ messages in thread From: H.J. Lu @ 2008-03-07 22:07 UTC (permalink / raw) To: GCC Patches On Fri, Mar 7, 2008 at 11:11 AM, H.J. Lu <hjl.tools@gmail.com> wrote: > Compiler will allocate space for > > const int conststaticvariable; > > You just may not know what value will be in all cases. Here is the > updated with additional testcases. OK to install if tests on Linux/x86 > and Linux/Intel64 as well as 483.xalancbmk passes? > All tests are passed. OK to install on trunk? H.J. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk 2008-03-07 22:07 ` H.J. Lu @ 2008-03-08 20:44 ` Richard Guenther 2008-03-08 23:16 ` H.J. Lu 0 siblings, 1 reply; 16+ messages in thread From: Richard Guenther @ 2008-03-08 20:44 UTC (permalink / raw) To: H.J. Lu; +Cc: GCC Patches On Fri, Mar 7, 2008 at 11:07 PM, H.J. Lu <hjl.tools@gmail.com> wrote: > On Fri, Mar 7, 2008 at 11:11 AM, H.J. Lu <hjl.tools@gmail.com> wrote: > > Compiler will allocate space for > > > > const int conststaticvariable; > > > > You just may not know what value will be in all cases. Here is the > > updated with additional testcases. OK to install if tests on Linux/x86 > > and Linux/Intel64 as well as 483.xalancbmk passes? > > > > All tests are passed. OK to install on trunk? Yes. Thanks, Richard. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk 2008-03-08 20:44 ` Richard Guenther @ 2008-03-08 23:16 ` H.J. Lu 2008-03-08 23:32 ` Andrew Pinski 0 siblings, 1 reply; 16+ messages in thread From: H.J. Lu @ 2008-03-08 23:16 UTC (permalink / raw) To: Richard Guenther; +Cc: GCC Patches On Sat, Mar 08, 2008 at 09:44:13PM +0100, Richard Guenther wrote: > On Fri, Mar 7, 2008 at 11:07 PM, H.J. Lu <hjl.tools@gmail.com> wrote: > > On Fri, Mar 7, 2008 at 11:11 AM, H.J. Lu <hjl.tools@gmail.com> wrote: > > > Compiler will allocate space for > > > > > > const int conststaticvariable; > > > > > > You just may not know what value will be in all cases. Here is the > > > updated with additional testcases. OK to install if tests on Linux/x86 > > > and Linux/Intel64 as well as 483.xalancbmk passes? > > > > > > > All tests are passed. OK to install on trunk? > > Yes. > It turns out to be a tricky issue. We need to check if a read-only symbol may be overridden at both run time and link time. I can't use targetm.binds_local_p since it only tells me if a symbol may be overridden at run time by another module. It returns fals positive for class Foo { public: static const int erf = 0; }; since C++ sets DECL_EXTERNAL to 1. Also it doesn't tell me if a symbol may be overridden by another definition at link time. I I opened PR 35501 for run time issue. I am testing this patch for both PR 35494 and 35501 on Linux/ia32 and Linux/Intel as well as 483.xalancbmk. OK to install if all tests pass? H.J. --- gcc/ 2008-03-08 H.J. Lu <hongjiu.lu@intel.com> PR tree-optimization/35501 * c-typeck.c (decl_constant_value): Check if value may be overriden at run time. * tree-ssa-sccvn.c (try_to_simplify): Likewise. PR tree-optimization/35494 PR tree-optimization/35501 * tree-ssa-ccp.c (get_symbol_constant_value): Check if value may be overriden at link and run time. gcc/testsuite/ 2008-03-07 H.J. Lu <hongjiu.lu@intel.com> PR tree-optimization/35494 * g++.dg/tree-ssa/ssa-store-ccp-1.C: New. * gcc.dg/tree-ssa/ssa-store-ccp-2.c: Likewise. * gcc.dg/tree-ssa/ssa-store-ccp-3.c: Likewise. * gcc.dg/tree-ssa/ssa-store-ccp-4.c: Likewise. PR tree-optimization/35501 * gcc.dg/pr35501-1.c: New. * gcc.dg/pr35501-2.c: Likewise. * gcc.dg/pr35501-3.c: Likewise. * gcc.dg/pr35501-4.c: Likewise. --- gcc/c-typeck.c.local 2008-02-26 09:27:22.000000000 -0800 +++ gcc/c-typeck.c 2008-03-08 14:44:29.000000000 -0800 @@ -1551,7 +1551,10 @@ decl_constant_value (tree decl) or a variable, then re-evaluating it could give different results. */ && TREE_CONSTANT (DECL_INITIAL (decl)) /* Check for cases where this is sub-optimal, even though valid. */ - && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR) + && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR + /* Check if it may be overriden at run time. */ + && (!flag_shlib + || DECL_VISIBILITY (decl) != VISIBILITY_DEFAULT)) return DECL_INITIAL (decl); return decl; } --- gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C.local 2008-03-08 14:44:29.000000000 -0800 +++ gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C 2008-03-08 14:48:55.000000000 -0800 @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +class bar +{ +public: + static const int conststaticvariable; +}; + + +int f(void) +{ + return bar::conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it may + be overriden at link time. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/pr35501-1.c.local 2008-03-08 14:44:29.000000000 -0800 +++ gcc/testsuite/gcc.dg/pr35501-1.c 2008-03-08 14:44:29.000000000 -0800 @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +const int conststaticvariable = 1; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be no reference to conststaticvariable as we should have + inlined the 0. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 0 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/pr35501-2.c.local 2008-03-08 14:44:29.000000000 -0800 +++ gcc/testsuite/gcc.dg/pr35501-2.c 2008-03-08 14:44:29.000000000 -0800 @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +const int conststaticvariable = 1; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be no reference to conststaticvariable as we should have + inlined the 0. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 0 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/pr35501-3.c.local 2008-03-08 14:44:29.000000000 -0800 +++ gcc/testsuite/gcc.dg/pr35501-3.c 2008-03-08 14:50:02.000000000 -0800 @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target fpic } */ +/* { dg-options "-O -fpic -fdump-tree-optimized" } */ + +const int conststaticvariable = 1; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it may + may be overriden at run time. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/pr35501-4.c.local 2008-03-08 14:44:29.000000000 -0800 +++ gcc/testsuite/gcc.dg/pr35501-4.c 2008-03-08 14:50:10.000000000 -0800 @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target fpic } */ +/* { dg-options "-O2 -fpic -fdump-tree-optimized" } */ + +const int conststaticvariable = 1; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it may + may be overriden at run time. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c.local 2008-03-08 14:44:29.000000000 -0800 +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c 2008-03-08 14:48:43.000000000 -0800 @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +const int conststaticvariable; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it may + may be overriden at link time. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-3.c.local 2008-03-08 14:44:29.000000000 -0800 +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-3.c 2008-03-08 14:44:29.000000000 -0800 @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-common -fdump-tree-optimized" } */ + +const int conststaticvariable; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be no reference to conststaticvariable as we should have + inlined the 0. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 0 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-4.c.local 2008-03-08 14:44:29.000000000 -0800 +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-4.c 2008-03-08 14:49:35.000000000 -0800 @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target fpic } */ +/* { dg-options "-O2 -fno-common -fpic -fdump-tree-optimized" } */ + +const int conststaticvariable; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it may + may be overriden at run time. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/tree-ssa-ccp.c.local 2008-03-07 09:02:37.000000000 -0800 +++ gcc/tree-ssa-ccp.c 2008-03-08 14:52:43.000000000 -0800 @@ -300,15 +300,21 @@ get_symbol_constant_value (tree sym) { if (TREE_STATIC (sym) && TREE_READONLY (sym) - && !MTAG_P (sym)) + && !MTAG_P (sym) + /* Check if a read-only definition may be overridden at + run time. */ + && (!flag_shlib + || DECL_VISIBILITY (sym) != VISIBILITY_DEFAULT)) { tree val = DECL_INITIAL (sym); if (val && ccp_decl_initial_min_invariant (val)) return val; - /* Variables declared 'const' without an initializer - have zero as the intializer. */ + /* Variables declared 'const' without an initializer have + zero as the intializer if it won't be overridden at + link time. */ if (!val + && (!TREE_PUBLIC (sym) || !DECL_EXTERNAL (sym)) && (INTEGRAL_TYPE_P (TREE_TYPE (sym)) || SCALAR_FLOAT_TYPE_P (TREE_TYPE (sym)))) return fold_convert (TREE_TYPE (sym), integer_zero_node); --- gcc/tree-ssa-sccvn.c.local 2008-03-08 14:41:18.000000000 -0800 +++ gcc/tree-ssa-sccvn.c 2008-03-08 14:44:29.000000000 -0800 @@ -1453,6 +1453,9 @@ try_to_simplify (tree stmt, tree rhs) if (TREE_READONLY (rhs) && TREE_STATIC (rhs) && DECL_INITIAL (rhs) + /* Check if it may be overriden at run time. */ + && (!flag_shlib + || DECL_VISIBILITY (rhs) != VISIBILITY_DEFAULT) && valid_gimple_expression_p (DECL_INITIAL (rhs))) return DECL_INITIAL (rhs); ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk 2008-03-08 23:16 ` H.J. Lu @ 2008-03-08 23:32 ` Andrew Pinski 2008-03-08 23:47 ` H.J. Lu 0 siblings, 1 reply; 16+ messages in thread From: Andrew Pinski @ 2008-03-08 23:32 UTC (permalink / raw) To: H.J. Lu; +Cc: Richard Guenther, GCC Patches Sent from my iPhone On Mar 8, 2008, at 15:15, "H.J. Lu" <hjl.tools@gmail.com> wrote: > On Sat, Mar 08, 2008 at 09:44:13PM +0100, Richard Guenther wrote: >> On Fri, Mar 7, 2008 at 11:07 PM, H.J. Lu <hjl.tools@gmail.com> wrote: >>> On Fri, Mar 7, 2008 at 11:11 AM, H.J. Lu <hjl.tools@gmail.com> >>> wrote: >>>> Compiler will allocate space for >>>> >>>> const int conststaticvariable; >>>> >>>> You just may not know what value will be in all cases. Here is the >>>> updated with additional testcases. OK to install if tests on >>>> Linux/x86 >>>> and Linux/Intel64 as well as 483.xalancbmk passes? >>>> >>> >>> All tests are passed. OK to install on trunk? >> >> Yes. >> > > It turns out to be a tricky issue. We need to check if a read-only > symbol may be overridden at both run time and link time. I can't > use targetm.binds_local_p since it only tells me if a symbol may be > overridden at run time by another module. It returns fals positive > for > > class Foo { > public: > static const int erf = 0; > }; > > since C++ sets DECL_EXTERNAL to 1. Also it doesn't tell me if a > symbol may be overridden by another definition at link time. I > > I opened PR 35501 for run time issue. I am testing this patch for > both PR 35494 and 35501 on Linux/ia32 and Linux/Intel as well as > 483.xalancbmk. OK to install if all tests pass? > > > H.J. > --- > gcc/ > > 2008-03-08 H.J. Lu <hongjiu.lu@intel.com> > > PR tree-optimization/35501 > * c-typeck.c (decl_constant_value): Check if value may be > overriden at run time. > * tree-ssa-sccvn.c (try_to_simplify): Likewise. > > PR tree-optimization/35494 > PR tree-optimization/35501 > * tree-ssa-ccp.c (get_symbol_constant_value): Check if value > may be overriden at link and run time. > > gcc/testsuite/ > > 2008-03-07 H.J. Lu <hongjiu.lu@intel.com> > > PR tree-optimization/35494 > * g++.dg/tree-ssa/ssa-store-ccp-1.C: New. > * gcc.dg/tree-ssa/ssa-store-ccp-2.c: Likewise. > * gcc.dg/tree-ssa/ssa-store-ccp-3.c: Likewise. > * gcc.dg/tree-ssa/ssa-store-ccp-4.c: Likewise. > > PR tree-optimization/35501 > * gcc.dg/pr35501-1.c: New. > * gcc.dg/pr35501-2.c: Likewise. > * gcc.dg/pr35501-3.c: Likewise. > * gcc.dg/pr35501-4.c: Likewise. > > --- gcc/c-typeck.c.local 2008-02-26 09:27:22.000000000 -0800 > +++ gcc/c-typeck.c 2008-03-08 14:44:29.000000000 -0800 > @@ -1551,7 +1551,10 @@ decl_constant_value (tree decl) > or a variable, then re-evaluating it could give different > results. */ > && TREE_CONSTANT (DECL_INITIAL (decl)) > /* Check for cases where this is sub-optimal, even though > valid. */ > - && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR) > + && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR > + /* Check if it may be overriden at run time. */ > + && (!flag_shlib > + || DECL_VISIBILITY (decl) != VISIBILITY_DEFAULT)) > return DECL_INITIAL (decl); This is only true with elf semantics; mach-o semantics say that a variable in a shared library is not overwritable. > > return decl; > } > --- gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C.local > 2008-03-08 14:44:29.000000000 -0800 > +++ gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C 2008-03-08 > 14:48:55.000000000 -0800 > @@ -0,0 +1,19 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > + > +class bar > +{ > +public: > + static const int conststaticvariable; > +}; > + > + > +int f(void) > +{ > + return bar::conststaticvariable; > +} > + > +/* There should be a reference to conststaticvariable since it may > + be overriden at link time. */ > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 > "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/testsuite/gcc.dg/pr35501-1.c.local 2008-03-08 14:44:29.000000000 -0800 > +++ gcc/testsuite/gcc.dg/pr35501-1.c 2008-03-08 14:44:29.000000000 -0800 > @@ -0,0 +1,14 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O -fdump-tree-optimized" } */ > + > +const int conststaticvariable = 1; > + > +int f(void) > +{ > + return conststaticvariable; > +} > + > +/* There should be no reference to conststaticvariable as we should > have > + inlined the 0. */ > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 0 > "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/testsuite/gcc.dg/pr35501-2.c.local 2008-03-08 14:44:29.000000000 -0800 > +++ gcc/testsuite/gcc.dg/pr35501-2.c 2008-03-08 14:44:29.000000000 -0800 > @@ -0,0 +1,14 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > + > +const int conststaticvariable = 1; > + > +int f(void) > +{ > + return conststaticvariable; > +} > + > +/* There should be no reference to conststaticvariable as we should > have > + inlined the 0. */ > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 0 > "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/testsuite/gcc.dg/pr35501-3.c.local 2008-03-08 14:44:29.000000000 -0800 > +++ gcc/testsuite/gcc.dg/pr35501-3.c 2008-03-08 14:50:02.000000000 -0800 > @@ -0,0 +1,15 @@ > +/* { dg-do compile } */ > +/* { dg-require-effective-target fpic } */ > +/* { dg-options "-O -fpic -fdump-tree-optimized" } */ > + > +const int conststaticvariable = 1; > + > +int f(void) > +{ > + return conststaticvariable; > +} > + > +/* There should be a reference to conststaticvariable since it may > + may be overriden at run time. */ > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 > "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/testsuite/gcc.dg/pr35501-4.c.local 2008-03-08 14:44:29.000000000 -0800 > +++ gcc/testsuite/gcc.dg/pr35501-4.c 2008-03-08 14:50:10.000000000 -0800 > @@ -0,0 +1,15 @@ > +/* { dg-do compile } */ > +/* { dg-require-effective-target fpic } */ > +/* { dg-options "-O2 -fpic -fdump-tree-optimized" } */ > + > +const int conststaticvariable = 1; > + > +int f(void) > +{ > + return conststaticvariable; > +} > + > +/* There should be a reference to conststaticvariable since it may > + may be overriden at run time. */ > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 > "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c.local > 2008-03-08 14:44:29.000000000 -0800 > +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c 2008-03-08 > 14:48:43.000000000 -0800 > @@ -0,0 +1,14 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > + > +const int conststaticvariable; > + > +int f(void) > +{ > + return conststaticvariable; > +} > + > +/* There should be a reference to conststaticvariable since it may > + may be overriden at link time. */ > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 > "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-3.c.local > 2008-03-08 14:44:29.000000000 -0800 > +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-3.c 2008-03-08 > 14:44:29.000000000 -0800 > @@ -0,0 +1,14 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fno-common -fdump-tree-optimized" } */ > + > +const int conststaticvariable; > + > +int f(void) > +{ > + return conststaticvariable; > +} > + > +/* There should be no reference to conststaticvariable as we should > have > + inlined the 0. */ > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 0 > "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-4.c.local > 2008-03-08 14:44:29.000000000 -0800 > +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-4.c 2008-03-08 > 14:49:35.000000000 -0800 > @@ -0,0 +1,15 @@ > +/* { dg-do compile } */ > +/* { dg-require-effective-target fpic } */ > +/* { dg-options "-O2 -fno-common -fpic -fdump-tree-optimized" } */ > + > +const int conststaticvariable; > + > +int f(void) > +{ > + return conststaticvariable; > +} > + > +/* There should be a reference to conststaticvariable since it may > + may be overriden at run time. */ > +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 > "optimized"} } */ > +/* { dg-final { cleanup-tree-dump "optimized" } } */ > --- gcc/tree-ssa-ccp.c.local 2008-03-07 09:02:37.000000000 -0800 > +++ gcc/tree-ssa-ccp.c 2008-03-08 14:52:43.000000000 -0800 > @@ -300,15 +300,21 @@ get_symbol_constant_value (tree sym) > { > if (TREE_STATIC (sym) > && TREE_READONLY (sym) > - && !MTAG_P (sym)) > + && !MTAG_P (sym) > + /* Check if a read-only definition may be overridden at > + run time. */ > + && (!flag_shlib > + || DECL_VISIBILITY (sym) != VISIBILITY_DEFAULT)) > { > tree val = DECL_INITIAL (sym); > if (val > && ccp_decl_initial_min_invariant (val)) > return val; > - /* Variables declared 'const' without an initializer > - have zero as the intializer. */ > + /* Variables declared 'const' without an initializer have > + zero as the intializer if it won't be overridden at > + link time. */ > if (!val > + && (!TREE_PUBLIC (sym) || !DECL_EXTERNAL (sym)) > && (INTEGRAL_TYPE_P (TREE_TYPE (sym)) > || SCALAR_FLOAT_TYPE_P (TREE_TYPE (sym)))) > return fold_convert (TREE_TYPE (sym), integer_zero_node); > --- gcc/tree-ssa-sccvn.c.local 2008-03-08 14:41:18.000000000 -0800 > +++ gcc/tree-ssa-sccvn.c 2008-03-08 14:44:29.000000000 -0800 > @@ -1453,6 +1453,9 @@ try_to_simplify (tree stmt, tree rhs) > if (TREE_READONLY (rhs) > && TREE_STATIC (rhs) > && DECL_INITIAL (rhs) > + /* Check if it may be overriden at run time. */ > + && (!flag_shlib > + || DECL_VISIBILITY (rhs) != VISIBILITY_DEFAULT) > && valid_gimple_expression_p (DECL_INITIAL (rhs))) > return DECL_INITIAL (rhs); > ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk 2008-03-08 23:32 ` Andrew Pinski @ 2008-03-08 23:47 ` H.J. Lu 2008-03-09 0:12 ` H.J. Lu 0 siblings, 1 reply; 16+ messages in thread From: H.J. Lu @ 2008-03-08 23:47 UTC (permalink / raw) To: Andrew Pinski; +Cc: Richard Guenther, GCC Patches On Sat, Mar 8, 2008 at 3:31 PM, Andrew Pinski <pinskia@gmail.com> wrote: > > > Sent from my iPhone > > > > On Mar 8, 2008, at 15:15, "H.J. Lu" <hjl.tools@gmail.com> wrote: > > > On Sat, Mar 08, 2008 at 09:44:13PM +0100, Richard Guenther wrote: > >> On Fri, Mar 7, 2008 at 11:07 PM, H.J. Lu <hjl.tools@gmail.com> wrote: > >>> On Fri, Mar 7, 2008 at 11:11 AM, H.J. Lu <hjl.tools@gmail.com> > >>> wrote: > >>>> Compiler will allocate space for > >>>> > >>>> const int conststaticvariable; > >>>> > >>>> You just may not know what value will be in all cases. Here is the > >>>> updated with additional testcases. OK to install if tests on > >>>> Linux/x86 > >>>> and Linux/Intel64 as well as 483.xalancbmk passes? > >>>> > >>> > >>> All tests are passed. OK to install on trunk? > >> > >> Yes. > >> > > > > It turns out to be a tricky issue. We need to check if a read-only > > symbol may be overridden at both run time and link time. I can't > > use targetm.binds_local_p since it only tells me if a symbol may be > > overridden at run time by another module. It returns fals positive > > for > > > > class Foo { > > public: > > static const int erf = 0; > > }; > > > > since C++ sets DECL_EXTERNAL to 1. Also it doesn't tell me if a > > symbol may be overridden by another definition at link time. I > > > > I opened PR 35501 for run time issue. I am testing this patch for > > both PR 35494 and 35501 on Linux/ia32 and Linux/Intel as well as > > 483.xalancbmk. OK to install if all tests pass? > > > > > > H.J. > > --- > > gcc/ > > > > 2008-03-08 H.J. Lu <hongjiu.lu@intel.com> > > > > PR tree-optimization/35501 > > * c-typeck.c (decl_constant_value): Check if value may be > > overriden at run time. > > * tree-ssa-sccvn.c (try_to_simplify): Likewise. > > > > PR tree-optimization/35494 > > PR tree-optimization/35501 > > * tree-ssa-ccp.c (get_symbol_constant_value): Check if value > > may be overriden at link and run time. > > > > gcc/testsuite/ > > > > 2008-03-07 H.J. Lu <hongjiu.lu@intel.com> > > > > PR tree-optimization/35494 > > * g++.dg/tree-ssa/ssa-store-ccp-1.C: New. > > * gcc.dg/tree-ssa/ssa-store-ccp-2.c: Likewise. > > * gcc.dg/tree-ssa/ssa-store-ccp-3.c: Likewise. > > * gcc.dg/tree-ssa/ssa-store-ccp-4.c: Likewise. > > > > PR tree-optimization/35501 > > * gcc.dg/pr35501-1.c: New. > > * gcc.dg/pr35501-2.c: Likewise. > > * gcc.dg/pr35501-3.c: Likewise. > > * gcc.dg/pr35501-4.c: Likewise. > > > > --- gcc/c-typeck.c.local 2008-02-26 09:27:22.000000000 -0800 > > +++ gcc/c-typeck.c 2008-03-08 14:44:29.000000000 -0800 > > @@ -1551,7 +1551,10 @@ decl_constant_value (tree decl) > > or a variable, then re-evaluating it could give different > > results. */ > > && TREE_CONSTANT (DECL_INITIAL (decl)) > > /* Check for cases where this is sub-optimal, even though > > valid. */ > > - && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR) > > + && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR > > + /* Check if it may be overriden at run time. */ > > + && (!flag_shlib > > + || DECL_VISIBILITY (decl) != VISIBILITY_DEFAULT)) > > return DECL_INITIAL (decl); > > This is only true with elf semantics; mach-o semantics say that a > variable in a shared library is not overwritable. > > Do we have a function which returns if a definition may be overridden at run-time? H.J. ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk 2008-03-08 23:47 ` H.J. Lu @ 2008-03-09 0:12 ` H.J. Lu 2008-03-09 5:31 ` H.J. Lu 0 siblings, 1 reply; 16+ messages in thread From: H.J. Lu @ 2008-03-09 0:12 UTC (permalink / raw) To: Andrew Pinski; +Cc: Richard Guenther, GCC Patches On Sat, Mar 08, 2008 at 03:46:38PM -0800, H.J. Lu wrote: > On Sat, Mar 8, 2008 at 3:31 PM, Andrew Pinski <pinskia@gmail.com> wrote: > > This is only true with elf semantics; mach-o semantics say that a > > variable in a shared library is not overwritable. > > > > > > Do we have a function which returns if a definition may be overridden > at run-time? > Here is a patch to modify default_binds_local_p_1 to handle read-only symbol with initializer. H.J. --- gcc/ 2008-03-08 H.J. Lu <hongjiu.lu@intel.com> PR tree-optimization/35501 * c-typeck.c (decl_constant_value): Check if value may be overriden at run time. * tree-ssa-sccvn.c: Include "target.h". (try_to_simplify):Check if value may be overriden at run time. * varasm.c (default_binds_local_p_1): Return false for DECL_EXTERNAL only if it isn't read-only with initializer. PR tree-optimization/35494 PR tree-optimization/35501 * tree-ssa-ccp.c (get_symbol_constant_value): Check if value may be overriden at link and run time. gcc/testsuite/ 2008-03-07 H.J. Lu <hongjiu.lu@intel.com> PR tree-optimization/35494 * g++.dg/tree-ssa/ssa-store-ccp-1.C: New. * gcc.dg/tree-ssa/ssa-store-ccp-2.c: Likewise. * gcc.dg/tree-ssa/ssa-store-ccp-3.c: Likewise. * gcc.dg/tree-ssa/ssa-store-ccp-4.c: Likewise. PR tree-optimization/35501 * gcc.dg/pr35501-1.c: New. * gcc.dg/pr35501-2.c: Likewise. * gcc.dg/pr35501-3.c: Likewise. * gcc.dg/pr35501-4.c: Likewise. --- gcc/c-typeck.c.local 2008-02-26 09:27:22.000000000 -0800 +++ gcc/c-typeck.c 2008-03-08 16:02:32.000000000 -0800 @@ -1551,7 +1551,9 @@ decl_constant_value (tree decl) or a variable, then re-evaluating it could give different results. */ && TREE_CONSTANT (DECL_INITIAL (decl)) /* Check for cases where this is sub-optimal, even though valid. */ - && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR) + && TREE_CODE (DECL_INITIAL (decl)) != CONSTRUCTOR + /* Check if it may be overriden at run time. */ + && targetm.binds_local_p (decl)) return DECL_INITIAL (decl); return decl; } --- gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C.local 2008-03-08 14:44:29.000000000 -0800 +++ gcc/testsuite/g++.dg/tree-ssa/ssa-store-ccp-1.C 2008-03-08 14:48:55.000000000 -0800 @@ -0,0 +1,19 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +class bar +{ +public: + static const int conststaticvariable; +}; + + +int f(void) +{ + return bar::conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it may + be overriden at link time. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/pr35501-1.c.local 2008-03-08 14:44:29.000000000 -0800 +++ gcc/testsuite/gcc.dg/pr35501-1.c 2008-03-08 14:44:29.000000000 -0800 @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-optimized" } */ + +const int conststaticvariable = 1; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be no reference to conststaticvariable as we should have + inlined the 0. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 0 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/pr35501-2.c.local 2008-03-08 14:44:29.000000000 -0800 +++ gcc/testsuite/gcc.dg/pr35501-2.c 2008-03-08 14:44:29.000000000 -0800 @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +const int conststaticvariable = 1; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be no reference to conststaticvariable as we should have + inlined the 0. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 0 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/pr35501-3.c.local 2008-03-08 14:44:29.000000000 -0800 +++ gcc/testsuite/gcc.dg/pr35501-3.c 2008-03-08 14:50:02.000000000 -0800 @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target fpic } */ +/* { dg-options "-O -fpic -fdump-tree-optimized" } */ + +const int conststaticvariable = 1; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it may + may be overriden at run time. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/pr35501-4.c.local 2008-03-08 14:44:29.000000000 -0800 +++ gcc/testsuite/gcc.dg/pr35501-4.c 2008-03-08 14:50:10.000000000 -0800 @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target fpic } */ +/* { dg-options "-O2 -fpic -fdump-tree-optimized" } */ + +const int conststaticvariable = 1; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it may + may be overriden at run time. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c.local 2008-03-08 14:44:29.000000000 -0800 +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-2.c 2008-03-08 14:48:43.000000000 -0800 @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +const int conststaticvariable; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it may + may be overriden at link time. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-3.c.local 2008-03-08 14:44:29.000000000 -0800 +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-3.c 2008-03-08 14:44:29.000000000 -0800 @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-common -fdump-tree-optimized" } */ + +const int conststaticvariable; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be no reference to conststaticvariable as we should have + inlined the 0. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 0 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-4.c.local 2008-03-08 14:44:29.000000000 -0800 +++ gcc/testsuite/gcc.dg/tree-ssa/ssa-store-ccp-4.c 2008-03-08 14:49:35.000000000 -0800 @@ -0,0 +1,15 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target fpic } */ +/* { dg-options "-O2 -fno-common -fpic -fdump-tree-optimized" } */ + +const int conststaticvariable; + +int f(void) +{ + return conststaticvariable; +} + +/* There should be a reference to conststaticvariable since it may + may be overriden at run time. */ +/* { dg-final { scan-tree-dump-times "conststaticvariable" 1 "optimized"} } */ +/* { dg-final { cleanup-tree-dump "optimized" } } */ --- gcc/tree-ssa-ccp.c.local 2008-03-07 09:02:37.000000000 -0800 +++ gcc/tree-ssa-ccp.c 2008-03-08 16:03:48.000000000 -0800 @@ -300,15 +300,20 @@ get_symbol_constant_value (tree sym) { if (TREE_STATIC (sym) && TREE_READONLY (sym) - && !MTAG_P (sym)) + && !MTAG_P (sym) + /* Check if a read-only definition may be overridden at + run time. */ + && targetm.binds_local_p (sym)) { tree val = DECL_INITIAL (sym); if (val && ccp_decl_initial_min_invariant (val)) return val; - /* Variables declared 'const' without an initializer - have zero as the intializer. */ + /* Variables declared 'const' without an initializer have + zero as the intializer if it won't be overridden at + link time. */ if (!val + && (!TREE_PUBLIC (sym) || !DECL_EXTERNAL (sym)) && (INTEGRAL_TYPE_P (TREE_TYPE (sym)) || SCALAR_FLOAT_TYPE_P (TREE_TYPE (sym)))) return fold_convert (TREE_TYPE (sym), integer_zero_node); --- gcc/tree-ssa-sccvn.c.local 2008-03-08 14:41:18.000000000 -0800 +++ gcc/tree-ssa-sccvn.c 2008-03-08 16:04:07.000000000 -0800 @@ -45,6 +45,7 @@ along with GCC; see the file COPYING3. #include "params.h" #include "tree-ssa-propagate.h" #include "tree-ssa-sccvn.h" +#include "target.h" /* This algorithm is based on the SCC algorithm presented by Keith Cooper and L. Taylor Simpson in "SCC-Based Value numbering" @@ -1453,6 +1454,8 @@ try_to_simplify (tree stmt, tree rhs) if (TREE_READONLY (rhs) && TREE_STATIC (rhs) && DECL_INITIAL (rhs) + /* Check if it may be overriden at run time. */ + && targetm.binds_local_p (rhs) && valid_gimple_expression_p (DECL_INITIAL (rhs))) return DECL_INITIAL (rhs); --- gcc/varasm.c.local 2007-12-05 17:04:34.000000000 -0800 +++ gcc/varasm.c 2008-03-08 16:01:10.000000000 -0800 @@ -6186,7 +6186,10 @@ default_binds_local_p_1 (const_tree exp, && DECL_VISIBILITY (exp) != VISIBILITY_DEFAULT) local_p = true; /* Variables defined outside this object might not be local. */ - else if (DECL_EXTERNAL (exp)) + else if (DECL_EXTERNAL (exp) + && (!TREE_READONLY (exp) + || !TREE_STATIC (exp) + || !DECL_INITIAL (exp))) local_p = false; /* If defined in this object and visibility is not default, must be local. */ ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk 2008-03-09 0:12 ` H.J. Lu @ 2008-03-09 5:31 ` H.J. Lu 0 siblings, 0 replies; 16+ messages in thread From: H.J. Lu @ 2008-03-09 5:31 UTC (permalink / raw) To: Andrew Pinski; +Cc: Richard Guenther, GCC Patches On Sat, Mar 8, 2008 at 4:12 PM, H.J. Lu <hjl.tools@gmail.com> wrote: > On Sat, Mar 08, 2008 at 03:46:38PM -0800, H.J. Lu wrote: > > On Sat, Mar 8, 2008 at 3:31 PM, Andrew Pinski <pinskia@gmail.com> wrote: > > > > This is only true with elf semantics; mach-o semantics say that a > > > variable in a shared library is not overwritable. > > > > > > > > > > Do we have a function which returns if a definition may be overridden > > at run-time? > > > > Here is a patch to modify default_binds_local_p_1 to handle > read-only symbol with initializer. > > > > H.J. > --- > gcc/ > > 2008-03-08 H.J. Lu <hongjiu.lu@intel.com> > > PR tree-optimization/35501 > * c-typeck.c (decl_constant_value): Check if value may be > overriden at run time. > > * tree-ssa-sccvn.c: Include "target.h". > (try_to_simplify):Check if value may be overriden at run time. > > * varasm.c (default_binds_local_p_1): Return false for > DECL_EXTERNAL only if it isn't read-only with initializer. > > > PR tree-optimization/35494 > PR tree-optimization/35501 > * tree-ssa-ccp.c (get_symbol_constant_value): Check if value > may be overriden at link and run time. > > gcc/testsuite/ > > 2008-03-07 H.J. Lu <hongjiu.lu@intel.com> > > PR tree-optimization/35494 > * g++.dg/tree-ssa/ssa-store-ccp-1.C: New. > * gcc.dg/tree-ssa/ssa-store-ccp-2.c: Likewise. > * gcc.dg/tree-ssa/ssa-store-ccp-3.c: Likewise. > * gcc.dg/tree-ssa/ssa-store-ccp-4.c: Likewise. > > PR tree-optimization/35501 > * gcc.dg/pr35501-1.c: New. > * gcc.dg/pr35501-2.c: Likewise. > * gcc.dg/pr35501-3.c: Likewise. > * gcc.dg/pr35501-4.c: Likewise. > This patch passes all tests on Linux/ia32, Linux/Intel64 and 483.xalancbmk. H.J. ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2008-03-09 15:47 UTC | newest] Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2008-03-07 15:00 PATCH: PR tree-optimization/35494: [4.4 Regression]: Revision 132991 breaks 483.xalancbmk H.J. Lu 2008-03-07 15:19 ` Richard Guenther 2008-03-07 15:30 ` H.J. Lu 2008-03-07 15:40 ` Richard Guenther 2008-03-09 14:43 ` H.J. Lu 2008-03-09 15:47 ` H.J. Lu 2008-03-07 16:39 ` Andrew Pinski 2008-03-07 17:00 ` Andrew Pinski 2008-03-07 19:11 ` H.J. Lu 2008-03-07 22:07 ` H.J. Lu 2008-03-08 20:44 ` Richard Guenther 2008-03-08 23:16 ` H.J. Lu 2008-03-08 23:32 ` Andrew Pinski 2008-03-08 23:47 ` H.J. Lu 2008-03-09 0:12 ` H.J. Lu 2008-03-09 5:31 ` H.J. Lu
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).