https://gcc.gnu.org/g:aa8793daa4ec110ae1e8fa240614651711b93fe4
commit r14-11380-gaa8793daa4ec110ae1e8fa240614651711b93fe4 Author: Richard Sandiford <richard.sandif...@arm.com> Date: Tue Mar 4 17:49:30 2025 +0000 Fix folding of BIT_NOT_EXPR for POLY_INT_CST [PR118976] There was an embarrassing typo in the folding of BIT_NOT_EXPR for POLY_INT_CSTs: it used - rather than ~ on the poly_int. Not sure how that happened, but it might have been due to the way that ~x is implemented as -1 - x internally. gcc/ PR tree-optimization/118976 * fold-const.cc (const_unop): Use ~ rather than - for BIT_NOT_EXPR. * config/aarch64/aarch64.cc (aarch64_test_sve_folding): New function. (aarch64_run_selftests): Run it. (cherry picked from commit 78380fd7f743e23dfdf013d68a2f0347e1511550) Diff: --- gcc/config/aarch64/aarch64.cc | 11 +++++++++++ gcc/fold-const.cc | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc index 32adc2fa9854..0495adc7dd37 100644 --- a/gcc/config/aarch64/aarch64.cc +++ b/gcc/config/aarch64/aarch64.cc @@ -30544,6 +30544,16 @@ aarch64_test_sysreg_encoding_clashes (void) } } +/* Test SVE arithmetic folding. */ + +static void +aarch64_test_sve_folding () +{ + tree res = fold_unary (BIT_NOT_EXPR, ssizetype, + ssize_int (poly_int64 (1, 1))); + ASSERT_TRUE (operand_equal_p (res, ssize_int (poly_int64 (-2, -1)))); +} + /* Run all target-specific selftests. */ static void @@ -30552,6 +30562,7 @@ aarch64_run_selftests (void) aarch64_test_loading_full_dump (); aarch64_test_fractional_cost (); aarch64_test_sysreg_encoding_clashes (); + aarch64_test_sve_folding (); } } // namespace selftest diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc index 0d8942deedd3..7427caace7c9 100644 --- a/gcc/fold-const.cc +++ b/gcc/fold-const.cc @@ -1953,7 +1953,7 @@ const_unop (enum tree_code code, tree type, tree arg0) if (TREE_CODE (arg0) == INTEGER_CST) return fold_not_const (arg0, type); else if (POLY_INT_CST_P (arg0)) - return wide_int_to_tree (type, -poly_int_cst_value (arg0)); + return wide_int_to_tree (type, ~poly_int_cst_value (arg0)); /* Perform BIT_NOT_EXPR on each element individually. */ else if (TREE_CODE (arg0) == VECTOR_CST) {