Skip to content

Commit d3da134

Browse files
committed
[RISCV] Add coverage for vsetvli insertion at O0 [nfc]
In review around #94686, we had a discussion about a possible O0 specific miscompile case without test coverage. The particular case turned out not be possible to exercise in practice, but improving our test coverage remains a good idea if we're going to have differences in the dataflow with and without live intervals.
1 parent c659e3a commit d3da134

File tree

1 file changed

+154
-0
lines changed

1 file changed

+154
-0
lines changed
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=riscv64 -mattr=+m,+f,+d,+a,+c,+v \
3+
; RUN: -target-abi=lp64d -verify-machineinstrs -O0 < %s | FileCheck %s
4+
5+
declare i64 @llvm.riscv.vsetvli(i64, i64, i64)
6+
declare i64 @llvm.riscv.vsetvlimax(i64, i64)
7+
declare <vscale x 1 x double> @llvm.riscv.vfadd.nxv1f64.nxv1f64(
8+
<vscale x 1 x double>,
9+
<vscale x 1 x double>,
10+
<vscale x 1 x double>,
11+
i64, i64)
12+
declare <vscale x 1 x i64> @llvm.riscv.vle.mask.nxv1i64(
13+
<vscale x 1 x i64>,
14+
ptr,
15+
<vscale x 1 x i1>,
16+
i64, i64)
17+
18+
define <2 x double> @fixed_length(<2 x double> %a, <2 x double> %b) nounwind {
19+
; CHECK-LABEL: fixed_length:
20+
; CHECK: # %bb.0: # %entry
21+
; CHECK-NEXT: vmv1r.v v10, v9
22+
; CHECK-NEXT: # kill: def $v11 killed $v10
23+
; CHECK-NEXT: # kill: def $v9 killed $v8
24+
; CHECK-NEXT: # implicit-def: $v9
25+
; CHECK-NEXT: vsetivli zero, 2, e64, m1, ta, ma
26+
; CHECK-NEXT: vfadd.vv v9, v8, v10
27+
; CHECK-NEXT: # implicit-def: $v8
28+
; CHECK-NEXT: vfadd.vv v8, v9, v10
29+
; CHECK-NEXT: ret
30+
entry:
31+
%1 = fadd <2 x double> %a, %b
32+
%2 = fadd <2 x double> %1, %b
33+
ret <2 x double> %2
34+
}
35+
36+
define <vscale x 1 x double> @scalable(<vscale x 1 x double> %a, <vscale x 1 x double> %b) nounwind {
37+
; CHECK-LABEL: scalable:
38+
; CHECK: # %bb.0: # %entry
39+
; CHECK-NEXT: vmv1r.v v10, v9
40+
; CHECK-NEXT: # implicit-def: $v9
41+
; CHECK-NEXT: vsetvli a0, zero, e64, m1, ta, ma
42+
; CHECK-NEXT: vfadd.vv v9, v8, v10
43+
; CHECK-NEXT: # implicit-def: $v8
44+
; CHECK-NEXT: vfadd.vv v8, v9, v10
45+
; CHECK-NEXT: ret
46+
entry:
47+
%1 = fadd <vscale x 1 x double> %a, %b
48+
%2 = fadd <vscale x 1 x double> %1, %b
49+
ret <vscale x 1 x double> %2
50+
}
51+
52+
53+
define <vscale x 1 x double> @intrinsic_same_vlmax(<vscale x 1 x double> %a, <vscale x 1 x double> %b) nounwind {
54+
; CHECK-LABEL: intrinsic_same_vlmax:
55+
; CHECK: # %bb.0: # %entry
56+
; CHECK-NEXT: vmv1r.v v10, v9
57+
; CHECK-NEXT: vsetvli a0, zero, e64, m1, tu, ma
58+
; CHECK-NEXT: # implicit-def: $v9
59+
; CHECK-NEXT: vfadd.vv v9, v8, v10
60+
; CHECK-NEXT: # implicit-def: $v8
61+
; CHECK-NEXT: vfadd.vv v8, v9, v10
62+
; CHECK-NEXT: ret
63+
entry:
64+
%0 = tail call i64 @llvm.riscv.vsetvlimax(i64 2, i64 7)
65+
%1 = tail call <vscale x 1 x double> @llvm.riscv.vfadd.nxv1f64.nxv1f64(
66+
<vscale x 1 x double> undef,
67+
<vscale x 1 x double> %a,
68+
<vscale x 1 x double> %b,
69+
i64 7, i64 %0)
70+
%2 = tail call <vscale x 1 x double> @llvm.riscv.vfadd.nxv1f64.nxv1f64(
71+
<vscale x 1 x double> undef,
72+
<vscale x 1 x double> %1,
73+
<vscale x 1 x double> %b,
74+
i64 7, i64 %0)
75+
ret <vscale x 1 x double> %2
76+
}
77+
78+
79+
define <vscale x 1 x double> @intrinsic_same_avl_imm(<vscale x 1 x double> %a, <vscale x 1 x double> %b) nounwind {
80+
; CHECK-LABEL: intrinsic_same_avl_imm:
81+
; CHECK: # %bb.0: # %entry
82+
; CHECK-NEXT: vmv1r.v v10, v9
83+
; CHECK-NEXT: vsetivli a0, 2, e64, m1, tu, ma
84+
; CHECK-NEXT: # implicit-def: $v9
85+
; CHECK-NEXT: vfadd.vv v9, v8, v10
86+
; CHECK-NEXT: # implicit-def: $v8
87+
; CHECK-NEXT: vfadd.vv v8, v9, v10
88+
; CHECK-NEXT: ret
89+
entry:
90+
%0 = tail call i64 @llvm.riscv.vsetvli(i64 2, i64 2, i64 7)
91+
%1 = tail call <vscale x 1 x double> @llvm.riscv.vfadd.nxv1f64.nxv1f64(
92+
<vscale x 1 x double> undef,
93+
<vscale x 1 x double> %a,
94+
<vscale x 1 x double> %b,
95+
i64 7, i64 %0)
96+
%2 = tail call <vscale x 1 x double> @llvm.riscv.vfadd.nxv1f64.nxv1f64(
97+
<vscale x 1 x double> undef,
98+
<vscale x 1 x double> %1,
99+
<vscale x 1 x double> %b,
100+
i64 7, i64 %0)
101+
ret <vscale x 1 x double> %2
102+
}
103+
104+
define <vscale x 1 x double> @intrinsic_same_avl_reg(i64 %avl, <vscale x 1 x double> %a, <vscale x 1 x double> %b) nounwind {
105+
; CHECK-LABEL: intrinsic_same_avl_reg:
106+
; CHECK: # %bb.0: # %entry
107+
; CHECK-NEXT: vmv1r.v v10, v9
108+
; CHECK-NEXT: vsetvli a0, a0, e64, m1, tu, ma
109+
; CHECK-NEXT: # implicit-def: $v9
110+
; CHECK-NEXT: vfadd.vv v9, v8, v10
111+
; CHECK-NEXT: # implicit-def: $v8
112+
; CHECK-NEXT: vfadd.vv v8, v9, v10
113+
; CHECK-NEXT: ret
114+
entry:
115+
%0 = tail call i64 @llvm.riscv.vsetvli(i64 %avl, i64 2, i64 7)
116+
%1 = tail call <vscale x 1 x double> @llvm.riscv.vfadd.nxv1f64.nxv1f64(
117+
<vscale x 1 x double> undef,
118+
<vscale x 1 x double> %a,
119+
<vscale x 1 x double> %b,
120+
i64 7, i64 %0)
121+
%2 = tail call <vscale x 1 x double> @llvm.riscv.vfadd.nxv1f64.nxv1f64(
122+
<vscale x 1 x double> undef,
123+
<vscale x 1 x double> %1,
124+
<vscale x 1 x double> %b,
125+
i64 7, i64 %0)
126+
ret <vscale x 1 x double> %2
127+
}
128+
129+
define <vscale x 1 x double> @intrinsic_diff_avl_reg(i64 %avl, i64 %avl2, <vscale x 1 x double> %a, <vscale x 1 x double> %b) nounwind {
130+
; CHECK-LABEL: intrinsic_diff_avl_reg:
131+
; CHECK: # %bb.0: # %entry
132+
; CHECK-NEXT: vmv1r.v v10, v9
133+
; CHECK-NEXT: vsetvli a0, a0, e64, m1, tu, ma
134+
; CHECK-NEXT: # implicit-def: $v9
135+
; CHECK-NEXT: vfadd.vv v9, v8, v10
136+
; CHECK-NEXT: vsetvli a0, a1, e64, m1, tu, ma
137+
; CHECK-NEXT: # implicit-def: $v8
138+
; CHECK-NEXT: vfadd.vv v8, v9, v10
139+
; CHECK-NEXT: ret
140+
entry:
141+
%0 = tail call i64 @llvm.riscv.vsetvli(i64 %avl, i64 2, i64 7)
142+
%1 = tail call <vscale x 1 x double> @llvm.riscv.vfadd.nxv1f64.nxv1f64(
143+
<vscale x 1 x double> undef,
144+
<vscale x 1 x double> %a,
145+
<vscale x 1 x double> %b,
146+
i64 7, i64 %0)
147+
%2 = tail call i64 @llvm.riscv.vsetvli(i64 %avl2, i64 2, i64 7)
148+
%3 = tail call <vscale x 1 x double> @llvm.riscv.vfadd.nxv1f64.nxv1f64(
149+
<vscale x 1 x double> undef,
150+
<vscale x 1 x double> %1,
151+
<vscale x 1 x double> %b,
152+
i64 7, i64 %2)
153+
ret <vscale x 1 x double> %3
154+
}

0 commit comments

Comments
 (0)