[llvm] r217344 - Add an AlignmentFromAssumptions Pass

Hal Finkel hfinkel at anl.gov
Sun Sep 7 16:16:23 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 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

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




More information about the llvm-commits mailing list