Skip to content

Commit 0204a65

Browse files
preamesyuxuanchen1997
authored andcommitted
[RISCV] Add coverage for vector combine reduce(cast x) transformation
Summary: This covers both the existing trunc transform - basically checking that it performs sanely with the RISCV cost model - and a planned change to handle sext/zext as well. Test Plan: Reviewers: Subscribers: Tasks: Tags: Differential Revision: https://phabricator.intern.facebook.com/D60250822
1 parent b85b0b9 commit 0204a65

File tree

1 file changed

+126
-0
lines changed

1 file changed

+126
-0
lines changed
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes=vector-combine -S -mtriple=riscv32 -mattr=+v | FileCheck %s
3+
; RUN: opt < %s -passes=vector-combine -S -mtriple=riscv64 -mattr=+v | FileCheck %s
4+
5+
;
6+
; Fold reduce(cast(X)) -> trunc(cast(X)) if more cost efficient
7+
;
8+
9+
define i32 @reduce_add_trunc_v8i64_to_v8i32(<8 x i64> %a0) {
10+
; CHECK-LABEL: @reduce_add_trunc_v8i64_to_v8i32(
11+
; CHECK-NEXT: [[TMP1:%.*]] = call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> [[A0:%.*]])
12+
; CHECK-NEXT: [[RED:%.*]] = trunc i64 [[TMP1]] to i32
13+
; CHECK-NEXT: ret i32 [[RED]]
14+
;
15+
%tr = trunc <8 x i64> %a0 to <8 x i32>
16+
%red = tail call i32 @llvm.vector.reduce.add.v8i32(<8 x i32> %tr)
17+
ret i32 %red
18+
}
19+
20+
define i16 @reduce_add_trunc_v8i64_to_v8i16(<8 x i64> %a0) {
21+
; CHECK-LABEL: @reduce_add_trunc_v8i64_to_v8i16(
22+
; CHECK-NEXT: [[TMP1:%.*]] = call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> [[A0:%.*]])
23+
; CHECK-NEXT: [[RED:%.*]] = trunc i64 [[TMP1]] to i16
24+
; CHECK-NEXT: ret i16 [[RED]]
25+
;
26+
%tr = trunc <8 x i64> %a0 to <8 x i16>
27+
%red = tail call i16 @llvm.vector.reduce.add.v8i16(<8 x i16> %tr)
28+
ret i16 %red
29+
}
30+
31+
define i8 @reduce_add_trunc_v8i64_to_v8i8(<8 x i64> %a0) {
32+
; CHECK-LABEL: @reduce_add_trunc_v8i64_to_v8i8(
33+
; CHECK-NEXT: [[TMP1:%.*]] = call i64 @llvm.vector.reduce.add.v8i64(<8 x i64> [[A0:%.*]])
34+
; CHECK-NEXT: [[RED:%.*]] = trunc i64 [[TMP1]] to i8
35+
; CHECK-NEXT: ret i8 [[RED]]
36+
;
37+
%tr = trunc <8 x i64> %a0 to <8 x i8>
38+
%red = tail call i8 @llvm.vector.reduce.add.v8i8(<8 x i8> %tr)
39+
ret i8 %red
40+
}
41+
42+
define i8 @reduce_or_trunc_v8i32_i8(<8 x i32> %a0) {
43+
; CHECK-LABEL: @reduce_or_trunc_v8i32_i8(
44+
; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> [[A0:%.*]])
45+
; CHECK-NEXT: [[RED:%.*]] = trunc i32 [[TMP1]] to i8
46+
; CHECK-NEXT: ret i8 [[RED]]
47+
;
48+
%tr = trunc <8 x i32> %a0 to <8 x i8>
49+
%red = tail call i8 @llvm.vector.reduce.or.v8i32(<8 x i8> %tr)
50+
ret i8 %red
51+
}
52+
53+
define i8 @reduce_xor_trunc_v16i64_i8(<16 x i64> %a0) {
54+
; CHECK-LABEL: @reduce_xor_trunc_v16i64_i8(
55+
; CHECK-NEXT: [[TMP1:%.*]] = call i64 @llvm.vector.reduce.xor.v16i64(<16 x i64> [[A0:%.*]])
56+
; CHECK-NEXT: [[RED:%.*]] = trunc i64 [[TMP1]] to i8
57+
; CHECK-NEXT: ret i8 [[RED]]
58+
;
59+
%tr = trunc <16 x i64> %a0 to <16 x i8>
60+
%red = tail call i8 @llvm.vector.reduce.xor.v16i8(<16 x i8> %tr)
61+
ret i8 %red
62+
}
63+
64+
define i16 @reduce_mul_trunc_v8i64_i16(<8 x i64> %a0) {
65+
; CHECK-LABEL: @reduce_mul_trunc_v8i64_i16(
66+
; CHECK-NEXT: [[TR:%.*]] = trunc <8 x i64> [[A0:%.*]] to <8 x i16>
67+
; CHECK-NEXT: [[RED:%.*]] = tail call i16 @llvm.vector.reduce.mul.v8i16(<8 x i16> [[TR]])
68+
; CHECK-NEXT: ret i16 [[RED]]
69+
;
70+
%tr = trunc <8 x i64> %a0 to <8 x i16>
71+
%red = tail call i16 @llvm.vector.reduce.mul.v8i16(<8 x i16> %tr)
72+
ret i16 %red
73+
}
74+
75+
define i32 @reduce_or_sext_v8i8_to_v8i32(<8 x i8> %a0) {
76+
; CHECK-LABEL: @reduce_or_sext_v8i8_to_v8i32(
77+
; CHECK-NEXT: [[TR:%.*]] = sext <8 x i8> [[A0:%.*]] to <8 x i32>
78+
; CHECK-NEXT: [[RED:%.*]] = tail call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> [[TR]])
79+
; CHECK-NEXT: ret i32 [[RED]]
80+
;
81+
%tr = sext <8 x i8> %a0 to <8 x i32>
82+
%red = tail call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %tr)
83+
ret i32 %red
84+
}
85+
86+
define i32 @reduce_or_sext_v8i16_to_v8i32(<8 x i16> %a0) {
87+
; CHECK-LABEL: @reduce_or_sext_v8i16_to_v8i32(
88+
; CHECK-NEXT: [[TR:%.*]] = sext <8 x i16> [[A0:%.*]] to <8 x i32>
89+
; CHECK-NEXT: [[RED:%.*]] = tail call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> [[TR]])
90+
; CHECK-NEXT: ret i32 [[RED]]
91+
;
92+
%tr = sext <8 x i16> %a0 to <8 x i32>
93+
%red = tail call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %tr)
94+
ret i32 %red
95+
}
96+
97+
define i32 @reduce_or_zext_v8i8_to_v8i32(<8 x i8> %a0) {
98+
; CHECK-LABEL: @reduce_or_zext_v8i8_to_v8i32(
99+
; CHECK-NEXT: [[TR:%.*]] = zext <8 x i8> [[A0:%.*]] to <8 x i32>
100+
; CHECK-NEXT: [[RED:%.*]] = tail call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> [[TR]])
101+
; CHECK-NEXT: ret i32 [[RED]]
102+
;
103+
%tr = zext <8 x i8> %a0 to <8 x i32>
104+
%red = tail call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %tr)
105+
ret i32 %red
106+
}
107+
108+
define i32 @reduce_or_zext_v8i16_to_v8i32(<8 x i16> %a0) {
109+
; CHECK-LABEL: @reduce_or_zext_v8i16_to_v8i32(
110+
; CHECK-NEXT: [[TR:%.*]] = zext <8 x i16> [[A0:%.*]] to <8 x i32>
111+
; CHECK-NEXT: [[RED:%.*]] = tail call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> [[TR]])
112+
; CHECK-NEXT: ret i32 [[RED]]
113+
;
114+
%tr = zext <8 x i16> %a0 to <8 x i32>
115+
%red = tail call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %tr)
116+
ret i32 %red
117+
}
118+
119+
declare i32 @llvm.vector.reduce.add.v8i32(<8 x i32>)
120+
declare i16 @llvm.vector.reduce.add.v8i16(<8 x i16>)
121+
declare i8 @llvm.vector.reduce.add.v8i8(<8 x i8>)
122+
declare i8 @llvm.vector.reduce.or.v8i8(<8 x i8>)
123+
declare i8 @llvm.vector.reduce.xor.v16i8(<16 x i8>)
124+
declare i16 @llvm.vector.reduce.and.v16i16(<16 x i16>)
125+
declare i16 @llvm.vector.reduce.mul.v8i16(<8 x i16>)
126+

0 commit comments

Comments
 (0)