[llvm-commits] [llvm] r89814 - in /llvm/trunk: include/llvm/Target/TargetInstrInfo.h lib/CodeGen/BranchFolding.cpp lib/Target/ARM/ARMBaseInstrInfo.cpp lib/Target/ARM/ARMBaseInstrInfo.h

Bob Wilson bob.wilson at apple.com
Tue Nov 24 16:00:39 PST 2009


I measured a few individual files with "llc -stats" but I wanted to check a much wider range of code.  I remeasured everything using "size -m".  Two of the applications had no change whatsoever.  The third increased by 0.23%, and the total was still smaller than what I measured from a version of llvm from late last week.

I don't think there's anything to worry about here.

On Nov 24, 2009, at 3:40 PM, Evan Cheng wrote:

> You can look at the output of llc -stats. That tells you the number of instructions, which is a better indication of code size change.
> 
> Evan
> 
> On Nov 24, 2009, at 3:35 PM, Bob Wilson wrote:
> 
>> Author: bwilson
>> Date: Tue Nov 24 17:35:49 2009
>> New Revision: 89814
>> 
>> URL: http://llvm.org/viewvc/llvm-project?rev=89814&view=rev
>> Log:
>> Refactor target hook for tail duplication as requested by Chris.
>> Make tail duplication of indirect branches much more aggressive (for targets
>> that indicate that it is profitable), based on further experience with
>> this transformation.  I compiled 3 large applications with and without
>> this more aggressive tail duplication and measured minimal changes in code
>> size.  ("size" on Darwin seems to round the text size up to the nearest
>> page boundary, so I can only say that any code size increase was less than
>> one 4k page.) Radar 7421267.
>> 
>> Modified:
>>   llvm/trunk/include/llvm/Target/TargetInstrInfo.h
>>   llvm/trunk/lib/CodeGen/BranchFolding.cpp
>>   llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp
>>   llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.h
>> 
>> Modified: llvm/trunk/include/llvm/Target/TargetInstrInfo.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetInstrInfo.h?rev=89814&r1=89813&r2=89814&view=diff
>> 
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Target/TargetInstrInfo.h (original)
>> +++ llvm/trunk/include/llvm/Target/TargetInstrInfo.h Tue Nov 24 17:35:49 2009
>> @@ -544,12 +544,9 @@
>>  virtual unsigned getInlineAsmLength(const char *Str,
>>                                      const MCAsmInfo &MAI) const;
>> 
>> -  /// TailDuplicationLimit - Returns the limit on the number of instructions
>> -  /// in basic block MBB beyond which it will not be tail-duplicated.
>> -  virtual unsigned TailDuplicationLimit(const MachineBasicBlock &MBB,
>> -                                        unsigned DefaultLimit) const {
>> -    return DefaultLimit;
>> -  }
>> +  /// isProfitableToDuplicateIndirectBranch - Returns true if tail duplication
>> +  /// is especially profitable for indirect branches.
>> +  virtual bool isProfitableToDuplicateIndirectBranch() const { return false; }
>> };
>> 
>> /// TargetInstrInfoImpl - This is the default implementation of
>> 
>> Modified: llvm/trunk/lib/CodeGen/BranchFolding.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/BranchFolding.cpp?rev=89814&r1=89813&r2=89814&view=diff
>> 
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/BranchFolding.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/BranchFolding.cpp Tue Nov 24 17:35:49 2009
>> @@ -1043,9 +1043,18 @@
>>  // of one less than the tail-merge threshold. When optimizing for size,
>>  // duplicate only one, because one branch instruction can be eliminated to
>>  // compensate for the duplication.
>> -  unsigned MaxDuplicateCount =
>> -    MF.getFunction()->hasFnAttr(Attribute::OptimizeForSize) ?
>> -    1 : TII->TailDuplicationLimit(*TailBB, TailMergeSize - 1);
>> +  unsigned MaxDuplicateCount;
>> +  if (MF.getFunction()->hasFnAttr(Attribute::OptimizeForSize))
>> +    MaxDuplicateCount = 1;
>> +  else if (TII->isProfitableToDuplicateIndirectBranch() &&
>> +           !TailBB->empty() && TailBB->back().getDesc().isIndirectBranch())
>> +    // If the target has hardware branch prediction that can handle indirect
>> +    // branches, duplicating them can often make them predictable when there
>> +    // are common paths through the code.  The limit needs to be high enough
>> +    // to allow undoing the effects of tail merging.
>> +    MaxDuplicateCount = 20;
>> +  else
>> +    MaxDuplicateCount = TailMergeSize - 1;
>> 
>>  // Check the instructions in the block to determine whether tail-duplication
>>  // is invalid or unlikely to be profitable.
>> 
>> Modified: llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp?rev=89814&r1=89813&r2=89814&view=diff
>> 
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp (original)
>> +++ llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp Tue Nov 24 17:35:49 2009
>> @@ -1027,14 +1027,10 @@
>>  return TargetInstrInfoImpl::isIdentical(MI0, MI1, MRI);
>> }
>> 
>> -unsigned ARMBaseInstrInfo::TailDuplicationLimit(const MachineBasicBlock &MBB,
>> -                                                unsigned DefaultLimit) const {
>> +bool ARMBaseInstrInfo::isProfitableToDuplicateIndirectBranch() const {
>>  // If the target processor can predict indirect branches, it is highly
>>  // desirable to duplicate them, since it can often make them predictable.
>> -  if (!MBB.empty() && isIndirectBranchOpcode(MBB.back().getOpcode()) &&
>> -      getSubtarget().hasBranchTargetBuffer())
>> -    return DefaultLimit + 2;
>> -  return DefaultLimit;
>> +  return getSubtarget().hasBranchTargetBuffer();
>> }
>> 
>> /// getInstrPredicate - If instruction is predicated, returns its predicate
>> 
>> Modified: llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.h?rev=89814&r1=89813&r2=89814&view=diff
>> 
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.h (original)
>> +++ llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.h Tue Nov 24 17:35:49 2009
>> @@ -291,8 +291,7 @@
>>  virtual bool isIdentical(const MachineInstr *MI, const MachineInstr *Other,
>>                           const MachineRegisterInfo *MRI) const;
>> 
>> -  virtual unsigned TailDuplicationLimit(const MachineBasicBlock &MBB,
>> -                                        unsigned DefaultLimit) const;
>> +  virtual bool isProfitableToDuplicateIndirectBranch() const;
>> };
>> 
>> static inline
>> 
>> 
>> _______________________________________________
>> 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