[llvm] r178058 - Update PEI's virtual-register-based scavenging to support multiple simultaneous mappings

Hal Finkel hfinkel at anl.gov
Mon Apr 1 01:42:26 PDT 2013


----- Original Message -----
> From: "Pranav Bhandarkar" <pranavb at codeaurora.org>
> To: "Hal Finkel" <hfinkel at anl.gov>
> Cc: llvm-commits at cs.uiuc.edu
> Sent: Sunday, March 31, 2013 7:55:17 PM
> Subject: Re: [llvm] r178058 - Update PEI's virtual-register-based scavenging to support multiple simultaneous
> mappings
> 
> Hi Hal,
> 
>        }
> -      RS->forward(I);
> -      ++I;
> +
> +      // If the scavenger needed to use one of its spill slots, the
> +      // spill code will have been inserted in between I and J. This
> is a
> +      // problem because we need the spill code before I: Move I to
> just
> +      // prior to J.
> +      if (I != llvm::prior(J)) {
> +        BB->splice(J, BB, I++);
> +        RS->skipTo(I == BB->begin() ? NULL : llvm::prior(I));
> +      } else
> +        ++I;
> 
> I think there is a problem with the above. Suppose RS had to use one
> of
> its spill slots, then the new spill instruction, say A, is now
> between I
> and J and we move I to just after A. So, now, prior(I) is A and we
> begin
> processing again from A. However, if I, which RS has already
> processed
> was killing a register, then that register, say Rx is now available.
> After A, when we process I again the RS asserts because a use of Rx
> is
> found when Rx is available (seemingly, a use without a def).

Pranav,

You're right! We'll need to 'unprocess' I if we're going to process it again later (or at least we need to remark as used all registers killed by I). Can you please bugpoint a reduced test case for me?

 -Hal

> 
> This is the signature of the error.
> 
> Using an undefined register!
> UNREACHABLE executed at
> /prj/dsp/austin/llvm/test/users/qneill/build/hexagon/llvm-DUI_main_2013_03_28-8bbaf6c-clang-DUI_main_2013_03_28-9dfb83b-polly-DUI_main_2013_03_28-83b2727/lib/CodeGen/RegisterScavenging.cpp:220!
> 
> Let me elaborate,
> (This is on Hexagon)
> 
>   %vreg2<def> = TFR_RsPd %P2<kill>; IntRegs:%vreg2         <<- (I)
>    STriw_indexed %R29, 52, %vreg2<kill>; mem:ST4[FixedStack20]
> IntRegs:%vreg2 <<-- (J).
> 
> After RS->forward(I), %P2 is available. After asking the scavenger
> for a
> register for %vreg2, we get
> 
>    %R6<def> = TFR_RsPd %P2<kill>         <<- (I)
>     STriw_indexed %R29, 436, %R6<kill>; mem:ST4[FixedStack32] <<--
>     (A)
>     STriw_indexed %R29, 52, %R6<kill>; mem:ST4[FixedStack20] <<-- (J)
> 
> We then move I before J and resume from (A) and subsequently reach
> (I)
> again when the register scavenger complains about %P2 being
> undefined.
> Let me know if I am missing something.
> 
> Pranav
> 
> 
> --
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
> hosted by The Linux Foundation
> 
> 



More information about the llvm-commits mailing list