diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-10-15 11:13:51 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2019-10-15 11:13:51 +0000 |
commit | 70778444c7838a13ea0a8c315ad6c1830cb6b41c (patch) | |
tree | e8aa5062252d4078358776df970a72d2d066ceec | |
parent | ed29dbaafa49bb8c9039a35f768244c394411fea (diff) | |
download | bcm5719-llvm-70778444c7838a13ea0a8c315ad6c1830cb6b41c.tar.gz bcm5719-llvm-70778444c7838a13ea0a8c315ad6c1830cb6b41c.zip |
[X86] Resolve KnownUndef/KnownZero bits into target shuffle masks in helper. NFCI.
llvm-svn: 374878
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 0e5a397fa93..86f1c20020d 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -6807,6 +6807,22 @@ static bool getTargetShuffleAndZeroables(SDValue N, SmallVectorImpl<int> &Mask, return true; } +// Replace target shuffle mask elements with known undef/zero sentinels. +static void resolveTargetShuffleAndZeroables(SmallVectorImpl<int> &Mask, + const APInt &KnownUndef, + const APInt &KnownZero) { + unsigned NumElts = Mask.size(); + assert(KnownUndef.getBitWidth() == NumElts && + KnownZero.getBitWidth() == NumElts && "Shuffle mask size mismatch"); + + for (unsigned i = 0; i != NumElts; ++i) { + if (KnownUndef[i]) + Mask[i] = SM_SentinelUndef; + else if (KnownZero[i]) + Mask[i] = SM_SentinelZero; + } +} + // Forward declaration (for getFauxShuffleMask recursive check). // TODO: Use DemandedElts variant. static bool getTargetShuffleInputs(SDValue Op, SmallVectorImpl<SDValue> &Inputs, @@ -7256,15 +7272,8 @@ static bool getTargetShuffleInputs(SDValue Op, const APInt &DemandedElts, return false; if (getTargetShuffleAndZeroables(Op, Mask, Inputs, KnownUndef, KnownZero)) { - for (int i = 0, e = Mask.size(); i != e; ++i) { - int &M = Mask[i]; - if (M < 0 || !ResolveKnownElts) - continue; - if (KnownUndef[i]) - M = SM_SentinelUndef; - else if (KnownZero[i]) - M = SM_SentinelZero; - } + if (ResolveKnownElts) + resolveTargetShuffleAndZeroables(Mask, KnownUndef, KnownZero); return true; } if (getFauxShuffleMask(Op, DemandedElts, Mask, Inputs, DAG, Depth, |