Skip to content

Commit

Permalink
middle-end/104464 - ISEL and non-call EH #2
Browse files Browse the repository at this point in the history
The following adjusts the earlier change to still allow an
uncritical replacement.

2022-02-09  Richard Biener  <rguenther@suse.de>

	PR middle-end/104464
	* gimple-isel.cc (gimple_expand_vec_cond_expr): Postpone
	throwing check to after unproblematic replacement.

	* gcc.dg/pr104464.c: New testcase.
  • Loading branch information
rguenth committed Feb 9, 2022
1 parent d80f224 commit 8f8f8c6
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 14 deletions.
28 changes: 14 additions & 14 deletions gcc/gimple-isel.cc
Original file line number Diff line number Diff line change
Expand Up @@ -178,11 +178,7 @@ gimple_expand_vec_cond_expr (struct function *fun, gimple_stmt_iterator *gsi,
}

gassign *def_stmt = dyn_cast<gassign *> (SSA_NAME_DEF_STMT (op0));
if (def_stmt
/* When the compare has EH we do not want to forward it when
it has multiple uses and in general because of the complication
with EH redirection. */
&& !stmt_can_throw_internal (fun, def_stmt))
if (def_stmt)
{
tcode = gimple_assign_rhs_code (def_stmt);
op0a = gimple_assign_rhs1 (def_stmt);
Expand All @@ -195,7 +191,6 @@ gimple_expand_vec_cond_expr (struct function *fun, gimple_stmt_iterator *gsi,
tcode);

/* Try to fold x CMP y ? -1 : 0 to x CMP y. */

if (can_compute_op0
&& integer_minus_onep (op1)
&& integer_zerop (op2)
Expand All @@ -207,14 +202,19 @@ gimple_expand_vec_cond_expr (struct function *fun, gimple_stmt_iterator *gsi,
return new_stmt;
}

if (can_compute_op0
&& used_vec_cond_exprs >= 2
&& (get_vcond_mask_icode (mode, TYPE_MODE (op0_type))
!= CODE_FOR_nothing))
{
/* Keep the SSA name and use vcond_mask. */
tcode = TREE_CODE (op0);
}
/* When the compare has EH we do not want to forward it when
it has multiple uses and in general because of the complication
with EH redirection. */
if (stmt_can_throw_internal (fun, def_stmt))
tcode = TREE_CODE (op0);

/* If we can compute op0 and have multiple uses, keep the SSA
name and use vcond_mask. */
else if (can_compute_op0
&& used_vec_cond_exprs >= 2
&& (get_vcond_mask_icode (mode, TYPE_MODE (op0_type))
!= CODE_FOR_nothing))
tcode = TREE_CODE (op0);
}
else
tcode = TREE_CODE (op0);
Expand Down
11 changes: 11 additions & 0 deletions gcc/testsuite/gcc.dg/pr104464.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/* { dg-do compile } */
/* { dg-options "-O -fnon-call-exceptions -fno-tree-dce -fno-tree-forwprop -fsignaling-nans" } */

typedef double __attribute__((__vector_size__(16))) F;
F f;

void
foo(void)
{
f += (F)(f != (F){}[0]);
}

0 comments on commit 8f8f8c6

Please sign in to comment.