mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-03 00:47:07 +00:00
069a428012
Summary: This patch adds itinerary support to the schedcover.py script. I've been trying to use this script to figure out why SSE and AVX instructions are ending up in separate tablegen scheduler classes and sometimes its because we are using different itineraries. Rather than using None to indicate the default scheduler model, I now use the string "default". I had to hack around the sorting a little to keep "default" at the beginning. But this also makes it so you can specify "default" on the command line to just get the defaults I also fixed the regular expression code so that the no_default wasn't evaluated twice. Reviewers: RKSimon, atrick, jmolloy, javed.absar Reviewed By: javed.absar Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D44834 llvm-svn: 328608
87 lines
2.7 KiB
Python
87 lines
2.7 KiB
Python
#!/usr/bin/python
|
|
|
|
# This creates a CSV file from the output of the debug output of subtarget:
|
|
# llvm-tblgen --gen-subtarget --debug-only=subtarget-emitter
|
|
# With thanks to Dave Estes for mentioning the idea at 2014 LLVM Developers' Meeting
|
|
|
|
import os;
|
|
import sys;
|
|
import re;
|
|
import operator;
|
|
|
|
table = {}
|
|
models = set()
|
|
filt = None
|
|
|
|
def add(instr, model, resource=None):
|
|
global table, models
|
|
|
|
entry = table.setdefault(instr, dict())
|
|
entry[model] = resource
|
|
models.add(model)
|
|
|
|
def filter_model(m):
|
|
global filt
|
|
if m and filt:
|
|
return filt.search(m) != None
|
|
else:
|
|
return True
|
|
|
|
|
|
def display():
|
|
global table, models
|
|
|
|
# remove default and itinerary so we can control their sort order to make
|
|
# them first
|
|
models.discard("default")
|
|
models.discard("itinerary")
|
|
|
|
ordered_table = sorted(table.items(), key=operator.itemgetter(0))
|
|
ordered_models = ["itinerary", "default"]
|
|
ordered_models.extend(sorted(models))
|
|
ordered_models = filter(filter_model, ordered_models)
|
|
|
|
# print header
|
|
sys.stdout.write("instruction")
|
|
for model in ordered_models:
|
|
sys.stdout.write(", {}".format(model))
|
|
sys.stdout.write(os.linesep)
|
|
|
|
for (instr, mapping) in ordered_table:
|
|
sys.stdout.write(instr)
|
|
for model in ordered_models:
|
|
if model in mapping and mapping[model] is not None:
|
|
sys.stdout.write(", {}".format(mapping[model]))
|
|
else:
|
|
sys.stdout.write(", ")
|
|
sys.stdout.write(os.linesep)
|
|
|
|
|
|
def machineModelCover(path):
|
|
# The interesting bits
|
|
re_sched_default = re.compile("SchedRW machine model for ([^ ]*) (.*)\n");
|
|
re_sched_no_default = re.compile("No machine model for ([^ ]*)\n");
|
|
re_sched_spec = re.compile("InstRW on ([^ ]*) for ([^ ]*) (.*)\n");
|
|
re_sched_no_spec = re.compile("No machine model for ([^ ]*) on processor (.*)\n");
|
|
re_sched_itin = re.compile("Itinerary for ([^ ]*): ([^ ]*)\n")
|
|
|
|
# scan the file
|
|
with open(path, 'r') as f:
|
|
for line in f.readlines():
|
|
match = re_sched_default.match(line)
|
|
if match: add(match.group(1), "default", match.group(2))
|
|
match = re_sched_no_default.match(line)
|
|
if match: add(match.group(1), "default")
|
|
match = re_sched_spec.match(line)
|
|
if match: add(match.group(2), match.group(1), match.group(3))
|
|
match = re_sched_no_spec.match(line)
|
|
if match: add(match.group(1), match.group(2))
|
|
match = re_sched_itin.match(line)
|
|
if match: add(match.group(1), "itinerary", match.group(2))
|
|
|
|
display()
|
|
|
|
if len(sys.argv) > 2:
|
|
filt = re.compile(sys.argv[2], re.IGNORECASE)
|
|
machineModelCover(sys.argv[1])
|