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:
Richard Biener 2022-10-18 09:38:03 +02:00
parent 35106383c0
commit 5ad3cc1ecc
2 changed files with 19 additions and 2 deletions

View file

@ -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);

View 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;
}