(fcopysign x, NEGATIVE_CONST) can be simplified to (fneg (fabs x)), but
a logic error in the code caused it mistakenly simplified to (fneg x)
instead.
gcc/ChangeLog:
PR rtl-optimization/112483
* simplify-rtx.cc (simplify_binary_operation_1) <case COPYSIGN>:
Fix the simplification of (fcopysign x, NEGATIVE_CONST).
real_convert (&f1, mode, CONST_DOUBLE_REAL_VALUE (trueop1));
rtx tmp = simplify_gen_unary (ABS, mode, op0, mode);
if (REAL_VALUE_NEGATIVE (f1))
- tmp = simplify_gen_unary (NEG, mode, op0, mode);
+ tmp = simplify_gen_unary (NEG, mode, tmp, mode);
return tmp;
}
if (GET_CODE (op0) == NEG || GET_CODE (op0) == ABS)