diff options
author | Richard Biener <rguenther@suse.de> | 2022-12-13 14:24:02 +0100 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2022-12-13 14:36:02 +0100 |
commit | 8f4634fb82d5670183d0ee42de9dae3b55ab5087 (patch) | |
tree | 6cbcf2f4ba649ad9d793c0a08d5f590951fe74f1 | |
parent | edc676cfe8988c62c81b0df224c7fe82583012b1 (diff) | |
download | gcc-8f4634fb82d5670183d0ee42de9dae3b55ab5087.zip gcc-8f4634fb82d5670183d0ee42de9dae3b55ab5087.tar.gz gcc-8f4634fb82d5670183d0ee42de9dae3b55ab5087.tar.bz2 |
tree-optimization/105801 - CCP and .DEFERRED_INIT
This makes sure we treat .DEFERRED_INIT as producing UNDEFINED so
we can continue optimizing uninitialized uses the same as without
-ftrivial-auto-var-init=zero. For the testcase this means we
catch the return 1 optimization opportunity at CCP rather than
only at FRE which already does the right thing here.
PR tree-optimization/105801
* tree-ssa-ccp.cc (likely_value): .DEFERRED_INIT produces
UNDEFINED.
* doc/invoke.texi (ftrivial-auto-var-init): Explicitely
mention we treat variables without an initializer as
undefined also for optimization purposes.
* gcc.dg/tree-ssa/ssa-ccp-43.c: New testcase.
-rw-r--r-- | gcc/doc/invoke.texi | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-43.c | 12 | ||||
-rw-r--r-- | gcc/tree-ssa-ccp.cc | 4 |
3 files changed, 18 insertions, 1 deletions
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index cb40b38..1337197 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -13208,7 +13208,8 @@ disclosure and use. GCC still considers an automatic variable that doesn't have an explicit initializer as uninitialized, @option{-Wuninitialized} and @option{-Wanalyzer-use-of-uninitialized-value} will still report -warning messages on such automatic variables. +warning messages on such automatic variables and the compiler will +perform optimization as if the variable were uninitialized. With this option, GCC will also initialize any padding of automatic variables that have structure or union types to zeroes. However, the current implementation cannot initialize automatic variables that diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-43.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-43.c new file mode 100644 index 0000000..3e0a3d6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-ccp-43.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O -ftrivial-auto-var-init=zero -fdump-tree-ccp1" } */ + +int foo (int flag) +{ + int i; + if (flag) + i = 1; + return i; +} + +/* { dg-final { scan-tree-dump "return 1;" "ccp1" } } */ diff --git a/gcc/tree-ssa-ccp.cc b/gcc/tree-ssa-ccp.cc index 68e69bf..0d47289 100644 --- a/gcc/tree-ssa-ccp.cc +++ b/gcc/tree-ssa-ccp.cc @@ -722,6 +722,10 @@ likely_value (gimple *stmt) if (gimple_has_volatile_ops (stmt)) return VARYING; + /* .DEFERRED_INIT produces undefined. */ + if (gimple_call_internal_p (stmt, IFN_DEFERRED_INIT)) + return UNDEFINED; + /* Arrive here for more complex cases. */ has_constant_operand = false; has_undefined_operand = false; |