[llvm] r219135 - [BasicAA] Revert "Revert r218714 - Make better use of zext and sign information."

James Molloy james at jamesmolloy.co.uk
Thu Oct 9 12:52:08 PDT 2014


Hi,

I've just narrowed down a build failure on povray in SPEC2k6 to this too.

Could you please revert? I can try and get you a testcase in the morning
(SPEC2k6 testcases need to be anonymised which takes time :( )

Cheers,

James

On 9 October 2014 19:45, Hal Finkel <hfinkel at anl.gov> wrote:

> ----- Original Message -----
> > From: "Lang Hames" <lhames at gmail.com>
> > To: "Hal Finkel" <hfinkel at anl.gov>
> > Cc: "Commit Messages and Patches for LLVM" <llvm-commits at cs.uiuc.edu>,
> "Nicholas White" <n.j.white at gmail.com>
> > Sent: Thursday, October 9, 2014 1:34:19 PM
> > Subject: Re: [llvm] r219135 - [BasicAA] Revert "Revert r218714 - Make
> better use of zext and sign information."
> >
> >
> > Hi Hal, Nick,
> >
> >
> > It looks like this broke SPEC2k6/464.h264ref on x86-64 (and possibly
> > ARM as well - I'm still investigating there). Do you guys have
> > access to SPEC2k6? Have you seen any failures locally?
>
> I do, but I don't have it running nightly (likely should). Feel free to
> revert while we figure it out.
>
> Thanks again,
> Hal
>
> >
> >
> > Cheers,
> > Lang.
> >
> >
> >
> >
> > On Mon, Oct 6, 2014 at 11:38 AM, Hal Finkel < hfinkel at anl.gov >
> > wrote:
> >
> >
> > Author: hfinkel
> > Date: Mon Oct 6 13:37:59 2014
> > New Revision: 219135
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=219135&view=rev
> > Log:
> > [BasicAA] Revert "Revert r218714 - Make better use of zext and sign
> > information."
> >
> > This reverts r218944, which reverted r218714, plus a bug fix.
> >
> > Description of the bug in r218714 (by Nick)
> >
> > The original patch forgot to check if the Scale in VariableGEPIndex
> > flipped the
> > sign of the variable. The BasicAA pass iterates over the instructions
> > in the
> > order they appear in the function, and so
> > BasicAliasAnalysis::aliasGEP is
> > called with the variable it first comes across as parameter GEP1.
> > Adding a
> > %reorder label puts the definition of %a after %b so aliasGEP is
> > called with %b
> > as the first parameter and %a as the second. aliasGEP later
> > calculates that %a
> > == %b + 1 - %idxprom where %idxprom >= 0 (if %a was passed as the
> > first
> > parameter it would calculate %b == %a - 1 + %idxprom where %idxprom
> > >= 0) -
> > ignoring that %idxprom is scaled by -1 here lead the patch to
> > incorrectly
> > conclude that %a > %b.
> >
> > Revised patch by Nick White, thanks! Thanks to Lang to isolating the
> > bug.
> > Slightly modified by me to add an early exit from the loop and avoid
> > unnecessary, but expensive, function calls.
> >
> > Original commit message:
> >
> > Two related things:
> >
> > 1. Fixes a bug when calculating the offset in GetLinearExpression.
> > The code
> > previously used zext to extend the offset, so negative offsets were
> > converted
> > to large positive ones.
> >
> > 2. Enhance aliasGEP to deduce that, if the difference between two GEP
> > allocations is positive and all the variables that govern the offset
> > are also
> > positive (i.e. the offset is strictly after the higher base pointer),
> > then
> > locations that fit in the gap between the two base pointers are
> > NoAlias.
> >
> > Patch by Nick White!
> >
> > Added:
> > llvm/trunk/test/Analysis/BasicAA/zext.ll
> > Modified:
> > llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
> > llvm/trunk/test/Analysis/BasicAA/phi-aa.ll
> >
> > Modified: llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp
> > URL:
> >
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp?rev=219135&r1=219134&r2=219135&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp (original)
> > +++ llvm/trunk/lib/Analysis/BasicAliasAnalysis.cpp Mon Oct 6 13:37:59
> > 2014
> > @@ -254,7 +254,10 @@ static Value *GetLinearExpression(Value
> > Value *Result = GetLinearExpression(CastOp, Scale, Offset, Extension,
> > DL, Depth+1, AT, DT);
> > Scale = Scale.zext(OldWidth);
> > - Offset = Offset.zext(OldWidth);
> > +
> > + // We have to sign-extend even if Extension == EK_ZeroExt as we
> > can't
> > + // decompose a sign extension (i.e. zext(x - 1) != zext(x) -
> > zext(-1)).
> > + Offset = Offset.sext(OldWidth);
> >
> > return Result;
> > }
> > @@ -1055,8 +1058,38 @@ BasicAliasAnalysis::aliasGEP(const GEPOp
> > // Grab the least significant bit set in any of the scales.
> > if (!GEP1VariableIndices.empty()) {
> > uint64_t Modulo = 0;
> > - for (unsigned i = 0, e = GEP1VariableIndices.size(); i != e; ++i)
> > + bool AllPositive = true;
> > + for (unsigned i = 0, e = GEP1VariableIndices.size();
> > + i != e && AllPositive; ++i) {
> > + const Value *V = GEP1VariableIndices[i].V;
> > Modulo |= (uint64_t)GEP1VariableIndices[i].Scale;
> > +
> > + bool SignKnownZero, SignKnownOne;
> > + ComputeSignBit(
> > + const_cast<Value *>(V),
> > + SignKnownZero, SignKnownOne,
> > + DL, 0, AT, nullptr, DT);
> > +
> > + // Zero-extension widens the variable, and so forces the sign
> > + // bit to zero.
> > + bool IsZExt = GEP1VariableIndices[i].Extension == EK_ZeroExt;
> > + SignKnownZero |= IsZExt;
> > + SignKnownOne &= !IsZExt;
> > +
> > + // If the variable begins with a zero then we know it's
> > + // positive, regardless of whether the value is signed or
> > + // unsigned.
> > + int64_t Scale = GEP1VariableIndices[i].Scale;
> > + AllPositive &=
> > + (SignKnownZero && Scale >= 0) ||
> > + (SignKnownOne && Scale < 0);
> > +
> > + // If the Value is currently positive but could change in a cycle,
> > + // then we can't guarantee it'll always br positive.
> > + if (AllPositive && !isValueEqualInPotentialCycles(V, V))
> > + AllPositive = false;
> > + }
> > +
> > Modulo = Modulo ^ (Modulo & (Modulo - 1));
> >
> > // We can compute the difference between the two addresses
> > @@ -1066,6 +1099,12 @@ BasicAliasAnalysis::aliasGEP(const GEPOp
> > if (V1Size != UnknownSize && V2Size != UnknownSize &&
> > ModOffset >= V2Size && V1Size <= Modulo - ModOffset)
> > return NoAlias;
> > +
> > + // If we know all the variables are positive, then GEP1 >=
> > GEP1BasePtr.
> > + // If GEP1BasePtr > V2 (GEP1BaseOffset > 0) then we know the
> > pointers
> > + // don't alias if V2Size can fit in the gap between V2 and
> > GEP1BasePtr.
> > + if (AllPositive && GEP1BaseOffset > 0 && V2Size <= (uint64_t)
> > GEP1BaseOffset)
> > + return NoAlias;
> > }
> >
> > // Statically, we can see that the base objects are the same, but the
> >
> > Modified: llvm/trunk/test/Analysis/BasicAA/phi-aa.ll
> > URL:
> >
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/phi-aa.ll?rev=219135&r1=219134&r2=219135&view=diff
> >
> ==============================================================================
> > --- llvm/trunk/test/Analysis/BasicAA/phi-aa.ll (original)
> > +++ llvm/trunk/test/Analysis/BasicAA/phi-aa.ll Mon Oct 6 13:37:59
> > 2014
> > @@ -39,6 +39,7 @@ return:
> >
> > ; CHECK-LABEL: pr18068
> > ; CHECK: MayAlias: i32* %0, i32* %arrayidx5
> > +; CHECK: NoAlias: i32* %arrayidx13, i32* %arrayidx5
> >
> > define i32 @pr18068(i32* %jj7, i32* %j) {
> > entry:
> >
> > Added: llvm/trunk/test/Analysis/BasicAA/zext.ll
> > URL:
> >
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/BasicAA/zext.ll?rev=219135&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/test/Analysis/BasicAA/zext.ll (added)
> > +++ llvm/trunk/test/Analysis/BasicAA/zext.ll Mon Oct 6 13:37:59 2014
> > @@ -0,0 +1,87 @@
> > +; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info
> > -disable-output 2>&1 | FileCheck %s
> > +target datalayout =
> >
> "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
> > +target triple = "x86_64-unknown-linux-gnu"
> > +
> > +; CHECK-LABEL: test_with_zext
> > +; CHECK: NoAlias: i8* %a, i8* %b
> > +
> > +define void @test_with_zext() {
> > + %1 = tail call i8* @malloc(i64 120)
> > + %a = getelementptr inbounds i8* %1, i64 8
> > + %2 = getelementptr inbounds i8* %1, i64 16
> > + %3 = zext i32 3 to i64
> > + %b = getelementptr inbounds i8* %2, i64 %3
> > + ret void
> > +}
> > +
> > +; CHECK-LABEL: test_with_lshr
> > +; CHECK: NoAlias: i8* %a, i8* %b
> > +
> > +define void @test_with_lshr(i64 %i) {
> > + %1 = tail call i8* @malloc(i64 120)
> > + %a = getelementptr inbounds i8* %1, i64 8
> > + %2 = getelementptr inbounds i8* %1, i64 16
> > + %3 = lshr i64 %i, 2
> > + %b = getelementptr inbounds i8* %2, i64 %3
> > + ret void
> > +}
> > +
> > +; CHECK-LABEL: test_with_a_loop
> > +; CHECK: NoAlias: i8* %a, i8* %b
> > +
> > +define void @test_with_a_loop() {
> > + %1 = tail call i8* @malloc(i64 120)
> > + %a = getelementptr inbounds i8* %1, i64 8
> > + %2 = getelementptr inbounds i8* %1, i64 16
> > + br label %for.loop
> > +
> > +for.loop:
> > + %i = phi i32 [ 0, %0 ], [ %i.next, %for.loop ]
> > + %3 = zext i32 %i to i64
> > + %b = getelementptr inbounds i8* %2, i64 %3
> > + %i.next = add nuw nsw i32 %i, 1
> > + %4 = icmp eq i32 %i.next, 10
> > + br i1 %4, label %for.loop.exit, label %for.loop
> > +
> > +for.loop.exit:
> > + ret void
> > +}
> > +
> > +; CHECK-LABEL: test_sign_extension
> > +; CHECK: PartialAlias: i64* %b.i64, i8* %a
> > +
> > +define void @test_sign_extension(i32 %p) {
> > + %1 = tail call i8* @malloc(i64 120)
> > + %p.64 = zext i32 %p to i64
> > + %a = getelementptr inbounds i8* %1, i64 %p.64
> > + %p.minus1 = add i32 %p, -1
> > + %p.minus1.64 = zext i32 %p.minus1 to i64
> > + %b.i8 = getelementptr inbounds i8* %1, i64 %p.minus1.64
> > + %b.i64 = bitcast i8* %b.i8 to i64*
> > + ret void
> > +}
> > +
> > +; CHECK-LABEL: test_fe_tools
> > +; CHECK: PartialAlias: i32* %a, i32* %b
> > +
> > +define void @test_fe_tools([8 x i32]* %values) {
> > + br label %reorder
> > +
> > +for.loop:
> > + %i = phi i32 [ 0, %reorder ], [ %i.next, %for.loop ]
> > + %idxprom = zext i32 %i to i64
> > + %b = getelementptr inbounds [8 x i32]* %values, i64 0, i64 %idxprom
> > + %i.next = add nuw nsw i32 %i, 1
> > + %1 = icmp eq i32 %i.next, 10
> > + br i1 %1, label %for.loop.exit, label %for.loop
> > +
> > +reorder:
> > + %a = getelementptr inbounds [8 x i32]* %values, i64 0, i64 1
> > + br label %for.loop
> > +
> > +for.loop.exit:
> > + ret void
> > +}
> > +
> > +; Function Attrs: nounwind
> > +declare noalias i8* @malloc(i64)
> >
> >
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> >
> >
>
> --
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20141009/8add8a2b/attachment.html>


More information about the llvm-commits mailing list