From db144aaaea5b75ec10d9a5d4ab1f52e5d61c8873 Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Wed, 18 Oct 2017 22:39:55 +0000 Subject: [PATCH] update_mir_test_checks: Support adding checks for vreg classes This is a temporary hack to support adding checks for the "registers:" block of mir functions. This is necessary to convert a number of tests so that there's less churn when we change the MIR printer to put the vreg classes on defs instead of in their own block. llvm-svn: 316134 --- utils/update_mir_test_checks.py | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/utils/update_mir_test_checks.py b/utils/update_mir_test_checks.py index 469f6c1d72b..015c4279bad 100755 --- a/utils/update_mir_test_checks.py +++ b/utils/update_mir_test_checks.py @@ -41,11 +41,13 @@ VREG_DEF_RE = re.compile( r'^ *(?P{0}(?:, {0})*) ' r'= (?P[A-Zt][A-Za-z0-9_]+)'.format(VREG_RE.pattern)) PREFIX_DATA_RE = re.compile(r'^ *(;|bb.[0-9].*: *$|[a-z]+:( |$)|$)') +VREG_CLASS_RE = re.compile(r'^ *- *{ id: ([0-9]+), class: ([a-z0-9_]+)', re.M) MIR_FUNC_RE = re.compile( r'^---$' r'\n' r'^ *name: *(?P[A-Za-z0-9_.-]+)$' + r'(?:.*?(?P^ *registers: *(?:\n *- {[^\n]+$)*))?' r'.*?' r'^ *body: *\|\n' r'(?P.*?)\n' @@ -190,10 +192,11 @@ def build_function_body_dictionary(test, raw_tool_output, triple, prefixes, warn('Found conflicting asm for prefix: {}'.format(prefix), test_file=test) func_dict[prefix][func] = body + func_dict[prefix]['{}:vregs'.format(func)] = m.group('vregs') def add_checks_for_function(test, output_lines, run_list, func_dict, func_name, - single_bb, verbose=False): + add_vreg_checks, single_bb, verbose=False): printed_prefixes = set() for run in run_list: for prefix in run.prefixes: @@ -206,14 +209,17 @@ def add_checks_for_function(test, output_lines, run_list, func_dict, func_name, # output_lines.append('') printed_prefixes.add(prefix) log('Adding {} lines for {}'.format(prefix, func_name), verbose) + vregs = None + if add_vreg_checks: + vregs = func_dict[prefix]['{}:vregs'.format(func_name)] add_check_lines(test, output_lines, prefix, func_name, single_bb, - func_dict[prefix][func_name].splitlines()) + func_dict[prefix][func_name].splitlines(), vregs) break return output_lines def add_check_lines(test, output_lines, prefix, func_name, single_bb, - func_body): + func_body, vreg_data): if single_bb: # Don't bother checking the basic block label for a single BB func_body.pop(0) @@ -230,6 +236,12 @@ def add_check_lines(test, output_lines, prefix, func_name, single_bb, output_lines.append('{}-LABEL: name: {}'.format(check, func_name)) + if vreg_data: + output_lines.append('{}: registers:'.format(check)) + for m in VREG_CLASS_RE.finditer(vreg_data): + output_lines.append('{}-NEXT: id: {}, class: {}'.format( + check, m.group(1), m.group(2))) + vreg_map = {} for func_line in func_body: if not func_line.strip(): @@ -287,7 +299,8 @@ def should_add_line_to_output(input_line, prefix_set): return True -def update_test_file(llc, test, remove_common_prefixes=False, verbose=False): +def update_test_file(llc, test, remove_common_prefixes=False, + add_vreg_checks=False, verbose=False): log('Scanning for RUN lines in test file: {}'.format(test), verbose) with open(test) as fd: input_lines = [l.rstrip() for l in fd] @@ -360,15 +373,15 @@ def update_test_file(llc, test, remove_common_prefixes=False, verbose=False): continue state = 'function body' add_checks_for_function(test, output_lines, run_list, - func_dict, func_name, single_bb=False, - verbose=verbose) + func_dict, func_name, add_vreg_checks, + single_bb=False, verbose=verbose) elif state == 'function prefix': m = PREFIX_DATA_RE.match(input_line) if not m: state = 'function body' add_checks_for_function(test, output_lines, run_list, - func_dict, func_name, single_bb=True, - verbose=verbose) + func_dict, func_name, add_vreg_checks, + single_bb=True, verbose=verbose) if should_add_line_to_output(input_line, prefix_set): output_lines.append(input_line) @@ -395,13 +408,15 @@ def main(): parser.add_argument('--remove-common-prefixes', action='store_true', help='Remove existing check lines whose prefixes are ' 'shared between multiple commands') + parser.add_argument('--add-vreg-checks', action='store_true', + help='Add checks for the "registers:" block') parser.add_argument('tests', nargs='+') args = parser.parse_args() for test in args.tests: try: update_test_file(args.llc, test, args.remove_common_prefixes, - verbose=args.verbose) + args.add_vreg_checks, verbose=args.verbose) except Exception: warn('Error processing file', test_file=test) raise