mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-25 21:18:19 +00:00
DAGCombiner: Merge store/loads when we have extload/truncstores
This is helps on architectures where i8,i16 are not legal but we have byte, and
short loads/stores. Allowing us to merge copies like the one below on ARM.
copy(char *a, char *b, int n) {
do {
int t0 = a[0];
int t1 = a[1];
b[0] = t0;
b[1] = t1;
radar://13536387
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178546 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -7980,6 +7980,14 @@ bool DAGCombiner::MergeConsecutiveStores(StoreSDNode* St) {
|
||||
EVT StoreTy = EVT::getIntegerVT(*DAG.getContext(), StoreBW);
|
||||
if (TLI.isTypeLegal(StoreTy))
|
||||
LastLegalType = i+1;
|
||||
// Or check whether a truncstore is legal.
|
||||
else if (TLI.getTypeAction(*DAG.getContext(), StoreTy) ==
|
||||
TargetLowering::TypePromoteInteger) {
|
||||
EVT LegalizedStoredValueTy =
|
||||
TLI.getTypeToTransformTo(*DAG.getContext(), StoredVal.getValueType());
|
||||
if (TLI.isTruncStoreLegal(LegalizedStoredValueTy, StoreTy))
|
||||
LastLegalType = i+1;
|
||||
}
|
||||
|
||||
// Find a legal type for the vector store.
|
||||
EVT Ty = EVT::getVectorVT(*DAG.getContext(), MemVT, i+1);
|
||||
@@ -8163,6 +8171,17 @@ bool DAGCombiner::MergeConsecutiveStores(StoreSDNode* St) {
|
||||
StoreTy = EVT::getIntegerVT(*DAG.getContext(), StoreBW);
|
||||
if (TLI.isTypeLegal(StoreTy))
|
||||
LastLegalIntegerType = i + 1;
|
||||
// Or check whether a truncstore and extload is legal.
|
||||
else if (TLI.getTypeAction(*DAG.getContext(), StoreTy) ==
|
||||
TargetLowering::TypePromoteInteger) {
|
||||
EVT LegalizedStoredValueTy =
|
||||
TLI.getTypeToTransformTo(*DAG.getContext(), StoreTy);
|
||||
if (TLI.isTruncStoreLegal(LegalizedStoredValueTy, StoreTy) &&
|
||||
TLI.isLoadExtLegal(ISD::ZEXTLOAD, StoreTy) &&
|
||||
TLI.isLoadExtLegal(ISD::SEXTLOAD, StoreTy) &&
|
||||
TLI.isLoadExtLegal(ISD::EXTLOAD, StoreTy))
|
||||
LastLegalIntegerType = i+1;
|
||||
}
|
||||
}
|
||||
|
||||
// Only use vector types if the vector type is larger than the integer type.
|
||||
|
||||
Reference in New Issue
Block a user