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