[llvm] [X86] Fold MOVAPS+SHUFPS into PSHUFD to eliminate redundant copies when … (PR #212626)

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 19 05:33:49 PDT 2026


================
@@ -0,0 +1,174 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64    | FileCheck %s --check-prefixes=SSE2
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=SSE4
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+no-bypass-delay-shuffle | FileCheck %s --check-prefixes=NO-DELAY
+; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=znver2 -mattr=-avx | FileCheck %s --check-prefixes=ZNVER2
+
+; Test that single-source v4f32 shuffles use PSHUFD instead of SHUFPS on CPUs
+; where there is no domain delay for shuffles.
+
+define <4 x float> @shuffle_v4f32_splat2(<4 x float> %a) {
+; SSE2-LABEL: shuffle_v4f32_splat2:
+; SSE2:       # %bb.0:
+; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,2,2,2]
+; SSE2-NEXT:    retq
+;
+; SSE4-LABEL: shuffle_v4f32_splat2:
+; SSE4:       # %bb.0:
+; SSE4-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,2,2,2]
+; SSE4-NEXT:    retq
+;
+; NO-DELAY-LABEL: shuffle_v4f32_splat2:
+; NO-DELAY:       # %bb.0:
+; NO-DELAY-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,2,2,2]
+; NO-DELAY-NEXT:    retq
+;
+; ZNVER2-LABEL: shuffle_v4f32_splat2:
+; ZNVER2:       # %bb.0:
+; ZNVER2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,2,2,2]
+; ZNVER2-NEXT:    retq
+  %r = shufflevector <4 x float> %a, <4 x float> poison, <4 x i32> <i32 2, i32 2, i32 2, i32 2>
+  ret <4 x float> %r
+}
+
+define <4 x float> @shuffle_v4f32_0123(<4 x float> %a) {
+; SSE2-LABEL: shuffle_v4f32_0123:
+; SSE2:       # %bb.0:
+; SSE2-NEXT:    retq
+;
+; SSE4-LABEL: shuffle_v4f32_0123:
+; SSE4:       # %bb.0:
+; SSE4-NEXT:    retq
+;
+; NO-DELAY-LABEL: shuffle_v4f32_0123:
+; NO-DELAY:       # %bb.0:
+; NO-DELAY-NEXT:    retq
+;
+; ZNVER2-LABEL: shuffle_v4f32_0123:
+; ZNVER2:       # %bb.0:
+; ZNVER2-NEXT:    retq
+  %r = shufflevector <4 x float> %a, <4 x float> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
+  ret <4 x float> %r
+}
----------------
RKSimon wrote:

not sure this test has much worth? shuffle identity won't get past DAG builder

https://github.com/llvm/llvm-project/pull/212626


More information about the llvm-commits mailing list