@@ -26,6 +26,7 @@ def ResX2 : ProcResource<1>; // X2
2626let OutOperandList = (outs), InOperandList = (ins) in {
2727 def Inst_A : Instruction;
2828 def Inst_B : Instruction;
29+ def Inst_C : Instruction;
2930}
3031
3132let CompleteModel = 0 in {
@@ -34,6 +35,7 @@ let CompleteModel = 0 in {
3435
3536def WriteInst_A : SchedWrite;
3637def WriteInst_B : SchedWrite;
38+ def WriteInst_C : SchedWrite;
3739
3840let SchedModel = SchedModel_A in {
3941// Check the generated data when there are no semantic issues.
@@ -49,9 +51,15 @@ def : WriteRes<WriteInst_A, [ResX0, ResX1, ResX2]> {
4951}
5052def : WriteRes<WriteInst_B, [ResX2]> {
5153// If unspecified, AcquireAtCycle is set to 0.
52- // CORRECT-NEXT: { 3, 1, 0} // #4
54+ // CORRECT-NEXT: { 3, 1, 0}, // #4
5355 let ReleaseAtCycles = [1];
5456}
57+ def : WriteRes<WriteInst_C, [ResX0]> {
58+ // Both AcquireAtCycle and ReleaseAtCycle are allowed
59+ // to be zero at the same time.
60+ // CORRECT-NEXT: { 1, 0, 0} // #5
61+ let ReleaseAtCycles = [0];
62+ }
5563#endif // CORRECT
5664
5765#ifdef WRONG_SIZE
@@ -63,7 +71,7 @@ def : WriteRes<WriteInst_A, [ResX0, ResX1, ResX2]> {
6371#endif
6472
6573#ifdef WRONG_VALUE
66- // WRONG_VALUE: AcquireAtCycle.td:[[@LINE+1]]:1: error: Inconsistent resource cycles: AcquireAtCycles < ReleaseAtCycles must hold
74+ // WRONG_VALUE: AcquireAtCycle.td:[[@LINE+1]]:1: error: Inconsistent resource cycles: AcquireAtCycles <= ReleaseAtCycles must hold
6775def : WriteRes<WriteInst_A, [ResX0, ResX1, ResX2]> {
6876 let ReleaseAtCycles = [2, 4, 3];
6977 let AcquireAtCycles = [0, 1, 8];
@@ -80,6 +88,7 @@ def : WriteRes<WriteInst_A, [ResX0]> {
8088
8189def : InstRW<[WriteInst_A], (instrs Inst_A)>;
8290def : InstRW<[WriteInst_B], (instrs Inst_B)>;
91+ def : InstRW<[WriteInst_C], (instrs Inst_C)>;
8392}
8493
8594def ProcessorA: ProcessorModel<"ProcessorA", SchedModel_A, []>;
0 commit comments