| 301 | // ============================================================================ |
| 302 | |
| 303 | Error RAPass::removeUnreachableCode() { |
| 304 | ZoneList<CBNode*>::Link* link = _unreachableList.getFirst(); |
| 305 | CBNode* stop = getStop(); |
| 306 | |
| 307 | while (link) { |
| 308 | CBNode* node = link->getValue(); |
| 309 | if (node && node->getPrev() && node != stop) { |
| 310 | // Locate all unreachable nodes. |
| 311 | CBNode* first = node; |
| 312 | do { |
| 313 | if (node->hasPassData()) break; |
| 314 | node = node->getNext(); |
| 315 | } while (node != stop); |
| 316 | |
| 317 | // Remove unreachable nodes that are neither informative nor directives. |
| 318 | if (node != first) { |
| 319 | CBNode* end = node; |
| 320 | node = first; |
| 321 | |
| 322 | // NOTE: The strategy is as follows: |
| 323 | // 1. The algorithm removes everything until it finds a first label. |
| 324 | // 2. After the first label is found it removes only removable nodes. |
| 325 | bool removeEverything = true; |
| 326 | do { |
| 327 | CBNode* next = node->getNext(); |
| 328 | bool remove = node->isRemovable(); |
| 329 | |
| 330 | if (!remove) { |
| 331 | if (node->isLabel()) |
| 332 | removeEverything = false; |
| 333 | remove = removeEverything; |
| 334 | } |
| 335 | |
| 336 | if (remove) |
| 337 | cc()->removeNode(node); |
| 338 | |
| 339 | node = next; |
| 340 | } while (node != end); |
| 341 | } |
| 342 | } |
| 343 | |
| 344 | link = link->getNext(); |
| 345 | } |
| 346 | |
| 347 | return kErrorOk; |
| 348 | } |
| 349 | |
| 350 | // ============================================================================ |
| 351 | // [asmjit::RAPass - Liveness Analysis] |
nothing calls this directly
no test coverage detected