[llvm] r265567 - [AArch64] Teach the subtarget how to get to the RegisterBankInfo.

Eric Christopher via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 27 11:25:31 PDT 2017


Thank you!

On Thu, Apr 27, 2017 at 11:24 AM Quentin Colombet <qcolombet at apple.com>
wrote:

> Hi Eric,
>
> Catching up with my emails after my paternity leave.
>
>
> On Apr 25, 2017, at 2:57 PM, Eric Christopher <echristo at gmail.com> wrote:
>
> Adding in Gerolf since he's interested in this stuff too.
>
> And a quick ping. :)
>
> -eric
>
> On Fri, Apr 14, 2017 at 10:28 PM Eric Christopher <echristo at gmail.com>
> wrote:
>
>> Hi Quentin,
>>
>> I realize this is some definite archaeology, but the code is still there
>> so...
>>
>> Taking a look at r265567 I see this:
>>
>> +#ifndef LLVM_BUILD_GLOBAL_ISEL
>> +    AArch64GISelAccessor *GISelAccessor = new AArch64GISelAccessor();
>> +#else
>> +    AArch64GISelActualAccessor *GISelAccessor =
>> +        new AArch64GISelActualAccessor();
>> +    GISelAccessor->CallLoweringInfo.reset(
>> +        new AArch64CallLowering(*I->getTargetLowering()));
>> +    GISelAccessor->RegBankInfo.reset(
>> +        new AArch64RegisterBankInfo(*I->getRegisterInfo()));
>> +#endif
>> +    I->setGISelAccessor(*GISelAccessor);
>>
>> and I don't think that this is the right place to do this work.
>>
>> It seems reasonable that all of this happens inside the subtarget
>> construction rather than after we've constructed a new subtarget. Also
>> means you can simplify a lot of the accesses.
>>
>> Thoughts?
>>
>
> Sounds reasonable.
>
> I could have sworn there was a good reason why I didn’t do that, but it
> seems I am just stupid!
>
> I’ll fix that in the coming days.
>
> Thanks,
> -Quentin
>
>
>> Thanks!
>>
>> -eric
>>
>>
>> On Wed, Apr 6, 2016 at 10:31 AM Quentin Colombet via llvm-commits <
>> llvm-commits at lists.llvm.org> wrote:
>>
>>> Author: qcolombet
>>> Date: Wed Apr  6 12:26:03 2016
>>> New Revision: 265567
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=265567&view=rev
>>> Log:
>>> [AArch64] Teach the subtarget how to get to the RegisterBankInfo.
>>>
>>> Rework the access to GlobalISel APIs to contain how much of
>>> the APIs we need to access for the final executable to build when
>>> GlobalISel is not built.
>>>
>>> This prevents massive usage of ifdefs in various places. Now, all the
>>> GlobalISel ifdefs will be happing only in AArch64TargetMachine.cpp.
>>>
>>> Added:
>>>     llvm/trunk/lib/Target/AArch64/AArch64GISelAccessor.h
>>> Modified:
>>>     llvm/trunk/lib/Target/AArch64/AArch64Subtarget.cpp
>>>     llvm/trunk/lib/Target/AArch64/AArch64Subtarget.h
>>>     llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp
>>>
>>> Added: llvm/trunk/lib/Target/AArch64/AArch64GISelAccessor.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64GISelAccessor.h?rev=265567&view=auto
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Target/AArch64/AArch64GISelAccessor.h (added)
>>> +++ llvm/trunk/lib/Target/AArch64/AArch64GISelAccessor.h Wed Apr  6
>>> 12:26:03 2016
>>> @@ -0,0 +1,33 @@
>>> +//===-- AArch64GISelAccessor.h - AArch64 GISel Accessor ---------*- C++
>>> -*-===//
>>> +//
>>> +//                     The LLVM Compiler Infrastructure
>>> +//
>>> +// This file is distributed under the University of Illinois Open Source
>>> +// License. See LICENSE.TXT for details.
>>> +//
>>>
>>> +//===----------------------------------------------------------------------===//
>>> +//
>>> +/// This file declares the API to access the various APIs related
>>> +/// to GlobalISel.
>>> +//
>>>
>>> +//===----------------------------------------------------------------------===/
>>> +
>>> +#ifndef LLVM_LIB_TARGET_AARCH64_AARCH64GISELACCESSOR_H
>>> +#define LLVM_LIB_TARGET_AARCH64_AARCH64GISELACCESSOR_H
>>> +
>>> +namespace llvm {
>>> +class CallLowering;
>>> +class RegisterBankInfo;
>>> +
>>> +/// The goal of this helper class is to gather the accessor to all
>>> +/// the APIs related to GlobalISel.
>>> +/// It should be derived to feature an actual accessor to the GISel
>>> APIs.
>>> +/// The reason why this is not simply done into the subtarget is to
>>> avoid
>>> +/// spreading ifdefs around.
>>> +struct AArch64GISelAccessor {
>>> +  virtual ~AArch64GISelAccessor() {}
>>> +  virtual const CallLowering *getCallLowering() const { return nullptr;}
>>> +  virtual const RegisterBankInfo *getRegBankInfo() const { return
>>> nullptr;}
>>> +};
>>> +} // End namespace llvm;
>>> +#endif
>>>
>>> Modified: llvm/trunk/lib/Target/AArch64/AArch64Subtarget.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64Subtarget.cpp?rev=265567&r1=265566&r2=265567&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Target/AArch64/AArch64Subtarget.cpp (original)
>>> +++ llvm/trunk/lib/Target/AArch64/AArch64Subtarget.cpp Wed Apr  6
>>> 12:26:03 2016
>>> @@ -57,12 +57,16 @@ AArch64Subtarget::AArch64Subtarget(const
>>>        StrictAlign(false), ReserveX18(TT.isOSDarwin()),
>>> IsLittle(LittleEndian),
>>>        CPUString(CPU), TargetTriple(TT), FrameLowering(),
>>>        InstrInfo(initializeSubtargetDependencies(FS)), TSInfo(),
>>> -      TLInfo(TM, *this), CallLoweringInfo(nullptr) {}
>>> +      TLInfo(TM, *this), GISelAccessor() {}
>>>
>>>  const CallLowering *AArch64Subtarget::getCallLowering() const {
>>> -  if (!CallLoweringInfo)
>>> -    CallLoweringInfo.reset(new AArch64CallLowering(TLInfo));
>>> -  return CallLoweringInfo.get();
>>> +  assert(GISelAccessor && "Access to GlobalISel APIs not set");
>>> +  return GISelAccessor->getCallLowering();
>>> +}
>>> +
>>> +const RegisterBankInfo *AArch64Subtarget::getRegBankInfo() const {
>>> +  assert(GISelAccessor && "Access to GlobalISel APIs not set");
>>> +  return GISelAccessor->getRegBankInfo();
>>>  }
>>>
>>>  /// ClassifyGlobalReference - Find the target operand flags that
>>> describe
>>>
>>> Modified: llvm/trunk/lib/Target/AArch64/AArch64Subtarget.h
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64Subtarget.h?rev=265567&r1=265566&r2=265567&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Target/AArch64/AArch64Subtarget.h (original)
>>> +++ llvm/trunk/lib/Target/AArch64/AArch64Subtarget.h Wed Apr  6 12:26:03
>>> 2016
>>> @@ -14,8 +14,8 @@
>>>  #ifndef LLVM_LIB_TARGET_AARCH64_AARCH64SUBTARGET_H
>>>  #define LLVM_LIB_TARGET_AARCH64_AARCH64SUBTARGET_H
>>>
>>> -#include "AArch64CallLowering.h"
>>>  #include "AArch64FrameLowering.h"
>>> +#include "AArch64GISelAccessor.h"
>>>  #include "AArch64ISelLowering.h"
>>>  #include "AArch64InstrInfo.h"
>>>  #include "AArch64RegisterInfo.h"
>>> @@ -82,7 +82,10 @@ protected:
>>>    AArch64InstrInfo InstrInfo;
>>>    AArch64SelectionDAGInfo TSInfo;
>>>    AArch64TargetLowering TLInfo;
>>> -  mutable std::unique_ptr<AArch64CallLowering> CallLoweringInfo;
>>> +  /// Gather the accessor points to GlobalISel-related APIs.
>>> +  /// This is used to avoid ifndefs spreading around while GISel is
>>> +  /// an optional library.
>>> +  std::unique_ptr<AArch64GISelAccessor> GISelAccessor;
>>>
>>>  private:
>>>    /// initializeSubtargetDependencies - Initializes using CPUString and
>>> the
>>> @@ -97,6 +100,11 @@ public:
>>>                     const std::string &FS, const TargetMachine &TM,
>>>                     bool LittleEndian);
>>>
>>> +  /// This object will take onwership of \p GISelAccessor.
>>> +  void setGISelAccessor(AArch64GISelAccessor &GISelAccessor) {
>>> +    this->GISelAccessor.reset(&GISelAccessor);
>>> +  }
>>> +
>>>    const AArch64SelectionDAGInfo *getSelectionDAGInfo() const override {
>>>      return &TSInfo;
>>>    }
>>> @@ -111,6 +119,7 @@ public:
>>>      return &getInstrInfo()->getRegisterInfo();
>>>    }
>>>    const CallLowering *getCallLowering() const override;
>>> +  const RegisterBankInfo *getRegBankInfo() const override;
>>>    const Triple &getTargetTriple() const { return TargetTriple; }
>>>    bool enableMachineScheduler() const override { return true; }
>>>    bool enablePostRAScheduler() const override {
>>>
>>> Modified: llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp?rev=265567&r1=265566&r2=265567&view=diff
>>>
>>> ==============================================================================
>>> --- llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp (original)
>>> +++ llvm/trunk/lib/Target/AArch64/AArch64TargetMachine.cpp Wed Apr  6
>>> 12:26:03 2016
>>> @@ -11,6 +11,8 @@
>>>
>>>  //===----------------------------------------------------------------------===//
>>>
>>>  #include "AArch64.h"
>>> +#include "AArch64CallLowering.h"
>>> +#include "AArch64RegisterBankInfo.h"
>>>  #include "AArch64TargetMachine.h"
>>>  #include "AArch64TargetObjectFile.h"
>>>  #include "AArch64TargetTransformInfo.h"
>>> @@ -154,6 +156,21 @@ AArch64TargetMachine::AArch64TargetMachi
>>>
>>>  AArch64TargetMachine::~AArch64TargetMachine() {}
>>>
>>> +#ifdef LLVM_BUILD_GLOBAL_ISEL
>>> +namespace {
>>> +struct AArch64GISelActualAccessor : public AArch64GISelAccessor {
>>> +  std::unique_ptr<CallLowering> CallLoweringInfo;
>>> +  std::unique_ptr<RegisterBankInfo> RegBankInfo;
>>> +  const CallLowering *getCallLowering() const override {
>>> +    return CallLoweringInfo.get();
>>> +  }
>>> +  const RegisterBankInfo *getRegBankInfo() const override {
>>> +    return RegBankInfo.get();
>>> +  }
>>> +};
>>> +} // End anonymous namespace.
>>> +#endif
>>> +
>>>  const AArch64Subtarget *
>>>  AArch64TargetMachine::getSubtargetImpl(const Function &F) const {
>>>    Attribute CPUAttr = F.getFnAttribute("target-cpu");
>>> @@ -174,6 +191,17 @@ AArch64TargetMachine::getSubtargetImpl(c
>>>      resetTargetOptions(F);
>>>      I = llvm::make_unique<AArch64Subtarget>(TargetTriple, CPU, FS,
>>> *this,
>>>                                              isLittle);
>>> +#ifndef LLVM_BUILD_GLOBAL_ISEL
>>> +    AArch64GISelAccessor *GISelAccessor = new AArch64GISelAccessor();
>>> +#else
>>> +    AArch64GISelActualAccessor *GISelAccessor =
>>> +        new AArch64GISelActualAccessor();
>>> +    GISelAccessor->CallLoweringInfo.reset(
>>> +        new AArch64CallLowering(*I->getTargetLowering()));
>>> +    GISelAccessor->RegBankInfo.reset(
>>> +        new AArch64RegisterBankInfo(*I->getRegisterInfo()));
>>> +#endif
>>> +    I->setGISelAccessor(*GISelAccessor);
>>>    }
>>>    return I.get();
>>>  }
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>>
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170427/e9099e39/attachment.html>


More information about the llvm-commits mailing list