#!/usr/bin/awk -f
#
# This script compares two files generated by the frame_sizes script, which
# each contain information about stack frame sizes in a version of the Mercury
# compiler. It compares the average stack frame sizes of the two versions, and
# reports the procedures for which the two versions have different stack frame
# sizes.
#
# Usage: compare_frame_sizes SP.batch.version1 SP.batch.version2

	{
		if (NF != 5) {
			printf "error: NF != 5\n"
			printf "%s\n", $0;
			next;
		}

		batch = $1 "";

		# We expect to encounter two values of batch. The first becomes
		# the value of base; the second becomes the value of new.

		if (batch != base && batch != new) {
			if (base == "") {
				 base = batch;
			} else if (new == "") {
				 new = batch;
			} else {
				printf "error: unknown batch %s (%s %s)\n", batch, base, new;
				exit 1;
			}
		}

		proc = $3 " " $4 " " $5;
		framesize = $2;

		repcount = count[batch "@" proc];
		count[batch "@" proc] = repcount + 1;

		if (repcount > 0) {
			repcount++;
			proc = proc "#" repcount;
		}

		procs[proc] = 1;

		sizes[batch "@" proc] = framesize;
		exist[batch "@" proc] = 1;
	}
END	{
		basetotal  = 0;
		newtotal   = 0;
		proccount  = 0;
		basebetter = 0;
		newbetter  = 0;

		for (proc in procs) {
			if (exist[base "@" proc] == 1 && exist[new "@" proc] == 1) {
				basesize = sizes[base "@" proc];
				newsize  = sizes[new  "@" proc];
				basetotal += basesize;
				newtotal  += newsize;
				proccount += 1;

				if (basesize < newsize) {
					basebetter += 1;
					worsened = worsened proc "	" basesize "->" newsize "\n"
				} else if (basesize > newsize) {
					newbetter  += 1;
					improved = improved proc "	" basesize "->" newsize "\n"
				}
			} else {
				printf "error: mismatch for %s\n", proc;
			}
		}

		printf "base slots: %5d, %5.2f, %6.2f\n", basetotal, basetotal / proccount, 100;
		printf "new  slots: %5d, %5.2f, %6.2f\n", newtotal, newtotal / proccount, 100 * newtotal / basetotal;
		printf "number of procedures: %d\n", proccount;
		printf "base better: %d, %5.2f\n", basebetter, 100 * basebetter  / proccount;
		printf "new  better: %d, %5.2f\n", newbetter, 100 * newbetter  / proccount;
		printf "\n";
		printf "improved:\n%s", improved;
		printf "\n";
		printf "worsened:\n%s", worsened;
	}
