brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.0 KiB · da8cd38 Raw
337 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 22; RUN: opt < %s -passes=slp-vectorizer -S -mtriple=riscv64 -mattr=+v,+f \3; RUN:     -riscv-v-vector-bits-min=-1 -riscv-v-slp-max-vf=0 \4; RUN:     | FileCheck %s5; RUN: opt < %s -passes=slp-vectorizer -S -mtriple=riscv64 -mattr=+v,+f \6; RUN:     | FileCheck %s --check-prefix=DEFAULT7 8define void @fp_add(ptr %dst, ptr %p, ptr %q) {9; CHECK-LABEL: define void @fp_add10; CHECK-SAME: (ptr [[DST:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]]) #[[ATTR0:[0-9]+]] {11; CHECK-NEXT:  entry:12; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x float>, ptr [[P]], align 413; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x float>, ptr [[Q]], align 414; CHECK-NEXT:    [[TMP2:%.*]] = fadd <4 x float> [[TMP0]], [[TMP1]]15; CHECK-NEXT:    store <4 x float> [[TMP2]], ptr [[DST]], align 416; CHECK-NEXT:    ret void17;18; DEFAULT-LABEL: define void @fp_add19; DEFAULT-SAME: (ptr [[DST:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]]) #[[ATTR0:[0-9]+]] {20; DEFAULT-NEXT:  entry:21; DEFAULT-NEXT:    [[TMP0:%.*]] = load <4 x float>, ptr [[P]], align 422; DEFAULT-NEXT:    [[TMP1:%.*]] = load <4 x float>, ptr [[Q]], align 423; DEFAULT-NEXT:    [[TMP2:%.*]] = fadd <4 x float> [[TMP0]], [[TMP1]]24; DEFAULT-NEXT:    store <4 x float> [[TMP2]], ptr [[DST]], align 425; DEFAULT-NEXT:    ret void26;27entry:28  %e0 = load float, ptr %p, align 429  %pe1 = getelementptr inbounds float, ptr %p, i64 130  %e1 = load float, ptr %pe1, align 431  %pe2 = getelementptr inbounds float, ptr %p, i64 232  %e2 = load float, ptr %pe2, align 433  %pe3 = getelementptr inbounds float, ptr %p, i64 334  %e3 = load float, ptr %pe3, align 435 36  %f0 = load float, ptr %q, align 437  %pf1 = getelementptr inbounds float, ptr %q, i64 138  %f1 = load float, ptr %pf1, align 439  %pf2 = getelementptr inbounds float, ptr %q, i64 240  %f2 = load float, ptr %pf2, align 441  %pf3 = getelementptr inbounds float, ptr %q, i64 342  %f3 = load float, ptr %pf3, align 443 44  %a0 = fadd float %e0, %f045  %a1 = fadd float %e1, %f146  %a2 = fadd float %e2, %f247  %a3 = fadd float %e3, %f348 49  store float %a0, ptr %dst, align 450  %pa1 = getelementptr inbounds float, ptr %dst, i64 151  store float %a1, ptr %pa1, align 452  %pa2 = getelementptr inbounds float, ptr %dst, i64 253  store float %a2, ptr %pa2, align 454  %pa3 = getelementptr inbounds float, ptr %dst, i64 355  store float %a3, ptr %pa3, align 456 57  ret void58}59 60define void @fp_sub(ptr %dst, ptr %p) {61; CHECK-LABEL: define void @fp_sub62; CHECK-SAME: (ptr [[DST:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {63; CHECK-NEXT:  entry:64; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x float>, ptr [[P]], align 465; CHECK-NEXT:    [[TMP1:%.*]] = fsub <4 x float> [[TMP0]], splat (float 3.000000e+00)66; CHECK-NEXT:    store <4 x float> [[TMP1]], ptr [[DST]], align 467; CHECK-NEXT:    ret void68;69; DEFAULT-LABEL: define void @fp_sub70; DEFAULT-SAME: (ptr [[DST:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {71; DEFAULT-NEXT:  entry:72; DEFAULT-NEXT:    [[TMP0:%.*]] = load <4 x float>, ptr [[P]], align 473; DEFAULT-NEXT:    [[TMP1:%.*]] = fsub <4 x float> [[TMP0]], splat (float 3.000000e+00)74; DEFAULT-NEXT:    store <4 x float> [[TMP1]], ptr [[DST]], align 475; DEFAULT-NEXT:    ret void76;77entry:78  %e0 = load float, ptr %p, align 479  %pe1 = getelementptr inbounds float, ptr %p, i64 180  %e1 = load float, ptr %pe1, align 481  %pe2 = getelementptr inbounds float, ptr %p, i64 282  %e2 = load float, ptr %pe2, align 483  %pe3 = getelementptr inbounds float, ptr %p, i64 384  %e3 = load float, ptr %pe3, align 485 86  %a0 = fsub float %e0, 3.087  %a1 = fsub float %e1, 3.088  %a2 = fsub float %e2, 3.089  %a3 = fsub float %e3, 3.090 91  store float %a0, ptr %dst, align 492  %pa1 = getelementptr inbounds float, ptr %dst, i64 193  store float %a1, ptr %pa1, align 494  %pa2 = getelementptr inbounds float, ptr %dst, i64 295  store float %a2, ptr %pa2, align 496  %pa3 = getelementptr inbounds float, ptr %dst, i64 397  store float %a3, ptr %pa3, align 498 99  ret void100}101 102define void @fp_mul(ptr %dst, ptr %p, ptr %q) {103; CHECK-LABEL: define void @fp_mul104; CHECK-SAME: (ptr [[DST:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]]) #[[ATTR0]] {105; CHECK-NEXT:  entry:106; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x float>, ptr [[P]], align 4107; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x float>, ptr [[Q]], align 4108; CHECK-NEXT:    [[TMP2:%.*]] = fmul <4 x float> [[TMP0]], [[TMP1]]109; CHECK-NEXT:    store <4 x float> [[TMP2]], ptr [[DST]], align 4110; CHECK-NEXT:    ret void111;112; DEFAULT-LABEL: define void @fp_mul113; DEFAULT-SAME: (ptr [[DST:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]]) #[[ATTR0]] {114; DEFAULT-NEXT:  entry:115; DEFAULT-NEXT:    [[TMP0:%.*]] = load <4 x float>, ptr [[P]], align 4116; DEFAULT-NEXT:    [[TMP1:%.*]] = load <4 x float>, ptr [[Q]], align 4117; DEFAULT-NEXT:    [[TMP2:%.*]] = fmul <4 x float> [[TMP0]], [[TMP1]]118; DEFAULT-NEXT:    store <4 x float> [[TMP2]], ptr [[DST]], align 4119; DEFAULT-NEXT:    ret void120;121entry:122  %e0 = load float, ptr %p, align 4123  %pe1 = getelementptr inbounds float, ptr %p, i64 1124  %e1 = load float, ptr %pe1, align 4125  %pe2 = getelementptr inbounds float, ptr %p, i64 2126  %e2 = load float, ptr %pe2, align 4127  %pe3 = getelementptr inbounds float, ptr %p, i64 3128  %e3 = load float, ptr %pe3, align 4129 130  %f0 = load float, ptr %q, align 4131  %pf1 = getelementptr inbounds float, ptr %q, i64 1132  %f1 = load float, ptr %pf1, align 4133  %pf2 = getelementptr inbounds float, ptr %q, i64 2134  %f2 = load float, ptr %pf2, align 4135  %pf3 = getelementptr inbounds float, ptr %q, i64 3136  %f3 = load float, ptr %pf3, align 4137 138  %a0 = fmul float %e0, %f0139  %a1 = fmul float %e1, %f1140  %a2 = fmul float %e2, %f2141  %a3 = fmul float %e3, %f3142 143  store float %a0, ptr %dst, align 4144  %pa1 = getelementptr inbounds float, ptr %dst, i64 1145  store float %a1, ptr %pa1, align 4146  %pa2 = getelementptr inbounds float, ptr %dst, i64 2147  store float %a2, ptr %pa2, align 4148  %pa3 = getelementptr inbounds float, ptr %dst, i64 3149  store float %a3, ptr %pa3, align 4150 151  ret void152}153 154define void @fp_div(ptr %dst, ptr %p) {155; CHECK-LABEL: define void @fp_div156; CHECK-SAME: (ptr [[DST:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {157; CHECK-NEXT:  entry:158; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x float>, ptr [[P]], align 4159; CHECK-NEXT:    [[TMP1:%.*]] = fdiv <4 x float> [[TMP0]], splat (float 1.050000e+01)160; CHECK-NEXT:    store <4 x float> [[TMP1]], ptr [[DST]], align 4161; CHECK-NEXT:    ret void162;163; DEFAULT-LABEL: define void @fp_div164; DEFAULT-SAME: (ptr [[DST:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {165; DEFAULT-NEXT:  entry:166; DEFAULT-NEXT:    [[TMP0:%.*]] = load <4 x float>, ptr [[P]], align 4167; DEFAULT-NEXT:    [[TMP1:%.*]] = fdiv <4 x float> [[TMP0]], splat (float 1.050000e+01)168; DEFAULT-NEXT:    store <4 x float> [[TMP1]], ptr [[DST]], align 4169; DEFAULT-NEXT:    ret void170;171entry:172  %e0 = load float, ptr %p, align 4173  %pe1 = getelementptr inbounds float, ptr %p, i64 1174  %e1 = load float, ptr %pe1, align 4175  %pe2 = getelementptr inbounds float, ptr %p, i64 2176  %e2 = load float, ptr %pe2, align 4177  %pe3 = getelementptr inbounds float, ptr %p, i64 3178  %e3 = load float, ptr %pe3, align 4179 180  %a0 = fdiv float %e0, 10.5181  %a1 = fdiv float %e1, 10.5182  %a2 = fdiv float %e2, 10.5183  %a3 = fdiv float %e3, 10.5184 185  store float %a0, ptr %dst, align 4186  %pa1 = getelementptr inbounds float, ptr %dst, i64 1187  store float %a1, ptr %pa1, align 4188  %pa2 = getelementptr inbounds float, ptr %dst, i64 2189  store float %a2, ptr %pa2, align 4190  %pa3 = getelementptr inbounds float, ptr %dst, i64 3191  store float %a3, ptr %pa3, align 4192 193  ret void194}195 196declare float @llvm.maxnum.f32(float, float)197 198define void @fp_max(ptr %dst, ptr %p, ptr %q) {199; CHECK-LABEL: define void @fp_max200; CHECK-SAME: (ptr [[DST:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]]) #[[ATTR0]] {201; CHECK-NEXT:  entry:202; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x float>, ptr [[P]], align 4203; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x float>, ptr [[Q]], align 4204; CHECK-NEXT:    [[TMP2:%.*]] = call <4 x float> @llvm.maxnum.v4f32(<4 x float> [[TMP0]], <4 x float> [[TMP1]])205; CHECK-NEXT:    store <4 x float> [[TMP2]], ptr [[DST]], align 4206; CHECK-NEXT:    ret void207;208; DEFAULT-LABEL: define void @fp_max209; DEFAULT-SAME: (ptr [[DST:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]]) #[[ATTR0]] {210; DEFAULT-NEXT:  entry:211; DEFAULT-NEXT:    [[TMP0:%.*]] = load <4 x float>, ptr [[P]], align 4212; DEFAULT-NEXT:    [[TMP1:%.*]] = load <4 x float>, ptr [[Q]], align 4213; DEFAULT-NEXT:    [[TMP2:%.*]] = call <4 x float> @llvm.maxnum.v4f32(<4 x float> [[TMP0]], <4 x float> [[TMP1]])214; DEFAULT-NEXT:    store <4 x float> [[TMP2]], ptr [[DST]], align 4215; DEFAULT-NEXT:    ret void216;217entry:218  %e0 = load float, ptr %p, align 4219  %pe1 = getelementptr inbounds float, ptr %p, i64 1220  %e1 = load float, ptr %pe1, align 4221  %pe2 = getelementptr inbounds float, ptr %p, i64 2222  %e2 = load float, ptr %pe2, align 4223  %pe3 = getelementptr inbounds float, ptr %p, i64 3224  %e3 = load float, ptr %pe3, align 4225 226  %f0 = load float, ptr %q, align 4227  %pf1 = getelementptr inbounds float, ptr %q, i64 1228  %f1 = load float, ptr %pf1, align 4229  %pf2 = getelementptr inbounds float, ptr %q, i64 2230  %f2 = load float, ptr %pf2, align 4231  %pf3 = getelementptr inbounds float, ptr %q, i64 3232  %f3 = load float, ptr %pf3, align 4233 234  %a0 = tail call float @llvm.maxnum.f32(float %e0, float %f0)235  %a1 = tail call float @llvm.maxnum.f32(float %e1, float %f1)236  %a2 = tail call float @llvm.maxnum.f32(float %e2, float %f2)237  %a3 = tail call float @llvm.maxnum.f32(float %e3, float %f3)238 239  store float %a0, ptr %dst, align 4240  %pa1 = getelementptr inbounds float, ptr %dst, i64 1241  store float %a1, ptr %pa1, align 4242  %pa2 = getelementptr inbounds float, ptr %dst, i64 2243  store float %a2, ptr %pa2, align 4244  %pa3 = getelementptr inbounds float, ptr %dst, i64 3245  store float %a3, ptr %pa3, align 4246 247  ret void248}249 250declare float @llvm.minnum.f32(float, float)251 252define void @fp_min(ptr %dst, ptr %p) {253; CHECK-LABEL: define void @fp_min254; CHECK-SAME: (ptr [[DST:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {255; CHECK-NEXT:  entry:256; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x float>, ptr [[P]], align 4257; CHECK-NEXT:    [[TMP1:%.*]] = call <4 x float> @llvm.minnum.v4f32(<4 x float> [[TMP0]], <4 x float> splat (float 1.250000e+00))258; CHECK-NEXT:    store <4 x float> [[TMP1]], ptr [[DST]], align 4259; CHECK-NEXT:    ret void260;261; DEFAULT-LABEL: define void @fp_min262; DEFAULT-SAME: (ptr [[DST:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {263; DEFAULT-NEXT:  entry:264; DEFAULT-NEXT:    [[TMP0:%.*]] = load <4 x float>, ptr [[P]], align 4265; DEFAULT-NEXT:    [[TMP1:%.*]] = call <4 x float> @llvm.minnum.v4f32(<4 x float> [[TMP0]], <4 x float> splat (float 1.250000e+00))266; DEFAULT-NEXT:    store <4 x float> [[TMP1]], ptr [[DST]], align 4267; DEFAULT-NEXT:    ret void268;269entry:270  %e0 = load float, ptr %p, align 4271  %pe1 = getelementptr inbounds float, ptr %p, i64 1272  %e1 = load float, ptr %pe1, align 4273  %pe2 = getelementptr inbounds float, ptr %p, i64 2274  %e2 = load float, ptr %pe2, align 4275  %pe3 = getelementptr inbounds float, ptr %p, i64 3276  %e3 = load float, ptr %pe3, align 4277 278  %a0 = tail call float @llvm.minnum.f32(float %e0, float 1.25)279  %a1 = tail call float @llvm.minnum.f32(float %e1, float 1.25)280  %a2 = tail call float @llvm.minnum.f32(float %e2, float 1.25)281  %a3 = tail call float @llvm.minnum.f32(float %e3, float 1.25)282 283  store float %a0, ptr %dst, align 4284  %pa1 = getelementptr inbounds float, ptr %dst, i64 1285  store float %a1, ptr %pa1, align 4286  %pa2 = getelementptr inbounds float, ptr %dst, i64 2287  store float %a2, ptr %pa2, align 4288  %pa3 = getelementptr inbounds float, ptr %dst, i64 3289  store float %a3, ptr %pa3, align 4290 291  ret void292}293 294declare i32 @llvm.fptosi.sat.i32.f32(float)295 296define void @fp_convert(ptr %dst, ptr %p) {297; CHECK-LABEL: define void @fp_convert298; CHECK-SAME: (ptr [[DST:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {299; CHECK-NEXT:  entry:300; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x float>, ptr [[P]], align 4301; CHECK-NEXT:    [[TMP1:%.*]] = call <4 x i32> @llvm.fptosi.sat.v4i32.v4f32(<4 x float> [[TMP0]])302; CHECK-NEXT:    store <4 x i32> [[TMP1]], ptr [[DST]], align 4303; CHECK-NEXT:    ret void304;305; DEFAULT-LABEL: define void @fp_convert306; DEFAULT-SAME: (ptr [[DST:%.*]], ptr [[P:%.*]]) #[[ATTR0]] {307; DEFAULT-NEXT:  entry:308; DEFAULT-NEXT:    [[TMP0:%.*]] = load <4 x float>, ptr [[P]], align 4309; DEFAULT-NEXT:    [[TMP1:%.*]] = call <4 x i32> @llvm.fptosi.sat.v4i32.v4f32(<4 x float> [[TMP0]])310; DEFAULT-NEXT:    store <4 x i32> [[TMP1]], ptr [[DST]], align 4311; DEFAULT-NEXT:    ret void312;313entry:314  %e0 = load float, ptr %p, align 4315  %pe1 = getelementptr inbounds float, ptr %p, i64 1316  %e1 = load float, ptr %pe1, align 4317  %pe2 = getelementptr inbounds float, ptr %p, i64 2318  %e2 = load float, ptr %pe2, align 4319  %pe3 = getelementptr inbounds float, ptr %p, i64 3320  %e3 = load float, ptr %pe3, align 4321 322  %a0 = tail call i32 @llvm.fptosi.sat.i32.f32(float %e0)323  %a1 = tail call i32 @llvm.fptosi.sat.i32.f32(float %e1)324  %a2 = tail call i32 @llvm.fptosi.sat.i32.f32(float %e2)325  %a3 = tail call i32 @llvm.fptosi.sat.i32.f32(float %e3)326 327  store i32 %a0, ptr %dst, align 4328  %pa1 = getelementptr inbounds i32, ptr %dst, i64 1329  store i32 %a1, ptr %pa1, align 4330  %pa2 = getelementptr inbounds i32, ptr %dst, i64 2331  store i32 %a2, ptr %pa2, align 4332  %pa3 = getelementptr inbounds i32, ptr %dst, i64 3333  store i32 %a3, ptr %pa3, align 4334 335  ret void336}337