From 55fd78065f1e7d42b5ff5ced32097b45c833d136 Mon Sep 17 00:00:00 2001 From: Elena Demikhovsky Date: Tue, 26 May 2015 11:32:39 +0000 Subject: [PATCH] AVX-512: fixed a bug in lowering VSELECT for 512-bit vector https://llvm.org/bugs/show_bug.cgi?id=23634 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238195 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelLowering.cpp | 2 +- test/CodeGen/X86/avx512-bugfix-23634.ll | 35 +++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 test/CodeGen/X86/avx512-bugfix-23634.ll diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index ed9e1016e70..c85676e10dd 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -21710,7 +21710,7 @@ static SDValue PerformSELECTCombine(SDNode *N, SelectionDAG &DAG, // know will be matched by LowerVECTOR_SHUFFLEtoBlend. if ((N->getOpcode() == ISD::VSELECT || N->getOpcode() == X86ISD::SHRUNKBLEND) && - !DCI.isBeforeLegalize()) { + !DCI.isBeforeLegalize() && !VT.is512BitVector()) { SDValue Shuffle = transformVSELECTtoBlendVECTOR_SHUFFLE(N, DAG, Subtarget); if (Shuffle.getNode()) return Shuffle; diff --git a/test/CodeGen/X86/avx512-bugfix-23634.ll b/test/CodeGen/X86/avx512-bugfix-23634.ll new file mode 100644 index 00000000000..c31a13ad311 --- /dev/null +++ b/test/CodeGen/X86/avx512-bugfix-23634.ll @@ -0,0 +1,35 @@ +; RUN: llc < %s -march=x86-64 -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-linux-gnu" + +; CHECK-LABEL: f_fu +; CHECK-NOT: vpblend +; CHECK: vmovdqa32 {{.*}} {%k1} + +define void @f_fu(float* %ret, float* %aa, float %b) { +allocas: + %ptr_cast_for_load = bitcast float* %aa to <16 x float>* + %ptr_masked_load.39 = load <16 x float>, <16 x float>* %ptr_cast_for_load, align 4 + %b_load_to_int32 = fptosi float %b to i32 + %b_load_to_int32_broadcast_init = insertelement <16 x i32> undef, i32 %b_load_to_int32, i32 0 + %b_load_to_int32_broadcast = shufflevector <16 x i32> %b_load_to_int32_broadcast_init, <16 x i32> undef, <16 x i32> zeroinitializer + %b_to_int32 = fptosi float %b to i32 + %b_to_int32_broadcast_init = insertelement <16 x i32> undef, i32 %b_to_int32, i32 0 + %b_to_int32_broadcast = shufflevector <16 x i32> %b_to_int32_broadcast_init, <16 x i32> undef, <16 x i32> zeroinitializer + + %a_load_to_int32 = fptosi <16 x float> %ptr_masked_load.39 to <16 x i32> + %div_v019_load_ = sdiv <16 x i32> %b_to_int32_broadcast, + + %v1.i = select <16 x i1> , <16 x i32> , <16 x i32> %a_load_to_int32 + + %foo_test = add <16 x i32> %div_v019_load_, %b_load_to_int32_broadcast + + + %add_struct_offset_y_struct_offset33_x = add <16 x i32> %foo_test, %v1.i + + %val = sitofp <16 x i32> %add_struct_offset_y_struct_offset33_x to <16 x float> + %ptrcast = bitcast float* %ret to <16 x float>* + store <16 x float> %val, <16 x float>* %ptrcast, align 4 + ret void +} \ No newline at end of file -- 2.34.1