From dc4644dcef05a1f21a9ebc194689f31412811387 Mon Sep 17 00:00:00 2001 From: Thomas Schwinge Date: Mon, 17 Oct 2022 09:10:03 +0200 Subject: [PATCH] Add 'c-c++-common/torture/pr107195-1.c' [PR107195] ... to display optimization performed as of recent commit r13-3217-gc4d15dddf6b9eacb36f535807ad2ee364af46e04 "[PR107195] Set range to zero when nonzero mask is 0". PR tree-optimization/107195 gcc/testsuite/ * c-c++-common/torture/pr107195-1.c: New. --- .../c-c++-common/torture/pr107195-1.c | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 gcc/testsuite/c-c++-common/torture/pr107195-1.c diff --git a/gcc/testsuite/c-c++-common/torture/pr107195-1.c b/gcc/testsuite/c-c++-common/torture/pr107195-1.c new file mode 100644 index 000000000000..1e201c1f5e6c --- /dev/null +++ b/gcc/testsuite/c-c++-common/torture/pr107195-1.c @@ -0,0 +1,41 @@ +/* Inspired by 'libgomp.oacc-c-c++-common/nvptx-sese-1.c'. */ + +/* { dg-additional-options -fdump-tree-optimized-raw } + { dg-skip-if {} { *-*-* } { {-flto -fno-fat-lto-objects} } { } } */ + +#if 1 +extern int +__attribute__((const)) +foo (int); +#else +int +__attribute__((noinline)) +foo (int x) +{ + return x & 2; +} +#endif + +int f (int r) +{ + if (foo (r)) /* If this first 'if' holds... */ + r *= 2; /* ..., 'r' now has a zero-value lower-most bit... */ + + if (r & 1) /* ..., so this second 'if' can never hold... */ + { /* ..., so this is unreachable. */ +#if 1 + /* In constrast, if the first 'if' does not hold ('foo (r) == 0'), the + second 'if' may hold, but we know ('foo' being 'const') that + 'foo (r) == 0', so don't have to re-evaluate it here: */ + r += foo (r); + /* Thus, if optimizing, we only ever expect one call of 'foo'. + { dg-final { scan-tree-dump-times {gimple_call