On Thu, Oct 5, 2017 at 4:41 PM, Laurent Thevenoux
<[email protected]> wrote:
> Hello,
>
> This patch improves the some_nonzerop(tree t) function from tree-complex.c
> file (the function is only used there).
>
> This function returns true if a tree as a parameter is not the constant 0 (or
> +0.0 only for reals when !flag_signed_zeros ). The former result is then used
> to determine if some simplifications are possible for complex expansions
> (addition, multiplication, and division).
>
> Unfortunately, if the tree is a real constant, the function always return
> true, even for +0.0 because of the explicit test on flag_signed_zeros (so if
> your system enables signed zeros you cannot benefit from those
> simplifications). To avoid this behavior and allow complex expansion
> simplifications, I propose the following patch, which test for the sign of
> the real constant 0.0 instead of checking the flag.
But
+ if (TREE_CODE (t) == REAL_CST)
+ {
+ if (real_identical (&TREE_REAL_CST (t), &dconst0))
+ zerop = !real_isneg (&TREE_REAL_CST (t));
+ }
shouldn't you do
zerop = !flag_signed_zeros || !real_isneg (&TREE_REAL_CST (t));
?
Also doesn't this miscalculate A - B for {ar, 0.} - {br, 0.} given the
simplification simply
returns bi?
So I'm not convinced this handling is correct.
> This first fix reveals a bug (thanks to
> c-c++-common/torture/complex-sign-add.c ) in the simplification section of
> expand_complex_addition (also fixed in the patch).
Your patch looks backward and the existing code looks ok.
@@ -937,7 +940,7 @@ expand_complex_addition (gimple_stmt_iterator
*gsi, tree inner_type,
case PAIR (VARYING, ONLY_REAL):
rr = gimplify_build2 (gsi, code, inner_type, ar, br);
- ri = ai;
+ ri = bi;
break;
down we have
case PAIR (ONLY_REAL, VARYING):
if (code == MINUS_EXPR)
goto general;
rr = gimplify_build2 (gsi, code, inner_type, ar, br);
ri = bi;
break;
which for sure would need to change as well then. But for your
changed code we know
bi is zero (but ai may not).
Richard.
> The patch has passed bootstrap and testing on x86_64-pc-linux-gnu .
>
> Best regards,
> Laurent Thévenoux