@@ -385,17 +385,6 @@ namespace {
385
385
bool getTruncatedStoreValue(StoreSDNode *ST, SDValue &Val);
386
386
bool extendLoadedValueToExtension(LoadSDNode *LD, SDValue &Val);
387
387
388
- /// Replace an ISD::EXTRACT_VECTOR_ELT of a load with a narrowed
389
- /// load.
390
- ///
391
- /// \param EVE ISD::EXTRACT_VECTOR_ELT to be replaced.
392
- /// \param InVecVT type of the input vector to EVE with bitcasts resolved.
393
- /// \param EltNo index of the vector element to load.
394
- /// \param OriginalLoad load that EVE came from to be replaced.
395
- /// \returns EVE on success SDValue() on failure.
396
- SDValue scalarizeExtractedVectorLoad(SDNode *EVE, EVT InVecVT,
397
- SDValue EltNo,
398
- LoadSDNode *OriginalLoad);
399
388
void ReplaceLoadWithPromotedLoad(SDNode *Load, SDNode *ExtLoad);
400
389
SDValue PromoteOperand(SDValue Op, EVT PVT, bool &Replace);
401
390
SDValue SExtPromoteOperand(SDValue Op, EVT PVT);
@@ -22719,81 +22708,6 @@ SDValue DAGCombiner::visitINSERT_VECTOR_ELT(SDNode *N) {
22719
22708
return SDValue();
22720
22709
}
22721
22710
22722
- SDValue DAGCombiner::scalarizeExtractedVectorLoad(SDNode *EVE, EVT InVecVT,
22723
- SDValue EltNo,
22724
- LoadSDNode *OriginalLoad) {
22725
- assert(OriginalLoad->isSimple());
22726
-
22727
- EVT ResultVT = EVE->getValueType(0);
22728
- EVT VecEltVT = InVecVT.getVectorElementType();
22729
-
22730
- // If the vector element type is not a multiple of a byte then we are unable
22731
- // to correctly compute an address to load only the extracted element as a
22732
- // scalar.
22733
- if (!VecEltVT.isByteSized())
22734
- return SDValue();
22735
-
22736
- ISD::LoadExtType ExtTy =
22737
- ResultVT.bitsGT(VecEltVT) ? ISD::EXTLOAD : ISD::NON_EXTLOAD;
22738
- if (!TLI.isOperationLegalOrCustom(ISD::LOAD, VecEltVT) ||
22739
- !TLI.shouldReduceLoadWidth(OriginalLoad, ExtTy, VecEltVT))
22740
- return SDValue();
22741
-
22742
- Align Alignment = OriginalLoad->getAlign();
22743
- MachinePointerInfo MPI;
22744
- SDLoc DL(EVE);
22745
- if (auto *ConstEltNo = dyn_cast<ConstantSDNode>(EltNo)) {
22746
- int Elt = ConstEltNo->getZExtValue();
22747
- unsigned PtrOff = VecEltVT.getSizeInBits() * Elt / 8;
22748
- MPI = OriginalLoad->getPointerInfo().getWithOffset(PtrOff);
22749
- Alignment = commonAlignment(Alignment, PtrOff);
22750
- } else {
22751
- // Discard the pointer info except the address space because the memory
22752
- // operand can't represent this new access since the offset is variable.
22753
- MPI = MachinePointerInfo(OriginalLoad->getPointerInfo().getAddrSpace());
22754
- Alignment = commonAlignment(Alignment, VecEltVT.getSizeInBits() / 8);
22755
- }
22756
-
22757
- unsigned IsFast = 0;
22758
- if (!TLI.allowsMemoryAccess(*DAG.getContext(), DAG.getDataLayout(), VecEltVT,
22759
- OriginalLoad->getAddressSpace(), Alignment,
22760
- OriginalLoad->getMemOperand()->getFlags(),
22761
- &IsFast) ||
22762
- !IsFast)
22763
- return SDValue();
22764
-
22765
- SDValue NewPtr = TLI.getVectorElementPointer(DAG, OriginalLoad->getBasePtr(),
22766
- InVecVT, EltNo);
22767
-
22768
- // We are replacing a vector load with a scalar load. The new load must have
22769
- // identical memory op ordering to the original.
22770
- SDValue Load;
22771
- if (ResultVT.bitsGT(VecEltVT)) {
22772
- // If the result type of vextract is wider than the load, then issue an
22773
- // extending load instead.
22774
- ISD::LoadExtType ExtType =
22775
- TLI.isLoadExtLegal(ISD::ZEXTLOAD, ResultVT, VecEltVT) ? ISD::ZEXTLOAD
22776
- : ISD::EXTLOAD;
22777
- Load = DAG.getExtLoad(ExtType, DL, ResultVT, OriginalLoad->getChain(),
22778
- NewPtr, MPI, VecEltVT, Alignment,
22779
- OriginalLoad->getMemOperand()->getFlags(),
22780
- OriginalLoad->getAAInfo());
22781
- DAG.makeEquivalentMemoryOrdering(OriginalLoad, Load);
22782
- } else {
22783
- // The result type is narrower or the same width as the vector element
22784
- Load = DAG.getLoad(VecEltVT, DL, OriginalLoad->getChain(), NewPtr, MPI,
22785
- Alignment, OriginalLoad->getMemOperand()->getFlags(),
22786
- OriginalLoad->getAAInfo());
22787
- DAG.makeEquivalentMemoryOrdering(OriginalLoad, Load);
22788
- if (ResultVT.bitsLT(VecEltVT))
22789
- Load = DAG.getNode(ISD::TRUNCATE, DL, ResultVT, Load);
22790
- else
22791
- Load = DAG.getBitcast(ResultVT, Load);
22792
- }
22793
- ++OpsNarrowed;
22794
- return Load;
22795
- }
22796
-
22797
22711
/// Transform a vector binary operation into a scalar binary operation by moving
22798
22712
/// the math/logic after an extract element of a vector.
22799
22713
static SDValue scalarizeExtractedBinOp(SDNode *ExtElt, SelectionDAG &DAG,
@@ -23272,8 +23186,13 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) {
23272
23186
ISD::isNormalLoad(VecOp.getNode()) &&
23273
23187
!Index->hasPredecessor(VecOp.getNode())) {
23274
23188
auto *VecLoad = dyn_cast<LoadSDNode>(VecOp);
23275
- if (VecLoad && VecLoad->isSimple())
23276
- return scalarizeExtractedVectorLoad(N, VecVT, Index, VecLoad);
23189
+ if (VecLoad && VecLoad->isSimple()) {
23190
+ if (SDValue Scalarized = TLI.scalarizeExtractedVectorLoad(
23191
+ ExtVT, SDLoc(N), VecVT, Index, VecLoad, DAG)) {
23192
+ ++OpsNarrowed;
23193
+ return Scalarized;
23194
+ }
23195
+ }
23277
23196
}
23278
23197
23279
23198
// Perform only after legalization to ensure build_vector / vector_shuffle
@@ -23361,7 +23280,13 @@ SDValue DAGCombiner::visitEXTRACT_VECTOR_ELT(SDNode *N) {
23361
23280
if (Elt == -1)
23362
23281
return DAG.getUNDEF(LVT);
23363
23282
23364
- return scalarizeExtractedVectorLoad(N, VecVT, Index, LN0);
23283
+ if (SDValue Scalarized =
23284
+ TLI.scalarizeExtractedVectorLoad(LVT, DL, VecVT, Index, LN0, DAG)) {
23285
+ ++OpsNarrowed;
23286
+ return Scalarized;
23287
+ }
23288
+
23289
+ return SDValue();
23365
23290
}
23366
23291
23367
23292
// Simplify (build_vec (ext )) to (bitcast (build_vec ))
0 commit comments