c-family: Fix PR94272 -fcompare-debug issue even for C [PR99230]
authorJakub Jelinek <jakub@redhat.com>
Sat, 20 Mar 2021 16:02:06 +0000 (17:02 +0100)
committerJakub Jelinek <jakub@redhat.com>
Sat, 20 Mar 2021 16:02:06 +0000 (17:02 +0100)
commit9f59cb7cac009f3c6eba81eb09714699b9ac9f8d
treeb61259c848056657ae08f8fa9c2e4dee87cc4ef2
parent9c2f08475a13e8e77a9f4b1866d45b1eceaad168
c-family: Fix PR94272 -fcompare-debug issue even for C [PR99230]

The following testcase results in -fcompare-debug failure.
The problem is the similar like in PR94272
https://gcc.gnu.org/pipermail/gcc-patches/2020-March/542562.html
When genericizing, with -g0 we have just a TREE_SIDE_EFFECTS DO_STMT
in a branch of if, while with -g we have that wrapped into
TREE_SIDE_EFFECTS STATEMENT_LIST containing DEBUG_BEGIN_STMT and that
DO_STMT.
The do loop is empty with 0 condition, so c_genericize_control_stmt
turns it into an empty statement (without TREE_SIDE_EFFECTS).
For -g0 that means that suddenly the if branch doesn't have side effects
and is expanded differently.  But with -g we still have TREE_SIDE_EFFECTS
STATEMENT_LIST containing DEBUG_BEGIN_STMT and non-TREE_SIDE_EFFECTS stmt.
The following patch fixes that by detecting this case and removing
TREE_SIDE_EFFECTS.

And, so that we don't duplicate the same code, changes the C++ FE to
just call the c_genericize_control_stmt function that can now handle it.

2021-03-20  Jakub Jelinek  <jakub@redhat.com>

PR debug/99230
* c-gimplify.c (c_genericize_control_stmt): Handle STATEMENT_LIST.

* cp-gimplify.c (cp_genericize_r) <case STATEMENT_LIST>: Remove
special code, instead call c_genericize_control_stmt.

* gcc.dg/pr99230.c: New test.
gcc/c-family/c-gimplify.c
gcc/cp/cp-gimplify.c
gcc/testsuite/gcc.dg/pr99230.c [new file with mode: 0644]