brintos

brintos / llvm-project-archived public Read only

0
0
Text · 12.4 KiB · 4c5815c Raw
266 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=slp-vectorizer -S -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7-avx | FileCheck %s3 4define void @julia_2xdouble(ptr sret([2 x double]), ptr, ptr, ptr) {5; CHECK-LABEL: @julia_2xdouble(6; CHECK-NEXT:  top:7; CHECK-NEXT:    [[TMP5:%.*]] = load <2 x double>, ptr [[TMP2:%.*]], align 48; CHECK-NEXT:    [[TMP7:%.*]] = load <2 x double>, ptr [[TMP3:%.*]], align 49; CHECK-NEXT:    [[TMP8:%.*]] = fmul <2 x double> [[TMP5]], [[TMP7]]10; CHECK-NEXT:    [[TMP10:%.*]] = load <2 x double>, ptr [[TMP1:%.*]], align 411; CHECK-NEXT:    [[TMP11:%.*]] = fadd <2 x double> [[TMP8]], [[TMP10]]12; CHECK-NEXT:    [[TMP12:%.*]] = extractelement <2 x double> [[TMP11]], i32 013; CHECK-NEXT:    [[I0:%.*]] = insertvalue [2 x double] undef, double [[TMP12]], 014; CHECK-NEXT:    [[TMP13:%.*]] = extractelement <2 x double> [[TMP11]], i32 115; CHECK-NEXT:    [[I1:%.*]] = insertvalue [2 x double] [[I0]], double [[TMP13]], 116; CHECK-NEXT:    store [2 x double] [[I1]], ptr [[TMP0:%.*]], align 417; CHECK-NEXT:    ret void18;19top:20  %x0 = load double, ptr %2, align 421  %y0 = load double, ptr %3, align 422  %m0 = fmul double %x0, %y023  %px1 = getelementptr inbounds [2 x double], ptr %2, i64 0, i64 124  %x1 = load double, ptr %px1, align 425  %py1 = getelementptr inbounds [2 x double], ptr %3, i64 0, i64 126  %y1 = load double, ptr %py1, align 427  %m1 = fmul double %x1, %y128  %z0 = load double, ptr %1, align 429  %a0 = fadd double %m0, %z030  %i0 = insertvalue [2 x double] undef, double %a0, 031  %pz1 = getelementptr inbounds [2 x double], ptr %1, i64 0, i64 132  %z1 = load double, ptr %pz1, align 433  %a1 = fadd double %m1, %z134  %i1 = insertvalue [2 x double] %i0, double %a1, 135  store [2 x double] %i1, ptr %0, align 436  ret void37}38 39define void @julia_4xfloat(ptr sret([4 x float]), ptr, ptr, ptr) {40; CHECK-LABEL: @julia_4xfloat(41; CHECK-NEXT:  top:42; CHECK-NEXT:    [[TMP5:%.*]] = load <4 x float>, ptr [[TMP2:%.*]], align 443; CHECK-NEXT:    [[TMP7:%.*]] = load <4 x float>, ptr [[TMP3:%.*]], align 444; CHECK-NEXT:    [[TMP8:%.*]] = fmul <4 x float> [[TMP5]], [[TMP7]]45; CHECK-NEXT:    [[TMP10:%.*]] = load <4 x float>, ptr [[TMP1:%.*]], align 446; CHECK-NEXT:    [[TMP11:%.*]] = fadd <4 x float> [[TMP8]], [[TMP10]]47; CHECK-NEXT:    [[TMP12:%.*]] = extractelement <4 x float> [[TMP11]], i32 048; CHECK-NEXT:    [[I0:%.*]] = insertvalue [4 x float] undef, float [[TMP12]], 049; CHECK-NEXT:    [[TMP13:%.*]] = extractelement <4 x float> [[TMP11]], i32 150; CHECK-NEXT:    [[I1:%.*]] = insertvalue [4 x float] [[I0]], float [[TMP13]], 151; CHECK-NEXT:    [[TMP14:%.*]] = extractelement <4 x float> [[TMP11]], i32 252; CHECK-NEXT:    [[I2:%.*]] = insertvalue [4 x float] [[I1]], float [[TMP14]], 253; CHECK-NEXT:    [[TMP15:%.*]] = extractelement <4 x float> [[TMP11]], i32 354; CHECK-NEXT:    [[I3:%.*]] = insertvalue [4 x float] [[I2]], float [[TMP15]], 355; CHECK-NEXT:    store [4 x float] [[I3]], ptr [[TMP0:%.*]], align 456; CHECK-NEXT:    ret void57;58top:59  %x0 = load float, ptr %2, align 460  %y0 = load float, ptr %3, align 461  %m0 = fmul float %x0, %y062  %px1 = getelementptr inbounds [4 x float], ptr %2, i64 0, i64 163  %x1 = load float, ptr %px1, align 464  %py1 = getelementptr inbounds [4 x float], ptr %3, i64 0, i64 165  %y1 = load float, ptr %py1, align 466  %m1 = fmul float %x1, %y167  %px2 = getelementptr inbounds [4 x float], ptr %2, i64 0, i64 268  %x2 = load float, ptr %px2, align 469  %py2 = getelementptr inbounds [4 x float], ptr %3, i64 0, i64 270  %y2 = load float, ptr %py2, align 471  %m2 = fmul float %x2, %y272  %px3 = getelementptr inbounds [4 x float], ptr %2, i64 0, i64 373  %x3 = load float, ptr %px3, align 474  %py3 = getelementptr inbounds [4 x float], ptr %3, i64 0, i64 375  %y3 = load float, ptr %py3, align 476  %m3 = fmul float %x3, %y377  %z0 = load float, ptr %1, align 478  %a0 = fadd float %m0, %z079  %i0 = insertvalue [4 x float] undef, float %a0, 080  %pz1 = getelementptr inbounds [4 x float], ptr %1, i64 0, i64 181  %z1 = load float, ptr %pz1, align 482  %a1 = fadd float %m1, %z183  %i1 = insertvalue [4 x float] %i0, float %a1, 184  %pz2 = getelementptr inbounds [4 x float], ptr %1, i64 0, i64 285  %z2 = load float, ptr %pz2, align 486  %a2 = fadd float %m2, %z287  %i2 = insertvalue [4 x float] %i1, float %a2, 288  %pz3 = getelementptr inbounds [4 x float], ptr %1, i64 0, i64 389  %z3 = load float, ptr %pz3, align 490  %a3 = fadd float %m3, %z391  %i3 = insertvalue [4 x float] %i2, float %a3, 392  store [4 x float] %i3, ptr %0, align 493  ret void94}95 96define void @julia_load_array_of_float(ptr %a, ptr %b, ptr %c) {97; CHECK-LABEL: @julia_load_array_of_float(98; CHECK-NEXT:  top:99; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x float>, ptr [[A:%.*]], align 4100; CHECK-NEXT:    [[TMP3:%.*]] = load <4 x float>, ptr [[B:%.*]], align 4101; CHECK-NEXT:    [[TMP4:%.*]] = fsub <4 x float> [[TMP1]], [[TMP3]]102; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <4 x float> [[TMP4]], i32 0103; CHECK-NEXT:    [[C_ARR0:%.*]] = insertvalue [4 x float] undef, float [[TMP5]], 0104; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <4 x float> [[TMP4]], i32 1105; CHECK-NEXT:    [[C_ARR1:%.*]] = insertvalue [4 x float] [[C_ARR0]], float [[TMP6]], 1106; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <4 x float> [[TMP4]], i32 2107; CHECK-NEXT:    [[C_ARR2:%.*]] = insertvalue [4 x float] [[C_ARR1]], float [[TMP7]], 2108; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <4 x float> [[TMP4]], i32 3109; CHECK-NEXT:    [[C_ARR3:%.*]] = insertvalue [4 x float] [[C_ARR2]], float [[TMP8]], 3110; CHECK-NEXT:    store [4 x float] [[C_ARR3]], ptr [[C:%.*]], align 4111; CHECK-NEXT:    ret void112;113top:114  %a_arr = load [4 x float], ptr %a, align 4115  %a0 = extractvalue [4 x float] %a_arr, 0116  %a2 = extractvalue [4 x float] %a_arr, 2117  %a1 = extractvalue [4 x float] %a_arr, 1118  %b_arr = load [4 x float], ptr %b, align 4119  %b0 = extractvalue [4 x float] %b_arr, 0120  %b2 = extractvalue [4 x float] %b_arr, 2121  %b1 = extractvalue [4 x float] %b_arr, 1122  %a3 = extractvalue [4 x float] %a_arr, 3123  %c1 = fsub float %a1, %b1124  %b3 = extractvalue [4 x float] %b_arr, 3125  %c0 = fsub float %a0, %b0126  %c2 = fsub float %a2, %b2127  %c_arr0 = insertvalue [4 x float] undef, float %c0, 0128  %c_arr1 = insertvalue [4 x float] %c_arr0, float %c1, 1129  %c3 = fsub float %a3, %b3130  %c_arr2 = insertvalue [4 x float] %c_arr1, float %c2, 2131  %c_arr3 = insertvalue [4 x float] %c_arr2, float %c3, 3132  store [4 x float] %c_arr3, ptr %c, align 4133  ret void134}135 136define void @julia_load_array_of_i32(ptr %a, ptr %b, ptr %c) {137; CHECK-LABEL: @julia_load_array_of_i32(138; CHECK-NEXT:  top:139; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, ptr [[A:%.*]], align 4140; CHECK-NEXT:    [[TMP3:%.*]] = load <4 x i32>, ptr [[B:%.*]], align 4141; CHECK-NEXT:    [[TMP4:%.*]] = sub <4 x i32> [[TMP1]], [[TMP3]]142; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <4 x i32> [[TMP4]], i32 0143; CHECK-NEXT:    [[C_ARR0:%.*]] = insertvalue [4 x i32] undef, i32 [[TMP5]], 0144; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <4 x i32> [[TMP4]], i32 1145; CHECK-NEXT:    [[C_ARR1:%.*]] = insertvalue [4 x i32] [[C_ARR0]], i32 [[TMP6]], 1146; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <4 x i32> [[TMP4]], i32 2147; CHECK-NEXT:    [[C_ARR2:%.*]] = insertvalue [4 x i32] [[C_ARR1]], i32 [[TMP7]], 2148; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <4 x i32> [[TMP4]], i32 3149; CHECK-NEXT:    [[C_ARR3:%.*]] = insertvalue [4 x i32] [[C_ARR2]], i32 [[TMP8]], 3150; CHECK-NEXT:    store [4 x i32] [[C_ARR3]], ptr [[C:%.*]], align 4151; CHECK-NEXT:    ret void152;153top:154  %a_arr = load [4 x i32], ptr %a, align 4155  %a0 = extractvalue [4 x i32] %a_arr, 0156  %a2 = extractvalue [4 x i32] %a_arr, 2157  %a1 = extractvalue [4 x i32] %a_arr, 1158  %b_arr = load [4 x i32], ptr %b, align 4159  %b0 = extractvalue [4 x i32] %b_arr, 0160  %b2 = extractvalue [4 x i32] %b_arr, 2161  %b1 = extractvalue [4 x i32] %b_arr, 1162  %a3 = extractvalue [4 x i32] %a_arr, 3163  %c1 = sub i32 %a1, %b1164  %b3 = extractvalue [4 x i32] %b_arr, 3165  %c0 = sub i32 %a0, %b0166  %c2 = sub i32 %a2, %b2167  %c_arr0 = insertvalue [4 x i32] undef, i32 %c0, 0168  %c_arr1 = insertvalue [4 x i32] %c_arr0, i32 %c1, 1169  %c3 = sub i32 %a3, %b3170  %c_arr2 = insertvalue [4 x i32] %c_arr1, i32 %c2, 2171  %c_arr3 = insertvalue [4 x i32] %c_arr2, i32 %c3, 3172  store [4 x i32] %c_arr3, ptr %c, align 4173  ret void174}175 176; Almost identical to previous test, but for type that should NOT be vectorized.177;178define void @julia_load_array_of_i16(ptr %a, ptr %b, ptr %c) {179; CHECK-LABEL: @julia_load_array_of_i16(180; CHECK-NEXT:  top:181; CHECK-NEXT:    [[A_ARR:%.*]] = load [4 x i16], ptr [[A:%.*]], align 4182; CHECK-NEXT:    [[A0:%.*]] = extractvalue [4 x i16] [[A_ARR]], 0183; CHECK-NEXT:    [[A2:%.*]] = extractvalue [4 x i16] [[A_ARR]], 2184; CHECK-NEXT:    [[A1:%.*]] = extractvalue [4 x i16] [[A_ARR]], 1185; CHECK-NEXT:    [[B_ARR:%.*]] = load [4 x i16], ptr [[B:%.*]], align 4186; CHECK-NEXT:    [[B0:%.*]] = extractvalue [4 x i16] [[B_ARR]], 0187; CHECK-NEXT:    [[B2:%.*]] = extractvalue [4 x i16] [[B_ARR]], 2188; CHECK-NEXT:    [[B1:%.*]] = extractvalue [4 x i16] [[B_ARR]], 1189; CHECK-NEXT:    [[A3:%.*]] = extractvalue [4 x i16] [[A_ARR]], 3190; CHECK-NEXT:    [[C1:%.*]] = sub i16 [[A1]], [[B1]]191; CHECK-NEXT:    [[B3:%.*]] = extractvalue [4 x i16] [[B_ARR]], 3192; CHECK-NEXT:    [[C0:%.*]] = sub i16 [[A0]], [[B0]]193; CHECK-NEXT:    [[C2:%.*]] = sub i16 [[A2]], [[B2]]194; CHECK-NEXT:    [[C_ARR0:%.*]] = insertvalue [4 x i16] undef, i16 [[C0]], 0195; CHECK-NEXT:    [[C_ARR1:%.*]] = insertvalue [4 x i16] [[C_ARR0]], i16 [[C1]], 1196; CHECK-NEXT:    [[C3:%.*]] = sub i16 [[A3]], [[B3]]197; CHECK-NEXT:    [[C_ARR2:%.*]] = insertvalue [4 x i16] [[C_ARR1]], i16 [[C2]], 2198; CHECK-NEXT:    [[C_ARR3:%.*]] = insertvalue [4 x i16] [[C_ARR2]], i16 [[C3]], 3199; CHECK-NEXT:    store [4 x i16] [[C_ARR3]], ptr [[C:%.*]], align 4200; CHECK-NEXT:    ret void201;202top:203  %a_arr = load [4 x i16], ptr %a, align 4204  %a0 = extractvalue [4 x i16] %a_arr, 0205  %a2 = extractvalue [4 x i16] %a_arr, 2206  %a1 = extractvalue [4 x i16] %a_arr, 1207  %b_arr = load [4 x i16], ptr %b, align 4208  %b0 = extractvalue [4 x i16] %b_arr, 0209  %b2 = extractvalue [4 x i16] %b_arr, 2210  %b1 = extractvalue [4 x i16] %b_arr, 1211  %a3 = extractvalue [4 x i16] %a_arr, 3212  %c1 = sub i16 %a1, %b1213  %b3 = extractvalue [4 x i16] %b_arr, 3214  %c0 = sub i16 %a0, %b0215  %c2 = sub i16 %a2, %b2216  %c_arr0 = insertvalue [4 x i16] undef, i16 %c0, 0217  %c_arr1 = insertvalue [4 x i16] %c_arr0, i16 %c1, 1218  %c3 = sub i16 %a3, %b3219  %c_arr2 = insertvalue [4 x i16] %c_arr1, i16 %c2, 2220  %c_arr3 = insertvalue [4 x i16] %c_arr2, i16 %c3, 3221  store [4 x i16] %c_arr3, ptr %c, align 4222  ret void223}224 225%pseudovec = type { float, float, float, float }226 227define void @julia_load_struct_of_float(ptr %a, ptr %b, ptr %c) {228; CHECK-LABEL: @julia_load_struct_of_float(229; CHECK-NEXT:  top:230; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x float>, ptr [[A:%.*]], align 4231; CHECK-NEXT:    [[TMP3:%.*]] = load <4 x float>, ptr [[B:%.*]], align 4232; CHECK-NEXT:    [[TMP4:%.*]] = fsub <4 x float> [[TMP1]], [[TMP3]]233; CHECK-NEXT:    [[TMP5:%.*]] = extractelement <4 x float> [[TMP4]], i32 0234; CHECK-NEXT:    [[C_STRUCT0:%.*]] = insertvalue [[PSEUDOVEC:%.*]] undef, float [[TMP5]], 0235; CHECK-NEXT:    [[TMP6:%.*]] = extractelement <4 x float> [[TMP4]], i32 1236; CHECK-NEXT:    [[C_STRUCT1:%.*]] = insertvalue [[PSEUDOVEC]] [[C_STRUCT0]], float [[TMP6]], 1237; CHECK-NEXT:    [[TMP7:%.*]] = extractelement <4 x float> [[TMP4]], i32 2238; CHECK-NEXT:    [[C_STRUCT2:%.*]] = insertvalue [[PSEUDOVEC]] [[C_STRUCT1]], float [[TMP7]], 2239; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <4 x float> [[TMP4]], i32 3240; CHECK-NEXT:    [[C_STRUCT3:%.*]] = insertvalue [[PSEUDOVEC]] [[C_STRUCT2]], float [[TMP8]], 3241; CHECK-NEXT:    store [[PSEUDOVEC]] [[C_STRUCT3]], ptr [[C:%.*]], align 4242; CHECK-NEXT:    ret void243;244top:245  %a_struct = load %pseudovec, ptr %a, align 4246  %a0 = extractvalue %pseudovec %a_struct, 0247  %a1 = extractvalue %pseudovec %a_struct, 1248  %b_struct = load %pseudovec, ptr %b, align 4249  %a2 = extractvalue %pseudovec %a_struct, 2250  %b0 = extractvalue %pseudovec %b_struct, 0251  %a3 = extractvalue %pseudovec %a_struct, 3252  %c0 = fsub float %a0, %b0253  %b1 = extractvalue %pseudovec %b_struct, 1254  %b2 = extractvalue %pseudovec %b_struct, 2255  %c1 = fsub float %a1, %b1256  %c_struct0 = insertvalue %pseudovec undef, float %c0, 0257  %b3 = extractvalue %pseudovec %b_struct, 3258  %c3 = fsub float %a3, %b3259  %c_struct1 = insertvalue %pseudovec %c_struct0, float %c1, 1260  %c2 = fsub float %a2, %b2261  %c_struct2 = insertvalue %pseudovec %c_struct1, float %c2, 2262  %c_struct3 = insertvalue %pseudovec %c_struct2, float %c3, 3263  store %pseudovec %c_struct3, ptr %c, align 4264  ret void265}266