[llvm-commits] [llvm] r150174 - in /llvm/trunk: lib/Transforms/IPO/GlobalOpt.cpp test/Transforms/GlobalOpt/cxx-dtor.ll

Benjamin Kramer benny.kra at googlemail.com
Thu Feb 9 08:33:56 PST 2012


On 09.02.2012, at 17:17, David Blaikie wrote:

> 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"

I tweaked it a bit in r150183, hopefully more readable now :)
> 
> ?
> 
>>  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.

The elses are actually needed here, you can fall through the first if.

- Ben
> 
>>   }
>> 
>>   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