MLIR  21.0.0git
NVVMAttachTarget.cpp
Go to the documentation of this file.
1 //===- NVVMAttachTarget.cpp - Attach an NVVM target -----------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file implements the `GpuNVVMAttachTarget` pass, attaching `#nvvm.target`
10 // attributes to GPU modules.
11 //
12 //===----------------------------------------------------------------------===//
13 
15 
18 #include "mlir/IR/Builders.h"
19 #include "mlir/Pass/Pass.h"
21 #include "llvm/Support/Regex.h"
22 
23 namespace mlir {
24 #define GEN_PASS_DEF_GPUNVVMATTACHTARGET
25 #include "mlir/Dialect/GPU/Transforms/Passes.h.inc"
26 } // namespace mlir
27 
28 using namespace mlir;
29 using namespace mlir::NVVM;
30 
31 namespace {
32 struct NVVMAttachTarget
33  : public impl::GpuNVVMAttachTargetBase<NVVMAttachTarget> {
34  using Base::Base;
35 
36  DictionaryAttr getFlags(OpBuilder &builder) const;
37 
38  void runOnOperation() override;
39 
40  void getDependentDialects(DialectRegistry &registry) const override {
41  registry.insert<NVVM::NVVMDialect>();
42  }
43 };
44 } // namespace
45 
46 DictionaryAttr NVVMAttachTarget::getFlags(OpBuilder &builder) const {
47  UnitAttr unitAttr = builder.getUnitAttr();
49  auto addFlag = [&](StringRef flag) {
50  flags.push_back(builder.getNamedAttr(flag, unitAttr));
51  };
52  if (fastFlag)
53  addFlag("fast");
54  if (ftzFlag)
55  addFlag("ftz");
56 
57  // Tokenize and set the optional command line options.
58  if (!cmdOptions.empty()) {
60  if (!options.second.empty()) {
61  llvm::SmallVector<mlir::Attribute> nvvmOptionAttrs;
62  for (const char *opt : options.second) {
63  nvvmOptionAttrs.emplace_back(
64  mlir::StringAttr::get(builder.getContext(), StringRef(opt)));
65  }
66  flags.push_back(builder.getNamedAttr(
67  "ptxas-cmd-options",
68  mlir::ArrayAttr::get(builder.getContext(), nvvmOptionAttrs)));
69  }
70  }
71 
72  if (!flags.empty())
73  return builder.getDictionaryAttr(flags);
74  return nullptr;
75 }
76 
77 void NVVMAttachTarget::runOnOperation() {
78  OpBuilder builder(&getContext());
79  ArrayRef<std::string> libs(linkLibs);
80  SmallVector<StringRef> filesToLink(libs);
81  auto target = builder.getAttr<NVVMTargetAttr>(
82  optLevel, triple, chip, features, getFlags(builder),
83  filesToLink.empty() ? nullptr : builder.getStrArrayAttr(filesToLink));
84  llvm::Regex matcher(moduleMatcher);
85  for (Region &region : getOperation()->getRegions())
86  for (Block &block : region.getBlocks())
87  for (auto module : block.getOps<gpu::GPUModuleOp>()) {
88  // Check if the name of the module matches.
89  if (!moduleMatcher.empty() && !matcher.match(module.getName()))
90  continue;
91  // Create the target array.
92  SmallVector<Attribute> targets;
93  if (std::optional<ArrayAttr> attrs = module.getTargets())
94  targets.append(attrs->getValue().begin(), attrs->getValue().end());
95  targets.push_back(target);
96  // Remove any duplicate targets.
97  targets.erase(llvm::unique(targets), targets.end());
98  // Update the target attribute array.
99  module.setTargetsAttr(builder.getArrayAttr(targets));
100  }
101 }
static MLIRContext * getContext(OpFoldResult val)
static llvm::ManagedStatic< PassManagerOptions > options
Block represents an ordered list of Operations.
Definition: Block.h:33
UnitAttr getUnitAttr()
Definition: Builders.cpp:94
MLIRContext * getContext() const
Definition: Builders.h:56
ArrayAttr getArrayAttr(ArrayRef< Attribute > value)
Definition: Builders.cpp:262
DictionaryAttr getDictionaryAttr(ArrayRef< NamedAttribute > value)
Definition: Builders.cpp:100
NamedAttribute getNamedAttr(StringRef name, Attribute val)
Definition: Builders.cpp:90
ArrayAttr getStrArrayAttr(ArrayRef< StringRef > values)
Definition: Builders.cpp:302
Attr getAttr(Args &&...args)
Get or construct an instance of the attribute Attr with provided arguments.
Definition: Builders.h:96
The DialectRegistry maps a dialect namespace to a constructor for the matching dialect.
This class helps build Operations.
Definition: Builders.h:205
This class contains a list of basic blocks and a link to the parent operation it is attached to.
Definition: Region.h:26
std::pair< llvm::BumpPtrAllocator, SmallVector< const char * > > tokenizeCmdOptions() const
Returns a tokenization of the command line options.
Include the generated interface declarations.
auto get(MLIRContext *context, Ts &&...params)
Helper method that injects context only if needed, this helps unify some of the attribute constructio...