diff options
author | Chad Rosier <mcrosier@codeaurora.org> | 2015-10-07 16:15:40 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@codeaurora.org> | 2015-10-07 16:15:40 +0000 |
commit | 17436bf64e89a28c85a351b35ddc7a5c01fc9dca (patch) | |
tree | 2acba0e0fb008f64245b074c625374830f2e1998 | |
parent | 28d2edad5b6580fe1cb0cb6251fab25c6473031e (diff) | |
download | llvm-17436bf64e89a28c85a351b35ddc7a5c01fc9dca.zip llvm-17436bf64e89a28c85a351b35ddc7a5c01fc9dca.tar.gz llvm-17436bf64e89a28c85a351b35ddc7a5c01fc9dca.tar.bz2 |
[ARM] Prevent PerformVDIVCombine from combining a vcvt/vdiv with 8 lanes.
This would result in a crash since the vcvt used does not support v8i32 types.
llvm-svn: 249560
-rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 7 | ||||
-rw-r--r-- | llvm/test/CodeGen/ARM/vdiv_combine.ll | 8 |
2 files changed, 12 insertions, 3 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 6f88622..cafb450 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -9908,10 +9908,12 @@ static SDValue PerformVDIVCombine(SDNode *N, SelectionDAG &DAG, uint32_t FloatBits = FloatTy.getSizeInBits(); MVT IntTy = Op.getOperand(0).getSimpleValueType().getVectorElementType(); uint32_t IntBits = IntTy.getSizeInBits(); - if (FloatBits != 32 || IntBits > 32) { + unsigned NumLanes = Op.getValueType().getVectorNumElements(); + if (FloatBits != 32 || IntBits > 32 || NumLanes > 4) { // These instructions only exist converting from i32 to f32. We can handle // smaller integers by generating an extra extend, 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(); } @@ -9922,7 +9924,6 @@ static SDValue PerformVDIVCombine(SDNode *N, SelectionDAG &DAG, SDLoc dl(N); SDValue ConvInput = Op.getOperand(0); - unsigned NumLanes = Op.getValueType().getVectorNumElements(); if (IntBits < FloatBits) ConvInput = DAG.getNode(isSigned ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND, dl, NumLanes == 2 ? MVT::v2i32 : MVT::v4i32, diff --git a/llvm/test/CodeGen/ARM/vdiv_combine.ll b/llvm/test/CodeGen/ARM/vdiv_combine.ll index 8c6e4ba..dbbf92e 100644 --- a/llvm/test/CodeGen/ARM/vdiv_combine.ll +++ b/llvm/test/CodeGen/ARM/vdiv_combine.ll @@ -136,3 +136,11 @@ define <2 x double> @fix_i64_to_double(<2 x i64> %in) { ret <2 x double> %shift } +; Don't combine with 8 lanes. Just make sure things don't crash. +; CHECK-LABEL: test7 +define <8 x float> @test7(<8 x i32> %in) nounwind { +entry: + %vcvt.i = sitofp <8 x i32> %in to <8 x float> + %div.i = fdiv <8 x float> %vcvt.i, <float 8.0, float 8.0, float 8.0, float 8.0, float 8.0, float 8.0, float 8.0, float 8.0> + ret <8 x float> %div.i +} |