Jakob Stoklund Olesen | 1de9982 | 2011-06-04 04:11:37 +0000 | [diff] [blame] | 1 | // Test evaluation of set operations in dags. |
| 2 | // RUN: 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 | // CHECK: S9a = [ e3 e4 e5 e6 e7 ] |
| 165 | // CHECK: S9b = [ e7 e6 e5 e4 e3 ] |
| 166 | // CHECK: S9c = [ e0 ] |
| 167 | // CHECK: S9d = [ a b c d e0 e3 e6 e9 e4 e5 e7 ] |