Skip to content

Commit 0944dba

Browse files
committed
refs llvm#1294 新SchedModelに合わせた修正
1 parent 22623d5 commit 0944dba

File tree

5 files changed

+99
-94
lines changed

5 files changed

+99
-94
lines changed

llvm/include/llvm/CodeGen/SwplTargetMachine.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ class StmPipeline {
4545
StmPatternId patternId=0;
4646
SmallVector<unsigned,4> stages;
4747
SmallVector<StmResourceId,4> resources;
48-
int latency;
4948

5049
/// constructor
5150
StmPipeline(){}
@@ -287,7 +286,7 @@ class SwplTargetMachine {
287286
/// Returns all resource usage patterns used by the specified instruction.
288287
/// \param [in] mi Target instruction
289288
/// \return StmPipelines
290-
virtual const StmPipelinesImpl * getPipelines(const MachineInstr& mi) = 0;
289+
virtual const StmPipelinesImpl * getPipelines(const MachineInstr& mi) const = 0;
291290

292291
/// returns the number of resources available
293292
/// \return number of resources

llvm/lib/Target/AArch64/AArch64SwplSchedA64FX.cpp

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,31 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212
#include "AArch64SwplSchedA64FX.h"
13+
#include "AArch64InstrInfo.h"
1314
using namespace llvm;
1415

15-
AArch64SwplSchedA64FX::ResourceID AArch64SwplSchedA64FX::getRes(const MachineInstr &mi){
16+
AArch64SwplSchedA64FX::ResourceID AArch64SwplSchedA64FX::getRes(const MachineInstr &mi) const {
1617
// @todo:実装
1718
return INT_OP_001;
1819
}
19-
const StmPipelinesImpl *AArch64SwplSchedA64FX::getPipelines(ResourceID id){
20+
21+
const StmPipelinesImpl *AArch64SwplSchedA64FX::getPipelines(ResourceID id) const {
2022
// @todo:実装
2123
return nullptr;
22-
}
24+
}
25+
26+
bool AArch64SwplSchedA64FX::isPseudo(const MachineInstr &mi) const {
27+
// アセンブラ出力時までに無くなる可能性が大きいものはPseudoとして扱う
28+
switch (mi.getOpcode()) {
29+
case AArch64::SUBREG_TO_REG:
30+
case AArch64::INSERT_SUBREG:
31+
case AArch64::REG_SEQUENCE:
32+
return true;
33+
}
34+
return false;
35+
}
36+
37+
unsigned AArch64SwplSchedA64FX::getLatency(ResourceID id) const {
38+
// @todo:実装
39+
return 1;
40+
}

llvm/lib/Target/AArch64/AArch64SwplSchedA64FX.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ struct AArch64SwplSchedA64FX{
2121
INT_OP_002
2222
};
2323

24-
ResourceID getRes(const MachineInstr &mi);
25-
const StmPipelinesImpl *getPipelines(ResourceID id);
24+
ResourceID getRes(const MachineInstr &mi) const;
25+
const StmPipelinesImpl *getPipelines(ResourceID id) const;
26+
unsigned getLatency(ResourceID id) const;
27+
bool isPseudo(const MachineInstr &mi) const;
2628
};
2729
}
2830

llvm/lib/Target/AArch64/AArch64SwplTargetMachine.cpp

Lines changed: 67 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -530,13 +530,40 @@ SwplTargetMachine *AArch64InstrInfo::getSwplTargetMachine() const {
530530

531531
}
532532

533-
namespace llvm {
533+
static const char *getResourceName(StmResourceId resource) {
534+
const char *name="";
535+
switch (resource) {
536+
case A64FXRes::PortKind::P_FLA:name="FLA";break;
537+
case A64FXRes::PortKind::P_FLB:name="FLB";break;
538+
case A64FXRes::PortKind::P_EXA:name="EXA";break;
539+
case A64FXRes::PortKind::P_EXB:name="EXB";break;
540+
case A64FXRes::PortKind::P_EAGA:name="EAGA";break;
541+
case A64FXRes::PortKind::P_EAGB:name="EAGB";break;
542+
case A64FXRes::PortKind::P_PRX:name="PRX";break;
543+
case A64FXRes::PortKind::P_BR:name="BR";break;
544+
case A64FXRes::PortKind::P_LSU1:name="LSU1";break;
545+
case A64FXRes::PortKind::P_LSU2:name="LSU2";break;
546+
case A64FXRes::PortKind::P_FLA_C:name="FLA_C";break;
547+
case A64FXRes::PortKind::P_FLB_C:name="FLB_C";break;
548+
case A64FXRes::PortKind::P_EXA_C:name="EXA_C";break;
549+
case A64FXRes::PortKind::P_EXB_C:name="EXB_C";break;
550+
case A64FXRes::PortKind::P_EAGA_C:name="EAGA_C";break;
551+
case A64FXRes::PortKind::P_EAGB_C:name="EAGB_C";break;
552+
default:
553+
llvm_unreachable("unknown resourceid");
554+
}
555+
return name;
556+
557+
}
558+
559+
static StmPipelines forPseudoMI;
560+
static StmPipelines forNoImplMI;
561+
534562

535563
void AArch64SwplTargetMachine::initialize(const MachineFunction &mf) {
536564
if (MF==nullptr) {
537565
const TargetSubtargetInfo &ST = mf.getSubtarget();
538566
SM.init(&ST);
539-
ResInfo=new AArch64A64FXResInfo(ST);
540567
tmNumSameKindResources[A64FXRes::PortKind::P_FLA]=2;
541568
tmNumSameKindResources[A64FXRes::PortKind::P_FLB]=2;
542569
tmNumSameKindResources[A64FXRes::PortKind::P_EXA]=2;
@@ -545,7 +572,22 @@ void AArch64SwplTargetMachine::initialize(const MachineFunction &mf) {
545572
tmNumSameKindResources[A64FXRes::PortKind::P_EAGB]=2;
546573
tmNumSameKindResources[A64FXRes::PortKind::P_PRX]=1;
547574
tmNumSameKindResources[A64FXRes::PortKind::P_BR]=1;
548-
numResource=8; // 資源管理がSchedModelとは別になったので、ハードコードする
575+
tmNumSameKindResources[A64FXRes::PortKind::P_LSU1]=2;
576+
tmNumSameKindResources[A64FXRes::PortKind::P_LSU2]=2;
577+
tmNumSameKindResources[A64FXRes::PortKind::P_FLA_C]=2;
578+
tmNumSameKindResources[A64FXRes::PortKind::P_FLB_C]=2;
579+
tmNumSameKindResources[A64FXRes::PortKind::P_EXA_C]=2;
580+
tmNumSameKindResources[A64FXRes::PortKind::P_EXB_C]=2;
581+
tmNumSameKindResources[A64FXRes::PortKind::P_EAGA_C]=2;
582+
tmNumSameKindResources[A64FXRes::PortKind::P_EAGB_C]=2;
583+
numResource=16; // 資源管理がSchedModelとは別になったので、ハードコードする
584+
585+
forPseudoMI.push_back(new AArch64StmPipeline());
586+
auto *p = new AArch64StmPipeline();
587+
p->stages.push_back(0);
588+
p->resources.push_back(A64FXRes::PortKind::P_BR);
589+
forNoImplMI.push_back(p);
590+
549591
}
550592
MF=&mf;
551593
}
@@ -578,38 +620,11 @@ void AArch64StmPipeline::print(raw_ostream &ost) const {
578620
}
579621

580622
const char *AArch64StmPipeline::getResourceName(StmResourceId resource) const {
581-
// @todo AArch64SwplTargetMachine::getResourceName()を呼び出すようにすべきor本メソッド削除
582-
const char *name="";
583-
switch (resource) {
584-
case A64FXRes::PortKind::P_FLA:name="FLA";break;
585-
case A64FXRes::PortKind::P_FLB:name="FLB";break;
586-
case A64FXRes::PortKind::P_EXA:name="EXA";break;
587-
case A64FXRes::PortKind::P_EXB:name="EXB";break;
588-
case A64FXRes::PortKind::P_EAGA:name="EAGA";break;
589-
case A64FXRes::PortKind::P_EAGB:name="EAGB";break;
590-
case A64FXRes::PortKind::P_PRX:name="PRX";break;
591-
case A64FXRes::PortKind::P_BR:name="BR";break;
592-
default:
593-
llvm_unreachable("unknown resourceid");
594-
}
595-
return name;
623+
return ::getResourceName(resource);
596624
}
597625

598626
const char *AArch64SwplTargetMachine::getResourceName(StmResourceId resource) const {
599-
const char *name="";
600-
switch (resource) {
601-
case A64FXRes::PortKind::P_FLA:name="FLA";break;
602-
case A64FXRes::PortKind::P_FLB:name="FLB";break;
603-
case A64FXRes::PortKind::P_EXA:name="EXA";break;
604-
case A64FXRes::PortKind::P_EXB:name="EXB";break;
605-
case A64FXRes::PortKind::P_EAGA:name="EAGA";break;
606-
case A64FXRes::PortKind::P_EAGB:name="EAGB";break;
607-
case A64FXRes::PortKind::P_PRX:name="PRX";break;
608-
case A64FXRes::PortKind::P_BR:name="BR";break;
609-
default:
610-
llvm_unreachable("unknown resourceid");
611-
}
612-
return name;
627+
return ::getResourceName(resource);
613628
}
614629

615630
int AArch64SwplTargetMachine::computeMemFlowDependence(const MachineInstr *, const MachineInstr *) const {
@@ -618,34 +633,24 @@ int AArch64SwplTargetMachine::computeMemFlowDependence(const MachineInstr *, con
618633
return 1;
619634
}
620635

636+
621637
const StmPipelinesImpl *
622-
AArch64SwplTargetMachine::getPipelines(const MachineInstr &mi) {
623-
auto *tps= stmPipelines[mi.getOpcode()];
624-
if (tps==nullptr) {
625-
tps= generateStmPipelines(mi);
626-
stmPipelines[mi.getOpcode()]=tps;
627-
}
628-
return tps;
629-
}
638+
AArch64SwplTargetMachine::getPipelines(const MachineInstr &mi) const {
630639

631-
StmPipelinesImpl *
632-
AArch64SwplTargetMachine::generateStmPipelines(const MachineInstr &mi) {
633-
// @todo 作りが必要
634-
auto *pipelines=new StmPipelines;
635-
if (mi.isPseudo()) {
636-
pipelines->push_back(new AArch64StmPipeline());
637-
} else {
638-
auto *p = new AArch64StmPipeline();
639-
p->stages.push_back(0);
640-
p->resources.push_back(A64FXRes::PortKind::P_BR);
641-
pipelines->push_back(p);
640+
if (SwplSched.isPseudo(mi)) {
641+
return &forPseudoMI;
642+
} else if (!isImplimented(mi)) {
643+
return &forNoImplMI;
642644
}
643-
return pipelines;
645+
auto id=SwplSched.getRes(mi);
646+
return SwplSched.getPipelines(id);
644647
}
645648

646-
}
647649
int AArch64SwplTargetMachine::computeRegFlowDependence(const MachineInstr* def, const MachineInstr* use) const {
648-
// @todo 作り必要
650+
if (isPseudo(*def) || isPseudo(*use)) return 0;
651+
if (isImplimented(*def)) {
652+
return SwplSched.getLatency(SwplSched.getRes(*def));
653+
}
649654
return 1;
650655
}
651656

@@ -662,16 +667,15 @@ unsigned int AArch64SwplTargetMachine::getNumResource(void) const {
662667
}
663668

664669
bool AArch64SwplTargetMachine::isImplimented(const MachineInstr&mi) const {
665-
if (OptionCopyIsVirtual) {
666-
if (mi.isCopy()) return false;
667-
}
668-
// @todo 作り必要
669-
return false;
670+
if (SwplSched.getRes(mi)==0)
671+
return false;
672+
else
673+
return true;
670674
}
671675

672676
bool AArch64SwplTargetMachine::isPseudo(const MachineInstr &mi) const {
673-
// @todo 作り必要
674-
return mi.isPseudo();
675-
// return !isImplimented(mi);
677+
if (OptionCopyIsVirtual) {
678+
if (mi.isCopy()) return false;
679+
}
680+
return SwplSched.isPseudo(mi);
676681
}
677-

llvm/lib/Target/AArch64/AArch64SwplTargetMachine.h

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@
1515
#include "AArch64TargetTransformInfo.h"
1616
#include "llvm/CodeGen/TargetSchedule.h"
1717
#include "llvm/CodeGen/SwplTargetMachine.h"
18+
#include "AArch64SwplSchedA64FX.h"
1819

1920

2021
namespace llvm {
2122

2223
class AArch64StmPipeline: public StmPipeline {
23-
// TargetSchedModel& SM;///< SchedModel
2424
public:
2525

2626
/// constructor/destructor
@@ -143,19 +143,10 @@ class AArch64StmRegKind: public StmRegKind {
143143
}
144144
};
145145

146-
// @todo 書き換える必要あります
147-
class AArch64A64FXResInfo {
148-
public:
149-
AArch64A64FXResInfo() {}
150-
AArch64A64FXResInfo(const TargetSubtargetInfo &ST) {}
151-
virtual ~AArch64A64FXResInfo() {}
152-
153-
154-
};
155-
156146
class A64FXRes {
157147
public:
158-
enum PortKind {P_FLA=1, P_FLB=2, P_EXA=3, P_EXB=4, P_EAGA=5, P_EAGB=6, P_PRX=7, P_BR=8};
148+
enum PortKind {P_FLA=1, P_FLB, P_EXA, P_EXB, P_EAGA, P_EAGB, P_PRX, P_BR,
149+
P_LSU1, P_LSU2, P_FLA_C, P_FLB_C, P_EXA_C, P_EXB_C, P_EAGA_C, P_EAGB_C};
159150
};
160151

161152
/// SchedModelを利用してターゲット情報を取得し、SWPL機能に提供する
@@ -165,19 +156,15 @@ class AArch64SwplTargetMachine: public SwplTargetMachine {
165156
DenseMap<StmOpcodeId, StmPipelinesImpl * > stmPipelines; ///< Opcodeが利用する資源
166157
unsigned numResource=0; ///< 資源数(資源種別数ではない)
167158

168-
const AArch64A64FXResInfo *ResInfo=nullptr;
169-
/// StmPipelineを生成する
170-
/// \param [in] mp 対象となる命令
171-
/// \return 生成したStmPipeline
172-
StmPipelinesImpl *generateStmPipelines(const MachineInstr &mp);
173-
174159
/// 指定命令の資源情報が取得できるかどうかをチェックする
175160
/// \param [in] mi 調査対象の命令
176161
/// \retval true 資源情報を取得可能
177162
/// \retval false 資源情報を取得できない
178163
bool isImplimented(const MachineInstr &mi) const;
179164

180165
public:
166+
AArch64SwplSchedA64FX SwplSched; ///< A64FX SchedModel for SWP
167+
181168
/// constructor
182169
AArch64SwplTargetMachine() {}
183170
/// destructor
@@ -190,11 +177,6 @@ class AArch64SwplTargetMachine: public SwplTargetMachine {
190177
delete tms.getSecond();
191178
}
192179
}
193-
if (ResInfo!=nullptr) {
194-
delete ResInfo;
195-
ResInfo=nullptr;
196-
}
197-
198180
}
199181

200182
/// Tmの初期化を行う。
@@ -241,7 +223,7 @@ class AArch64SwplTargetMachine: public SwplTargetMachine {
241223
/// 指定命令が利用するリソースの利用パターンをすべて返す。
242224
/// \param [in] mi 対象命令
243225
/// \return StmPipelinesを返す
244-
const StmPipelinesImpl * getPipelines(const MachineInstr& mi) override;
226+
const StmPipelinesImpl * getPipelines(const MachineInstr& mi) const override;
245227

246228

247229
/// 利用可能な資源の数を返す

0 commit comments

Comments
 (0)