Age | Commit message (Collapse) | Author |
|
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.
|
|
|
|
|
|
|
|
|
|
|
|
It seems that the MEM reference type is
meaningless in too many positions.
Because of this, it is unclear if we
should keep it or just introduce a
OAddr instruction that only accepts
slots.
Regardless of the above, the spilling
module needs to use the new slot_()
function, also, the emit function needs
to fetch the size of the stack frame
from the slot[] array.
The naming is still very transitional,
here is a list of all bogus names I can
think of:
- SLOT()
- Tmp.spill
- slot_
|
|
|
|
This is possible because we know that they are
represented by different integers.
|
|
I've been septic since I introduced it, this commit
proves that it costs more than it helps. I've also fixed
a bad bug in rega() where I alloc'ed the wrong size for
internal arrays. Enums now have names so I can use them
to cast in gdb to get the name corresponding to a constant.
|
|
|
|
|
|
|
|
|
|
In the future they will be eliminated by
constant propagation.
|
|
|
|
It was not as simple as I thought. All constants
used in 32b context get truncated to 32 bits.
All constants in 64b contexts can either remain
as immutables are have to be evicted in a register,
this choice is taken in noimm(). The case of the
comparison needs to be documented since the context
is not clearly 32 or 64 bits.
I am still unsure if this is fully correct.
|
|
|
|
|
|
|
|
|
|
|
|
This gives a more uniform use of the registers.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This new machine-independent mechanism might not be general
enough in the long term but, now, it provides a flexible way
to inform the spiller about the maximum number of arguments
of an instruction that can be spill locations.
|
|
|
|
|
|
|
|
The way we detected if limit had spilled a variable
was incorrect. This is because two consecutive calls
to limit could require a spill of the same variable.
Instead, we now use a return value from limit.
Note that this is still not so ideal. Indeed, it works
properly only when limit spills one value only, if not,
we should return a bitset. In the current use scheme
of limit, this invariant is true but ideally we would
like to call limit with *all arguments added at once*,
not one after the other.
|
|
|
|
|
|
|