mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
3d86bcfc2f
If multiclass argument comes from loop varaible and argument is record type, it will not recognize the type. This patch ensures that loop variables are resolved correctly. Differential Revision: https://reviews.llvm.org/D95308
139 lines
2.1 KiB
TableGen
139 lines
2.1 KiB
TableGen
// 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>;
|