Fix folding of BIT_NOT_EXPR for POLY_INT_CST (PR 118976, RHEL-90240)

Resolves: RHEL-90240
This commit is contained in:
Joseph Myers 2025-05-29 21:25:19 +01:00
parent 5a818f37a4
commit 195cabaab8
2 changed files with 70 additions and 1 deletions

View File

@ -5,7 +5,7 @@
%global gcc_major 8 %global gcc_major 8
# Note, gcc_release must be integer, if you want to add suffixes to # Note, gcc_release must be integer, if you want to add suffixes to
# %%{release}, append them after %%{gcc_release} on Release: line. # %%{release}, append them after %%{gcc_release} on Release: line.
%global gcc_release 26 %global gcc_release 27
%global nvptx_tools_gitrev c28050f60193b3b95a18866a96f03334e874e78f %global nvptx_tools_gitrev c28050f60193b3b95a18866a96f03334e874e78f
%global nvptx_newlib_gitrev aadc8eb0ec43b7cd0dd2dfb484bae63c8b05ef24 %global nvptx_newlib_gitrev aadc8eb0ec43b7cd0dd2dfb484bae63c8b05ef24
%global _unpackaged_files_terminate_build 0 %global _unpackaged_files_terminate_build 0
@ -309,6 +309,7 @@ Patch47: gcc8-pr111039.patch
Patch48: gcc8-pr111070.patch Patch48: gcc8-pr111070.patch
Patch49: gcc8-RHEL-32886.patch Patch49: gcc8-RHEL-32886.patch
Patch50: gcc8-pr100508.patch Patch50: gcc8-pr100508.patch
Patch51: gcc8-pr118976.patch
# Any patches changing libstdc++-v3/python and its tests should go after this. # Any patches changing libstdc++-v3/python and its tests should go after this.
Patch1000: gcc8-libstdc++-prettyprinter-update-14.patch Patch1000: gcc8-libstdc++-prettyprinter-update-14.patch
@ -941,6 +942,7 @@ so that there cannot be any synchronization problems.
%patch48 -p1 -b .pr111070~ %patch48 -p1 -b .pr111070~
%patch49 -p0 -b .32886~ %patch49 -p0 -b .32886~
%patch50 -p1 -b .pr100508~ %patch50 -p1 -b .pr100508~
%patch51 -p1 -b .pr118976~
%patch1000 -p1 -b .libstdc++-prettyprinter-update-14~ %patch1000 -p1 -b .libstdc++-prettyprinter-update-14~
%patch1001 -p1 -b .libstdc++-prettyprinter-update-14-tests~ %patch1001 -p1 -b .libstdc++-prettyprinter-update-14-tests~
@ -3354,6 +3356,9 @@ fi
%{ANNOBIN_GCC_PLUGIN_DIR}/gcc-annobin.so.0.0.0 %{ANNOBIN_GCC_PLUGIN_DIR}/gcc-annobin.so.0.0.0
%changelog %changelog
* Thu May 29 2025 Joseph Myers <josmyers@redhat.com> - 8.5.0-27
- Fix folding of BIT_NOT_EXPR for POLY_INT_CST (PR 118976, RHEL-90240)
* Fri Mar 21 2025 Siddhesh Poyarekar <siddhesh@redhat.com> 8.5.0-26 * Fri Mar 21 2025 Siddhesh Poyarekar <siddhesh@redhat.com> 8.5.0-26
- Pin modification time for python files to SOURCE_DATE_EPOCH (RHEL-50290). - Pin modification time for python files to SOURCE_DATE_EPOCH (RHEL-50290).

64
gcc8-pr118976.patch Normal file
View File

@ -0,0 +1,64 @@
Original patch (taken from GCC 12 branch version) edited for GCC 8 to
use .c rather than .cc filenames and to update aarch64.c changes to
apply to GCC 8.
commit 587b370c8492aadaab14c57e242c66778cc78891
Author: Richard Sandiford <richard.sandiford@arm.com>
Date: Tue Mar 11 15:51:55 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 --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index be0d958dcf6b..72d737d62228 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -27541,6 +27541,16 @@ aarch64_test_fractional_cost ()
ASSERT_EQ (SImode, GET_MODE (crtl->return_rtx));
}
+/* 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
@@ -27548,5 +27558,6 @@ aarch64_run_selftests (void)
{
aarch64_test_loading_full_dump ();
+ aarch64_test_sve_folding ();
}
} // namespace selftest
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index d81a71c41a17..391f11095408 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -1802,7 +1802,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)
{