diff options
| author | Craig Topper <craig.topper@intel.com> | 2019-09-18 06:06:11 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2019-09-18 06:06:11 +0000 |
| commit | 93e1f73b6b2dc751a27568da5797cc2ba8436385 (patch) | |
| tree | 7b81e016ff4f4fd355ba1afb9348e3afe7c3ba33 /llvm/lib/Target | |
| parent | 11082d53665df43899bac3ed516852301f005047 (diff) | |
| download | bcm5719-llvm-93e1f73b6b2dc751a27568da5797cc2ba8436385.tar.gz bcm5719-llvm-93e1f73b6b2dc751a27568da5797cc2ba8436385.zip | |
[X86] Break non-power of 2 vXi1 vectors into scalars for argument passing with avx512.
This generates worse code, but matches what is done for avx2 and
prevents crashes when more arguments are passed than we have
registers for.
llvm-svn: 372200
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index f40e29b3cd4..7103b703912 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -1996,14 +1996,16 @@ X86TargetLowering::getPreferredVectorAction(MVT VT) const { MVT X86TargetLowering::getRegisterTypeForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const { - // Break wide vXi1 vectors into scalars to match avx2 behavior. + // v32i1 vectors should be promoted to v32i8 to match avx2. + if (VT == MVT::v32i1 && Subtarget.hasAVX512() && !Subtarget.hasBWI()) + return MVT::v32i8; + // Break wide or odd vXi1 vectors into scalars to match avx2 behavior. if (VT.isVector() && VT.getVectorElementType() == MVT::i1 && Subtarget.hasAVX512() && - ((VT.getVectorNumElements() > 32 && !Subtarget.hasBWI()) || + (!isPowerOf2_32(VT.getVectorNumElements()) || + (VT.getVectorNumElements() > 16 && !Subtarget.hasBWI()) || (VT.getVectorNumElements() > 64 && Subtarget.hasBWI()))) return MVT::i8; - if (VT == MVT::v32i1 && Subtarget.hasAVX512() && !Subtarget.hasBWI()) - return MVT::v32i8; // FIXME: Should we just make these types legal and custom split operations? if ((VT == MVT::v32i16 || VT == MVT::v64i8) && Subtarget.hasAVX512() && !Subtarget.hasBWI() && !EnableOldKNLABI) @@ -2014,14 +2016,16 @@ MVT X86TargetLowering::getRegisterTypeForCallingConv(LLVMContext &Context, unsigned X86TargetLowering::getNumRegistersForCallingConv(LLVMContext &Context, CallingConv::ID CC, EVT VT) const { - // Break wide vXi1 vectors into scalars to match avx2 behavior. + // v32i1 vectors should be promoted to v32i8 to match avx2. + if (VT == MVT::v32i1 && Subtarget.hasAVX512() && !Subtarget.hasBWI()) + return 1; + // Break wide or odd vXi1 vectors into scalars to match avx2 behavior. if (VT.isVector() && VT.getVectorElementType() == MVT::i1 && Subtarget.hasAVX512() && - ((VT.getVectorNumElements() > 32 && !Subtarget.hasBWI()) || + (!isPowerOf2_32(VT.getVectorNumElements()) || + (VT.getVectorNumElements() > 16 && !Subtarget.hasBWI()) || (VT.getVectorNumElements() > 64 && Subtarget.hasBWI()))) return VT.getVectorNumElements(); - if (VT == MVT::v32i1 && Subtarget.hasAVX512() && !Subtarget.hasBWI()) - return 1; // FIXME: Should we just make these types legal and custom split operations? if ((VT == MVT::v32i16 || VT == MVT::v64i8) && Subtarget.hasAVX512() && !Subtarget.hasBWI() && !EnableOldKNLABI) @@ -2032,10 +2036,11 @@ unsigned X86TargetLowering::getNumRegistersForCallingConv(LLVMContext &Context, unsigned X86TargetLowering::getVectorTypeBreakdownForCallingConv( LLVMContext &Context, CallingConv::ID CC, EVT VT, EVT &IntermediateVT, unsigned &NumIntermediates, MVT &RegisterVT) const { - // Break wide vXi1 vectors into scalars to match avx2 behavior. + // Break wide or odd vXi1 vectors into scalars to match avx2 behavior. if (VT.isVector() && VT.getVectorElementType() == MVT::i1 && Subtarget.hasAVX512() && - ((VT.getVectorNumElements() > 32 && !Subtarget.hasBWI()) || + (!isPowerOf2_32(VT.getVectorNumElements()) || + (VT.getVectorNumElements() > 16 && !Subtarget.hasBWI()) || (VT.getVectorNumElements() > 64 && Subtarget.hasBWI()))) { RegisterVT = MVT::i8; IntermediateVT = MVT::i1; |

