https://gcc.gnu.org/g:1ab177078102ad62011bb66777c059dd6cac2bce
commit r17-393-g1ab177078102ad62011bb66777c059dd6cac2bce Author: Eikansh Gupta <[email protected]> Date: Thu May 7 16:45:20 2026 -0600 [PATCH v2] match.pd: Add pattern to fold (X - (X<0)) ^ -(X<0) into ABS_EXPR<X> [PR123514] Adds a pattern to fold (x - (x<0)) ^ -(x<0) into ABS_EXPR<x>. PR tree-optimization/123514 gcc/ChangeLog: * match.pd ((x - (x<0)) ^ -(x<0) into ABS_EXPR<x>): New pattern. gcc/testsuite/ChangeLog: * gcc.dg/tree-ssa/pr123514.c: New test. Signed-off-by: Eikansh Gupta <[email protected]> Diff: --- gcc/match.pd | 8 ++++++++ gcc/testsuite/gcc.dg/tree-ssa/pr123514.c | 11 +++++++++++ 2 files changed, 19 insertions(+) diff --git a/gcc/match.pd b/gcc/match.pd index 04faffb760d1..8682a9797b70 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -230,6 +230,14 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) (abs @0))) #endif +/* (X - (X < 0)) ^ -(X < 0) -> abs (X) */ +(simplify + (bit_xor:c (minus @0 (convert@1 (lt @0 integer_zerop))) + (negate @1)) + (if (INTEGRAL_TYPE_P (TREE_TYPE (@0)) + && !TYPE_UNSIGNED (TREE_TYPE (@0))) + (abs @0))) + /* Simplifications of operations with one constant operand and simplifications to constants or single values. */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr123514.c b/gcc/testsuite/gcc.dg/tree-ssa/pr123514.c new file mode 100644 index 000000000000..4a09d859031e --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr123514.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-O1 -fdump-tree-optimized" } */ + +int +bit_trick (int x) +{ + int mask = -(x < 0); + return ((x + mask) ^ mask); +} + +/* { dg-final { scan-tree-dump "ABS_EXPR" "optimized" } } */
