@@ -877,8 +877,8 @@ SDValue DAGCombiner::PromoteOperand(SDValue Op, EVT PVT, bool &Replace) {
877
877
if (LoadSDNode *LD = dyn_cast<LoadSDNode>(Op)) {
878
878
EVT MemVT = LD->getMemoryVT();
879
879
ISD::LoadExtType ExtType = ISD::isNON_EXTLoad(LD)
880
- ? (TLI.isLoadExtLegal(ISD::ZEXTLOAD, MemVT) ? ISD::ZEXTLOAD
881
- : ISD::EXTLOAD)
880
+ ? (TLI.isLoadExtLegal(ISD::ZEXTLOAD, PVT, MemVT) ? ISD::ZEXTLOAD
881
+ : ISD::EXTLOAD)
882
882
: LD->getExtensionType();
883
883
Replace = true;
884
884
return DAG.getExtLoad(ExtType, dl, PVT,
@@ -1099,8 +1099,8 @@ bool DAGCombiner::PromoteLoad(SDValue Op) {
1099
1099
LoadSDNode *LD = cast<LoadSDNode>(N);
1100
1100
EVT MemVT = LD->getMemoryVT();
1101
1101
ISD::LoadExtType ExtType = ISD::isNON_EXTLoad(LD)
1102
- ? (TLI.isLoadExtLegal(ISD::ZEXTLOAD, MemVT) ? ISD::ZEXTLOAD
1103
- : ISD::EXTLOAD)
1102
+ ? (TLI.isLoadExtLegal(ISD::ZEXTLOAD, PVT, MemVT) ? ISD::ZEXTLOAD
1103
+ : ISD::EXTLOAD)
1104
1104
: LD->getExtensionType();
1105
1105
SDValue NewLD = DAG.getExtLoad(ExtType, dl, PVT,
1106
1106
LD->getChain(), LD->getBasePtr(),
@@ -2800,6 +2800,7 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
2800
2800
// actually legal and isn't going to get expanded, else this is a false
2801
2801
// optimisation.
2802
2802
bool CanZextLoadProfitably = TLI.isLoadExtLegal(ISD::ZEXTLOAD,
2803
+ Load->getValueType(0),
2803
2804
Load->getMemoryVT());
2804
2805
2805
2806
// Resize the constant to the same size as the original memory access before
@@ -2926,7 +2927,7 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
2926
2927
if (DAG.MaskedValueIsZero(N1, APInt::getHighBitsSet(BitWidth,
2927
2928
BitWidth - MemVT.getScalarType().getSizeInBits())) &&
2928
2929
((!LegalOperations && !LN0->isVolatile()) ||
2929
- TLI.isLoadExtLegal(ISD::ZEXTLOAD, MemVT))) {
2930
+ TLI.isLoadExtLegal(ISD::ZEXTLOAD, VT, MemVT))) {
2930
2931
SDValue ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, SDLoc(N0), VT,
2931
2932
LN0->getChain(), LN0->getBasePtr(),
2932
2933
MemVT, LN0->getMemOperand());
@@ -2946,7 +2947,7 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
2946
2947
if (DAG.MaskedValueIsZero(N1, APInt::getHighBitsSet(BitWidth,
2947
2948
BitWidth - MemVT.getScalarType().getSizeInBits())) &&
2948
2949
((!LegalOperations && !LN0->isVolatile()) ||
2949
- TLI.isLoadExtLegal(ISD::ZEXTLOAD, MemVT))) {
2950
+ TLI.isLoadExtLegal(ISD::ZEXTLOAD, VT, MemVT))) {
2950
2951
SDValue ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, SDLoc(N0), VT,
2951
2952
LN0->getChain(), LN0->getBasePtr(),
2952
2953
MemVT, LN0->getMemOperand());
@@ -2972,10 +2973,11 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
2972
2973
if (ActiveBits > 0 && APIntOps::isMask(ActiveBits, N1C->getAPIntValue())){
2973
2974
EVT ExtVT = EVT::getIntegerVT(*DAG.getContext(), ActiveBits);
2974
2975
EVT LoadedVT = LN0->getMemoryVT();
2976
+ EVT LoadResultTy = HasAnyExt ? LN0->getValueType(0) : VT;
2975
2977
2976
2978
if (ExtVT == LoadedVT &&
2977
- (!LegalOperations || TLI.isLoadExtLegal(ISD::ZEXTLOAD, ExtVT))) {
2978
- EVT LoadResultTy = HasAnyExt ? LN0->getValueType(0) : VT;
2979
+ (!LegalOperations || TLI.isLoadExtLegal(ISD::ZEXTLOAD, LoadResultTy,
2980
+ ExtVT))) {
2979
2981
2980
2982
SDValue NewLoad =
2981
2983
DAG.getExtLoad(ISD::ZEXTLOAD, SDLoc(LN0), LoadResultTy,
@@ -2990,7 +2992,8 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
2990
2992
// Do not generate loads of non-round integer types since these can
2991
2993
// be expensive (and would be wrong if the type is not byte sized).
2992
2994
if (!LN0->isVolatile() && LoadedVT.bitsGT(ExtVT) && ExtVT.isRound() &&
2993
- (!LegalOperations || TLI.isLoadExtLegal(ISD::ZEXTLOAD, ExtVT))) {
2995
+ (!LegalOperations || TLI.isLoadExtLegal(ISD::ZEXTLOAD, LoadResultTy,
2996
+ ExtVT))) {
2994
2997
EVT PtrType = LN0->getOperand(1).getValueType();
2995
2998
2996
2999
unsigned Alignment = LN0->getAlignment();
@@ -3010,7 +3013,6 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
3010
3013
3011
3014
AddToWorklist(NewPtr.getNode());
3012
3015
3013
- EVT LoadResultTy = HasAnyExt ? LN0->getValueType(0) : VT;
3014
3016
SDValue Load =
3015
3017
DAG.getExtLoad(ISD::ZEXTLOAD, SDLoc(LN0), LoadResultTy,
3016
3018
LN0->getChain(), NewPtr,
@@ -5282,7 +5284,7 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {
5282
5284
if (ISD::isNON_EXTLoad(N0.getNode()) && !VT.isVector() &&
5283
5285
ISD::isUNINDEXEDLoad(N0.getNode()) &&
5284
5286
((!LegalOperations && !cast<LoadSDNode>(N0)->isVolatile()) ||
5285
- TLI.isLoadExtLegal(ISD::SEXTLOAD, N0.getValueType()))) {
5287
+ TLI.isLoadExtLegal(ISD::SEXTLOAD, VT, N0.getValueType()))) {
5286
5288
bool DoXform = true;
5287
5289
SmallVector<SDNode*, 4> SetCCs;
5288
5290
if (!N0.hasOneUse())
@@ -5310,7 +5312,7 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {
5310
5312
LoadSDNode *LN0 = cast<LoadSDNode>(N0);
5311
5313
EVT MemVT = LN0->getMemoryVT();
5312
5314
if ((!LegalOperations && !LN0->isVolatile()) ||
5313
- TLI.isLoadExtLegal(ISD::SEXTLOAD, MemVT)) {
5315
+ TLI.isLoadExtLegal(ISD::SEXTLOAD, VT, MemVT)) {
5314
5316
SDValue ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, SDLoc(N), VT,
5315
5317
LN0->getChain(),
5316
5318
LN0->getBasePtr(), MemVT,
@@ -5330,7 +5332,7 @@ SDValue DAGCombiner::visitSIGN_EXTEND(SDNode *N) {
5330
5332
N0.getOpcode() == ISD::XOR) &&
5331
5333
isa<LoadSDNode>(N0.getOperand(0)) &&
5332
5334
N0.getOperand(1).getOpcode() == ISD::Constant &&
5333
- TLI.isLoadExtLegal(ISD::SEXTLOAD, N0.getValueType()) &&
5335
+ TLI.isLoadExtLegal(ISD::SEXTLOAD, VT, N0.getValueType()) &&
5334
5336
(!LegalOperations && TLI.isOperationLegal(N0.getOpcode(), VT))) {
5335
5337
LoadSDNode *LN0 = cast<LoadSDNode>(N0.getOperand(0));
5336
5338
if (LN0->getExtensionType() != ISD::ZEXTLOAD && LN0->isUnindexed()) {
@@ -5572,7 +5574,7 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {
5572
5574
if (ISD::isNON_EXTLoad(N0.getNode()) && !VT.isVector() &&
5573
5575
ISD::isUNINDEXEDLoad(N0.getNode()) &&
5574
5576
((!LegalOperations && !cast<LoadSDNode>(N0)->isVolatile()) ||
5575
- TLI.isLoadExtLegal(ISD::ZEXTLOAD, N0.getValueType()))) {
5577
+ TLI.isLoadExtLegal(ISD::ZEXTLOAD, VT, N0.getValueType()))) {
5576
5578
bool DoXform = true;
5577
5579
SmallVector<SDNode*, 4> SetCCs;
5578
5580
if (!N0.hasOneUse())
@@ -5600,7 +5602,7 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {
5600
5602
N0.getOpcode() == ISD::XOR) &&
5601
5603
isa<LoadSDNode>(N0.getOperand(0)) &&
5602
5604
N0.getOperand(1).getOpcode() == ISD::Constant &&
5603
- TLI.isLoadExtLegal(ISD::ZEXTLOAD, N0.getValueType()) &&
5605
+ TLI.isLoadExtLegal(ISD::ZEXTLOAD, VT, N0.getValueType()) &&
5604
5606
(!LegalOperations && TLI.isOperationLegal(N0.getOpcode(), VT))) {
5605
5607
LoadSDNode *LN0 = cast<LoadSDNode>(N0.getOperand(0));
5606
5608
if (LN0->getExtensionType() != ISD::SEXTLOAD && LN0->isUnindexed()) {
@@ -5637,7 +5639,7 @@ SDValue DAGCombiner::visitZERO_EXTEND(SDNode *N) {
5637
5639
LoadSDNode *LN0 = cast<LoadSDNode>(N0);
5638
5640
EVT MemVT = LN0->getMemoryVT();
5639
5641
if ((!LegalOperations && !LN0->isVolatile()) ||
5640
- TLI.isLoadExtLegal(ISD::ZEXTLOAD, MemVT)) {
5642
+ TLI.isLoadExtLegal(ISD::ZEXTLOAD, VT, MemVT)) {
5641
5643
SDValue ExtLoad = DAG.getExtLoad(ISD::ZEXTLOAD, SDLoc(N), VT,
5642
5644
LN0->getChain(),
5643
5645
LN0->getBasePtr(), MemVT,
@@ -5799,7 +5801,7 @@ SDValue DAGCombiner::visitANY_EXTEND(SDNode *N) {
5799
5801
// scalars.
5800
5802
if (ISD::isNON_EXTLoad(N0.getNode()) && !VT.isVector() &&
5801
5803
ISD::isUNINDEXEDLoad(N0.getNode()) &&
5802
- TLI.isLoadExtLegal(ISD::EXTLOAD, N0.getValueType())) {
5804
+ TLI.isLoadExtLegal(ISD::EXTLOAD, VT, N0.getValueType())) {
5803
5805
bool DoXform = true;
5804
5806
SmallVector<SDNode*, 4> SetCCs;
5805
5807
if (!N0.hasOneUse())
@@ -5829,7 +5831,7 @@ SDValue DAGCombiner::visitANY_EXTEND(SDNode *N) {
5829
5831
LoadSDNode *LN0 = cast<LoadSDNode>(N0);
5830
5832
ISD::LoadExtType ExtType = LN0->getExtensionType();
5831
5833
EVT MemVT = LN0->getMemoryVT();
5832
- if (!LegalOperations || TLI.isLoadExtLegal(ExtType, MemVT)) {
5834
+ if (!LegalOperations || TLI.isLoadExtLegal(ExtType, VT, MemVT)) {
5833
5835
SDValue ExtLoad = DAG.getExtLoad(ExtType, SDLoc(N),
5834
5836
VT, LN0->getChain(), LN0->getBasePtr(),
5835
5837
MemVT, LN0->getMemOperand());
@@ -5958,7 +5960,7 @@ SDValue DAGCombiner::ReduceLoadWidth(SDNode *N) {
5958
5960
ExtVT = EVT::getIntegerVT(*DAG.getContext(),
5959
5961
VT.getSizeInBits() - N01->getZExtValue());
5960
5962
}
5961
- if (LegalOperations && !TLI.isLoadExtLegal(ExtType, ExtVT))
5963
+ if (LegalOperations && !TLI.isLoadExtLegal(ExtType, VT, ExtVT))
5962
5964
return SDValue();
5963
5965
5964
5966
unsigned EVTBits = ExtVT.getSizeInBits();
@@ -6165,7 +6167,7 @@ SDValue DAGCombiner::visitSIGN_EXTEND_INREG(SDNode *N) {
6165
6167
ISD::isUNINDEXEDLoad(N0.getNode()) &&
6166
6168
EVT == cast<LoadSDNode>(N0)->getMemoryVT() &&
6167
6169
((!LegalOperations && !cast<LoadSDNode>(N0)->isVolatile()) ||
6168
- TLI.isLoadExtLegal(ISD::SEXTLOAD, EVT))) {
6170
+ TLI.isLoadExtLegal(ISD::SEXTLOAD, VT, EVT))) {
6169
6171
LoadSDNode *LN0 = cast<LoadSDNode>(N0);
6170
6172
SDValue ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, SDLoc(N), VT,
6171
6173
LN0->getChain(),
@@ -6181,7 +6183,7 @@ SDValue DAGCombiner::visitSIGN_EXTEND_INREG(SDNode *N) {
6181
6183
N0.hasOneUse() &&
6182
6184
EVT == cast<LoadSDNode>(N0)->getMemoryVT() &&
6183
6185
((!LegalOperations && !cast<LoadSDNode>(N0)->isVolatile()) ||
6184
- TLI.isLoadExtLegal(ISD::SEXTLOAD, EVT))) {
6186
+ TLI.isLoadExtLegal(ISD::SEXTLOAD, VT, EVT))) {
6185
6187
LoadSDNode *LN0 = cast<LoadSDNode>(N0);
6186
6188
SDValue ExtLoad = DAG.getExtLoad(ISD::SEXTLOAD, SDLoc(N), VT,
6187
6189
LN0->getChain(),
@@ -7726,7 +7728,7 @@ SDValue DAGCombiner::visitFP_EXTEND(SDNode *N) {
7726
7728
7727
7729
// fold (fpext (load x)) -> (fpext (fptrunc (extload x)))
7728
7730
if (ISD::isNormalLoad(N0.getNode()) && N0.hasOneUse() &&
7729
- TLI.isLoadExtLegal(ISD::EXTLOAD, N0.getValueType())) {
7731
+ TLI.isLoadExtLegal(ISD::EXTLOAD, VT, N0.getValueType())) {
7730
7732
LoadSDNode *LN0 = cast<LoadSDNode>(N0);
7731
7733
SDValue ExtLoad = DAG.getExtLoad(ISD::EXTLOAD, SDLoc(N), VT,
7732
7734
LN0->getChain(),
@@ -10003,9 +10005,9 @@ bool DAGCombiner::MergeConsecutiveStores(StoreSDNode* St) {
10003
10005
EVT LegalizedStoredValueTy =
10004
10006
TLI.getTypeToTransformTo(*DAG.getContext(), StoreTy);
10005
10007
if (TLI.isTruncStoreLegal(LegalizedStoredValueTy, StoreTy) &&
10006
- TLI.isLoadExtLegal(ISD::ZEXTLOAD, StoreTy) &&
10007
- TLI.isLoadExtLegal(ISD::SEXTLOAD, StoreTy) &&
10008
- TLI.isLoadExtLegal(ISD::EXTLOAD, StoreTy))
10008
+ TLI.isLoadExtLegal(ISD::ZEXTLOAD, LegalizedStoredValueTy, StoreTy) &&
10009
+ TLI.isLoadExtLegal(ISD::SEXTLOAD, LegalizedStoredValueTy, StoreTy) &&
10010
+ TLI.isLoadExtLegal(ISD::EXTLOAD, LegalizedStoredValueTy, StoreTy))
10009
10011
LastLegalIntegerType = i+1;
10010
10012
}
10011
10013
}
@@ -10443,7 +10445,8 @@ SDValue DAGCombiner::ReplaceExtractVectorEltOfLoadWithNarrowedLoad(
10443
10445
if (ResultVT.bitsGT(VecEltVT)) {
10444
10446
// If the result type of vextract is wider than the load, then issue an
10445
10447
// extending load instead.
10446
- ISD::LoadExtType ExtType = TLI.isLoadExtLegal(ISD::ZEXTLOAD, VecEltVT)
10448
+ ISD::LoadExtType ExtType = TLI.isLoadExtLegal(ISD::ZEXTLOAD, ResultVT,
10449
+ VecEltVT)
10447
10450
? ISD::ZEXTLOAD
10448
10451
: ISD::EXTLOAD;
10449
10452
Load = DAG.getExtLoad(
0 commit comments