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