Skip to content

Commit bb8d540

Browse files
author
QingShan Zhang
committed
[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
1 parent e0cb1cf commit bb8d540

File tree

3 files changed

+48
-1
lines changed

3 files changed

+48
-1
lines changed

llvm/test/CodeGen/ARM/ParallelDSP/unroll-n-jam-smlad.ll

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ entry:
4545
; CHECK-REG-PRESSURE: ldr{{.*}}, [sp
4646
; CHECK-REG-PRESSURE: ldr{{.*}}, [sp
4747
; CHECK-REG-PRESSURE: ldr{{.*}}, [sp
48-
; CHECK-REG-PRESSURE: ldr{{.*}}, [sp
4948
; CHECK-REG-PRESSURE: bne .LBB0_1
5049

5150
for.body:
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// RUN: llvm-tblgen -gen-subtarget -I %p/../../include %s 2>&1 | FileCheck %s
2+
// Check if it is valid MCSchedClassDesc if didn't have the resources.
3+
4+
include "llvm/Target/Target.td"
5+
6+
def MyTarget : Target;
7+
8+
let OutOperandList = (outs), InOperandList = (ins) in {
9+
def Inst_A : Instruction;
10+
def Inst_B : Instruction;
11+
}
12+
13+
let CompleteModel = 0 in {
14+
def SchedModel_A: SchedMachineModel;
15+
def SchedModel_B: SchedMachineModel;
16+
def SchedModel_C: SchedMachineModel;
17+
}
18+
19+
// Inst_B didn't have the resoures, and it is invalid.
20+
// CHECK: SchedModel_ASchedClasses[] = {
21+
// CHECK: {DBGFIELD("Inst_A") 1
22+
// CHECK-NEXT: {DBGFIELD("Inst_B") 16383
23+
let SchedModel = SchedModel_A in {
24+
def Write_A : SchedWriteRes<[]>;
25+
def : InstRW<[Write_A], (instrs Inst_A)>;
26+
}
27+
28+
// Inst_A didn't have the resoures, and it is invalid.
29+
// CHECK: SchedModel_BSchedClasses[] = {
30+
// CHECK: {DBGFIELD("Inst_A") 16383
31+
// CHECK-NEXT: {DBGFIELD("Inst_B") 1
32+
let SchedModel = SchedModel_B in {
33+
def Write_B: SchedWriteRes<[]>;
34+
def : InstRW<[Write_B], (instrs Inst_B)>;
35+
}
36+
37+
// CHECK: SchedModel_CSchedClasses[] = {
38+
// CHECK: {DBGFIELD("Inst_A") 1
39+
// CHECK-NEXT: {DBGFIELD("Inst_B") 1
40+
let SchedModel = SchedModel_C in {
41+
def Write_C: SchedWriteRes<[]>;
42+
def : InstRW<[Write_C], (instrs Inst_A, Inst_B)>;
43+
}
44+
45+
def ProcessorA: ProcessorModel<"ProcessorA", SchedModel_A, []>;
46+
def ProcessorB: ProcessorModel<"ProcessorB", SchedModel_B, []>;
47+
def ProcessorC: ProcessorModel<"ProcessorC", SchedModel_C, []>;

llvm/utils/TableGen/SubtargetEmitter.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,6 +1057,7 @@ void SubtargetEmitter::GenSchedClassTables(const CodeGenProcModel &ProcModel,
10571057
LLVM_DEBUG(dbgs() << ProcModel.ModelName
10581058
<< " does not have resources for class " << SC.Name
10591059
<< '\n');
1060+
SCDesc.NumMicroOps = MCSchedClassDesc::InvalidNumMicroOps;
10601061
}
10611062
}
10621063
// Sum resources across all operand writes.

0 commit comments

Comments
 (0)