
This is scoped to autogenerated tests. The goal is to support having each RUN line specify a list of check-prefixes where one can specify potentially redundant prefixes. For example, for X86, if one specified prefixes for both AVX1 and AVX2, and the codegen happened to match today, one of the prefixes would be used and the onther one not. If the unused prefix were dropped, and later, codegen differences were introduced, one would have to go figure out where to add what prefix (paraphrasing https://lists.llvm.org/pipermail/llvm-dev/2021-February/148326.html) To avoid getting errors due to unused prefixes, whole directories can be opted out (as discussed on that thread), but that means that tests that aren't autogenerated in such directories could have undetected unused prefix bugs. This patch proposes an alternative that both avoids the above, dir-level optout, and supports the main autogen scenario discussed first. The autogen tool appends at the end of the test file the list of unused prefixes, together with a note explaining that is the case. Each prefix is set up to always pass. This way, unexpected unused prefixes are easily discoverable, and expected cases "just work". Differential Revision: https://reviews.llvm.org/D124306
58 lines
1.8 KiB
Python
58 lines
1.8 KiB
Python
import re
|
|
from . import common
|
|
import sys
|
|
|
|
if sys.version_info[0] > 2:
|
|
class string:
|
|
expandtabs = str.expandtabs
|
|
else:
|
|
import string
|
|
|
|
# Support of isel debug checks
|
|
# RegEx: this is where the magic happens.
|
|
|
|
##### iSel parser
|
|
|
|
# TODO: add function prefix
|
|
ISEL_FUNCTION_DEFAULT_RE = re.compile(
|
|
r'Selected[\s]*selection[\s]*DAG:[\s]*%bb.0[\s]*\'(?P<func>.*?):[^\']*\'*\n'
|
|
r'(?P<body>.*?)\n'
|
|
r'Total[\s]*amount[\s]*of[\s]*phi[\s]*nodes[\s]*to[\s]*update:[\s]*[0-9]+',
|
|
flags=(re.M | re.S))
|
|
|
|
def scrub_isel_default(isel, args):
|
|
# Scrub runs of whitespace out of the iSel debug output, but leave the leading
|
|
# whitespace in place.
|
|
isel = common.SCRUB_WHITESPACE_RE.sub(r' ', isel)
|
|
# Expand the tabs used for indentation.
|
|
isel = string.expandtabs(isel, 2)
|
|
# Strip trailing whitespace.
|
|
isel = common.SCRUB_TRAILING_WHITESPACE_RE.sub(r'', isel)
|
|
return isel
|
|
|
|
def get_run_handler(triple):
|
|
target_handlers = {
|
|
}
|
|
handler = None
|
|
best_prefix = ''
|
|
for prefix, s in target_handlers.items():
|
|
if triple.startswith(prefix) and len(prefix) > len(best_prefix):
|
|
handler = s
|
|
best_prefix = prefix
|
|
|
|
if handler is None:
|
|
common.debug('Using default handler.')
|
|
handler = (scrub_isel_default, ISEL_FUNCTION_DEFAULT_RE)
|
|
|
|
return handler
|
|
|
|
##### Generator of iSel CHECK lines
|
|
|
|
def add_checks(output_lines, comment_marker, prefix_list, func_dict, func_name,
|
|
global_vars_seen_dict, is_filtered):
|
|
# Label format is based on iSel string.
|
|
check_label_format = '{} %s-LABEL: %s%s%s'.format(comment_marker)
|
|
return common.add_checks(output_lines, comment_marker, prefix_list, func_dict,
|
|
func_name, check_label_format, True, False,
|
|
global_vars_seen_dict, is_filtered=is_filtered)
|