[LLVMbugs] [Bug 23634] New: AVX512 bug with mask size

bugzilla-daemon at llvm.org bugzilla-daemon at llvm.org
Fri May 22 00:53:31 PDT 2015


https://llvm.org/bugs/show_bug.cgi?id=23634

            Bug ID: 23634
           Summary: AVX512 bug with mask size
           Product: tools
           Version: trunk
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: normal
          Priority: P
         Component: llc
          Assignee: unassignedbugs at nondot.org
          Reporter: anton.mitrokhin at phystech.edu
                CC: llvmbugs at cs.uiuc.edu
    Classification: Unclassified

; Reproducer
; First eight elements are computed correctly, while elements from 8 to 15 
; incorrect if use math with masks

;test.ll:
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"


; Function Attrs: nounwind
define void @f_fu(float* noalias nocapture %ret, float* noalias nocapture
readonly %aa, float %b) #1 {
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, !filename !1, !first_line !2, !first_column !3, !last_line !2,
!last_column !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
  %mul__b_load9 = fmul float %b, 2.000000e+00
  %mul__b_load9_to_int32 = fptosi float %mul__b_load9 to i32
  %mul__b_load9_to_int32_broadcast_init = insertelement <16 x i32> undef, i32
%mul__b_load9_to_int32, i32 0
  %mul__b_load9_to_int32_broadcast = shufflevector <16 x i32>
%mul__b_load9_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>; <16
x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10,
i32 11, i32 12, i32 13, i32 14, i32 15, i32 16>
  %div_v019_load_ = sdiv <16 x i32> %mul__b_load9_to_int32_broadcast, <i32 2,
i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2, i32 2,
i32 2, i32 2, i32 2, i32 2>


 %v1.i = select <16 x i1> <i1 false, i1 true, i1 false, i1 true, i1 false, i1
true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1
true, i1 false, i1 true>, <16 x i32> <i32 2, i32 3, i32 4, i32 5, i32 6, i32 7,
i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17>,
<16 x i32> %a_load_to_int32


  %foo_test = add <16 x i32> %div_v019_load_, %b_load_to_int32_broadcast ; <5,
5, 5, 5, ...> + <5, 5, 5, 5 ...> = <10, 10, 10, ...>


  %add_struct_offset_y_struct_offset33_x = add <16 x i32> %foo_test, %v1.i ;
<10, 10, 10 ...> + <1, 3, 3, 5, 5, 7, 7, 9, 9 ...>



  %add_struct_offset_y_struct_offset33_x_to_float = 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> %add_struct_offset_y_struct_offset33_x_to_float, <16 x
float>* %ptrcast, align 4, !filename !1, !first_line !5, !first_column !6,
!last_line !5, !last_column !7
  ret void
}


; Function Attrs: nounwind
declare void @llvm.lifetime.start(i64, i8* nocapture) #1

; Function Attrs: nounwind
declare void @llvm.lifetime.end(i64, i8* nocapture) #1

attributes #0 = { nounwind readnone }
attributes #1 = { nounwind }

!llvm.ident = !{!0}

!0 = !{!"clang version 3.7.0 (trunk 237307) (llvm/trunk 237306)"}
!1 = !{!""}
!2 = !{i32 7}
!3 = !{i32 15}
!4 = !{i32 31}
!5 = !{i32 13}
!6 = !{i32 5}
!7 = !{i32 22}
!8 = !{i32 17}


//main.cpp:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>


extern "C" {
    extern void f_fu(float *result, float *a, float b);
}


int main(int argc, char *argv[]) {

    float returned_result[16];
    float vfloat[16];

    for (int i = 0; i < 16; ++i) {
        vfloat[i] = i+1;
    }

    f_fu(returned_result, vfloat, 5);

    float expected_result[16];
    for (int i = 0; i < 16; ++i) {
        expected_result[i] = 10 + i + 1;
        if (i & 1) expected_result[i] ++;
    }


    int errors = 0;
    for (int i = 0; i < 16; ++i) {
        if (returned_result[i] != expected_result[i]) {

            printf("%s: value %d disagrees: returned %f [%a], expected %f
[%a]\n",
                   argv[0], i, returned_result[i], returned_result[i],
                   expected_result[i], expected_result[i]);
            ++errors;
        }
        else {
            printf("%s: value %d    agrees: returned %f [%a], expected %f
[%a]\n",
                   argv[0], i, returned_result[i], returned_result[i],
                   expected_result[i], expected_result[i]);
        }
    }


    return errors > 0;
}

Run with:
clang++ -O0 -march=knl main.cpp ./test.ll -o ./test.run
sde -knl -- ./test.run

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20150522/2e836fc7/attachment.html>


More information about the llvm-bugs mailing list