@@ -8,11 +8,57 @@ def TestTarget : Target {
88 let InstructionSet = TestTargetInstrInfo;
99}
1010
11+ def FeatureFoo : SubtargetFeature<"foo", "HasFoo", "true", "enable foo">;
12+
13+ def ResX0 : ProcResource<1>;
14+
15+ let OutOperandList = (outs), InOperandList = (ins) in
16+ def Inst_A : Instruction;
17+
18+ def SchedModel_A: SchedMachineModel {
19+ let CompleteModel = false;
20+ }
21+
22+ let SchedModel = SchedModel_A in {
23+ def SchedWriteResA : SchedWriteRes<[ResX0]> {
24+ let Latency = 2;
25+ }
26+ def SchedWriteResB : SchedWriteRes<[ResX0]> {
27+ let Latency = 4;
28+ }
29+
30+ // Check SchedPredicate with subtarget feature.
31+ def FeatureFooPred : FeatureSchedPredicate<FeatureFoo>;
32+
33+ def Variant : SchedWriteVariant<[
34+ SchedVar<FeatureFooPred, [SchedWriteResA]>,
35+ SchedVar<NoSchedPred, [SchedWriteResB]>
36+ ]>;
37+
38+ def : InstRW<[Variant], (instrs Inst_A)>;
39+ }
40+
41+ def ProcessorA: ProcessorModel<"ProcessorA", SchedModel_A, []>;
42+
1143// CHECK: unsigned resolveVariantSchedClassImpl(unsigned SchedClass,
1244// CHECK-NEXT: const MCInst *MI, const MCInstrInfo *MCII, const MCSubtargetInfo &STI, unsigned CPUID)
45+ // CHECK: case {{.*}}: // Inst_A
46+ // CHECK-NEXT: if (CPUID == {{.*}}) { // SchedModel_A
47+ // CHECK-NEXT: if (STI.hasFeature(TestTarget::FeatureFoo))
48+ // CHECK-NEXT: return {{.*}}; // SchedWriteResA
49+ // CHECK-NEXT: return {{.*}}; // SchedWriteResB
1350
1451// CHECK: unsigned resolveVariantSchedClass(unsigned SchedClass,
1552// CHECK-NEXT: const MCInst *MI, const MCInstrInfo *MCII,
1653// CHECK-NEXT: unsigned CPUID) const override {
1754// CHECK-NEXT: return TestTarget_MC::resolveVariantSchedClassImpl(SchedClass, MI, MCII, *this, CPUID);
1855// CHECK-NEXT: }
56+
57+ // CHECK: unsigned TestTargetGenSubtargetInfo
58+ // CHECK-NEXT: ::resolveSchedClass(unsigned SchedClass, const MachineInstr *MI, const TargetSchedModel *SchedModel) const {
59+ // CHECK-NEXT: switch (SchedClass) {
60+ // CHECK-NEXT: case {{.*}}: // Inst_A
61+ // CHECK-NEXT: if (SchedModel->getProcessorID() == {{.*}}) { // SchedModel_A
62+ // CHECK-NEXT: if (this->hasFeature(TestTarget::FeatureFoo))
63+ // CHECK-NEXT: return {{.*}}; // SchedWriteResA
64+ // CHECK-NEXT: return {{.*}}; // SchedWriteResB
0 commit comments