From: Jakub Jelinek Date: Tue, 7 Apr 2020 18:57:37 +0000 (+0200) Subject: if-conv: Fix -fcompare-debug bugs in ifcvt_local_dce [PR94283] X-Git-Tag: embedded-9-2020q2~16 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4dcfd4e56b0d22af12750372f3e0b49249b1d473;p=thirdparty%2Fgcc.git if-conv: Fix -fcompare-debug bugs in ifcvt_local_dce [PR94283] The following testcase shows -fcompare-debug bugs in ifcvt_local_dce, where the decisions what statements are needed is based also on debug stmt operands, which is wrong. So, this patch makes sure to never add debug stmt to the worklist, or never add an assign to worklist just because it is used in a debug stmt in another bb. 2020-03-24 Jakub Jelinek PR debug/94283 * tree-if-conv.c (ifcvt_local_dce): For gimple debug stmts, just set GF_PLF_2, but don't add them to worklist. Don't add an assigment to worklist or set GF_PLF_2 just because it is used in a debug stmt in another bb. Formatting improvements. * gcc.target/i386/pr94283.c: New test. --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 356e7c14e3b2..95b7cc8f7ca2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -3,14 +3,18 @@ Backported from mainline 2020-03-24 Jakub Jelinek + PR debug/94283 + * tree-if-conv.c (ifcvt_local_dce): For gimple debug stmts, just set + GF_PLF_2, but don't add them to worklist. Don't add an assigment to + worklist or set GF_PLF_2 just because it is used in a debug stmt in + another bb. Formatting improvements. + PR debug/94277 * cgraphunit.c (check_global_declaration): For DECL_EXTERNAL and non-TREE_PUBLIC non-DECL_ARTIFICIAL FUNCTION_DECLs, set TREE_PUBLIC regardless of whether TREE_NO_WARNING is set on it or whether warn_unused_function is true or not. -2020-04-07 Jakub Jelinek - 2020-03-19 Jakub Jelinek PR tree-optimization/94211 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a43da5200a28..30ce191dfef8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -3,6 +3,9 @@ Backported from mainline 2020-03-24 Jakub Jelinek + PR debug/94283 + * gcc.target/i386/pr94283.c: New test. + PR debug/94277 * gcc.dg/pr94277.c: New test. diff --git a/gcc/testsuite/gcc.target/i386/pr94283.c b/gcc/testsuite/gcc.target/i386/pr94283.c new file mode 100644 index 000000000000..4982f7d01d77 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr94283.c @@ -0,0 +1,5 @@ +/* PR debug/94283 */ +/* { dg-do compile } */ +/* { dg-options "-O3 -fcompare-debug -mavx2" } */ + +#include "../../gcc.dg/fold-bopcond-1.c" diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c index 2780a4b243fc..8a6e2415d7c9 100644 --- a/gcc/tree-if-conv.c +++ b/gcc/tree-if-conv.c @@ -2913,9 +2913,12 @@ ifcvt_local_dce (basic_block bb) for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) { stmt = gsi_stmt (gsi); - if (gimple_store_p (stmt) - || gimple_assign_load_p (stmt) - || is_gimple_debug (stmt)) + if (is_gimple_debug (stmt)) + { + gimple_set_plf (stmt, GF_PLF_2, true); + continue; + } + if (gimple_store_p (stmt) || gimple_assign_load_p (stmt)) { gimple_set_plf (stmt, GF_PLF_2, true); worklist.safe_push (stmt); @@ -2936,7 +2939,7 @@ ifcvt_local_dce (basic_block bb) FOR_EACH_IMM_USE_FAST (use_p, imm_iter, lhs) { stmt1 = USE_STMT (use_p); - if (gimple_bb (stmt1) != bb) + if (!is_gimple_debug (stmt1) && gimple_bb (stmt1) != bb) { gimple_set_plf (stmt, GF_PLF_2, true); worklist.safe_push (stmt); @@ -2959,8 +2962,7 @@ ifcvt_local_dce (basic_block bb) if (TREE_CODE (use) != SSA_NAME) continue; stmt1 = SSA_NAME_DEF_STMT (use); - if (gimple_bb (stmt1) != bb - || gimple_plf (stmt1, GF_PLF_2)) + if (gimple_bb (stmt1) != bb || gimple_plf (stmt1, GF_PLF_2)) continue; gimple_set_plf (stmt1, GF_PLF_2, true); worklist.safe_push (stmt1);