1*09467b48Spatrick#!/usr/bin/env python 2*09467b48Spatrick 3*09467b48Spatrickfrom __future__ import print_function 4*09467b48Spatrickimport re, string, sys, os, time, math 5*09467b48Spatrick 6*09467b48SpatrickDEBUG = 0 7*09467b48Spatrick 8*09467b48Spatrick(tp, exp) = ('compile', 'exec') 9*09467b48Spatrick 10*09467b48Spatrickdef parse(file): 11*09467b48Spatrick f = open(file, 'r') 12*09467b48Spatrick d = f.read() 13*09467b48Spatrick 14*09467b48Spatrick # Cleanup weird stuff 15*09467b48Spatrick d = re.sub(r',\d+:\d', '', d) 16*09467b48Spatrick 17*09467b48Spatrick r = re.findall(r'TEST-(PASS|FAIL|RESULT.*?):\s+(.*?)\s+(.*?)\r*\n', d) 18*09467b48Spatrick 19*09467b48Spatrick test = {} 20*09467b48Spatrick fname = '' 21*09467b48Spatrick for t in r: 22*09467b48Spatrick if DEBUG: 23*09467b48Spatrick print(t) 24*09467b48Spatrick 25*09467b48Spatrick if t[0] == 'PASS' or t[0] == 'FAIL' : 26*09467b48Spatrick tmp = t[2].split('llvm-test/') 27*09467b48Spatrick 28*09467b48Spatrick if DEBUG: 29*09467b48Spatrick print(tmp) 30*09467b48Spatrick 31*09467b48Spatrick if len(tmp) == 2: 32*09467b48Spatrick fname = tmp[1].strip('\r\n') 33*09467b48Spatrick else: 34*09467b48Spatrick fname = tmp[0].strip('\r\n') 35*09467b48Spatrick 36*09467b48Spatrick if fname not in test: 37*09467b48Spatrick test[fname] = {} 38*09467b48Spatrick 39*09467b48Spatrick test[fname][t[1] + ' state'] = t[0] 40*09467b48Spatrick test[fname][t[1] + ' time'] = float('nan') 41*09467b48Spatrick else : 42*09467b48Spatrick try: 43*09467b48Spatrick n = t[0].split('RESULT-')[1] 44*09467b48Spatrick 45*09467b48Spatrick if DEBUG: 46*09467b48Spatrick print("n == ", n); 47*09467b48Spatrick 48*09467b48Spatrick if n == 'compile-success': 49*09467b48Spatrick test[fname]['compile time'] = float(t[2].split('program')[1].strip('\r\n')) 50*09467b48Spatrick 51*09467b48Spatrick elif n == 'exec-success': 52*09467b48Spatrick test[fname]['exec time'] = float(t[2].split('program')[1].strip('\r\n')) 53*09467b48Spatrick if DEBUG: 54*09467b48Spatrick print(test[fname][string.replace(n, '-success', '')]) 55*09467b48Spatrick 56*09467b48Spatrick else : 57*09467b48Spatrick # print "ERROR!" 58*09467b48Spatrick sys.exit(1) 59*09467b48Spatrick 60*09467b48Spatrick except: 61*09467b48Spatrick continue 62*09467b48Spatrick 63*09467b48Spatrick return test 64*09467b48Spatrick 65*09467b48Spatrick# Diff results and look for regressions. 66*09467b48Spatrickdef diffResults(d_old, d_new): 67*09467b48Spatrick regressions = {} 68*09467b48Spatrick passes = {} 69*09467b48Spatrick removed = '' 70*09467b48Spatrick 71*09467b48Spatrick for x in ['compile state', 'compile time', 'exec state', 'exec time']: 72*09467b48Spatrick regressions[x] = '' 73*09467b48Spatrick passes[x] = '' 74*09467b48Spatrick 75*09467b48Spatrick for t in sorted(d_old.keys()) : 76*09467b48Spatrick if t in d_new: 77*09467b48Spatrick 78*09467b48Spatrick # Check if the test passed or failed. 79*09467b48Spatrick for x in ['compile state', 'compile time', 'exec state', 'exec time']: 80*09467b48Spatrick 81*09467b48Spatrick if x not in d_old[t] and x not in d_new[t]: 82*09467b48Spatrick continue 83*09467b48Spatrick 84*09467b48Spatrick if x in d_old[t]: 85*09467b48Spatrick if x in d_new[t]: 86*09467b48Spatrick 87*09467b48Spatrick if d_old[t][x] == 'PASS': 88*09467b48Spatrick if d_new[t][x] != 'PASS': 89*09467b48Spatrick regressions[x] += t + "\n" 90*09467b48Spatrick else: 91*09467b48Spatrick if d_new[t][x] == 'PASS': 92*09467b48Spatrick passes[x] += t + "\n" 93*09467b48Spatrick 94*09467b48Spatrick else : 95*09467b48Spatrick regressions[x] += t + "\n" 96*09467b48Spatrick 97*09467b48Spatrick if x == 'compile state' or x == 'exec state': 98*09467b48Spatrick continue 99*09467b48Spatrick 100*09467b48Spatrick # For execution time, if there is no result it's a fail. 101*09467b48Spatrick if x not in d_old[t] and x not in d_new[t]: 102*09467b48Spatrick continue 103*09467b48Spatrick elif x not in d_new[t]: 104*09467b48Spatrick regressions[x] += t + "\n" 105*09467b48Spatrick elif x not in d_old[t]: 106*09467b48Spatrick passes[x] += t + "\n" 107*09467b48Spatrick 108*09467b48Spatrick if math.isnan(d_old[t][x]) and math.isnan(d_new[t][x]): 109*09467b48Spatrick continue 110*09467b48Spatrick 111*09467b48Spatrick elif math.isnan(d_old[t][x]) and not math.isnan(d_new[t][x]): 112*09467b48Spatrick passes[x] += t + "\n" 113*09467b48Spatrick 114*09467b48Spatrick elif not math.isnan(d_old[t][x]) and math.isnan(d_new[t][x]): 115*09467b48Spatrick regressions[x] += t + ": NaN%\n" 116*09467b48Spatrick 117*09467b48Spatrick if d_new[t][x] > d_old[t][x] and d_old[t][x] > 0.0 and \ 118*09467b48Spatrick (d_new[t][x] - d_old[t][x]) / d_old[t][x] > .05: 119*09467b48Spatrick regressions[x] += t + ": " + "{0:.1f}".format(100 * (d_new[t][x] - d_old[t][x]) / d_old[t][x]) + "%\n" 120*09467b48Spatrick 121*09467b48Spatrick else : 122*09467b48Spatrick removed += t + "\n" 123*09467b48Spatrick 124*09467b48Spatrick if len(regressions['compile state']) != 0: 125*09467b48Spatrick print('REGRESSION: Compilation Failed') 126*09467b48Spatrick print(regressions['compile state']) 127*09467b48Spatrick 128*09467b48Spatrick if len(regressions['exec state']) != 0: 129*09467b48Spatrick print('REGRESSION: Execution Failed') 130*09467b48Spatrick print(regressions['exec state']) 131*09467b48Spatrick 132*09467b48Spatrick if len(regressions['compile time']) != 0: 133*09467b48Spatrick print('REGRESSION: Compilation Time') 134*09467b48Spatrick print(regressions['compile time']) 135*09467b48Spatrick 136*09467b48Spatrick if len(regressions['exec time']) != 0: 137*09467b48Spatrick print('REGRESSION: Execution Time') 138*09467b48Spatrick print(regressions['exec time']) 139*09467b48Spatrick 140*09467b48Spatrick if len(passes['compile state']) != 0: 141*09467b48Spatrick print('NEW PASSES: Compilation') 142*09467b48Spatrick print(passes['compile state']) 143*09467b48Spatrick 144*09467b48Spatrick if len(passes['exec state']) != 0: 145*09467b48Spatrick print('NEW PASSES: Execution') 146*09467b48Spatrick print(passes['exec state']) 147*09467b48Spatrick 148*09467b48Spatrick if len(removed) != 0: 149*09467b48Spatrick print('REMOVED TESTS') 150*09467b48Spatrick print(removed) 151*09467b48Spatrick 152*09467b48Spatrick# Main 153*09467b48Spatrickif len(sys.argv) < 3 : 154*09467b48Spatrick print('Usage:', sys.argv[0], '<old log> <new log>') 155*09467b48Spatrick sys.exit(-1) 156*09467b48Spatrick 157*09467b48Spatrickd_old = parse(sys.argv[1]) 158*09467b48Spatrickd_new = parse(sys.argv[2]) 159*09467b48Spatrick 160*09467b48SpatrickdiffResults(d_old, d_new) 161