xref: /llvm-project/mlir/lib/Dialect/LLVMIR/IR/LLVMInterfaces.cpp (revision f4d758634305304c0deb49a4ed3f99180a2488ea)
1edfefd7fSTobias Gysi //===- LLVMInterfaces.cpp - LLVM Interfaces ---------------------*- C++ -*-===//
2edfefd7fSTobias Gysi //
3edfefd7fSTobias Gysi // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4edfefd7fSTobias Gysi // See https://llvm.org/LICENSE.txt for license information.
5edfefd7fSTobias Gysi // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6edfefd7fSTobias Gysi //
7edfefd7fSTobias Gysi //===----------------------------------------------------------------------===//
8edfefd7fSTobias Gysi //
9edfefd7fSTobias Gysi // This file defines op interfaces for the LLVM dialect in MLIR.
10edfefd7fSTobias Gysi //
11edfefd7fSTobias Gysi //===----------------------------------------------------------------------===//
12edfefd7fSTobias Gysi 
13edfefd7fSTobias Gysi #include "mlir/Dialect/LLVMIR/LLVMInterfaces.h"
14edfefd7fSTobias Gysi #include "mlir/Dialect/LLVMIR/LLVMDialect.h"
15edfefd7fSTobias Gysi 
16edfefd7fSTobias Gysi using namespace mlir;
17edfefd7fSTobias Gysi using namespace mlir::LLVM;
18edfefd7fSTobias Gysi 
191dda134fSMarkus Böck /// Verifies that all elements of `array` are instances of `Attr`.
201dda134fSMarkus Böck template <class AttrT>
211dda134fSMarkus Böck static LogicalResult isArrayOf(Operation *op, ArrayAttr array) {
221dda134fSMarkus Böck   for (Attribute iter : array)
231dda134fSMarkus Böck     if (!isa<AttrT>(iter))
241dda134fSMarkus Böck       return op->emitOpError("expected op to return array of ")
251dda134fSMarkus Böck              << AttrT::getMnemonic() << " attributes";
26edfefd7fSTobias Gysi   return success();
27edfefd7fSTobias Gysi }
28edfefd7fSTobias Gysi 
29edfefd7fSTobias Gysi //===----------------------------------------------------------------------===//
30edfefd7fSTobias Gysi // AccessGroupOpInterface
31edfefd7fSTobias Gysi //===----------------------------------------------------------------------===//
32edfefd7fSTobias Gysi 
33edfefd7fSTobias Gysi LogicalResult mlir::LLVM::detail::verifyAccessGroupOpInterface(Operation *op) {
34edfefd7fSTobias Gysi   auto iface = cast<AccessGroupOpInterface>(op);
359170fa58SMarkus Böck   ArrayAttr accessGroups = iface.getAccessGroupsOrNull();
369170fa58SMarkus Böck   if (!accessGroups)
379170fa58SMarkus Böck     return success();
381dda134fSMarkus Böck 
391dda134fSMarkus Böck   return isArrayOf<AccessGroupAttr>(op, accessGroups);
40edfefd7fSTobias Gysi }
41edfefd7fSTobias Gysi 
42edfefd7fSTobias Gysi //===----------------------------------------------------------------------===//
43edfefd7fSTobias Gysi // AliasAnalysisOpInterface
44edfefd7fSTobias Gysi //===----------------------------------------------------------------------===//
45edfefd7fSTobias Gysi 
46edfefd7fSTobias Gysi LogicalResult
47edfefd7fSTobias Gysi mlir::LLVM::detail::verifyAliasAnalysisOpInterface(Operation *op) {
48edfefd7fSTobias Gysi   auto iface = cast<AliasAnalysisOpInterface>(op);
491dda134fSMarkus Böck 
501dda134fSMarkus Böck   if (auto aliasScopes = iface.getAliasScopesOrNull())
511dda134fSMarkus Böck     if (failed(isArrayOf<AliasScopeAttr>(op, aliasScopes)))
52edfefd7fSTobias Gysi       return failure();
531dda134fSMarkus Böck 
541dda134fSMarkus Böck   if (auto noAliasScopes = iface.getNoAliasScopesOrNull())
551dda134fSMarkus Böck     if (failed(isArrayOf<AliasScopeAttr>(op, noAliasScopes)))
561dda134fSMarkus Böck       return failure();
571dda134fSMarkus Böck 
581dda134fSMarkus Böck   ArrayAttr tags = iface.getTBAATagsOrNull();
591dda134fSMarkus Böck   if (!tags)
60edfefd7fSTobias Gysi     return success();
611dda134fSMarkus Böck 
621dda134fSMarkus Böck   return isArrayOf<TBAATagAttr>(op, tags);
63edfefd7fSTobias Gysi }
64edfefd7fSTobias Gysi 
65f9173c29SMarkus Böck SmallVector<Value> mlir::LLVM::AtomicCmpXchgOp::getAccessedOperands() {
66f9173c29SMarkus Böck   return {getPtr()};
67f9173c29SMarkus Böck }
68f9173c29SMarkus Böck 
69f9173c29SMarkus Böck SmallVector<Value> mlir::LLVM::AtomicRMWOp::getAccessedOperands() {
70f9173c29SMarkus Böck   return {getPtr()};
71f9173c29SMarkus Böck }
72f9173c29SMarkus Böck 
73f9173c29SMarkus Böck SmallVector<Value> mlir::LLVM::LoadOp::getAccessedOperands() {
74f9173c29SMarkus Böck   return {getAddr()};
75f9173c29SMarkus Böck }
76f9173c29SMarkus Böck 
77f9173c29SMarkus Böck SmallVector<Value> mlir::LLVM::StoreOp::getAccessedOperands() {
78f9173c29SMarkus Böck   return {getAddr()};
79f9173c29SMarkus Böck }
80f9173c29SMarkus Böck 
81f9173c29SMarkus Böck SmallVector<Value> mlir::LLVM::MemcpyOp::getAccessedOperands() {
82f9173c29SMarkus Böck   return {getDst(), getSrc()};
83f9173c29SMarkus Böck }
84f9173c29SMarkus Böck 
85f9173c29SMarkus Böck SmallVector<Value> mlir::LLVM::MemcpyInlineOp::getAccessedOperands() {
86f9173c29SMarkus Böck   return {getDst(), getSrc()};
87f9173c29SMarkus Böck }
88f9173c29SMarkus Böck 
89f9173c29SMarkus Böck SmallVector<Value> mlir::LLVM::MemmoveOp::getAccessedOperands() {
90f9173c29SMarkus Böck   return {getDst(), getSrc()};
91f9173c29SMarkus Böck }
92f9173c29SMarkus Böck 
93f9173c29SMarkus Böck SmallVector<Value> mlir::LLVM::MemsetOp::getAccessedOperands() {
94f9173c29SMarkus Böck   return {getDst()};
95f9173c29SMarkus Böck }
96f9173c29SMarkus Böck 
9730753afcSPikachuHy SmallVector<Value> mlir::LLVM::MemsetInlineOp::getAccessedOperands() {
9830753afcSPikachuHy   return {getDst()};
9930753afcSPikachuHy }
10030753afcSPikachuHy 
101f9173c29SMarkus Böck SmallVector<Value> mlir::LLVM::CallOp::getAccessedOperands() {
102*f4d75863SJakub Kuderski   return llvm::filter_to_vector(getArgOperands(), [](Value arg) {
103f9173c29SMarkus Böck     return isa<LLVMPointerType>(arg.getType());
104*f4d75863SJakub Kuderski   });
105f9173c29SMarkus Böck }
106f9173c29SMarkus Böck 
107edfefd7fSTobias Gysi #include "mlir/Dialect/LLVMIR/LLVMInterfaces.cpp.inc"
108