[PATCH] D158177: [RISCV] Optimize floating point scalar move and splat
Kito Cheng via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Aug 17 05:40:19 PDT 2023
kito-cheng created this revision.
kito-cheng added reviewers: craig.topper, reames, rogfer01.
Herald added subscribers: jobnoorman, luke, sunshaoce, VincentWu, vkmr, frasercrmck, luismarques, apazos, sameer.abuasal, s.egerton, Jim, benna, psnobl, jocewei, PkmX, the_o, brucehoult, MartinMosbeck, edward-jones, zzheng, jrtc27, shiva0217, niosHD, sabuasal, simoncook, johnrusso, rbar, asb, hiraditya, arichardson.
Herald added a project: All.
kito-cheng requested review of this revision.
Herald added subscribers: llvm-commits, wangpc, eopXD, MaskRay.
Herald added a project: LLVM.
In D158086 <https://reviews.llvm.org/D158086>, we limit all floating point scalar move and splat can't fuse
vsetvli with different SEW, and this patch try to relax the constraint
as possible by introducing new SEW demand type:
SEWGreaterThanOrEqualAndLessThan64, that allow SEW fused with larger
SEW, but constraint it can't fused with SEW=64.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D158177
Files:
llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
llvm/test/CodeGen/RISCV/rvv/vsetvli-valid-elen-fp.ll
Index: llvm/test/CodeGen/RISCV/rvv/vsetvli-valid-elen-fp.ll
===================================================================
--- llvm/test/CodeGen/RISCV/rvv/vsetvli-valid-elen-fp.ll
+++ llvm/test/CodeGen/RISCV/rvv/vsetvli-valid-elen-fp.ll
@@ -40,7 +40,6 @@
; CHECK-NO-FELEN64: # %bb.0: # %entry
; CHECK-NO-FELEN64-NEXT: vsetivli zero, 1, e32, m1, ta, ma
; CHECK-NO-FELEN64-NEXT: vle32.v v8, (a0)
-; CHECK-NO-FELEN64-NEXT: vsetivli zero, 1, e16, m1, ta, ma
; CHECK-NO-FELEN64-NEXT: vfmv.s.f v9, fa0
; CHECK-NO-FELEN64-NEXT: #APP
; CHECK-NO-FELEN64-NEXT: # use v8 v9
Index: llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
===================================================================
--- llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
+++ llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
@@ -202,10 +202,13 @@
bool VLZeroness = false;
// What properties of SEW we need to preserve.
enum : uint8_t {
- SEWEqual = 2, // The exact value of SEW needs to be preserved.
- SEWGreaterThanOrEqual = 1, // SEW can be changed as long as it's greater
+ SEWEqual = 3, // The exact value of SEW needs to be preserved.
+ SEWGreaterThanOrEqual = 2, // SEW can be changed as long as it's greater
// than or equal to the original value.
- SEWNone = 0 // We don't need to preserve SEW at all.
+ SEWGreaterThanOrEqualAndLessThan64 =
+ 1, // SEW can be changed as long as it's greater
+ // than or equal to the original value, but must be less
+ SEWNone = 0 // We don't need to preserve SEW at all.
} SEW = SEWNone;
bool LMUL = false;
bool SEWLMULRatio = false;
@@ -257,6 +260,9 @@
case SEWGreaterThanOrEqual:
OS << "SEWGreaterThanOrEqual";
break;
+ case SEWGreaterThanOrEqualAndLessThan64:
+ OS << "SEWGreaterThanOrEqualAndLessThan64";
+ break;
case SEWNone:
OS << "SEWNone";
break;
@@ -292,6 +298,11 @@
RISCVVType::getSEW(NewVType) < RISCVVType::getSEW(CurVType))
return false;
+ if (Used.SEW == DemandedFields::SEWGreaterThanOrEqualAndLessThan64 &&
+ (RISCVVType::getSEW(NewVType) < RISCVVType::getSEW(CurVType) ||
+ RISCVVType::getSEW(NewVType) >= 64))
+ return false;
+
if (Used.LMUL &&
RISCVVType::getVLMUL(CurVType) != RISCVVType::getVLMUL(NewVType))
return false;
@@ -381,7 +392,9 @@
// tail lanes to either be the original value or -1. We are writing
// unknown bits to the lanes here.
if (hasUndefinedMergeOp(MI, *MRI)) {
- if (!isFloatScalarMoveOrScalarSplatInstr(MI) || HasVInstructionsF64)
+ if (isFloatScalarMoveOrScalarSplatInstr(MI) && !HasVInstructionsF64)
+ Res.SEW = DemandedFields::SEWGreaterThanOrEqualAndLessThan64;
+ else
Res.SEW = DemandedFields::SEWGreaterThanOrEqual;
Res.TailPolicy = false;
}
@@ -963,7 +976,9 @@
Used.LMUL = false;
Used.SEWLMULRatio = false;
Used.VLAny = false;
- if (!isFloatScalarMoveOrScalarSplatInstr(MI) || HasVInstructionsF64)
+ if (isFloatScalarMoveOrScalarSplatInstr(MI) && !HasVInstructionsF64)
+ Used.SEW = DemandedFields::SEWGreaterThanOrEqualAndLessThan64;
+ else
Used.SEW = DemandedFields::SEWGreaterThanOrEqual;
Used.TailPolicy = false;
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D158177.551101.patch
Type: text/x-patch
Size: 3341 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230817/dcae86a3/attachment.bin>
More information about the llvm-commits
mailing list