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> 8define void @julia_2xdouble([2 x double]* sret, [2 x double]*, [2 x double]*, [2 x double]*) { 9top: 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> 37define void @julia_4xfloat([4 x float]* sret, [4 x float]*, [4 x float]*, [4 x float]*) { 38top: 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> 81define void @julia_load_array_of_float([4 x float]* %a, [4 x float]* %b, [4 x float]* %c) { 82top: 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> 109define void @julia_load_array_of_i32([4 x i32]* %a, [4 x i32]* %b, [4 x i32]* %c) { 110top: 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> 137define void @julia_load_array_of_i16([4 x i16]* %a, [4 x i16]* %b, [4 x i16]* %c) { 138top: 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> 167define void @julia_load_struct_of_float(%pseudovec* %a, %pseudovec* %b, %pseudovec* %c) { 168top: 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