]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix folding of BIT_NOT_EXPR for POLY_INT_CST [PR118976]
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 4 Mar 2025 10:44:35 +0000 (10:44 +0000)
committerRichard Sandiford <richard.sandiford@arm.com>
Tue, 4 Mar 2025 10:44:35 +0000 (10:44 +0000)
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.

gcc/config/aarch64/aarch64.cc
gcc/fold-const.cc

index fe76730b0a7c8a2baaae24152e13d82a12d5d0a3..af3871ce8a1f04f8ecebab926f7b3b2afabb8250 100644 (file)
@@ -31336,6 +31336,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
@@ -31344,6 +31354,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
index f9f7f4d2f917235a2ffef67c363b3cfb8c1694f9..fef7a6cc48eff55436f8687116d492ffefea3aff 100644 (file)
@@ -1964,7 +1964,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)
        {