From: Nick Lewycky Date: Thu, 9 Jul 2009 15:59:27 +0000 (+0000) Subject: There's no need to consider PHI nodes in the same block as the instruction X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=89f43a5c709c7ae88e338dca53c5c71e97acbb1c;p=oota-llvm.git There's no need to consider PHI nodes in the same block as the instruction we're inserting sigma/phi functions for. Patch by Andre Tavares. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75138 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Utils/SSI.cpp b/lib/Transforms/Utils/SSI.cpp index caafb318e8b..0585561a30b 100644 --- a/lib/Transforms/Utils/SSI.cpp +++ b/lib/Transforms/Utils/SSI.cpp @@ -282,12 +282,16 @@ void SSI::substituteUse(Instruction *I) { } /// Test if the BasicBlock BB dominates any use or definition of value. +/// If it dominates a phi instruction that is on the same BasicBlock, +/// that does not count. /// bool SSI::dominateAny(BasicBlock *BB, Instruction *value) { for (Value::use_iterator begin = value->use_begin(), end = value->use_end(); begin != end; ++begin) { Instruction *I = cast(*begin); BasicBlock *BB_father = I->getParent(); + if (BB == BB_father && isa(I)) + continue; if (DT_->dominates(BB, BB_father)) { return true; } diff --git a/test/Transforms/SSI/2009-07-09-Invoke.ll b/test/Transforms/SSI/2009-07-09-Invoke.ll new file mode 100644 index 00000000000..652dfe075bd --- /dev/null +++ b/test/Transforms/SSI/2009-07-09-Invoke.ll @@ -0,0 +1,71 @@ +; RUN: llvm-as < %s | opt -ssi-everything -disable-output +; PR4511 + + %"struct.std::_Vector_base, std::allocator >,std::allocator, std::allocator > > >" = type { %"struct.std::_Vector_base, std::allocator >,std::allocator, std::allocator > > >::_Vector_impl" } + %"struct.std::_Vector_base, std::allocator >,std::allocator, std::allocator > > >::_Vector_impl" = type { %"struct.std::basic_string,std::allocator >"*, %"struct.std::basic_string,std::allocator >"*, %"struct.std::basic_string,std::allocator >"* } + %"struct.std::basic_string,std::allocator >" = type { %"struct.std::basic_string,std::allocator >::_Alloc_hider" } + %"struct.std::basic_string,std::allocator >::_Alloc_hider" = type { i8* } + %"struct.std::basic_string,std::allocator >::_Rep" = type { %"struct.std::basic_string,std::allocator >::_Rep_base" } + %"struct.std::basic_string,std::allocator >::_Rep_base" = type { i32, i32, i32 } + %"struct.std::vector, std::allocator >,std::allocator, std::allocator > > >" = type { %"struct.std::_Vector_base, std::allocator >,std::allocator, std::allocator > > >" } + +declare void @_Unwind_Resume(i8*) + +declare fastcc %"struct.std::basic_string,std::allocator >"* @_ZSt24__uninitialized_copy_auxIPSsS0_ET0_T_S2_S1_St12__false_type(%"struct.std::basic_string,std::allocator >"*, %"struct.std::basic_string,std::allocator >"*, %"struct.std::basic_string,std::allocator >"*) + +define fastcc void @_ZNSt6vectorISsSaISsEE9push_backERKSs(%"struct.std::vector, std::allocator >,std::allocator, std::allocator > > >"* nocapture %this, %"struct.std::basic_string,std::allocator >"* nocapture %__x) { +entry: + br i1 undef, label %_ZNSt12_Vector_baseISsSaISsEE11_M_allocateEj.exit.i, label %bb + +bb: ; preds = %entry + ret void + +_ZNSt12_Vector_baseISsSaISsEE11_M_allocateEj.exit.i: ; preds = %entry + %0 = invoke fastcc %"struct.std::basic_string,std::allocator >"* @_ZSt24__uninitialized_copy_auxIPSsS0_ET0_T_S2_S1_St12__false_type(%"struct.std::basic_string,std::allocator >"* undef, %"struct.std::basic_string,std::allocator >"* undef, %"struct.std::basic_string,std::allocator >"* undef) + to label %invcont14.i unwind label %ppad81.i ; <%"struct.std::basic_string,std::allocator >"*> [#uses=3] + +invcont14.i: ; preds = %_ZNSt12_Vector_baseISsSaISsEE11_M_allocateEj.exit.i + %1 = icmp eq %"struct.std::basic_string,std::allocator >"* %0, null ; [#uses=1] + br i1 %1, label %bb19.i, label %bb.i17.i + +bb.i17.i: ; preds = %invcont14.i + %2 = invoke fastcc i8* @_ZNSs4_Rep8_M_cloneERKSaIcEj(%"struct.std::basic_string,std::allocator >::_Rep"* undef, i32 0) + to label %bb2.i25.i unwind label %ppad.i.i.i23.i ; [#uses=0] + +ppad.i.i.i23.i: ; preds = %bb.i17.i + invoke void @_Unwind_Resume(i8* undef) + to label %.noexc.i24.i unwind label %lpad.i29.i + +.noexc.i24.i: ; preds = %ppad.i.i.i23.i + unreachable + +bb2.i25.i: ; preds = %bb.i17.i + unreachable + +lpad.i29.i: ; preds = %ppad.i.i.i23.i + invoke void @_Unwind_Resume(i8* undef) + to label %.noexc.i9 unwind label %ppad81.i + +.noexc.i9: ; preds = %lpad.i29.i + unreachable + +bb19.i: ; preds = %invcont14.i + %3 = getelementptr %"struct.std::basic_string,std::allocator >"* %0, i32 1 ; <%"struct.std::basic_string,std::allocator >"*> [#uses=2] + %4 = invoke fastcc %"struct.std::basic_string,std::allocator >"* @_ZSt24__uninitialized_copy_auxIPSsS0_ET0_T_S2_S1_St12__false_type(%"struct.std::basic_string,std::allocator >"* undef, %"struct.std::basic_string,std::allocator >"* undef, %"struct.std::basic_string,std::allocator >"* %3) + to label %invcont20.i unwind label %ppad81.i ; <%"struct.std::basic_string,std::allocator >"*> [#uses=0] + +invcont20.i: ; preds = %bb19.i + unreachable + +invcont32.i: ; preds = %ppad81.i + unreachable + +ppad81.i: ; preds = %bb19.i, %lpad.i29.i, %_ZNSt12_Vector_baseISsSaISsEE11_M_allocateEj.exit.i + %__new_finish.0.i = phi %"struct.std::basic_string,std::allocator >"* [ %0, %lpad.i29.i ], [ undef, %_ZNSt12_Vector_baseISsSaISsEE11_M_allocateEj.exit.i ], [ %3, %bb19.i ] ; <%"struct.std::basic_string,std::allocator >"*> [#uses=0] + br i1 undef, label %invcont32.i, label %bb.i.i.i.i + +bb.i.i.i.i: ; preds = %bb.i.i.i.i, %ppad81.i + br label %bb.i.i.i.i +} + +declare fastcc i8* @_ZNSs4_Rep8_M_cloneERKSaIcEj(%"struct.std::basic_string,std::allocator >::_Rep"* nocapture, i32) diff --git a/test/Transforms/SSI/dg.exp b/test/Transforms/SSI/dg.exp new file mode 100644 index 00000000000..f2005891a59 --- /dev/null +++ b/test/Transforms/SSI/dg.exp @@ -0,0 +1,3 @@ +load_lib llvm.exp + +RunLLVMTests [lsort [glob -nocomplain $srcdir/$subdir/*.{ll,c,cpp}]]