[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

Dale Johannesen dalej at apple.com
Tue Nov 24 15:46:59 PST 2009


On Nov 24, 2009, at 3:40 PMPST, 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.

That corresponds better to what llvm's keeping track of internally and  
is useful for determining whether it's doing what we think it's  
doing.  It's not too good for actual size on targets with variable- 
length instructions, though.  size -m is what he wants (on Darwin).

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