[llvm-commits] [llvm] r150174 - in /llvm/trunk: lib/Transforms/IPO/GlobalOpt.cpp test/Transforms/GlobalOpt/cxx-dtor.ll
David Blaikie
dblaikie at gmail.com
Thu Feb 9 08:17:53 PST 2012
On Thu, Feb 9, 2012 at 6:26 AM, Benjamin Kramer
<benny.kra at googlemail.com> wrote:
> Author: d0k
> Date: Thu Feb 9 08:26:06 2012
> New Revision: 150174
>
> URL: http://llvm.org/viewvc/llvm-project?rev=150174&view=rev
> Log:
> GlobalOpt: Be more aggressive about elminating side-effect free static dtors.
>
> GlobalOpt runs early in the pipeline (before inlining) and complex class
> hierarchies often introduce bitcasts or GEPs which weren't optimized away.
> Teach it to ignore side-effect free instructions instead of depending on
> other passes to remove them.
>
> Modified:
> llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp
> llvm/trunk/test/Transforms/GlobalOpt/cxx-dtor.ll
>
> Modified: llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp?rev=150174&r1=150173&r2=150174&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp (original)
> +++ llvm/trunk/lib/Transforms/IPO/GlobalOpt.cpp Thu Feb 9 08:26:06 2012
> @@ -2753,7 +2753,8 @@
> /// destructor and can therefore be eliminated.
> /// Note that we assume that other optimization passes have already simplified
> /// the code so we only look for a function with a single basic block, where
> -/// the only allowed instructions are 'ret' or 'call' to empty C++ dtor.
> +/// the only allowed instructions side-effect free, 'ret' or 'call' to empty
> +/// C++ dtor.
Is your revised comment missing an 'are' ("allowed instructions
>>are<< side-effect free") though when I try to read that the
"side-effect free" bit gets jumbled up with the following list, would
it make more sense to say:
"the only allowed instructions are 'ret' or 'call to an empty C++
dtor, both of which are side-effect free"
?
> static bool cxxDtorIsEmpty(const Function &Fn,
> SmallPtrSet<const Function *, 8> &CalledFunctions) {
> // FIXME: We could eliminate C++ destructors if they're readonly/readnone and
> @@ -2786,9 +2787,9 @@
> if (!cxxDtorIsEmpty(*CalledFn, NewCalledFunctions))
> return false;
> } else if (isa<ReturnInst>(*I))
> - return true;
> - else
> - return false;
> + return true; // We're done.
> + else if (I->mayHaveSideEffects())
> + return false; // Destructor with side effects, bail.
a few else-after-returns (
http://llvm.org/docs/CodingStandards.html#hl_else_after_return ) -
though I realize you didn't write the original code, you were just
improving it.
> }
>
> return false;
>
> Modified: llvm/trunk/test/Transforms/GlobalOpt/cxx-dtor.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/GlobalOpt/cxx-dtor.ll?rev=150174&r1=150173&r2=150174&view=diff
> ==============================================================================
> --- llvm/trunk/test/Transforms/GlobalOpt/cxx-dtor.ll (original)
> +++ llvm/trunk/test/Transforms/GlobalOpt/cxx-dtor.ll Thu Feb 9 08:26:06 2012
> @@ -2,6 +2,7 @@
>
> %0 = type { i32, void ()* }
> %struct.A = type { i8 }
> +%struct.B = type { }
>
> @a = global %struct.A zeroinitializer, align 1
> @__dso_handle = external global i8*
> @@ -15,13 +16,14 @@
> }
>
> define linkonce_odr void @_ZN1AD1Ev(%struct.A* %this) nounwind align 2 {
> - call void @_ZN1AD2Ev(%struct.A* %this)
> + %t = bitcast %struct.A* %this to %struct.B*
> + call void @_ZN1BD1Ev(%struct.B* %t)
> ret void
> }
>
> declare i32 @__cxa_atexit(void (i8*)*, i8*, i8*)
>
> -define linkonce_odr void @_ZN1AD2Ev(%struct.A* %this) nounwind align 2 {
> +define linkonce_odr void @_ZN1BD1Ev(%struct.B* %this) nounwind align 2 {
> ret void
> }
>
>
>
> _______________________________________________
> 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