xref: /llvm-project/mlir/lib/Dialect/LLVMIR/IR/LLVMInterfaces.cpp (revision f4d758634305304c0deb49a4ed3f99180a2488ea)
1 //===- LLVMInterfaces.cpp - LLVM Interfaces ---------------------*- C++ -*-===//
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 defines op interfaces for the LLVM dialect in MLIR.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "mlir/Dialect/LLVMIR/LLVMInterfaces.h"
14 #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
15 
16 using namespace mlir;
17 using namespace mlir::LLVM;
18 
19 /// Verifies that all elements of `array` are instances of `Attr`.
20 template <class AttrT>
21 static LogicalResult isArrayOf(Operation *op, ArrayAttr array) {
22   for (Attribute iter : array)
23     if (!isa<AttrT>(iter))
24       return op->emitOpError("expected op to return array of ")
25              << AttrT::getMnemonic() << " attributes";
26   return success();
27 }
28 
29 //===----------------------------------------------------------------------===//
30 // AccessGroupOpInterface
31 //===----------------------------------------------------------------------===//
32 
33 LogicalResult mlir::LLVM::detail::verifyAccessGroupOpInterface(Operation *op) {
34   auto iface = cast<AccessGroupOpInterface>(op);
35   ArrayAttr accessGroups = iface.getAccessGroupsOrNull();
36   if (!accessGroups)
37     return success();
38 
39   return isArrayOf<AccessGroupAttr>(op, accessGroups);
40 }
41 
42 //===----------------------------------------------------------------------===//
43 // AliasAnalysisOpInterface
44 //===----------------------------------------------------------------------===//
45 
46 LogicalResult
47 mlir::LLVM::detail::verifyAliasAnalysisOpInterface(Operation *op) {
48   auto iface = cast<AliasAnalysisOpInterface>(op);
49 
50   if (auto aliasScopes = iface.getAliasScopesOrNull())
51     if (failed(isArrayOf<AliasScopeAttr>(op, aliasScopes)))
52       return failure();
53 
54   if (auto noAliasScopes = iface.getNoAliasScopesOrNull())
55     if (failed(isArrayOf<AliasScopeAttr>(op, noAliasScopes)))
56       return failure();
57 
58   ArrayAttr tags = iface.getTBAATagsOrNull();
59   if (!tags)
60     return success();
61 
62   return isArrayOf<TBAATagAttr>(op, tags);
63 }
64 
65 SmallVector<Value> mlir::LLVM::AtomicCmpXchgOp::getAccessedOperands() {
66   return {getPtr()};
67 }
68 
69 SmallVector<Value> mlir::LLVM::AtomicRMWOp::getAccessedOperands() {
70   return {getPtr()};
71 }
72 
73 SmallVector<Value> mlir::LLVM::LoadOp::getAccessedOperands() {
74   return {getAddr()};
75 }
76 
77 SmallVector<Value> mlir::LLVM::StoreOp::getAccessedOperands() {
78   return {getAddr()};
79 }
80 
81 SmallVector<Value> mlir::LLVM::MemcpyOp::getAccessedOperands() {
82   return {getDst(), getSrc()};
83 }
84 
85 SmallVector<Value> mlir::LLVM::MemcpyInlineOp::getAccessedOperands() {
86   return {getDst(), getSrc()};
87 }
88 
89 SmallVector<Value> mlir::LLVM::MemmoveOp::getAccessedOperands() {
90   return {getDst(), getSrc()};
91 }
92 
93 SmallVector<Value> mlir::LLVM::MemsetOp::getAccessedOperands() {
94   return {getDst()};
95 }
96 
97 SmallVector<Value> mlir::LLVM::MemsetInlineOp::getAccessedOperands() {
98   return {getDst()};
99 }
100 
101 SmallVector<Value> mlir::LLVM::CallOp::getAccessedOperands() {
102   return llvm::filter_to_vector(getArgOperands(), [](Value arg) {
103     return isa<LLVMPointerType>(arg.getType());
104   });
105 }
106 
107 #include "mlir/Dialect/LLVMIR/LLVMInterfaces.cpp.inc"
108