| // RUN: llvm-tblgen %s | FileCheck %s | |
| // XFAIL: vg_leak | |
| // Tests evaluation of !foreach operator. | |
| def d0; | |
| def d1; | |
| def d2; | |
| def d3; | |
| def d4; | |
| class D<dag d> { | |
| dag r1 = !foreach(tmp, d, !subst(d1, d0, !subst(d2, d0, | |
| !subst(d3, d0, | |
| !subst(d4, d0, tmp))))); | |
| list<dag> dl = [d]; | |
| list<dag> r2 = !foreach(tmp2, dl, | |
| !foreach(tmp, tmp2, !subst(d1, d0, | |
| !subst(d2, d0, | |
| !subst(d3, d0, | |
| !subst(d4, d0, tmp)))))); | |
| } | |
| // CHECK-LABEL: def d | |
| // CHECK: dag r1 = (d0 d0, d0, d0, d0); | |
| // CHECK: list<dag> r2 = [(d0 d0, d0, d0, d0)]; | |
| def d : D <(d0 d1, d2, d3, d4)>; | |
| class I<list<int> i> { | |
| list<int> r1 = !foreach(tmp, i, !add(3, !add(4, tmp))); | |
| list<list<int>> li = [i]; | |
| list<list<int>> r2 = !foreach(tmp2, li, | |
| !foreach(tmp, tmp2, !add(3, !add(4, tmp)))); | |
| } | |
| // CHECK-LABEL: def i | |
| // CHECK: list<int> r1 = [8, 9, 10]; | |
| // CHECK: list<list<int>> r2 = [{{[[]}}8, 9, 10]]; | |
| def i : I<[1,2,3]>; | |
| class J0<list<dag> pattern> { | |
| list<dag> Pattern = pattern; | |
| } | |
| class J1<dag pattern> | |
| : J0<[!foreach(tmp, pattern, !subst(d1, d0, | |
| !subst(d2, d0, | |
| !subst(d3, d0, | |
| !subst(d4, d0, tmp)))))]>; | |
| class J2<list<dag> patterns> | |
| : J0<!foreach(t0, patterns, | |
| !foreach(t1, t0, !subst(d1, d0, | |
| !subst(d2, d0, | |
| !subst(d3, d0, | |
| !subst(d4, d0, t1))))))>; | |
| // CHECK-LABEL: def j1 | |
| // CHECK: list<dag> Pattern = [(d0 d0:$dst, (d0 d0:$src1))]; | |
| def j1 : J1< (d1 d2:$dst, (d3 d4:$src1))>; | |
| // CHECK-LABEL: def j2 | |
| // CHECK: list<dag> Pattern = [(d0 d0:$dst, (d0 d0:$src1))]; | |
| def j2 : J2< [(d1 d2:$dst, (d3 d4:$src1))]>; | |