Skip to content

c-print-results: Different spill order of arguments #291

Description

@blackgeorge-boom
void results(char *name, char class, int n1, int n2, int n3, int niter,
					 double t, double mops, char *optype,
					 int passed_verification, char *npbversion,
					 char *compiletime, char *cc, char *clink, char *c_lib,
					 char *c_inc, char *cflags, char *clinkflags)
{
	printf("%c\n", class);
	if (n3 == 0) {
		n3++;
	}
	else
		printf("%4dx%4dx%4d\n", n1, n2, n3);
}

int main() {

	double timecounter = 0.0;

	results(
			"IS", CLASS, 1, 64, 0, 3, timecounter, 1.0,
			"keys ranked", 1, NPBVERSION, COMPILETIME, CC, CLINK,
			C_LIB, C_INC, CFLAGS, CLINKFLAGS);

	return 0;

}

Examining the regalloc debug info, we see that the following corresponding registers are allocated differently. This is because of different live interval weights (calculated as UseDefFreq / (Size + 25*SlotIndex::InstrDist)) that lead to different evictions:

AArch64

%4: 4.38 / (400 + 400) = 4.38 * 1.25 = 5.47
%14: 3.03 / (168 + 400) = 3.03 * 1.76 = 5.33

X86

%4: 4.38 / (512 + 400) = 4.38 * 1.1 = 4.80
%18: 3.03 / (216 + 400) = 3.03 * 1.62 = 4.92

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions