Home | History | Annotate | Download | only in X86
      1 ; RUN: opt < %s -basicaa -slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7-avx | FileCheck %s
      2 
      3 ; CHECK-LABEL: julia_2xdouble
      4 ; CHECK: load <2 x double>
      5 ; CHECK: load <2 x double>
      6 ; CHECK: fmul <2 x double>
      7 ; CHECK: fadd <2 x double>
      8 define void @julia_2xdouble([2 x double]* sret, [2 x double]*, [2 x double]*, [2 x double]*) {
      9 top:
     10   %px0 = getelementptr inbounds [2 x double], [2 x double]* %2, i64 0, i64 0
     11   %x0 = load double, double* %px0, align 4
     12   %py0 = getelementptr inbounds [2 x double], [2 x double]* %3, i64 0, i64 0
     13   %y0 = load double, double* %py0, align 4
     14   %m0 = fmul double %x0, %y0
     15   %px1 = getelementptr inbounds [2 x double], [2 x double]* %2, i64 0, i64 1
     16   %x1 = load double, double* %px1, align 4
     17   %py1 = getelementptr inbounds [2 x double], [2 x double]* %3, i64 0, i64 1
     18   %y1 = load double, double* %py1, align 4
     19   %m1 = fmul double %x1, %y1
     20   %pz0 = getelementptr inbounds [2 x double], [2 x double]* %1, i64 0, i64 0
     21   %z0 = load double, double* %pz0, align 4
     22   %a0 = fadd double %m0, %z0
     23   %i0 = insertvalue [2 x double] undef, double %a0, 0
     24   %pz1 = getelementptr inbounds [2 x double], [2 x double]* %1, i64 0, i64 1
     25   %z1 = load double, double* %pz1, align 4
     26   %a1 = fadd double %m1, %z1
     27   %i1 = insertvalue [2 x double] %i0, double %a1, 1
     28   store [2 x double] %i1, [2 x double]* %0, align 4
     29   ret void
     30 }
     31 
     32 ; CHECK-LABEL: julia_4xfloat
     33 ; CHECK: load <4 x float>
     34 ; CHECK: load <4 x float>
     35 ; CHECK: fmul <4 x float>
     36 ; CHECK: fadd <4 x float>
     37 define void @julia_4xfloat([4 x float]* sret, [4 x float]*, [4 x float]*, [4 x float]*) {
     38 top:
     39   %px0 = getelementptr inbounds [4 x float], [4 x float]* %2, i64 0, i64 0
     40   %x0 = load float, float* %px0, align 4
     41   %py0 = getelementptr inbounds [4 x float], [4 x float]* %3, i64 0, i64 0
     42   %y0 = load float, float* %py0, align 4
     43   %m0 = fmul float %x0, %y0
     44   %px1 = getelementptr inbounds [4 x float], [4 x float]* %2, i64 0, i64 1
     45   %x1 = load float, float* %px1, align 4
     46   %py1 = getelementptr inbounds [4 x float], [4 x float]* %3, i64 0, i64 1
     47   %y1 = load float, float* %py1, align 4
     48   %m1 = fmul float %x1, %y1
     49   %px2 = getelementptr inbounds [4 x float], [4 x float]* %2, i64 0, i64 2
     50   %x2 = load float, float* %px2, align 4
     51   %py2 = getelementptr inbounds [4 x float], [4 x float]* %3, i64 0, i64 2
     52   %y2 = load float, float* %py2, align 4
     53   %m2 = fmul float %x2, %y2
     54   %px3 = getelementptr inbounds [4 x float], [4 x float]* %2, i64 0, i64 3
     55   %x3 = load float, float* %px3, align 4
     56   %py3 = getelementptr inbounds [4 x float], [4 x float]* %3, i64 0, i64 3
     57   %y3 = load float, float* %py3, align 4
     58   %m3 = fmul float %x3, %y3
     59   %pz0 = getelementptr inbounds [4 x float], [4 x float]* %1, i64 0, i64 0
     60   %z0 = load float, float* %pz0, align 4
     61   %a0 = fadd float %m0, %z0
     62   %i0 = insertvalue [4 x float] undef, float %a0, 0
     63   %pz1 = getelementptr inbounds [4 x float], [4 x float]* %1, i64 0, i64 1
     64   %z1 = load float, float* %pz1, align 4
     65   %a1 = fadd float %m1, %z1
     66   %i1 = insertvalue [4 x float] %i0, float %a1, 1
     67   %pz2 = getelementptr inbounds [4 x float], [4 x float]* %1, i64 0, i64 2
     68   %z2 = load float, float* %pz2, align 4
     69   %a2 = fadd float %m2, %z2
     70   %i2 = insertvalue [4 x float] %i1, float %a2, 2
     71   %pz3 = getelementptr inbounds [4 x float], [4 x float]* %1, i64 0, i64 3
     72   %z3 = load float, float* %pz3, align 4
     73   %a3 = fadd float %m3, %z3
     74   %i3 = insertvalue [4 x float] %i2, float %a3, 3
     75   store [4 x float] %i3, [4 x float]* %0, align 4
     76   ret void
     77 }
     78 
     79 ; CHECK-LABEL: julia_load_array_of_float
     80 ; CHECK: fsub <4 x float>
     81 define void @julia_load_array_of_float([4 x float]* %a, [4 x float]* %b, [4 x float]* %c) {
     82 top:
     83   %a_arr = load [4 x float], [4 x float]* %a, align 4
     84   %a0 = extractvalue [4 x float] %a_arr, 0
     85   %a2 = extractvalue [4 x float] %a_arr, 2
     86   %a1 = extractvalue [4 x float] %a_arr, 1
     87   %b_arr = load [4 x float], [4 x float]* %b, align 4
     88   %b0 = extractvalue [4 x float] %b_arr, 0
     89   %b2 = extractvalue [4 x float] %b_arr, 2
     90   %b1 = extractvalue [4 x float] %b_arr, 1
     91   %a3 = extractvalue [4 x float] %a_arr, 3
     92   %c1 = fsub float %a1, %b1
     93   %b3 = extractvalue [4 x float] %b_arr, 3
     94   %c0 = fsub float %a0, %b0
     95   %c2 = fsub float %a2, %b2
     96   %c_arr0 = insertvalue [4 x float] undef, float %c0, 0
     97   %c_arr1 = insertvalue [4 x float] %c_arr0, float %c1, 1
     98   %c3 = fsub float %a3, %b3
     99   %c_arr2 = insertvalue [4 x float] %c_arr1, float %c2, 2
    100   %c_arr3 = insertvalue [4 x float] %c_arr2, float %c3, 3
    101   store [4 x float] %c_arr3, [4 x float]* %c, align 4
    102   ret void
    103 }
    104 
    105 ; CHECK-LABEL: julia_load_array_of_i32
    106 ; CHECK: load <4 x i32>
    107 ; CHECK: load <4 x i32>
    108 ; CHECK: sub <4 x i32>
    109 define void @julia_load_array_of_i32([4 x i32]* %a, [4 x i32]* %b, [4 x i32]* %c) {
    110 top:
    111   %a_arr = load [4 x i32], [4 x i32]* %a, align 4
    112   %a0 = extractvalue [4 x i32] %a_arr, 0
    113   %a2 = extractvalue [4 x i32] %a_arr, 2
    114   %a1 = extractvalue [4 x i32] %a_arr, 1
    115   %b_arr = load [4 x i32], [4 x i32]* %b, align 4
    116   %b0 = extractvalue [4 x i32] %b_arr, 0
    117   %b2 = extractvalue [4 x i32] %b_arr, 2
    118   %b1 = extractvalue [4 x i32] %b_arr, 1
    119   %a3 = extractvalue [4 x i32] %a_arr, 3
    120   %c1 = sub i32 %a1, %b1
    121   %b3 = extractvalue [4 x i32] %b_arr, 3
    122   %c0 = sub i32 %a0, %b0
    123   %c2 = sub i32 %a2, %b2
    124   %c_arr0 = insertvalue [4 x i32] undef, i32 %c0, 0
    125   %c_arr1 = insertvalue [4 x i32] %c_arr0, i32 %c1, 1
    126   %c3 = sub i32 %a3, %b3
    127   %c_arr2 = insertvalue [4 x i32] %c_arr1, i32 %c2, 2
    128   %c_arr3 = insertvalue [4 x i32] %c_arr2, i32 %c3, 3
    129   store [4 x i32] %c_arr3, [4 x i32]* %c, align 4
    130   ret void
    131 }
    132 
    133 ; Almost identical to previous test, but for type that should NOT be vectorized.
    134 ;
    135 ; CHECK-LABEL: julia_load_array_of_i16
    136 ; CHECK-NOT: i2>
    137 define void @julia_load_array_of_i16([4 x i16]* %a, [4 x i16]* %b, [4 x i16]* %c) {
    138 top:
    139   %a_arr = load [4 x i16], [4 x i16]* %a, align 4
    140   %a0 = extractvalue [4 x i16] %a_arr, 0
    141   %a2 = extractvalue [4 x i16] %a_arr, 2
    142   %a1 = extractvalue [4 x i16] %a_arr, 1
    143   %b_arr = load [4 x i16], [4 x i16]* %b, align 4
    144   %b0 = extractvalue [4 x i16] %b_arr, 0
    145   %b2 = extractvalue [4 x i16] %b_arr, 2
    146   %b1 = extractvalue [4 x i16] %b_arr, 1
    147   %a3 = extractvalue [4 x i16] %a_arr, 3
    148   %c1 = sub i16 %a1, %b1
    149   %b3 = extractvalue [4 x i16] %b_arr, 3
    150   %c0 = sub i16 %a0, %b0
    151   %c2 = sub i16 %a2, %b2
    152   %c_arr0 = insertvalue [4 x i16] undef, i16 %c0, 0
    153   %c_arr1 = insertvalue [4 x i16] %c_arr0, i16 %c1, 1
    154   %c3 = sub i16 %a3, %b3
    155   %c_arr2 = insertvalue [4 x i16] %c_arr1, i16 %c2, 2
    156   %c_arr3 = insertvalue [4 x i16] %c_arr2, i16 %c3, 3
    157   store [4 x i16] %c_arr3, [4 x i16]* %c, align 4
    158   ret void
    159 }
    160 
    161 %pseudovec = type { float, float, float, float }
    162 
    163 ; CHECK-LABEL: julia_load_struct_of_float
    164 ; CHECK: load <4 x float>
    165 ; CHECK: load <4 x float>
    166 ; CHECK: fsub <4 x float>
    167 define void @julia_load_struct_of_float(%pseudovec* %a, %pseudovec* %b, %pseudovec* %c) {
    168 top:
    169   %a_struct = load %pseudovec, %pseudovec* %a, align 4
    170   %a0 = extractvalue %pseudovec %a_struct, 0
    171   %a1 = extractvalue %pseudovec %a_struct, 1
    172   %b_struct = load %pseudovec, %pseudovec* %b, align 4
    173   %a2 = extractvalue %pseudovec %a_struct, 2
    174   %b0 = extractvalue %pseudovec %b_struct, 0
    175   %a3 = extractvalue %pseudovec %a_struct, 3
    176   %c0 = fsub float %a0, %b0
    177   %b1 = extractvalue %pseudovec %b_struct, 1
    178   %b2 = extractvalue %pseudovec %b_struct, 2
    179   %c1 = fsub float %a1, %b1
    180   %c_struct0 = insertvalue %pseudovec undef, float %c0, 0
    181   %b3 = extractvalue %pseudovec %b_struct, 3
    182   %c3 = fsub float %a3, %b3
    183   %c_struct1 = insertvalue %pseudovec %c_struct0, float %c1, 1
    184   %c2 = fsub float %a2, %b2
    185   %c_struct2 = insertvalue %pseudovec %c_struct1, float %c2, 2
    186   %c_struct3 = insertvalue %pseudovec %c_struct2, float %c3, 3
    187   store %pseudovec %c_struct3, %pseudovec* %c, align 4
    188   ret void
    189 }
    190