forked from OSchip/llvm-project
[DAGCombiner] Don't create illegal narrow stores
Narrowing stores when the target doesn't support the narrow version forces the target to expand into a load-modify-store sequence, which is highly suboptimal. The information narrowing throws away (legality of the inverse transform) is hard to re-analyze. If the target doesn't support a store of the narrow type, don't narrow even in pre-legalize mode. No test as this is DAGCombiner and depends on target bits. llvm-svn: 370576
This commit is contained in:
parent
ac5821395b
commit
e62c509cd4
|
@ -14737,10 +14737,15 @@ ShrinkLoadReplaceStoreWithStore(const std::pair<unsigned, unsigned> &MaskInfo,
|
|||
|
||||
// Check that it is legal on the target to do this. It is legal if the new
|
||||
// VT we're shrinking to (i8/i16/i32) is legal or we're still before type
|
||||
// legalization.
|
||||
MVT VT = MVT::getIntegerVT(NumBytes*8);
|
||||
// legalization (and the target doesn't explicitly think this is a bad idea).
|
||||
MVT VT = MVT::getIntegerVT(NumBytes * 8);
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
if (!DC->isTypeLegal(VT))
|
||||
return SDValue();
|
||||
if (St->getMemOperand() &&
|
||||
!TLI.allowsMemoryAccess(*DAG.getContext(), DAG.getDataLayout(), VT,
|
||||
*St->getMemOperand()))
|
||||
return SDValue();
|
||||
|
||||
// Okay, we can do this! Replace the 'St' store with a store of IVal that is
|
||||
// shifted by ByteShift and truncated down to NumBytes.
|
||||
|
|
Loading…
Reference in New Issue