-
Notifications
You must be signed in to change notification settings - Fork 11.6k
/
foreach-multiclass.td
138 lines (107 loc) · 2.13 KB
/
foreach-multiclass.td
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
// 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>;