tree-optimization/107301 - check if we can duplicate block before doing so
Path isolation failed to do that. PR tree-optimization/107301 * gimple-ssa-isolate-paths.cc (handle_return_addr_local_phi_arg): Check whether we can duplicate the block. (find_implicit_erroneous_behavior): Likewise. * gcc.dg/torture/pr107301.c: New testcase.
This commit is contained in:
parent
35106383c0
commit
5ad3cc1ecc
2 changed files with 19 additions and 2 deletions
|
@ -647,7 +647,8 @@ handle_return_addr_local_phi_arg (basic_block bb, basic_block duplicate,
|
|||
if (!maybe
|
||||
&& (flag_isolate_erroneous_paths_dereference
|
||||
|| flag_isolate_erroneous_paths_attribute)
|
||||
&& gimple_bb (use_stmt) == bb)
|
||||
&& gimple_bb (use_stmt) == bb
|
||||
&& (duplicate || can_duplicate_block_p (bb)))
|
||||
{
|
||||
duplicate = isolate_path (bb, duplicate, e,
|
||||
use_stmt, lhs, true);
|
||||
|
@ -765,7 +766,8 @@ find_implicit_erroneous_behavior (void)
|
|||
? gimple_location (use_stmt)
|
||||
: phi_arg_loc;
|
||||
|
||||
if (stmt_uses_name_in_undefined_way (use_stmt, lhs, loc))
|
||||
if (stmt_uses_name_in_undefined_way (use_stmt, lhs, loc)
|
||||
&& (duplicate || can_duplicate_block_p (bb)))
|
||||
{
|
||||
duplicate = isolate_path (bb, duplicate, e,
|
||||
use_stmt, lhs, false);
|
||||
|
|
15
gcc/testsuite/gcc.dg/torture/pr107301.c
Normal file
15
gcc/testsuite/gcc.dg/torture/pr107301.c
Normal file
|
@ -0,0 +1,15 @@
|
|||
/* { dg-do compile } */
|
||||
|
||||
__attribute__ ((pure, returns_twice)) int
|
||||
foo (int x)
|
||||
{
|
||||
int a;
|
||||
|
||||
a = x ? 3 : 0;
|
||||
x /= a;
|
||||
a = foo (x);
|
||||
if (x == a)
|
||||
__builtin_unreachable ();
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Reference in a new issue