Invalid base register with fast-isel
Hal Finkel
hfinkel at anl.gov
Fri Jun 27 04:07:32 PDT 2014
----- Original Message -----
> From: "Ulrich Weigand" <Ulrich.Weigand at de.ibm.com>
> To: "Hal Finkel" <hfinkel at anl.gov>
> Cc: "llvm-commits" <llvm-commits at cs.uiuc.edu>
> Sent: Friday, June 27, 2014 5:56:40 AM
> Subject: Re: Invalid base register with fast-isel
>
> Hal Finkel <hfinkel at anl.gov> wrote on 24.06.2014 00:59:06:
>
> > > From: "Ulrich Weigand" <Ulrich.Weigand at de.ibm.com>
> > > To: "Hal Finkel" <hfinkel at anl.gov>
> > > Cc: "llvm-commits" <llvm-commits at cs.uiuc.edu>
> > > Sent: Monday, June 23, 2014 7:57:22 AM
> > > Subject: Invalid base register with fast-isel
>
> > > For some reason, the underlying vreg was allocated as G8RC
> > > instead of
> > > G8RC_NOX0. That vreg came originally from
> > > PPCRegisterInfo::materializeFrameBaseRegister. Changing the
> > > register
> > > class there (along the lines of the attached patch) seems to fix
> > > the
> > > problem for me, but I'm not really sure whether this is right
> > > solution.
> > > How is register class selection supposed to work with fast-isel?
> > > Isn't the presence of the vreg inside an address supposed to be
> > > enough
> > > to ensure use of the G8RC_NOX0 class?
> >
> > Yes, it is. But I suspect that the FastISel code that is creating
> > those STW instructions is not correctly setting (or constraining)
> > the register class for the base address operand. Maybe a call to
> > constrainRegClass is needed in PPCFastISel::PPCComputeAddress near
> > where the Instruction::Alloca case is handled?
>
> I'm not sure I understand exactly what you're suggesting here, sorry
> ...
>
> In this particular case, FastISel doesn't create the base register
> at all; it simply creates a FrameIndex reference, which is resolved
> in the "Local Stack Slot Allocation" pass (that would presumably
> also handle the SelectionDAG case).
>
> Before Local Stack Slot Allocation, we have:
>
> %vreg183<def> = LI 0; GPRC:%vreg183
> STW %vreg183, 0, <fi#0>; mem:ST4[%i] GPRC:%vreg183
> STW %vreg183, 0, <fi#1>; mem:ST4[%j] GPRC:%vreg183
>
> (The only register involved is %vreg183, which is perfectly fine
> as GPRC; the address is a plain <fi> with no explicit register
> at all at this stage.)
>
> *After* Local Stack Slot Allocation, we have:
>
> BB#0: derived from LLVM BB %entry
> %vreg383<def> = ADDI8 <fi#4>, 0; G8RC:%vreg383
> [... many instructions later ...]
> %vreg183<def> = LI 0; GPRC:%vreg183
> STW %vreg183, 10348, %vreg383; mem:ST4[%i] GPRC:%vreg183
> G8RC:%vreg383
> STW %vreg183, 10344, %vreg383; mem:ST4[%j] GPRC:%vreg183
> G8RC:%vreg383
>
> At this point the <fi> references have been resolved in terms of an
> intermediate base register, which was introduced (as originally
> mentioned)
> in PPCRegisterInfo::materializeFrameBaseRegister.
>
> As far as I can see, that latter process took place long after
> FastISel,
> and
> with FastISel having no oppportunity to influence its choices ...
>
> Am I missing something here?
You're right; but logically, the restriction does not belong on the output from materializeFrameBaseRegister. Can you constrain the register class on the store operand near the end of PPCRegisterInfo::eliminateFrameIndex?
Thanks again,
Hal
>
> Bye,
> Ulrich
>
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-commits
mailing list