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

Maxim Kuvyrkov via llvm-commits llvm-commits at lists.llvm.org
Wed Jan 23 01:31:12 PST 2019


Hi Roman,

Confirmed, the build is back to normal.

Thanks,

--
Maxim Kuvyrkov
www.linaro.org



> On Jan 22, 2019, at 9:48 PM, Roman Tereshin <rtereshin at apple.com> wrote:
> 
> Hi Maxim,
> 
> As far as I can tell, the issue you're referring to was fixed in LLVM r351626. Does this build confirm that it's gone? https://ci.linaro.org/job/tcwg_kernel-build-llvm-master-aarch64-lts-defconfig/125/
> 
> If the problem persists, please let me know along with the LLVM SVN revision (351626 or later) that has the problem (I can't map a local repo's GIT hashes to LLVM commits upstream).
> 
> I'd also greatly appreciate if you include the crash backtrace, preprocessed source, and associated run script, that reproduce the problem (I don't have all the setup required to reproduce Kernel's Jenkins runs).
> 
> Thank you,
> Roman
>  
> 
>> On Jan 22, 2019, at 9:58 AM, Roman Tereshin via llvm-commits <llvm-commits at lists.llvm.org> wrote:
>> 
>> Hi Maxim,
>> 
>> Looking into this. Thanks for letting me know!
>> 
>> Roman
>> 
>>> On Jan 22, 2019, at 1:27 AM, Maxim Kuvyrkov <maxim.kuvyrkov at linaro.org> wrote:
>>> 
>>> 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
>>> 
>> 
>> _______________________________________________
>> 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