// RUN: llvm-tblgen %s | FileCheck %s | |
// XFAIL: vg_leak | |
// CHECK: --- Defs --- | |
// CHECK: def A00 { | |
// CHECK: int sum = 7; | |
// CHECK: } | |
// CHECK: def A01 { | |
// CHECK: int sum = 8; | |
// CHECK: } | |
// CHECK-NOT: def B0 | |
// CHECK: def B12 { | |
// CHECK: int val = 9; | |
// CHECK: } | |
// CHECK: def B20 { | |
// CHECK: int val = 7; | |
// CHECK: } | |
// CHECK: def B24 { | |
// CHECK: int val = 11; | |
// CHECK: } | |
// CHECK: def B25 { | |
// CHECK: int val = 12; | |
// CHECK: } | |
// CHECK: def C04 | |
// CHECK: def C05 | |
// CHECK: def D0A | |
// CHECK-NOT: def D0B | |
// CHECK: def D1A | |
// CHECK: def D1B | |
// CHECK: def E01 | |
// CHECK: def E02 | |
// CHECK-NOT: def E0C | |
// CHECK: def E18 | |
// CHECK: def E19 | |
// CHECK: def E1C33 | |
// CHECK: def E1C34 | |
// CHECK: def E1C55 | |
// CHECK: def E1C56 | |
// CHECK-NOT: def F0 | |
// CHECK-NOT: def F1 | |
// CHECK-NOT: def F2_0_0 | |
// CHECK: def F2_1_0 | |
// CHECK-NOT: def F2_1_2 | |
// CHECK: def F2_2_0 | |
// CHECK: def F2_2_1 | |
// CHECK-NOT: def F2_2_2 | |
// CHECK: def G0 | |
// CHECK: def H0_G0_0 | |
multiclass A<int x> { | |
foreach i = [0, 1] in { | |
def NAME#i { | |
int sum = !add(x, i); | |
} | |
} | |
} | |
defm A0 : A<7>; | |
multiclass B<int x, list<int> lst> { | |
foreach i = lst in { | |
def NAME#i { | |
int val = !add(x, i); | |
} | |
} | |
} | |
defm B0 : B<7, []>; | |
defm B1 : B<7, [2]>; | |
defm B2 : B<7, [0, 4, 5]>; | |
multiclass C<int x> { | |
foreach i = [x, !add(x, 1)] in { | |
def NAME#i; | |
} | |
} | |
defm C0 : C<4>; | |
multiclass D<bit b> { | |
def A; | |
foreach _ = !if(b, [0], []<int>) in | |
def B; | |
} | |
defm D0 : D<0>; | |
defm D1 : D<1>; | |
multiclass E<list<int> lst, int x> | |
: C<x> { | |
foreach i = lst in | |
defm C#i : C<i>; | |
} | |
defm E0 : E<[], 1>; | |
defm E1 : E<[3, 5], 8>; | |
multiclass F<list<int> lst> { | |
foreach i = lst in | |
foreach j = !foldl([]<int>, lst, lhs, x, | |
!if(!lt(x, i), !listconcat(lhs, [x]), lhs)) in | |
def _#i#_#j; | |
} | |
defm F0 : F<[]>; | |
defm F1 : F<[0]>; | |
defm F2 : F<[0, 1, 2]>; | |
// If multiclass argument comes from loop variable, | |
// and field of argument is placed at foreach statement, | |
// the record field must be resolved correctly. | |
class G { | |
list<int> val = [0]; | |
} | |
multiclass H<G g> { | |
foreach n = g.val in | |
def _#g#_#n; | |
} | |
def G0 : G; | |
foreach g = [G0] in | |
defm H0 : H<g>; |