[PATCH] D122769: [RISCV] Add a prepass to vsetvli insertion to propagate VLMAX vsetvli to the instructions.
Craig Topper via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 25 16:24:30 PDT 2022
craig.topper updated this revision to Diff 425057.
craig.topper added a comment.
Address feedback
Rebase on top of pre-committed test.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D122769/new/
https://reviews.llvm.org/D122769
Files:
llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
llvm/test/CodeGen/RISCV/rvv/vsetvli-insert-crossbb.ll
Index: llvm/test/CodeGen/RISCV/rvv/vsetvli-insert-crossbb.ll
===================================================================
--- llvm/test/CodeGen/RISCV/rvv/vsetvli-insert-crossbb.ll
+++ llvm/test/CodeGen/RISCV/rvv/vsetvli-insert-crossbb.ll
@@ -591,21 +591,20 @@
; CHECK-NEXT: blez a0, .LBB11_3
; CHECK-NEXT: # %bb.1: # %for.body.preheader
; CHECK-NEXT: li a5, 0
-; CHECK-NEXT: li t1, 0
+; CHECK-NEXT: li t0, 0
; CHECK-NEXT: slli a7, a6, 3
; CHECK-NEXT: .LBB11_2: # %for.body
; CHECK-NEXT: # =>This Inner Loop Header: Depth=1
-; CHECK-NEXT: add t0, a2, a5
-; CHECK-NEXT: vsetvli zero, a6, e64, m1, ta, mu
-; CHECK-NEXT: vle64.v v8, (t0)
+; CHECK-NEXT: add a4, a2, a5
+; CHECK-NEXT: vle64.v v8, (a4)
; CHECK-NEXT: add a4, a3, a5
; CHECK-NEXT: vle64.v v9, (a4)
; CHECK-NEXT: vfadd.vv v8, v8, v9
; CHECK-NEXT: add a4, a1, a5
; CHECK-NEXT: vse64.v v8, (a4)
-; CHECK-NEXT: add t1, t1, a6
+; CHECK-NEXT: add t0, t0, a6
; CHECK-NEXT: add a5, a5, a7
-; CHECK-NEXT: blt t1, a0, .LBB11_2
+; CHECK-NEXT: blt t0, a0, .LBB11_2
; CHECK-NEXT: .LBB11_3: # %for.end
; CHECK-NEXT: ret
entry:
Index: llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
===================================================================
--- llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
+++ llvm/lib/Target/RISCV/RISCVInsertVSETVLI.cpp
@@ -435,6 +435,7 @@
void insertVSETVLI(MachineBasicBlock &MBB, MachineInstr &MI,
const VSETVLIInfo &Info, const VSETVLIInfo &PrevInfo);
+ void forwardPropagateVLMAX(MachineBasicBlock &MBB);
bool computeVLVTYPEChanges(const MachineBasicBlock &MBB);
void computeIncomingVLVTYPE(const MachineBasicBlock &MBB);
void emitVSETVLIs(MachineBasicBlock &MBB);
@@ -887,6 +888,44 @@
return CurInfo.isCompatibleWithLoadStoreEEW(EEW, Require);
}
+// Forward propagate VLMAX vsetvlis.
+void RISCVInsertVSETVLI::forwardPropagateVLMAX(MachineBasicBlock &MBB) {
+ for (const MachineInstr &MI : MBB) {
+ // Look for VLMAX vsetvlis.
+ if (!(isVectorConfigInstr(MI) && MI.getOperand(1).isReg() &&
+ MI.getOperand(1).getReg() == RISCV::X0 &&
+ MI.getOperand(0).getReg() != RISCV::X0))
+ continue;
+
+ const MachineOperand &DestVLOp = MI.getOperand(0);
+ Register DestVLReg = DestVLOp.getReg();
+ // Walk through all uses of this VL.
+ for (MachineRegisterInfo::use_nodbg_iterator
+ UI = MRI->use_nodbg_begin(DestVLReg),
+ UIEnd = MRI->use_nodbg_end();
+ UI != UIEnd;) {
+ MachineOperand &Use(*UI++);
+ assert(Use.getParent() != nullptr && "Expected parent instruction");
+ const MachineInstr &UseMI = *Use.getParent();
+ const unsigned UseIndex = UseMI.getOperandNo(&Use);
+
+ uint64_t TSFlags = UseMI.getDesc().TSFlags;
+ if (RISCVII::hasSEWOp(TSFlags) && RISCVII::hasVLOp(TSFlags)) {
+ unsigned NumOperands = UseMI.getNumExplicitOperands();
+ if (RISCVII::hasVecPolicyOp(TSFlags))
+ --NumOperands;
+
+ // NumOperands - 2 == VLOpIndex
+ if (UseIndex == (NumOperands - 2)) {
+ Use.setReg(RISCV::X0);
+ // TODO: Should we update the dead flag or remove the instruction if
+ // we propagated to all users?
+ }
+ }
+ }
+ }
+}
+
bool RISCVInsertVSETVLI::computeVLVTYPEChanges(const MachineBasicBlock &MBB) {
bool HadVectorOp = false;
@@ -1143,6 +1182,10 @@
assert(BlockInfo.empty() && "Expect empty block infos");
BlockInfo.resize(MF.getNumBlockIDs());
+ // Phase 0 - propagate VLMAX vsetvlis.
+ for (MachineBasicBlock &MBB : MF)
+ forwardPropagateVLMAX(MBB);
+
bool HaveVectorOp = false;
// Phase 1 - determine how VL/VTYPE are affected by the each block.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D122769.425057.patch
Type: text/x-patch
Size: 3765 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220425/2c46fc4e/attachment.bin>
More information about the llvm-commits
mailing list