[llvm] 22108b5 - [AMDGPU] Use synthetic fixtures for generic feature validation tests (#225551)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 23 17:45:59 PDT 2026
Author: Chinmay Deshpande
Date: 2026-09-24T00:45:52Z
New Revision: 22108b501943f7a315f05ed16f5569ddb5d5d458
URL: https://github.com/llvm/llvm-project/commit/22108b501943f7a315f05ed16f5569ddb5d5d458
DIFF: https://github.com/llvm/llvm-project/commit/22108b501943f7a315f05ed16f5569ddb5d5d458.diff
LOG: [AMDGPU] Use synthetic fixtures for generic feature validation tests (#225551)
Remove the classification test that includes the full AMDGPU target.
Real targets are validated when generating AMDGPUTargetParserDef.inc
during the build.
Extend the lightweight generic feature tests to cover inherited
classifications of backend-only features, support through member-side
implications, and unsupported generic-side implied features.
Addresses the timeout reported on #223179
Added:
Modified:
llvm/test/TableGen/AMDGPUTargetDefGenericFeatures.td
Removed:
llvm/test/TableGen/AMDGPUTargetDefGenericClassification.td
################################################################################
diff --git a/llvm/test/TableGen/AMDGPUTargetDefGenericClassification.td b/llvm/test/TableGen/AMDGPUTargetDefGenericClassification.td
deleted file mode 100644
index 51cef25a874e1..0000000000000
--- a/llvm/test/TableGen/AMDGPUTargetDefGenericClassification.td
+++ /dev/null
@@ -1,71 +0,0 @@
-// RUN: split-file %s %t
-// RUN: llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/valid.td \
-// RUN: | FileCheck %t/valid.td
-// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/missing-bug.td 2>&1 \
-// RUN: | FileCheck %t/missing-generic.td -DDIR=%t -DFEATURE=user-sgpr-init16-bug --implicit-check-not="error:"
-// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/missing-priority.td 2>&1 \
-// RUN: | FileCheck %t/missing-generic.td -DDIR=%t -DFEATURE=required-export-priority --implicit-check-not="error:"
-// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/missing-timing.td 2>&1 \
-// RUN: | FileCheck %t/missing-generic.td -DDIR=%t -DFEATURE=gfx125x-lowest-rate-wmma --implicit-check-not="error:"
-// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/missing-banks.td 2>&1 \
-// RUN: | FileCheck %t/missing-generic.td -DDIR=%t -DFEATURE=ldsbankcount32 --implicit-check-not="error:"
-// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/missing-lds-size.td 2>&1 \
-// RUN: | FileCheck %t/missing-generic.td -DDIR=%t -DFEATURE=addressablelocalmemorysize65536 --implicit-check-not="error:"
-// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/capability.td 2>&1 \
-// RUN: | FileCheck %t/capability.td -DFILE=%t/capability.td --implicit-check-not="error:"
-
-//--- common.td
-include "AMDGPU.td"
-
-def EmptyGPU : AMDGPUProcessorModel<"gfx999", NoSchedModel, [], [9, 9, 9]>;
-
-//--- valid.td
-include "common.td"
-// Check the real generic targets, including gfx11's combined workarounds,
-// gfx12-5's fixup and WMMA timing, and gfx9-4's LDS size and bank count.
-// CHECK: GK_GFX9_4_GENERIC
-// CHECK: GK_GFX11_GENERIC
-// CHECK: GK_GFX12_5_GENERIC
-
-//--- missing-bug.td
-include "common.td"
-defvar CheckedFeature = FeatureUserSGPRInit16Bug;
-include "missing-generic.td"
-
-//--- missing-priority.td
-include "common.td"
-defvar CheckedFeature = FeatureRequiredExportPriority;
-include "missing-generic.td"
-
-//--- missing-timing.td
-include "common.td"
-defvar CheckedFeature = FeatureGFX125xLowestRateWMMA;
-include "missing-generic.td"
-
-//--- missing-banks.td
-include "common.td"
-defvar CheckedFeature = FeatureLDSBankCount32;
-include "missing-generic.td"
-
-//--- missing-lds-size.td
-include "common.td"
-defvar CheckedFeature = FeatureAddressableLocalMemorySize65536;
-include "missing-generic.td"
-
-//--- missing-generic.td
-// Classified backend-only features still need support from a covered GPU.
-// Included files use the native path separator after the include directory.
-// CHECK: [[DIR]]{{[/\\]}}missing-generic.td:[[#@LINE+1]]:1: error: generic target 'gfx9-9-generic' exposes feature '[[FEATURE]]' not supported by any covered GPU
-def : AMDGPUProcessorModel<"gfx9-9-generic", NoSchedModel, [CheckedFeature], [9, 9, 0]> {
- let CoveredGPUs = [EmptyGPU];
-}
-
-//--- capability.td
-include "common.td"
-def WMMAGPU : AMDGPUProcessorModel<"gfx998", NoSchedModel,
- [FeatureWMMA256bInsts], [9, 9, 8]>;
-// Instruction support keeps the default all-covered-GPUs rule.
-// CHECK: [[FILE]]:[[#@LINE+1]]:1: error: generic target 'gfx9-9-generic' exposes feature 'wmma-256b-insts' not supported by covered GPU 'gfx999'
-def : AMDGPUProcessorModel<"gfx9-9-generic", NoSchedModel, [FeatureWMMA256bInsts], [9, 9, 0]> {
- let CoveredGPUs = [WMMAGPU, EmptyGPU];
-}
diff --git a/llvm/test/TableGen/AMDGPUTargetDefGenericFeatures.td b/llvm/test/TableGen/AMDGPUTargetDefGenericFeatures.td
index d1520f12d29b9..938555c5f29e9 100644
--- a/llvm/test/TableGen/AMDGPUTargetDefGenericFeatures.td
+++ b/llvm/test/TableGen/AMDGPUTargetDefGenericFeatures.td
@@ -1,33 +1,66 @@
// RUN: split-file %s %t
-// RUN: llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/valid.td \
+// RUN: llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../lib/Target/AMDGPU %t/valid.td \
// RUN: | FileCheck %t/valid.td
-// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/missing-any.td 2>&1 \
+// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../lib/Target/AMDGPU %t/missing-any.td 2>&1 \
// RUN: | FileCheck %t/missing-any.td -DFILE=%t/missing-any.td --implicit-check-not="error:"
-// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/missing-all.td 2>&1 \
+// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../lib/Target/AMDGPU %t/missing-all.td 2>&1 \
// RUN: | FileCheck %t/missing-all.td -DFILE=%t/missing-all.td --implicit-check-not="error:"
-// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/implied-all.td 2>&1 \
+// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../lib/Target/AMDGPU %t/implied-all.td 2>&1 \
// RUN: | FileCheck %t/implied-all.td -DFILE=%t/implied-all.td --implicit-check-not="error:"
-// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/missing-private.td 2>&1 \
+// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../lib/Target/AMDGPU %t/missing-private.td 2>&1 \
// RUN: | FileCheck %t/missing-private.td -DFILE=%t/missing-private.td --implicit-check-not="error:"
-// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/numeric-mismatch.td 2>&1 \
+// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../lib/Target/AMDGPU %t/implied-private.td 2>&1 \
+// RUN: | FileCheck %t/implied-private.td -DFILE=%t/implied-private.td --implicit-check-not="error:"
+// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../lib/Target/AMDGPU %t/numeric-mismatch.td 2>&1 \
// RUN: | FileCheck %t/numeric-mismatch.td -DFILE=%t/numeric-mismatch.td --implicit-check-not="error:"
-// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/empty-members.td 2>&1 \
+// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../lib/Target/AMDGPU %t/empty-members.td 2>&1 \
// RUN: | FileCheck %t/empty-members.td -DFILE=%t/empty-members.td --implicit-check-not="error:"
-// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/self-member.td 2>&1 \
+// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../lib/Target/AMDGPU %t/self-member.td 2>&1 \
// RUN: | FileCheck %t/self-member.td -DFILE=%t/self-member.td --implicit-check-not="error:"
-// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/generic-member.td 2>&1 \
+// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../lib/Target/AMDGPU %t/generic-member.td 2>&1 \
// RUN: | FileCheck %t/generic-member.td -DFILE=%t/generic-member.td --implicit-check-not="error:"
-// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/pseudo-member.td 2>&1 \
+// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../lib/Target/AMDGPU %t/pseudo-member.td 2>&1 \
// RUN: | FileCheck %t/pseudo-member.td -DFILE=%t/pseudo-member.td --implicit-check-not="error:"
-// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/unregistered-member.td 2>&1 \
+// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../lib/Target/AMDGPU %t/unregistered-member.td 2>&1 \
// RUN: | FileCheck %t/unregistered-member.td -DFILE=%t/unregistered-member.td --implicit-check-not="error:"
-// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../include -I %p/../../lib/Target/AMDGPU %t/r600-member.td 2>&1 \
+// RUN: not llvm-tblgen -gen-amdgpu-target-def -I %t -I %p/../../lib/Target/AMDGPU %t/r600-member.td 2>&1 \
// RUN: | FileCheck %t/r600-member.td -DFILE=%t/r600-member.td --implicit-check-not="error:"
//--- common.td
-include "llvm/Target/Target.td"
+// Exercise the validation rules with small synthetic targets. The real targets
+// are validated when AMDGPUTargetParserDef.inc is generated during the build.
+// Stand-ins for the Target.td classes used by AMDGPUTargetParser.td, limited to
+// the fields the backend reads.
+class InlineBehavior;
+def InlineIgnore : InlineBehavior;
+def InlineDefault : InlineBehavior;
+class SubtargetFeature<string n, string f, string v, string d,
+ list<SubtargetFeature> i = [],
+ InlineBehavior ib = InlineDefault> {
+ string Name = n;
+ string FieldName = f;
+ string Value = v;
+ string Desc = d;
+ list<SubtargetFeature> Implies = i;
+ InlineBehavior InlineBehavior = ib;
+}
+
+class SchedMachineModel;
+def NoSchedModel : SchedMachineModel;
+class ProcessorItineraries;
+def NoItineraries : ProcessorItineraries;
+
+class Processor<string n, ProcessorItineraries pi, list<SubtargetFeature> f> {
+ string Name = n;
+ ProcessorItineraries ProcItin = pi;
+ list<SubtargetFeature> Features = f;
+}
+class ProcessorModel<string n, SchedMachineModel m, list<SubtargetFeature> f>
+ : Processor<n, NoItineraries, f> {
+ SchedMachineModel SchedModel = m;
+}
+
include "AMDGPUTargetParser.td"
-def MyTarget : Target;
def FeatureAll : SubtargetFeature<"all", "HasAll", "true", "">;
def FeatureAnyA : AMDGPUGenericAnyFeature<"any-a", "HasAnyA", "true", "">;
@@ -37,7 +70,13 @@ class NumericFeature<int value> : AMDGPUGenericAnyFeature<
def FeatureAnySmall : NumericFeature<4>;
def FeatureAnyB : NumericFeature<8>;
def FeatureAnyLarge : NumericFeature<16>;
-def FeaturePrivate : AMDGPUGenericAnyFeature<"private", "HasPrivate", "true", "">;
+// Classification inherited through a subclass also applies to backend-only
+// features, which must participate in validation without being emitted.
+class PrivateFeature : AMDGPUGenericAnyFeature<
+ "private", "HasPrivate", "true", "">;
+def FeaturePrivate : PrivateFeature;
+def FeatureImpliesPrivate : SubtargetFeature<
+ "implies-private", "HasImpliesPrivate", "true", "", [FeaturePrivate]>;
def FeatureImpliesA : SubtargetFeature<
"implies-a", "HasImpliesA", "true", "", [FeatureAnyA]>;
def FeatureImpliesB : SubtargetFeature<
@@ -55,7 +94,7 @@ include "common.td"
def GFX900 : AMDGPUProcessorModel<"gfx900", NoSchedModel,
[FeatureAll, FeatureAnyA, FeatureAnySmall], [9, 0, 0]>;
def GFX901 : AMDGPUProcessorModel<"gfx901", NoSchedModel,
- [FeatureAll, FeatureImpliesB, FeaturePrivate], [9, 0, 1]>;
+ [FeatureAll, FeatureImpliesB, FeatureImpliesPrivate], [9, 0, 1]>;
// Different members supply
diff erent marked features. Follow Implies on both
// the generic and the members, and check marked backend-only features too.
def : AMDGPUProcessorModel<"gfx9-generic", NoSchedModel,
@@ -103,6 +142,15 @@ def : AMDGPUProcessorModel<"gfx9-generic", NoSchedModel, [FeaturePrivate], [9, 0
let CoveredGPUs = [GFX900];
}
+//--- implied-private.td
+include "common.td"
+def GFX900 : AMDGPUProcessorModel<"gfx900", NoSchedModel, [], [9, 0, 0]>;
+// An unclassified backend-only parent must not hide a classified dependency.
+// CHECK: [[FILE]]:[[#@LINE+1]]:1: error: generic target 'gfx9-generic' exposes feature 'private' not supported by any covered GPU
+def : AMDGPUProcessorModel<"gfx9-generic", NoSchedModel, [FeatureImpliesPrivate], [9, 0, 0]> {
+ let CoveredGPUs = [GFX900];
+}
+
//--- numeric-mismatch.td
include "common.td"
def GFX900 : AMDGPUProcessorModel<"gfx900", NoSchedModel, [FeatureAnySmall], [9, 0, 0]>;
More information about the llvm-commits
mailing list