From: David L. Jones Date: Thu, 31 Jan 2019 03:28:46 +0000 (+0000) Subject: Revert "Reapply "[CGP] Check for existing inttotpr before creating new one"" X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3ced1548880c1a10cbf6b093bf3b32a3b8719c13;p=llvm Revert "Reapply "[CGP] Check for existing inttotpr before creating new one"" This change reverts r351626. The changes in r351626 cause quadratic work in several cases. (See r351626 thread on llvm-commits for details.) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352722 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CodeGenPrepare.cpp b/lib/CodeGen/CodeGenPrepare.cpp index 24c926c01a5..e382798b692 100644 --- a/lib/CodeGen/CodeGenPrepare.cpp +++ b/lib/CodeGen/CodeGenPrepare.cpp @@ -4661,27 +4661,13 @@ bool CodeGenPrepare::optimizeMemoryInst(Instruction *MemoryInst, Value *Addr, // 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(U)) - if (I2P->getType() == Addr->getType() && I2P->getParent() == BB) { - auto *RegInst = dyn_cast(Reg); - if (RegInst && RegInst->getParent() == BB && - !isa(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 = getResultPtr(AddrMode.BaseReg); + ResultPtr = Builder.CreateIntToPtr(AddrMode.BaseReg, Addr->getType(), + "sunkaddr"); AddrMode.BaseReg = nullptr; } else if (!ResultPtr && AddrMode.Scale == 1) { - ResultPtr = getResultPtr(AddrMode.ScaledReg); + ResultPtr = Builder.CreateIntToPtr(AddrMode.ScaledReg, Addr->getType(), + "sunkaddr"); AddrMode.Scale = 0; } } diff --git a/test/Transforms/CodeGenPrepare/X86/sink-addrmode-cse-inttoptrs.ll b/test/Transforms/CodeGenPrepare/X86/sink-addrmode-cse-inttoptrs.ll deleted file mode 100644 index 5dd00960f1e..00000000000 --- a/test/Transforms/CodeGenPrepare/X86/sink-addrmode-cse-inttoptrs.ll +++ /dev/null @@ -1,140 +0,0 @@ -; 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" - -@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()