xref: /aosp_15_r20/external/llvm/test/TableGen/SetTheory.td (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker// Test evaluation of set operations in dags.
2*9880d681SAndroid Build Coastguard Worker// RUN: llvm-tblgen -print-sets %s | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker// XFAIL: vg_leak
4*9880d681SAndroid Build Coastguard Worker//
5*9880d681SAndroid Build Coastguard Worker// The -print-sets driver configures a primitive SetTheory instance that
6*9880d681SAndroid Build Coastguard Worker// understands these sets:
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerclass Set<dag d> {
9*9880d681SAndroid Build Coastguard Worker  dag Elements = d;
10*9880d681SAndroid Build Coastguard Worker}
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker// It prints all Set instances and their ordered set interpretation.
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker// Define some elements.
15*9880d681SAndroid Build Coastguard Workerdef a;
16*9880d681SAndroid Build Coastguard Workerdef b;
17*9880d681SAndroid Build Coastguard Workerdef c;
18*9880d681SAndroid Build Coastguard Workerdef d;
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker// The 'add' operator evaluates and concatenates its arguments.
21*9880d681SAndroid Build Coastguard Workerdef add;
22*9880d681SAndroid Build Coastguard Workerdef S0a : Set<(add)>;
23*9880d681SAndroid Build Coastguard Workerdef S0b : Set<(add a)>;
24*9880d681SAndroid Build Coastguard Workerdef S0c : Set<(add a, b)>;
25*9880d681SAndroid Build Coastguard Workerdef S0d : Set<(add b, a)>;
26*9880d681SAndroid Build Coastguard Workerdef S0e : Set<(add a, a)>;
27*9880d681SAndroid Build Coastguard Workerdef S0f : Set<(add a, a, b, a, c, b, d, a)>;
28*9880d681SAndroid Build Coastguard Workerdef S0g : Set<(add b, a, b)>;
29*9880d681SAndroid Build Coastguard Worker// CHECK: S0a = [ ]
30*9880d681SAndroid Build Coastguard Worker// CHECK: S0b = [ a ]
31*9880d681SAndroid Build Coastguard Worker// CHECK: S0c = [ a b ]
32*9880d681SAndroid Build Coastguard Worker// CHECK: S0d = [ b a ]
33*9880d681SAndroid Build Coastguard Worker// CHECK: S0e = [ a ]
34*9880d681SAndroid Build Coastguard Worker// CHECK: S0f = [ a b c d ]
35*9880d681SAndroid Build Coastguard Worker// CHECK: S0g = [ b a ]
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker// Defs of Set class expand into their elements.
38*9880d681SAndroid Build Coastguard Worker// Mixed sets and elements are flattened.
39*9880d681SAndroid Build Coastguard Workerdef S1a : Set<(add S0a)>;
40*9880d681SAndroid Build Coastguard Workerdef S1b : Set<(add S0a, S0a)>;
41*9880d681SAndroid Build Coastguard Workerdef S1c : Set<(add S0d, S0f)>;
42*9880d681SAndroid Build Coastguard Workerdef S1d : Set<(add d, S0d, S0f)>;
43*9880d681SAndroid Build Coastguard Worker// CHECK: S1a = [ ]
44*9880d681SAndroid Build Coastguard Worker// CHECK: S1b = [ ]
45*9880d681SAndroid Build Coastguard Worker// CHECK: S1c = [ b a c d ]
46*9880d681SAndroid Build Coastguard Worker// CHECK: S1d = [ d b a c ]
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker// The 'sub' operator returns the first argument with the following arguments
49*9880d681SAndroid Build Coastguard Worker// removed.
50*9880d681SAndroid Build Coastguard Workerdef sub;
51*9880d681SAndroid Build Coastguard Workerdef S2a : Set<(sub S1a, S1c)>;
52*9880d681SAndroid Build Coastguard Workerdef S2b : Set<(sub S1c, S1d)>;
53*9880d681SAndroid Build Coastguard Workerdef S2c : Set<(sub S1c, b)>;
54*9880d681SAndroid Build Coastguard Workerdef S2d : Set<(sub S1c, S0c)>;
55*9880d681SAndroid Build Coastguard Workerdef S2e : Set<(sub S1c, S2d)>;
56*9880d681SAndroid Build Coastguard Worker// CHECK: S2a = [ ]
57*9880d681SAndroid Build Coastguard Worker// CHECK: S2b = [ ]
58*9880d681SAndroid Build Coastguard Worker// CHECK: S2c = [ a c d ]
59*9880d681SAndroid Build Coastguard Worker// CHECK: S2d = [ c d ]
60*9880d681SAndroid Build Coastguard Worker// CHECK: S2e = [ b a ]
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker// The 'and' operator intersects two sets. The result has the same order as the
63*9880d681SAndroid Build Coastguard Worker// first argument.
64*9880d681SAndroid Build Coastguard Workerdef and;
65*9880d681SAndroid Build Coastguard Workerdef S3a : Set<(and S2d, S2e)>;
66*9880d681SAndroid Build Coastguard Workerdef S3b : Set<(and S2d, S1d)>;
67*9880d681SAndroid Build Coastguard Worker// CHECK: S3a = [ ]
68*9880d681SAndroid Build Coastguard Worker// CHECK: S3b = [ c d ]
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker// The 'shl' operator removes the first N elements.
71*9880d681SAndroid Build Coastguard Workerdef shl;
72*9880d681SAndroid Build Coastguard Workerdef S4a : Set<(shl S0f, 0)>;
73*9880d681SAndroid Build Coastguard Workerdef S4b : Set<(shl S0f, 1)>;
74*9880d681SAndroid Build Coastguard Workerdef S4c : Set<(shl S0f, 3)>;
75*9880d681SAndroid Build Coastguard Workerdef S4d : Set<(shl S0f, 4)>;
76*9880d681SAndroid Build Coastguard Workerdef S4e : Set<(shl S0f, 5)>;
77*9880d681SAndroid Build Coastguard Worker// CHECK: S4a = [ a b c d ]
78*9880d681SAndroid Build Coastguard Worker// CHECK: S4b = [ b c d ]
79*9880d681SAndroid Build Coastguard Worker// CHECK: S4c = [ d ]
80*9880d681SAndroid Build Coastguard Worker// CHECK: S4d = [ ]
81*9880d681SAndroid Build Coastguard Worker// CHECK: S4e = [ ]
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker// The 'trunc' operator truncates after the first N elements.
84*9880d681SAndroid Build Coastguard Workerdef trunc;
85*9880d681SAndroid Build Coastguard Workerdef S5a : Set<(trunc S0f, 0)>;
86*9880d681SAndroid Build Coastguard Workerdef S5b : Set<(trunc S0f, 1)>;
87*9880d681SAndroid Build Coastguard Workerdef S5c : Set<(trunc S0f, 3)>;
88*9880d681SAndroid Build Coastguard Workerdef S5d : Set<(trunc S0f, 4)>;
89*9880d681SAndroid Build Coastguard Workerdef S5e : Set<(trunc S0f, 5)>;
90*9880d681SAndroid Build Coastguard Worker// CHECK: S5a = [ ]
91*9880d681SAndroid Build Coastguard Worker// CHECK: S5b = [ a ]
92*9880d681SAndroid Build Coastguard Worker// CHECK: S5c = [ a b c ]
93*9880d681SAndroid Build Coastguard Worker// CHECK: S5d = [ a b c d ]
94*9880d681SAndroid Build Coastguard Worker// CHECK: S5e = [ a b c d ]
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker// The 'rotl' operator rotates left, but also accepts a negative shift.
97*9880d681SAndroid Build Coastguard Workerdef rotl;
98*9880d681SAndroid Build Coastguard Workerdef S6a : Set<(rotl S0f, 0)>;
99*9880d681SAndroid Build Coastguard Workerdef S6b : Set<(rotl S0f, 1)>;
100*9880d681SAndroid Build Coastguard Workerdef S6c : Set<(rotl S0f, 3)>;
101*9880d681SAndroid Build Coastguard Workerdef S6d : Set<(rotl S0f, 4)>;
102*9880d681SAndroid Build Coastguard Workerdef S6e : Set<(rotl S0f, 5)>;
103*9880d681SAndroid Build Coastguard Workerdef S6f : Set<(rotl S0f, -1)>;
104*9880d681SAndroid Build Coastguard Workerdef S6g : Set<(rotl S0f, -4)>;
105*9880d681SAndroid Build Coastguard Workerdef S6h : Set<(rotl S0f, -5)>;
106*9880d681SAndroid Build Coastguard Worker// CHECK: S6a = [ a b c d ]
107*9880d681SAndroid Build Coastguard Worker// CHECK: S6b = [ b c d a ]
108*9880d681SAndroid Build Coastguard Worker// CHECK: S6c = [ d a b c ]
109*9880d681SAndroid Build Coastguard Worker// CHECK: S6d = [ a b c d ]
110*9880d681SAndroid Build Coastguard Worker// CHECK: S6e = [ b c d a ]
111*9880d681SAndroid Build Coastguard Worker// CHECK: S6f = [ d a b c ]
112*9880d681SAndroid Build Coastguard Worker// CHECK: S6g = [ a b c d ]
113*9880d681SAndroid Build Coastguard Worker// CHECK: S6h = [ d a b c ]
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker// The 'rotr' operator rotates right, but also accepts a negative shift.
116*9880d681SAndroid Build Coastguard Workerdef rotr;
117*9880d681SAndroid Build Coastguard Workerdef S7a : Set<(rotr S0f, 0)>;
118*9880d681SAndroid Build Coastguard Workerdef S7b : Set<(rotr S0f, 1)>;
119*9880d681SAndroid Build Coastguard Workerdef S7c : Set<(rotr S0f, 3)>;
120*9880d681SAndroid Build Coastguard Workerdef S7d : Set<(rotr S0f, 4)>;
121*9880d681SAndroid Build Coastguard Workerdef S7e : Set<(rotr S0f, 5)>;
122*9880d681SAndroid Build Coastguard Workerdef S7f : Set<(rotr S0f, -1)>;
123*9880d681SAndroid Build Coastguard Workerdef S7g : Set<(rotr S0f, -4)>;
124*9880d681SAndroid Build Coastguard Workerdef S7h : Set<(rotr S0f, -5)>;
125*9880d681SAndroid Build Coastguard Worker// CHECK: S7a = [ a b c d ]
126*9880d681SAndroid Build Coastguard Worker// CHECK: S7b = [ d a b c ]
127*9880d681SAndroid Build Coastguard Worker// CHECK: S7c = [ b c d a ]
128*9880d681SAndroid Build Coastguard Worker// CHECK: S7d = [ a b c d ]
129*9880d681SAndroid Build Coastguard Worker// CHECK: S7e = [ d a b c ]
130*9880d681SAndroid Build Coastguard Worker// CHECK: S7f = [ b c d a ]
131*9880d681SAndroid Build Coastguard Worker// CHECK: S7g = [ a b c d ]
132*9880d681SAndroid Build Coastguard Worker// CHECK: S7h = [ b c d a ]
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker// The 'decimate' operator picks every N'th element.
135*9880d681SAndroid Build Coastguard Workerdef decimate;
136*9880d681SAndroid Build Coastguard Workerdef e0;
137*9880d681SAndroid Build Coastguard Workerdef e1;
138*9880d681SAndroid Build Coastguard Workerdef e2;
139*9880d681SAndroid Build Coastguard Workerdef e3;
140*9880d681SAndroid Build Coastguard Workerdef e4;
141*9880d681SAndroid Build Coastguard Workerdef e5;
142*9880d681SAndroid Build Coastguard Workerdef e6;
143*9880d681SAndroid Build Coastguard Workerdef e7;
144*9880d681SAndroid Build Coastguard Workerdef e8;
145*9880d681SAndroid Build Coastguard Workerdef e9;
146*9880d681SAndroid Build Coastguard Workerdef E : Set<(add e0, e1, e2, e3, e4, e5, e6, e7, e8, e9)>;
147*9880d681SAndroid Build Coastguard Workerdef S8a : Set<(decimate E, 3)>;
148*9880d681SAndroid Build Coastguard Workerdef S8b : Set<(decimate E, 9)>;
149*9880d681SAndroid Build Coastguard Workerdef S8c : Set<(decimate E, 10)>;
150*9880d681SAndroid Build Coastguard Workerdef S8d : Set<(decimate (rotl E, 1), 2)>;
151*9880d681SAndroid Build Coastguard Workerdef S8e : Set<(add (decimate E, 2), (decimate (rotl E, 1), 2))>;
152*9880d681SAndroid Build Coastguard Worker// CHECK: S8a = [ e0 e3 e6 e9 ]
153*9880d681SAndroid Build Coastguard Worker// CHECK: S8b = [ e0 e9 ]
154*9880d681SAndroid Build Coastguard Worker// CHECK: S8c = [ e0 ]
155*9880d681SAndroid Build Coastguard Worker// CHECK: S8d = [ e1 e3 e5 e7 e9 ]
156*9880d681SAndroid Build Coastguard Worker// CHECK: S8e = [ e0 e2 e4 e6 e8 e1 e3 e5 e7 e9 ]
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Worker// The 'sequence' operator finds a sequence of records from their name.
159*9880d681SAndroid Build Coastguard Workerdef sequence;
160*9880d681SAndroid Build Coastguard Workerdef S9a : Set<(sequence "e%u", 3, 7)>;
161*9880d681SAndroid Build Coastguard Workerdef S9b : Set<(sequence "e%u", 7, 3)>;
162*9880d681SAndroid Build Coastguard Workerdef S9c : Set<(sequence "e%u", 0, 0)>;
163*9880d681SAndroid Build Coastguard Workerdef S9d : Set<(sequence "S%ua", 7, 9)>;
164*9880d681SAndroid Build Coastguard Workerdef S9e : Set<(sequence "e%u", 3, 6, 2)>;
165*9880d681SAndroid Build Coastguard Worker// CHECK: S9a = [ e3 e4 e5 e6 e7 ]
166*9880d681SAndroid Build Coastguard Worker// CHECK: S9b = [ e7 e6 e5 e4 e3 ]
167*9880d681SAndroid Build Coastguard Worker// CHECK: S9c = [ e0 ]
168*9880d681SAndroid Build Coastguard Worker// CHECK: S9d = [ a b c d e0 e3 e6 e9 e4 e5 e7 ]
169*9880d681SAndroid Build Coastguard Worker// CHECK: S9e = [ e3 e5 ]
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Worker// The 'interleave' operator is almost the inverse of 'decimate'.
172*9880d681SAndroid Build Coastguard Workerdef interleave;
173*9880d681SAndroid Build Coastguard Workerdef T0a : Set<(interleave S9a, S9b)>;
174*9880d681SAndroid Build Coastguard Workerdef T0b : Set<(interleave S8e, S8d)>;
175*9880d681SAndroid Build Coastguard Worker// CHECK: T0a = [ e3 e7 e4 e6 e5 ]
176*9880d681SAndroid Build Coastguard Worker// CHECK: T0b = [ e0 e1 e2 e3 e4 e5 e6 e7 e8 e9 ]
177