Skip to content

Commit a5c4dfb

Browse files
committed
Cluster vsetvl in same configure
1 parent 0ee2fb7 commit a5c4dfb

File tree

3 files changed

+74
-1
lines changed

3 files changed

+74
-1
lines changed

llvm/lib/Target/RISCV/RISCVTargetMachine.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "RISCVMachineScheduler.h"
1818
#include "RISCVTargetObjectFile.h"
1919
#include "RISCVTargetTransformInfo.h"
20+
#include "RISCVVSETVLCluster.h"
2021
#include "TargetInfo/RISCVTargetInfo.h"
2122
#include "llvm/ADT/STLExtras.h"
2223
#include "llvm/Analysis/TargetTransformInfo.h"
@@ -107,6 +108,11 @@ static cl::opt<bool>
107108
cl::desc("RISC-V vsetvl aware scheduler"),
108109
cl::init(false));
109110

111+
static cl::opt<bool>
112+
EnableVSETVLIClustering("riscv-vsetvli-cluster", cl::Hidden,
113+
cl::desc("vsetvl insertion clustring"),
114+
cl::init(false));
115+
110116
extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeRISCVTarget() {
111117
RegisterTargetMachine<RISCVTargetMachine> X(getTheRISCV32Target());
112118
RegisterTargetMachine<RISCVTargetMachine> Y(getTheRISCV64Target());
@@ -357,6 +363,11 @@ class RISCVPassConfig : public TargetPassConfig {
357363
DAG->addMutation(createLoadClusterDAGMutation(
358364
DAG->TII, DAG->TRI, /*ReorderWhileClustering=*/true));
359365
}
366+
367+
if (EnableVSETVLIClustering) {
368+
DAG = DAG ? DAG : createGenericSchedLive(C);
369+
DAG->addMutation(createRISCVVSETVLClusteringDAGMutation());
370+
}
360371
return DAG;
361372
}
362373

llvm/lib/Target/RISCV/RISCVVSETVLCluster.cpp

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,13 @@
1212
//===----------------------------------------------------------------------===//
1313

1414
#include "RISCVVSETVLCluster.h"
15+
#include "RISCV.h"
16+
#include "RISCVSubtarget.h"
17+
#include "llvm/ADT/DenseMap.h"
18+
#include "llvm/CodeGen/MachineInstr.h"
19+
#include "llvm/CodeGen/MachineRegisterInfo.h"
1520
#include "llvm/CodeGen/ScheduleDAGInstrs.h"
21+
#include <utility>
1622

1723
using namespace llvm;
1824

@@ -24,7 +30,62 @@ class VSETVLClustering : public ScheduleDAGMutation {
2430
void apply(ScheduleDAGInstrs *DAG) override;
2531
};
2632

27-
void VSETVLClustering::apply(ScheduleDAGInstrs *DAG) {}
33+
static void
34+
collectCandidate(ScheduleDAGInstrs *DAG,
35+
SmallVector<std::pair<SUnit *, VSETVLIInfo>> &Candidate) {
36+
for (SUnit &SU : DAG->SUnits) {
37+
if (SU.isInstr()) {
38+
MachineInstr *MI = SU.getInstr();
39+
const RISCVSubtarget &STI = MI->getMF()->getSubtarget<RISCVSubtarget>();
40+
uint64_t TSFlags = MI->getDesc().TSFlags;
41+
if (!RISCVII::hasSEWOp(TSFlags))
42+
continue;
43+
44+
VSETVLIInfo Info = computeInfoForInstr(*MI, &STI, nullptr);
45+
Candidate.push_back(std::make_pair(&SU, Info));
46+
}
47+
}
48+
}
49+
50+
void VSETVLClustering::apply(ScheduleDAGInstrs *DAG) {
51+
SmallVector<std::pair<SUnit *, VSETVLIInfo>> Candidate;
52+
collectCandidate(DAG, Candidate);
53+
54+
SmallVector<SmallVector<std::pair<SUnit *, VSETVLIInfo>>> VSETVLGroups;
55+
56+
for (auto &Tmp : Candidate) {
57+
SUnit *SU = Tmp.first;
58+
VSETVLIInfo Info = Tmp.second;
59+
bool Found = false;
60+
for (auto &Group : VSETVLGroups) {
61+
if (Group[0].second == Info &&
62+
all_of(Group, [SU, DAG](std::pair<SUnit *, VSETVLIInfo> Member) {
63+
return !DAG->IsReachable(SU, Member.first) &&
64+
!DAG->IsReachable(Member.first, SU);
65+
})) {
66+
Found = true;
67+
Group.push_back(Tmp);
68+
break;
69+
}
70+
}
71+
72+
if (!Found) {
73+
SmallVector<std::pair<SUnit *, VSETVLIInfo>> NewGroup;
74+
NewGroup.push_back(Tmp);
75+
VSETVLGroups.push_back(NewGroup);
76+
}
77+
}
78+
79+
for (auto &Group : VSETVLGroups) {
80+
if (Group.size() < 2)
81+
continue;
82+
83+
SUnit *CurrSU = Group[0].first;
84+
for (auto *I = Group.begin() + 1; I != Group.end(); I++) {
85+
DAG->addEdge(CurrSU, SDep(I->first, SDep::Cluster));
86+
}
87+
}
88+
}
2889

2990
} // end namespace
3091

llvm/lib/Target/RISCV/RISCVVSETVLCluster.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#define LLVM_LIB_TARGET_RISCV_VSETVL_CLUSTERING_H
1111

1212
#include "llvm/CodeGen/ScheduleDAGMutation.h"
13+
#include "RISCVInsertVSETVLI.h"
1314
#include <memory>
1415

1516
namespace llvm {

0 commit comments

Comments
 (0)