[PATCH] D107158: [X86][AVX] Extract SUBV_BROADCAST constant bits from just the lower subvector range (PR51281)
Simon Pilgrim via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 6 03:22:12 PDT 2021
This revision was automatically updated to reflect the committed changes.
Closed by commit rG18e6a03b1a15: [X86][AVX] Extract SUBV_BROADCAST constant bits from just the lower subvector… (authored by RKSimon).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D107158/new/
https://reviews.llvm.org/D107158
Files:
llvm/lib/Target/X86/X86ISelLowering.cpp
llvm/test/CodeGen/X86/pr51281.ll
Index: llvm/test/CodeGen/X86/pr51281.ll
===================================================================
--- llvm/test/CodeGen/X86/pr51281.ll
+++ llvm/test/CodeGen/X86/pr51281.ll
@@ -8,8 +8,8 @@
; CHECK-NEXT: .long 0x3eb5dbc6
; CHECK-NEXT: .zero 4
; CHECK-NEXT: .long 0x3eb5dbc6
-; CHECK-NEXT: .zero 4
-; CHECK-NEXT: .zero 4
+; CHECK-NEXT: .long 0x3eb5dbc6
+; CHECK-NEXT: .long 0x3eb5dbc6
; CHECK: .LCPI0_1:
; CHECK-NEXT: .long 3
Index: llvm/lib/Target/X86/X86ISelLowering.cpp
===================================================================
--- llvm/lib/Target/X86/X86ISelLowering.cpp
+++ llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -6704,17 +6704,21 @@
if (Op.getOpcode() == X86ISD::SUBV_BROADCAST_LOAD) {
auto *MemIntr = cast<MemIntrinsicSDNode>(Op);
SDValue Ptr = MemIntr->getBasePtr();
+ // The source constant may be larger than the subvector broadcast,
+ // ensure we extract the correct subvector constants.
if (const Constant *Cst = getTargetConstantFromBasePtr(Ptr)) {
Type *CstTy = Cst->getType();
unsigned CstSizeInBits = CstTy->getPrimitiveSizeInBits();
- if (!CstTy->isVectorTy() || (SizeInBits % CstSizeInBits) != 0)
+ unsigned SubVecSizeInBits = MemIntr->getMemoryVT().getStoreSizeInBits();
+ if (!CstTy->isVectorTy() || (CstSizeInBits % SubVecSizeInBits) != 0 ||
+ (SizeInBits % SubVecSizeInBits) != 0)
return false;
- unsigned SubEltSizeInBits = CstTy->getScalarSizeInBits();
- unsigned NumSubElts = CstSizeInBits / SubEltSizeInBits;
- unsigned NumSubVecs = SizeInBits / CstSizeInBits;
+ unsigned CstEltSizeInBits = CstTy->getScalarSizeInBits();
+ unsigned NumSubElts = SubVecSizeInBits / CstEltSizeInBits;
+ unsigned NumSubVecs = SizeInBits / SubVecSizeInBits;
APInt UndefSubElts(NumSubElts, 0);
SmallVector<APInt, 64> SubEltBits(NumSubElts * NumSubVecs,
- APInt(SubEltSizeInBits, 0));
+ APInt(CstEltSizeInBits, 0));
for (unsigned i = 0; i != NumSubElts; ++i) {
if (!CollectConstantBits(Cst->getAggregateElement(i), SubEltBits[i],
UndefSubElts, i))
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D107158.364741.patch
Type: text/x-patch
Size: 2239 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210806/8c930ff6/attachment.bin>
More information about the llvm-commits
mailing list