diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -11030,9 +11030,10 @@ // If this is a TRUNC followed by a masked store, fold this into a masked // truncating store. We can do this even if this is already a masked - // truncstore. + // truncstore or a compress store. + // TODO: Try combine to masked compress store if possiable. if ((Value.getOpcode() == ISD::TRUNCATE) && Value->hasOneUse() && - MST->isUnindexed() && + MST->isUnindexed() && !MST->isCompressingStore() && TLI.canCombineTruncStore(Value.getOperand(0).getValueType(), MST->getMemoryVT(), LegalOperations)) { auto Mask = TLI.promoteTargetBoolean(DAG, MST->getMask(), diff --git a/llvm/test/CodeGen/X86/masked_compressstore_isel.ll b/llvm/test/CodeGen/X86/masked_compressstore_isel.ll --- a/llvm/test/CodeGen/X86/masked_compressstore_isel.ll +++ b/llvm/test/CodeGen/X86/masked_compressstore_isel.ll @@ -12,7 +12,8 @@ ; CHECK-NEXT: %0:vr256x = COPY $ymm0 ; CHECK-NEXT: %2:vr128x = VPSLLWZ128ri %1, 15 ; CHECK-NEXT: %3:vk16wm = VPMOVW2MZ128rr killed %2 -; CHECK-NEXT: VPMOVDWZ256mrk $noreg, 1, $noreg, 0, $noreg, killed %3, %0 :: (store unknown-size into `i16* null`, align 16) +; CHECK-NEXT: %4:vr128x = VPMOVDWZ256rr %0 +; CHECK-NEXT: VPCOMPRESSWZ128mrk $noreg, 1, $noreg, 0, $noreg, killed %3, killed %4 :: (store unknown-size into `i16* null`, align 16) ; CHECK-NEXT: RET 0 ; Function Attrs: nocallback nofree nosync nounwind willreturn memory(argmem: write)