[LLVMdev] sinking address computing in CodeGenPrepare
Hal Finkel
hfinkel at anl.gov
Wed Nov 20 17:38:57 PST 2013
----- Original Message -----
> From: "Evan Cheng" <evan.cheng at apple.com>
> To: "Junbum Lim" <junbums at gmail.com>
> Cc: llvmdev at cs.uiuc.edu
> Sent: Wednesday, November 20, 2013 7:01:49 PM
> Subject: Re: [LLVMdev] sinking address computing in CodeGenPrepare
>
>
> On Nov 20, 2013, at 3:10 PM, Junbum Lim <junbums at gmail.com> wrote:
>
> >
> >
> > When multiple GEPs or other operations are used for the address
> > calculation, OptimizeMemoryInst() performs address matching and
> > determines a final addressing expression as a simple form (e.g.,
> > ptrtoint/add/inttoptr) and sinks it into user's block so that ISel
> > could have better chance to fold address computation into LDRs and
> > STRs. However, OptimizeMemoryInst() seems to do this
> > transformation even when the address calculation derived from a
> > single GEP, resulting in poor alias analysis because GEP is no
> > longer used.
>
> I don't follow your last statement. How does this impact AA?
> CodeGenPrep is run late, after AA is done.
I don't know if this is relevant for Lim or not, but some targets use AA during CodeGen (instruction scheduling mostly, but SDAG too).
-Hal
>
> Evan
>
> >
> > So, do you think it is a possible workaround to sink a GEP without
> > converting it into a set of integer operations
> > (ptrtoint/add/inttoptr) if the address mode is derived only from a
> > single GEP.
> >
> > Thanks,
> > Jun
> >
> >
> > On Nov 12, 2013, at 7:14 PM, Evan Cheng <evan.cheng at apple.com>
> > wrote:
> >
> >>
> >> On Nov 12, 2013, at 11:24 AM, Junbum Lim <junbums at gmail.com>
> >> wrote:
> >>
> >>>
> >>> I wonder why CodeGenPrepare breaks GEP into integer calculations
> >>> (ptrtoin/add/inttopt) instead of directly sinking the address
> >>> calculation using GEP into user's block.
> >>
> >> I believe it's primary for address mode matching where only part
> >> of the GEP can be folded (depending on the instruction set).
> >>
> >> Evan
> >>
> >>>
> >>> Thanks,
> >>> Jun
> >>>
> >>>
> >>> On Nov 12, 2013, at 12:07 PM, Evan Cheng <evan.cheng at apple.com>
> >>> wrote:
> >>>
> >>>> The reason for this is to allow folding of address computation
> >>>> into loads and stores. A lot of modern arch, e.g. X86 and arm,
> >>>> have complex addressing mode.
> >>>>
> >>>> Evan
> >>>>
> >>>> Sent from my iPad
> >>>>
> >>>>> On Nov 12, 2013, at 8:39 AM, Junbum Lim <junbums at gmail.com>
> >>>>> wrote:
> >>>>>
> >>>>> Hi All,
> >>>>>
> >>>>> In CodeGenPrepare pass, OptimizeMemoryInst() try to sink
> >>>>> address computing into users' block by converting GET to
> >>>>> integers? It appear that it have impacts on ISel's result, but
> >>>>> I'm not clear about the main purpose of the transformation.
> >>>>>
> >>>>> FROM :
> >>>>> for.body.lr.ph:
> >>>>> %zzz = getelementptr inbounds %struct.SS* %a2, i32
> >>>>> 0, i32 35
> >>>>>
> >>>>> for.body:
> >>>>> %4 = load double* %zzz, align 8, !tbaa !0
> >>>>>
> >>>>> TO :
> >>>>> for.body:
> >>>>> %sunkaddr27 = ptrtoint %struct.SS* %a2 to i32 <----- sink
> >>>>> address computing into user's block
> >>>>> %sunkaddr28 = add i32 %sunkaddr27, 272
> >>>>> %sunkaddr29 = inttoptr i32 %sunkaddr28 to double*
> >>>>> %4 = load double* %sunkaddr29, align 8, !tbaa !8
> >>>>>
> >>>>>
> >>>>> From what I observed, this transformation can cause poor alias
> >>>>> analysis results without using GEP. So, I want to see there
> >>>>> is any way to avoid this conversion.
> >>>>>
> >>>>> My question is :
> >>>>> 1. Why do we need to sink address computing into users' block?
> >>>>> What is the benefit of this conversion ?
> >>>>> 2. Can we directly use GEP instead of breaking it into integer
> >>>>> calculations ?
> >>>>>
> >>>>> Thanks,
> >>>>> Jun
> >>>>> _______________________________________________
> >>>>> LLVM Developers mailing list
> >>>>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> >>>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
> >>>
> >>
> >
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-dev
mailing list