Age | Commit message (Collapse) | Author |
|
|
|
|
|
It could be that the destination of the copy is
a spill location, so we have to check the type
of i.to first.
|
|
revert commit d0e9e3ada106dfe8dcda7a0099b341000f00afb2.
|
|
|
|
|
|
|
|
|
|
I could never figure out a correct version
without the tests. I'm now fairly confident
dopm() will work as we need it to.
|
|
|
|
|
|
|
|
|
|
The old code was broken for sure, this one might
be. I have to create a test bench for the dopm
function. It would also test the parallel move
lowering (pmgen and folks).
|
|
|
|
The first one was not so bad, when we a parallel move
clobbers one machine register in use, we used to
free the temporary t* using it, mark the register as
unavailable and allocate a new location for the
t*. But this fails when all the registers are in use.
In that case, the destination of the move must be in
a register r1, so I require a swap of the register
to copy (used by t*) with r1 and update the map
accordingly.
I would like to move all the above logic in a function
dealing with clobbers in general.
The second bug is in the parallel move compiler, this
one was a little more nasty and could have caused much
debugging pain. It would be reasonable to test it in
a similar way that I did for the slota() allocator.
|
|
|
|
|
|
|
|
|
|
It would be nicer to have some kind of subtyping where a
l variable can be used in place of a w variable but it is
more complications than a truncation insutruction.
In some cases, it might be less efficient than the above
solution by requiring two registers instead of one.
(I.e when both the truncated variable and the long variable
live together.)
We have to see what are the usage patterns.
|
|
An invariant is that all registers allocated at some point
have a hint. This makes the code removed by this commit
dead because of the if condition testing for empty hints.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
In emit, I worked a little to make sure that framesz works
when we change the size of the svec array (if we need more
alignments).
|
|
|
|
|
|
|
|
|
|
We only allocate a register that has a hint if the
hint register is not used already. In the max example
it gives a better result and it does not seem to affect
the collatz test.
|
|
|
|
|
|
It could very well be that the temporary we
assign already got assigned to the right
register! Good things happen.
|
|
There was a typo that made always the same successor
to be selected for register allocation hinting.
Also, I now attempt to prioritize hints over succeccor's
choices as it appears to give slightly better results...
Now that I think about it, the code re-using the most
frequent successor block's assignment might be dead
because all registers have hints if they got assigned
once. To investigate.
|
|
This is pretty stupid... Since we rely on rpo only
for code output (and not a proper scheduler), I have
to be careful with the ordering of tests to get
cleaner code.
|
|
|
|
It turned out to be not so useful to have a MEM
type for references. Instead I used an OAddr
instruction that translates simply to a lea.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
When we are dealing with a block that is not
a loop, we must make sure to consider phi arguments
of successors as live variables. Ideally we could
move the code to find all live-ins (including phi
arguments) to the live module.
|
|
This is a hack implementation, ideally I would like
something cleaner. The problem is that regalloc thinks
an instruction is dead code because it's not aware that
it writes to eflags.
|