[llvm] [DAG] narrowExtractedVectorLoad - add frozen load handling (PR #216120)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 13 14:20:07 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-x86
@llvm/pr-subscribers-llvm-selectiondag
Author: Simon Pilgrim (RKSimon)
<details>
<summary>Changes</summary>
Fixes #<!-- -->216115
---
Full diff: https://github.com/llvm/llvm-project/pull/216120.diff
2 Files Affected:
- (modified) llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (+7)
- (modified) llvm/test/CodeGen/X86/extractsubvector-load.ll (+5-18)
``````````diff
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 595cc5d653de6..6083111185ac2 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -28236,6 +28236,13 @@ SDValue DAGCombiner::visitEXTRACT_SUBVECTOR(SDNode *N) {
if (SDValue NarrowLoad = narrowExtractedVectorLoad(NVT, V, ExtIdx, DL, DAG))
return NarrowLoad;
+ // Peek through frozen loads, but ensure the load has a single use.
+ if (V.getOpcode() == ISD::FREEZE && V.hasOneUse() &&
+ V.getOperand(0).hasOneUse())
+ if (SDValue NarrowLoad =
+ narrowExtractedVectorLoad(NVT, V.getOperand(0), ExtIdx, DL, DAG))
+ return DAG.getFreeze(NarrowLoad);
+
// Combine an extract of an extract into a single extract_subvector.
// ext (ext X, C1), C2 --> ext X, C1 + C2
if (V.getOpcode() == ISD::EXTRACT_SUBVECTOR && V.hasOneUse()) {
diff --git a/llvm/test/CodeGen/X86/extractsubvector-load.ll b/llvm/test/CodeGen/X86/extractsubvector-load.ll
index cd6814d00cbbb..1b679631f4207 100644
--- a/llvm/test/CodeGen/X86/extractsubvector-load.ll
+++ b/llvm/test/CodeGen/X86/extractsubvector-load.ll
@@ -178,9 +178,7 @@ define <4 x i32> @load_v8i32_v4i32_ofs4_freeze(ptr %val) nounwind {
;
; X64-AVX-LABEL: load_v8i32_v4i32_ofs4_freeze:
; X64-AVX: # %bb.0:
-; X64-AVX-NEXT: vmovaps (%rdi), %ymm0
-; X64-AVX-NEXT: vextractf128 $1, %ymm0, %xmm0
-; X64-AVX-NEXT: vzeroupper
+; X64-AVX-NEXT: vmovaps 16(%rdi), %xmm0
; X64-AVX-NEXT: retq
%ld = load <8 x i32>, ptr %val
%fr = freeze <8 x i32> %ld
@@ -202,21 +200,10 @@ define <4 x double> @load_v8f64_v4f64_ofs0_freeze(ptr %val) nounwind {
; X64-SSE-NEXT: movaps 16(%rdi), %xmm1
; X64-SSE-NEXT: retq
;
-; X64-AVX1-LABEL: load_v8f64_v4f64_ofs0_freeze:
-; X64-AVX1: # %bb.0:
-; X64-AVX1-NEXT: vmovaps (%rdi), %ymm0
-; X64-AVX1-NEXT: retq
-;
-; X64-AVX2-LABEL: load_v8f64_v4f64_ofs0_freeze:
-; X64-AVX2: # %bb.0:
-; X64-AVX2-NEXT: vmovaps (%rdi), %ymm0
-; X64-AVX2-NEXT: retq
-;
-; X64-AVX512-LABEL: load_v8f64_v4f64_ofs0_freeze:
-; X64-AVX512: # %bb.0:
-; X64-AVX512-NEXT: vmovaps (%rdi), %zmm0
-; X64-AVX512-NEXT: # kill: def $ymm0 killed $ymm0 killed $zmm0
-; X64-AVX512-NEXT: retq
+; X64-AVX-LABEL: load_v8f64_v4f64_ofs0_freeze:
+; X64-AVX: # %bb.0:
+; X64-AVX-NEXT: vmovaps (%rdi), %ymm0
+; X64-AVX-NEXT: retq
%ld = load <8 x double>, ptr %val
%fr = freeze <8 x double> %ld
%sub = shufflevector <8 x double> %fr, <8 x double> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
``````````
</details>
https://github.com/llvm/llvm-project/pull/216120
More information about the llvm-commits
mailing list