[LLVMdev] alias analysis in backend

Hal Finkel hfinkel at anl.gov
Thu Apr 18 06:42:40 PDT 2013


----- Original Message -----
> From: "Andrew Trick" <atrick at apple.com>
> To: "Hal Finkel" <hfinkel at anl.gov>
> Cc: "Jonas Paulsson" <jonas.paulsson at ericsson.com>, llvmdev at cs.uiuc.edu
> Sent: Thursday, April 18, 2013 2:33:52 AM
> Subject: Re: [LLVMdev] alias analysis in backend
> 
> 
> On Apr 17, 2013, at 2:33 AM, Hal Finkel <hfinkel at anl.gov> wrote:
> 
> > ----- Original Message -----
> >> From: "Jonas Paulsson" <jonas.paulsson at ericsson.com>
> >> To: "Hal Finkel" <hfinkel at anl.gov>
> >> Cc: llvmdev at cs.uiuc.edu
> >> Sent: Wednesday, April 17, 2013 12:22:49 AM
> >> Subject: RE: [LLVMdev] alias analysis in backend
> >> 
> >> Hi Hal,
> >> 
> >> Thanks. How about a symbol with two different immediate offsets -
> >> the
> >> Value* would be the same, right? I don't see how
> >> AliasAnalysis::Location would handle this... And
> >> BasicAliasAnalysis
> >> does
> >> 
> >> if (V1 == V2) return MustAlias;
> >> 
> >> , so I'm not sure how this would be done .. ?
> > 
> > If you run with -enable-misched -enable-aa-sched-mi
> > 
> > then you'll get this logic from the end of MIsNeedChainEdge:
> > 
> >  // The following interface to AA is fashioned after
> >  DAGCombiner::isAlias
> >  // and operates with MachineMemOperand offset with some important
> >  // assumptions:
> >  //   - LLVM fundamentally assumes flat address spaces.
> >  //   - MachineOperand offset can *only* result from legalization
> >  and
> >  //     cannot affect queries other than the trivial case of
> >  overlap
> >  //     checking.
> >  //   - These offsets never wrap and never step outside
> >  //     of allocated objects.
> >  //   - There should never be any negative offsets here.
> >  //
> > ...
> > 
> >  int64_t MinOffset = std::min(MMOa->getOffset(),
> >  MMOb->getOffset());
> >  int64_t Overlapa = MMOa->getSize() + MMOa->getOffset() -
> >  MinOffset;
> >  int64_t Overlapb = MMOb->getSize() + MMOb->getOffset() -
> >  MinOffset;
> > 
> >  AliasAnalysis::AliasResult AAResult = AA->alias(
> >  AliasAnalysis::Location(MMOa->getValue(), Overlapa,
> >                          MMOa->getTBAAInfo()),
> >  AliasAnalysis::Location(MMOb->getValue(), Overlapb,
> >                          MMOb->getTBAAInfo()));
> > 
> >  return (AAResult != AliasAnalysis::NoAlias);
> 
> This conservatively compensates for loads/stores that were split into
> narrower accesses during lowering, so doesn't help Jonas.
> 
> The MachineMemOperand offset is used differently for
> FixedFrameIndices, but we don't currently special case it here to
> disambiguate them.

Thanks, I did not understand that. I thought that each different stack slot had its own frame index, or does that only apply to callee-saved and spill slots?

 -Hal

> The general problem is that we don't have a
>  CodeGen-level alias analysis API yet. It looks like this particular
> case could be fixed with an easy patch though, unless I'm missing
> something.
> 
> -Andy
> 
> >>> -----Original Message-----
> >>> From: Hal Finkel [mailto:hfinkel at anl.gov]
> >>> Sent: Tuesday, April 16, 2013 7:35 PM
> >>> To: Jonas Paulsson
> >>> Cc: llvmdev at cs.uiuc.edu
> >>> Subject: Re: [LLVMdev] alias analysis in backend
> >>> 
> >>> ----- Original Message -----
> >>>> From: "Jonas Paulsson" <jonas.paulsson at ericsson.com>
> >>>> To: llvmdev at cs.uiuc.edu
> >>>> Sent: Tuesday, April 16, 2013 11:24:36 AM
> >>>> Subject: [LLVMdev] alias analysis in backend
> >>>> 
> >>>> 
> >>>> 
> >>>> 
> >>>> 
> >>>> Hi,
> >>>> 
> >>>> 
> >>>> 
> >>>> I would like to implement alias analysis in my backend. I would
> >>>> like
> >>>> to for example get the result that two stack-accesses with
> >>>> different
> >>>> offsets (indexes), would return noAlias. However, I'm somewhat
> >>>> confused as there is no notion of offset for the Location
> >>>> object.
> >>>> 
> >>>> 
> >>>> 
> >>>> I would also like to call ScheduleDAGInstr::buildSchedGraph()
> >>>> with
> >>>> this AliasAnalysis and have MIsNeedsChainEdge() return false in
> >>>> this
> >>>> case.
> >>>> 
> >>>> 
> >>>> 
> >>>> What should I do? Adding a MemoryOperand to such an instruction
> >>>> seems
> >>>> right, but it doesn't seem to fit quite. What Value would be
> >>>> referenced?
> >>> 
> >>> I think that they should have pseudo-source values, see:
> >>> include/llvm/CodeGen/PseudoSourceValue.h
> >>> 
> >>> I was under the impression that different pseudo source values
> >>> from
> >>> different frame indices already have this no-alias property. If
> >>> they
> >>> don't, then this seems like a nice general improvement that would
> >>> benefit
> >>> all backends.
> >>> 
> >>> -Hal
> >>> 
> >>>> BasicAliasAnalysis returns MustAlias for the same Value,
> >>>> e g 'Stack'.
> >>>> 
> >>>> 
> >>>> 
> >>>> Should I implement a target AliasAnalysis, perhaps derived from
> >>>> BasicAliasAnalysis, and make it required for my pass that will
> >>>> be
> >>>> using it?
> >>>> 
> >>>> 
> >>>> 
> >>>> If not, could I make this work with BasicAliasAnalysis by adding
> >>>> the
> >>>> right memory operands?
> >>>> 
> >>>> 
> >>>> 
> >>>> Thanks,
> >>>> 
> >>>> 
> >>>> 
> >>>> Jonas Paulsson
> >>>> 
> >>>> 
> >>>> 
> >>>> 
> >>>> 
> >>>> 
> >>>> _______________________________________________
> >>>> 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
> 
> 



More information about the llvm-dev mailing list