[llvm] r175144 - Fixed a bug in X86TargetLowering::LowerVectorIntExtend() (assertion failure).
Bill Wendling
wendling at apple.com
Thu Feb 14 00:27:37 PST 2013
On Feb 14, 2013, at 12:20 AM, Elena Demikhovsky <elena.demikhovsky at intel.com> wrote:
> Author: delena
> Date: Thu Feb 14 02:20:26 2013
> New Revision: 175144
>
> URL: http://llvm.org/viewvc/llvm-project?rev=175144&view=rev
> Log:
> Fixed a bug in X86TargetLowering::LowerVectorIntExtend() (assertion failure).
Please be more descriptive in your commit messages. For instance, what was the bug that was fixed?
-bw
> Added a test.
>
> Added:
> llvm/trunk/test/CodeGen/X86/2013-02-12-ShuffleToZext.ll
> Modified:
> llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
>
> Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=175144&r1=175143&r2=175144&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
> +++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Thu Feb 14 02:20:26 2013
> @@ -6662,9 +6662,10 @@ X86TargetLowering::LowerVectorIntExtend(
> return SDValue();
> }
>
> + LLVMContext *Context = DAG.getContext();
> unsigned NBits = VT.getVectorElementType().getSizeInBits() << Shift;
> - EVT NeVT = EVT::getIntegerVT(*DAG.getContext(), NBits);
> - EVT NVT = EVT::getVectorVT(*DAG.getContext(), NeVT, NumElems >> Shift);
> + EVT NeVT = EVT::getIntegerVT(*Context, NBits);
> + EVT NVT = EVT::getVectorVT(*Context, NeVT, NumElems >> Shift);
>
> if (!isTypeLegal(NVT))
> return SDValue();
> @@ -6683,8 +6684,21 @@ X86TargetLowering::LowerVectorIntExtend(
> // If it's foldable, i.e. normal load with single use, we will let code
> // selection to fold it. Otherwise, we will short the conversion sequence.
> if (CIdx && CIdx->getZExtValue() == 0 &&
> - (!ISD::isNormalLoad(V.getNode()) || !V.hasOneUse()))
> + (!ISD::isNormalLoad(V.getNode()) || !V.hasOneUse())) {
> + if (V.getValueSizeInBits() > V1.getValueSizeInBits()) {
> + // The "ext_vec_elt" node is wider than the result node.
> + // In this case we should extract subvector from V.
> + // (bitcast (sclr2vec (ext_vec_elt x))) -> (bitcast (extract_subvector x)).
> + unsigned Ratio = V.getValueSizeInBits() / V1.getValueSizeInBits();
> + EVT FullVT = V.getValueType();
> + EVT SubVecVT = EVT::getVectorVT(*Context,
> + FullVT.getVectorElementType(),
> + FullVT.getVectorNumElements()/Ratio);
> + V = DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, SubVecVT, V,
> + DAG.getIntPtrConstant(0));
> + }
> V1 = DAG.getNode(ISD::BITCAST, DL, V1.getValueType(), V);
> + }
> }
>
> return DAG.getNode(ISD::BITCAST, DL, VT,
>
> Added: llvm/trunk/test/CodeGen/X86/2013-02-12-ShuffleToZext.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/2013-02-12-ShuffleToZext.ll?rev=175144&view=auto
> ==============================================================================
> --- llvm/trunk/test/CodeGen/X86/2013-02-12-ShuffleToZext.ll (added)
> +++ llvm/trunk/test/CodeGen/X86/2013-02-12-ShuffleToZext.ll Thu Feb 14 02:20:26 2013
> @@ -0,0 +1,14 @@
> +; RUN: llc < %s -march=x86-64 -mcpu=corei7-avx -mtriple=x86_64-pc-win32 | FileCheck %s
> +
> +; CHECK: test
> +; CHECK: vpmovzxwd
> +; CHECK: vpmovzxwd
> +define void @test(<4 x i64> %a, <4 x i16>* %buf) {
> + %ex1 = extractelement <4 x i64> %a, i32 0
> + %ex2 = extractelement <4 x i64> %a, i32 1
> + %x1 = bitcast i64 %ex1 to <4 x i16>
> + %x2 = bitcast i64 %ex2 to <4 x i16>
> + %Sh = shufflevector <4 x i16> %x1, <4 x i16> %x2, <4 x i32> <i32 0, i32 1, i32 4, i32 5>
> + store <4 x i16> %Sh, <4 x i16>* %buf, align 1
> + ret void
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list