additionally, I found this in NetBSD pax when reading a tar file failed.. I don't recall if it
worked before PCC-289 was fixed (which also came from NetBSD pax but when creating
a tar file failed) - the construct is very similar though, I'm guessing related

Iain Hibbert added a comment - 29/Apr/11 09:30 PM additionally, I found this in NetBSD pax when reading a tar file failed.. I don't recall if it
worked before PCC-289 was fixed (which also came from NetBSD pax but when creating
a tar file failed) - the construct is very similar though, I'm guessing related

No, this is not related to 289, except from the fact that it is the third(!) bug in the register allocator in a week; this time in the graph coloring code.
There is an inconvenience here also that triggers this bug: There can be recommendation of colors for nodes to avoid register-register moves, but the recommendation do not give the best register. If it had worked, this bug would never have been seen.
Bug analyzed more: it occurs when there is an assignment to a register class with concatenated registers, the result is needed for something, the move between node temp and dest register is removed in Freeze() and the registers got overlapping registers in coloring.
The correct way to solve this is to endure that there is no temporary register in an assignment if the destination is a register.

Anders Magnusson added a comment - 30/Apr/11 10:29 AM - edited No, this is not related to 289, except from the fact that it is the third(!) bug in the register allocator in a week; this time in the graph coloring code.
There is an inconvenience here also that triggers this bug: There can be recommendation of colors for nodes to avoid register-register moves, but the recommendation do not give the best register. If it had worked, this bug would never have been seen.
Bug analyzed more: it occurs when there is an assignment to a register class with concatenated registers, the result is needed for something, the move between node temp and dest register is removed in Freeze() and the registers got overlapping registers in coloring.
The correct way to solve this is to endure that there is no temporary register in an assignment if the destination is a register.