mirror of
https://github.com/gcc-mirror/gcc.git
synced 2024-11-21 13:40:47 +00:00
simplify-rtx: Handle a != 0 ? -a : 0
[PR58195]
The gimple (and generic) levels have this optmization since r12-2041-g7d6979197274a662da7bdc5. It seems like a good idea to add a similar one to rtl just in case it is not caught at the gimple level. Note the loop case in csel-neg-1.c is not handled at the gimple level (even with phiopt turned back on), this is because of casts to avoid signed integer overflow; a patch to fix this at the gimple level will be submitted seperately. Changes since v1: * v2: Use `CONST0_RTX (mode)` instead of const0_rtx. Add csel-neg-2.c for float testcase which now passes. Build and tested for aarch64-linux-gnu. PR rtl-optimization/58195 gcc/ChangeLog: * simplify-rtx.cc (simplify_context::simplify_ternary_operation): Handle `a != 0 ? -a : 0` and `a == 0 ? 0 : -a`. gcc/testsuite/ChangeLog: * gcc.target/aarch64/csel-neg-1.c: New test. * gcc.target/aarch64/csel-neg-2.c: New test. Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
This commit is contained in:
parent
2266e38cfd
commit
35bf490452
@ -6909,6 +6909,28 @@ simplify_context::simplify_ternary_operation (rtx_code code, machine_mode mode,
|
||||
&& rtx_equal_p (XEXP (op0, 1), op1))))
|
||||
return op2;
|
||||
|
||||
/* Convert a != 0 ? -a : 0 into "-a". */
|
||||
if (GET_CODE (op0) == NE
|
||||
&& ! side_effects_p (op0)
|
||||
&& ! HONOR_NANS (mode)
|
||||
&& ! HONOR_SIGNED_ZEROS (mode)
|
||||
&& XEXP (op0, 1) == CONST0_RTX (mode)
|
||||
&& op2 == CONST0_RTX (mode)
|
||||
&& GET_CODE (op1) == NEG
|
||||
&& rtx_equal_p (XEXP (op0, 0), XEXP (op1, 0)))
|
||||
return op1;
|
||||
|
||||
/* Convert a == 0 ? 0 : -a into "-a". */
|
||||
if (GET_CODE (op0) == EQ
|
||||
&& ! side_effects_p (op0)
|
||||
&& ! HONOR_NANS (mode)
|
||||
&& ! HONOR_SIGNED_ZEROS (mode)
|
||||
&& op1 == CONST0_RTX (mode)
|
||||
&& XEXP (op0, 1) == CONST0_RTX (mode)
|
||||
&& GET_CODE (op2) == NEG
|
||||
&& rtx_equal_p (XEXP (op0, 0), XEXP (op2, 0)))
|
||||
return op2;
|
||||
|
||||
/* Convert (!c) != {0,...,0} ? a : b into
|
||||
c != {0,...,0} ? b : a for vector modes. */
|
||||
if (VECTOR_MODE_P (GET_MODE (op1))
|
||||
|
31
gcc/testsuite/gcc.target/aarch64/csel-neg-1.c
Normal file
31
gcc/testsuite/gcc.target/aarch64/csel-neg-1.c
Normal file
@ -0,0 +1,31 @@
|
||||
/* { dg-do compile } */
|
||||
/* Disable phiopt as that will optimize away the `?:`,
|
||||
want to test simplify-rtx */
|
||||
/* { dg-options "-O2 -fno-ssa-phiopt" } */
|
||||
|
||||
/* PR rtl-optimization/58195 */
|
||||
|
||||
int a2(int input)
|
||||
{
|
||||
if (input == 0)
|
||||
return 0;
|
||||
return -input;
|
||||
}
|
||||
int a1(int input)
|
||||
{
|
||||
int t = -input;
|
||||
return input == 0 ? 0 : t;
|
||||
}
|
||||
|
||||
int a(int input)
|
||||
{
|
||||
int value = 0;
|
||||
for(int n = input; n != 0; ++n)
|
||||
++value;
|
||||
return value;
|
||||
}
|
||||
|
||||
/* There should be no comparison against 0 here, */
|
||||
/* { dg-final { scan-assembler-not "cmp\t" } } */
|
||||
/* { dg-final { scan-assembler "\tneg\t" } } */
|
||||
|
19
gcc/testsuite/gcc.target/aarch64/csel-neg-2.c
Normal file
19
gcc/testsuite/gcc.target/aarch64/csel-neg-2.c
Normal file
@ -0,0 +1,19 @@
|
||||
/* { dg-do compile } */
|
||||
/* Disable phiopt as that will optimize away the `?:`,
|
||||
want to test simplify-rtx */
|
||||
/* { dg-options "-O2 -ffast-math -fno-ssa-phiopt" } */
|
||||
|
||||
/* PR rtl-optimization/58195 */
|
||||
|
||||
float a2(float input)
|
||||
{
|
||||
if (input == 0)
|
||||
return 0;
|
||||
return -input;
|
||||
}
|
||||
|
||||
/* There should be no comparison against 0 here, */
|
||||
/* { dg-final { scan-assembler-not "\tfcmp\t" } } */
|
||||
/* { dg-final { scan-assembler-not "\tfcsel\t" } } */
|
||||
/* { dg-final { scan-assembler "\tfneg\t" } } */
|
||||
|
Loading…
Reference in New Issue
Block a user