This patch is in three parts, but the main one is patch 1.

1. Using something like __builtin_shuffle and picking the same lane for every 
element is effectively a duplication operation to the result from a single 
lane.  Allow match.pd to recognize this and simplify it to VEC_DUPLICATE.  Note 
that I added the call to canonicalize_math_after_vectorization_p following 
initial discussions on this idea with Tamar - he was concerned that a later 
pass might end up undoing this change if it was run earlier.
2. This introduces some parity to the way we treat sub-regs between CSE and 
combine when handling VEC_SELECT.  Combine will only try to substitute a subreg 
if the two modes are marked as tieable; the comment argues that doing otherwise 
can lead to internal errors.  However, CSE and combine's own simplify 
optimizations will happily try to make the reverse transformation.  The result 
is that combine is unable to reverse the effects of this leading to sub-optimal 
code.  Rather than risk the issues that combine warns about, I've made the 
other cases avoid generating a subreg when the modes are not marked tieable - 
it seems to me that if it is only safe to make the transformation in one 
direction, then it really should only be safe to make the reverse 
transformation under the same conditions.
3. Patch 3 is to fix some fallout from the above in the testsuite for aarch64.  
Now that we create VEC_DUPLICATE in this way, we need vec_select expanders that 
can handle SVE partial modes.  The patch generalizes the existing patters to 
support all SVE vector modes, rather than just the SVE full-vector modes.

The third patch is still a bit of work-in-progress - it passes all the current 
regression tests, but I haven't (yet) been able to make sure that all the 
dependent patterns are reached to verify their output.  I'll continue to test 
that some more next week, but I think in the mean time it's ready for some 
initial comments.


---
This is a forge pull request published on the gcc-patches mailing list mailing 
list
as requested by Richard Earnshaw via Sourceware Forge 
<[email protected]>.
Forge discussion: https://forge.sourceware.org/gcc/gcc/pulls/276

Get it locally using:
```
git fetch forge-upstream "+refs/versioned_pull/276/*:refs/versioned_pull/276/*"
git switch -c "pr-276-v1" "refs/versioned_pull/276/1/head"
```
Or, download the patch at: https://forge.sourceware.org/gcc/gcc/pulls/276.diff
Created on: 2026-11-13 11:42:43+00:00
Latest update: 2026-11-13 11:42:58+00:00
Changes: 6 changed files, 207 additions, 24 deletions
Head revision: rearnsha/gcc ref vec-perm-via-dup commit 
a2fb5027d7449b1fe4674735ba8cf8e365c6d815
Base revision: gcc/gcc ref trunk commit 
4e9ff50d49e07bf9345c925ac69f1c0657f0be9c r17-6186-g4e9ff50d49e07b
Merge base: 4e9ff50d49e07bf9345c925ac69f1c0657f0be9c
Requested Reviewers:

Changed files:
- A: gcc/testsuite/gcc.target/aarch64/sve/vec_lane_1.c
- M: gcc/combine.cc
- M: gcc/config/aarch64/aarch64-sve.md
- M: gcc/config/aarch64/iterators.md
- M: gcc/cse.cc
- M: gcc/match.pd

Richard Earnshaw (3):
  match.pd: simplify vec_perm to vec_duplicate
  rtl: Only simplify vec_select to subreg if the modes are tieable
  aarch64: generalize SVE vec_extract for all vector types.

 gcc/combine.cc                                |   6 +-
 gcc/config/aarch64/aarch64-sve.md             |  34 +++---
 gcc/config/aarch64/iterators.md               |  58 +++++++++-
 gcc/cse.cc                                    |   6 +-
 gcc/match.pd                                  |  24 +++-
 .../gcc.target/aarch64/sve/vec_lane_1.c       | 103 ++++++++++++++++++
 6 files changed, 207 insertions(+), 24 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/aarch64/sve/vec_lane_1.c

-- 
2.56.0

Reply via email to