[TableGen] Fix a bug that MCSchedClassDesc is interfered between different SchedModel
Assume that, ModelA has scheduling resource for InstA and ModelB has scheduling resource for InstB. This is what the llvm::MCSchedClassDesc looks like:
llvm::MCSchedClassDesc ModelASchedClasses[] = {
...
InstA, 0, ...
InstB, -1,...
};
llvm::MCSchedClassDesc ModelBSchedClasses[] = {
...
InstA, -1,...
InstB, 0,...
};
The -1 means invalid num of macro ops, while it is valid if it is >=0. This is what we look like now:
llvm::MCSchedClassDesc ModelASchedClasses[] = {
...
InstA, 0, ...
InstB, 0,...
};
llvm::MCSchedClassDesc ModelBSchedClasses[] = {
...
InstA, 0,...
InstB, 0,...
};
And compiler hit the assertion here because the SCDesc is valid now for both InstA and InstB.
Differential Revision: https://reviews.llvm.org/D67950
llvm-svn: 374524
2019-10-11 16:36:54 +08:00
|
|
|
// RUN: llvm-tblgen -gen-subtarget -I %p/../../include %s 2>&1 | FileCheck %s
|
|
|
|
// Check if it is valid MCSchedClassDesc if didn't have the resources.
|
|
|
|
|
|
|
|
include "llvm/Target/Target.td"
|
|
|
|
|
|
|
|
def MyTarget : Target;
|
|
|
|
|
|
|
|
let OutOperandList = (outs), InOperandList = (ins) in {
|
|
|
|
def Inst_A : Instruction;
|
|
|
|
def Inst_B : Instruction;
|
|
|
|
}
|
|
|
|
|
|
|
|
let CompleteModel = 0 in {
|
|
|
|
def SchedModel_A: SchedMachineModel;
|
|
|
|
def SchedModel_B: SchedMachineModel;
|
|
|
|
def SchedModel_C: SchedMachineModel;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Inst_B didn't have the resoures, and it is invalid.
|
|
|
|
// CHECK: SchedModel_ASchedClasses[] = {
|
|
|
|
// CHECK: {DBGFIELD("Inst_A") 1
|
2020-12-30 00:49:09 +08:00
|
|
|
// CHECK-NEXT: {DBGFIELD("Inst_B") 8191
|
[TableGen] Fix a bug that MCSchedClassDesc is interfered between different SchedModel
Assume that, ModelA has scheduling resource for InstA and ModelB has scheduling resource for InstB. This is what the llvm::MCSchedClassDesc looks like:
llvm::MCSchedClassDesc ModelASchedClasses[] = {
...
InstA, 0, ...
InstB, -1,...
};
llvm::MCSchedClassDesc ModelBSchedClasses[] = {
...
InstA, -1,...
InstB, 0,...
};
The -1 means invalid num of macro ops, while it is valid if it is >=0. This is what we look like now:
llvm::MCSchedClassDesc ModelASchedClasses[] = {
...
InstA, 0, ...
InstB, 0,...
};
llvm::MCSchedClassDesc ModelBSchedClasses[] = {
...
InstA, 0,...
InstB, 0,...
};
And compiler hit the assertion here because the SCDesc is valid now for both InstA and InstB.
Differential Revision: https://reviews.llvm.org/D67950
llvm-svn: 374524
2019-10-11 16:36:54 +08:00
|
|
|
let SchedModel = SchedModel_A in {
|
|
|
|
def Write_A : SchedWriteRes<[]>;
|
|
|
|
def : InstRW<[Write_A], (instrs Inst_A)>;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Inst_A didn't have the resoures, and it is invalid.
|
|
|
|
// CHECK: SchedModel_BSchedClasses[] = {
|
2020-12-30 00:49:09 +08:00
|
|
|
// CHECK: {DBGFIELD("Inst_A") 8191
|
[TableGen] Fix a bug that MCSchedClassDesc is interfered between different SchedModel
Assume that, ModelA has scheduling resource for InstA and ModelB has scheduling resource for InstB. This is what the llvm::MCSchedClassDesc looks like:
llvm::MCSchedClassDesc ModelASchedClasses[] = {
...
InstA, 0, ...
InstB, -1,...
};
llvm::MCSchedClassDesc ModelBSchedClasses[] = {
...
InstA, -1,...
InstB, 0,...
};
The -1 means invalid num of macro ops, while it is valid if it is >=0. This is what we look like now:
llvm::MCSchedClassDesc ModelASchedClasses[] = {
...
InstA, 0, ...
InstB, 0,...
};
llvm::MCSchedClassDesc ModelBSchedClasses[] = {
...
InstA, 0,...
InstB, 0,...
};
And compiler hit the assertion here because the SCDesc is valid now for both InstA and InstB.
Differential Revision: https://reviews.llvm.org/D67950
llvm-svn: 374524
2019-10-11 16:36:54 +08:00
|
|
|
// CHECK-NEXT: {DBGFIELD("Inst_B") 1
|
|
|
|
let SchedModel = SchedModel_B in {
|
|
|
|
def Write_B: SchedWriteRes<[]>;
|
|
|
|
def : InstRW<[Write_B], (instrs Inst_B)>;
|
|
|
|
}
|
|
|
|
|
|
|
|
// CHECK: SchedModel_CSchedClasses[] = {
|
|
|
|
// CHECK: {DBGFIELD("Inst_A") 1
|
|
|
|
// CHECK-NEXT: {DBGFIELD("Inst_B") 1
|
|
|
|
let SchedModel = SchedModel_C in {
|
|
|
|
def Write_C: SchedWriteRes<[]>;
|
|
|
|
def : InstRW<[Write_C], (instrs Inst_A, Inst_B)>;
|
|
|
|
}
|
|
|
|
|
|
|
|
def ProcessorA: ProcessorModel<"ProcessorA", SchedModel_A, []>;
|
|
|
|
def ProcessorB: ProcessorModel<"ProcessorB", SchedModel_B, []>;
|
|
|
|
def ProcessorC: ProcessorModel<"ProcessorC", SchedModel_C, []>;
|