[PATCH] D112762: [RISCV] Teach RISCVInsertVSETVLI::needVSETVLI to handle mask register instructions better.
Craig Topper via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 29 09:50:29 PDT 2021
This revision was automatically updated to reflect the committed changes.
Closed by commit rGaefcd598959a: [RISCV] Teach RISCVInsertVSETVLI::needVSETVLI to handle mask register… (authored by craig.topper).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D112762/new/
https://reviews.llvm.org/D112762
Files:
llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
llvm/test/CodeGen/RISCV/rvv/vsetvli-insert.ll
Index: llvm/test/CodeGen/RISCV/rvv/vsetvli-insert.ll
===================================================================
--- llvm/test/CodeGen/RISCV/rvv/vsetvli-insert.ll
+++ llvm/test/CodeGen/RISCV/rvv/vsetvli-insert.ll
@@ -77,13 +77,12 @@
ret <vscale x 1 x i64> %1
}
-; FIXME the second vsetvli is unnecessary.
+; Make sure we don't insert a vsetvli for the vmand instruction.
define <vscale x 1 x i1> @test5(<vscale x 1 x i64> %0, <vscale x 1 x i64> %1, <vscale x 1 x i1> %2, i64 %avl) nounwind {
; CHECK-LABEL: test5:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: vsetvli a0, a0, e64, m1, ta, mu
; CHECK-NEXT: vmseq.vv v8, v8, v9
-; CHECK-NEXT: vsetvli zero, a0, e8, mf8, ta, mu
; CHECK-NEXT: vmand.mm v0, v8, v0
; CHECK-NEXT: ret
entry:
Index: llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
===================================================================
--- llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
+++ llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
@@ -178,6 +178,26 @@
return getSEWLMULRatio() == Other.getSEWLMULRatio();
}
+ bool hasCompatibleVTYPE(const VSETVLIInfo &InstrInfo, bool Strict) const {
+ // Simple case, see if full VTYPE matches.
+ if (hasSameVTYPE(InstrInfo))
+ return true;
+
+ if (Strict)
+ return false;
+
+ // If this is a mask reg operation, it only cares about VLMAX.
+ // FIXME: Mask reg operations are probably ok if "this" VLMAX is larger
+ // than "InstrInfo".
+ // FIXME: The policy bits can probably be ignored for mask reg operations.
+ if (InstrInfo.MaskRegOp && hasSameVLMAX(InstrInfo) &&
+ TailAgnostic == InstrInfo.TailAgnostic &&
+ MaskAgnostic == InstrInfo.MaskAgnostic)
+ return true;
+
+ return false;
+ }
+
// Determine whether the vector instructions requirements represented by
// InstrInfo are compatible with the previous vsetvli instruction represented
// by this.
@@ -206,23 +226,15 @@
if (!hasSameAVL(InstrInfo))
return false;
- // Simple case, see if full VTYPE matches.
- if (hasSameVTYPE(InstrInfo))
+ if (hasCompatibleVTYPE(InstrInfo, Strict))
return true;
// Strict matches must ensure a full VTYPE match.
if (Strict)
return false;
- // If this is a mask reg operation, it only cares about VLMAX.
- // FIXME: Mask reg operations are probably ok if "this" VLMAX is larger
- // than "InstrInfo".
- if (InstrInfo.MaskRegOp && hasSameVLMAX(InstrInfo) &&
- TailAgnostic == InstrInfo.TailAgnostic &&
- MaskAgnostic == InstrInfo.MaskAgnostic)
- return true;
-
// Store instructions don't use the policy fields.
+ // TODO: Move into hasCompatibleVTYPE?
if (InstrInfo.StoreOp && VLMul == InstrInfo.VLMul && SEW == InstrInfo.SEW)
return true;
@@ -564,7 +576,7 @@
// VSETVLI here.
if (!CurInfo.isUnknown() && Require.hasAVLReg() &&
Require.getAVLReg().isVirtual() && !CurInfo.hasSEWLMULRatioOnly() &&
- Require.hasSameVTYPE(CurInfo)) {
+ CurInfo.hasCompatibleVTYPE(Require, /*Strict*/ false)) {
if (MachineInstr *DefMI = MRI->getVRegDef(Require.getAVLReg())) {
if (DefMI->getOpcode() == RISCV::PseudoVSETVLI ||
DefMI->getOpcode() == RISCV::PseudoVSETVLIX0 ||
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D112762.383404.patch
Type: text/x-patch
Size: 3268 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211029/9ab21f0b/attachment.bin>
More information about the llvm-commits
mailing list