xref: /llvm-project/llvm/test/TableGen/foreach-multiclass.td (revision 5046c5be8459a9631eeb149337776dcbde0e2a0b)
1// RUN: llvm-tblgen %s | FileCheck %s
2// XFAIL: vg_leak
3
4// CHECK: --- Defs ---
5
6// CHECK: def A00 {
7// CHECK:   int sum = 7;
8// CHECK: }
9
10// CHECK: def A01 {
11// CHECK:   int sum = 8;
12// CHECK: }
13
14// CHECK-NOT: def B0
15
16// CHECK: def B12 {
17// CHECK:   int val = 9;
18// CHECK: }
19
20// CHECK: def B20 {
21// CHECK:   int val = 7;
22// CHECK: }
23
24// CHECK: def B24 {
25// CHECK:   int val = 11;
26// CHECK: }
27
28// CHECK: def B25 {
29// CHECK:   int val = 12;
30// CHECK: }
31
32// CHECK: def C04
33// CHECK: def C05
34
35// CHECK: def D0A
36// CHECK-NOT: def D0B
37// CHECK: def D1A
38// CHECK: def D1B
39
40// CHECK: def E01
41// CHECK: def E02
42// CHECK-NOT: def E0C
43
44// CHECK: def E18
45// CHECK: def E19
46// CHECK: def E1C33
47// CHECK: def E1C34
48// CHECK: def E1C55
49// CHECK: def E1C56
50
51// CHECK-NOT: def F0
52// CHECK-NOT: def F1
53// CHECK-NOT: def F2_0_0
54// CHECK:     def F2_1_0
55// CHECK-NOT: def F2_1_2
56// CHECK:     def F2_2_0
57// CHECK:     def F2_2_1
58// CHECK-NOT: def F2_2_2
59
60// CHECK: def G0
61// CHECK: def H0_G0_0
62
63multiclass A<int x> {
64  foreach i = [0, 1] in {
65    def NAME#i {
66      int sum = !add(x, i);
67    }
68  }
69}
70
71defm A0 : A<7>;
72
73multiclass B<int x, list<int> lst> {
74  foreach i = lst in {
75    def NAME#i {
76      int val = !add(x, i);
77    }
78  }
79}
80
81defm B0 : B<7, []>;
82defm B1 : B<7, [2]>;
83defm B2 : B<7, [0, 4, 5]>;
84
85multiclass C<int x> {
86  foreach i = [x, !add(x, 1)] in {
87    def NAME#i;
88  }
89}
90
91defm C0 : C<4>;
92
93multiclass D<bit b> {
94  def A;
95
96  foreach _ = !if(b, [0], []<int>) in
97  def B;
98}
99
100defm D0 : D<0>;
101defm D1 : D<1>;
102
103multiclass E<list<int> lst, int x>
104  : C<x> {
105  foreach i = lst in
106  defm C#i : C<i>;
107}
108
109defm E0 : E<[], 1>;
110defm E1 : E<[3, 5], 8>;
111
112multiclass F<list<int> lst> {
113  foreach i = lst in
114  foreach j = !foldl([]<int>, lst, lhs, x,
115                     !if(!lt(x, i), !listconcat(lhs, [x]), lhs)) in
116  def _#i#_#j;
117}
118
119defm F0 : F<[]>;
120defm F1 : F<[0]>;
121defm F2 : F<[0, 1, 2]>;
122
123// If multiclass argument comes from loop variable,
124// and field of argument is placed at foreach statement,
125// the record field must be resolved correctly.
126class G {
127  list<int> val = [0];
128}
129
130multiclass H<G g> {
131  foreach n = g.val in
132    def _#g#_#n;
133}
134
135def G0 : G;
136
137foreach g = [G0] in
138  defm H0 : H<g>;
139