[LLVMdev] LLVM: MachineCopyPropagation.cpp

Jonas Paulsson jonas.paulsson at ericsson.com
Thu Feb 16 06:30:26 PST 2012


I have the following code:

  %a1<def> = COPY %a0<kill>
  %a0h<def> = COPY %a1l

, as input to MachineCopyPropagation.

The second copy is illegally erased! This is wrong, because it is the low part of a1 that is copied to the high part of a0.

At a first glance, it seems that

 if (!ReservedRegs.test(Def) &&
     (!ReservedRegs.test(Src) || NoInterveningSideEffect(CopyMI, MI)) &&
       (SrcSrc == Def || TRI->isSubRegister(SrcSrc, Def))) {
        (erase COPY)

, should be extended to

      (SrcSrc == Def || (TRI->isSubRegister(SrcSrc, Def) && isMatchingSubRegIdx(%a0, %a0h, %a1, %a1l)))) {

, where isMatchingSubRegIdx (or whatever) should make sure that this type of subreg motion is not missed.

Or is there something else that I've missed, that would avoid the problem?


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120216/def24ee2/attachment.html>

More information about the llvm-dev mailing list