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

Quentin Colombet via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 5 11:42:38 PDT 2017


And AMDGPU is r307186

> On Jun 30, 2017, at 5:46 PM, Quentin Colombet <qcolombet at apple.com> wrote:
> 
> Looks like I forgot about that stuff! Thanks for reminding me offline!
> 
> ARM: r306920
> X86: r306921
> 
> Cheers,
> Q.
>> On May 1, 2017, at 3:26 PM, Quentin Colombet via llvm-commits <llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>> wrote:
>> 
>> That’s r301841
>> 
>> I’m guessing ARM and X86 copied their code from AArch64, so the problem is likely to be there too. I’ll do that too.
>> 
>>> On Apr 27, 2017, at 11:25 AM, Eric Christopher <echristo at gmail.com <mailto:echristo at gmail.com>> wrote:
>>> 
>>> Thank you! 
>>> 
>>> On Thu, Apr 27, 2017 at 11:24 AM Quentin Colombet <qcolombet at apple.com <mailto: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 <mailto: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 <mailto: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 <mailto: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 <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 <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 <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 <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 <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 <mailto:llvm-commits at lists.llvm.org>
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits <http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits>
>> 
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org <mailto: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/20170705/1fcc2d84/attachment.html>


More information about the llvm-commits mailing list