<div dir="ltr"><div><div><div><div>Hi,<br><br></div>I found some different discrepancy on how Subtarget is created <br>between some arch specific TargetMachine constructor.<br></div>For example, for BPF/Lanai:<br><br>BPFTargetMachine::BPFTargetMachine(const Target &T, const Triple &TT,<br>                                   StringRef CPU, StringRef FS,<br>                                   const TargetOptions &Options,<br>                                   Optional<Reloc::Model> RM,<br>                                   Optional<CodeModel::Model> CM,<br>                                   CodeGenOpt::Level OL, bool JIT)<br>    : LLVMTargetMachine(T, computeDataLayout(TT), TT, CPU, FS, Options,<br>                        getEffectiveRelocModel(RM), getEffectiveCodeModel(CM),<br>                        OL),<br>      TLOF(make_unique<TargetLoweringObjectFileELF>()),<br>      Subtarget(TT, CPU, FS, *this) {<br>  initAsmInfo();<br>}<br>LanaiTargetMachine::LanaiTargetMachine(const Target &T, const Triple &TT,<br>                                       StringRef Cpu, StringRef FeatureString,<br>                                       const TargetOptions &Options,<br>                                       Optional<Reloc::Model> RM,<br>                                       Optional<CodeModel::Model> CodeModel,<br>                                       CodeGenOpt::Level OptLevel, bool JIT)<br>    : LLVMTargetMachine(T, computeDataLayout(), TT, Cpu, FeatureString, Options,<br>                        getEffectiveRelocModel(RM),<br>                        getEffectiveCodeModel(CodeModel), OptLevel),<br>      Subtarget(TT, Cpu, FeatureString, *this, Options, getCodeModel(),<br>                OptLevel),<br>      TLOF(new LanaiTargetObjectFile()) {<br>  initAsmInfo();<br>}<br></div><div><br></div>Note that Subtarget is created as part of constructor. On the other hard, initAsmInfo() tries to create a subtargetinfo as well. The "Subtarget" created here later on is returned through:<br>  const LanaiSubtarget *<br>  getSubtargetImpl(const llvm::Function & /*Fn*/) const override {<br>    return &Subtarget;<br>  }<br><br></div>ARM/X86 does differently. <br><div>ARMBaseTargetMachine::ARMBaseTargetMachine(const Target &T, const Triple &TT,<br>                                           StringRef CPU, StringRef FS,<br>                                           const TargetOptions &Options,<br>                                           Optional<Reloc::Model> RM,<br>                                           Optional<CodeModel::Model> CM,<br>                                           CodeGenOpt::Level OL, bool isLittle)<br>    : LLVMTargetMachine(T, computeDataLayout(TT, CPU, Options, isLittle), TT,<br>                        CPU, FS, Options, getEffectiveRelocModel(TT, RM),<br>                        getEffectiveCodeModel(CM), OL),<br>      TargetABI(computeTargetABI(TT, CPU, Options)),<br>      TLOF(createTLOF(getTargetTriple())), isLittle(isLittle) {<br>...<br>}<br></div><div>It does not create a separate Subtarget, and its getSubtargetImpl() tries to get the value<br></div><div>from SubtargetMap.<br><br></div><div>Is there any downside to keep BPFTargetMachine as is? Or it is worthwhile to implement it in a similar way to X86/ARM?<br><br></div><div>Thanks!<br><br></div><div>Yonghong<br></div><div><br></div></div>