mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-04 23:01:19 +08:00
re PR tree-optimization/54824 (ICE in verify_loop_structure)
2012-10-26 Richard Biener <rguenther@suse.de> PR middle-end/54824 * tree-optimize.c (execute_fixup_cfg): Insert __builtin_unreachable at the end of blocks with no successors. * gcc.dg/torture/pr54824.c: New testcase. From-SVN: r192841
This commit is contained in:
parent
3a0d99bb60
commit
9037dcc6ad
@ -1,3 +1,9 @@
|
||||
2012-10-26 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR middle-end/54824
|
||||
* tree-optimize.c (execute_fixup_cfg): Insert __builtin_unreachable
|
||||
at the end of blocks with no successors.
|
||||
|
||||
2012-10-26 Alexander Ivchenko <alexander.ivchenko@intel.com>
|
||||
Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
|
@ -1,3 +1,8 @@
|
||||
2012-10-26 Richard Biener <rguenther@suse.de>
|
||||
|
||||
PR middle-end/54824
|
||||
* gcc.dg/torture/pr54824.c: New testcase.
|
||||
|
||||
2012-10-26 Alexander Ivchenko <alexander.ivchenko@intel.com>
|
||||
|
||||
* gcc.target/i386/fxsave-1.c: New.
|
||||
|
16
gcc/testsuite/gcc.dg/torture/pr54824.c
Normal file
16
gcc/testsuite/gcc.dg/torture/pr54824.c
Normal file
@ -0,0 +1,16 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-w" } */
|
||||
|
||||
void __attribute__((noreturn)) bar(void)
|
||||
{
|
||||
}
|
||||
|
||||
void foo(int i, char *p, char *q)
|
||||
{
|
||||
while (*p++) {
|
||||
if (i)
|
||||
p++;
|
||||
if (!*q++)
|
||||
bar();
|
||||
}
|
||||
}
|
@ -180,6 +180,25 @@ execute_fixup_cfg (void)
|
||||
FOR_EACH_EDGE (e, ei, bb->succs)
|
||||
e->count = (e->count * count_scale
|
||||
+ REG_BR_PROB_BASE / 2) / REG_BR_PROB_BASE;
|
||||
|
||||
/* If we have a basic block with no successors that does not
|
||||
end with a control statement or a noreturn call end it with
|
||||
a call to __builtin_unreachable. This situation can occur
|
||||
when inlining a noreturn call that does in fact return. */
|
||||
if (EDGE_COUNT (bb->succs) == 0)
|
||||
{
|
||||
gimple stmt = last_stmt (bb);
|
||||
if (!stmt
|
||||
|| (!is_ctrl_stmt (stmt)
|
||||
&& (!is_gimple_call (stmt)
|
||||
|| (gimple_call_flags (stmt) & ECF_NORETURN) == 0)))
|
||||
{
|
||||
stmt = gimple_build_call
|
||||
(builtin_decl_implicit (BUILT_IN_UNREACHABLE), 0);
|
||||
gimple_stmt_iterator gsi = gsi_last_bb (bb);
|
||||
gsi_insert_after (&gsi, stmt, GSI_NEW_STMT);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (count_scale != REG_BR_PROB_BASE)
|
||||
compute_function_frequency ();
|
||||
|
Loading…
x
Reference in New Issue
Block a user