| // 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>; |