[gcc(refs/users/meissner/heads/work195-sha)] Update ChangeLog.*
Michael Meissner
meissner@gcc.gnu.org
Sun Mar 9 03:05:45 GMT 2025
https://gcc.gnu.org/g:9e1489fcea846f0c385d19d8f7e8a5865f52ab6a
commit 9e1489fcea846f0c385d19d8f7e8a5865f52ab6a
Author: Michael Meissner <meissner@linux.ibm.com>
Date: Sat Mar 8 22:05:42 2025 -0500
Update ChangeLog.*
Diff:
---
gcc/ChangeLog.sha | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 168 insertions(+)
diff --git a/gcc/ChangeLog.sha b/gcc/ChangeLog.sha
index d9eb66e3f6f6..1c3322fd180d 100644
--- a/gcc/ChangeLog.sha
+++ b/gcc/ChangeLog.sha
@@ -1,5 +1,173 @@
+==================== Branch work195-sha, patch #401 ====================
+
+Add potential p-future XVRLD and XVRLDI instructions.
+
+2025-03-08 Michael Meissner <meissner@linux.ibm.com>
+
+gcc/
+
+ * config/rs6000/altivec.md (altivec_vrl<VI_char>): Add support for a
+ possible XVRLD instruction in the future.
+ (altivec_vrl<VI_char>_immediate): New insns.
+ * config/rs6000/predicates.md (vector_shift_immediate): New predicate.
+ * config/rs6000/rs6000.h (TARGET_XVRLW): New macro.
+ * config/rs6000/rs6000.md (isa attribute): Add xvrlw.
+ (enabled attribute): Add support for xvrlw.
+
+gcc/testsuite/
+
+ * gcc.target/powerpc/vector-rotate-left.c: New test.
+ * lib/target-supports.exp (check_effective_target_powerpc_future_ok):
+ Add support to test -mcpu=future.
+
+==================== Branch work195-sha, patch #400 ====================
+
+PR target/117251: Add PowerPC XXEVAL support to speed up SHA3 calculations
+
+The multibuff.c benchmark attached to the PR target/117251 compiled for Power10
+PowerPC that implement SHA3 has a slowdown in the current trunk and GCC 14
+compared to GCC 11 - GCC 13, due to excessive amounts of spilling.
+
+The main function for the multibuf.c file has 3,747 lines, all of which are
+using vector unsigned long long. There are 696 vector rotates (all rotates are
+constant), 1,824 vector xor's and 600 vector andc's.
+
+In looking at it, the main thing that steps out is the reason for either
+spilling or moving variables is the support in fusion.md (generated by
+genfusion.pl) that tries to fuse the vec_andc feeding into vec_xor, and other
+vec_xor's feeding into vec_xor.
+
+On the powerpc for power10, there is a special fusion mode that happens if the
+machine has a VANDC or VXOR instruction that is adjacent to a VXOR instruction
+and the VANDC/VXOR feeds into the 2nd VXOR instruction.
+
+While the Power10 has 64 vector registers (which uses the XXL prefix to do
+logical operations), the fusion only works with the older Altivec instruction
+set (which uses the V prefix). The Altivec instruction only has 32 vector
+registers (which are overlaid over the VSX vector registers 32-63).
+
+By having the combiner patterns fuse_vandc_vxor and fuse_vxor_vxor to do this
+fusion, it means that the register allocator has more register pressure for the
+traditional Altivec registers instead of the VSX registers.
+
+In addition, since there are vector rotates, these rotates only work on the
+traditional Altivec registers, which adds to the Altivec register pressure.
+
+Finally in addition to doing the explicit xor, andc, and rotates using the
+Altivec registers, we have to also load vector constants for the rotate amount
+and these registers also are allocated as Altivec registers.
+
+Current trunk and GCC 12-14 have more vector spills than GCC 11, but GCC 11 has
+many more vector moves that the later compilers. Thus even though it has way
+less spills, the vector moves are why GCC 11 have the slowest results.
+
+There is an instruction that was added in power10 (XXEVAL) that does provide
+fusion between VSX vectors that includes ANDC->XOR and XOR->XOR fusion.
+
+The latency of XXEVAL is slightly more than the fused VANDC/VXOR or VXOR/VXOR,
+so I have written the patch to prefer doing the Altivec instructions if they
+don't need a temporary register.
+
+Here are the results for adding support for XXEVAL for the multibuff.c
+benchmark attached to the PR. Note that we essentially recover the speed with
+this patch that were lost with GCC 14 and the current trunk:
+
+ XXEVAL Trunk GCC14 GCC13 GCC12 GCC11
+ ------ ----- ----- ----- ----- -----
+Benchmark time in seconds 5.53 6.15 6.26 5.57 5.61 9.56
+
+Fuse VANDC -> VXOR 209 600 600 600 600 600
+Fuse VXOR -> VXOR 0 240 240 120 120 120
+XXEVAL to fuse ANDC -> XOR 391 0 0 0 0 0
+XXEVAL to fuse XOR -> XOR 240 0 0 0 0 0
+
+Spill vector to stack 78 364 364 172 184 110
+Load spilled vector from stack 431 962 962 713 723 166
+Vector moves 10 100 100 70 72 3,055
+
+Vector rotate right 696 696 696 696 696 696
+XXLANDC or VANDC 209 600 600 600 600 600
+XXLXOR or VXOR 953 1,824 1,824 1,824 1,824 1,825
+XXEVAL 631 0 0 0 0 0
+
+Load vector rotate constants 24 24 24 24 24 24
+
+
+Here are the results for adding support for XXEVAL for the singlebuff.c
+benchmark attached to the PR. Note that adding XXEVAL greatly speeds up this
+particular benchmark:
+
+ XXEVAL Trunk GCC14 GCC13 GCC12 GCC11
+ ------ ----- ----- ----- ----- -----
+Benchmark time in seconds 4.46 5.40 5.40 5.35 5.36 7.54
+
+Fuse VANDC -> VXOR 210 600 600 600 600 600
+Fuse VXOR -> VXOR 0 240 240 120 120 120
+XXEVAL to fuse ANDC -> XOR 390 0 0 0 0 0
+XXEVAL to fuse XOR -> XOR 240 0 0 0 0 0
+
+Spill vector to stack 113 379 379 382 382 63
+Load spilled vector from stack 333 796 796 757 757 68
+Vector moves 34 80 80 119 119 2,409
+
+Vector rotate right 696 696 696 696 696 696
+XXLANDC or VANDC 210 600 600 600 600 600
+XXLXOR or VXOR 954 1,824 1,824 1,824 1,824 1,824
+XXEVAL 630 0 0 0 0 0
+
+Load vector rotate constants 96 96 96 96 96 96
+
+
+These patches add the following fusion patterns:
+
+ xxland => xxland xxlandc => xxland xxlxor => xxland
+ xxlor => xxland xxlnor => xxland xxleqv => xxland
+ xxlorc => xxland xxlandc => xxlandc xxlnand => xxland
+ xxlnand => xxlnor xxland => xxlxor xxland => xxlor
+ xxlandc => xxlxor xxlandc => xxlor xxlorc => xxlnor
+ xxlorc => xxleqv xxlorc => xxlorc xxleqv => xxlnor
+ xxlxor => xxlxor xxlxor => xxlor xxlnor => xxlnor
+ xxlor => xxlxor xxlor => xxlor xxlor => xxlnor
+ xxlnor => xxlxor xxlnor => xxlor xxlxor => xxlnor
+ xxleqv => xxlxor xxleqv => xxlor xxlorc => xxlxor
+ xxlorc => xxlor xxlandc => xxlnor xxlandc => xxleqv
+ xxland => xxlnor xxlnand => xxlxor xxlnand => xxlor
+ xxlnand => xxlnand xxlorc => xxlnand xxleqv => xxlnand
+ xxlnor => xxlnand xxlor => xxlnand xxlxor => xxlnand
+ xxlandc => xxlnand xxland => xxlnand
+
+
+2025-03-08 Michael Meissner <meissner@linux.ibm.com>
+
+gcc/
+
+ PR target/117251
+ * config/rs6000/fusion.md: Regenerate.
+ * config/rs6000/genfusion.pl (gen_logical_addsubf): Add support to
+ generate vector/vector logical fusion if XXEVAL supports the fusion.
+ * config/rs6000/predicates.md (vector_fusion_operand): New predicate.
+ * config/rs6000/rs6000.cc (rs6000_opt_vars): Add -mxxeval.
+ * config/rs6000/rs6000.md (isa attribute): Add xxeval.
+ (enabled attribute): Add support for -mxxeval.
+ * config/rs6000/rs6000.opt (-mxxeval): New switch.
+
+gcc/testsuite/
+
+ PR target/117251
+ * gcc.target/powerpc/p10-vector-fused-1.c: New test.
+ * gcc.target/powerpc/p10-vector-fused-2.c: Likewise.
+
==================== Branch work195-sha, baseline ====================
+Add ChangeLog.sha and update REVISION.
+
+2025-03-08 Michael Meissner <meissner@linux.ibm.com>
+
+gcc/
+
+ * ChangeLog.sha: New file for branch.
+ * REVISION: Update.
+
2025-03-08 Michael Meissner <meissner@linux.ibm.com>
Clone branch
More information about the Gcc-cvs
mailing list