[SLP] Add tests for overcosted scalar splats for RISCV (#213142)

Tests for #213104.
This commit is contained in:
Ryan Buchner 2026-07-31 11:36:49 -07:00 committed by GitHub
parent ae2261652f
commit 6d7c951e14
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -0,0 +1,95 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt < %s -passes=slp-vectorizer -mtriple=riscv64 -mattr=+v -S -pass-remarks-output=%t | FileCheck %s
; RUN: FileCheck --input-file=%t %s --check-prefix=YAML
; YAML-LABEL: --- !Passed
; YAML-NEXT: Pass: slp-vectorizer
; YAML-NEXT: Name: StoresVectorized
; YAML-NEXT: Function: fmul_splat
; YAML-NEXT: Args:
; YAML-NEXT: - String: 'Stores SLP vectorized with cost '
; YAML-NEXT: - Cost: '-7'
; YAML-NEXT: - String: ' and with tree size '
; YAML-NEXT: - TreeSize: '4'
; YAML-NEXT: ...
; YAML-NEXT: --- !Passed
; YAML-NEXT: Pass: slp-vectorizer
; YAML-NEXT: Name: StoresVectorized
; YAML-NEXT: Function: fmul_splat_nested
; YAML-NEXT: Args:
; YAML-NEXT: - String: 'Stores SLP vectorized with cost '
; YAML-NEXT: - Cost: '-13'
; YAML-NEXT: - String: ' and with tree size '
; YAML-NEXT: - TreeSize: '8'
; YAML-NEXT: ...
define void @fmul_splat(i32 %s, ptr %p, ptr %q) {
; CHECK-LABEL: define void @fmul_splat(
; CHECK-SAME: i32 [[S:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]]) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr [[P]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x i32> poison, i32 [[S]], i64 0
; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i32> [[TMP2]], <4 x i32> poison, <4 x i32> zeroinitializer
; CHECK-NEXT: [[TMP4:%.*]] = add <4 x i32> [[TMP3]], [[TMP1]]
; CHECK-NEXT: store <4 x i32> [[TMP4]], ptr [[Q]], align 4
; CHECK-NEXT: ret void
;
%x0 = load i32, ptr %p
%p1 = getelementptr inbounds nuw i32, ptr %p, i64 1
%x1 = load i32, ptr %p1
%p2 = getelementptr inbounds nuw i32, ptr %p, i64 2
%x2 = load i32, ptr %p2
%p3 = getelementptr inbounds nuw i32, ptr %p, i64 3
%x3 = load i32, ptr %p3
%m0 = add i32 %s, %x0
%m1 = add i32 %s, %x1
%m2 = add i32 %s, %x2
%m3 = add i32 %s, %x3
store i32 %m0, ptr %q
%q1 = getelementptr i32, ptr %q, i64 1
store i32 %m1, ptr %q1
%q2 = getelementptr i32, ptr %q, i64 2
store i32 %m2, ptr %q2
%q3 = getelementptr i32, ptr %q, i64 3
store i32 %m3, ptr %q3
ret void
}
define void @fmul_splat_nested(i32 %s, ptr %p, ptr %q) {
; CHECK-LABEL: define void @fmul_splat_nested(
; CHECK-SAME: i32 [[S:%.*]], ptr [[P:%.*]], ptr [[Q:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr [[P]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = insertelement <4 x i32> poison, i32 [[S]], i64 0
; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <4 x i32> [[TMP2]], <4 x i32> poison, <4 x i32> zeroinitializer
; CHECK-NEXT: [[TMP4:%.*]] = add <4 x i32> [[TMP3]], [[TMP1]]
; CHECK-NEXT: [[TMP5:%.*]] = add <4 x i32> [[TMP3]], [[TMP4]]
; CHECK-NEXT: [[TMP6:%.*]] = add <4 x i32> [[TMP3]], [[TMP5]]
; CHECK-NEXT: store <4 x i32> [[TMP6]], ptr [[Q]], align 4
; CHECK-NEXT: ret void
;
%x0 = load i32, ptr %p
%p1 = getelementptr inbounds nuw i32, ptr %p, i64 1
%x1 = load i32, ptr %p1
%p2 = getelementptr inbounds nuw i32, ptr %p, i64 2
%x2 = load i32, ptr %p2
%p3 = getelementptr inbounds nuw i32, ptr %p, i64 3
%x3 = load i32, ptr %p3
%b0 = add i32 %s, %x0
%b1 = add i32 %s, %x1
%b2 = add i32 %s, %x2
%b3 = add i32 %s, %x3
%a0 = add i32 %s, %b0
%a1 = add i32 %s, %b1
%a2 = add i32 %s, %b2
%a3 = add i32 %s, %b3
%m0 = add i32 %s, %a0
%m1 = add i32 %s, %a1
%m2 = add i32 %s, %a2
%m3 = add i32 %s, %a3
store i32 %m0, ptr %q
%q1 = getelementptr i32, ptr %q, i64 1
store i32 %m1, ptr %q1
%q2 = getelementptr i32, ptr %q, i64 2
store i32 %m2, ptr %q2
%q3 = getelementptr i32, ptr %q, i64 3
store i32 %m3, ptr %q3
ret void
}