OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "src/compiler/common-operator.h" |
| 6 #include "src/compiler/graph.h" |
| 7 #include "src/compiler/machine-operator.h" |
| 8 #include "src/compiler/node.h" |
| 9 #include "src/compiler/node-matchers.h" |
| 10 #include "src/compiler/opcodes.h" |
| 11 |
| 12 #include "test/unittests/compiler/graph-unittest.h" |
| 13 #include "test/unittests/test-utils.h" |
| 14 |
| 15 namespace v8 { |
| 16 namespace internal { |
| 17 namespace compiler { |
| 18 |
| 19 class NodeMatcherTest : public GraphTest { |
| 20 public: |
| 21 NodeMatcherTest() {} |
| 22 virtual ~NodeMatcherTest() {} |
| 23 |
| 24 MachineOperatorBuilder* machine() { return &machine_; } |
| 25 |
| 26 private: |
| 27 MachineOperatorBuilder machine_; |
| 28 }; |
| 29 |
| 30 namespace { |
| 31 |
| 32 void CheckScaledWithOffsetMatch(ScaledWithOffsetMatcher* matcher, Node* scaled, |
| 33 int scale_factor, Node* offset, |
| 34 Node* constant) { |
| 35 EXPECT_EQ(true, matcher->matches()); |
| 36 EXPECT_EQ(scaled, matcher->scaled()); |
| 37 EXPECT_EQ(scale_factor, matcher->scale_factor()); |
| 38 EXPECT_EQ(offset, matcher->offset()); |
| 39 EXPECT_EQ(constant, matcher->constant()); |
| 40 } |
| 41 }; |
| 42 |
| 43 |
| 44 TEST_F(NodeMatcherTest, ScaledWithOffsetMatcher) { |
| 45 graph()->SetStart(graph()->NewNode(common()->Start(0))); |
| 46 |
| 47 const Operator* c0_op = common()->Int32Constant(0); |
| 48 Node* c0 = graph()->NewNode(c0_op); |
| 49 USE(c0); |
| 50 const Operator* c1_op = common()->Int32Constant(1); |
| 51 Node* c1 = graph()->NewNode(c1_op); |
| 52 USE(c1); |
| 53 const Operator* c2_op = common()->Int32Constant(2); |
| 54 Node* c2 = graph()->NewNode(c2_op); |
| 55 USE(c2); |
| 56 const Operator* c3_op = common()->Int32Constant(3); |
| 57 Node* c3 = graph()->NewNode(c3_op); |
| 58 USE(c3); |
| 59 const Operator* c4_op = common()->Int32Constant(4); |
| 60 Node* c4 = graph()->NewNode(c4_op); |
| 61 USE(c4); |
| 62 const Operator* c8_op = common()->Int32Constant(8); |
| 63 Node* c8 = graph()->NewNode(c8_op); |
| 64 USE(c8); |
| 65 |
| 66 const Operator* o0_op = common()->Parameter(0); |
| 67 Node* o0 = graph()->NewNode(o0_op, graph()->start()); |
| 68 USE(o0); |
| 69 const Operator* o1_op = common()->Parameter(1); |
| 70 Node* o1 = graph()->NewNode(o1_op, graph()->start()); |
| 71 USE(o0); |
| 72 |
| 73 const Operator* p1_op = common()->Parameter(3); |
| 74 Node* p1 = graph()->NewNode(p1_op, graph()->start()); |
| 75 USE(p1); |
| 76 |
| 77 const Operator* a_op = machine()->Int32Add(); |
| 78 USE(a_op); |
| 79 |
| 80 const Operator* m_op = machine()->Int32Mul(); |
| 81 Node* m1 = graph()->NewNode(m_op, p1, c1); |
| 82 Node* m2 = graph()->NewNode(m_op, p1, c2); |
| 83 Node* m4 = graph()->NewNode(m_op, p1, c4); |
| 84 Node* m8 = graph()->NewNode(m_op, p1, c8); |
| 85 Node* m3 = graph()->NewNode(m_op, p1, c3); |
| 86 |
| 87 const Operator* s_op = machine()->Word32Shl(); |
| 88 Node* s0 = graph()->NewNode(s_op, p1, c0); |
| 89 Node* s1 = graph()->NewNode(s_op, p1, c1); |
| 90 Node* s2 = graph()->NewNode(s_op, p1, c2); |
| 91 Node* s3 = graph()->NewNode(s_op, p1, c3); |
| 92 Node* s4 = graph()->NewNode(s_op, p1, c4); |
| 93 |
| 94 // 1 INPUT |
| 95 |
| 96 // Only relevant test cases is checking for non-match. |
| 97 ScaledWithOffsetMatcher match0(c0); |
| 98 EXPECT_EQ(false, match0.matches()); |
| 99 |
| 100 // 2 INPUT |
| 101 |
| 102 // (O0 + O1) -> [O0, 0, O1, NULL] |
| 103 ScaledWithOffsetMatcher match1(graph()->NewNode(a_op, o0, o1)); |
| 104 CheckScaledWithOffsetMatch(&match1, o1, 0, o0, NULL); |
| 105 |
| 106 // (O0 + C0) -> [NULL, 0, O0, C0] |
| 107 ScaledWithOffsetMatcher match2(graph()->NewNode(a_op, o0, c0)); |
| 108 CheckScaledWithOffsetMatch(&match2, NULL, 0, o0, c0); |
| 109 |
| 110 // (C0 + O0) -> [NULL, 0, O0, C0] |
| 111 ScaledWithOffsetMatcher match3(graph()->NewNode(a_op, c0, o0)); |
| 112 CheckScaledWithOffsetMatch(&match3, NULL, 0, o0, c0); |
| 113 |
| 114 // (O0 + M1) -> [p1, 0, O0, NULL] |
| 115 ScaledWithOffsetMatcher match4(graph()->NewNode(a_op, o0, m1)); |
| 116 CheckScaledWithOffsetMatch(&match4, p1, 0, o0, NULL); |
| 117 |
| 118 // (M1 + O0) -> [p1, 0, O0, NULL] |
| 119 m1 = graph()->NewNode(m_op, p1, c1); |
| 120 ScaledWithOffsetMatcher match5(graph()->NewNode(a_op, m1, o0)); |
| 121 CheckScaledWithOffsetMatch(&match5, p1, 0, o0, NULL); |
| 122 |
| 123 // (C0 + M1) -> [P1, 0, NULL, C0] |
| 124 m1 = graph()->NewNode(m_op, p1, c1); |
| 125 ScaledWithOffsetMatcher match6(graph()->NewNode(a_op, c0, m1)); |
| 126 CheckScaledWithOffsetMatch(&match6, p1, 0, NULL, c0); |
| 127 |
| 128 // (M1 + C0) -> [P1, 0, NULL, C0] |
| 129 m1 = graph()->NewNode(m_op, p1, c1); |
| 130 ScaledWithOffsetMatcher match7(graph()->NewNode(a_op, m1, c0)); |
| 131 CheckScaledWithOffsetMatch(&match7, p1, 0, NULL, c0); |
| 132 |
| 133 // (O0 + S0) -> [p1, 0, O0, NULL] |
| 134 ScaledWithOffsetMatcher match8(graph()->NewNode(a_op, o0, s0)); |
| 135 CheckScaledWithOffsetMatch(&match8, p1, 0, o0, NULL); |
| 136 |
| 137 // (S0 + O0) -> [p1, 0, O0, NULL] |
| 138 s0 = graph()->NewNode(s_op, p1, c0); |
| 139 ScaledWithOffsetMatcher match9(graph()->NewNode(a_op, s0, o0)); |
| 140 CheckScaledWithOffsetMatch(&match9, p1, 0, o0, NULL); |
| 141 |
| 142 // (C0 + S0) -> [P1, 0, NULL, C0] |
| 143 s0 = graph()->NewNode(s_op, p1, c0); |
| 144 ScaledWithOffsetMatcher match10(graph()->NewNode(a_op, c0, s0)); |
| 145 CheckScaledWithOffsetMatch(&match10, p1, 0, NULL, c0); |
| 146 |
| 147 // (S0 + C0) -> [P1, 0, NULL, C0] |
| 148 s0 = graph()->NewNode(s_op, p1, c0); |
| 149 ScaledWithOffsetMatcher match11(graph()->NewNode(a_op, s0, c0)); |
| 150 CheckScaledWithOffsetMatch(&match11, p1, 0, NULL, c0); |
| 151 |
| 152 // (O0 + M2) -> [p1, 1, O0, NULL] |
| 153 ScaledWithOffsetMatcher match12(graph()->NewNode(a_op, o0, m2)); |
| 154 CheckScaledWithOffsetMatch(&match12, p1, 1, o0, NULL); |
| 155 |
| 156 // (M2 + O0) -> [p1, 1, O0, NULL] |
| 157 m2 = graph()->NewNode(m_op, p1, c2); |
| 158 ScaledWithOffsetMatcher match13(graph()->NewNode(a_op, m2, o0)); |
| 159 CheckScaledWithOffsetMatch(&match13, p1, 1, o0, NULL); |
| 160 |
| 161 // (C0 + M2) -> [P1, 1, NULL, C0] |
| 162 m2 = graph()->NewNode(m_op, p1, c2); |
| 163 ScaledWithOffsetMatcher match14(graph()->NewNode(a_op, c0, m2)); |
| 164 CheckScaledWithOffsetMatch(&match14, p1, 1, NULL, c0); |
| 165 |
| 166 // (M2 + C0) -> [P1, 1, NULL, C0] |
| 167 m2 = graph()->NewNode(m_op, p1, c2); |
| 168 ScaledWithOffsetMatcher match15(graph()->NewNode(a_op, m2, c0)); |
| 169 CheckScaledWithOffsetMatch(&match15, p1, 1, NULL, c0); |
| 170 |
| 171 // (O0 + S1) -> [p1, 1, O0, NULL] |
| 172 ScaledWithOffsetMatcher match16(graph()->NewNode(a_op, o0, s1)); |
| 173 CheckScaledWithOffsetMatch(&match16, p1, 1, o0, NULL); |
| 174 |
| 175 // (S1 + O0) -> [p1, 1, O0, NULL] |
| 176 s1 = graph()->NewNode(s_op, p1, c1); |
| 177 ScaledWithOffsetMatcher match17(graph()->NewNode(a_op, s1, o0)); |
| 178 CheckScaledWithOffsetMatch(&match17, p1, 1, o0, NULL); |
| 179 |
| 180 // (C0 + S1) -> [P1, 1, NULL, C0] |
| 181 s1 = graph()->NewNode(s_op, p1, c1); |
| 182 ScaledWithOffsetMatcher match18(graph()->NewNode(a_op, c0, s1)); |
| 183 CheckScaledWithOffsetMatch(&match18, p1, 1, NULL, c0); |
| 184 |
| 185 // (S1 + C0) -> [P1, 1, NULL, C0] |
| 186 s1 = graph()->NewNode(s_op, p1, c1); |
| 187 ScaledWithOffsetMatcher match19(graph()->NewNode(a_op, s1, c0)); |
| 188 CheckScaledWithOffsetMatch(&match19, p1, 1, NULL, c0); |
| 189 |
| 190 // (O0 + M4) -> [p1, 2, O0, NULL] |
| 191 ScaledWithOffsetMatcher match20(graph()->NewNode(a_op, o0, m4)); |
| 192 CheckScaledWithOffsetMatch(&match20, p1, 2, o0, NULL); |
| 193 |
| 194 // (M4 + O0) -> [p1, 2, O0, NULL] |
| 195 m4 = graph()->NewNode(m_op, p1, c4); |
| 196 ScaledWithOffsetMatcher match21(graph()->NewNode(a_op, m4, o0)); |
| 197 CheckScaledWithOffsetMatch(&match21, p1, 2, o0, NULL); |
| 198 |
| 199 // (C0 + M4) -> [p1, 2, NULL, C0] |
| 200 m4 = graph()->NewNode(m_op, p1, c4); |
| 201 ScaledWithOffsetMatcher match22(graph()->NewNode(a_op, c0, m4)); |
| 202 CheckScaledWithOffsetMatch(&match22, p1, 2, NULL, c0); |
| 203 |
| 204 // (M4 + C0) -> [p1, 2, NULL, C0] |
| 205 m4 = graph()->NewNode(m_op, p1, c4); |
| 206 ScaledWithOffsetMatcher match23(graph()->NewNode(a_op, m4, c0)); |
| 207 CheckScaledWithOffsetMatch(&match23, p1, 2, NULL, c0); |
| 208 |
| 209 // (O0 + S2) -> [p1, 2, O0, NULL] |
| 210 ScaledWithOffsetMatcher match24(graph()->NewNode(a_op, o0, s2)); |
| 211 CheckScaledWithOffsetMatch(&match24, p1, 2, o0, NULL); |
| 212 |
| 213 // (S2 + O0) -> [p1, 2, O0, NULL] |
| 214 s2 = graph()->NewNode(s_op, p1, c2); |
| 215 ScaledWithOffsetMatcher match25(graph()->NewNode(a_op, s2, o0)); |
| 216 CheckScaledWithOffsetMatch(&match25, p1, 2, o0, NULL); |
| 217 |
| 218 // (C0 + S2) -> [p1, 2, NULL, C0] |
| 219 s2 = graph()->NewNode(s_op, p1, c2); |
| 220 ScaledWithOffsetMatcher match26(graph()->NewNode(a_op, c0, s2)); |
| 221 CheckScaledWithOffsetMatch(&match26, p1, 2, NULL, c0); |
| 222 |
| 223 // (S2 + C0) -> [p1, 2, NULL, C0] |
| 224 s2 = graph()->NewNode(s_op, p1, c2); |
| 225 ScaledWithOffsetMatcher match27(graph()->NewNode(a_op, s2, c0)); |
| 226 CheckScaledWithOffsetMatch(&match27, p1, 2, NULL, c0); |
| 227 |
| 228 // (O0 + M8) -> [p1, 2, O0, NULL] |
| 229 ScaledWithOffsetMatcher match28(graph()->NewNode(a_op, o0, m8)); |
| 230 CheckScaledWithOffsetMatch(&match28, p1, 3, o0, NULL); |
| 231 |
| 232 // (M8 + O0) -> [p1, 2, O0, NULL] |
| 233 m8 = graph()->NewNode(m_op, p1, c8); |
| 234 ScaledWithOffsetMatcher match29(graph()->NewNode(a_op, m8, o0)); |
| 235 CheckScaledWithOffsetMatch(&match29, p1, 3, o0, NULL); |
| 236 |
| 237 // (C0 + M8) -> [p1, 2, NULL, C0] |
| 238 m8 = graph()->NewNode(m_op, p1, c8); |
| 239 ScaledWithOffsetMatcher match30(graph()->NewNode(a_op, c0, m8)); |
| 240 CheckScaledWithOffsetMatch(&match30, p1, 3, NULL, c0); |
| 241 |
| 242 // (M8 + C0) -> [p1, 2, NULL, C0] |
| 243 m8 = graph()->NewNode(m_op, p1, c8); |
| 244 ScaledWithOffsetMatcher match31(graph()->NewNode(a_op, m8, c0)); |
| 245 CheckScaledWithOffsetMatch(&match31, p1, 3, NULL, c0); |
| 246 |
| 247 // (O0 + S3) -> [p1, 2, O0, NULL] |
| 248 ScaledWithOffsetMatcher match32(graph()->NewNode(a_op, o0, s3)); |
| 249 CheckScaledWithOffsetMatch(&match32, p1, 3, o0, NULL); |
| 250 |
| 251 // (S3 + O0) -> [p1, 2, O0, NULL] |
| 252 s3 = graph()->NewNode(s_op, p1, c3); |
| 253 ScaledWithOffsetMatcher match33(graph()->NewNode(a_op, s3, o0)); |
| 254 CheckScaledWithOffsetMatch(&match33, p1, 3, o0, NULL); |
| 255 |
| 256 // (C0 + S3) -> [p1, 2, NULL, C0] |
| 257 s3 = graph()->NewNode(s_op, p1, c3); |
| 258 ScaledWithOffsetMatcher match34(graph()->NewNode(a_op, c0, s3)); |
| 259 CheckScaledWithOffsetMatch(&match34, p1, 3, NULL, c0); |
| 260 |
| 261 // (S3 + C0) -> [p1, 2, NULL, C0] |
| 262 s3 = graph()->NewNode(s_op, p1, c3); |
| 263 ScaledWithOffsetMatcher match35(graph()->NewNode(a_op, s3, c0)); |
| 264 CheckScaledWithOffsetMatch(&match35, p1, 3, NULL, c0); |
| 265 |
| 266 // 2 INPUT - NEGATIVE CASES |
| 267 |
| 268 // (M3 + O1) -> [O0, 0, M3, NULL] |
| 269 ScaledWithOffsetMatcher match36(graph()->NewNode(a_op, o1, m3)); |
| 270 CheckScaledWithOffsetMatch(&match36, m3, 0, o1, NULL); |
| 271 |
| 272 // (S4 + O1) -> [O0, 0, S4, NULL] |
| 273 ScaledWithOffsetMatcher match37(graph()->NewNode(a_op, o1, s4)); |
| 274 CheckScaledWithOffsetMatch(&match37, s4, 0, o1, NULL); |
| 275 |
| 276 // 3 INPUT |
| 277 |
| 278 // (C0 + S3) + O0 -> [p1, 2, o0, c0] |
| 279 s3 = graph()->NewNode(s_op, p1, c3); |
| 280 ScaledWithOffsetMatcher match38( |
| 281 graph()->NewNode(a_op, graph()->NewNode(a_op, c0, s3), o0)); |
| 282 CheckScaledWithOffsetMatch(&match38, p1, 3, o0, c0); |
| 283 |
| 284 // (O0 + C0) + S3 -> [p1, 2, o0, c0] |
| 285 s3 = graph()->NewNode(s_op, p1, c3); |
| 286 ScaledWithOffsetMatcher match39( |
| 287 graph()->NewNode(a_op, graph()->NewNode(a_op, o0, c0), s3)); |
| 288 CheckScaledWithOffsetMatch(&match39, p1, 3, o0, c0); |
| 289 |
| 290 // (S3 + O0) + C0 -> [p1, 2, o0, c0] |
| 291 s3 = graph()->NewNode(s_op, p1, c3); |
| 292 ScaledWithOffsetMatcher match40( |
| 293 graph()->NewNode(a_op, graph()->NewNode(a_op, s3, o0), c0)); |
| 294 CheckScaledWithOffsetMatch(&match40, p1, 3, o0, c0); |
| 295 |
| 296 // C0 + (S3 + O0) -> [p1, 2, o0, c0] |
| 297 s3 = graph()->NewNode(s_op, p1, c3); |
| 298 ScaledWithOffsetMatcher match41( |
| 299 graph()->NewNode(a_op, c0, graph()->NewNode(a_op, s3, o0))); |
| 300 CheckScaledWithOffsetMatch(&match41, p1, 3, o0, c0); |
| 301 |
| 302 // O0 + (C0 + S3) -> [p1, 2, o0, c0] |
| 303 s3 = graph()->NewNode(s_op, p1, c3); |
| 304 ScaledWithOffsetMatcher match42( |
| 305 graph()->NewNode(a_op, o0, graph()->NewNode(a_op, c0, s3))); |
| 306 CheckScaledWithOffsetMatch(&match42, p1, 3, o0, c0); |
| 307 |
| 308 // S3 + (O0 + C0) -> [p1, 2, o0, c0] |
| 309 s3 = graph()->NewNode(s_op, p1, c3); |
| 310 ScaledWithOffsetMatcher match43( |
| 311 graph()->NewNode(a_op, s3, graph()->NewNode(a_op, o0, c0))); |
| 312 CheckScaledWithOffsetMatch(&match43, p1, 3, o0, c0); |
| 313 } |
| 314 |
| 315 } // namespace compiler |
| 316 } // namespace internal |
| 317 } // namespace v8 |
OLD | NEW |