From fc1b5707faf0b607da06e9ec3437245aba69a255 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 26 Aug 2022 12:56:30 +0200 Subject: New testcase for uninit The following adds a testcase that illustrates a defect in compute_control_dep_chain and its attempt to identify loop exits as special to continue walking post-dominators but failing to do so for following post-dominators. On trunk there is now simple_control_dep_chain saving the day, avoiding the false positive but with GCC 12 we get a bogus diagnostic. * gcc.dg/uninit-pred-11.c: New testcase. --- gcc/testsuite/gcc.dg/uninit-pred-11.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/uninit-pred-11.c diff --git a/gcc/testsuite/gcc.dg/uninit-pred-11.c b/gcc/testsuite/gcc.dg/uninit-pred-11.c new file mode 100644 index 0000000..734df37 --- /dev/null +++ b/gcc/testsuite/gcc.dg/uninit-pred-11.c @@ -0,0 +1,27 @@ +/* { dg-do compile } */ +/* { dg-options "-O -Wmaybe-uninitialized" } */ + +extern unsigned bar (void); +extern void quux (void); +int z; +unsigned foo (unsigned v, int y) +{ + unsigned u; + if (v != 1) + u = bar (); + + // Prevent the "dom" pass from changing the CFG layout based on the inference + // 'if (v != 1) is false then (v != 2) is true'. (Now it would have to + // duplicate the loop in order to do so, which is deemed expensive.) + for (int i = 0; i < 10; i++) + quux (); + + // This variation from uninit-25.c causes compute_control_dep_chain + // to run into a defect but simple_control_dep_chain saves us here + if (y) + z = 1; + if (v != 1) + return u; /* { dg-bogus "may be used uninitialized" } */ + + return 0; +} -- cgit v1.1