Commit 7040e903 by Kyrylo Tkachov Committed by Kyrylo Tkachov

[simplify-rtx][2/2] Simplify - (y ? -x : x) -> (!y ? -x : x)

	* simplify-rtx.c (simplify_unary_operation_1, NEG case):
	(neg (x ? (neg y) : y)) -> !x ? (neg y) : y.

	* gcc.target/aarch64/neg_abs_1.c: New test.

From-SVN: r225997
parent 232c9329
2015-07-20 Kyrylo Tkachov <kyrylo.tkachov@arm.com> 2015-07-20 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* simplify-rtx.c (simplify_unary_operation_1, NEG case):
(neg (x ? (neg y) : y)) -> !x ? (neg y) : y.
2015-07-20 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* combine.c (combine_simplify_rtx): Move simplification step * combine.c (combine_simplify_rtx): Move simplification step
before various transformations/substitutions. before various transformations/substitutions.
......
...@@ -957,6 +957,32 @@ simplify_unary_operation_1 (enum rtx_code code, machine_mode mode, rtx op) ...@@ -957,6 +957,32 @@ simplify_unary_operation_1 (enum rtx_code code, machine_mode mode, rtx op)
if (GET_CODE (op) == NEG) if (GET_CODE (op) == NEG)
return XEXP (op, 0); return XEXP (op, 0);
/* (neg (x ? (neg y) : y)) == !x ? (neg y) : y.
If comparison is not reversible use
x ? y : (neg y). */
if (GET_CODE (op) == IF_THEN_ELSE)
{
rtx cond = XEXP (op, 0);
rtx true_rtx = XEXP (op, 1);
rtx false_rtx = XEXP (op, 2);
if ((GET_CODE (true_rtx) == NEG
&& rtx_equal_p (XEXP (true_rtx, 0), false_rtx))
|| (GET_CODE (false_rtx) == NEG
&& rtx_equal_p (XEXP (false_rtx, 0), true_rtx)))
{
if (reversed_comparison_code (cond, NULL_RTX) != UNKNOWN)
temp = reversed_comparison (cond, mode);
else
{
temp = cond;
std::swap (true_rtx, false_rtx);
}
return simplify_gen_ternary (IF_THEN_ELSE, mode,
mode, temp, true_rtx, false_rtx);
}
}
/* (neg (plus X 1)) can become (not X). */ /* (neg (plus X 1)) can become (not X). */
if (GET_CODE (op) == PLUS if (GET_CODE (op) == PLUS
&& XEXP (op, 1) == const1_rtx) && XEXP (op, 1) == const1_rtx)
......
2015-07-20 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* gcc.target/aarch64/neg_abs_1.c: New test.
2015-07-18 Uros Bizjak <ubizjak@gmail.com> 2015-07-18 Uros Bizjak <ubizjak@gmail.com>
PR target/66922 PR target/66922
......
/* { dg-do compile } */
/* { dg-options "-save-temps -O2" } */
int
f1 (int x)
{
return x < 0 ? x : -x;
}
long long
f2 (long long x)
{
return x < 0 ? x : -x;
}
/* { dg-final { scan-assembler-not "\tneg\tw\[0-9\]*.*" } } */
/* { dg-final { scan-assembler-not "\tneg\tx\[0-9\]*.*" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment