//===- LLVMInterfaces.cpp - LLVM Interfaces ---------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file defines op interfaces for the LLVM dialect in MLIR. // //===----------------------------------------------------------------------===// #include "mlir/Dialect/LLVMIR/LLVMInterfaces.h" #include "mlir/Dialect/LLVMIR/LLVMDialect.h" using namespace mlir; using namespace mlir::LLVM; /// Verifies that all elements of `array` are instances of `Attr`. template static LogicalResult isArrayOf(Operation *op, ArrayAttr array) { for (Attribute iter : array) if (!isa(iter)) return op->emitOpError("expected op to return array of ") << AttrT::getMnemonic() << " attributes"; return success(); } //===----------------------------------------------------------------------===// // AccessGroupOpInterface //===----------------------------------------------------------------------===// LogicalResult mlir::LLVM::detail::verifyAccessGroupOpInterface(Operation *op) { auto iface = cast(op); ArrayAttr accessGroups = iface.getAccessGroupsOrNull(); if (!accessGroups) return success(); return isArrayOf(op, accessGroups); } //===----------------------------------------------------------------------===// // AliasAnalysisOpInterface //===----------------------------------------------------------------------===// LogicalResult mlir::LLVM::detail::verifyAliasAnalysisOpInterface(Operation *op) { auto iface = cast(op); if (auto aliasScopes = iface.getAliasScopesOrNull()) if (failed(isArrayOf(op, aliasScopes))) return failure(); if (auto noAliasScopes = iface.getNoAliasScopesOrNull()) if (failed(isArrayOf(op, noAliasScopes))) return failure(); ArrayAttr tags = iface.getTBAATagsOrNull(); if (!tags) return success(); return isArrayOf(op, tags); } SmallVector mlir::LLVM::AtomicCmpXchgOp::getAccessedOperands() { return {getPtr()}; } SmallVector mlir::LLVM::AtomicRMWOp::getAccessedOperands() { return {getPtr()}; } SmallVector mlir::LLVM::LoadOp::getAccessedOperands() { return {getAddr()}; } SmallVector mlir::LLVM::StoreOp::getAccessedOperands() { return {getAddr()}; } SmallVector mlir::LLVM::MemcpyOp::getAccessedOperands() { return {getDst(), getSrc()}; } SmallVector mlir::LLVM::MemcpyInlineOp::getAccessedOperands() { return {getDst(), getSrc()}; } SmallVector mlir::LLVM::MemmoveOp::getAccessedOperands() { return {getDst(), getSrc()}; } SmallVector mlir::LLVM::MemsetOp::getAccessedOperands() { return {getDst()}; } SmallVector mlir::LLVM::CallOp::getAccessedOperands() { return llvm::to_vector( llvm::make_filter_range(getArgOperands(), [](Value arg) { return isa(arg.getType()); })); } #include "mlir/Dialect/LLVMIR/LLVMInterfaces.cpp.inc"