Skip to content

Commit 4ea6d42

Browse files
committed
[RISCV] Teach computeKnownBits that vsetvli returns <= 65536.
Resolves a FIXME. We could do even better taking into account SEW/LMUL.
1 parent 1ce3afd commit 4ea6d42

File tree

4 files changed

+114
-8
lines changed

4 files changed

+114
-8
lines changed

llvm/lib/Analysis/ValueTracking.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1738,10 +1738,10 @@ static void computeKnownBitsFromOperator(const Operator *I,
17381738
case Intrinsic::riscv_vsetvli_opt:
17391739
case Intrinsic::riscv_vsetvlimax:
17401740
case Intrinsic::riscv_vsetvlimax_opt:
1741-
// Assume that VL output is positive and would fit in an int32_t.
1742-
// TODO: VLEN might be capped at 16 bits in a future V spec update.
1743-
if (BitWidth >= 32)
1744-
Known.Zero.setBitsFrom(31);
1741+
// Assume that VL output is >= 65536.
1742+
// TODO: Take SEW and LMUL into account.
1743+
if (BitWidth > 17)
1744+
Known.Zero.setBitsFrom(17);
17451745
break;
17461746
case Intrinsic::vscale: {
17471747
if (!II->getParent() || !II->getFunction() ||

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10887,10 +10887,10 @@ void RISCVTargetLowering::computeKnownBitsForTargetNode(const SDValue Op,
1088710887
case Intrinsic::riscv_vsetvlimax:
1088810888
case Intrinsic::riscv_vsetvli_opt:
1088910889
case Intrinsic::riscv_vsetvlimax_opt:
10890-
// Assume that VL output is positive and would fit in an int32_t.
10891-
// TODO: VLEN might be capped at 16 bits in a future V spec update.
10892-
if (BitWidth >= 32)
10893-
Known.Zero.setBitsFrom(31);
10890+
// Assume that VL output is >= 65536.
10891+
// TODO: Take SEW and LMUL into account.
10892+
if (BitWidth > 17)
10893+
Known.Zero.setBitsFrom(17);
1089410894
break;
1089510895
}
1089610896
break;

llvm/test/CodeGen/RISCV/rvv/vsetvl-ext.ll

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,13 @@ define zeroext i32 @vsetvl_zext() {
2323
%b = trunc i64 %a to i32
2424
ret i32 %b
2525
}
26+
27+
define i64 @vsetvl_and17bits() {
28+
; CHECK-LABEL: vsetvl_and17bits:
29+
; CHECK: # %bb.0:
30+
; CHECK-NEXT: vsetivli a0, 1, e16, m2, ta, mu
31+
; CHECK-NEXT: ret
32+
%a = call i64 @llvm.riscv.vsetvli(i64 1, i64 1, i64 1)
33+
%b = and i64 %a, 131071
34+
ret i64 %b
35+
}

llvm/test/Transforms/InstCombine/RISCV/riscv-vsetvli-knownbits.ll

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,30 @@ entry:
4848
ret i64 %2
4949
}
5050

51+
define i32 @vsetvli_and17_i32() nounwind {
52+
; CHECK-LABEL: @vsetvli_and17_i32(
53+
; CHECK-NEXT: entry:
54+
; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.riscv.vsetvli.i32(i32 1, i32 1, i32 1)
55+
; CHECK-NEXT: ret i32 [[TMP0]]
56+
;
57+
entry:
58+
%0 = call i32 @llvm.riscv.vsetvli.i32(i32 1, i32 1, i32 1)
59+
%1 = and i32 %0, 131071
60+
ret i32 %1
61+
}
62+
63+
define i64 @vsetvli_and17_i64() nounwind {
64+
; CHECK-LABEL: @vsetvli_and17_i64(
65+
; CHECK-NEXT: entry:
66+
; CHECK-NEXT: [[TMP0:%.*]] = call i64 @llvm.riscv.vsetvli.i64(i64 1, i64 1, i64 1)
67+
; CHECK-NEXT: ret i64 [[TMP0]]
68+
;
69+
entry:
70+
%0 = call i64 @llvm.riscv.vsetvli.i64(i64 1, i64 1, i64 1)
71+
%1 = and i64 %0, 131071
72+
ret i64 %1
73+
}
74+
5175
define i32 @vsetvlimax_i32() nounwind {
5276
; CHECK-LABEL: @vsetvlimax_i32(
5377
; CHECK-NEXT: entry:
@@ -86,6 +110,30 @@ entry:
86110
ret i64 %2
87111
}
88112

113+
define i32 @vsetvlimax_and17_i32() nounwind {
114+
; CHECK-LABEL: @vsetvlimax_and17_i32(
115+
; CHECK-NEXT: entry:
116+
; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.riscv.vsetvlimax.i32(i32 1, i32 1)
117+
; CHECK-NEXT: ret i32 [[TMP0]]
118+
;
119+
entry:
120+
%0 = call i32 @llvm.riscv.vsetvlimax.i32(i32 1, i32 1)
121+
%1 = and i32 %0, 131071
122+
ret i32 %1
123+
}
124+
125+
define i64 @vsetvlimax_and17_i64() nounwind {
126+
; CHECK-LABEL: @vsetvlimax_and17_i64(
127+
; CHECK-NEXT: entry:
128+
; CHECK-NEXT: [[TMP0:%.*]] = call i64 @llvm.riscv.vsetvlimax.i64(i64 1, i64 1)
129+
; CHECK-NEXT: ret i64 [[TMP0]]
130+
;
131+
entry:
132+
%0 = call i64 @llvm.riscv.vsetvlimax.i64(i64 1, i64 1)
133+
%1 = and i64 %0, 131071
134+
ret i64 %1
135+
}
136+
89137
define i32 @vsetvli_opt_i32() nounwind {
90138
; CHECK-LABEL: @vsetvli_opt_i32(
91139
; CHECK-NEXT: entry:
@@ -124,6 +172,30 @@ entry:
124172
ret i64 %2
125173
}
126174

175+
define i32 @vsetvli_opt_and17_i32() nounwind {
176+
; CHECK-LABEL: @vsetvli_opt_and17_i32(
177+
; CHECK-NEXT: entry:
178+
; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.riscv.vsetvli.opt.i32(i32 1, i32 1, i32 1)
179+
; CHECK-NEXT: ret i32 [[TMP0]]
180+
;
181+
entry:
182+
%0 = call i32 @llvm.riscv.vsetvli.opt.i32(i32 1, i32 1, i32 1)
183+
%1 = and i32 %0, 131071
184+
ret i32 %1
185+
}
186+
187+
define i64 @vsetvli_opt_and17_i64() nounwind {
188+
; CHECK-LABEL: @vsetvli_opt_and17_i64(
189+
; CHECK-NEXT: entry:
190+
; CHECK-NEXT: [[TMP0:%.*]] = call i64 @llvm.riscv.vsetvli.opt.i64(i64 1, i64 1, i64 1)
191+
; CHECK-NEXT: ret i64 [[TMP0]]
192+
;
193+
entry:
194+
%0 = call i64 @llvm.riscv.vsetvli.opt.i64(i64 1, i64 1, i64 1)
195+
%1 = and i64 %0, 131071
196+
ret i64 %1
197+
}
198+
127199
define i32 @vsetvlimax_opt_i32() nounwind {
128200
; CHECK-LABEL: @vsetvlimax_opt_i32(
129201
; CHECK-NEXT: entry:
@@ -161,3 +233,27 @@ entry:
161233
%2 = zext i32 %1 to i64
162234
ret i64 %2
163235
}
236+
237+
define i32 @vsetvlimax_opt_and17_i32() nounwind {
238+
; CHECK-LABEL: @vsetvlimax_opt_and17_i32(
239+
; CHECK-NEXT: entry:
240+
; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.riscv.vsetvlimax.opt.i32(i32 1, i32 1)
241+
; CHECK-NEXT: ret i32 [[TMP0]]
242+
;
243+
entry:
244+
%0 = call i32 @llvm.riscv.vsetvlimax.opt.i32(i32 1, i32 1)
245+
%1 = and i32 %0, 131071
246+
ret i32 %1
247+
}
248+
249+
define i64 @vsetvlimax_opt_and17_i64() nounwind {
250+
; CHECK-LABEL: @vsetvlimax_opt_and17_i64(
251+
; CHECK-NEXT: entry:
252+
; CHECK-NEXT: [[TMP0:%.*]] = call i64 @llvm.riscv.vsetvlimax.opt.i64(i64 1, i64 1)
253+
; CHECK-NEXT: ret i64 [[TMP0]]
254+
;
255+
entry:
256+
%0 = call i64 @llvm.riscv.vsetvlimax.opt.i64(i64 1, i64 1)
257+
%1 = and i64 %0, 131071
258+
ret i64 %1
259+
}

0 commit comments

Comments
 (0)