xref: /netbsd-src/external/apache2/llvm/dist/llvm/utils/release/findRegressions-nightly.py (revision 7330f729ccf0bd976a06f95fad452fe774fc7fd1)
1*7330f729Sjoerg#!/usr/bin/env python
2*7330f729Sjoergfrom __future__ import print_function
3*7330f729Sjoerg
4*7330f729Sjoergimport re, string, sys, os, time
5*7330f729Sjoerg
6*7330f729SjoergDEBUG = 0
7*7330f729SjoergtestDirName = 'llvm-test'
8*7330f729Sjoergtest      = ['compile', 'llc', 'jit', 'cbe']
9*7330f729Sjoergexectime     = ['llc-time', 'jit-time', 'cbe-time',]
10*7330f729Sjoergcomptime     = ['llc', 'jit-comptime', 'compile']
11*7330f729Sjoerg
12*7330f729Sjoerg(tp, exp) = ('compileTime_', 'executeTime_')
13*7330f729Sjoerg
14*7330f729Sjoergdef parse(file):
15*7330f729Sjoerg  f=open(file, 'r')
16*7330f729Sjoerg  d = f.read()
17*7330f729Sjoerg
18*7330f729Sjoerg  #Cleanup weird stuff
19*7330f729Sjoerg  d = re.sub(r',\d+:\d','', d)
20*7330f729Sjoerg
21*7330f729Sjoerg  r = re.findall(r'TEST-(PASS|FAIL|RESULT.*?):\s+(.*?)\s+(.*?)\r*\n', d)
22*7330f729Sjoerg
23*7330f729Sjoerg  test = {}
24*7330f729Sjoerg  fname = ''
25*7330f729Sjoerg  for t in r:
26*7330f729Sjoerg    if DEBUG:
27*7330f729Sjoerg      print(t)
28*7330f729Sjoerg    if t[0] == 'PASS' or t[0] == 'FAIL' :
29*7330f729Sjoerg      tmp = t[2].split(testDirName)
30*7330f729Sjoerg
31*7330f729Sjoerg      if DEBUG:
32*7330f729Sjoerg        print(tmp)
33*7330f729Sjoerg
34*7330f729Sjoerg      if len(tmp) == 2:
35*7330f729Sjoerg        fname = tmp[1].strip('\r\n')
36*7330f729Sjoerg      else:
37*7330f729Sjoerg        fname = tmp[0].strip('\r\n')
38*7330f729Sjoerg
39*7330f729Sjoerg      if fname not in test :
40*7330f729Sjoerg        test[fname] = {}
41*7330f729Sjoerg
42*7330f729Sjoerg      for k in test:
43*7330f729Sjoerg        test[fname][k] = 'NA'
44*7330f729Sjoerg        test[fname][t[1]] = t[0]
45*7330f729Sjoerg        if DEBUG:
46*7330f729Sjoerg          print(test[fname][t[1]])
47*7330f729Sjoerg    else :
48*7330f729Sjoerg      try:
49*7330f729Sjoerg        n = t[0].split('RESULT-')[1]
50*7330f729Sjoerg
51*7330f729Sjoerg        if DEBUG:
52*7330f729Sjoerg          print(n);
53*7330f729Sjoerg
54*7330f729Sjoerg        if n == 'llc' or n == 'jit-comptime' or n == 'compile':
55*7330f729Sjoerg          test[fname][tp + n] = float(t[2].split(' ')[2])
56*7330f729Sjoerg          if DEBUG:
57*7330f729Sjoerg            print(test[fname][tp + n])
58*7330f729Sjoerg
59*7330f729Sjoerg        elif n.endswith('-time') :
60*7330f729Sjoerg            test[fname][exp + n] = float(t[2].strip('\r\n'))
61*7330f729Sjoerg            if DEBUG:
62*7330f729Sjoerg              print(test[fname][exp + n])
63*7330f729Sjoerg
64*7330f729Sjoerg        else :
65*7330f729Sjoerg          print("ERROR!")
66*7330f729Sjoerg          sys.exit(1)
67*7330f729Sjoerg
68*7330f729Sjoerg      except:
69*7330f729Sjoerg          continue
70*7330f729Sjoerg
71*7330f729Sjoerg  return test
72*7330f729Sjoerg
73*7330f729Sjoerg# Diff results and look for regressions.
74*7330f729Sjoergdef diffResults(d_old, d_new):
75*7330f729Sjoerg
76*7330f729Sjoerg  for t in sorted(d_old.keys()) :
77*7330f729Sjoerg    if DEBUG:
78*7330f729Sjoerg      print(t)
79*7330f729Sjoerg
80*7330f729Sjoerg    if t in d_new :
81*7330f729Sjoerg
82*7330f729Sjoerg      # Check if the test passed or failed.
83*7330f729Sjoerg      for x in test:
84*7330f729Sjoerg        if x in d_old[t]:
85*7330f729Sjoerg          if x in d_new[t]:
86*7330f729Sjoerg            if d_old[t][x] == 'PASS':
87*7330f729Sjoerg              if d_new[t][x] != 'PASS':
88*7330f729Sjoerg                print(t + " *** REGRESSION (" + x + ")\n")
89*7330f729Sjoerg            else:
90*7330f729Sjoerg              if d_new[t][x] == 'PASS':
91*7330f729Sjoerg                print(t + " * NEW PASS (" + x + ")\n")
92*7330f729Sjoerg
93*7330f729Sjoerg          else :
94*7330f729Sjoerg            print(t + "*** REGRESSION (" + x + ")\n")
95*7330f729Sjoerg
96*7330f729Sjoerg        # For execution time, if there is no result, its a fail.
97*7330f729Sjoerg        for x in exectime:
98*7330f729Sjoerg          if tp + x in d_old[t]:
99*7330f729Sjoerg            if tp + x not in d_new[t]:
100*7330f729Sjoerg              print(t + " *** REGRESSION (" + tp + x + ")\n")
101*7330f729Sjoerg
102*7330f729Sjoerg          else :
103*7330f729Sjoerg            if tp + x in d_new[t]:
104*7330f729Sjoerg              print(t + " * NEW PASS (" + tp + x + ")\n")
105*7330f729Sjoerg
106*7330f729Sjoerg
107*7330f729Sjoerg        for x in comptime:
108*7330f729Sjoerg          if exp + x in d_old[t]:
109*7330f729Sjoerg            if exp + x not in d_new[t]:
110*7330f729Sjoerg              print(t + " *** REGRESSION (" + exp + x + ")\n")
111*7330f729Sjoerg
112*7330f729Sjoerg          else :
113*7330f729Sjoerg            if exp + x in d_new[t]:
114*7330f729Sjoerg              print(t + " * NEW PASS (" + exp + x + ")\n")
115*7330f729Sjoerg
116*7330f729Sjoerg    else :
117*7330f729Sjoerg      print(t + ": Removed from test-suite.\n")
118*7330f729Sjoerg
119*7330f729Sjoerg
120*7330f729Sjoerg#Main
121*7330f729Sjoergif len(sys.argv) < 3 :
122*7330f729Sjoerg    print('Usage:', sys.argv[0], \
123*7330f729Sjoerg          '<old log> <new log>')
124*7330f729Sjoerg    sys.exit(-1)
125*7330f729Sjoerg
126*7330f729Sjoergd_old = parse(sys.argv[1])
127*7330f729Sjoergd_new = parse(sys.argv[2])
128*7330f729Sjoerg
129*7330f729Sjoerg
130*7330f729SjoergdiffResults(d_old, d_new)
131*7330f729Sjoerg
132*7330f729Sjoerg
133