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