diff options
Diffstat (limited to 'llvm/utils/update_mc_test_checks.py')
| -rwxr-xr-x | llvm/utils/update_mc_test_checks.py | 68 |
1 files changed, 27 insertions, 41 deletions
diff --git a/llvm/utils/update_mc_test_checks.py b/llvm/utils/update_mc_test_checks.py index 67fff56..791ff0d 100755 --- a/llvm/utils/update_mc_test_checks.py +++ b/llvm/utils/update_mc_test_checks.py @@ -24,14 +24,16 @@ ERROR_CHECK_RE = re.compile(r"# COM: .*") OUTPUT_SKIPPED_RE = re.compile(r"(.text)") COMMENT = {"asm": "//", "dasm": "#"} +SUBSTITUTIONS = [ + ("%extract-encodings", "sed -n 's/.*encoding://p'"), +] + def invoke_tool(exe, check_rc, cmd_args, testline, verbose=False): - if isinstance(cmd_args, list): - args = [applySubstitutions(a, substitutions) for a in cmd_args] - else: - args = cmd_args + substs = SUBSTITUTIONS + [(t, exe) for t in mc_LIKE_TOOLS] + args = [common.applySubstitutions(cmd, substs) for cmd in cmd_args.split("|")] - cmd = 'echo "' + testline + '" | ' + exe + " " + args + cmd = 'echo "' + testline + '" | ' + exe + " " + " | ".join(args) if verbose: print("Command: ", cmd) @@ -210,9 +212,6 @@ def update_test(ti: common.TestInfo): testlines = list(dict.fromkeys(testlines)) common.debug("Valid test line found: ", len(testlines)) - run_list_size = len(run_list) - testnum = len(testlines) - raw_output = [] raw_prefixes = [] for ( @@ -254,14 +253,12 @@ def update_test(ti: common.TestInfo): prefix_set = set([prefix for p in run_list for prefix in p[0]]) common.debug("Rewriting FileCheck prefixes:", str(prefix_set)) - for test_id in range(testnum): - input_line = testlines[test_id] - + for test_id, input_line in enumerate(testlines): # a {prefix : output, [runid] } dict # insert output to a prefix-key dict, and do a max sorting # to select the most-used prefix which share the same output string p_dict = {} - for run_id in range(run_list_size): + for run_id in range(len(run_list)): out = raw_output[run_id][test_id] if hasErr(out): @@ -269,45 +266,34 @@ def update_test(ti: common.TestInfo): else: o = getOutputString(out) - prefixes = raw_prefixes[run_id] - - for p in prefixes: + for p in raw_prefixes[run_id]: if p not in p_dict: p_dict[p] = o, [run_id] - else: - if p_dict[p] == (None, []): - continue + continue - prev_o, run_ids = p_dict[p] - if o == prev_o: - run_ids.append(run_id) - p_dict[p] = o, run_ids - else: - # conflict, discard - p_dict[p] = None, [] + if p_dict[p] == (None, []): + continue - p_dict_sorted = dict(sorted(p_dict.items(), key=lambda item: -len(item[1][1]))) + prev_o, run_ids = p_dict[p] + if o == prev_o: + run_ids.append(run_id) + p_dict[p] = o, run_ids + else: + # conflict, discard + p_dict[p] = None, [] # prefix is selected and generated with most shared output lines # each run_id can only be used once - used_runid = set() - + used_run_ids = set() selected_prefixes = set() - for prefix, tup in p_dict_sorted.items(): - o, run_ids = tup - - if len(run_ids) == 0: - continue - - skip = False - for i in run_ids: - if i in used_runid: - skip = True - else: - used_runid.add(i) - if not skip: + get_num_runs = lambda item: len(item[1][1]) + p_dict_sorted = sorted(p_dict.items(), key=get_num_runs, reverse=True) + for prefix, (o, run_ids) in p_dict_sorted: + if run_ids and used_run_ids.isdisjoint(run_ids): selected_prefixes.add(prefix) + used_run_ids.update(run_ids) + # Generate check lines in alphabetical order. check_lines = [] for prefix in sorted(selected_prefixes): |
