xref: /aosp_15_r20/external/llvm/test/Other/opt-bisect-helper.py (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker#!/usr/bin/env python
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerimport os
4*9880d681SAndroid Build Coastguard Workerimport sys
5*9880d681SAndroid Build Coastguard Workerimport argparse
6*9880d681SAndroid Build Coastguard Workerimport subprocess
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerparser = argparse.ArgumentParser()
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerparser.add_argument('--start', type=int, default=0)
11*9880d681SAndroid Build Coastguard Workerparser.add_argument('--end', type=int, default=(1 << 32))
12*9880d681SAndroid Build Coastguard Workerparser.add_argument('--optcmd', default=("opt"))
13*9880d681SAndroid Build Coastguard Workerparser.add_argument('--filecheckcmd', default=("FileCheck"))
14*9880d681SAndroid Build Coastguard Workerparser.add_argument('--prefix', default=("CHECK-BISECT"))
15*9880d681SAndroid Build Coastguard Workerparser.add_argument('--test', default=(""))
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Workerargs = parser.parse_args()
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerstart = args.start
20*9880d681SAndroid Build Coastguard Workerend = args.end
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workeropt_command = [args.optcmd, "-O2", "-opt-bisect-limit=%(count)s", "-S", args.test]
23*9880d681SAndroid Build Coastguard Workercheck_command = [args.filecheckcmd, args.test, "--check-prefix=%s" % args.prefix]
24*9880d681SAndroid Build Coastguard Workerlast = None
25*9880d681SAndroid Build Coastguard Workerwhile start != end and start != end-1:
26*9880d681SAndroid Build Coastguard Worker    count = int(round(start + (end - start)/2))
27*9880d681SAndroid Build Coastguard Worker    cmd = [x % {'count':count} for x in opt_command]
28*9880d681SAndroid Build Coastguard Worker    print("opt: " + str(cmd))
29*9880d681SAndroid Build Coastguard Worker    opt_result = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
30*9880d681SAndroid Build Coastguard Worker    filecheck_result = subprocess.Popen(check_command, stdin=opt_result.stdout)
31*9880d681SAndroid Build Coastguard Worker    opt_result.stdout.close()
32*9880d681SAndroid Build Coastguard Worker    opt_result.stderr.close()
33*9880d681SAndroid Build Coastguard Worker    filecheck_result.wait()
34*9880d681SAndroid Build Coastguard Worker    if filecheck_result.returncode == 0:
35*9880d681SAndroid Build Coastguard Worker        start = count
36*9880d681SAndroid Build Coastguard Worker    else:
37*9880d681SAndroid Build Coastguard Worker        end = count
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerprint("Last good count: %d" % start)
40