aboutsummaryrefslogtreecommitdiff
path: root/llvm/utils/update_mir_test_checks.py
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/utils/update_mir_test_checks.py')
-rwxr-xr-xllvm/utils/update_mir_test_checks.py121
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,