summaryrefslogtreecommitdiff
path: root/test/TableGen
diff options
context:
space:
mode:
authorNicolai Haehnle <nhaehnle@gmail.com>2018-03-09 12:24:42 +0000
committerNicolai Haehnle <nhaehnle@gmail.com>2018-03-09 12:24:42 +0000
commitd66fa2a670684d0b1bde0d3fef8037c754f5ea49 (patch)
treedb68b734235f9d8775870f7bdff93daa4cae3449 /test/TableGen
parentad64c889918f67bdf8d4fcecacf00cdab378d46a (diff)
TableGen: Add a defset statement
Allows capturing a list of concrete instantiated defs. This can be combined with foreach to create parallel sets of def instantiations with less repetition in the source. This purpose is largely also served by multiclasses, but in some cases multiclasses can't be used. The motivating example for this change is having a large set of intrinsics, which are generated from the IntrinsicsBackend.td file included by Intrinsics.td, and a corresponding set of instruction selection patterns, which are generated via the backend's .td files. Multiclasses cannot be used to eliminate the redundancy in this case, because a multiclass cannot span both LLVM's common .td files and the backend .td files at the same time. Change-Id: I879e35042dceea542a5e6776fad23c5e0e69e76b Differential revision: https://reviews.llvm.org/D44109 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@327121 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/TableGen')
-rw-r--r--test/TableGen/defset-typeerror.td14
-rw-r--r--test/TableGen/defset.td62
2 files changed, 76 insertions, 0 deletions
diff --git a/test/TableGen/defset-typeerror.td b/test/TableGen/defset-typeerror.td
new file mode 100644
index 00000000000..cdc7833fa3a
--- /dev/null
+++ b/test/TableGen/defset-typeerror.td
@@ -0,0 +1,14 @@
+// RUN: not llvm-tblgen %s 2>&1 | FileCheck %s
+// XFAIL: vg_leak
+
+// CHECK: error: adding record of incompatible type 'A' to defset
+
+class A<int a> {
+ int Num = a;
+}
+
+class B<int a> : A<a>;
+
+defset list<B> Bs = {
+ def A0 : A<1>;
+}
diff --git a/test/TableGen/defset.td b/test/TableGen/defset.td
new file mode 100644
index 00000000000..3c5fb68ea7e
--- /dev/null
+++ b/test/TableGen/defset.td
@@ -0,0 +1,62 @@
+// RUN: llvm-tblgen %s | FileCheck %s
+// XFAIL: vg_leak
+
+// CHECK: --- Defs ---
+
+// CHECK: def Sum {
+// CHECK: int x = 712;
+// CHECK: }
+
+// CHECK: def yyy_A0
+// CHECK: def yyy_A1
+// CHECK: def yyy_A2
+// CHECK: def yyy_B0A0
+// CHECK: def yyy_B0A1
+// CHECK: def yyy_C0B0A0
+// CHECK: def yyy_C0B0A1
+// CHECK: def yyy_C0B1A0
+// CHECK: def yyy_C0B1A1
+// CHECK-NOT: def zzz_A0
+// CHECK: def zzz_B0A0
+// CHECK: def zzz_B0A1
+// CHECK: def zzz_C0B0A0
+// CHECK: def zzz_C0B0A1
+// CHECK: def zzz_C0B1A0
+// CHECK: def zzz_C0B1A1
+
+class A<int a> {
+ int Num = a;
+}
+
+multiclass B<int b> {
+ def A0 : A<!add(10, b)>;
+ def A1 : A<!add(20, b)>;
+}
+
+multiclass C<int c> {
+ defm B0 : B<!add(100, c)>;
+ defm B1 : B<!add(200, c)>;
+}
+
+defset list<A> As = {
+ def A0 : A<1>;
+ foreach i = 1-2 in {
+ def A#i : A<!add(i, 1)>;
+ }
+ defset list<A> SubAs = {
+ defm B0 : B<2>;
+ defm C0 : C<3>;
+ }
+}
+
+def Sum {
+ int x = !foldl(0, As, a, b, !add(a, b.Num));
+}
+
+foreach a = As in {
+ def yyy_ # !cast<string>(a);
+}
+
+foreach a = SubAs in {
+ def zzz_ # !cast<string>(a);
+}