From 28ebdf1a02eb26f1fc539991e97b41510bfd031f Mon Sep 17 00:00:00 2001 From: Daniel Sanders Date: Tue, 16 Jun 2020 13:41:38 -0700 Subject: [PATCH] [gicombiner] Allow generated CombinerHelpers to have additional arguments Summary: This allows combiners to delegate to other helpers or depend on additional information. It's not great as an overall solution though as callers must provide the argument on every call, even for static data like an additional helper. Another patch will follow to support additional members of the generated combiner. Reviewers: aditya_nandakumar, bogner, aemerson, paquette, volkan, arsenm Reviewed By: aditya_nandakumar Subscribers: wdng, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D81862 --- .../include/llvm/Target/GlobalISel/Combine.td | 8 ++++++++ llvm/utils/TableGen/GICombinerEmitter.cpp | 19 ++++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/llvm/include/llvm/Target/GlobalISel/Combine.td b/llvm/include/llvm/Target/GlobalISel/Combine.td index b41185133d770..7803ce1b51abd 100644 --- a/llvm/include/llvm/Target/GlobalISel/Combine.td +++ b/llvm/include/llvm/Target/GlobalISel/Combine.td @@ -27,6 +27,11 @@ class GICombineGroup rules> : GICombine { let Rules = rules; } +class GICombinerHelperArg { + string Type = type; + string Name = name; +} + // Declares a combiner helper class class GICombinerHelper rules> : GICombineGroup { @@ -35,6 +40,9 @@ class GICombinerHelper rules> // The name of a run-time compiler option that will be generated to disable // specific rules within this combiner. string DisableRuleOption = ?; + // Any additional arguments that should be appended to the tryCombine*(). + list AdditionalArguments = + [GICombinerHelperArg<"CombinerHelper &", "Helper">]; } class GICombineRule : GICombine { /// Defines the external interface of the match rule. This includes: diff --git a/llvm/utils/TableGen/GICombinerEmitter.cpp b/llvm/utils/TableGen/GICombinerEmitter.cpp index 8c70ed157a587..761ca4b52614d 100644 --- a/llvm/utils/TableGen/GICombinerEmitter.cpp +++ b/llvm/utils/TableGen/GICombinerEmitter.cpp @@ -841,6 +841,13 @@ void GICombinerEmitter::generateCodeForTree(raw_ostream &OS, OS << Indent << "return false;\n"; } +static void emitAdditionalHelperMethodArguments(raw_ostream &OS, + Record *Combiner) { + for (Record *Arg : Combiner->getValueAsListOfDefs("AdditionalArguments")) + OS << ",\n " << Arg->getValueAsString("Type") + << Arg->getValueAsString("Name"); +} + void GICombinerEmitter::run(raw_ostream &OS) { gatherRules(Rules, Combiner->getValueAsListOfDefs("Rules")); if (StopAfterParse) { @@ -901,9 +908,10 @@ void GICombinerEmitter::run(raw_ostream &OS) { << " bool tryCombineAll(\n" << " GISelChangeObserver &Observer,\n" << " MachineInstr &MI,\n" - << " MachineIRBuilder &B,\n" - << " CombinerHelper &Helper) const;\n" - << "};\n\n"; + << " MachineIRBuilder &B"; + emitAdditionalHelperMethodArguments(OS, Combiner); + OS << ") const;\n"; + OS << "};\n\n"; emitNameMatcher(OS); @@ -958,8 +966,9 @@ void GICombinerEmitter::run(raw_ostream &OS) { OS << "bool " << getClassName() << "::tryCombineAll(\n" << " GISelChangeObserver &Observer,\n" << " MachineInstr &MI,\n" - << " MachineIRBuilder &B,\n" - << " CombinerHelper &Helper) const {\n" + << " MachineIRBuilder &B"; + emitAdditionalHelperMethodArguments(OS, Combiner); + OS << ") const {\n" << " MachineBasicBlock *MBB = MI.getParent();\n" << " MachineFunction *MF = MBB->getParent();\n" << " MachineRegisterInfo &MRI = MF->getRegInfo();\n"