summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp27
1 files changed, 19 insertions, 8 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index aa84850ab86..547655f9f7b 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -4506,6 +4506,8 @@ const Optional<ByteProvider> calculateByteProvider(SDValue Op, unsigned Index,
: calculateByteProvider(Op->getOperand(0), Index - ByteShift,
Depth + 1);
}
+ case ISD::ANY_EXTEND:
+ case ISD::SIGN_EXTEND:
case ISD::ZERO_EXTEND: {
SDValue NarrowOp = Op->getOperand(0);
unsigned NarrowBitWidth = NarrowOp.getScalarValueSizeInBits();
@@ -4513,22 +4515,32 @@ const Optional<ByteProvider> calculateByteProvider(SDValue Op, unsigned Index,
return None;
uint64_t NarrowByteWidth = NarrowBitWidth / 8;
- return Index >= NarrowByteWidth
- ? ByteProvider::getConstantZero()
- : calculateByteProvider(NarrowOp, Index, Depth + 1);
+ if (Index >= NarrowByteWidth)
+ return Op.getOpcode() == ISD::ZERO_EXTEND
+ ? Optional<ByteProvider>(ByteProvider::getConstantZero())
+ : None;
+ else
+ return calculateByteProvider(NarrowOp, Index, Depth + 1);
}
case ISD::BSWAP:
return calculateByteProvider(Op->getOperand(0), ByteWidth - Index - 1,
Depth + 1);
case ISD::LOAD: {
auto L = cast<LoadSDNode>(Op.getNode());
+ if (L->isVolatile() || L->isIndexed())
+ return None;
- // TODO: support ext loads
- if (L->isVolatile() || L->isIndexed() ||
- L->getExtensionType() != ISD::NON_EXTLOAD)
+ unsigned NarrowBitWidth = L->getMemoryVT().getSizeInBits();
+ if (NarrowBitWidth % 8 != 0)
return None;
+ uint64_t NarrowByteWidth = NarrowBitWidth / 8;
- return ByteProvider::getMemory(L, Index);
+ if (Index >= NarrowByteWidth)
+ return L->getExtensionType() == ISD::ZEXTLOAD
+ ? Optional<ByteProvider>(ByteProvider::getConstantZero())
+ : None;
+ else
+ return ByteProvider::getMemory(L, Index);
}
}
@@ -4617,7 +4629,6 @@ SDValue DAGCombiner::MatchLoadCombine(SDNode *N) {
LoadSDNode *L = P->Load;
assert(L->hasNUsesOfValue(1, 0) && !L->isVolatile() && !L->isIndexed() &&
- (L->getExtensionType() == ISD::NON_EXTLOAD) &&
"Must be enforced by calculateByteProvider");
assert(L->getOffset().isUndef() && "Unindexed load must have undef offset");
OpenPOWER on IntegriCloud