LoadStoreVectorizer: Split even sized illegal chains properly
Implement isLegalToVectorizeLoadChain for AMDGPU to avoid producing private address spaces accesses that will need to be split up later. This was doing the wrong thing in the case where the queried chain was an even number of elements. A possible <4 x i32> store was being split into store <2 x i32> store i32 store i32 rather than store <2 x i32> store <2 x i32> when legal. llvm-svn: 295933
This commit is contained in:
@@ -432,9 +432,12 @@ Vectorizer::splitOddVectorElts(ArrayRef<Instruction *> Chain,
|
||||
unsigned ElementSizeBytes = ElementSizeBits / 8;
|
||||
unsigned SizeBytes = ElementSizeBytes * Chain.size();
|
||||
unsigned NumLeft = (SizeBytes - (SizeBytes % 4)) / ElementSizeBytes;
|
||||
if (NumLeft == Chain.size())
|
||||
--NumLeft;
|
||||
else if (NumLeft == 0)
|
||||
if (NumLeft == Chain.size()) {
|
||||
if ((NumLeft & 1) == 0)
|
||||
NumLeft /= 2; // Split even in half
|
||||
else
|
||||
--NumLeft; // Split off last element
|
||||
} else if (NumLeft == 0)
|
||||
NumLeft = 1;
|
||||
return std::make_pair(Chain.slice(0, NumLeft), Chain.slice(NumLeft));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user