|
2 | 2 |
|
3 | 3 | import arch |
4 | 4 | import api.utils |
| 5 | +import api.config |
5 | 6 |
|
6 | 7 | from api.debug import __DEBUG__ |
7 | 8 | from api.identityset import IdentitySet |
|
11 | 12 | from .common import LABELS, JUMP_LABELS |
12 | 13 | from .errors import OptimizerInvalidBasicBlockError, OptimizerError |
13 | 14 | from .cpustate import CPUState |
14 | | -from ..peephole import engine |
15 | 15 | from ..peephole import evaluator |
16 | 16 |
|
17 | 17 | from . import helpers |
@@ -527,26 +527,29 @@ def compute_cpu_state(self): |
527 | 527 | for asm_line in self.code: |
528 | 528 | self.cpu.execute(asm_line) |
529 | 529 |
|
530 | | - def optimize(self): |
| 530 | + def optimize(self, patterns_list): |
531 | 531 | """ Tries to detect peep-hole patterns in this basic block |
532 | 532 | and remove them. |
533 | 533 | """ |
534 | 534 | if self.optimized: |
535 | 535 | return |
536 | 536 |
|
537 | | - filtered_patterns_list = [p for p in engine.PATTERNS if p.level >= 3] |
538 | 537 | changed = True |
539 | 538 | code = self.code |
540 | 539 | old_unary = dict(evaluator.Evaluator.UNARY) |
541 | 540 | evaluator.Evaluator.UNARY['GVAL'] = lambda x: self.cpu.get(x) |
542 | | - regs, mems = self.guesses_initial_state_from_origin_blocks() |
| 541 | + |
| 542 | + if api.config.OPTIONS.optimization.value > 3: |
| 543 | + regs, mems = self.guesses_initial_state_from_origin_blocks() |
| 544 | + else: |
| 545 | + regs, mems = {}, {} |
543 | 546 |
|
544 | 547 | while changed: |
545 | 548 | changed = False |
546 | 549 | self.cpu.reset(regs=regs, mems=mems) |
547 | 550 |
|
548 | 551 | for i, asm_line in enumerate(code): |
549 | | - for p in filtered_patterns_list: |
| 552 | + for p in patterns_list: |
550 | 553 | match = p.patt.match(code[i:]) |
551 | 554 | if match is None: # HINT: {} is also a valid match |
552 | 555 | continue |
@@ -651,7 +654,7 @@ def get_basic_blocks(block): |
651 | 654 | block = new_block |
652 | 655 | new_block = None |
653 | 656 |
|
654 | | - for i, mem in enumerate(block[:-1]): |
| 657 | + for i, mem in enumerate(block): |
655 | 658 | if i and mem.code == EDP: # END_PROGRAM label always starts a basic block |
656 | 659 | block, new_block = block_partition(block, i - 1) |
657 | 660 | LABELS[END_PROGRAM_LABEL].basic_block = new_block |
|
0 commit comments