diff options
author | Bradley Smith <bradley.smith@arm.com> | 2014-12-16 10:59:27 +0000 |
---|---|---|
committer | Bradley Smith <bradley.smith@arm.com> | 2014-12-16 10:59:27 +0000 |
commit | ececb7f6e2990326013bfc096f6ed56b396a3198 (patch) | |
tree | bf9c6642044c552c43d022e3b4f3e35f6800e7a6 /llvm/lib/Target/ARM/ARMISelLowering.cpp | |
parent | 547cb787745468e5574f07f5e6166dd6307b99b0 (diff) | |
download | bcm5719-llvm-ececb7f6e2990326013bfc096f6ed56b396a3198.tar.gz bcm5719-llvm-ececb7f6e2990326013bfc096f6ed56b396a3198.zip |
[ARM] Prevent PerformVCVTCombine from combining a vmul/vcvt with 8 lanes
This would result in a crash since the vcvt used does not support v8i32 types.
llvm-svn: 224332
Diffstat (limited to 'llvm/lib/Target/ARM/ARMISelLowering.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 3fce38e2e3d..e908c42e975 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -9355,16 +9355,18 @@ static SDValue PerformVCVTCombine(SDNode *N, MVT FloatTy = Op.getSimpleValueType().getVectorElementType(); MVT IntTy = N->getSimpleValueType(0).getVectorElementType(); - if (FloatTy.getSizeInBits() != 32 || IntTy.getSizeInBits() > 32) { + unsigned NumLanes = Op.getValueType().getVectorNumElements(); + if (FloatTy.getSizeInBits() != 32 || IntTy.getSizeInBits() > 32 || + NumLanes > 4) { // These instructions only exist converting from f32 to i32. We can handle // smaller integers by generating an extra truncate, but larger ones would - // be lossy. + // be lossy. We also can't handle more then 4 lanes, since these intructions + // only support v2i32/v4i32 types. return SDValue(); } unsigned IntrinsicOpcode = isSigned ? Intrinsic::arm_neon_vcvtfp2fxs : Intrinsic::arm_neon_vcvtfp2fxu; - unsigned NumLanes = Op.getValueType().getVectorNumElements(); SDValue FixConv = DAG.getNode(ISD::INTRINSIC_WO_CHAIN, SDLoc(N), NumLanes == 2 ? MVT::v2i32 : MVT::v4i32, DAG.getConstant(IntrinsicOpcode, MVT::i32), N0, |