For a tablegen expression such as !if(a,b,c), let 'a'
authorBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Thu, 17 Jun 2010 00:31:36 +0000 (00:31 +0000)
committerBruno Cardoso Lopes <bruno.cardoso@gmail.com>
Thu, 17 Jun 2010 00:31:36 +0000 (00:31 +0000)
be evaluated for 'bit' operators

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106185 91177308-0d34-0410-b5e6-96231b3b80d8

docs/TableGenFundamentals.html
test/TableGen/ifbit.td [new file with mode: 0644]
utils/TableGen/Record.cpp

index 3410cacb62dc744effe830ac4060542fc8e01cea..f7a082d7050e9ed3fe018947e03a4caabf555549 100644 (file)
@@ -422,7 +422,8 @@ class.  This operation is analogous to $(foreach) in GNU make.</dd>
 <dt><tt>!null(a)</tt></dt>
   <dd>An integer {0,1} indicating whether list 'a' is empty.</dd>
 <dt><tt>!if(a,b,c)</tt></dt>
-  <dd>'b' if the result of integer operator 'a' is nonzero, 'c' otherwise.</dd>
+  <dd>'b' if the result of 'int' or 'bit' operator 'a' is nonzero,
+      'c' otherwise.</dd>
 <dt><tt>!eq(a,b)</tt></dt>
   <dd>Integer one if string a is equal to string b, zero otherwise.  This
       only operates on string, int and bit objects.  Use !cast<string> to
diff --git a/test/TableGen/ifbit.td b/test/TableGen/ifbit.td
new file mode 100644 (file)
index 0000000..3b0349e
--- /dev/null
@@ -0,0 +1,11 @@
+// RUN: tblgen %s | FileCheck %s
+// XFAIL: vg_leak
+// CHECK: a = 6
+// CHECK: a = 5
+
+class A<bit b = 1> {
+  int a = !if(b, 5, 6);
+}
+
+def X : A<0>;
+def Y : A;
index d9c5dd30e18863af077dde36a9c3ae3845d4186e..53a4abdaf2bde9c9117e2c114eeac8b9efefde5c 100644 (file)
@@ -981,7 +981,8 @@ Init *TernOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) {
   }
 
   case IF: {
-    IntInit *LHSi = dynamic_cast<IntInit*>(LHS);
+    IntInit *LHSi =
+      dynamic_cast<IntInit*>(LHS->convertInitializerTo(new IntRecTy()));
     if (LHSi) {
       if (LHSi->getValue()) {
         return MHS;
@@ -1000,7 +1001,8 @@ Init *TernOpInit::resolveReferences(Record &R, const RecordVal *RV) {
   Init *lhs = LHS->resolveReferences(R, RV);
 
   if (Opc == IF && lhs != LHS) {
-    IntInit *Value = dynamic_cast<IntInit*>(lhs);
+    IntInit *Value =
+      dynamic_cast<IntInit*>(LHS->convertInitializerTo(new IntRecTy()));
     if (Value != 0) {
       // Short-circuit
       if (Value->getValue()) {