Skip to content

Commit

Permalink
ranger: Fix up REALPART_EXPR/IMAGPART_EXPR handling [PR104604]
Browse files Browse the repository at this point in the history
The following testcase is miscompiled since r12-3328.
That change assumed that if rhs1 of a GIMPLE_ASSIGN is COMPLEX_CST, then
that is the value of the lhs of the stmt, but that is not the case always,
only if it is a GIMPLE_SINGLE_RHS stmt.  If it is e.g.
GIMPLE_UNARY_RHS or GIMPLE_BINARY_RHS (the latter happens in the testcase),
then it can be e.g.
__complex__ (3, 0) / var
and the REALPART_EXPR of that isn't 3, but the realpart of the division.
I assume once the ranger can do complex numbers adjust_*part_expr will just
fetch one or the other range from a underlying complex range, but until
then, we should limit this to what r12-3328 meant to do.

2022-02-22  Jakub Jelinek  <[email protected]>

	PR tree-optimization/104604
	* gimple-range-fold.cc (adjust_imagpart_expr, adjust_realpart_expr):
	Only check if gimple_assign_rhs1 is COMPLEX_CST if
	gimple_assign_rhs_code is COMPLEX_CST.

	* gcc.c-torture/execute/pr104604.c: New test.
  • Loading branch information
jakubjelinek committed Feb 22, 2022
1 parent 7e69118 commit d44dc13
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 2 deletions.
6 changes: 4 additions & 2 deletions gcc/gimple-range-fold.cc
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,8 @@ adjust_imagpart_expr (irange &res, const gimple *stmt)
}
return;
}
if (is_gimple_assign (def_stmt))
if (is_gimple_assign (def_stmt)
&& gimple_assign_rhs_code (def_stmt) == COMPLEX_CST)
{
tree cst = gimple_assign_rhs1 (def_stmt);
if (TREE_CODE (cst) == COMPLEX_CST)
Expand All @@ -422,7 +423,8 @@ adjust_realpart_expr (irange &res, const gimple *stmt)
if (!SSA_NAME_DEF_STMT (name))
return;

if (is_gimple_assign (def_stmt))
if (is_gimple_assign (def_stmt)
&& gimple_assign_rhs_code (def_stmt) == COMPLEX_CST)
{
tree cst = gimple_assign_rhs1 (def_stmt);
if (TREE_CODE (cst) == COMPLEX_CST)
Expand Down
34 changes: 34 additions & 0 deletions gcc/testsuite/gcc.c-torture/execute/pr104604.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
/* PR tree-optimization/104604 */

unsigned char g;

__attribute__((noipa))
unsigned char
foo (_Complex unsigned c)
{
unsigned char v = g;
_Complex unsigned t = 3;
t /= c;
return v + t;
}

__attribute__((noipa))
unsigned char
bar (_Complex unsigned c)
{
unsigned char v = g;
_Complex unsigned t = 42;
t /= c;
return v + t;
}

int
main ()
{
unsigned char x = foo (7);
if (x)
__builtin_abort ();
if (bar (7) != 6)
__builtin_abort ();
return 0;
}

0 comments on commit d44dc13

Please sign in to comment.