[llvm-commits] [llvm] r164596 - in /llvm/trunk: lib/Transforms/Scalar/SROA.cpp test/Transforms/SROA/phi-and-select.ll

Roman Divacky rdivacky at freebsd.org
Tue Sep 25 08:24:55 PDT 2012


On Tue, Sep 25, 2012 at 05:18:00PM +0200, Roman Divacky wrote:
> Chandler,
> 
> Something in the new SROA is breaking PowerPC selfhost a lot.
> 
> I know that selfhosted llvm at around r164553 had llvm-test 74 failures
> but r164603 has 430.
> 
> By naive disabling what I think can cause this:
> 
> Index: lib/Transforms/Scalar/SROA.cpp
> ===================================================================
> --- lib/Transforms/Scalar/SROA.cpp      (revision 164603)
> +++ lib/Transforms/Scalar/SROA.cpp      (working copy)
> @@ -1845,7 +1845,7 @@
>        ElementSize = VecTy->getScalarSizeInBits() / 8;
>      } else if (isIntegerPromotionViable(TD, NewAI.getAllocatedType(),
>                                          P, I, E)) {
> -      IntPromotionTy = cast<IntegerType>(NewAI.getAllocatedType());
> +      //IntPromotionTy = cast<IntegerType>(NewAI.getAllocatedType());
>      }
>      bool CanSROA = true;
>      for (; I != E; ++I) {
> 
> 
> I am seeing only 66 failures.
> 
> Not sure if it proves anything but Duncan said there's some little-endian
> hardcoding in integer promotion. PowerPC is LE.
                                              ^ Big Endian of course. 
> I dont have any testcase. Do you plan to fix the SROA LE thing in near future?
> Or can you provide quick'n'dirty patch how to disable it (other than mine)?
> 
> Thank you, Roman 
> 
> On Tue, Sep 25, 2012 at 10:03:40AM -0000, Chandler Carruth wrote:
> > Author: chandlerc
> > Date: Tue Sep 25 05:03:40 2012
> > New Revision: 164596
> > 
> > URL: http://llvm.org/viewvc/llvm-project?rev=164596&view=rev
> > Log:
> > Fix a case where SROA did not correctly detect dead PHI or selects due
> > to chains or cycles between PHIs and/or selects. Also add a couple of
> > really nice test cases reduced from Kostya's reports in PR13905 and
> > PR13906. Both are fixed by this patch.
> > 
> > Modified:
> >     llvm/trunk/lib/Transforms/Scalar/SROA.cpp
> >     llvm/trunk/test/Transforms/SROA/phi-and-select.ll
> > 
> > Modified: llvm/trunk/lib/Transforms/Scalar/SROA.cpp
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/SROA.cpp?rev=164596&r1=164595&r2=164596&view=diff
> > ==============================================================================
> > --- llvm/trunk/lib/Transforms/Scalar/SROA.cpp (original)
> > +++ llvm/trunk/lib/Transforms/Scalar/SROA.cpp Tue Sep 25 05:03:40 2012
> > @@ -522,8 +522,10 @@
> >  
> >    void insertUse(Instruction &I, int64_t Offset, uint64_t Size,
> >                   bool IsSplittable = false) {
> > -    // Completely skip uses which don't overlap the allocation.
> > -    if ((Offset >= 0 && (uint64_t)Offset >= AllocSize) ||
> > +    // Completely skip uses which have a zero size or don't overlap the
> > +    // allocation.
> > +    if (Size == 0 ||
> > +        (Offset >= 0 && (uint64_t)Offset >= AllocSize) ||
> >          (Offset < 0 && (uint64_t)-Offset >= Size)) {
> >        DEBUG(dbgs() << "WARNING: Ignoring " << Size << " byte use @" << Offset
> >                     << " which starts past the end of the " << AllocSize
> > @@ -697,6 +699,9 @@
> >      SmallVector<std::pair<Instruction *, Instruction *>, 4> Uses;
> >      Visited.insert(Root);
> >      Uses.push_back(std::make_pair(cast<Instruction>(*U), Root));
> > +    // If there are no loads or stores, the access is dead. We mark that as
> > +    // a size zero access.
> > +    Size = 0;
> >      do {
> >        Instruction *I, *UsedI;
> >        llvm::tie(UsedI, I) = Uses.pop_back_val();
> > @@ -824,9 +829,9 @@
> >    }
> >  
> >    void insertUse(Instruction &User, int64_t Offset, uint64_t Size) {
> > -    // If the use extends outside of the allocation, record it as a dead use
> > -    // for elimination later.
> > -    if ((uint64_t)Offset >= AllocSize ||
> > +    // If the use has a zero size or extends outside of the allocation, record
> > +    // it as a dead use for elimination later.
> > +    if (Size == 0 || (uint64_t)Offset >= AllocSize ||
> >          (Offset < 0 && (uint64_t)-Offset >= Size))
> >        return markAsDead(User);
> >  
> > 
> > Modified: llvm/trunk/test/Transforms/SROA/phi-and-select.ll
> > URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/SROA/phi-and-select.ll?rev=164596&r1=164595&r2=164596&view=diff
> > ==============================================================================
> > --- llvm/trunk/test/Transforms/SROA/phi-and-select.ll (original)
> > +++ llvm/trunk/test/Transforms/SROA/phi-and-select.ll Tue Sep 25 05:03:40 2012
> > @@ -327,3 +327,48 @@
> >    %load = load i32* %a
> >    ret i32 %load
> >  }
> > +
> > +define i32 @PR13905() {
> > +; Check a pattern where we have a chain of dead phi nodes to ensure they are
> > +; deleted and promotion can proceed.
> > +; CHECK: @PR13905
> > +; CHECK-NOT: alloca i32
> > +; CHECK: ret i32 undef
> > +
> > +entry:
> > +  %h = alloca i32
> > +  store i32 0, i32* %h
> > +  br i1 undef, label %loop1, label %exit
> > +
> > +loop1:
> > +  %phi1 = phi i32* [ null, %entry ], [ %h, %loop1 ], [ %h, %loop2 ]
> > +  br i1 undef, label %loop1, label %loop2
> > +
> > +loop2:
> > +  br i1 undef, label %loop1, label %exit
> > +
> > +exit:
> > +  %phi2 = phi i32* [ %phi1, %loop2 ], [ null, %entry ]
> > +  ret i32 undef
> > +}
> > +
> > +define i32 @PR13906() {
> > +; Another pattern which can lead to crashes due to failing to clear out dead
> > +; PHI nodes or select nodes. This triggers subtly differently from the above
> > +; cases because the PHI node is (recursively) alive, but the select is dead.
> > +; CHECK: @PR13906
> > +; CHECK-NOT: alloca
> > +
> > +entry:
> > +  %c = alloca i32
> > +  store i32 0, i32* %c
> > +  br label %for.cond
> > +
> > +for.cond:
> > +  %d.0 = phi i32* [ undef, %entry ], [ %c, %if.then ], [ %d.0, %for.cond ]
> > +  br i1 undef, label %if.then, label %for.cond
> > +
> > +if.then:
> > +  %tmpcast.d.0 = select i1 undef, i32* %c, i32* %d.0
> > +  br label %for.cond
> > +}
> > 
> > 
> > _______________________________________________
> > llvm-commits mailing list
> > llvm-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list