summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolai Haehnle <nhaehnle@gmail.com>2018-03-14 11:00:48 +0000
committerNicolai Haehnle <nhaehnle@gmail.com>2018-03-14 11:00:48 +0000
commitb61c26e6140caa8ba4d2e2329dcbdb18333f47a6 (patch)
tree481c75ab6f5284b5c2fd1718afa51cd4e16b7f76
parent77841b159abd5767fec6d26223420ec6d99c617d (diff)
downloadbcm5719-llvm-b61c26e6140caa8ba4d2e2329dcbdb18333f47a6.tar.gz
bcm5719-llvm-b61c26e6140caa8ba4d2e2329dcbdb18333f47a6.zip
TableGen: Allow dag operators to be resolved late
Change-Id: I51bb80fd5c48c8ac441ab11e43d43c1b91b4b590 Differential revision: https://reviews.llvm.org/D44113 llvm-svn: 327495
-rw-r--r--llvm/lib/TableGen/Record.cpp9
-rw-r--r--llvm/test/TableGen/dag-functional.td17
2 files changed, 22 insertions, 4 deletions
diff --git a/llvm/lib/TableGen/Record.cpp b/llvm/lib/TableGen/Record.cpp
index 48197f04d11..e9325decfac 100644
--- a/llvm/lib/TableGen/Record.cpp
+++ b/llvm/lib/TableGen/Record.cpp
@@ -859,8 +859,13 @@ Init *BinOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) const {
if (LHSs && RHSs) {
DefInit *LOp = dyn_cast<DefInit>(LHSs->getOperator());
DefInit *ROp = dyn_cast<DefInit>(RHSs->getOperator());
- if (!LOp || !ROp || LOp->getDef() != ROp->getDef())
- PrintFatalError("Concated Dag operators do not match!");
+ if (!LOp || !ROp)
+ break;
+ if (LOp->getDef() != ROp->getDef()) {
+ PrintFatalError(Twine("Concatenated Dag operators do not match: '") +
+ LHSs->getAsString() + "' vs. '" + RHSs->getAsString() +
+ "'");
+ }
SmallVector<Init*, 8> Args;
SmallVector<StringInit*, 8> ArgNames;
for (unsigned i = 0, e = LHSs->getNumArgs(); i != e; ++i) {
diff --git a/llvm/test/TableGen/dag-functional.td b/llvm/test/TableGen/dag-functional.td
index dc1c37c8eca..6baee695ddd 100644
--- a/llvm/test/TableGen/dag-functional.td
+++ b/llvm/test/TableGen/dag-functional.td
@@ -40,7 +40,13 @@
// CHECK: dag d1 = (ops 1, ?:$name1, 2, 3);
// CHECK: }
-def ops;
+// CHECK: def E0 {
+// CHECK: dag ret = (ops 1, 2);
+// CHECK: }
+
+class Ops;
+
+def ops : Ops;
class Node<int val, string name> {
int Val = val;
@@ -100,4 +106,11 @@ def C0 : C<[1, 2], ["a", "b"]>;
def D {
dag d1 = !con((ops 1), (ops $name1), (ops), (ops 2, 3));
-} \ No newline at end of file
+}
+
+class E<Ops op> {
+ // Allow concatenation of DAG nodes with operators from template arguments.
+ dag ret = !con((op 1), (op 2));
+}
+
+def E0 : E<ops>;
OpenPOWER on IntegriCloud