jasmin-lang / jasmin

Language for high-assurance and high-speed cryptography
MIT License
253 stars 53 forks source link

Spilling mutable reg ptr arguments is hard #850

Open eponier opened 3 months ago

eponier commented 3 months ago

I have a function fn f (reg ptr u8[N] r) -> reg ptr u8[N] that uses a lot of registers, so I want to spill the argument before the call and unspill it after the call.

stack ptr u8[N] s;
s = r;
r = f(r);
r = s;

But in this code, the region associated to variable s, and then to variable r is partial. I have to copy back r into s after the call. This spurious assignment will be removed by stack alloc, there is code dedicated to it.

stack ptr u8[N] s;
s = r;
r = f(r);
s = r; // new line
r = s;

This is accepted by the compiler, but does not do what I want at all. The first s = r is removed, since s is dead. Here is a solution.

stack ptr u8[N] s;
s = r;
r = f(r);
s[0:N] = r; // s is updated, not overwritten, so "s = r" will not be removed
r = s;

This works as expected, but is not so natural.

eponier commented 3 months ago

Note that there is a file testing this feature, namely tests/success/pointers/x86-64/test_spill_loop.jazz and it does not need the trick of using a subarray, but I think it is because of the while loop. The stack ptr is not dead and thus not removed.