xref: /llvm-project/llvm/tools/opt-viewer/opt-diff.py (revision b71edfaa4ec3c998aadb35255ce2f60bba2940b0)
12f2feebfSReid Kleckner#!/usr/bin/env python
22f2feebfSReid Kleckner
32f2feebfSReid Klecknerfrom __future__ import print_function
42f2feebfSReid Kleckner
5*b71edfaaSTobias Hietadesc = """Generate the difference of two YAML files into a new YAML file (works on
62f2feebfSReid Klecknerpair of directories too).  A new attribute 'Added' is set to True or False
72f2feebfSReid Klecknerdepending whether the entry is added or removed from the first input to the
82f2feebfSReid Klecknernext.
92f2feebfSReid Kleckner
10*b71edfaaSTobias HietaThe tools requires PyYAML."""
112f2feebfSReid Kleckner
122f2feebfSReid Klecknerimport yaml
13*b71edfaaSTobias Hieta
142f2feebfSReid Kleckner# Try to use the C parser.
152f2feebfSReid Klecknertry:
162f2feebfSReid Kleckner    from yaml import CLoader as Loader
172f2feebfSReid Klecknerexcept ImportError:
182f2feebfSReid Kleckner    from yaml import Loader
192f2feebfSReid Kleckner
202f2feebfSReid Klecknerimport optrecord
212f2feebfSReid Klecknerimport argparse
222f2feebfSReid Klecknerfrom collections import defaultdict
232f2feebfSReid Kleckner
24*b71edfaaSTobias Hietaif __name__ == "__main__":
252f2feebfSReid Kleckner    parser = argparse.ArgumentParser(description=desc)
262f2feebfSReid Kleckner    parser.add_argument(
27*b71edfaaSTobias Hieta        "yaml_dir_or_file_1",
28*b71edfaaSTobias Hieta        help="An optimization record file or a directory searched for optimization "
29*b71edfaaSTobias Hieta        "record files that are used as the old version for the comparison",
30*b71edfaaSTobias Hieta    )
312f2feebfSReid Kleckner    parser.add_argument(
32*b71edfaaSTobias Hieta        "yaml_dir_or_file_2",
33*b71edfaaSTobias Hieta        help="An optimization record file or a directory searched for optimization "
34*b71edfaaSTobias Hieta        "record files that are used as the new version for the comparison",
35*b71edfaaSTobias Hieta    )
362f2feebfSReid Kleckner    parser.add_argument(
37*b71edfaaSTobias Hieta        "--jobs",
38*b71edfaaSTobias Hieta        "-j",
392f2feebfSReid Kleckner        default=None,
402f2feebfSReid Kleckner        type=int,
41*b71edfaaSTobias Hieta        help="Max job count (defaults to %(default)s, the current CPU count)",
42*b71edfaaSTobias Hieta    )
432f2feebfSReid Kleckner    parser.add_argument(
44*b71edfaaSTobias Hieta        "--max-size",
45*b71edfaaSTobias Hieta        "-m",
462f2feebfSReid Kleckner        default=100000,
472f2feebfSReid Kleckner        type=int,
48*b71edfaaSTobias Hieta        help="Maximum number of remarks stored in an output file",
49*b71edfaaSTobias Hieta    )
502f2feebfSReid Kleckner    parser.add_argument(
51*b71edfaaSTobias Hieta        "--no-progress-indicator",
52*b71edfaaSTobias Hieta        "-n",
53*b71edfaaSTobias Hieta        action="store_true",
542f2feebfSReid Kleckner        default=False,
55*b71edfaaSTobias Hieta        help="Do not display any indicator of how many YAML files were read.",
56*b71edfaaSTobias Hieta    )
57*b71edfaaSTobias Hieta    parser.add_argument("--output", "-o", default="diff{}.opt.yaml")
582f2feebfSReid Kleckner    args = parser.parse_args()
592f2feebfSReid Kleckner
602f2feebfSReid Kleckner    files1 = optrecord.find_opt_files(args.yaml_dir_or_file_1)
612f2feebfSReid Kleckner    files2 = optrecord.find_opt_files(args.yaml_dir_or_file_2)
622f2feebfSReid Kleckner
632f2feebfSReid Kleckner    print_progress = not args.no_progress_indicator
642f2feebfSReid Kleckner    all_remarks1, _, _ = optrecord.gather_results(files1, args.jobs, print_progress)
652f2feebfSReid Kleckner    all_remarks2, _, _ = optrecord.gather_results(files2, args.jobs, print_progress)
662f2feebfSReid Kleckner
672f2feebfSReid Kleckner    added = set(all_remarks2.values()) - set(all_remarks1.values())
682f2feebfSReid Kleckner    removed = set(all_remarks1.values()) - set(all_remarks2.values())
692f2feebfSReid Kleckner
702f2feebfSReid Kleckner    for r in added:
712f2feebfSReid Kleckner        r.Added = True
722f2feebfSReid Kleckner    for r in removed:
732f2feebfSReid Kleckner        r.Added = False
742f2feebfSReid Kleckner
752f2feebfSReid Kleckner    result = list(added | removed)
762f2feebfSReid Kleckner    for r in result:
772f2feebfSReid Kleckner        r.recover_yaml_structure()
782f2feebfSReid Kleckner
792f2feebfSReid Kleckner    for i in range(0, len(result), args.max_size):
80*b71edfaaSTobias Hieta        with open(args.output.format(i / args.max_size), "w") as stream:
812f2feebfSReid Kleckner            yaml.dump_all(result[i : i + args.max_size], stream)
82