mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
641346ab8c
The vectoriser's debug log prints VPlan digraphs, but it's a bit cumbersome to extract them and render them into PNG images. This script does exactly that, being careful enough to extract all individual plans, name them appropriately and save in either .dot or .png files. Example usage: $ opt -O3 -debug-only=loop-vectorize file.ll -S -o /dev/null 2> debug.log $ $LLVM_SRC/utils/extract_vplan.py < debug.log Exporting VF1UF1 to DOT: VPlanVF1UF1.dot Exporting VF24UF1 to DOT: VPlanVF24UF1.dot $ $LLVM_SRC/utils/extract_vplan.py --png < debug.log Exporting VF1UF1 to PNG via dot: VPlanVF1UF1.png Exporting VF24UF1 to PNG via dot: VPlanVF24UF1.png $ xdot VPlanVF1UF1.dot Differential Revision: https://reviews.llvm.org/D53142 llvm-svn: 344599
47 lines
1.5 KiB
Python
Executable File
47 lines
1.5 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
# This script extracts the VPlan digraphs from the vectoriser debug messages
|
|
# and saves them in individual dot files (one for each plan). Optionally, and
|
|
# providing 'dot' is installed, it can also render the dot into a PNG file.
|
|
|
|
import sys
|
|
import re
|
|
import argparse
|
|
import shutil
|
|
import subprocess
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('--png', action='store_true')
|
|
args = parser.parse_args()
|
|
|
|
dot = shutil.which('dot')
|
|
if args.png and not dot:
|
|
raise RuntimeError("Can't export to PNG without 'dot' in the system")
|
|
|
|
pattern = re.compile(r"(digraph VPlan {.*?\n})",re.DOTALL)
|
|
matches = re.findall(pattern, sys.stdin.read())
|
|
|
|
for vplan in matches:
|
|
m = re.search("graph \[.+(VF=.+,UF.+), ", vplan)
|
|
if not m:
|
|
raise ValueError("Can't get the right VPlan name")
|
|
name = re.sub('[^a-zA-Z0-9]', '', m.group(1))
|
|
|
|
if args.png:
|
|
filename = 'VPlan' + name + '.png'
|
|
print("Exporting " + name + " to PNG via dot: " + filename)
|
|
p = subprocess.Popen([dot, '-Tpng', '-o', filename],
|
|
encoding='utf-8',
|
|
stdin=subprocess.PIPE,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE)
|
|
out, err = p.communicate(input=vplan)
|
|
if err:
|
|
raise RuntimeError("Error running dot: " + err)
|
|
|
|
else:
|
|
filename = 'VPlan' + name + '.dot'
|
|
print("Exporting " + name + " to DOT: " + filename)
|
|
with open(filename, 'w') as out:
|
|
out.write(vplan)
|