Commit a5a9400a by Jakub Jelinek

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  <jakub@redhat.com>

	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.
parent 04781157
2020-03-24 Jakub Jelinek <jakub@redhat.com>
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
......
2020-03-24 Jakub Jelinek <jakub@redhat.com>
PR debug/94283
* gcc.target/i386/pr94283.c: New test.
PR debug/94277
* gcc.dg/pr94277.c: New test.
......
/* PR debug/94283 */
/* { dg-do compile } */
/* { dg-options "-O3 -fcompare-debug -mavx2" } */
#include "../../gcc.dg/fold-bopcond-1.c"
......@@ -2917,9 +2917,12 @@ ifcvt_local_dce (class loop *loop)
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);
......@@ -2940,7 +2943,7 @@ ifcvt_local_dce (class loop *loop)
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);
......@@ -2963,8 +2966,7 @@ ifcvt_local_dce (class loop *loop)
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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment