re PR debug/66688 (compare debug failure building Linux kernel on ppc64le)
PR tree-optimization/66688 * tree-cfgcleanup.c (cleanup_control_flow_bb): Handle noreturn call followed only by debug stmts by removing the debug stmts and handling it the same as if the noreturn call is the last stmt. * gcc.dg/pr66688.c: New test. From-SVN: r231644
This commit is contained in:
parent
3ce38f68f9
commit
3be33b6eac
4 changed files with 67 additions and 5 deletions
|
@ -1,3 +1,11 @@
|
|||
2015-12-15 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/66688
|
||||
* tree-cfgcleanup.c (cleanup_control_flow_bb): Handle
|
||||
noreturn call followed only by debug stmts by removing
|
||||
the debug stmts and handling it the same as if the noreturn
|
||||
call is the last stmt.
|
||||
|
||||
2015-12-14 Steve Ellcey <sellcey@imgtec.com>
|
||||
|
||||
* config/mips/mips.c (mips_promote_function_mode): New function.
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2015-12-15 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR tree-optimization/66688
|
||||
* gcc.dg/pr66688.c: New test.
|
||||
|
||||
2015-12-15 Patrick Palka <ppalka@gcc.gnu.org>
|
||||
|
||||
PR c++/21802
|
||||
|
|
39
gcc/testsuite/gcc.dg/pr66688.c
Normal file
39
gcc/testsuite/gcc.dg/pr66688.c
Normal file
|
@ -0,0 +1,39 @@
|
|||
/* PR tree-optimization/66688 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fno-reorder-blocks -fcompare-debug" } */
|
||||
|
||||
struct fdt_header { unsigned magic; } *a;
|
||||
|
||||
int d;
|
||||
|
||||
int
|
||||
__fswab32 (int p1)
|
||||
{
|
||||
return __builtin_bswap32 (p1);
|
||||
}
|
||||
|
||||
void
|
||||
fdt_set_magic (int p1)
|
||||
{
|
||||
struct fdt_header *b = a;
|
||||
b->magic = __builtin_constant_p (p1) ? : __fswab32 (p1);
|
||||
}
|
||||
|
||||
int
|
||||
_fdt_sw_check_header ()
|
||||
{
|
||||
int c = ((struct fdt_header *) 1)->magic;
|
||||
if (c)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
fdt_finish ()
|
||||
{
|
||||
if (_fdt_sw_check_header ())
|
||||
if (d)
|
||||
return 0;
|
||||
fdt_set_magic (0);
|
||||
return 0;
|
||||
}
|
|
@ -186,7 +186,7 @@ cleanup_control_flow_bb (basic_block bb)
|
|||
we need to prune cfg. */
|
||||
retval |= gimple_purge_dead_eh_edges (bb);
|
||||
|
||||
gsi = gsi_last_bb (bb);
|
||||
gsi = gsi_last_nondebug_bb (bb);
|
||||
if (gsi_end_p (gsi))
|
||||
return retval;
|
||||
|
||||
|
@ -197,7 +197,10 @@ cleanup_control_flow_bb (basic_block bb)
|
|||
|
||||
if (gimple_code (stmt) == GIMPLE_COND
|
||||
|| gimple_code (stmt) == GIMPLE_SWITCH)
|
||||
retval |= cleanup_control_expr_graph (bb, gsi);
|
||||
{
|
||||
gcc_checking_assert (gsi_stmt (gsi_last_bb (bb)) == stmt);
|
||||
retval |= cleanup_control_expr_graph (bb, gsi);
|
||||
}
|
||||
else if (gimple_code (stmt) == GIMPLE_GOTO
|
||||
&& TREE_CODE (gimple_goto_dest (stmt)) == ADDR_EXPR
|
||||
&& (TREE_CODE (TREE_OPERAND (gimple_goto_dest (stmt), 0))
|
||||
|
@ -210,6 +213,7 @@ cleanup_control_flow_bb (basic_block bb)
|
|||
edge_iterator ei;
|
||||
basic_block target_block;
|
||||
|
||||
gcc_checking_assert (gsi_stmt (gsi_last_bb (bb)) == stmt);
|
||||
/* First look at all the outgoing edges. Delete any outgoing
|
||||
edges which do not go to the right block. For the one
|
||||
edge which goes to the right block, fix up its flags. */
|
||||
|
@ -242,9 +246,15 @@ cleanup_control_flow_bb (basic_block bb)
|
|||
/* Check for indirect calls that have been turned into
|
||||
noreturn calls. */
|
||||
else if (is_gimple_call (stmt)
|
||||
&& gimple_call_noreturn_p (stmt)
|
||||
&& remove_fallthru_edge (bb->succs))
|
||||
retval = true;
|
||||
&& gimple_call_noreturn_p (stmt))
|
||||
{
|
||||
/* If there are debug stmts after the noreturn call, remove them
|
||||
now, they should be all unreachable anyway. */
|
||||
for (gsi_next (&gsi); !gsi_end_p (gsi); )
|
||||
gsi_remove (&gsi, true);
|
||||
if (remove_fallthru_edge (bb->succs))
|
||||
retval = true;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue