Linux C++ IR/ABI?

Hi all,

I have a question about why a couple of functions have their IR produced in a certain way (by clang++ on Linux x86_64). I write:

class ptr {
int *p;
};

void y(char, ptr a, ptr b, ptr c, ptr d, ptr e, ptr f, ptr g) {}

void z(char, int *a, int *b, int *c, int *d, int *e, int *f, int *g) {}

And run clang++ -std=c++11 ptr.cpp -S -emit-llvm

And get the following relevant pieces of IR:

%class.ptr = type { i32* }

define void @Z1yc3ptrS_S_S_S_S_S(i8 signext, i32* %a.coerce, i32* %b.coerce, i32* %c.coerce, i32* %d.coerce, i32* %e.coerce, i64 %f.coerce, i64 %g.coerce) {
// …
}

define void @Z1zcPiS_S_S_S_S_S(i8 signext, i32* %a, i32* %b, i32* %c, i32* %d, i32* %e, i32* %f, i32* %g) {
// …
}

Why do the first few ptr arguments to y show up in the IR as i32*, but later arguments show up as i64? But in z, all of the pointer arguments show up with type i32*?

Thanks,

Matt