[DAGCombiner] Replace gathers with a zero mask with the passthru value

These can be created by the legalizer when splitting a larger gather.

See https://llvm.org/PR42055 for a motivating example.

Differential Revision: https://reviews.llvm.org/D62613

llvm-svn: 362015
This commit is contained in:
Benjamin Kramer 2019-05-29 19:24:19 +00:00
parent 1d7ca67769
commit 107f8d9873
2 changed files with 28 additions and 3 deletions

View File

@ -8084,13 +8084,17 @@ SDValue DAGCombiner::visitMSTORE(SDNode *N) {
}
SDValue DAGCombiner::visitMGATHER(SDNode *N) {
if (Level >= AfterLegalizeTypes)
return SDValue();
MaskedGatherSDNode *MGT = cast<MaskedGatherSDNode>(N);
SDValue Mask = MGT->getMask();
SDLoc DL(N);
// Zap gathers with a zero mask.
if (ISD::isBuildVectorAllZeros(Mask.getNode()))
return CombineTo(N, MGT->getPassThru(), MGT->getChain());
if (Level >= AfterLegalizeTypes)
return SDValue();
// If the MGATHER result requires splitting and the mask is provided by a
// SETCC, then split both nodes and its operands before legalization. This
// prevents the type legalizer from unrolling SETCC into scalar comparisons

View File

@ -769,3 +769,24 @@ entry:
ret <2 x double> %res
}
define <2 x double> @masked_gather_zeromask(<2 x double*>* %ptr, <2 x double> %dummy, <2 x double> %passthru) {
; X86-LABEL: masked_gather_zeromask:
; X86: # %bb.0: # %entry
; X86-NEXT: vmovaps %xmm1, %xmm0
; X86-NEXT: retl
;
; X64-LABEL: masked_gather_zeromask:
; X64: # %bb.0: # %entry
; X64-NEXT: vmovaps %xmm1, %xmm0
; X64-NEXT: retq
;
; NOGATHER-LABEL: masked_gather_zeromask:
; NOGATHER: # %bb.0: # %entry
; NOGATHER-NEXT: vmovaps %xmm1, %xmm0
; NOGATHER-NEXT: retq
entry:
%ld = load <2 x double*>, <2 x double*>* %ptr
%res = call <2 x double> @llvm.masked.gather.v2double(<2 x double*> %ld, i32 0, <2 x i1> zeroinitializer, <2 x double> %passthru)
ret <2 x double> %res
}