1// RUN: llvm-tblgen %s | FileCheck %s
2// XFAIL: vg_leak
3
4// Tests evaluation of !foreach operator.
5
6def d0;
7def d1;
8def d2;
9def d3;
10def d4;
11
12class D<dag d> {
13  dag r1 = !foreach(tmp, d, !subst(d1, d0, !subst(d2, d0,
14                                           !subst(d3, d0,
15                                           !subst(d4, d0, tmp)))));
16  list<dag> dl = [d];
17  list<dag> r2 = !foreach(tmp2, dl,
18                          !foreach(tmp, tmp2, !subst(d1, d0,
19                                              !subst(d2, d0,
20                                              !subst(d3, d0,
21                                              !subst(d4, d0, tmp))))));
22}
23
24// CHECK-LABEL: def d
25// CHECK: dag r1 = (d0 d0, d0, d0, d0);
26// CHECK: list<dag> r2 = [(d0 d0, d0, d0, d0)];
27def d : D <(d0 d1, d2, d3, d4)>;
28
29class I<list<int> i> {
30  list<int> r1 = !foreach(tmp, i, !add(3, !add(4, tmp)));
31
32  list<list<int>> li = [i];
33  list<list<int>> r2 = !foreach(tmp2, li,
34                                !foreach(tmp, tmp2, !add(3, !add(4, tmp))));
35}
36
37// CHECK-LABEL: def i
38// CHECK: list<int> r1 = [8, 9, 10];
39// CHECK: list<list<int>> r2 = [{{[[]}}8, 9, 10]];
40def i : I<[1,2,3]>;
41
42class J0<list<dag> pattern> {
43  list<dag> Pattern = pattern;
44}
45class J1<dag pattern>
46      : J0<[!foreach(tmp, pattern, !subst(d1, d0,
47                                   !subst(d2, d0,
48                                   !subst(d3, d0,
49                                   !subst(d4, d0, tmp)))))]>;
50class J2<list<dag> patterns>
51      : J0<!foreach(t0, patterns,
52                    !foreach(t1, t0, !subst(d1, d0,
53                                     !subst(d2, d0,
54                                     !subst(d3, d0,
55                                     !subst(d4, d0, t1))))))>;
56// CHECK-LABEL: def j1
57// CHECK: list<dag> Pattern = [(d0 d0:$dst, (d0 d0:$src1))];
58def j1 : J1< (d1 d2:$dst, (d3 d4:$src1))>;
59// CHECK-LABEL: def j2
60// CHECK: list<dag> Pattern = [(d0 d0:$dst, (d0 d0:$src1))];
61def j2 : J2< [(d1 d2:$dst, (d3 d4:$src1))]>;
62
63