Skip to content

Commit b791a51

Browse files
authored
[CodeGenSchedule] Don't allow invalid ReadAdvances to be formed (#82685)
Forming a `ReadAdvance` with an entry in the `ValidWrites` list that is not used by any instruction results in the entire `ReadAdvance` to be ignored by the scheduler due to an invalid entry. The `SchedRW` collection code only picks up `SchedWrites` that are reachable from `Instructions`, `InstRW`, `ItinRW` and `SchedAlias`, leaving the unreachable ones with an invalid entry (0) in `SubtargetEmitter::GenSchedClassTables` when going through the list of `ReadAdvances`
1 parent c11627c commit b791a51

File tree

6 files changed

+50
-13
lines changed

6 files changed

+50
-13
lines changed

llvm/lib/Target/AArch64/AArch64SchedExynosM4.td

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,6 @@ def M4WriteFMAC3H : SchedWriteRes<[M4UnitFMACH]> { let Latency = 3; }
309309
def M4WriteFMAC3 : SchedWriteRes<[M4UnitFMAC]> { let Latency = 3; }
310310
def M4WriteFMAC4 : SchedWriteRes<[M4UnitFMAC]> { let Latency = 4; }
311311
def M4WriteFMAC4H : SchedWriteRes<[M4UnitFMACH]> { let Latency = 4; }
312-
def M4WriteFMAC5 : SchedWriteRes<[M4UnitFMAC]> { let Latency = 5; }
313312

314313
def M4WriteFSQR7H : SchedWriteRes<[M4UnitFSQRH]> { let Latency = 7;
315314
let ReleaseAtCycles = [6]; }
@@ -495,8 +494,7 @@ def M4WriteMOVI : SchedWriteVariant<[SchedVar<IsZeroFPIdiomPred, [M4WriteZ0]>
495494
// Fast forwarding.
496495
def M4ReadAESM1 : SchedReadAdvance<+1, [M4WriteNCRY1]>;
497496
def M4ReadFMACM1 : SchedReadAdvance<+1, [M4WriteFMAC4,
498-
M4WriteFMAC4H,
499-
M4WriteFMAC5]>;
497+
M4WriteFMAC4H]>;
500498
def M4ReadNMULM1 : SchedReadAdvance<+1, [M4WriteNMUL3]>;
501499
def M4ReadNMULP2 : SchedReadAdvance<-2, [M4WriteNMUL3]>;
502500

llvm/lib/Target/AArch64/AArch64SchedExynosM5.td

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,6 @@ def M5WriteFDIV12 : SchedWriteRes<[M5UnitFDIV]> { let Latency = 12;
338338

339339
def M5WriteFMAC3 : SchedWriteRes<[M5UnitFMAC]> { let Latency = 3; }
340340
def M5WriteFMAC4 : SchedWriteRes<[M5UnitFMAC]> { let Latency = 4; }
341-
def M5WriteFMAC5 : SchedWriteRes<[M5UnitFMAC]> { let Latency = 5; }
342341

343342
def M5WriteFSQR5 : SchedWriteRes<[M5UnitFSQR]> { let Latency = 5;
344343
let ReleaseAtCycles = [2]; }
@@ -530,8 +529,7 @@ def M5WriteMOVI : SchedWriteVariant<[SchedVar<IsZeroFPIdiomPred, [M5WriteZ0]>
530529
// Fast forwarding.
531530
def M5ReadFM1 : SchedReadAdvance<+1, [M5WriteF2]>;
532531
def M5ReadAESM2 : SchedReadAdvance<+2, [M5WriteNCRY2]>;
533-
def M5ReadFMACM1 : SchedReadAdvance<+1, [M5WriteFMAC4,
534-
M5WriteFMAC5]>;
532+
def M5ReadFMACM1 : SchedReadAdvance<+1, [M5WriteFMAC4]>;
535533
def M5ReadNMULM1 : SchedReadAdvance<+1, [M5WriteNMUL3]>;
536534

537535
//===----------------------------------------------------------------------===//
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// RUN: not llvm-tblgen -gen-subtarget -I %p/../../include %s 2>&1 | FileCheck %s
2+
3+
// Make sure we don't form ReadAdvances with ValidWrites entries that are not
4+
// associated with any instructions.
5+
6+
include "llvm/Target/Target.td"
7+
8+
def TargetX : Target;
9+
10+
def WriteX : SchedWrite;
11+
def WriteY : SchedWrite;
12+
def ReadX : SchedRead;
13+
14+
def InstX : Instruction {
15+
let OutOperandList = (outs);
16+
let InOperandList = (ins);
17+
let SchedRW = [WriteX, ReadX];
18+
}
19+
20+
def SchedModelX: SchedMachineModel {
21+
let CompleteModel = 0;
22+
}
23+
24+
let SchedModel = SchedModelX in {
25+
def : ReadAdvance<ReadX, 1, [WriteX, WriteY]>;
26+
// CHECK: error: ReadAdvance referencing a ValidWrite that is not used by any instruction (WriteY)
27+
}
28+
29+
def ProcessorX: ProcessorModel<"ProcessorX", SchedModelX, []>;

llvm/test/tools/llvm-mca/AArch64/Exynos/float-divide-multiply.s

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,11 @@ fsqrt d11, d12
2626
# EM3-NEXT: Total uOps: 800
2727

2828
# EM4-NEXT: Instructions: 1200
29-
# EM4-NEXT: Total Cycles: 575
29+
# EM4-NEXT: Total Cycles: 572
3030
# EM4-NEXT: Total uOps: 1200
3131

3232
# EM5-NEXT: Instructions: 1200
33-
# EM5-NEXT: Total Cycles: 433
33+
# EM5-NEXT: Total Cycles: 434
3434
# EM5-NEXT: Total uOps: 1200
3535

3636
# ALL: Dispatch Width: 6
@@ -39,12 +39,12 @@ fsqrt d11, d12
3939
# EM3-NEXT: IPC: 0.18
4040
# EM3-NEXT: Block RThroughput: 45.0
4141

42-
# EM4-NEXT: uOps Per Cycle: 2.09
43-
# EM4-NEXT: IPC: 2.09
42+
# EM4-NEXT: uOps Per Cycle: 2.10
43+
# EM4-NEXT: IPC: 2.10
4444
# EM4-NEXT: Block RThroughput: 4.0
4545

46-
# EM5-NEXT: uOps Per Cycle: 2.77
47-
# EM5-NEXT: IPC: 2.77
46+
# EM5-NEXT: uOps Per Cycle: 2.76
47+
# EM5-NEXT: IPC: 2.76
4848
# EM5-NEXT: Block RThroughput: 4.0
4949

5050
# ALL: Instruction Info:

llvm/utils/TableGen/CodeGenSchedule.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2190,6 +2190,15 @@ void CodeGenSchedModels::addWriteRes(Record *ProcWriteResDef, unsigned PIdx) {
21902190
// Add resources for a ReadAdvance to this processor if they don't exist.
21912191
void CodeGenSchedModels::addReadAdvance(Record *ProcReadAdvanceDef,
21922192
unsigned PIdx) {
2193+
for (const Record *ValidWrite :
2194+
ProcReadAdvanceDef->getValueAsListOfDefs("ValidWrites"))
2195+
if (getSchedRWIdx(ValidWrite, /*IsRead=*/false) == 0)
2196+
PrintFatalError(
2197+
ProcReadAdvanceDef->getLoc(),
2198+
"ReadAdvance referencing a ValidWrite that is not used by "
2199+
"any instruction (" +
2200+
ValidWrite->getName() + ")");
2201+
21932202
RecVec &RADefs = ProcModels[PIdx].ReadAdvanceDefs;
21942203
if (is_contained(RADefs, ProcReadAdvanceDef))
21952204
return;

llvm/utils/TableGen/SubtargetEmitter.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1262,7 +1262,10 @@ void SubtargetEmitter::GenSchedClassTables(const CodeGenProcModel &ProcModel,
12621262
WriteIDs.push_back(0);
12631263
else {
12641264
for (Record *VW : ValidWrites) {
1265-
WriteIDs.push_back(SchedModels.getSchedRWIdx(VW, /*IsRead=*/false));
1265+
unsigned WriteID = SchedModels.getSchedRWIdx(VW, /*IsRead=*/false);
1266+
assert(WriteID != 0 &&
1267+
"Expected a valid SchedRW in the list of ValidWrites");
1268+
WriteIDs.push_back(WriteID);
12661269
}
12671270
}
12681271
llvm::sort(WriteIDs);

0 commit comments

Comments
 (0)