diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 62966ded234..8e3a4d747aa 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -12467,14 +12467,24 @@ static SDValue LowerSDIV(SDValue Op, SelectionDAG &DAG) { (SplatValue.isPowerOf2() || (-SplatValue).isPowerOf2())) { unsigned lg2 = SplatValue.countTrailingZeros(); // Splat the sign bit. - SDValue Sz = DAG.getConstant(EltTy.getSizeInBits()-1, MVT::i32); - SDValue SGN = getTargetVShiftNode(X86ISD::VSRAI, dl, VT, N0, Sz, DAG); + SmallVector Sz(NumElts, + DAG.getConstant(EltTy.getSizeInBits() - 1, + EltTy)); + SDValue SGN = DAG.getNode(ISD::SRA, dl, VT, N0, + DAG.getNode(ISD::BUILD_VECTOR, dl, VT, &Sz[0], + NumElts)); // Add (N0 < 0) ? abs2 - 1 : 0; - SDValue Amt = DAG.getConstant(EltTy.getSizeInBits() - lg2, MVT::i32); - SDValue SRL = getTargetVShiftNode(X86ISD::VSRLI, dl, VT, SGN, Amt, DAG); + SmallVector Amt(NumElts, + DAG.getConstant(EltTy.getSizeInBits() - lg2, + EltTy)); + SDValue SRL = DAG.getNode(ISD::SRL, dl, VT, SGN, + DAG.getNode(ISD::BUILD_VECTOR, dl, VT, &Amt[0], + NumElts)); SDValue ADD = DAG.getNode(ISD::ADD, dl, VT, N0, SRL); - SDValue Lg2Amt = DAG.getConstant(lg2, MVT::i32); - SDValue SRA = getTargetVShiftNode(X86ISD::VSRAI, dl, VT, ADD, Lg2Amt, DAG); + SmallVector Lg2Amt(NumElts, DAG.getConstant(lg2, EltTy)); + SDValue SRA = DAG.getNode(ISD::SRA, dl, VT, ADD, + DAG.getNode(ISD::BUILD_VECTOR, dl, VT, &Lg2Amt[0], + NumElts)); // If we're dividing by a positive value, we're done. Otherwise, we must // negate the result. diff --git a/test/CodeGen/X86/pr16807.ll b/test/CodeGen/X86/pr16807.ll new file mode 100644 index 00000000000..6d55d99a6ac --- /dev/null +++ b/test/CodeGen/X86/pr16807.ll @@ -0,0 +1,18 @@ +; RUN: llc < %s -mtriple=x86_64-linux-gnu -mcpu=core-avx-i | FileCheck %s + +define <16 x i16> @f_fu(<16 x i16> %bf) { +allocas: + %avg.i.i = sdiv <16 x i16> %bf, + ret <16 x i16> %avg.i.i +} + +; CHECK: f_fu +; CHECK: psraw +; CHECK: psrlw +; CHECK: paddw +; CHECK: psraw +; CHECK: psraw +; CHECK: psrlw +; CHECK: paddw +; CHECK: psraw +; CHECK: ret