[llvm] r351626 - Reapply "[CGP] Check for existing inttotpr before creating new one"

Maxim Kuvyrkov via llvm-commits llvm-commits at lists.llvm.org
Tue Jan 22 01:27:25 PST 2019


Hi Roman,

This has caused https://bugs.llvm.org/show_bug.cgi?id=40393 .

Would you please investigate?

--
Maxim Kuvyrkov
www.linaro.org



> On Jan 19, 2019, at 6:37 AM, Roman Tereshin via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> Author: rtereshin
> Date: Fri Jan 18 19:37:25 2019
> New Revision: 351626
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=351626&view=rev
> Log:
> Reapply "[CGP] Check for existing inttotpr before creating new one"
> 
> Original commit: r351582
> 
> Added:
>    llvm/trunk/test/Transforms/CodeGenPrepare/X86/sink-addrmode-cse-inttoptrs.ll
> Modified:
>    llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp
> 
> Modified: llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp?rev=351626&r1=351625&r2=351626&view=diff
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp (original)
> +++ llvm/trunk/lib/CodeGen/CodeGenPrepare.cpp Fri Jan 18 19:37:25 2019
> @@ -4664,13 +4664,27 @@ bool CodeGenPrepare::optimizeMemoryInst(
>     // will look through it and provide only the integer value. In that case,
>     // use it here.
>     if (!DL->isNonIntegralPointerType(Addr->getType())) {
> +      const auto getResultPtr = [MemoryInst, Addr,
> +                                 &Builder](Value *Reg) -> Value * {
> +        BasicBlock *BB = MemoryInst->getParent();
> +        for (User *U : Reg->users())
> +          if (auto *I2P = dyn_cast<IntToPtrInst>(U))
> +            if (I2P->getType() == Addr->getType() && I2P->getParent() == BB) {
> +              auto *RegInst = dyn_cast<Instruction>(Reg);
> +              if (RegInst && RegInst->getParent() == BB &&
> +                  !isa<PHINode>(RegInst) && !RegInst->isEHPad())
> +                I2P->moveAfter(RegInst);
> +              else
> +                I2P->moveBefore(*BB, BB->getFirstInsertionPt());
> +              return I2P;
> +            }
> +        return Builder.CreateIntToPtr(Reg, Addr->getType(), "sunkaddr");
> +      };
>       if (!ResultPtr && AddrMode.BaseReg) {
> -        ResultPtr = Builder.CreateIntToPtr(AddrMode.BaseReg, Addr->getType(),
> -                                           "sunkaddr");
> +        ResultPtr = getResultPtr(AddrMode.BaseReg);
>         AddrMode.BaseReg = nullptr;
>       } else if (!ResultPtr && AddrMode.Scale == 1) {
> -        ResultPtr = Builder.CreateIntToPtr(AddrMode.ScaledReg, Addr->getType(),
> -                                           "sunkaddr");
> +        ResultPtr = getResultPtr(AddrMode.ScaledReg);
>         AddrMode.Scale = 0;
>       }
>     }
> 
> Added: llvm/trunk/test/Transforms/CodeGenPrepare/X86/sink-addrmode-cse-inttoptrs.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeGenPrepare/X86/sink-addrmode-cse-inttoptrs.ll?rev=351626&view=auto
> ==============================================================================
> --- llvm/trunk/test/Transforms/CodeGenPrepare/X86/sink-addrmode-cse-inttoptrs.ll (added)
> +++ llvm/trunk/test/Transforms/CodeGenPrepare/X86/sink-addrmode-cse-inttoptrs.ll Fri Jan 18 19:37:25 2019
> @@ -0,0 +1,140 @@
> +; RUN: opt -mtriple=x86_64-- -codegenprepare                        %s -S -o - | FileCheck %s --check-prefixes=CGP,COMMON
> +; RUN: opt -mtriple=x86_64-- -codegenprepare -load-store-vectorizer %s -S -o - | FileCheck %s --check-prefixes=LSV,COMMON
> +
> +; Make sure CodeGenPrepare doesn't emit multiple inttoptr instructions
> +; of the same integer value while sinking address computations, but
> +; rather CSEs them on the fly: excessive inttoptr's confuse SCEV
> +; into thinking that related pointers have nothing to do with each other.
> +;
> +; Triggering this problem involves having just right addressing modes,
> +; and verifying that the motivating pass (LoadStoreVectorizer) is able
> +; to benefit from it - just right LSV-policies. Hence the atypical combination
> +; of the target and datalayout / address spaces in this test.
> +
> +target datalayout = "p1:32:32:32"
> +
> + at int_typeinfo = global i8 0
> +
> +define void @test1(i32 %tmp, i32 %off) {
> +; COMMON-LABEL: @test1
> +; CGP:     = inttoptr
> +; CGP-NOT: = inttoptr
> +; LSV:     = load <2 x float>
> +; LSV:     = load <2 x float>
> +entry:
> +  %tmp1 = inttoptr i32 %tmp to float addrspace(1)*
> +  %arrayidx.i.7 = getelementptr inbounds float, float addrspace(1)* %tmp1, i32 %off
> +  %add20.i.7 = add i32 %off, 1
> +  %arrayidx22.i.7 = getelementptr inbounds float, float addrspace(1)* %tmp1, i32 %add20.i.7
> +  br label %for.body
> +
> +for.body:
> +  %tmp8 = phi float [ undef, %entry ], [ %tmp62, %for.body ]
> +  %tmp28 = load float, float addrspace(1)* %arrayidx.i.7
> +  %tmp29 = load float, float addrspace(1)* %arrayidx22.i.7
> +  %arrayidx.i321.7 = getelementptr inbounds float, float addrspace(1)* %tmp1, i32 0
> +  %tmp43 = load float, float addrspace(1)* %arrayidx.i321.7
> +  %arrayidx22.i327.7 = getelementptr inbounds float, float addrspace(1)* %tmp1, i32 1
> +  %tmp44 = load float, float addrspace(1)* %arrayidx22.i327.7
> +  %tmp62 = tail call fast float @foo(float %tmp8, float %tmp44, float %tmp43, float %tmp29, float %tmp28)
> +  br label %for.body
> +}
> +
> +define void @test2(i64 %a, i64 %b, i64 %c) {
> +; COMMON-LABEL: @test2
> +; CGP:    loop:
> +; CGP-NEXT: %mul =
> +; CGP-NEXT: = inttoptr i64 %mul
> +; CGP-NOT:  = inttoptr
> +; LSV:      store <2 x i64>
> +entry:
> +  %mul.neg.i630 = add nsw i64 %a, -16
> +  br label %loop
> +
> +loop:
> +  %mul = mul nsw i64 %b, -16
> +  %sub.i631 = add nsw i64 %mul.neg.i630, %mul
> +  %tmp = inttoptr i64 %sub.i631 to i8*
> +  %tmp1 = inttoptr i64 %sub.i631 to i64*
> +  store i64 %c, i64* %tmp1, align 16
> +  %arrayidx172 = getelementptr inbounds i8, i8* %tmp, i64 8
> +  %tmp2 = bitcast i8* %arrayidx172 to i64*
> +  store i64 42, i64* %tmp2, align 8
> +  br label %loop
> +}
> +
> +define i32 @test3(i64 %a, i64 %b, i64 %c)  personality i32 (...)* @__gxx_personality_v0 {
> +; COMMON-LABEL: @test3
> +; CGP:    entry:
> +; CGP-NEXT: %mul =
> +; CGP:    lpad:
> +; CGP-NEXT: landingpad
> +; CGP-NEXT: cleanup
> +; CGP-NEXT: catch
> +; CGP-NEXT: = inttoptr i64 %mul
> +; CGP-NOT:  = inttoptr
> +; LSV:      store <2 x i64>
> +entry:
> +  %mul = mul nsw i64 %b, -16
> +  %mul.neg.i630 = add nsw i64 %a, -16
> +  invoke void @might_throw()
> +          to label %cont unwind label %lpad
> +
> +cont:
> +  ret i32 0
> +
> +eh.resume:
> +  ret i32 1
> +
> +catch_int:
> +  ret i32 2
> +
> +lpad:
> +  %ehvals = landingpad { i8*, i32 }
> +      cleanup
> +      catch i8* @int_typeinfo
> +  %sub.i631 = add nsw i64 %mul.neg.i630, %mul
> +  %tmp = inttoptr i64 %sub.i631 to i8*
> +  %tmp1 = inttoptr i64 %sub.i631 to i64*
> +  store i64 %c, i64* %tmp1, align 16
> +  %arrayidx172 = getelementptr inbounds i8, i8* %tmp, i64 8
> +  %tmp2 = bitcast i8* %arrayidx172 to i64*
> +  store i64 42, i64* %tmp2, align 8
> +  %ehptr = extractvalue { i8*, i32 } %ehvals, 0
> +  %ehsel = extractvalue { i8*, i32 } %ehvals, 1
> +  call void @cleanup()
> +  %int_sel = call i32 @llvm.eh.typeid.for(i8* @int_typeinfo)
> +  %int_match = icmp eq i32 %ehsel, %int_sel
> +  br i1 %int_match, label %catch_int, label %eh.resume
> +}
> +
> +define void @test4(i64 %a, i64 %b, i64 %c, i64 %d) {
> +; COMMON-LABEL: @test4
> +; CGP:    loop:
> +; CGP-NEXT: %ptrval =
> +; CGP-NEXT: %val =
> +; CGP-NEXT: = inttoptr i64 %ptrval
> +; CGP-NOT:  = inttoptr
> +; LSV:      store <2 x i64>
> +entry:
> +  %mul.neg.i630 = add nsw i64 %a, -16
> +  br label %loop
> +
> +loop:
> +  %ptrval = phi i64 [ %b, %entry ], [ %d, %loop ]
> +  %val = phi i64 [ 22, %entry ], [ 42, %loop ]
> +  %sub.i631 = add nsw i64 %mul.neg.i630, %ptrval
> +  %tmp = inttoptr i64 %sub.i631 to i8*
> +  %tmp1 = inttoptr i64 %sub.i631 to i64*
> +  store i64 %c, i64* %tmp1, align 16
> +  %arrayidx172 = getelementptr inbounds i8, i8* %tmp, i64 8
> +  %tmp2 = bitcast i8* %arrayidx172 to i64*
> +  store i64 %val, i64* %tmp2, align 8
> +  br label %loop
> +}
> +
> +declare float @foo(float, float, float, float, float)
> +declare i32 @__gxx_personality_v0(...)
> +declare i32 @llvm.eh.typeid.for(i8*)
> +declare void @might_throw()
> +declare void @cleanup()
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list