[llvm-commits] [llvm] r71196 - in /llvm/trunk: lib/CodeGen/RegAllocLocal.cpp test/CodeGen/ARM/2009-05-07-RegAllocLocal.ll
Bob Wilson
bob.wilson at apple.com
Fri May 8 14:23:47 PDT 2009
I agree that would be better. After looking at for a while today,
though, I think it may be beyond my current understanding of the code
to implement that. Maybe I can come back to it later.
On May 7, 2009, at 7:09 PM, Evan Cheng wrote:
> Well, I can think of an alternative solution. Why not inhibit
> reloading of reg1028? It's easy to tell since the only use is a copy
> (use is killed right away) and its def is dead.
>
> Evan
>
> On May 7, 2009, at 7:03 PM, Evan Cheng wrote:
>
>> This is fine for local regalloc since performance is not critical.
>> Thanks.
>>
>> Evan
>>
>> On May 7, 2009, at 4:47 PM, Bob Wilson wrote:
>>
>>> Author: bwilson
>>> Date: Thu May 7 18:47:03 2009
>>> New Revision: 71196
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=71196&view=rev
>>> Log:
>>> Fix pr4100. Do not remove no-op copies when they are dead. The
>>> register
>>> scavenger gets confused about register liveness if it doesn't see
>>> them.
>>> I'm not thrilled with this solution, but it only comes up when there
>>> are dead
>>> copies in the code, which is something that hopefully doesn't happen
>>> much.
>>>
>>> Here is what happens in pr4100: As shown in the following excerpt
>>> from the
>>> debug output of llc, the source of a move gets reloaded from the
>>> stack,
>>> inserting a new load instruction before the move. Since that source
>>> operand
>>> is a kill, the physical register is free to be reused for the
>>> destination
>>> of the move. The move ends up being a no-op, copying R3 to R3, so
>>> it is
>>> deleted. But, it leaves behind the load to reload %reg1028 into R3,
>>> and
>>> that load is not updated to show that it's destination operand (R3)
>>> is dead.
>>> The scavenger gets confused by that load because it thinks that R3
>>> is live.
>>>
>>> Starting RegAlloc of: %reg1025<def,dead> = MOVr %reg1028<kill>, 14,
>>> %reg0, %reg0
>>> Regs have values:
>>> Reloading %reg1028 into R3
>>> Last use of R3[%reg1028], removing it from live set
>>> Assigning R3 to %reg1025
>>> Register R3 [%reg1025] is never used, removing it from live set
>>>
>>> Alternative solutions might be either marking the load as dead, or
>>> zapping
>>> the load along with the no-op copy. I couldn't see an easy way to
>>> do
>>> either of those, though.
>>>
>>> Added:
>>> llvm/trunk/test/CodeGen/ARM/2009-05-07-RegAllocLocal.ll
>>> Modified:
>>> llvm/trunk/lib/CodeGen/RegAllocLocal.cpp
>>>
>>> Modified: llvm/trunk/lib/CodeGen/RegAllocLocal.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/RegAllocLocal.cpp?rev=71196&r1=71195&r2=71196&view=diff
>>>
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> ====================================================================
>>> --- llvm/trunk/lib/CodeGen/RegAllocLocal.cpp (original)
>>> +++ llvm/trunk/lib/CodeGen/RegAllocLocal.cpp Thu May 7 18:47:03
>>> 2009
>>> @@ -981,10 +981,12 @@
>>> }
>>> }
>>>
>>> - // Finally, if this is a noop copy instruction, zap it.
>>> + // Finally, if this is a noop copy instruction, zap it.
>>> (Except that if
>>> + // the copy is dead, it must be kept to avoid messing up
>>> liveness info for
>>> + // the register scavenger. See pr4100.)
>>> unsigned SrcReg, DstReg, SrcSubReg, DstSubReg;
>>> if (TII->isMoveInstr(*MI, SrcReg, DstReg, SrcSubReg, DstSubReg) &&
>>> - SrcReg == DstReg)
>>> + SrcReg == DstReg && DeadDefs.empty())
>>> MBB.erase(MI);
>>> }
>>>
>>>
>>> Added: llvm/trunk/test/CodeGen/ARM/2009-05-07-RegAllocLocal.ll
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/2009-05-07-RegAllocLocal.ll?rev=71196&view=auto
>>>
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> =
>>> ====================================================================
>>> --- llvm/trunk/test/CodeGen/ARM/2009-05-07-RegAllocLocal.ll (added)
>>> +++ llvm/trunk/test/CodeGen/ARM/2009-05-07-RegAllocLocal.ll Thu May
>>> 7 18:47:03 2009
>>> @@ -0,0 +1,12 @@
>>> +; RUN: llvm-as < %s | llc -mtriple=armv5-unknown-linux-gnueabi -
>>> O0 -
>>> regalloc=local
>>> +; PR4100
>>> + at .str = external constant [30 x i8] ; <[30 x i8]*> [#uses=1]
>>> +
>>> +define i16 @fn16(i16 %arg0.0, <2 x i16> %arg1, i16 %arg2.0)
>>> nounwind {
>>> +entry:
>>> + store <2 x i16> %arg1, <2 x i16>* null
>>> + %0 = call i32 (i8*, ...)* @printf(i8* getelementptr ([30 x i8]*
>>> @.str, i32 0, i32 0), i32 0) nounwind ; <i32> [#uses=0]
>>> + ret i16 0
>>> +}
>>> +
>>> +declare i32 @printf(i8*, ...) nounwind
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list