diff options
| author | Eli Friedman <eli.friedman@gmail.com> | 2011-10-24 23:08:52 +0000 | 
|---|---|---|
| committer | Eli Friedman <eli.friedman@gmail.com> | 2011-10-24 23:08:52 +0000 | 
| commit | a5e244c08d9d55725a31670d8b89a6460391d547 (patch) | |
| tree | 8ee81a700beeab42471c28f91cb35151437d4758 /llvm | |
| parent | 57e3aaad8920ff502998bf75ab7258329bc077c8 (diff) | |
| download | bcm5719-llvm-a5e244c08d9d55725a31670d8b89a6460391d547.tar.gz bcm5719-llvm-a5e244c08d9d55725a31670d8b89a6460391d547.zip  | |
Don't crash on variable insertelement on ARM.  PR10258.
llvm-svn: 142871
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMISelLowering.cpp | 11 | ||||
| -rw-r--r-- | llvm/test/CodeGen/ARM/vstlane.ll | 7 | 
2 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/Target/ARM/ARMISelLowering.cpp b/llvm/lib/Target/ARM/ARMISelLowering.cpp index 422a40fa6d8..3f913ded1d1 100644 --- a/llvm/lib/Target/ARM/ARMISelLowering.cpp +++ b/llvm/lib/Target/ARM/ARMISelLowering.cpp @@ -108,6 +108,7 @@ void ARMTargetLowering::addTypeForNEON(EVT VT, EVT PromotedLdStVT,    EVT ElemTy = VT.getVectorElementType();    if (ElemTy != MVT::i64 && ElemTy != MVT::f64)      setOperationAction(ISD::SETCC, VT.getSimpleVT(), Custom); +  setOperationAction(ISD::INSERT_VECTOR_ELT, VT.getSimpleVT(), Custom);    setOperationAction(ISD::EXTRACT_VECTOR_ELT, VT.getSimpleVT(), Custom);    if (ElemTy != MVT::i32) {      setOperationAction(ISD::SINT_TO_FP, VT.getSimpleVT(), Expand); @@ -4453,6 +4454,15 @@ static SDValue LowerVECTOR_SHUFFLE(SDValue Op, SelectionDAG &DAG) {    return SDValue();  } +static SDValue LowerINSERT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) { +  // INSERT_VECTOR_ELT is legal only for immediate indexes. +  SDValue Lane = Op.getOperand(2); +  if (!isa<ConstantSDNode>(Lane)) +    return SDValue(); + +  return Op; +} +  static SDValue LowerEXTRACT_VECTOR_ELT(SDValue Op, SelectionDAG &DAG) {    // EXTRACT_VECTOR_ELT is legal only for immediate indexes.    SDValue Lane = Op.getOperand(1); @@ -4975,6 +4985,7 @@ SDValue ARMTargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) const {    case ISD::SETCC:         return LowerVSETCC(Op, DAG);    case ISD::BUILD_VECTOR:  return LowerBUILD_VECTOR(Op, DAG, Subtarget);    case ISD::VECTOR_SHUFFLE: return LowerVECTOR_SHUFFLE(Op, DAG); +  case ISD::INSERT_VECTOR_ELT: return LowerINSERT_VECTOR_ELT(Op, DAG);    case ISD::EXTRACT_VECTOR_ELT: return LowerEXTRACT_VECTOR_ELT(Op, DAG);    case ISD::CONCAT_VECTORS: return LowerCONCAT_VECTORS(Op, DAG);    case ISD::FLT_ROUNDS_:   return LowerFLT_ROUNDS_(Op, DAG); diff --git a/llvm/test/CodeGen/ARM/vstlane.ll b/llvm/test/CodeGen/ARM/vstlane.ll index 08b72325ed9..f3239da6c88 100644 --- a/llvm/test/CodeGen/ARM/vstlane.ll +++ b/llvm/test/CodeGen/ARM/vstlane.ll @@ -358,6 +358,13 @@ define void @vst4laneQf(float* %A, <4 x float>* %B) nounwind {  	ret void  } +; Make sure this doesn't crash; PR10258 +define <8 x i16> @variable_insertelement(<8 x i16> %a, i16 %b, i32 %c) nounwind readnone { +;CHECK: variable_insertelement: +    %r = insertelement <8 x i16> %a, i16 %b, i32 %c +    ret <8 x i16> %r +} +  declare void @llvm.arm.neon.vst4lane.v8i8(i8*, <8 x i8>, <8 x i8>, <8 x i8>, <8 x i8>, i32, i32) nounwind  declare void @llvm.arm.neon.vst4lane.v4i16(i8*, <4 x i16>, <4 x i16>, <4 x i16>, <4 x i16>, i32, i32) nounwind  declare void @llvm.arm.neon.vst4lane.v2i32(i8*, <2 x i32>, <2 x i32>, <2 x i32>, <2 x i32>, i32, i32) nounwind  | 

