[llvm-commits] [llvm] r71196 - in /llvm/trunk: lib/CodeGen/RegAllocLocal.cpp test/CodeGen/ARM/2009-05-07-RegAllocLocal.ll

Evan Cheng evan.cheng at apple.com
Thu May 7 19:03:27 PDT 2009


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




More information about the llvm-commits mailing list