diff options
author | Richard Biener <rguenther@suse.de> | 2023-07-04 12:52:27 +0200 |
---|---|---|
committer | Richard Biener <rguenther@suse.de> | 2023-07-04 14:13:33 +0200 |
commit | 819285ef10a87d663f8c181c06aa88d1d9f75aed (patch) | |
tree | 362a9bf09cf73b7063c2136ad1d58cd8b3725f56 /gcc | |
parent | 86ff0533fcb442be17942eef16f8b8db466c4fd4 (diff) | |
download | gcc-819285ef10a87d663f8c181c06aa88d1d9f75aed.zip gcc-819285ef10a87d663f8c181c06aa88d1d9f75aed.tar.gz gcc-819285ef10a87d663f8c181c06aa88d1d9f75aed.tar.bz2 |
tree-optimization/110491 - PHI-OPT and undefs
The following makes sure to not make conditional undefs in PHI arguments
unconditional by folding cond ? arg1 : arg2.
PR tree-optimization/110491
* tree-ssa-phiopt.cc (match_simplify_replacement): Check
whether the PHI args are possibly undefined before folding
the COND_EXPR.
* gcc.dg/torture/pr110491.c: New testcase.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr110491.c | 29 | ||||
-rw-r--r-- | gcc/tree-ssa-phiopt.cc | 7 |
2 files changed, 36 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr110491.c b/gcc/testsuite/gcc.dg/torture/pr110491.c new file mode 100644 index 0000000..00b3bdf --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr110491.c @@ -0,0 +1,29 @@ +/* { dg-do run } */ + +int a, c, d, e; +short b; +void f(int *g) { c &= *g; } +void h(void); +void i() { + a = 1; + h(); + f(&a); +} +void h() { + int *j = &c; + *j = 5; +k: + for (; 4 + b <= 0;) + ; + for (; d;) { + c = e == 0; + goto k; + } +} +int main() +{ + i(); + if (c != 1) + __builtin_abort (); + return 0; +} diff --git a/gcc/tree-ssa-phiopt.cc b/gcc/tree-ssa-phiopt.cc index 31a7c39..467c9fd 100644 --- a/gcc/tree-ssa-phiopt.cc +++ b/gcc/tree-ssa-phiopt.cc @@ -785,6 +785,13 @@ match_simplify_replacement (basic_block cond_bb, basic_block middle_bb, arg_false = arg0; } + /* Do not make conditional undefs unconditional. */ + if ((TREE_CODE (arg_true) == SSA_NAME + && ssa_name_maybe_undef_p (arg_true)) + || (TREE_CODE (arg_false) == SSA_NAME + && ssa_name_maybe_undef_p (arg_false))) + return false; + tree type = TREE_TYPE (gimple_phi_result (phi)); result = gimple_simplify_phiopt (early_p, type, stmt, arg_true, arg_false, |