xref: /llvm-project/mlir/lib/Dialect/UB/IR/UBOps.cpp (revision 35d55f2894a2a2cdca5db494f519aa5ec7273678)
1 //===- UBOps.cpp - UB Dialect Operations ----------------------------------===//
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 #include "mlir/Dialect/UB/IR/UBOps.h"
10 #include "mlir/Conversion/ConvertToLLVM/ToLLVMInterface.h"
11 #include "mlir/Transforms/InliningUtils.h"
12 
13 #include "mlir/IR/Builders.h"
14 #include "mlir/IR/DialectImplementation.h"
15 #include "llvm/ADT/TypeSwitch.h"
16 
17 #include "mlir/Dialect/UB/IR/UBOpsDialect.cpp.inc"
18 
19 using namespace mlir;
20 using namespace mlir::ub;
21 
22 namespace {
23 /// This class defines the interface for handling inlining with UB
24 /// operations.
25 struct UBInlinerInterface : public DialectInlinerInterface {
26   using DialectInlinerInterface::DialectInlinerInterface;
27 
28   /// All UB ops can be inlined.
isLegalToInline__anonc38b267a0111::UBInlinerInterface29   bool isLegalToInline(Operation *, Region *, bool, IRMapping &) const final {
30     return true;
31   }
32 };
33 } // namespace
34 
35 //===----------------------------------------------------------------------===//
36 // UBDialect
37 //===----------------------------------------------------------------------===//
38 
initialize()39 void UBDialect::initialize() {
40   addOperations<
41 #define GET_OP_LIST
42 #include "mlir/Dialect/UB/IR/UBOps.cpp.inc"
43       >();
44   addAttributes<
45 #define GET_ATTRDEF_LIST
46 #include "mlir/Dialect/UB/IR/UBOpsAttributes.cpp.inc"
47       >();
48   addInterfaces<UBInlinerInterface>();
49   declarePromisedInterface<ConvertToLLVMPatternInterface, UBDialect>();
50 }
51 
materializeConstant(OpBuilder & builder,Attribute value,Type type,Location loc)52 Operation *UBDialect::materializeConstant(OpBuilder &builder, Attribute value,
53                                           Type type, Location loc) {
54   if (auto attr = dyn_cast<PoisonAttr>(value))
55     return builder.create<PoisonOp>(loc, type, attr);
56 
57   return nullptr;
58 }
59 
fold(FoldAdaptor)60 OpFoldResult PoisonOp::fold(FoldAdaptor /*adaptor*/) { return getValue(); }
61 
62 #include "mlir/Dialect/UB/IR/UBOpsInterfaces.cpp.inc"
63 
64 #define GET_ATTRDEF_CLASSES
65 #include "mlir/Dialect/UB/IR/UBOpsAttributes.cpp.inc"
66 
67 #define GET_OP_CLASSES
68 #include "mlir/Dialect/UB/IR/UBOps.cpp.inc"
69