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