def test_convert_jmpthenlabel_check():
    code = [
        p.LabelStmt("alreadySorted"),
        p.AssignOp(src="inbox", dst="emp"),
        p.IfOp("neg", [p.JumpOp("alreadySorted")], []),
        p.IfOp("ez", [p.JumpOp("alreadySorted")],
               [p.AssignOp(src="0", dst="emp")])
    ]
    expected_ast = [
        p.LabelStmt("alreadySorted"),
        p.AssignOp(src="inbox", dst="emp"),
        p.JumpCondOp(condition="jneg", label_name="alreadySorted"),
        # pass
        #    p.JumpOp("_hrm_endif_1"),
        # p.LabelStmt("_hrm_endif_1"),
        p.JumpCondOp(condition="jez", label_name="alreadySorted"),
        p.AssignOp(src="0", dst="emp")
        #    p.JumpOp("_hrm_unreachable"),
        # p.LabelStmt("_hrm_unreachable")
    ]
    result_ast = conversion.convert_ifnz_to_ifez(code)
    result_ast = conversion.convert_iftojump(result_ast)
    result_ast = conversion.compress_jumps(result_ast)
    result_ast = conversion.remove_unreachable_code(result_ast)

    ast = conversion.fix_jmp_then_label(result_ast)

    assert ast == expected_ast
def test_convert_jmpthenlabel_conditionaljumps_leading_to_same_instr():
    start_ast = [
        p.JumpCondOp(condition="ez", label_name="output"),
        p.LabelStmt("output"),
        p.OutboxOp()
    ]
    expected_ast = [p.OutboxOp()]
    ast = conversion.fix_jmp_then_label(start_ast)
    assert ast == expected_ast
def test_convert_jmpthenlabel_used_elsewhere():
    start_ast = [
        p.JumpOp(label_name="start"),
        p.LabelStmt("start"),
        p.AssignOp(src="inbox", dst="emp"),
        p.JumpOp("start")
    ]
    expected_ast = [
        p.LabelStmt("start"),
        p.AssignOp(src="inbox", dst="emp"),
        p.JumpOp("start")
    ]
    ast = conversion.fix_jmp_then_label(start_ast)
    assert ast == expected_ast
def test_convert_jmpthenlabel_conditionaljumps_multiple():
    start_ast = [
        p.JumpCondOp(condition="jneg", label_name="other"),
        p.JumpCondOp(condition="jez", label_name="output"),
        p.LabelStmt("output"),
        p.OutboxOp(),
        p.LabelStmt("other"),
        p.AssignOp(src="inbox", dst="emp")
    ]
    expected_ast = [
        p.JumpCondOp(condition="jneg", label_name="other"),
        p.OutboxOp(),
        p.LabelStmt("other"),
        p.AssignOp(src="inbox", dst="emp")
    ]
    ast = conversion.fix_jmp_then_label(start_ast)

    assert ast == expected_ast
Exemple #5
0
def calculate_optimized_ast(fhandle, args):
    result_ast = p.parse_it(fhandle)

    checker.perform_label_checks(result_ast)
    checker.perform_variable_checks(result_ast)

    result_ast = conversion.convert_ifnz_to_ifez(result_ast)
    result_ast = conversion.convert_iftojump(result_ast)
    if not args.no_jump_compression:
        result_ast = conversion.compress_jumps(result_ast)
    if not args.no_unreachable:
        result_ast = conversion.remove_unreachable_code(result_ast)
    if not args.no_jmp_then_label:
        unchanged = False
        while not unchanged:
            new_ast = conversion.fix_jmp_then_label(result_ast)
            unchanged = new_ast == result_ast
            result_ast = new_ast

    return result_ast
def test_convert_jmpthenlabel_not_remove_everything():
    code = [p.JumpOp("b"), p.LabelStmt("a")]
    code_ = [p.JumpOp("b"), p.LabelStmt("a"), p.OutboxOp()]

    assert code == conversion.fix_jmp_then_label(code)
    assert code_ == conversion.fix_jmp_then_label(code_)