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