[llvm-branch-commits] [llvm] [RISCV] Schedule RVV instructions with compatible vtype/vl first (PR #95924)
Pengcheng Wang via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Sun Jan 11 20:02:32 PST 2026
https://github.com/wangpc-pp updated https://github.com/llvm/llvm-project/pull/95924
>From 5ac4ff3040f8a5a6cc68efffe3349ef9d181ddec Mon Sep 17 00:00:00 2001
From: Wang Pengcheng <wangpengcheng.pp at bytedance.com>
Date: Tue, 18 Jun 2024 21:33:25 +0800
Subject: [PATCH 1/8] =?UTF-8?q?[=F0=9D=98=80=F0=9D=97=BD=F0=9D=97=BF]=20in?=
=?UTF-8?q?itial=20version?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Created using spr 1.3.6-beta.1
---
llvm/include/llvm/CodeGen/MachineScheduler.h | 43 ++++++++--
llvm/lib/CodeGen/MachineScheduler.cpp | 34 +-------
llvm/lib/Target/RISCV/CMakeLists.txt | 1 +
.../Target/RISCV/RISCVMachineScheduler.cpp | 83 +++++++++++++++++++
llvm/lib/Target/RISCV/RISCVMachineScheduler.h | 42 ++++++++++
llvm/lib/Target/RISCV/RISCVTargetMachine.cpp | 8 +-
llvm/test/CodeGen/RISCV/rvv/schedule.ll | 49 +++++++++++
7 files changed, 215 insertions(+), 45 deletions(-)
create mode 100644 llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
create mode 100644 llvm/lib/Target/RISCV/RISCVMachineScheduler.h
create mode 100644 llvm/test/CodeGen/RISCV/rvv/schedule.ll
diff --git a/llvm/include/llvm/CodeGen/MachineScheduler.h b/llvm/include/llvm/CodeGen/MachineScheduler.h
index b15abf040058e..d1b5b83e5300b 100644
--- a/llvm/include/llvm/CodeGen/MachineScheduler.h
+++ b/llvm/include/llvm/CodeGen/MachineScheduler.h
@@ -1349,14 +1349,6 @@ class PostGenericScheduler : public GenericSchedulerBase {
void pickNodeFromQueue(SchedBoundary &Zone, SchedCandidate &Cand);
};
-/// Create the standard converging machine scheduler. This will be used as the
-/// default scheduler if the target does not set a default.
-/// Adds default DAG mutations.
-ScheduleDAGMILive *createGenericSchedLive(MachineSchedContext *C);
-
-/// Create a generic scheduler with no vreg liveness or DAG mutation passes.
-ScheduleDAGMI *createGenericSchedPostRA(MachineSchedContext *C);
-
/// If ReorderWhileClustering is set to true, no attempt will be made to
/// reduce reordering due to store clustering.
std::unique_ptr<ScheduleDAGMutation>
@@ -1375,6 +1367,41 @@ std::unique_ptr<ScheduleDAGMutation>
createCopyConstrainDAGMutation(const TargetInstrInfo *TII,
const TargetRegisterInfo *TRI);
+/// Create the standard converging machine scheduler. This will be used as the
+/// default scheduler if the target does not set a default.
+/// Adds default DAG mutations.
+template <typename Strategy = GenericScheduler>
+ScheduleDAGMILive *createGenericSchedLive(MachineSchedContext *C) {
+ ScheduleDAGMILive *DAG =
+ new ScheduleDAGMILive(C, std::make_unique<Strategy>(C));
+ // Register DAG post-processors.
+ //
+ // FIXME: extend the mutation API to allow earlier mutations to instantiate
+ // data and pass it to later mutations. Have a single mutation that gathers
+ // the interesting nodes in one pass.
+ DAG->addMutation(createCopyConstrainDAGMutation(DAG->TII, DAG->TRI));
+
+ const TargetSubtargetInfo &STI = C->MF->getSubtarget();
+ // Add MacroFusion mutation if fusions are not empty.
+ const auto &MacroFusions = STI.getMacroFusions();
+ if (!MacroFusions.empty())
+ DAG->addMutation(createMacroFusionDAGMutation(MacroFusions));
+ return DAG;
+}
+
+/// Create a generic scheduler with no vreg liveness or DAG mutation passes.
+template <typename Strategy = PostGenericScheduler>
+ScheduleDAGMI *createGenericSchedPostRA(MachineSchedContext *C) {
+ ScheduleDAGMI *DAG = new ScheduleDAGMI(C, std::make_unique<Strategy>(C),
+ /*RemoveKillFlags=*/true);
+ const TargetSubtargetInfo &STI = C->MF->getSubtarget();
+ // Add MacroFusion mutation if fusions are not empty.
+ const auto &MacroFusions = STI.getMacroFusions();
+ if (!MacroFusions.empty())
+ DAG->addMutation(createMacroFusionDAGMutation(MacroFusions));
+ return DAG;
+}
+
} // end namespace llvm
#endif // LLVM_CODEGEN_MACHINESCHEDULER_H
diff --git a/llvm/lib/CodeGen/MachineScheduler.cpp b/llvm/lib/CodeGen/MachineScheduler.cpp
index cf72f74380835..ac792ad4d5484 100644
--- a/llvm/lib/CodeGen/MachineScheduler.cpp
+++ b/llvm/lib/CodeGen/MachineScheduler.cpp
@@ -2701,7 +2701,7 @@ void SchedBoundary::bumpNode(SUnit *SU) {
unsigned NextCycle = CurrCycle;
switch (SchedModel->getMicroOpBufferSize()) {
case 0:
- assert(ReadyCycle <= CurrCycle && "Broken PendingQueue");
+ // assert(ReadyCycle <= CurrCycle && "Broken PendingQueue");
break;
case 1:
if (ReadyCycle > NextCycle) {
@@ -3847,26 +3847,6 @@ void GenericScheduler::schedNode(SUnit *SU, bool IsTopNode) {
}
}
-/// Create the standard converging machine scheduler. This will be used as the
-/// default scheduler if the target does not set a default.
-ScheduleDAGMILive *llvm::createGenericSchedLive(MachineSchedContext *C) {
- ScheduleDAGMILive *DAG =
- new ScheduleDAGMILive(C, std::make_unique<GenericScheduler>(C));
- // Register DAG post-processors.
- //
- // FIXME: extend the mutation API to allow earlier mutations to instantiate
- // data and pass it to later mutations. Have a single mutation that gathers
- // the interesting nodes in one pass.
- DAG->addMutation(createCopyConstrainDAGMutation(DAG->TII, DAG->TRI));
-
- const TargetSubtargetInfo &STI = C->MF->getSubtarget();
- // Add MacroFusion mutation if fusions are not empty.
- const auto &MacroFusions = STI.getMacroFusions();
- if (!MacroFusions.empty())
- DAG->addMutation(createMacroFusionDAGMutation(MacroFusions));
- return DAG;
-}
-
static ScheduleDAGInstrs *createConvergingSched(MachineSchedContext *C) {
return createGenericSchedLive(C);
}
@@ -4139,18 +4119,6 @@ void PostGenericScheduler::schedNode(SUnit *SU, bool IsTopNode) {
}
}
-ScheduleDAGMI *llvm::createGenericSchedPostRA(MachineSchedContext *C) {
- ScheduleDAGMI *DAG =
- new ScheduleDAGMI(C, std::make_unique<PostGenericScheduler>(C),
- /*RemoveKillFlags=*/true);
- const TargetSubtargetInfo &STI = C->MF->getSubtarget();
- // Add MacroFusion mutation if fusions are not empty.
- const auto &MacroFusions = STI.getMacroFusions();
- if (!MacroFusions.empty())
- DAG->addMutation(createMacroFusionDAGMutation(MacroFusions));
- return DAG;
-}
-
//===----------------------------------------------------------------------===//
// ILP Scheduler. Currently for experimental analysis of heuristics.
//===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Target/RISCV/CMakeLists.txt b/llvm/lib/Target/RISCV/CMakeLists.txt
index 8715403f3839a..fe3f213b253f7 100644
--- a/llvm/lib/Target/RISCV/CMakeLists.txt
+++ b/llvm/lib/Target/RISCV/CMakeLists.txt
@@ -44,6 +44,7 @@ add_llvm_target(RISCVCodeGen
RISCVISelDAGToDAG.cpp
RISCVISelLowering.cpp
RISCVMachineFunctionInfo.cpp
+ RISCVMachineScheduler.cpp
RISCVMergeBaseOffset.cpp
RISCVOptWInstrs.cpp
RISCVPostRAExpandPseudoInsts.cpp
diff --git a/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp b/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
new file mode 100644
index 0000000000000..d993d840c3d3a
--- /dev/null
+++ b/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
@@ -0,0 +1,83 @@
+//===- RISCVMachineScheduler.cpp - MI Scheduler for RISC-V ----------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "RISCVMachineScheduler.h"
+#include "MCTargetDesc/RISCVBaseInfo.h"
+#include "MCTargetDesc/RISCVMCTargetDesc.h"
+#include "RISCVInstrInfo.h"
+#include "RISCVSubtarget.h"
+#include "llvm/CodeGen/MachineOperand.h"
+#include "llvm/CodeGen/MachineScheduler.h"
+#include "llvm/CodeGen/ScheduleDAG.h"
+#include "llvm/MC/MCInstrDesc.h"
+#include "llvm/Support/Debug.h"
+#include "llvm/TargetParser/RISCVTargetParser.h"
+
+using namespace llvm;
+
+#define DEBUG_TYPE "riscv-prera-sched-strategy"
+
+static cl::opt<bool> EnableScheduleSameVType(
+ "riscv-enable-schedule-same-vtype", cl::init(false), cl::Hidden,
+ cl::desc("Enable scheduling RVV instructions with same vtype first"));
+
+SUnit *RISCVPreRAMachineSchedStrategy::pickNode(bool &IsTopNode) {
+ if (EnableScheduleSameVType) {
+ for (SUnit *SU : Bot.Available) {
+ MachineInstr *MI = SU->getInstr();
+ const MCInstrDesc &Desc = MI->getDesc();
+ if (RISCVII::hasSEWOp(Desc.TSFlags)) {
+ unsigned CurVSEW = MI->getOperand(RISCVII::getSEWOpNum(Desc)).getImm();
+ RISCVII::VLMUL CurVLMUL = RISCVII::getLMul(Desc.TSFlags);
+ if (CurVSEW == PrevVSEW && CurVLMUL == PrevVLMUL) {
+ Bot.removeReady(SU);
+ IsTopNode = true;
+ return SU;
+ }
+ }
+ }
+ for (SUnit *SU : Bot.Pending) {
+ MachineInstr *MI = SU->getInstr();
+ const MCInstrDesc &Desc = MI->getDesc();
+ if (RISCVII::hasSEWOp(Desc.TSFlags)) {
+ unsigned CurVSEW = MI->getOperand(RISCVII::getSEWOpNum(Desc)).getImm();
+ RISCVII::VLMUL CurVLMUL = RISCVII::getLMul(Desc.TSFlags);
+ if (CurVSEW == PrevVSEW && CurVLMUL == PrevVLMUL) {
+ Bot.removeReady(SU);
+ IsTopNode = false;
+ return SU;
+ }
+ }
+ }
+ }
+ return GenericScheduler::pickNode(IsTopNode);
+}
+
+bool RISCVPreRAMachineSchedStrategy::tryCandidate(SchedCandidate &Cand,
+ SchedCandidate &TryCand,
+ SchedBoundary *Zone) const {
+ bool OriginalResult = GenericScheduler::tryCandidate(Cand, TryCand, Zone);
+
+ return OriginalResult;
+}
+
+void RISCVPreRAMachineSchedStrategy::schedNode(SUnit *SU, bool IsTopNode) {
+ GenericScheduler::schedNode(SU, IsTopNode);
+ MachineInstr *MI = SU->getInstr();
+ const MCInstrDesc &Desc = MI->getDesc();
+ if (RISCVII::hasSEWOp(Desc.TSFlags)) {
+ PrevVSEW = MI->getOperand(RISCVII::getSEWOpNum(Desc)).getImm();
+ PrevVLMUL = RISCVII::getLMul(Desc.TSFlags);
+ }
+ LLVM_DEBUG(dbgs() << "Previous scheduled Unit: ";
+ dbgs() << "SU(" << SU->NodeNum << ") - "; SU->getInstr()->dump(););
+ LLVM_DEBUG(dbgs() << "Previous VSEW : " << (1 << PrevVSEW) << "\n";
+ auto LMUL = RISCVVType::decodeVLMUL(PrevVLMUL);
+ dbgs() << "Previous VLMUL: m" << (LMUL.second ? "f" : "")
+ << LMUL.first << "\n";);
+}
diff --git a/llvm/lib/Target/RISCV/RISCVMachineScheduler.h b/llvm/lib/Target/RISCV/RISCVMachineScheduler.h
new file mode 100644
index 0000000000000..bd806cef57dcb
--- /dev/null
+++ b/llvm/lib/Target/RISCV/RISCVMachineScheduler.h
@@ -0,0 +1,42 @@
+//===--- RISCVMachineScheduler.h - Custom RISC-V MI scheduler ---*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Custom RISC-V MI scheduler.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIB_TARGET_RISCV_RISCVMACHINESCHEDULER_H
+#define LLVM_LIB_TARGET_RISCV_RISCVMACHINESCHEDULER_H
+
+#include "llvm/CodeGen/MachineScheduler.h"
+#include "llvm/TargetParser/RISCVTargetParser.h"
+
+namespace llvm {
+
+/// A GenericScheduler implementation for RISCV pre RA scheduling.
+class RISCVPreRAMachineSchedStrategy : public GenericScheduler {
+private:
+ RISCVII::VLMUL PrevVLMUL;
+ unsigned PrevVSEW;
+
+public:
+ RISCVPreRAMachineSchedStrategy(const MachineSchedContext *C)
+ : GenericScheduler(C) {}
+
+protected:
+ SUnit *pickNode(bool &IsTopNode) override;
+
+ bool tryCandidate(SchedCandidate &Cand, SchedCandidate &TryCand,
+ SchedBoundary *Zone) const override;
+
+ void schedNode(SUnit *SU, bool IsTopNode) override;
+};
+
+} // end namespace llvm
+
+#endif
diff --git a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
index 35d0b3408d09f..e0dcbbddc3f53 100644
--- a/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
+++ b/llvm/lib/Target/RISCV/RISCVTargetMachine.cpp
@@ -14,6 +14,7 @@
#include "MCTargetDesc/RISCVBaseInfo.h"
#include "RISCV.h"
#include "RISCVMachineFunctionInfo.h"
+#include "RISCVMachineScheduler.h"
#include "RISCVTargetObjectFile.h"
#include "RISCVTargetTransformInfo.h"
#include "TargetInfo/RISCVTargetInfo.h"
@@ -340,12 +341,11 @@ class RISCVPassConfig : public TargetPassConfig {
ScheduleDAGInstrs *
createMachineScheduler(MachineSchedContext *C) const override {
- ScheduleDAGMILive *DAG = nullptr;
- if (EnableMISchedLoadClustering) {
- DAG = createGenericSchedLive(C);
+ ScheduleDAGMILive *DAG =
+ createGenericSchedLive<RISCVPreRAMachineSchedStrategy>(C);
+ if (EnableMISchedLoadClustering)
DAG->addMutation(createLoadClusterDAGMutation(
DAG->TII, DAG->TRI, /*ReorderWhileClustering=*/true));
- }
return DAG;
}
diff --git a/llvm/test/CodeGen/RISCV/rvv/schedule.ll b/llvm/test/CodeGen/RISCV/rvv/schedule.ll
new file mode 100644
index 0000000000000..baf15ef400df5
--- /dev/null
+++ b/llvm/test/CodeGen/RISCV/rvv/schedule.ll
@@ -0,0 +1,49 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
+; RUN: llc -mtriple=riscv64 -mcpu=sifive-x280 -verify-machineinstrs < %s \
+; RUN: | FileCheck %s --check-prefix=DEFAULT
+; RUN: llc -mtriple=riscv64 -mcpu=sifive-x280 -riscv-enable-schedule-same-vtype -verify-machineinstrs < %s \
+; RUN: | FileCheck %s --check-prefix=SAME-VTYPE-FIRST
+
+define <vscale x 1 x i64> @test(<vscale x 1 x i64> %v64_0, <vscale x 1 x i64> %v64_1, <vscale x 1 x i32> %v32_0, <vscale x 1 x i32> %v32_1) {
+; DEFAULT-LABEL: test:
+; DEFAULT: # %bb.0: # %entry
+; DEFAULT-NEXT: vsetvli a0, zero, e64, m1, ta, ma
+; DEFAULT-NEXT: vdiv.vv v12, v8, v9
+; DEFAULT-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
+; DEFAULT-NEXT: vdiv.vv v13, v10, v11
+; DEFAULT-NEXT: vsetvli zero, zero, e64, m1, ta, ma
+; DEFAULT-NEXT: vadd.vv v8, v8, v9
+; DEFAULT-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
+; DEFAULT-NEXT: vadd.vv v9, v10, v11
+; DEFAULT-NEXT: vsetvli zero, zero, e64, m1, ta, ma
+; DEFAULT-NEXT: vadd.vv v8, v8, v12
+; DEFAULT-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
+; DEFAULT-NEXT: vadd.vv v9, v9, v13
+; DEFAULT-NEXT: vwadd.wv v8, v8, v9
+; DEFAULT-NEXT: ret
+;
+; SAME-VTYPE-FIRST-LABEL: test:
+; SAME-VTYPE-FIRST: # %bb.0: # %entry
+; SAME-VTYPE-FIRST-NEXT: vsetvli a0, zero, e64, m1, ta, ma
+; SAME-VTYPE-FIRST-NEXT: vadd.vv v12, v8, v9
+; SAME-VTYPE-FIRST-NEXT: vdiv.vv v8, v8, v9
+; SAME-VTYPE-FIRST-NEXT: vadd.vv v8, v12, v8
+; SAME-VTYPE-FIRST-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
+; SAME-VTYPE-FIRST-NEXT: vadd.vv v9, v10, v11
+; SAME-VTYPE-FIRST-NEXT: vdiv.vv v10, v10, v11
+; SAME-VTYPE-FIRST-NEXT: vadd.vv v9, v9, v10
+; SAME-VTYPE-FIRST-NEXT: vwadd.wv v8, v8, v9
+; SAME-VTYPE-FIRST-NEXT: ret
+entry:
+ %0 = add <vscale x 1 x i64> %v64_0, %v64_1
+ %1 = add <vscale x 1 x i32> %v32_0, %v32_1
+ %2 = sdiv <vscale x 1 x i64> %v64_0, %v64_1
+ %3 = sdiv <vscale x 1 x i32> %v32_0, %v32_1
+ %4 = add <vscale x 1 x i64> %0, %2
+ %5 = add <vscale x 1 x i32> %1, %3
+
+ %6 = sext <vscale x 1 x i32> %5 to <vscale x 1 x i64>
+ %7 = add <vscale x 1 x i64> %4, %6
+ ret <vscale x 1 x i64> %7
+}
+
>From 185e0f8266c2dec9a161328c6c14490fe3cffa69 Mon Sep 17 00:00:00 2001
From: Wang Pengcheng <wangpengcheng.pp at bytedance.com>
Date: Wed, 19 Jun 2024 18:45:50 +0800
Subject: [PATCH 2/8] Support buttomup/topdown/bidirectional and fix some
failures
Created using spr 1.3.6-beta.1
---
.../Target/RISCV/RISCVMachineScheduler.cpp | 79 ++++++++---
llvm/test/CodeGen/RISCV/rvv/schedule.ll | 125 +++++++++++++++---
2 files changed, 165 insertions(+), 39 deletions(-)
diff --git a/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp b/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
index d993d840c3d3a..530d4f6b2d845 100644
--- a/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
+++ b/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
@@ -27,34 +27,68 @@ static cl::opt<bool> EnableScheduleSameVType(
cl::desc("Enable scheduling RVV instructions with same vtype first"));
SUnit *RISCVPreRAMachineSchedStrategy::pickNode(bool &IsTopNode) {
- if (EnableScheduleSameVType) {
- for (SUnit *SU : Bot.Available) {
+ auto FindPotentialRVVInstructionInQueue =
+ [&](SchedBoundary &Boundary, ReadyQueue Q, bool ShouldBeTop) -> SUnit * {
+ for (SUnit *SU : Q) {
+ if (SU->isScheduled)
+ continue;
+
MachineInstr *MI = SU->getInstr();
const MCInstrDesc &Desc = MI->getDesc();
if (RISCVII::hasSEWOp(Desc.TSFlags)) {
unsigned CurVSEW = MI->getOperand(RISCVII::getSEWOpNum(Desc)).getImm();
RISCVII::VLMUL CurVLMUL = RISCVII::getLMul(Desc.TSFlags);
+ // FIXME: We should consider vl and policy here.
if (CurVSEW == PrevVSEW && CurVLMUL == PrevVLMUL) {
- Bot.removeReady(SU);
- IsTopNode = true;
+ IsTopNode = ShouldBeTop;
+ // Boundary.removeReady(SU);
+ if (SU->isTopReady())
+ Top.removeReady(SU);
+ if (SU->isBottomReady())
+ Bot.removeReady(SU);
+ LLVM_DEBUG(dbgs() << "Scheduling SU(" << SU->NodeNum << ") "
+ << *SU->getInstr());
return SU;
}
}
}
- for (SUnit *SU : Bot.Pending) {
- MachineInstr *MI = SU->getInstr();
- const MCInstrDesc &Desc = MI->getDesc();
- if (RISCVII::hasSEWOp(Desc.TSFlags)) {
- unsigned CurVSEW = MI->getOperand(RISCVII::getSEWOpNum(Desc)).getImm();
- RISCVII::VLMUL CurVLMUL = RISCVII::getLMul(Desc.TSFlags);
- if (CurVSEW == PrevVSEW && CurVLMUL == PrevVLMUL) {
- Bot.removeReady(SU);
- IsTopNode = false;
- return SU;
- }
- }
+ return nullptr;
+ };
+
+ auto FindPotentialRVVInstruction = [&](SchedBoundary &Boundary,
+ bool ShouldBeTop) -> SUnit * {
+ if (SUnit *Available = FindPotentialRVVInstructionInQueue(
+ Boundary, Boundary.Available, ShouldBeTop))
+ return Available;
+ if (SUnit *Pending = FindPotentialRVVInstructionInQueue(
+ Boundary, Boundary.Pending, ShouldBeTop))
+ return Pending;
+ return nullptr;
+ };
+
+ if (EnableScheduleSameVType) {
+ if (RegionPolicy.OnlyBottomUp) {
+ if (SUnit *SU = FindPotentialRVVInstruction(Bot, false))
+ return SU;
+ } else if (RegionPolicy.OnlyTopDown) {
+ if (SUnit *SU = FindPotentialRVVInstruction(Top, true))
+ return SU;
+ } else {
+ if (SUnit *SU =
+ FindPotentialRVVInstructionInQueue(Bot, Bot.Available, false))
+ return SU;
+ if (SUnit *SU =
+ FindPotentialRVVInstructionInQueue(Top, Top.Available, true))
+ return SU;
+ if (SUnit *SU =
+ FindPotentialRVVInstructionInQueue(Bot, Bot.Pending, false))
+ return SU;
+ if (SUnit *SU =
+ FindPotentialRVVInstructionInQueue(Top, Top.Pending, true))
+ return SU;
}
}
+
return GenericScheduler::pickNode(IsTopNode);
}
@@ -73,11 +107,12 @@ void RISCVPreRAMachineSchedStrategy::schedNode(SUnit *SU, bool IsTopNode) {
if (RISCVII::hasSEWOp(Desc.TSFlags)) {
PrevVSEW = MI->getOperand(RISCVII::getSEWOpNum(Desc)).getImm();
PrevVLMUL = RISCVII::getLMul(Desc.TSFlags);
+ LLVM_DEBUG(dbgs() << "Previous scheduled Unit: ";
+ dbgs() << "SU(" << SU->NodeNum << ") - ";
+ SU->getInstr()->dump(););
+ LLVM_DEBUG(dbgs() << "Previous VSEW : " << (1 << PrevVSEW) << "\n";
+ auto LMUL = RISCVVType::decodeVLMUL(PrevVLMUL);
+ dbgs() << "Previous VLMUL: m" << (LMUL.second ? "f" : "")
+ << LMUL.first << "\n";);
}
- LLVM_DEBUG(dbgs() << "Previous scheduled Unit: ";
- dbgs() << "SU(" << SU->NodeNum << ") - "; SU->getInstr()->dump(););
- LLVM_DEBUG(dbgs() << "Previous VSEW : " << (1 << PrevVSEW) << "\n";
- auto LMUL = RISCVVType::decodeVLMUL(PrevVLMUL);
- dbgs() << "Previous VLMUL: m" << (LMUL.second ? "f" : "")
- << LMUL.first << "\n";);
}
diff --git a/llvm/test/CodeGen/RISCV/rvv/schedule.ll b/llvm/test/CodeGen/RISCV/rvv/schedule.ll
index baf15ef400df5..6b466d802ac4a 100644
--- a/llvm/test/CodeGen/RISCV/rvv/schedule.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/schedule.ll
@@ -1,15 +1,33 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc -mtriple=riscv64 -mcpu=sifive-x280 -verify-machineinstrs < %s \
; RUN: | FileCheck %s --check-prefix=DEFAULT
-; RUN: llc -mtriple=riscv64 -mcpu=sifive-x280 -riscv-enable-schedule-same-vtype -verify-machineinstrs < %s \
-; RUN: | FileCheck %s --check-prefix=SAME-VTYPE-FIRST
+; RUN: llc -mtriple=riscv64 -mcpu=sifive-x280 -misched-bottomup=true -misched-topdown=false \
+; RUN: -riscv-enable-schedule-same-vtype -verify-machineinstrs < %s \
+; RUN: | FileCheck %s --check-prefix=SAME-VTYPE-FIRST-BOTTOMUP
+; RUN: llc -mtriple=riscv64 -mcpu=sifive-x280 -misched-bottomup=false -misched-topdown=true \
+; RUN: -riscv-enable-schedule-same-vtype -verify-machineinstrs < %s \
+; RUN: | FileCheck %s --check-prefix=SAME-VTYPE-FIRST-TOPDOWN
+; RUN: llc -mtriple=riscv64 -mcpu=sifive-x280 -misched-bottomup=false -misched-topdown=false \
+; RUN: -riscv-enable-schedule-same-vtype -verify-machineinstrs < %s \
+; RUN: | FileCheck %s --check-prefix=SAME-VTYPE-FIRST-BIDIRECTIONAL
-define <vscale x 1 x i64> @test(<vscale x 1 x i64> %v64_0, <vscale x 1 x i64> %v64_1, <vscale x 1 x i32> %v32_0, <vscale x 1 x i32> %v32_1) {
+declare void @consume(i64 %scalar, <vscale x 1 x i64> %vector)
+
+define void @test(i64 %a, i64 %b, <vscale x 1 x i64> %v64_0, <vscale x 1 x i64> %v64_1, <vscale x 1 x i32> %v32_0, <vscale x 1 x i32> %v32_1) {
; DEFAULT-LABEL: test:
; DEFAULT: # %bb.0: # %entry
-; DEFAULT-NEXT: vsetvli a0, zero, e64, m1, ta, ma
+; DEFAULT-NEXT: addi sp, sp, -16
+; DEFAULT-NEXT: .cfi_def_cfa_offset 16
+; DEFAULT-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
+; DEFAULT-NEXT: .cfi_offset ra, -8
+; DEFAULT-NEXT: vsetvli a2, zero, e64, m1, ta, ma
; DEFAULT-NEXT: vdiv.vv v12, v8, v9
; DEFAULT-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
+; DEFAULT-NEXT: div a2, a0, a1
+; DEFAULT-NEXT: add a3, a0, a1
+; DEFAULT-NEXT: mul a0, a0, a1
+; DEFAULT-NEXT: add a0, a0, a3
+; DEFAULT-NEXT: add a0, a0, a2
; DEFAULT-NEXT: vdiv.vv v13, v10, v11
; DEFAULT-NEXT: vsetvli zero, zero, e64, m1, ta, ma
; DEFAULT-NEXT: vadd.vv v8, v8, v9
@@ -20,30 +38,103 @@ define <vscale x 1 x i64> @test(<vscale x 1 x i64> %v64_0, <vscale x 1 x i64> %v
; DEFAULT-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
; DEFAULT-NEXT: vadd.vv v9, v9, v13
; DEFAULT-NEXT: vwadd.wv v8, v8, v9
+; DEFAULT-NEXT: call consume
+; DEFAULT-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
+; DEFAULT-NEXT: addi sp, sp, 16
; DEFAULT-NEXT: ret
;
-; SAME-VTYPE-FIRST-LABEL: test:
-; SAME-VTYPE-FIRST: # %bb.0: # %entry
-; SAME-VTYPE-FIRST-NEXT: vsetvli a0, zero, e64, m1, ta, ma
-; SAME-VTYPE-FIRST-NEXT: vadd.vv v12, v8, v9
-; SAME-VTYPE-FIRST-NEXT: vdiv.vv v8, v8, v9
-; SAME-VTYPE-FIRST-NEXT: vadd.vv v8, v12, v8
-; SAME-VTYPE-FIRST-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
-; SAME-VTYPE-FIRST-NEXT: vadd.vv v9, v10, v11
-; SAME-VTYPE-FIRST-NEXT: vdiv.vv v10, v10, v11
-; SAME-VTYPE-FIRST-NEXT: vadd.vv v9, v9, v10
-; SAME-VTYPE-FIRST-NEXT: vwadd.wv v8, v8, v9
-; SAME-VTYPE-FIRST-NEXT: ret
+; SAME-VTYPE-FIRST-BOTTOMUP-LABEL: test:
+; SAME-VTYPE-FIRST-BOTTOMUP: # %bb.0: # %entry
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: addi sp, sp, -16
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: .cfi_def_cfa_offset 16
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: .cfi_offset ra, -8
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: vsetvli a2, zero, e64, m1, ta, ma
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: vadd.vv v12, v8, v9
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: div a2, a0, a1
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: add a3, a0, a1
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: vdiv.vv v8, v8, v9
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: mul a0, a0, a1
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: add a0, a0, a3
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: add a0, a0, a2
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: vadd.vv v8, v12, v8
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: vadd.vv v9, v10, v11
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: vdiv.vv v10, v10, v11
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: vadd.vv v9, v9, v10
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: vwadd.wv v8, v8, v9
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: call consume
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: addi sp, sp, 16
+; SAME-VTYPE-FIRST-BOTTOMUP-NEXT: ret
+;
+; SAME-VTYPE-FIRST-TOPDOWN-LABEL: test:
+; SAME-VTYPE-FIRST-TOPDOWN: # %bb.0: # %entry
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: addi sp, sp, -16
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: .cfi_def_cfa_offset 16
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: .cfi_offset ra, -8
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: vsetvli a3, zero, e32, mf2, ta, ma
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: vadd.vv v12, v10, v11
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: vdiv.vv v10, v10, v11
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: add a2, a0, a1
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: mul a3, a0, a1
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: div a0, a0, a1
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: add a2, a2, a3
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: vadd.vv v10, v12, v10
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: vsetvli zero, zero, e64, m1, ta, ma
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: vadd.vv v11, v8, v9
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: vdiv.vv v8, v8, v9
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: add a0, a0, a2
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: vadd.vv v8, v11, v8
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: vwadd.wv v8, v8, v10
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: call consume
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: addi sp, sp, 16
+; SAME-VTYPE-FIRST-TOPDOWN-NEXT: ret
+;
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-LABEL: test:
+; SAME-VTYPE-FIRST-BIDIRECTIONAL: # %bb.0: # %entry
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: addi sp, sp, -16
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: .cfi_def_cfa_offset 16
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: .cfi_offset ra, -8
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: vsetvli a2, zero, e32, mf2, ta, ma
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: vadd.vv v12, v10, v11
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: vdiv.vv v10, v10, v11
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: vsetvli zero, zero, e64, m1, ta, ma
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: div a2, a0, a1
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: add a3, a0, a1
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: mul a0, a0, a1
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: add a0, a0, a3
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: vadd.vv v11, v8, v9
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: vdiv.vv v8, v8, v9
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: add a0, a0, a2
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: vadd.vv v8, v11, v8
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: vsetvli zero, zero, e32, mf2, ta, ma
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: vadd.vv v9, v12, v10
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: vwadd.wv v8, v8, v9
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: call consume
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: addi sp, sp, 16
+; SAME-VTYPE-FIRST-BIDIRECTIONAL-NEXT: ret
entry:
%0 = add <vscale x 1 x i64> %v64_0, %v64_1
+ %scalar0 = add i64 %a, %b
%1 = add <vscale x 1 x i32> %v32_0, %v32_1
%2 = sdiv <vscale x 1 x i64> %v64_0, %v64_1
+ %scalar1 = mul i64 %a, %b
%3 = sdiv <vscale x 1 x i32> %v32_0, %v32_1
%4 = add <vscale x 1 x i64> %0, %2
+ %scalar2 = sdiv i64 %a, %b
%5 = add <vscale x 1 x i32> %1, %3
%6 = sext <vscale x 1 x i32> %5 to <vscale x 1 x i64>
+ %scalar3 = add i64 %scalar0, %scalar1
%7 = add <vscale x 1 x i64> %4, %6
- ret <vscale x 1 x i64> %7
+ %scalar4 = add i64 %scalar2, %scalar3
+ call void @consume(i64 %scalar4, <vscale x 1 x i64> %7)
+ ret void
}
>From b86faa86e6e8e661e460ccbe20048141ff0b2c13 Mon Sep 17 00:00:00 2001
From: Wang Pengcheng <wangpengcheng.pp at bytedance.com>
Date: Tue, 2 Dec 2025 17:00:12 +0800
Subject: [PATCH 3/8] Revert llvm/lib/CodeGen/MachineScheduler.cpp change
Created using spr 1.3.6-beta.1
---
llvm/lib/CodeGen/MachineScheduler.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/CodeGen/MachineScheduler.cpp b/llvm/lib/CodeGen/MachineScheduler.cpp
index efe64788c5efa..de29a9fab876e 100644
--- a/llvm/lib/CodeGen/MachineScheduler.cpp
+++ b/llvm/lib/CodeGen/MachineScheduler.cpp
@@ -2964,7 +2964,7 @@ void SchedBoundary::bumpNode(SUnit *SU) {
unsigned NextCycle = CurrCycle;
switch (SchedModel->getMicroOpBufferSize()) {
case 0:
- // assert(ReadyCycle <= CurrCycle && "Broken PendingQueue");
+ assert(ReadyCycle <= CurrCycle && "Broken PendingQueue");
break;
case 1:
if (ReadyCycle > NextCycle) {
>From d1578900fc951d219904b3cde2d9f7ae46bce381 Mon Sep 17 00:00:00 2001
From: Wang Pengcheng <wangpengcheng.pp at bytedance.com>
Date: Sun, 4 Jan 2026 14:44:13 +0800
Subject: [PATCH 4/8] Remove private, add EnableVTypeSchedHeuristic option and
rework tests
Created using spr 1.3.6-beta.1
---
.../Target/RISCV/RISCVMachineScheduler.cpp | 10 +-
llvm/lib/Target/RISCV/RISCVMachineScheduler.h | 8 +-
llvm/lib/Target/RISCV/RISCVProcessors.td | 4 +-
llvm/lib/Target/RISCV/RISCVSubtarget.h | 6 +
.../RISCV/rvv/rvv-vtype-based-scheduler.ll | 555 +-----------------
5 files changed, 46 insertions(+), 537 deletions(-)
diff --git a/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp b/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
index e7035ce399bd3..32c95082ccf1e 100644
--- a/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
+++ b/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
@@ -18,6 +18,12 @@ static cl::opt<bool> EnableVTypeSchedHeuristic(
cl::desc("Enable scheduling RVV instructions based on vtype heuristic "
"(pick instruction with compatible vtype first)"));
+bool RISCVPreRAMachineSchedStrategy::enableVTypeSchedHeuristic() const {
+ if (EnableVTypeSchedHeuristic.getNumOccurrences() > 0)
+ return EnableVTypeSchedHeuristic;
+ return ST->enableVTypeSchedHeuristic();
+}
+
RISCV::VSETVLIInfo
RISCVPreRAMachineSchedStrategy::getVSETVLIInfo(const MachineInstr *MI) const {
unsigned TSFlags = MI->getDesc().TSFlags;
@@ -177,7 +183,7 @@ bool RISCVPreRAMachineSchedStrategy::tryCandidate(SchedCandidate &Cand,
// TODO: We should not use `CandReason::Cluster` here, but is there a
// mechanism to extend this enum?
- if (EnableVTypeSchedHeuristic &&
+ if (enableVTypeSchedHeuristic() &&
tryVType(getVSETVLIInfo(TryCand.SU->getInstr()),
getVSETVLIInfo(Cand.SU->getInstr()), TryCand, Cand, Cluster))
return TryCand.Reason != NoCand;
@@ -197,7 +203,7 @@ void RISCVPreRAMachineSchedStrategy::leaveMBB() {
void RISCVPreRAMachineSchedStrategy::schedNode(SUnit *SU, bool IsTopNode) {
GenericScheduler::schedNode(SU, IsTopNode);
- if (EnableVTypeSchedHeuristic) {
+ if (enableVTypeSchedHeuristic()) {
MachineInstr *MI = SU->getInstr();
const RISCV::VSETVLIInfo &Info = getVSETVLIInfo(MI);
if (Info.isValid()) {
diff --git a/llvm/lib/Target/RISCV/RISCVMachineScheduler.h b/llvm/lib/Target/RISCV/RISCVMachineScheduler.h
index 4bd07871a0b97..a4a439f489c2b 100644
--- a/llvm/lib/Target/RISCV/RISCVMachineScheduler.h
+++ b/llvm/lib/Target/RISCV/RISCVMachineScheduler.h
@@ -21,11 +21,13 @@ namespace llvm {
/// A GenericScheduler implementation for RISCV pre RA scheduling.
class RISCVPreRAMachineSchedStrategy : public GenericScheduler {
-private:
+ const RISCVSubtarget *ST;
RISCV::RISCVVSETVLIInfoAnalysis VIA;
RISCV::VSETVLIInfo TopVType;
RISCV::VSETVLIInfo BottomVType;
+ bool enableVTypeSchedHeuristic() const;
+
RISCV::VSETVLIInfo getVSETVLIInfo(const MachineInstr *MI) const;
bool tryVType(RISCV::VSETVLIInfo TryVType, RISCV::VSETVLIInfo CandVtype,
SchedCandidate &TryCand, SchedCandidate &Cand,
@@ -33,8 +35,8 @@ class RISCVPreRAMachineSchedStrategy : public GenericScheduler {
public:
RISCVPreRAMachineSchedStrategy(const MachineSchedContext *C)
- : GenericScheduler(C),
- VIA(&C->MF->getSubtarget<RISCVSubtarget>(), C->LIS) {}
+ : GenericScheduler(C), ST(&C->MF->getSubtarget<RISCVSubtarget>()),
+ VIA(ST, C->LIS) {}
protected:
bool tryCandidate(SchedCandidate &Cand, SchedCandidate &TryCand,
diff --git a/llvm/lib/Target/RISCV/RISCVProcessors.td b/llvm/lib/Target/RISCV/RISCVProcessors.td
index 5becfd2ad502b..7c151fcebcbdf 100644
--- a/llvm/lib/Target/RISCV/RISCVProcessors.td
+++ b/llvm/lib/Target/RISCV/RISCVProcessors.td
@@ -45,6 +45,8 @@ class RISCVTuneInfo {
// The direction of PostRA scheduling.
code PostRASchedDirection = TopDown;
+
+ bit EnableVTypeSchedHeuristic = 0;
}
def RISCVTuneInfoTable : GenericTable {
@@ -58,7 +60,7 @@ def RISCVTuneInfoTable : GenericTable {
"MaxStoresPerMemcpyOptSize", "MaxStoresPerMemcpy",
"MaxStoresPerMemmoveOptSize", "MaxStoresPerMemmove",
"MaxLoadsPerMemcmpOptSize", "MaxLoadsPerMemcmp",
- "PostRASchedDirection"];
+ "PostRASchedDirection", "EnableVTypeSchedHeuristic"];
}
def getRISCVTuneInfo : SearchIndex {
diff --git a/llvm/lib/Target/RISCV/RISCVSubtarget.h b/llvm/lib/Target/RISCV/RISCVSubtarget.h
index ae6ca970c0c49..c4f0705d6864e 100644
--- a/llvm/lib/Target/RISCV/RISCVSubtarget.h
+++ b/llvm/lib/Target/RISCV/RISCVSubtarget.h
@@ -70,6 +70,8 @@ struct RISCVTuneInfo {
// The direction of PostRA scheduling.
MISched::Direction PostRASchedDirection;
+
+ bool EnableVTypeSchedHeuristic;
};
#define GET_RISCVTuneInfoTable_DECL
@@ -433,6 +435,10 @@ class RISCVSubtarget : public RISCVGenSubtargetInfo {
return TuneInfo->PostRASchedDirection;
}
+ bool enableVTypeSchedHeuristic() const {
+ return TuneInfo->EnableVTypeSchedHeuristic;
+ }
+
void overrideSchedPolicy(MachineSchedPolicy &Policy,
const SchedRegion &Region) const override;
diff --git a/llvm/test/CodeGen/RISCV/rvv/rvv-vtype-based-scheduler.ll b/llvm/test/CodeGen/RISCV/rvv/rvv-vtype-based-scheduler.ll
index 8c48937e573ea..960906bae316d 100644
--- a/llvm/test/CodeGen/RISCV/rvv/rvv-vtype-based-scheduler.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/rvv-vtype-based-scheduler.ll
@@ -1,4 +1,3 @@
-; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc -mtriple=riscv64 -mcpu=spacemit-x60 -verify-machineinstrs < %s \
; RUN: | FileCheck %s --check-prefix=DEFAULT
; RUN: llc -mtriple=riscv64 -mcpu=spacemit-x60 -misched-prera-direction=bottomup \
@@ -11,388 +10,18 @@
; RUN: -riscv-enable-vtype-sched-heuristic -verify-machineinstrs < %s \
; RUN: | FileCheck %s --check-prefix=VTYPE-SCHED-BIDIRECTIONAL
-define void @test(i16 %0, i16 %1, i16 %2, i16 %3, i16 %4, i16 %5, i16 %6, ptr %7, ptr %8, ptr %9, ptr %10, ptr %11, i32 %12) {
-; DEFAULT-LABEL: test:
-; DEFAULT: # %bb.0: # %entry
-; DEFAULT-NEXT: ld a6, 0(sp)
-; DEFAULT-NEXT: vsetivli zero, 16, e8, m1, ta, ma
-; DEFAULT-NEXT: vle8.v v9, (a7)
-; DEFAULT-NEXT: ld a7, 8(sp)
-; DEFAULT-NEXT: vle8.v v8, (a6)
-; DEFAULT-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; DEFAULT-NEXT: vslidedown.vi v10, v9, 1
-; DEFAULT-NEXT: ld a6, 16(sp)
-; DEFAULT-NEXT: vslidedown.vi v11, v8, 1
-; DEFAULT-NEXT: vsetivli zero, 16, e8, m1, ta, ma
-; DEFAULT-NEXT: vle8.v v12, (a7)
-; DEFAULT-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; DEFAULT-NEXT: vslidedown.vi v13, v12, 1
-; DEFAULT-NEXT: vsetivli zero, 16, e8, m1, ta, ma
-; DEFAULT-NEXT: vle8.v v14, (a6)
-; DEFAULT-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; DEFAULT-NEXT: vslidedown.vi v15, v14, 1
-; DEFAULT-NEXT: vslidedown.vi v16, v9, 2
-; DEFAULT-NEXT: vslidedown.vi v17, v8, 2
-; DEFAULT-NEXT: vslidedown.vi v18, v12, 2
-; DEFAULT-NEXT: vslidedown.vi v19, v14, 2
-; DEFAULT-NEXT: vslidedown.vi v20, v9, 3
-; DEFAULT-NEXT: vslidedown.vi v21, v8, 3
-; DEFAULT-NEXT: vslidedown.vi v22, v12, 3
-; DEFAULT-NEXT: vslidedown.vi v23, v14, 3
-; DEFAULT-NEXT: vslidedown.vi v24, v9, 4
-; DEFAULT-NEXT: vslidedown.vi v25, v8, 4
-; DEFAULT-NEXT: vslidedown.vi v26, v12, 4
-; DEFAULT-NEXT: vslidedown.vi v27, v14, 4
-; DEFAULT-NEXT: vslidedown.vi v28, v9, 5
-; DEFAULT-NEXT: vslidedown.vi v29, v8, 5
-; DEFAULT-NEXT: vsetivli zero, 8, e16, m1, ta, ma
-; DEFAULT-NEXT: vmv.v.i v30, 0
-; DEFAULT-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; DEFAULT-NEXT: vslidedown.vi v31, v12, 5
-; DEFAULT-NEXT: vmv1r.v v7, v30
-; DEFAULT-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
-; DEFAULT-NEXT: vwmaccsu.vx v7, a0, v9
-; DEFAULT-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; DEFAULT-NEXT: vslidedown.vi v9, v14, 5
-; DEFAULT-NEXT: vmv1r.v v6, v30
-; DEFAULT-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
-; DEFAULT-NEXT: vwmaccsu.vx v6, a0, v8
-; DEFAULT-NEXT: vwmaccsu.vx v7, a1, v10
-; DEFAULT-NEXT: vmv1r.v v8, v30
-; DEFAULT-NEXT: vwmaccsu.vx v8, a0, v12
-; DEFAULT-NEXT: vwmaccsu.vx v6, a1, v11
-; DEFAULT-NEXT: vwmaccsu.vx v7, a2, v16
-; DEFAULT-NEXT: vwmaccsu.vx v30, a0, v14
-; DEFAULT-NEXT: vwmaccsu.vx v8, a1, v13
-; DEFAULT-NEXT: vwmaccsu.vx v6, a2, v17
-; DEFAULT-NEXT: vwmaccsu.vx v7, a3, v20
-; DEFAULT-NEXT: vwmaccsu.vx v30, a1, v15
-; DEFAULT-NEXT: vwmaccsu.vx v8, a2, v18
-; DEFAULT-NEXT: vwmaccsu.vx v6, a3, v21
-; DEFAULT-NEXT: vwmaccsu.vx v7, a4, v24
-; DEFAULT-NEXT: vwmaccsu.vx v30, a2, v19
-; DEFAULT-NEXT: vwmaccsu.vx v8, a3, v22
-; DEFAULT-NEXT: vwmaccsu.vx v6, a4, v25
-; DEFAULT-NEXT: vwmaccsu.vx v7, a5, v28
-; DEFAULT-NEXT: vwmaccsu.vx v30, a3, v23
-; DEFAULT-NEXT: vwmaccsu.vx v8, a4, v26
-; DEFAULT-NEXT: vwmaccsu.vx v6, a5, v29
-; DEFAULT-NEXT: vsetvli zero, zero, e16, m1, ta, ma
-; DEFAULT-NEXT: vmax.vx v10, v7, zero
-; DEFAULT-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
-; DEFAULT-NEXT: vwmaccsu.vx v30, a4, v27
-; DEFAULT-NEXT: vwmaccsu.vx v8, a5, v31
-; DEFAULT-NEXT: vsetvli zero, zero, e16, m1, ta, ma
-; DEFAULT-NEXT: vmax.vx v11, v6, zero
-; DEFAULT-NEXT: csrwi vxrm, 0
-; DEFAULT-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
-; DEFAULT-NEXT: vnclipu.wi v10, v10, 6
-; DEFAULT-NEXT: vwmaccsu.vx v30, a5, v9
-; DEFAULT-NEXT: ld a0, 24(sp)
-; DEFAULT-NEXT: vsetvli zero, zero, e16, m1, ta, ma
-; DEFAULT-NEXT: vmax.vx v8, v8, zero
-; DEFAULT-NEXT: lw a1, 32(sp)
-; DEFAULT-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
-; DEFAULT-NEXT: vnclipu.wi v9, v11, 6
-; DEFAULT-NEXT: vsetvli zero, zero, e16, m1, ta, ma
-; DEFAULT-NEXT: vmax.vx v11, v30, zero
-; DEFAULT-NEXT: vse8.v v10, (a0)
-; DEFAULT-NEXT: add a2, a0, a1
-; DEFAULT-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
-; DEFAULT-NEXT: vnclipu.wi v8, v8, 6
-; DEFAULT-NEXT: vse8.v v9, (a2)
-; DEFAULT-NEXT: sh1add a2, a1, a0
-; DEFAULT-NEXT: vnclipu.wi v9, v11, 6
-; DEFAULT-NEXT: sh1add a1, a1, a1
-; DEFAULT-NEXT: vse8.v v8, (a2)
-; DEFAULT-NEXT: add a0, a0, a1
-; DEFAULT-NEXT: vse8.v v9, (a0)
-; DEFAULT-NEXT: ret
-;
-; VTYPE-SCHED-BOTTOMUP-LABEL: test:
-; VTYPE-SCHED-BOTTOMUP: # %bb.0: # %entry
-; VTYPE-SCHED-BOTTOMUP-NEXT: ld a6, 0(sp)
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetivli zero, 16, e8, m1, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vle8.v v9, (a7)
-; VTYPE-SCHED-BOTTOMUP-NEXT: ld a7, 8(sp)
-; VTYPE-SCHED-BOTTOMUP-NEXT: vle8.v v8, (a6)
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v10, v9, 1
-; VTYPE-SCHED-BOTTOMUP-NEXT: ld a6, 16(sp)
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetivli zero, 16, e8, m1, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vle8.v v11, (a7)
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v12, v8, 1
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetivli zero, 16, e8, m1, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vle8.v v13, (a6)
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v14, v11, 1
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v15, v13, 1
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v16, v9, 2
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v17, v8, 2
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v18, v11, 2
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v19, v13, 2
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v20, v9, 3
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v21, v8, 3
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v22, v11, 3
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v23, v13, 3
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v24, v9, 4
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v25, v8, 4
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v26, v11, 4
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v27, v13, 4
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v28, v9, 5
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v29, v8, 5
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v30, v11, 5
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetivli zero, 8, e16, m1, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmv.v.i v31, 0
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vslidedown.vi v7, v13, 5
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmv1r.v v6, v31
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v6, a0, v9
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmv1r.v v9, v31
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v9, a0, v8
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v6, a1, v10
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmv1r.v v8, v31
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v8, a0, v11
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v31, a0, v13
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v9, a1, v12
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v6, a2, v16
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v8, a1, v14
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v31, a1, v15
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v9, a2, v17
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v6, a3, v20
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v8, a2, v18
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v31, a2, v19
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v9, a3, v21
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v6, a4, v24
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v8, a3, v22
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v31, a3, v23
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v9, a4, v25
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v6, a5, v28
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v8, a4, v26
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v31, a4, v27
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v9, a5, v29
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetvli zero, zero, e16, m1, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmax.vx v10, v6, zero
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v8, a5, v30
-; VTYPE-SCHED-BOTTOMUP-NEXT: vwmaccsu.vx v31, a5, v7
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetvli zero, zero, e16, m1, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmax.vx v9, v9, zero
-; VTYPE-SCHED-BOTTOMUP-NEXT: csrwi vxrm, 0
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vnclipu.wi v10, v10, 6
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetvli zero, zero, e16, m1, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmax.vx v8, v8, zero
-; VTYPE-SCHED-BOTTOMUP-NEXT: ld a0, 24(sp)
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmax.vx v11, v31, zero
-; VTYPE-SCHED-BOTTOMUP-NEXT: lw a1, 32(sp)
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vnclipu.wi v9, v9, 6
-; VTYPE-SCHED-BOTTOMUP-NEXT: vnclipu.wi v8, v8, 6
-; VTYPE-SCHED-BOTTOMUP-NEXT: vse8.v v10, (a0)
-; VTYPE-SCHED-BOTTOMUP-NEXT: vnclipu.wi v10, v11, 6
-; VTYPE-SCHED-BOTTOMUP-NEXT: add a2, a0, a1
-; VTYPE-SCHED-BOTTOMUP-NEXT: vse8.v v9, (a2)
-; VTYPE-SCHED-BOTTOMUP-NEXT: sh1add a2, a1, a0
-; VTYPE-SCHED-BOTTOMUP-NEXT: sh1add a1, a1, a1
-; VTYPE-SCHED-BOTTOMUP-NEXT: vse8.v v8, (a2)
-; VTYPE-SCHED-BOTTOMUP-NEXT: add a0, a0, a1
-; VTYPE-SCHED-BOTTOMUP-NEXT: vse8.v v10, (a0)
-; VTYPE-SCHED-BOTTOMUP-NEXT: ret
-;
-; VTYPE-SCHED-TOPDOWN-LABEL: test:
-; VTYPE-SCHED-TOPDOWN: # %bb.0: # %entry
-; VTYPE-SCHED-TOPDOWN-NEXT: lw t1, 32(sp)
-; VTYPE-SCHED-TOPDOWN-NEXT: ld a6, 24(sp)
-; VTYPE-SCHED-TOPDOWN-NEXT: ld t2, 16(sp)
-; VTYPE-SCHED-TOPDOWN-NEXT: ld t3, 8(sp)
-; VTYPE-SCHED-TOPDOWN-NEXT: ld t4, 0(sp)
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 16, e8, m1, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vle8.v v12, (a7)
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 8, e16, m1, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vmv.v.i v8, 0
-; VTYPE-SCHED-TOPDOWN-NEXT: csrwi vxrm, 0
-; VTYPE-SCHED-TOPDOWN-NEXT: sh1add t5, t1, t1
-; VTYPE-SCHED-TOPDOWN-NEXT: add t0, a6, t1
-; VTYPE-SCHED-TOPDOWN-NEXT: sh1add a7, t1, a6
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 16, e8, m1, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vle8.v v13, (t4)
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v16, v12, 1
-; VTYPE-SCHED-TOPDOWN-NEXT: vmv1r.v v9, v8
-; VTYPE-SCHED-TOPDOWN-NEXT: vmv1r.v v10, v8
-; VTYPE-SCHED-TOPDOWN-NEXT: vmv1r.v v11, v8
-; VTYPE-SCHED-TOPDOWN-NEXT: add t1, a6, t5
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 16, e8, m1, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vle8.v v14, (t2)
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v9, a0, v12
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v10, a0, v13
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v17, v13, 1
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 16, e8, m1, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vle8.v v15, (t3)
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v8, a0, v14
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v11, a0, v15
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v9, a1, v16
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v10, a1, v17
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v16, v15, 1
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v17, v14, 1
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v18, v12, 2
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v11, a1, v16
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v8, a1, v17
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v16, v13, 2
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v17, v15, 2
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v19, v14, 2
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v9, a2, v18
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v10, a2, v16
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v11, a2, v17
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v8, a2, v19
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v16, v12, 3
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v17, v13, 3
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v18, v15, 3
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v19, v14, 3
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v9, a3, v16
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v10, a3, v17
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v11, a3, v18
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v8, a3, v19
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v16, v12, 4
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v17, v13, 4
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v18, v15, 4
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v19, v14, 4
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v10, a4, v17
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v9, a4, v16
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v11, a4, v18
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v8, a4, v19
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v12, v12, 5
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v13, v13, 5
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v15, v15, 5
-; VTYPE-SCHED-TOPDOWN-NEXT: vslidedown.vi v14, v14, 5
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v9, a5, v12
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v10, a5, v13
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v11, a5, v15
-; VTYPE-SCHED-TOPDOWN-NEXT: vwmaccsu.vx v8, a5, v14
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetvli zero, zero, e16, m1, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vmax.vx v9, v9, zero
-; VTYPE-SCHED-TOPDOWN-NEXT: vmax.vx v10, v10, zero
-; VTYPE-SCHED-TOPDOWN-NEXT: vmax.vx v11, v11, zero
-; VTYPE-SCHED-TOPDOWN-NEXT: vmax.vx v8, v8, zero
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vnclipu.wi v9, v9, 6
-; VTYPE-SCHED-TOPDOWN-NEXT: vnclipu.wi v10, v10, 6
-; VTYPE-SCHED-TOPDOWN-NEXT: vnclipu.wi v11, v11, 6
-; VTYPE-SCHED-TOPDOWN-NEXT: vse8.v v9, (a6)
-; VTYPE-SCHED-TOPDOWN-NEXT: vnclipu.wi v8, v8, 6
-; VTYPE-SCHED-TOPDOWN-NEXT: vse8.v v10, (t0)
-; VTYPE-SCHED-TOPDOWN-NEXT: vse8.v v11, (a7)
-; VTYPE-SCHED-TOPDOWN-NEXT: vse8.v v8, (t1)
-; VTYPE-SCHED-TOPDOWN-NEXT: ret
-;
-; VTYPE-SCHED-BIDIRECTIONAL-LABEL: test:
-; VTYPE-SCHED-BIDIRECTIONAL: # %bb.0: # %entry
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: ld a6, 0(sp)
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetivli zero, 16, e8, m1, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vle8.v v8, (a7)
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: ld a7, 8(sp)
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vle8.v v9, (a6)
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v10, v8, 1
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: ld a6, 16(sp)
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v11, v9, 1
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetivli zero, 16, e8, m1, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vle8.v v12, (a7)
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v13, v12, 1
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetivli zero, 16, e8, m1, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vle8.v v14, (a6)
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v15, v14, 1
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v16, v8, 2
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v17, v9, 2
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v18, v12, 2
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v19, v14, 2
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v20, v8, 3
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v21, v9, 3
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v22, v12, 3
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v23, v14, 3
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v24, v8, 4
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v25, v9, 4
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v26, v12, 4
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v27, v14, 4
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v28, v8, 5
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v29, v9, 5
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v30, v12, 5
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetivli zero, 8, e16, m1, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmv.v.i v31, 0
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetivli zero, 8, e8, m1, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vslidedown.vi v7, v14, 5
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmv1r.v v6, v31
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetivli zero, 8, e8, mf2, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v6, a0, v8
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmv1r.v v8, v31
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v8, a0, v9
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v6, a1, v10
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmv1r.v v9, v31
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v9, a0, v12
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v31, a0, v14
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v8, a1, v11
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v6, a2, v16
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v9, a1, v13
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v31, a1, v15
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v8, a2, v17
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v6, a3, v20
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v9, a2, v18
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v31, a2, v19
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v8, a3, v21
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v6, a4, v24
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v9, a3, v22
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v31, a3, v23
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v8, a4, v25
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v6, a5, v28
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v9, a4, v26
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v31, a4, v27
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v8, a5, v29
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetvli zero, zero, e16, m1, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmax.vx v10, v6, zero
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v9, a5, v30
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vwmaccsu.vx v31, a5, v7
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetvli zero, zero, e16, m1, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmax.vx v8, v8, zero
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: csrwi vxrm, 0
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vnclipu.wi v10, v10, 6
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: ld a0, 24(sp)
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetvli zero, zero, e16, m1, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmax.vx v9, v9, zero
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: lw a1, 32(sp)
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmax.vx v11, v31, zero
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetvli zero, zero, e8, mf2, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vnclipu.wi v8, v8, 6
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vse8.v v10, (a0)
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vnclipu.wi v9, v9, 6
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: add a2, a0, a1
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: sh1add a3, a1, a0
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vse8.v v8, (a2)
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vnclipu.wi v8, v11, 6
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: sh1add a1, a1, a1
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vse8.v v9, (a3)
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: add a0, a0, a1
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vse8.v v8, (a0)
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: ret
+define void @test0(i16 %0, i16 %1, i16 %2, i16 %3, i16 %4, i16 %5, i16 %6, ptr %7, ptr %8, ptr %9, ptr %10, ptr %11, i32 %12) {
+; DEFAULT-LABEL: test0:
+; DEFAULT-COUNT-19: vset
+
+; VTYPE-SCHED-BOTTOMUP-LABEL: test0:
+; VTYPE-SCHED-BOTTOMUP-COUNT-15: vset
+
+; VTYPE-SCHED-TOPDOWN-LABEL: test0:
+; VTYPE-SCHED-TOPDOWN-COUNT-19: vset
+
+; VTYPE-SCHED-BIDIRECTIONAL-LABEL: test0:
+; VTYPE-SCHED-BIDIRECTIONAL-15: vset
entry:
%14 = tail call <vscale x 8 x i8> @llvm.riscv.vle.nxv8i8.p0.i64(<vscale x 8 x i8> poison, ptr %7, i64 16)
%15 = tail call <vscale x 8 x i8> @llvm.riscv.vle.nxv8i8.p0.i64(<vscale x 8 x i8> poison, ptr %8, i64 16)
@@ -496,154 +125,18 @@ entry:
ret void
}
-define void @foo(ptr %0, ptr %1, ptr %2, ptr %3, ptr %4) {
-; DEFAULT-LABEL: foo:
-; DEFAULT: # %bb.0: # %entry
-; DEFAULT-NEXT: vsetivli zero, 8, e64, m2, ta, ma
-; DEFAULT-NEXT: vle64.v v8, (a1)
-; DEFAULT-NEXT: vle64.v v10, (a2)
-; DEFAULT-NEXT: vmsltu.vv v12, v8, v10
-; DEFAULT-NEXT: vsetvli zero, zero, e8, mf4, ta, ma
-; DEFAULT-NEXT: vmv.x.s a1, v12
-; DEFAULT-NEXT: vsetvli zero, zero, e64, m2, ta, ma
-; DEFAULT-NEXT: vmseq.vv v14, v8, v10
-; DEFAULT-NEXT: vle64.v v12, (a3)
-; DEFAULT-NEXT: vsetvli zero, zero, e8, mf4, ta, ma
-; DEFAULT-NEXT: vmv.x.s a2, v14
-; DEFAULT-NEXT: vle64.v v14, (a4)
-; DEFAULT-NEXT: vsetvli zero, zero, e64, m2, ta, ma
-; DEFAULT-NEXT: vmsltu.vv v16, v12, v14
-; DEFAULT-NEXT: vsetvli zero, zero, e8, mf4, ta, ma
-; DEFAULT-NEXT: vmv.x.s a3, v16
-; DEFAULT-NEXT: vsetvli zero, zero, e64, m2, ta, ma
-; DEFAULT-NEXT: vmseq.vv v16, v12, v14
-; DEFAULT-NEXT: vsetvli zero, zero, e8, mf4, ta, ma
-; DEFAULT-NEXT: vmv.x.s a4, v16
-; DEFAULT-NEXT: vsetvli zero, zero, e64, m2, ta, ma
-; DEFAULT-NEXT: vsub.vv v8, v8, v10
-; DEFAULT-NEXT: sh1add a1, a1, a2
-; DEFAULT-NEXT: xor a1, a1, a2
-; DEFAULT-NEXT: vmv.s.x v0, a1
-; DEFAULT-NEXT: vmv.v.i v10, 0
-; DEFAULT-NEXT: vmerge.vim v16, v10, 1, v0
-; DEFAULT-NEXT: vsub.vv v8, v8, v16
-; DEFAULT-NEXT: sh1add a1, a3, a4
-; DEFAULT-NEXT: xor a1, a1, a4
-; DEFAULT-NEXT: vmv.s.x v0, a1
-; DEFAULT-NEXT: vsub.vv v12, v12, v14
-; DEFAULT-NEXT: vmerge.vim v10, v10, 1, v0
-; DEFAULT-NEXT: vsub.vv v10, v12, v10
-; DEFAULT-NEXT: vand.vv v8, v10, v8
-; DEFAULT-NEXT: vse64.v v8, (a0)
-; DEFAULT-NEXT: ret
-;
-; VTYPE-SCHED-BOTTOMUP-LABEL: foo:
-; VTYPE-SCHED-BOTTOMUP: # %bb.0: # %entry
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetivli zero, 8, e64, m2, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vle64.v v12, (a1)
-; VTYPE-SCHED-BOTTOMUP-NEXT: vle64.v v14, (a2)
-; VTYPE-SCHED-BOTTOMUP-NEXT: vle64.v v8, (a3)
-; VTYPE-SCHED-BOTTOMUP-NEXT: vle64.v v10, (a4)
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmsltu.vv v16, v12, v14
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmsltu.vv v17, v8, v10
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetvli zero, zero, e8, mf4, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmv.x.s a1, v16
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmv.x.s a2, v17
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetvli zero, zero, e64, m2, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmseq.vv v16, v12, v14
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmseq.vv v17, v8, v10
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetvli zero, zero, e8, mf4, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmv.x.s a3, v16
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmv.x.s a4, v17
-; VTYPE-SCHED-BOTTOMUP-NEXT: sh1add a1, a1, a3
-; VTYPE-SCHED-BOTTOMUP-NEXT: xor a1, a1, a3
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmv.s.x v0, a1
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsetvli zero, zero, e64, m2, ta, ma
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsub.vv v12, v12, v14
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmv.v.i v14, 0
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmerge.vim v16, v14, 1, v0
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsub.vv v12, v12, v16
-; VTYPE-SCHED-BOTTOMUP-NEXT: sh1add a1, a2, a4
-; VTYPE-SCHED-BOTTOMUP-NEXT: xor a1, a1, a4
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmv.s.x v0, a1
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsub.vv v8, v8, v10
-; VTYPE-SCHED-BOTTOMUP-NEXT: vmerge.vim v10, v14, 1, v0
-; VTYPE-SCHED-BOTTOMUP-NEXT: vsub.vv v8, v8, v10
-; VTYPE-SCHED-BOTTOMUP-NEXT: vand.vv v8, v8, v12
-; VTYPE-SCHED-BOTTOMUP-NEXT: vse64.v v8, (a0)
-; VTYPE-SCHED-BOTTOMUP-NEXT: ret
-;
-; VTYPE-SCHED-TOPDOWN-LABEL: foo:
-; VTYPE-SCHED-TOPDOWN: # %bb.0: # %entry
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetivli zero, 8, e64, m2, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vle64.v v10, (a1)
-; VTYPE-SCHED-TOPDOWN-NEXT: vmv.v.i v8, 0
-; VTYPE-SCHED-TOPDOWN-NEXT: vle64.v v12, (a2)
-; VTYPE-SCHED-TOPDOWN-NEXT: vle64.v v14, (a3)
-; VTYPE-SCHED-TOPDOWN-NEXT: vmsltu.vv v18, v10, v12
-; VTYPE-SCHED-TOPDOWN-NEXT: vmseq.vv v19, v10, v12
-; VTYPE-SCHED-TOPDOWN-NEXT: vle64.v v16, (a4)
-; VTYPE-SCHED-TOPDOWN-NEXT: vsub.vv v10, v10, v12
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetvli zero, zero, e8, mf4, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vmv.x.s a1, v18
-; VTYPE-SCHED-TOPDOWN-NEXT: vmv.x.s a2, v19
-; VTYPE-SCHED-TOPDOWN-NEXT: sh1add a1, a1, a2
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetvli zero, zero, e64, m2, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vmsltu.vv v18, v14, v16
-; VTYPE-SCHED-TOPDOWN-NEXT: xor a1, a1, a2
-; VTYPE-SCHED-TOPDOWN-NEXT: vsub.vv v12, v14, v16
-; VTYPE-SCHED-TOPDOWN-NEXT: vmseq.vv v19, v14, v16
-; VTYPE-SCHED-TOPDOWN-NEXT: vmv.s.x v0, a1
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetvli zero, zero, e8, mf4, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vmv.x.s a1, v18
-; VTYPE-SCHED-TOPDOWN-NEXT: vmv.x.s a2, v19
-; VTYPE-SCHED-TOPDOWN-NEXT: vsetvli zero, zero, e64, m2, ta, ma
-; VTYPE-SCHED-TOPDOWN-NEXT: vmerge.vim v14, v8, 1, v0
-; VTYPE-SCHED-TOPDOWN-NEXT: sh1add a1, a1, a2
-; VTYPE-SCHED-TOPDOWN-NEXT: xor a1, a1, a2
-; VTYPE-SCHED-TOPDOWN-NEXT: vsub.vv v10, v10, v14
-; VTYPE-SCHED-TOPDOWN-NEXT: vmv.s.x v0, a1
-; VTYPE-SCHED-TOPDOWN-NEXT: vmerge.vim v8, v8, 1, v0
-; VTYPE-SCHED-TOPDOWN-NEXT: vsub.vv v8, v12, v8
-; VTYPE-SCHED-TOPDOWN-NEXT: vand.vv v8, v8, v10
-; VTYPE-SCHED-TOPDOWN-NEXT: vse64.v v8, (a0)
-; VTYPE-SCHED-TOPDOWN-NEXT: ret
-;
-; VTYPE-SCHED-BIDIRECTIONAL-LABEL: foo:
-; VTYPE-SCHED-BIDIRECTIONAL: # %bb.0: # %entry
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetivli zero, 8, e64, m2, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vle64.v v12, (a1)
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vle64.v v14, (a2)
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vle64.v v8, (a3)
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmsltu.vv v16, v12, v14
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vle64.v v10, (a4)
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmsltu.vv v17, v8, v10
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetvli zero, zero, e8, mf4, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmv.x.s a1, v16
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmv.x.s a2, v17
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetvli zero, zero, e64, m2, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmseq.vv v16, v12, v14
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmseq.vv v17, v8, v10
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetvli zero, zero, e8, mf4, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmv.x.s a3, v16
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmv.x.s a4, v17
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: sh1add a1, a1, a3
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: xor a1, a1, a3
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmv.s.x v0, a1
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsetvli zero, zero, e64, m2, ta, ma
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsub.vv v12, v12, v14
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmv.v.i v14, 0
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmerge.vim v16, v14, 1, v0
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsub.vv v12, v12, v16
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: sh1add a1, a2, a4
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: xor a1, a1, a4
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmv.s.x v0, a1
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsub.vv v8, v8, v10
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vmerge.vim v10, v14, 1, v0
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vsub.vv v8, v8, v10
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vand.vv v8, v8, v12
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: vse64.v v8, (a0)
-; VTYPE-SCHED-BIDIRECTIONAL-NEXT: ret
+define void @test1(ptr %0, ptr %1, ptr %2, ptr %3, ptr %4) {
+; DEFAULT-LABEL: test1:
+; DEFAULT-COUNT-9: vset
+
+; VTYPE-SCHED-BOTTOMUP-LABEL: test1:
+; VTYPE-SCHED-BOTTOMUP-COUNT-5: vset
+
+; VTYPE-SCHED-TOPDOWN-LABEL: test1:
+; VTYPE-SCHED-TOPDOWN-COUNT-5: vset
+
+; VTYPE-SCHED-BIDIRECTIONAL-LABEL: test1:
+; VTYPE-SCHED-BIDIRECTIONAL-5: vset
entry:
%5 = load <8 x i64>, ptr %1, align 64
%6 = load <8 x i64>, ptr %2, align 64
>From 4cfb31e42ee10c00ec24c42a45ca6fd1c117a9fb Mon Sep 17 00:00:00 2001
From: Wang Pengcheng <wangpengcheng.pp at bytedance.com>
Date: Fri, 9 Jan 2026 14:29:19 +0800
Subject: [PATCH 5/8] It should be related to both vtype and vl
Created using spr 1.3.6-beta.1
---
llvm/lib/Target/RISCV/RISCVFeatures.td | 6 +++---
llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp | 8 ++++----
llvm/test/CodeGen/RISCV/features-info.ll | 2 +-
llvm/test/CodeGen/RISCV/rvv/rvv-vtype-based-scheduler.ll | 6 +++---
4 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/llvm/lib/Target/RISCV/RISCVFeatures.td b/llvm/lib/Target/RISCV/RISCVFeatures.td
index 5507dda807a69..f5f54665c5a42 100644
--- a/llvm/lib/Target/RISCV/RISCVFeatures.td
+++ b/llvm/lib/Target/RISCV/RISCVFeatures.td
@@ -1843,9 +1843,9 @@ def TuneDisableLatencySchedHeuristic
: SubtargetFeature<"disable-latency-sched-heuristic", "DisableLatencySchedHeuristic", "true",
"Disable latency scheduling heuristic">;
-def TuneEnableVTypeSchedHeuristic
- : SubtargetFeature<"enable-vtype-sched-heuristic", "EnableVTypeSchedHeuristic", "true",
- "Enable vtype-based scheduling heuristic">;
+def TuneEnableVsetvliSchedHeuristic
+ : SubtargetFeature<"enable-vsetvli-sched-heuristic", "EnableVsetvliSchedHeuristic", "true",
+ "Enable vsetvli-based scheduling heuristic">;
def TunePredictableSelectIsExpensive
: SubtargetFeature<"predictable-select-expensive", "PredictableSelectIsExpensive", "true",
diff --git a/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp b/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
index 0b302c1669975..77204a668f38e 100644
--- a/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
+++ b/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
@@ -26,14 +26,14 @@ bool RISCVPreRAMachineSchedStrategy::tryVType(RISCV::VSETVLIInfo TryVType,
SchedCandidate &TryCand,
SchedCandidate &Cand,
CandReason Reason) const {
- // Do not compare the vtype changes between top and bottom
+ // Do not compare the vsetvli info changes between top and bottom
// boundary.
if (Cand.AtTop != TryCand.AtTop)
return false;
// Try Cand first.
// We prefer the top node as it is straightforward from the perspective of
- // vtype dataflow.
+ // vsetvli dataflow.
if (CandVtype.isValid() && TopVType.isValid() && Cand.AtTop &&
CandVtype == TopVType)
return true;
@@ -172,7 +172,7 @@ bool RISCVPreRAMachineSchedStrategy::tryCandidate(SchedCandidate &Cand,
// TODO: We should not use `CandReason::Cluster` here, but is there a
// mechanism to extend this enum?
- if (ST->enableVTypeSchedHeuristic() &&
+ if (ST->enableVsetvliSchedHeuristic() &&
tryVType(getVSETVLIInfo(TryCand.SU->getInstr()),
getVSETVLIInfo(Cand.SU->getInstr()), TryCand, Cand, Cluster))
return TryCand.Reason != NoCand;
@@ -192,7 +192,7 @@ void RISCVPreRAMachineSchedStrategy::leaveMBB() {
void RISCVPreRAMachineSchedStrategy::schedNode(SUnit *SU, bool IsTopNode) {
GenericScheduler::schedNode(SU, IsTopNode);
- if (ST->enableVTypeSchedHeuristic()) {
+ if (ST->enableVsetvliSchedHeuristic()) {
MachineInstr *MI = SU->getInstr();
const RISCV::VSETVLIInfo &Info = getVSETVLIInfo(MI);
if (Info.isValid()) {
diff --git a/llvm/test/CodeGen/RISCV/features-info.ll b/llvm/test/CodeGen/RISCV/features-info.ll
index 4a6c7d0ee7a43..99168e3f16a75 100644
--- a/llvm/test/CodeGen/RISCV/features-info.ll
+++ b/llvm/test/CodeGen/RISCV/features-info.ll
@@ -23,7 +23,7 @@
; CHECK-NEXT: disable-postmisched-store-clustering - Disable PostRA store clustering in the machine scheduler.
; CHECK-NEXT: dlen-factor-2 - Vector unit DLEN(data path width) is half of VLEN.
; CHECK-NEXT: e - 'E' (Embedded Instruction Set with 16 GPRs).
-; CHECK-NEXT: enable-vtype-sched-heuristic - Enable vtype-based scheduling heuristic.
+; CHECK-NEXT: enable-vsetvli-sched-heuristic - Enable vsetvli-based scheduling heuristic.
; CHECK-NEXT: exact-asm - Enable Exact Assembly (Disables Compression and Relaxation).
; CHECK-NEXT: experimental - Experimental intrinsics.
; CHECK-NEXT: experimental-p - 'P' ('Base P' (Packed SIMD)).
diff --git a/llvm/test/CodeGen/RISCV/rvv/rvv-vtype-based-scheduler.ll b/llvm/test/CodeGen/RISCV/rvv/rvv-vtype-based-scheduler.ll
index f872a9c33ef8d..ec34341cc1984 100644
--- a/llvm/test/CodeGen/RISCV/rvv/rvv-vtype-based-scheduler.ll
+++ b/llvm/test/CodeGen/RISCV/rvv/rvv-vtype-based-scheduler.ll
@@ -1,13 +1,13 @@
; RUN: llc -mtriple=riscv64 -mcpu=spacemit-x60 -verify-machineinstrs < %s \
; RUN: | FileCheck %s --check-prefix=DEFAULT
; RUN: llc -mtriple=riscv64 -mcpu=spacemit-x60 -misched-prera-direction=bottomup \
-; RUN: -mattr=+enable-vtype-sched-heuristic -verify-machineinstrs < %s \
+; RUN: -mattr=+enable-vsetvli-sched-heuristic -verify-machineinstrs < %s \
; RUN: | FileCheck %s --check-prefix=VTYPE-SCHED-BOTTOMUP
; RUN: llc -mtriple=riscv64 -mcpu=spacemit-x60 -misched-prera-direction=topdown \
-; RUN: -mattr=+enable-vtype-sched-heuristic -verify-machineinstrs < %s \
+; RUN: -mattr=+enable-vsetvli-sched-heuristic -verify-machineinstrs < %s \
; RUN: | FileCheck %s --check-prefix=VTYPE-SCHED-TOPDOWN
; RUN: llc -mtriple=riscv64 -mcpu=spacemit-x60 -misched-prera-direction=bidirectional \
-; RUN: -mattr=+enable-vtype-sched-heuristic -verify-machineinstrs < %s \
+; RUN: -mattr=+enable-vsetvli-sched-heuristic -verify-machineinstrs < %s \
; RUN: | FileCheck %s --check-prefix=VTYPE-SCHED-BIDIRECTIONAL
define void @test0(i16 %0, i16 %1, i16 %2, i16 %3, i16 %4, i16 %5, i16 %6, ptr %7, ptr %8, ptr %9, ptr %10, ptr %11, i32 %12) {
>From 1c5a91ca3c835934f8bec1aced1c22af4ec7c609 Mon Sep 17 00:00:00 2001
From: Wang Pengcheng <wangpengcheng.pp at bytedance.com>
Date: Fri, 9 Jan 2026 14:35:25 +0800
Subject: [PATCH 6/8] Rename variables
Created using spr 1.3.6-beta.1
---
.../Target/RISCV/RISCVMachineScheduler.cpp | 43 ++++++++++---------
llvm/lib/Target/RISCV/RISCVMachineScheduler.h | 10 ++---
2 files changed, 27 insertions(+), 26 deletions(-)
diff --git a/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp b/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
index 77204a668f38e..52b81927c17de 100644
--- a/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
+++ b/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
@@ -21,11 +21,11 @@ RISCVPreRAMachineSchedStrategy::getVSETVLIInfo(const MachineInstr *MI) const {
return VIA.computeInfoForInstr(*MI);
}
-bool RISCVPreRAMachineSchedStrategy::tryVType(RISCV::VSETVLIInfo TryVType,
- RISCV::VSETVLIInfo CandVtype,
- SchedCandidate &TryCand,
- SchedCandidate &Cand,
- CandReason Reason) const {
+bool RISCVPreRAMachineSchedStrategy::tryVSETVLIInfo(RISCV::VSETVLIInfo TryInfo,
+ RISCV::VSETVLIInfo CandInfo,
+ SchedCandidate &TryCand,
+ SchedCandidate &Cand,
+ CandReason Reason) const {
// Do not compare the vsetvli info changes between top and bottom
// boundary.
if (Cand.AtTop != TryCand.AtTop)
@@ -34,23 +34,23 @@ bool RISCVPreRAMachineSchedStrategy::tryVType(RISCV::VSETVLIInfo TryVType,
// Try Cand first.
// We prefer the top node as it is straightforward from the perspective of
// vsetvli dataflow.
- if (CandVtype.isValid() && TopVType.isValid() && Cand.AtTop &&
- CandVtype == TopVType)
+ if (CandInfo.isValid() && TopInfo.isValid() && Cand.AtTop &&
+ CandInfo == TopInfo)
return true;
- if (CandVtype.isValid() && BottomVType.isValid() && !Cand.AtTop &&
- CandVtype == BottomVType)
+ if (CandInfo.isValid() && BottomInfo.isValid() && !Cand.AtTop &&
+ CandInfo == BottomInfo)
return true;
// Then try TryCand.
- if (TryVType.isValid() && TopVType.isValid() && TryCand.AtTop &&
- TryVType == TopVType) {
+ if (TryInfo.isValid() && TopInfo.isValid() && TryCand.AtTop &&
+ TryInfo == TopInfo) {
TryCand.Reason = Reason;
return true;
}
- if (TryVType.isValid() && BottomVType.isValid() && !TryCand.AtTop &&
- TryVType == BottomVType) {
+ if (TryInfo.isValid() && BottomInfo.isValid() && !TryCand.AtTop &&
+ TryInfo == BottomInfo) {
TryCand.Reason = Reason;
return true;
}
@@ -173,21 +173,22 @@ bool RISCVPreRAMachineSchedStrategy::tryCandidate(SchedCandidate &Cand,
// TODO: We should not use `CandReason::Cluster` here, but is there a
// mechanism to extend this enum?
if (ST->enableVsetvliSchedHeuristic() &&
- tryVType(getVSETVLIInfo(TryCand.SU->getInstr()),
- getVSETVLIInfo(Cand.SU->getInstr()), TryCand, Cand, Cluster))
+ tryVSETVLIInfo(getVSETVLIInfo(TryCand.SU->getInstr()),
+ getVSETVLIInfo(Cand.SU->getInstr()), TryCand, Cand,
+ Cluster))
return TryCand.Reason != NoCand;
return TryCand.Reason != NoCand;
}
void RISCVPreRAMachineSchedStrategy::enterMBB(MachineBasicBlock *MBB) {
- TopVType = RISCV::VSETVLIInfo();
- BottomVType = RISCV::VSETVLIInfo();
+ TopInfo = RISCV::VSETVLIInfo();
+ BottomInfo = RISCV::VSETVLIInfo();
}
void RISCVPreRAMachineSchedStrategy::leaveMBB() {
- TopVType = RISCV::VSETVLIInfo();
- BottomVType = RISCV::VSETVLIInfo();
+ TopInfo = RISCV::VSETVLIInfo();
+ BottomInfo = RISCV::VSETVLIInfo();
}
void RISCVPreRAMachineSchedStrategy::schedNode(SUnit *SU, bool IsTopNode) {
@@ -197,9 +198,9 @@ void RISCVPreRAMachineSchedStrategy::schedNode(SUnit *SU, bool IsTopNode) {
const RISCV::VSETVLIInfo &Info = getVSETVLIInfo(MI);
if (Info.isValid()) {
if (IsTopNode)
- TopVType = Info;
+ TopInfo = Info;
else
- BottomVType = Info;
+ BottomInfo = Info;
LLVM_DEBUG({
dbgs() << "Previous scheduled Unit: \n";
dbgs() << " IsTop: " << IsTopNode << "\n";
diff --git a/llvm/lib/Target/RISCV/RISCVMachineScheduler.h b/llvm/lib/Target/RISCV/RISCVMachineScheduler.h
index 301dc15e9dc49..2133813d6e25b 100644
--- a/llvm/lib/Target/RISCV/RISCVMachineScheduler.h
+++ b/llvm/lib/Target/RISCV/RISCVMachineScheduler.h
@@ -23,13 +23,13 @@ namespace llvm {
class RISCVPreRAMachineSchedStrategy : public GenericScheduler {
const RISCVSubtarget *ST;
RISCV::RISCVVSETVLIInfoAnalysis VIA;
- RISCV::VSETVLIInfo TopVType;
- RISCV::VSETVLIInfo BottomVType;
+ RISCV::VSETVLIInfo TopInfo;
+ RISCV::VSETVLIInfo BottomInfo;
RISCV::VSETVLIInfo getVSETVLIInfo(const MachineInstr *MI) const;
- bool tryVType(RISCV::VSETVLIInfo TryVType, RISCV::VSETVLIInfo CandVtype,
- SchedCandidate &TryCand, SchedCandidate &Cand,
- CandReason Reason) const;
+ bool tryVSETVLIInfo(RISCV::VSETVLIInfo TryInfo, RISCV::VSETVLIInfo CandInfo,
+ SchedCandidate &TryCand, SchedCandidate &Cand,
+ CandReason Reason) const;
public:
RISCVPreRAMachineSchedStrategy(const MachineSchedContext *C)
>From 06165daa22d869af0fb5da1b73285640a90c7cde Mon Sep 17 00:00:00 2001
From: Wang Pengcheng <wangpengcheng.pp at bytedance.com>
Date: Fri, 9 Jan 2026 14:51:18 +0800
Subject: [PATCH 7/8] Use isCompatible
Created using spr 1.3.6-beta.1
---
.../Target/RISCV/RISCVMachineScheduler.cpp | 19 +++++++++++--------
1 file changed, 11 insertions(+), 8 deletions(-)
diff --git a/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp b/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
index 52b81927c17de..c45892cd513d3 100644
--- a/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
+++ b/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
@@ -31,26 +31,29 @@ bool RISCVPreRAMachineSchedStrategy::tryVSETVLIInfo(RISCV::VSETVLIInfo TryInfo,
if (Cand.AtTop != TryCand.AtTop)
return false;
+ auto IsCompatible = [&](RISCV::VSETVLIInfo FirstInfo,
+ RISCV::VSETVLIInfo SecondInfo) {
+ return FirstInfo.isValid() && SecondInfo.isValid() &&
+ FirstInfo.isCompatible(RISCV::DemandedFields::all(), SecondInfo,
+ Context->LIS);
+ };
+
// Try Cand first.
// We prefer the top node as it is straightforward from the perspective of
// vsetvli dataflow.
- if (CandInfo.isValid() && TopInfo.isValid() && Cand.AtTop &&
- CandInfo == TopInfo)
+ if (Cand.AtTop && IsCompatible(CandInfo, TopInfo))
return true;
- if (CandInfo.isValid() && BottomInfo.isValid() && !Cand.AtTop &&
- CandInfo == BottomInfo)
+ if (!Cand.AtTop && IsCompatible(CandInfo, BottomInfo))
return true;
// Then try TryCand.
- if (TryInfo.isValid() && TopInfo.isValid() && TryCand.AtTop &&
- TryInfo == TopInfo) {
+ if (TryCand.AtTop && IsCompatible(TryInfo, TopInfo)) {
TryCand.Reason = Reason;
return true;
}
- if (TryInfo.isValid() && BottomInfo.isValid() && !TryCand.AtTop &&
- TryInfo == BottomInfo) {
+ if (!TryCand.AtTop && IsCompatible(TryInfo, BottomInfo)) {
TryCand.Reason = Reason;
return true;
}
>From 5541d0e506a2879dcb38d14479d8134a86c035ce Mon Sep 17 00:00:00 2001
From: Wang Pengcheng <wangpengcheng.pp at bytedance.com>
Date: Mon, 12 Jan 2026 11:59:03 +0800
Subject: [PATCH 8/8] Add &
Created using spr 1.3.6-beta.1
---
llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp | 6 +++---
llvm/lib/Target/RISCV/RISCVMachineScheduler.h | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp b/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
index 1d7b219eb2dc0..c9285721d8544 100644
--- a/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
+++ b/llvm/lib/Target/RISCV/RISCVMachineScheduler.cpp
@@ -22,15 +22,15 @@ RISCVPreRAMachineSchedStrategy::getVSETVLIInfo(const MachineInstr *MI) const {
}
bool RISCVPreRAMachineSchedStrategy::tryVSETVLIInfo(
- const RISCV::VSETVLIInfo TryInfo, const RISCV::VSETVLIInfo CandInfo,
+ const RISCV::VSETVLIInfo &TryInfo, const RISCV::VSETVLIInfo &CandInfo,
SchedCandidate &TryCand, SchedCandidate &Cand, CandReason Reason) const {
// Do not compare the vsetvli info changes between top and bottom
// boundary.
if (Cand.AtTop != TryCand.AtTop)
return false;
- auto IsCompatible = [&](const RISCV::VSETVLIInfo FirstInfo,
- const RISCV::VSETVLIInfo SecondInfo) {
+ auto IsCompatible = [&](const RISCV::VSETVLIInfo &FirstInfo,
+ const RISCV::VSETVLIInfo &SecondInfo) {
return FirstInfo.isValid() && SecondInfo.isValid() &&
FirstInfo.isCompatible(RISCV::DemandedFields::all(), SecondInfo,
Context->LIS);
diff --git a/llvm/lib/Target/RISCV/RISCVMachineScheduler.h b/llvm/lib/Target/RISCV/RISCVMachineScheduler.h
index 86d9715a1da3f..5d5dd3934f0c4 100644
--- a/llvm/lib/Target/RISCV/RISCVMachineScheduler.h
+++ b/llvm/lib/Target/RISCV/RISCVMachineScheduler.h
@@ -27,8 +27,8 @@ class RISCVPreRAMachineSchedStrategy : public GenericScheduler {
RISCV::VSETVLIInfo BottomInfo;
RISCV::VSETVLIInfo getVSETVLIInfo(const MachineInstr *MI) const;
- bool tryVSETVLIInfo(const RISCV::VSETVLIInfo TryInfo,
- const RISCV::VSETVLIInfo CandInfo,
+ bool tryVSETVLIInfo(const RISCV::VSETVLIInfo &TryInfo,
+ const RISCV::VSETVLIInfo &CandInfo,
SchedCandidate &TryCand, SchedCandidate &Cand,
CandReason Reason) const;
More information about the llvm-branch-commits
mailing list