[LLVMdev] Splitting live ranges of half-defined registers
Jakob Stoklund Olesen
jolesen at apple.com
Mon Jan 14 13:47:09 PST 2013
On Jan 14, 2013, at 1:39 PM, Krzysztof Parzyszek <kparzysz at codeaurora.org> wrote:
> On 1/14/2013 3:16 PM, Jakob Stoklund Olesen wrote:
>> On Jan 14, 2013, at 12:56 PM, Krzysztof Parzyszek <kparzysz at codeaurora.org> wrote:
>>> My question is: is this something that was a part of the design?
>> Yes, the register allocator only deals in full-width virtual registers, so any copies or spills created will operate on the full register.
> I see.
> Unfortunately, this is causing some customer code to fail in compilation. The direct cause of the compilation failure is a complaint from the register scavenger in the scenario that I described in the first email.
It shouldn't be causing any compile time failures, the VirtRegRewriter is adding <imp-def> operands for the wide register to make it look like it is live everywhere the virtual register was live:
vreg(64).low_half = vreg(32) // vreg(64) = 64-bit register
Should be rewritten as:
physreg(32) = other-physreg(32), physreg(64)<imp-def>
In the worst case, you should get a 64-bit copy instruction where a 32-bit copy would have been sufficient.
It is quite common for post-RA passes to get the <imp-def> operands wrong. It's really hard to get it right.
The machine code verifier (llc -verify-machineinstrs) can find these errors.
More information about the llvm-dev