[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / TableGen / foreach-multiclass.td
blob1b8ad6a37e2684645b0d41b293dd105625be4bc7
1 // RUN: llvm-tblgen %s | FileCheck %s
2 // XFAIL: vg_leak
4 // CHECK: --- Defs ---
6 // CHECK: def A00 {
7 // CHECK:   int sum = 7;
8 // CHECK: }
10 // CHECK: def A01 {
11 // CHECK:   int sum = 8;
12 // CHECK: }
14 // CHECK-NOT: def B0
16 // CHECK: def B12 {
17 // CHECK:   int val = 9;
18 // CHECK: }
20 // CHECK: def B20 {
21 // CHECK:   int val = 7;
22 // CHECK: }
24 // CHECK: def B24 {
25 // CHECK:   int val = 11;
26 // CHECK: }
28 // CHECK: def B25 {
29 // CHECK:   int val = 12;
30 // CHECK: }
32 // CHECK: def C04
33 // CHECK: def C05
35 // CHECK: def D0A
36 // CHECK-NOT: def D0B
37 // CHECK: def D1A
38 // CHECK: def D1B
40 // CHECK: def E01
41 // CHECK: def E02
42 // CHECK-NOT: def E0C
44 // CHECK: def E18
45 // CHECK: def E19
46 // CHECK: def E1C33
47 // CHECK: def E1C34
48 // CHECK: def E1C55
49 // CHECK: def E1C56
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
60 // CHECK: def G0
61 // CHECK: def H0_G0_0
63 multiclass A<int x> {
64   foreach i = [0, 1] in {
65     def NAME#i {
66       int sum = !add(x, i);
67     }
68   }
71 defm A0 : A<7>;
73 multiclass B<int x, list<int> lst> {
74   foreach i = lst in {
75     def NAME#i {
76       int val = !add(x, i);
77     }
78   }
81 defm B0 : B<7, []>;
82 defm B1 : B<7, [2]>;
83 defm B2 : B<7, [0, 4, 5]>;
85 multiclass C<int x> {
86   foreach i = [x, !add(x, 1)] in {
87     def NAME#i;
88   }
91 defm C0 : C<4>;
93 multiclass D<bit b> {
94   def A;
96   foreach _ = !if(b, [0], []<int>) in
97   def B;
100 defm D0 : D<0>;
101 defm D1 : D<1>;
103 multiclass E<list<int> lst, int x>
104   : C<x> {
105   foreach i = lst in
106   defm C#i : C<i>;
109 defm E0 : E<[], 1>;
110 defm E1 : E<[3, 5], 8>;
112 multiclass 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;
119 defm F0 : F<[]>;
120 defm F1 : F<[0]>;
121 defm F2 : F<[0, 1, 2]>;
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.
126 class G {
127   list<int> val = [0];
130 multiclass H<G g> {
131   foreach n = g.val in
132     def _#g#_#n;
135 def G0 : G;
137 foreach g = [G0] in
138   defm H0 : H<g>;