diff options
Diffstat (limited to 'llvm/utils/update_mir_test_checks.py')
| -rwxr-xr-x | llvm/utils/update_mir_test_checks.py | 121 | 
1 files changed, 3 insertions, 118 deletions
| diff --git a/llvm/utils/update_mir_test_checks.py b/llvm/utils/update_mir_test_checks.py index c4ee052..ba70249 100755 --- a/llvm/utils/update_mir_test_checks.py +++ b/llvm/utils/update_mir_test_checks.py @@ -31,39 +31,7 @@ import subprocess  import sys  from UpdateTestChecks import common - -VREG_RE = re.compile(r"(%[0-9]+)(?:\.[a-z0-9_]+)?(?::[a-z0-9_]+)?(?:\([<>a-z0-9 ]+\))?") -MI_FLAGS_STR = ( -    r"(frame-setup |frame-destroy |nnan |ninf |nsz |arcp |contract |afn " -    r"|reassoc |nuw |nsw |exact |nofpexcept |nomerge |unpredictable " -    r"|noconvergent |nneg |disjoint |nusw |samesign |inbounds )*" -) -VREG_DEF_FLAGS_STR = r"(?:dead |undef )*" - -# Pattern to match the defined vregs and the opcode of an instruction that -# defines vregs. Opcodes starting with a lower-case 't' are allowed to match -# ARM's thumb instructions, like tADDi8 and t2ADDri. -VREG_DEF_RE = re.compile( -    r"^ *(?P<vregs>{2}{0}(?:, {2}{0})*) = " -    r"{1}(?P<opcode>[A-Zt][A-Za-z0-9_]+)".format( -        VREG_RE.pattern, MI_FLAGS_STR, VREG_DEF_FLAGS_STR -    ) -) - -MIR_FUNC_RE = re.compile( -    r"^---$" -    r"\n" -    r"^ *name: *(?P<func>[A-Za-z0-9_.-]+)$" -    r".*?" -    r"(?:^ *fixedStack: *(\[\])? *\n" -    r"(?P<fixedStack>.*?)\n?" -    r"^ *stack:" -    r".*?)?" -    r"^ *body: *\|\n" -    r"(?P<body>.*?)\n" -    r"^\.\.\.$", -    flags=(re.M | re.S), -) +from UpdateTestChecks import mir  class LLC: @@ -143,89 +111,6 @@ def build_run_list(test, run_lines, verbose=False):      return run_list -def build_function_info_dictionary( -    test, raw_tool_output, triple, prefixes, func_dict, verbose -): -    for m in MIR_FUNC_RE.finditer(raw_tool_output): -        func = m.group("func") -        fixedStack = m.group("fixedStack") -        body = m.group("body") -        if verbose: -            log("Processing function: {}".format(func)) -            for l in body.splitlines(): -                log("  {}".format(l)) - -        # Vreg mangling -        mangled = [] -        vreg_map = {} -        for func_line in body.splitlines(keepends=True): -            m = VREG_DEF_RE.match(func_line) -            if m: -                for vreg in VREG_RE.finditer(m.group("vregs")): -                    if vreg.group(1) in vreg_map: -                        name = vreg_map[vreg.group(1)] -                    else: -                        name = mangle_vreg(m.group("opcode"), vreg_map.values()) -                        vreg_map[vreg.group(1)] = name -                    func_line = func_line.replace( -                        vreg.group(1), "[[{}:%[0-9]+]]".format(name), 1 -                    ) -            for number, name in vreg_map.items(): -                func_line = re.sub( -                    r"{}\b".format(number), "[[{}]]".format(name), func_line -                ) -            mangled.append(func_line) -        body = "".join(mangled) - -        for prefix in prefixes: -            info = common.function_body( -                body, fixedStack, None, None, None, None, ginfo=None -            ) -            if func in func_dict[prefix]: -                if ( -                    not func_dict[prefix][func] -                    or func_dict[prefix][func].scrub != info.scrub -                    or func_dict[prefix][func].extrascrub != info.extrascrub -                ): -                    func_dict[prefix][func] = None -            else: -                func_dict[prefix][func] = info - - -def mangle_vreg(opcode, current_names): -    base = opcode -    # Simplify some common prefixes and suffixes -    if opcode.startswith("G_"): -        base = base[len("G_") :] -    if opcode.endswith("_PSEUDO"): -        base = base[: len("_PSEUDO")] -    # Shorten some common opcodes with long-ish names -    base = dict( -        IMPLICIT_DEF="DEF", -        GLOBAL_VALUE="GV", -        CONSTANT="C", -        FCONSTANT="C", -        MERGE_VALUES="MV", -        UNMERGE_VALUES="UV", -        INTRINSIC="INT", -        INTRINSIC_W_SIDE_EFFECTS="INT", -        INSERT_VECTOR_ELT="IVEC", -        EXTRACT_VECTOR_ELT="EVEC", -        SHUFFLE_VECTOR="SHUF", -    ).get(base, base) -    # Avoid ambiguity when opcodes end in numbers -    if len(base.rstrip("0123456789")) < len(base): -        base += "_" - -    i = 0 -    for name in current_names: -        if name.rstrip("0123456789") == base: -            i += 1 -    if i: -        return "{}{}".format(base, i) -    return base - -  def update_test_file(args, test, autogenerated_note):      with open(test) as fd:          input_lines = [l.rstrip() for l in fd] @@ -247,7 +132,7 @@ def update_test_file(args, test, autogenerated_note):              common.warn("No triple found: skipping file", test_file=test)              return -        build_function_info_dictionary( +        mir.build_function_info_dictionary(              test,              raw_tool_output,              triple_in_cmd or triple_in_ir, @@ -259,7 +144,7 @@ def update_test_file(args, test, autogenerated_note):      prefix_set = set([prefix for run in run_list for prefix in run[0]])      log("Rewriting FileCheck prefixes: {}".format(prefix_set), args.verbose) -    output_lines = common.add_mir_checks( +    output_lines = mir.add_mir_checks(          input_lines,          prefix_set,          autogenerated_note, | 
