forked from OSchip/llvm-project
let the '!eq' expression support 'int' and 'bit' types
llvm-svn: 106171
This commit is contained in:
parent
13d0568ecc
commit
77a4a56251
|
@ -425,8 +425,8 @@ class. This operation is analogous to $(foreach) in GNU make.</dd>
|
||||||
<dd>'b' if the result of integer operator 'a' is nonzero, 'c' otherwise.</dd>
|
<dd>'b' if the result of integer operator 'a' is nonzero, 'c' otherwise.</dd>
|
||||||
<dt><tt>!eq(a,b)</tt></dt>
|
<dt><tt>!eq(a,b)</tt></dt>
|
||||||
<dd>Integer one if string a is equal to string b, zero otherwise. This
|
<dd>Integer one if string a is equal to string b, zero otherwise. This
|
||||||
only operates on string objects. Use !cast<string> to compare other
|
only operates on string, int and bit objects. Use !cast<string> to
|
||||||
types of objects.</dd>
|
compare other types of objects.</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
<p>Note that all of the values have rules specifying how they convert to values
|
<p>Note that all of the values have rules specifying how they convert to values
|
||||||
|
|
|
@ -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(!eq(b, 1), 5, 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
def X : A<0>;
|
||||||
|
def Y : A;
|
|
@ -721,9 +721,20 @@ Init *BinOpInit::Fold(Record *CurRec, MultiClass *CurMultiClass) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EQ: {
|
case EQ: {
|
||||||
// Make sure we've resolved
|
// try to fold eq comparison for 'bit' and 'int', otherwise fallback
|
||||||
|
// to string objects.
|
||||||
|
IntInit* L =
|
||||||
|
dynamic_cast<IntInit*>(LHS->convertInitializerTo(new IntRecTy()));
|
||||||
|
IntInit* R =
|
||||||
|
dynamic_cast<IntInit*>(RHS->convertInitializerTo(new IntRecTy()));
|
||||||
|
|
||||||
|
if (L && R)
|
||||||
|
return new IntInit(L->getValue() == R->getValue());
|
||||||
|
|
||||||
StringInit *LHSs = dynamic_cast<StringInit*>(LHS);
|
StringInit *LHSs = dynamic_cast<StringInit*>(LHS);
|
||||||
StringInit *RHSs = dynamic_cast<StringInit*>(RHS);
|
StringInit *RHSs = dynamic_cast<StringInit*>(RHS);
|
||||||
|
|
||||||
|
// Make sure we've resolved
|
||||||
if (LHSs && RHSs)
|
if (LHSs && RHSs)
|
||||||
return new IntInit(LHSs->getValue() == RHSs->getValue());
|
return new IntInit(LHSs->getValue() == RHSs->getValue());
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue