diff options
| author | Craig Topper <craig.topper@intel.com> | 2018-08-27 17:20:38 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2018-08-27 17:20:38 +0000 |
| commit | fff90377fd34889bf443c28517d982fbaf41bb9d (patch) | |
| tree | 1cd19fb4faa914d559ef3d178472fee104ba2932 /llvm/lib/Target/X86/X86ISelLowering.cpp | |
| parent | 271ce76352fdef802e6ecea7d1a9bb595963b609 (diff) | |
| download | bcm5719-llvm-fff90377fd34889bf443c28517d982fbaf41bb9d.tar.gz bcm5719-llvm-fff90377fd34889bf443c28517d982fbaf41bb9d.zip | |
[X86] Add support for matching paddus patterns where one of the vectors is a constant.
InstCombine mucks these up a bit. So we need to do some additional pattern matching to fix it. There are a still a few special cases not handled, but this covers the general case.
Differential Revision: https://reviews.llvm.org/D50952
llvm-svn: 340756
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelLowering.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 25256d901ce..dd7207b70f0 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -33125,6 +33125,20 @@ static SDValue combineSelect(SDNode *N, SelectionDAG &DAG, (OpLHS == CondLHS || OpRHS == CondLHS)) return SplitOpsAndApply(DAG, Subtarget, DL, VT, { OpLHS, OpRHS }, ADDUSBuilder); + + if (isa<BuildVectorSDNode>(OpRHS) && isa<BuildVectorSDNode>(CondRHS) && + CondLHS == OpLHS) { + // If the RHS is a constant we have to reverse the const + // canonicalization. + // x > ~C ? x+C : ~0 --> addus x, C + auto MatchADDUS = [](ConstantSDNode *Op, ConstantSDNode *Cond) { + return Cond->getAPIntValue() == ~Op->getAPIntValue(); + }; + if (CC == ISD::SETULE && + ISD::matchBinaryPredicate(OpRHS, CondRHS, MatchADDUS)) + return SplitOpsAndApply(DAG, Subtarget, DL, VT, { OpLHS, OpRHS }, + ADDUSBuilder); + } } } |

