[llvm] r230245 - Rewrite the global merge pass to be subprogram agnostic for now.

Eric Christopher echristo at gmail.com
Mon Feb 23 12:35:21 PST 2015


Not quite, at least not for aarch64 which allows only globals as the entire
module and will optimize accordingly.

-eric

On Mon Feb 23 2015 at 12:32:00 PM Akira Hatanaka <ahatanak at gmail.com> wrote:

> On Mon, Feb 23, 2015 at 11:28 AM, Eric Christopher <echristo at gmail.com>
> wrote:
>
>> Author: echristo
>> Date: Mon Feb 23 13:28:45 2015
>> New Revision: 230245
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=230245&view=rev
>> Log:
>> Rewrite the global merge pass to be subprogram agnostic for now.
>> It was previously using the subtarget to get values for the global
>> offset without actually checking each function as it was generating
>> code. Go ahead and solidify the current behavior and make the
>> existing FIXMEs more prominent.
>>
>> As a note the ARM backend previously had a thumb1 and non-thumb1
>> set of defaults. Only the former was tested so I've changed the
>> behavior to only use that for now.
>>
>> Modified:
>>     llvm/trunk/include/llvm/Target/TargetLowering.h
>>     llvm/trunk/include/llvm/Transforms/Scalar.h
>>     llvm/trunk/lib/CodeGen/GlobalMerge.cpp
>>     llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp
>>     llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.h
>>     llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp
>>     llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
>>     llvm/trunk/lib/Target/ARM/ARMISelLowering.h
>>     llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp
>>
>> Modified: llvm/trunk/include/llvm/Target/TargetLowering.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Target/TargetLowering.h?rev=230245&r1=230244&r2=230245&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Target/TargetLowering.h (original)
>> +++ llvm/trunk/include/llvm/Target/TargetLowering.h Mon Feb 23 13:28:45
>> 2015
>> @@ -959,12 +959,6 @@ public:
>>      return false;
>>    }
>>
>> -  /// Returns the maximal possible offset which can be used for loads /
>> stores
>> -  /// from the global.
>> -  virtual unsigned getMaximalGlobalOffset() const {
>> -    return 0;
>> -  }
>> -
>>    /// Returns true if a cast between SrcAS and DestAS is a noop.
>>    virtual bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS)
>> const {
>>      return false;
>>
>> Modified: llvm/trunk/include/llvm/Transforms/Scalar.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar.h?rev=230245&r1=230244&r2=230245&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/Transforms/Scalar.h (original)
>> +++ llvm/trunk/include/llvm/Transforms/Scalar.h Mon Feb 23 13:28:45 2015
>> @@ -145,7 +145,7 @@ Pass *createLICMPass();
>>  //
>>  Pass *createLoopStrengthReducePass();
>>
>> -Pass *createGlobalMergePass(const TargetMachine *TM = nullptr);
>> +Pass *createGlobalMergePass(const TargetMachine *TM, unsigned
>> MaximalOffset);
>>
>>
>>  //===----------------------------------------------------------------------===//
>>  //
>>
>> Modified: llvm/trunk/lib/CodeGen/GlobalMerge.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/GlobalMerge.cpp?rev=230245&r1=230244&r2=230245&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/CodeGen/GlobalMerge.cpp (original)
>> +++ llvm/trunk/lib/CodeGen/GlobalMerge.cpp Mon Feb 23 13:28:45 2015
>> @@ -90,10 +90,16 @@ EnableGlobalMergeOnExternal("global-merg
>>       cl::desc("Enable global merge pass on external linkage"),
>>       cl::init(false));
>>
>> -STATISTIC(NumMerged      , "Number of globals merged");
>> +STATISTIC(NumMerged, "Number of globals merged");
>>  namespace {
>>    class GlobalMerge : public FunctionPass {
>>      const TargetMachine *TM;
>> +    const DataLayout *DL;
>> +    // FIXME: Infer the maximum possible offset depending on the actual
>> users
>> +    // (these max offsets are different for the users inside Thumb or ARM
>> +    // functions), see the code that passes in the offset in the ARM
>> backend
>> +    // for more information.
>> +    unsigned MaxOffset;
>>
>>      bool doMerge(SmallVectorImpl<GlobalVariable*> &Globals,
>>                   Module &M, bool isConst, unsigned AddrSpace) const;
>> @@ -117,8 +123,10 @@ namespace {
>>
>>    public:
>>      static char ID;             // Pass identification, replacement for
>> typeid.
>> -    explicit GlobalMerge(const TargetMachine *TM = nullptr)
>> -      : FunctionPass(ID), TM(TM) {
>> +    explicit GlobalMerge(const TargetMachine *TM = nullptr,
>> +                         unsigned MaximalOffset = 0)
>> +        : FunctionPass(ID), TM(TM), DL(TM->getDataLayout()),
>> +          MaxOffset(MaximalOffset) {
>>        initializeGlobalMergePass(*PassRegistry::getPassRegistry());
>>      }
>>
>> @@ -138,22 +146,16 @@ namespace {
>>  } // end anonymous namespace
>>
>>  char GlobalMerge::ID = 0;
>> -INITIALIZE_TM_PASS(GlobalMerge, "global-merge", "Merge global variables",
>> -                   false, false)
>> +INITIALIZE_PASS_BEGIN(GlobalMerge, "global-merge", "Merge global
>> variables",
>> +                      false, false)
>> +INITIALIZE_PASS_END(GlobalMerge, "global-merge", "Merge global
>> variables",
>> +                    false, false)
>>
>>  bool GlobalMerge::doMerge(SmallVectorImpl<GlobalVariable*> &Globals,
>>                            Module &M, bool isConst, unsigned AddrSpace)
>> const {
>> -  const TargetLowering *TLI =
>> TM->getSubtargetImpl()->getTargetLowering();
>> -  const DataLayout *DL = TM->getDataLayout();
>> -
>> -  // FIXME: Infer the maximum possible offset depending on the actual
>> users
>> -  // (these max offsets are different for the users inside Thumb or ARM
>> -  // functions)
>> -  unsigned MaxOffset = TLI->getMaximalGlobalOffset();
>> -
>>    // FIXME: Find better heuristics
>>    std::stable_sort(Globals.begin(), Globals.end(),
>> -                   [DL](const GlobalVariable *GV1, const GlobalVariable
>> *GV2) {
>> +                   [this](const GlobalVariable *GV1, const
>> GlobalVariable *GV2) {
>>      Type *Ty1 = cast<PointerType>(GV1->getType())->getElementType();
>>      Type *Ty2 = cast<PointerType>(GV2->getType())->getElementType();
>>
>> @@ -282,9 +284,6 @@ bool GlobalMerge::doInitialization(Modul
>>
>>    DenseMap<unsigned, SmallVector<GlobalVariable*, 16> > Globals,
>> ConstGlobals,
>>                                                          BSSGlobals;
>> -  const TargetLowering *TLI =
>> TM->getSubtargetImpl()->getTargetLowering();
>> -  const DataLayout *DL = TM->getDataLayout();
>> -  unsigned MaxOffset = TLI->getMaximalGlobalOffset();
>>    bool Changed = false;
>>    setMustKeepGlobalVariables(M);
>>
>> @@ -357,6 +356,6 @@ bool GlobalMerge::doFinalization(Module
>>    return false;
>>  }
>>
>> -Pass *llvm::createGlobalMergePass(const TargetMachine *TM) {
>> -  return new GlobalMerge(TM);
>> +Pass *llvm::createGlobalMergePass(const TargetMachine *TM, unsigned
>> Offset) {
>> +  return new GlobalMerge(TM, Offset);
>>  }
>>
>> Modified: llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp?rev=230245&r1=230244&r2=230245&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp (original)
>> +++ llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.cpp Mon Feb 23
>> 13:28:45 2015
>> @@ -730,13 +730,6 @@ MVT AArch64TargetLowering::getScalarShif
>>    return MVT::i64;
>>  }
>>
>> -unsigned AArch64TargetLowering::getMaximalGlobalOffset() const {
>> -  // FIXME: On AArch64, this depends on the type.
>> -  // Basically, the addressable offsets are up to 4095 *
>> Ty.getSizeInBytes().
>> -  // and the offset has to be a multiple of the related size in bytes.
>> -  return 4095;
>> -}
>> -
>>  FastISel *
>>  AArch64TargetLowering::createFastISel(FunctionLoweringInfo &funcInfo,
>>                                        const TargetLibraryInfo *libInfo)
>> const {
>>
>> Modified: llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.h?rev=230245&r1=230244&r2=230245&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.h (original)
>> +++ llvm/trunk/lib/Target/AArch64/AArch64ISelLowering.h Mon Feb 23
>> 13:28:45 2015
>> @@ -246,10 +246,6 @@ public:
>>    /// getFunctionAlignment - Return the Log2 alignment of this function.
>>    unsigned getFunctionAlignment(const Function *F) const;
>>
>> -  /// getMaximalGlobalOffset - Returns the maximal possible offset which
>> can
>> -  /// be used for loads / stores from the global.
>> -  unsigned getMaximalGlobalOffset() const override;
>> -
>>    /// Returns true if a cast between SrcAS and DestAS is a noop.
>>    bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const
>> override {
>>      // Addrspacecasts are always noops.
>>
>> Modified: llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp?rev=230245&r1=230244&r2=230245&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp (original)
>> +++ llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp Mon Feb 23
>> 13:28:45 2015
>> @@ -236,8 +236,11 @@ bool AArch64PassConfig::addPreISel() {
>>    // get a chance to be merged
>>    if (TM->getOptLevel() != CodeGenOpt::None && EnablePromoteConstant)
>>      addPass(createAArch64PromoteConstantPass());
>> +  // FIXME: On AArch64, this depends on the type.
>> +  // Basically, the addressable offsets are up to 4095 *
>> Ty.getSizeInBytes().
>> +  // and the offset has to be a multiple of the related size in bytes.
>>    if (TM->getOptLevel() != CodeGenOpt::None)
>> -    addPass(createGlobalMergePass(TM));
>> +    addPass(createGlobalMergePass(TM, 4095));
>>    if (TM->getOptLevel() != CodeGenOpt::None)
>>      addPass(createAArch64AddressTypePromotionPass());
>>
>>
>> Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp?rev=230245&r1=230244&r2=230245&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp (original)
>> +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.cpp Mon Feb 23 13:28:45 2015
>> @@ -1170,12 +1170,6 @@ ARMTargetLowering::createFastISel(Functi
>>    return ARM::createFastISel(funcInfo, libInfo);
>>  }
>>
>> -/// getMaximalGlobalOffset - Returns the maximal possible offset which
>> can
>> -/// be used for loads / stores from the global.
>> -unsigned ARMTargetLowering::getMaximalGlobalOffset() const {
>> -  return (Subtarget->isThumb1Only() ? 127 : 4095);
>> -}
>> -
>>  Sched::Preference ARMTargetLowering::getSchedulingPreference(SDNode *N)
>> const {
>>    unsigned NumVals = N->getNumValues();
>>    if (!NumVals)
>>
>> Modified: llvm/trunk/lib/Target/ARM/ARMISelLowering.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMISelLowering.h?rev=230245&r1=230244&r2=230245&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/ARMISelLowering.h (original)
>> +++ llvm/trunk/lib/Target/ARM/ARMISelLowering.h Mon Feb 23 13:28:45 2015
>> @@ -353,10 +353,6 @@ namespace llvm {
>>      /// specified value type.
>>      const TargetRegisterClass *getRegClassFor(MVT VT) const override;
>>
>> -    /// getMaximalGlobalOffset - Returns the maximal possible offset
>> which can
>> -    /// be used for loads / stores from the global.
>> -    unsigned getMaximalGlobalOffset() const override;
>> -
>>      /// Returns true if a cast between SrcAS and DestAS is a noop.
>>      bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const
>> override {
>>        // Addrspacecasts are always noops.
>>
>> Modified: llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp?rev=230245&r1=230244&r2=230245&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp (original)
>> +++ llvm/trunk/lib/Target/ARM/ARMTargetMachine.cpp Mon Feb 23 13:28:45
>> 2015
>> @@ -326,7 +326,12 @@ void ARMPassConfig::addIRPasses() {
>>
>>  bool ARMPassConfig::addPreISel() {
>>    if (TM->getOptLevel() != CodeGenOpt::None)
>> -    addPass(createGlobalMergePass(TM));
>> +    // FIXME: This is using the thumb1 only constant value for
>> +    // maximal global offset for merging globals. We may want
>> +    // to look into using the old value for non-thumb1 code of
>> +    // 4095 based on the TargetMachine, but this starts to become
>> +    // tricky when doing code gen per function.
>> +    addPass(createGlobalMergePass(TM, 127));
>>
>>
> Is it possible to scan all the functions in the module and find the
> minimum of the MaximalOffsets instead of passing the value to the
> constructor of GlobalMerge? If all functions in the module are non-thumb1,
> 4095 is used as the maximal offset (which I think allows a larger number of
> globals to be merged), otherwise 127 is used.
>
>
>>    return false;
>>  }
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150223/c35937ab/attachment.html>


More information about the llvm-commits mailing list