On 12/10/14 02:02, Ajit Kumar Agarwal wrote:
Right. After IRA was complete, I'd walk over the unallocated
allocnos and split their ranges at EBB boundaries. That created
new allocnos with a smaller ??>>conflict set and reduced the
conflict set for the original unallocated allocnos.
Jeff: In the above approach of splitting the ranges for unallocated
allocnos is aggressive or based on the approach of some heuristics
that the Live ranges for unallocated allocnos is not touched inside
the EBBs.
It was focused on allocnos which were live at EBB boundaries and
splitting the ranges at those boundaries.
In the case where the allocno was live across the EBB, but not used/set
in the EBB, the split effectively homes the allocno in its stack slot
across those EBBs. That reduces the conflicts for the original allocno
(and possibly other allocnos that need hard registers).
You can actually use that property to free up hard registers as well.
If there's allocno(s) which are not used/set in an EBB, but which got a
hard register, you can split their range at the EBB boundary. This
results in those allocnos homing into their stack slot across those EBBs
(or some other hard register). Which in turn frees one or more hard
registers within the EBB.
In fact, you can take that concept quite a bit further and use it as the
fundamental basis for range splitting by simply changing the range over
which you want the allocnos to be transparent. The range could be an
EBB, BB a few insns or a single insn.
And that was the basis for backwards walk through the BB approach I was
experimenting with. We just walked insns backwards in the BB, when we
encountered an insn with an unallocated allocno, we split the range of
some other allocno to free up a suitable hard register. First we'd look
for an allocno that was transparent across the EBB, then a BB, then the
largest range from the insn needing the reload to the closest prior
use/set. By splitting across these larger ranges, we tended to free up
a hard register over a large range and it could often be used to satisfy
multiple unassigned allocnos. I was in the process of refactoring the
code to handle things like register pairs and such when I got pulled
away to other things. I don't recall if this variant was ever
bootstrapping, but it was getting great fill rates compared to reload.
After the above splitting, are you building the conflict graph again
to assign the new allocnos. If the Conflict graph is built again,
this will affect the compile time.
The conflict graph was incrementally updated IIRC. The compile-time
issues were mostly to get the register classes and ira cost models accurate.
Jeff