[llvm] r217344 - Add an AlignmentFromAssumptions Pass

Hal Finkel hfinkel at anl.gov
Sun Sep 7 16:30:48 PDT 2014


----- Original Message -----
> From: "Andrew Trick" <atrick at apple.com>
> To: "Hal Finkel" <hfinkel at anl.gov>
> Cc: "llvm commits" <llvm-commits at cs.uiuc.edu>
> Sent: Sunday, September 7, 2014 6:28:39 PM
> Subject: Re: [llvm] r217344 - Add an AlignmentFromAssumptions Pass
> 
> 
> > On Sep 7, 2014, at 4:16 PM, Hal Finkel <hfinkel at anl.gov> wrote:
> > 
> > ----- Original Message -----
> >> From: "Andrew Trick" <atrick at apple.com>
> >> To: "Hal Finkel" <hfinkel at anl.gov>
> >> Cc: "llvm commits" <llvm-commits at cs.uiuc.edu>
> >> Sent: Sunday, September 7, 2014 5:29:41 PM
> >> Subject: Re: [llvm] r217344 - Add an AlignmentFromAssumptions Pass
> >> 
> >> On Sep 7, 2014, at 1:05 PM, Hal Finkel < hfinkel at anl.gov > wrote:
> >> 
> >> +// Given an expression for the (constant) alignment, AlignSCEV,
> >> and
> >> an
> >> +// expression for the displacement between a pointer and the
> >> aligned
> >> address,
> >> +// DiffSCEV, compute the alignment of the displaced pointer if it
> >> can be
> >> +// reduced to a constant.
> >> +static unsigned getNewAlignmentDiff(const SCEV *DiffSCEV,
> >> + const SCEV *AlignSCEV,
> >> + ScalarEvolution *SE) {
> >> + // DiffUnits = Diff % int64_t(Alignment)
> >> + const SCEV *DiffAlignDiv = SE->getUDivExpr(DiffSCEV, AlignSCEV);
> >> + const SCEV *DiffAlign = SE->getMulExpr(DiffAlignDiv, AlignSCEV);
> >> + const SCEV *DiffUnitsSCEV = SE->getMinusSCEV(DiffAlign,
> >> DiffSCEV);
> >> +
> >> + DEBUG(dbgs() << "\talignment relative to " << *AlignSCEV << " is
> >> "
> >> <<
> >> + *DiffUnitsSCEV << " (diff: " << *DiffSCEV << ")\n");
> >> +
> >> + if (const SCEVConstant *ConstDUSCEV =
> >> + dyn_cast<SCEVConstant>(DiffUnitsSCEV)) {
> >> + int64_t DiffUnits = ConstDUSCEV->getValue()->getSExtValue();
> >> 
> >> 
> >> Hi Hal,
> >> 
> >> 
> >> One thing I didn’t understand after reviewing this is how
> >> DIffUnitsSCEV can be constant if either DiffSCEV or AlignSCEV are
> >> nonconstant. Are you ever seeing that case? If so, can you post
> >> SCEVs that you’re seeing so I can understand and we can add
> >> comments?
> > 
> > Sure, there is at least one function in the regression test that
> > demonstrate this. Here's one (so DiffSCEV is
> > {16,+,32}<nuw><%for.body>, and AlignSCEV is 32, so the remainder
> > is a constant):
> > 
> > AFI: alignment of   %arrayidx = getelementptr inbounds i32* %a, i64
> > %indvars.iv relative to 32 and offset 0 using diff
> > {16,+,32}<%for.body>
> >        alignment relative to 32 is -16 (diff:
> >        {16,+,32}<nuw><%for.body>)
> >        new alignment: 16
> 
> Of course, a recurrence with constant operands does it, and is quite
> common. Thanks.

No problem; thanks for adding the comment!

 -Hal

> -Andy
> 
> > 
> > define i32 @joo(i32* nocapture %a) nounwind uwtable readonly {
> > entry:
> >  %ptrint = ptrtoint i32* %a to i64
> >  %maskedptr = and i64 %ptrint, 31
> >  %maskcond = icmp eq i64 %maskedptr, 0
> >  tail call void @llvm.assume(i1 %maskcond)
> >  br label %for.body
> > 
> > for.body:                                         ; preds = %entry,
> > %for.body
> >  %indvars.iv = phi i64 [ 4, %entry ], [ %indvars.iv.next, %for.body
> >  ]
> >  %r.06 = phi i32 [ 0, %entry ], [ %add, %for.body ]
> >  %arrayidx = getelementptr inbounds i32* %a, i64 %indvars.iv
> >  %0 = load i32* %arrayidx, align 4
> >  %add = add nsw i32 %0, %r.06
> >  %indvars.iv.next = add i64 %indvars.iv, 8
> >  %1 = trunc i64 %indvars.iv.next to i32
> >  %cmp = icmp slt i32 %1, 2048
> >  br i1 %cmp, label %for.body, label %for.end
> > 
> > for.end:                                          ; preds =
> > %for.body
> >  %add.lcssa = phi i32 [ %add, %for.body ]
> >  ret i32 %add.lcssa
> > 
> > ; CHECK-LABEL: @joo
> > ; CHECK: load i32* %arrayidx, align 16
> > ; CHECK: ret i32 %add.lcssa
> > }
> > 
> > Thanks again,
> > Hal
> > 
> >> 
> >> 
> >> -Andy
> > 
> > --
> > Hal Finkel
> > Assistant Computational Scientist
> > Leadership Computing Facility
> > Argonne National Laboratory
> 
> 

-- 
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory




More information about the llvm-commits mailing list