diff --git a/mlir/include/mlir/Conversion/ArmNeonToLLVM/ArmNeonToLLVM.h b/mlir/include/mlir/Conversion/ArmNeonToLLVM/ArmNeonToLLVM.h deleted file mode 100644 --- a/mlir/include/mlir/Conversion/ArmNeonToLLVM/ArmNeonToLLVM.h +++ /dev/null @@ -1,23 +0,0 @@ -//===- ArmNeonToLLVM.h - Conversion Patterns from ArmNeon to LLVM ---------===// -// -// 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 -// -//===----------------------------------------------------------------------===// - -#ifndef MLIR_CONVERSION_ARMNEONTOLLVM_ARMNEONTOLLVM_H_ -#define MLIR_CONVERSION_ARMNEONTOLLVM_ARMNEONTOLLVM_H_ - -namespace mlir { - -class LLVMTypeConverter; -class OwningRewritePatternList; - -/// Collect a set of patterns to convert from theArmNeon dialect to LLVM. -void populateArmNeonToLLVMConversionPatterns( - LLVMTypeConverter &converter, OwningRewritePatternList &patterns); - -} // namespace mlir - -#endif // MLIR_CONVERSION_ARMNEONTOLLVM_ARMNEONTOLLVM_H_ diff --git a/mlir/include/mlir/Dialect/ArmNeon/ArmNeon.td b/mlir/include/mlir/Dialect/ArmNeon/ArmNeon.td --- a/mlir/include/mlir/Dialect/ArmNeon/ArmNeon.td +++ b/mlir/include/mlir/Dialect/ArmNeon/ArmNeon.td @@ -13,6 +13,7 @@ #ifndef ARMNEON_OPS #define ARMNEON_OPS +include "mlir/Dialect/LLVMIR/LLVMOpBase.td" include "mlir/Interfaces/SideEffectInterfaces.td" //===----------------------------------------------------------------------===// @@ -22,20 +23,43 @@ def ArmNeon_Dialect : Dialect { let name = "arm_neon"; let cppNamespace = "::mlir::arm_neon"; + + // Note: this does not need to depend on LLVMDialect as long as functions in + // this dialect (such as canonicalization) do not produce entities belonging + // to the LLVMDialect (ops or types). } //===----------------------------------------------------------------------===// // ArmNeon op definitions //===----------------------------------------------------------------------===// -class ArmNeon_Op traits = []> : - Op {} +// ArmNeon dialect op that corresponds (and is convertible to) an LLVM IR +// intrinsic. +class ArmNeon_IntrOp overloadedResults, + list overloadedOperands, int numResults, + list traits = [], bit requiresAccessGroup = 0> + : LLVM_IntrOpBase; + +// ArmNeon dialect op that corresponds to an LLVM IR intrinsic with one +// overloaded result. +class ArmNeon_OverloadedOneResultIntrOp traits = []> + : ArmNeon_IntrOp; -def SMullOp : ArmNeon_Op<"smull", [NoSideEffect, - AllTypesMatch<["a", "b"]>, - TypesMatchWith< - "res has same vector shape and element bitwidth scaled by 2 as a", - "a", "res", "$_self.cast().scaleElementBitwidth(2)">]> { +def SMullOp : ArmNeon_OverloadedOneResultIntrOp<"smull", [ + NoSideEffect, + AllTypesMatch<["a", "b"]>, + TypesMatchWith< + "res has same vector shape and element bitwidth scaled by 2 as a", + "a", "res", "$_self.cast().scaleElementBitwidth(2)"> + ]> { let summary = "smull roundscale op"; let description = [{ Signed Multiply Long (vector). This instruction multiplies corresponding @@ -46,6 +70,7 @@ Source: https://developer.arm.com/architectures/instruction-sets/simd-isas/neon/intrinsics }]; + // Supports either: // (vector<8xi8>, vector<8xi8>) -> (vector<8xi16>) // (vector<4xi16>, vector<4xi16>) -> (vector<4xi32>) @@ -57,4 +82,5 @@ "$a `,` $b attr-dict `:` type($a) `to` type($res)"; } + #endif // ARMNEON_OPS diff --git a/mlir/include/mlir/Dialect/ArmNeon/CMakeLists.txt b/mlir/include/mlir/Dialect/ArmNeon/CMakeLists.txt --- a/mlir/include/mlir/Dialect/ArmNeon/CMakeLists.txt +++ b/mlir/include/mlir/Dialect/ArmNeon/CMakeLists.txt @@ -1,2 +1,6 @@ add_mlir_dialect(ArmNeon arm_neon) add_mlir_doc(ArmNeon -gen-dialect-doc ArmNeon Dialects/) + +set(LLVM_TARGET_DEFINITIONS ArmNeon.td) +mlir_tablegen(ArmNeonConversions.inc -gen-llvmir-conversions) +add_public_tablegen_target(MLIRArmNeonConversionsIncGen) diff --git a/mlir/include/mlir/Dialect/LLVMIR/CMakeLists.txt b/mlir/include/mlir/Dialect/LLVMIR/CMakeLists.txt --- a/mlir/include/mlir/Dialect/LLVMIR/CMakeLists.txt +++ b/mlir/include/mlir/Dialect/LLVMIR/CMakeLists.txt @@ -36,12 +36,6 @@ mlir_tablegen(LLVMAVX512Conversions.inc -gen-llvmir-conversions) add_public_tablegen_target(MLIRLLVMAVX512ConversionsIncGen) -add_mlir_dialect(LLVMArmNeon llvm_arm_neon LLVMArmNeon) -add_mlir_doc(LLVMArmNeon -gen-dialect-doc LLVMArmNeon Dialects/) -set(LLVM_TARGET_DEFINITIONS LLVMArmNeon.td) -mlir_tablegen(LLVMArmNeonConversions.inc -gen-llvmir-conversions) -add_public_tablegen_target(MLIRLLVMArmNeonConversionsIncGen) - add_mlir_dialect(LLVMArmSVE llvm_arm_sve LLVMArmSVE) add_mlir_doc(LLVMArmSVE -gen-dialect-doc LLVMArmSve Dialects/) set(LLVM_TARGET_DEFINITIONS LLVMArmSVE.td) diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMArmNeon.td b/mlir/include/mlir/Dialect/LLVMIR/LLVMArmNeon.td deleted file mode 100644 --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMArmNeon.td +++ /dev/null @@ -1,43 +0,0 @@ -//===-- LLVMArmNeon.td - LLVMArmNeon dialect op definitions *- tablegen -*-===// -// -// 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 the basic operations for the LLVMArmNeon dialect. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVMIR_ARMNEON_OPS -#define LLVMIR_ARMNEON_OPS - -include "mlir/Dialect/LLVMIR/LLVMOpBase.td" - -//===----------------------------------------------------------------------===// -// LLVMArmNeon dialect definition -//===----------------------------------------------------------------------===// - -def LLVMArmNeon_Dialect : Dialect { - let name = "llvm_arm_neon"; - let cppNamespace = "::mlir::LLVM"; -} - -//----------------------------------------------------------------------------// -// MLIR LLVMArmNeon intrinsics using the MLIR LLVM Dialect type system -//----------------------------------------------------------------------------// - -class LLVMArmNeon_IntrBinaryOverloadedOp traits = []> : - LLVM_IntrOpBase overloadedResults=*/[0], - /*list overloadedOperands=*/[], // defined by result overload - /*list traits=*/traits, - /*int numResults=*/1>; - -def LLVM_aarch64_arm_neon_smull : - LLVMArmNeon_IntrBinaryOverloadedOp<"smull">, Arguments<(ins LLVM_Type, LLVM_Type)>; - -#endif // ARMNEON_OPS diff --git a/mlir/include/mlir/Dialect/LLVMIR/LLVMArmNeonDialect.h b/mlir/include/mlir/Dialect/LLVMIR/LLVMArmNeonDialect.h deleted file mode 100644 --- a/mlir/include/mlir/Dialect/LLVMIR/LLVMArmNeonDialect.h +++ /dev/null @@ -1,24 +0,0 @@ -//===- LLVMArmNeonDialect.h - MLIR Dialect for LLVMArmNeon ------*- 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 declares the Target dialect for LLVMArmNeon in MLIR. -// -//===----------------------------------------------------------------------===// - -#ifndef MLIR_DIALECT_LLVMIR_LLVMARMNEONDIALECT_H_ -#define MLIR_DIALECT_LLVMIR_LLVMARMNEONDIALECT_H_ - -#include "mlir/IR/Dialect.h" -#include "mlir/IR/OpDefinition.h" - -#define GET_OP_CLASSES -#include "mlir/Dialect/LLVMIR/LLVMArmNeon.h.inc" - -#include "mlir/Dialect/LLVMIR/LLVMArmNeonDialect.h.inc" - -#endif // MLIR_DIALECT_LLVMIR_LLVMARMNEONDIALECT_H_ diff --git a/mlir/include/mlir/InitAllDialects.h b/mlir/include/mlir/InitAllDialects.h --- a/mlir/include/mlir/InitAllDialects.h +++ b/mlir/include/mlir/InitAllDialects.h @@ -22,7 +22,6 @@ #include "mlir/Dialect/Complex/IR/Complex.h" #include "mlir/Dialect/GPU/GPUDialect.h" #include "mlir/Dialect/LLVMIR/LLVMAVX512Dialect.h" -#include "mlir/Dialect/LLVMIR/LLVMArmNeonDialect.h" #include "mlir/Dialect/LLVMIR/LLVMArmSVEDialect.h" #include "mlir/Dialect/LLVMIR/LLVMDialect.h" #include "mlir/Dialect/LLVMIR/NVVMDialect.h" @@ -58,7 +57,6 @@ gpu::GPUDialect, LLVM::LLVMAVX512Dialect, LLVM::LLVMDialect, - LLVM::LLVMArmNeonDialect, LLVM::LLVMArmSVEDialect, linalg::LinalgDialect, math::MathDialect, diff --git a/mlir/include/mlir/Target/LLVMIR/Dialect/All.h b/mlir/include/mlir/Target/LLVMIR/Dialect/All.h --- a/mlir/include/mlir/Target/LLVMIR/Dialect/All.h +++ b/mlir/include/mlir/Target/LLVMIR/Dialect/All.h @@ -14,8 +14,8 @@ #ifndef MLIR_TARGET_LLVMIR_DIALECT_ALL_H #define MLIR_TARGET_LLVMIR_DIALECT_ALL_H +#include "mlir/Target/LLVMIR/Dialect/ArmNeon/ArmNeonToLLVMIRTranslation.h" #include "mlir/Target/LLVMIR/Dialect/LLVMAVX512/LLVMAVX512ToLLVMIRTranslation.h" -#include "mlir/Target/LLVMIR/Dialect/LLVMArmNeon/LLVMArmNeonToLLVMIRTranslation.h" #include "mlir/Target/LLVMIR/Dialect/LLVMArmSVE/LLVMArmSVEToLLVMIRTranslation.h" #include "mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h" #include "mlir/Target/LLVMIR/Dialect/NVVM/NVVMToLLVMIRTranslation.h" @@ -28,8 +28,8 @@ /// Registers all dialects that can be translated to LLVM IR and the /// corresponding translation interfaces. static inline void registerAllToLLVMIRTranslations(DialectRegistry ®istry) { + registerArmNeonDialectTranslation(registry); registerLLVMAVX512DialectTranslation(registry); - registerLLVMArmNeonDialectTranslation(registry); registerLLVMArmSVEDialectTranslation(registry); registerLLVMDialectTranslation(registry); registerNVVMDialectTranslation(registry); diff --git a/mlir/include/mlir/Target/LLVMIR/Dialect/LLVMArmNeon/LLVMArmNeonToLLVMIRTranslation.h b/mlir/include/mlir/Target/LLVMIR/Dialect/ArmNeon/ArmNeonToLLVMIRTranslation.h rename from mlir/include/mlir/Target/LLVMIR/Dialect/LLVMArmNeon/LLVMArmNeonToLLVMIRTranslation.h rename to mlir/include/mlir/Target/LLVMIR/Dialect/ArmNeon/ArmNeonToLLVMIRTranslation.h --- a/mlir/include/mlir/Target/LLVMIR/Dialect/LLVMArmNeon/LLVMArmNeonToLLVMIRTranslation.h +++ b/mlir/include/mlir/Target/LLVMIR/Dialect/ArmNeon/ArmNeonToLLVMIRTranslation.h @@ -1,4 +1,4 @@ -//===- LLVMArmNeonToLLVMIRTranslation.h - LLVMArmNeon to LLVMIR -*- C++ -*-===// +//===- ArmNeonToLLVMIRTranslation.h - ArmNeon to LLVMIR ---------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,13 +6,12 @@ // //===----------------------------------------------------------------------===// // -// This provides registration calls for LLVMArmNeon dialect to LLVM IR -// translation. +// This provides registration calls for ArmNeon dialect to LLVM IR translation. // //===----------------------------------------------------------------------===// -#ifndef MLIR_TARGET_LLVMIR_DIALECT_LLVMARMNEON_LLVMARMNEONTOLLVMIRTRANSLATION_H -#define MLIR_TARGET_LLVMIR_DIALECT_LLVMARMNEON_LLVMARMNEONTOLLVMIRTRANSLATION_H +#ifndef MLIR_TARGET_LLVMIR_DIALECT_ARMNEON_ARMNEONTOLLVMIRTRANSLATION_H +#define MLIR_TARGET_LLVMIR_DIALECT_ARMNEON_ARMNEONTOLLVMIRTRANSLATION_H namespace mlir { @@ -21,12 +20,12 @@ /// Register the LLVMArmNeon dialect and the translation from it to the LLVM IR /// in the given registry; -void registerLLVMArmNeonDialectTranslation(DialectRegistry ®istry); +void registerArmNeonDialectTranslation(DialectRegistry ®istry); /// Register the LLVMArmNeon dialect and the translation from it in the registry /// associated with the given context. -void registerLLVMArmNeonDialectTranslation(MLIRContext &context); +void registerArmNeonDialectTranslation(MLIRContext &context); } // namespace mlir -#endif // MLIR_TARGET_LLVMIR_DIALECT_LLVMARMNEON_LLVMARMNEONTOLLVMIRTRANSLATION_H +#endif // MLIR_TARGET_LLVMIR_DIALECT_ARMNEON_ARMNEONTOLLVMIRTRANSLATION_H diff --git a/mlir/lib/Conversion/ArmNeonToLLVM/ArmNeonToLLVM.cpp b/mlir/lib/Conversion/ArmNeonToLLVM/ArmNeonToLLVM.cpp deleted file mode 100644 --- a/mlir/lib/Conversion/ArmNeonToLLVM/ArmNeonToLLVM.cpp +++ /dev/null @@ -1,31 +0,0 @@ -//===- ArmNeonToLLVM.cpp - ArmNeon to the LLVM dialect --------------------===// -// -// 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 -// -//===----------------------------------------------------------------------===// - -#include "mlir/Conversion/ArmNeonToLLVM/ArmNeonToLLVM.h" - -#include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVM.h" -#include "mlir/Dialect/ArmNeon/ArmNeonDialect.h" -#include "mlir/Dialect/LLVMIR/LLVMArmNeonDialect.h" -#include "mlir/Dialect/LLVMIR/LLVMDialect.h" -#include "mlir/Dialect/StandardOps/IR/Ops.h" -#include "mlir/Dialect/Vector/VectorOps.h" -#include "mlir/IR/BuiltinOps.h" -#include "mlir/IR/PatternMatch.h" - -using namespace mlir; -using namespace mlir::vector; -using namespace mlir::arm_neon; - -using SMullOpLowering = - OneToOneConvertToLLVMPattern; - -/// Populate the given list with patterns that convert from ArmNeon to LLVM. -void mlir::populateArmNeonToLLVMConversionPatterns( - LLVMTypeConverter &converter, OwningRewritePatternList &patterns) { - patterns.insert(converter); -} diff --git a/mlir/lib/Conversion/ArmNeonToLLVM/CMakeLists.txt b/mlir/lib/Conversion/ArmNeonToLLVM/CMakeLists.txt deleted file mode 100644 --- a/mlir/lib/Conversion/ArmNeonToLLVM/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -add_mlir_conversion_library(MLIRArmNeonToLLVM - ArmNeonToLLVM.cpp - - ADDITIONAL_HEADER_DIRS - ${MLIR_MAIN_INCLUDE_DIR}/mlir/Conversion/ArmNeonToLLVM - - DEPENDS - MLIRConversionPassIncGen - - LINK_COMPONENTS - Core - - LINK_LIBS PUBLIC - MLIRArmNeon - MLIRLLVMArmNeon - MLIRLLVMIR - MLIRStandardToLLVM - MLIRTransforms - ) diff --git a/mlir/lib/Conversion/CMakeLists.txt b/mlir/lib/Conversion/CMakeLists.txt --- a/mlir/lib/Conversion/CMakeLists.txt +++ b/mlir/lib/Conversion/CMakeLists.txt @@ -1,5 +1,4 @@ add_subdirectory(AffineToStandard) -add_subdirectory(ArmNeonToLLVM) add_subdirectory(AsyncToLLVM) add_subdirectory(AVX512ToLLVM) add_subdirectory(ComplexToLLVM) diff --git a/mlir/lib/Conversion/PassDetail.h b/mlir/lib/Conversion/PassDetail.h --- a/mlir/lib/Conversion/PassDetail.h +++ b/mlir/lib/Conversion/PassDetail.h @@ -29,7 +29,6 @@ } // end namespace gpu namespace LLVM { -class LLVMArmNeonDialect; class LLVMArmSVEDialect; class LLVMAVX512Dialect; class LLVMDialect; diff --git a/mlir/lib/Conversion/VectorToLLVM/CMakeLists.txt b/mlir/lib/Conversion/VectorToLLVM/CMakeLists.txt --- a/mlir/lib/Conversion/VectorToLLVM/CMakeLists.txt +++ b/mlir/lib/Conversion/VectorToLLVM/CMakeLists.txt @@ -14,10 +14,8 @@ LINK_LIBS PUBLIC MLIRArmNeon - MLIRArmNeonToLLVM MLIRAVX512 MLIRAVX512ToLLVM - MLIRLLVMArmNeon MLIRLLVMAVX512 MLIRArmSVE MLIRArmSVEToLLVM diff --git a/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVMPass.cpp b/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVMPass.cpp --- a/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVMPass.cpp +++ b/mlir/lib/Conversion/VectorToLLVM/ConvertVectorToLLVMPass.cpp @@ -11,7 +11,6 @@ #include "../PassDetail.h" #include "mlir/Conversion/AVX512ToLLVM/ConvertAVX512ToLLVM.h" -#include "mlir/Conversion/ArmNeonToLLVM/ArmNeonToLLVM.h" #include "mlir/Conversion/ArmSVEToLLVM/ArmSVEToLLVM.h" #include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVM.h" #include "mlir/Conversion/StandardToLLVM/ConvertStandardToLLVMPass.h" @@ -19,7 +18,6 @@ #include "mlir/Dialect/ArmNeon/ArmNeonDialect.h" #include "mlir/Dialect/ArmSVE/ArmSVEDialect.h" #include "mlir/Dialect/LLVMIR/LLVMAVX512Dialect.h" -#include "mlir/Dialect/LLVMIR/LLVMArmNeonDialect.h" #include "mlir/Dialect/LLVMIR/LLVMArmSVEDialect.h" #include "mlir/Dialect/LLVMIR/LLVMDialect.h" #include "mlir/Dialect/StandardOps/IR/Ops.h" @@ -43,7 +41,7 @@ void getDependentDialects(DialectRegistry ®istry) const override { registry.insert(); if (enableArmNeon) - registry.insert(); + registry.insert(); if (enableArmSVE) registry.insert(); if (enableAVX512) @@ -78,9 +76,10 @@ target.addLegalDialect(); target.addLegalOp(); if (enableArmNeon) { - target.addLegalDialect(); - target.addIllegalDialect(); - populateArmNeonToLLVMConversionPatterns(converter, patterns); + // TODO: we may or may not want to include in-dialect lowering to + // LLVM-compatible operations here. So far, all operations in the dialect + // can be translated to LLVM IR so there is no conversion necessary. + target.addLegalDialect(); } if (enableArmSVE) { target.addLegalDialect(); diff --git a/mlir/lib/Dialect/LLVMIR/CMakeLists.txt b/mlir/lib/Dialect/LLVMIR/CMakeLists.txt --- a/mlir/lib/Dialect/LLVMIR/CMakeLists.txt +++ b/mlir/lib/Dialect/LLVMIR/CMakeLists.txt @@ -50,27 +50,6 @@ MLIRSideEffectInterfaces ) -add_mlir_dialect_library(MLIRLLVMArmNeon - IR/LLVMArmNeonDialect.cpp - - ADDITIONAL_HEADER_DIRS - ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/LLVMIR - - DEPENDS - MLIRLLVMArmNeonIncGen - MLIRLLVMArmNeonConversionsIncGen - intrinsics_gen - - LINK_COMPONENTS - AsmParser - Core - - LINK_LIBS PUBLIC - MLIRIR - MLIRLLVMIR - MLIRSideEffectInterfaces - ) - add_mlir_dialect_library(MLIRLLVMArmSVE IR/LLVMArmSVEDialect.cpp diff --git a/mlir/lib/Dialect/LLVMIR/IR/LLVMArmNeonDialect.cpp b/mlir/lib/Dialect/LLVMIR/IR/LLVMArmNeonDialect.cpp deleted file mode 100644 --- a/mlir/lib/Dialect/LLVMIR/IR/LLVMArmNeonDialect.cpp +++ /dev/null @@ -1,31 +0,0 @@ -//===- LLVMArmNeonDialect.cpp - MLIR LLVMArmNeon ops implementation -------===// -// -// 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 implements the LLVMArmNeon dialect and its operations. -// -//===----------------------------------------------------------------------===// - -#include "llvm/IR/IntrinsicsAArch64.h" - -#include "mlir/Dialect/LLVMIR/LLVMArmNeonDialect.h" -#include "mlir/Dialect/LLVMIR/LLVMDialect.h" -#include "mlir/IR/Builders.h" -#include "mlir/IR/OpImplementation.h" -#include "mlir/IR/TypeUtilities.h" - -using namespace mlir; - -void LLVM::LLVMArmNeonDialect::initialize() { - addOperations< -#define GET_OP_LIST -#include "mlir/Dialect/LLVMIR/LLVMArmNeon.cpp.inc" - >(); -} - -#define GET_OP_CLASSES -#include "mlir/Dialect/LLVMIR/LLVMArmNeon.cpp.inc" diff --git a/mlir/lib/Target/LLVMIR/CMakeLists.txt b/mlir/lib/Target/LLVMIR/CMakeLists.txt --- a/mlir/lib/Target/LLVMIR/CMakeLists.txt +++ b/mlir/lib/Target/LLVMIR/CMakeLists.txt @@ -36,7 +36,7 @@ ConvertToLLVMIR.cpp LINK_LIBS PUBLIC - MLIRLLVMArmNeonToLLVMIRTranslation + MLIRArmNeonToLLVMIRTranslation MLIRLLVMArmSVEToLLVMIRTranslation MLIRLLVMAVX512ToLLVMIRTranslation MLIRLLVMToLLVMIRTranslation diff --git a/mlir/lib/Target/LLVMIR/Dialect/LLVMArmNeon/LLVMArmNeonToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/ArmNeon/ArmNeonToLLVMIRTranslation.cpp rename from mlir/lib/Target/LLVMIR/Dialect/LLVMArmNeon/LLVMArmNeonToLLVMIRTranslation.cpp rename to mlir/lib/Target/LLVMIR/Dialect/ArmNeon/ArmNeonToLLVMIRTranslation.cpp --- a/mlir/lib/Target/LLVMIR/Dialect/LLVMArmNeon/LLVMArmNeonToLLVMIRTranslation.cpp +++ b/mlir/lib/Target/LLVMIR/Dialect/ArmNeon/ArmNeonToLLVMIRTranslation.cpp @@ -1,4 +1,4 @@ -//===- LLVMArmNeonToLLVMIRTranslation.cpp - LLVMArmNeon to LLVM IR --------===// +//===- ArmNeonToLLVMIRTranslation.cpp - Translate ArmNeon to LLVM IR ------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,13 +6,13 @@ // //===----------------------------------------------------------------------===// // -// This file implements a translation between the MLIR LLVMArmNeon dialect and +// This file implements a translation between the MLIR ArmNeon dialect and // LLVM IR. // //===----------------------------------------------------------------------===// -#include "mlir/Target/LLVMIR/Dialect/LLVMArmNeon/LLVMArmNeonToLLVMIRTranslation.h" -#include "mlir/Dialect/LLVMIR/LLVMArmNeonDialect.h" +#include "mlir/Target/LLVMIR/Dialect/ArmNeon/ArmNeonToLLVMIRTranslation.h" +#include "mlir/Dialect/ArmNeon/ArmNeonDialect.h" #include "mlir/IR/Operation.h" #include "mlir/Target/LLVMIR/ModuleTranslation.h" @@ -25,7 +25,7 @@ namespace { /// Implementation of the dialect interface that converts operations belonging /// to the LLVMArmNeon dialect to LLVM IR. -class LLVMArmNeonDialectLLVMIRTranslationInterface +class ArmNeonDialectLLVMIRTranslationInterface : public LLVMTranslationDialectInterface { public: using LLVMTranslationDialectInterface::LLVMTranslationDialectInterface; @@ -36,21 +36,21 @@ convertOperation(Operation *op, llvm::IRBuilderBase &builder, LLVM::ModuleTranslation &moduleTranslation) const final { Operation &opInst = *op; -#include "mlir/Dialect/LLVMIR/LLVMArmNeonConversions.inc" +#include "mlir/Dialect/ArmNeon/ArmNeonConversions.inc" return failure(); } }; } // end namespace -void mlir::registerLLVMArmNeonDialectTranslation(DialectRegistry ®istry) { - registry.insert(); - registry.addDialectInterface(); +void mlir::registerArmNeonDialectTranslation(DialectRegistry ®istry) { + registry.insert(); + registry.addDialectInterface(); } -void mlir::registerLLVMArmNeonDialectTranslation(MLIRContext &context) { +void mlir::registerArmNeonDialectTranslation(MLIRContext &context) { DialectRegistry registry; - registerLLVMArmNeonDialectTranslation(registry); + registerArmNeonDialectTranslation(registry); context.appendDialectRegistry(registry); } diff --git a/mlir/lib/Target/LLVMIR/Dialect/ArmNeon/CMakeLists.txt b/mlir/lib/Target/LLVMIR/Dialect/ArmNeon/CMakeLists.txt new file mode 100644 --- /dev/null +++ b/mlir/lib/Target/LLVMIR/Dialect/ArmNeon/CMakeLists.txt @@ -0,0 +1,16 @@ +add_mlir_translation_library(MLIRArmNeonToLLVMIRTranslation + ArmNeonToLLVMIRTranslation.cpp + + DEPENDS + MLIRArmNeonConversionsIncGen + + LINK_COMPONENTS + Core + + LINK_LIBS PUBLIC + MLIRArmNeon + MLIRIR + MLIRLLVMIR + MLIRSupport + MLIRTargetLLVMIRExport + ) diff --git a/mlir/lib/Target/LLVMIR/Dialect/CMakeLists.txt b/mlir/lib/Target/LLVMIR/Dialect/CMakeLists.txt --- a/mlir/lib/Target/LLVMIR/Dialect/CMakeLists.txt +++ b/mlir/lib/Target/LLVMIR/Dialect/CMakeLists.txt @@ -1,4 +1,4 @@ -add_subdirectory(LLVMArmNeon) +add_subdirectory(ArmNeon) add_subdirectory(LLVMArmSVE) add_subdirectory(LLVMAVX512) add_subdirectory(LLVMIR) diff --git a/mlir/lib/Target/LLVMIR/Dialect/LLVMArmNeon/CMakeLists.txt b/mlir/lib/Target/LLVMIR/Dialect/LLVMArmNeon/CMakeLists.txt deleted file mode 100644 --- a/mlir/lib/Target/LLVMIR/Dialect/LLVMArmNeon/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -add_mlir_translation_library(MLIRLLVMArmNeonToLLVMIRTranslation - LLVMArmNeonToLLVMIRTranslation.cpp - - DEPENDS - MLIRLLVMArmNeonConversionsIncGen - - LINK_COMPONENTS - Core - - LINK_LIBS PUBLIC - MLIRIR - MLIRLLVMArmNeon - MLIRLLVMIR - MLIRSupport - MLIRTargetLLVMIRExport - ) diff --git a/mlir/test/Conversion/ArmNeonToLLVM/convert-to-llvm.mlir b/mlir/test/Conversion/ArmNeonToLLVM/convert-to-llvm.mlir deleted file mode 100644 --- a/mlir/test/Conversion/ArmNeonToLLVM/convert-to-llvm.mlir +++ /dev/null @@ -1,20 +0,0 @@ -// RUN: mlir-opt %s -convert-vector-to-llvm="enable-arm-neon" | mlir-opt | FileCheck %s - -// CHECK-LABEL: arm_neon_smull -func @arm_neon_smull(%a: vector<8xi8>, %b: vector<8xi8>) - -> (vector<8xi16>, vector<4xi32>, vector<2xi64>) { - // CHECK: arm_neon.smull{{.*}}: (vector<8xi8>, vector<8xi8>) -> vector<8xi16> - %0 = arm_neon.smull %a, %b : vector<8xi8> to vector<8xi16> - %00 = vector.extract_strided_slice %0 {offsets = [3], sizes = [4], strides = [1]}: - vector<8xi16> to vector<4xi16> - - // CHECK: arm_neon.smull{{.*}}: (vector<4xi16>, vector<4xi16>) -> vector<4xi32> - %1 = arm_neon.smull %00, %00 : vector<4xi16> to vector<4xi32> - %11 = vector.extract_strided_slice %1 {offsets = [1], sizes = [2], strides = [1]}: - vector<4xi32> to vector<2xi32> - - // CHECK: arm_neon.smull{{.*}}: (vector<2xi32>, vector<2xi32>) -> vector<2xi64> - %2 = arm_neon.smull %11, %11 : vector<2xi32> to vector<2xi64> - - return %0, %1, %2 : vector<8xi16>, vector<4xi32>, vector<2xi64> -} diff --git a/mlir/test/Target/arm-neon.mlir b/mlir/test/Target/arm-neon.mlir --- a/mlir/test/Target/arm-neon.mlir +++ b/mlir/test/Target/arm-neon.mlir @@ -4,16 +4,16 @@ llvm.func @arm_neon_smull(%arg0: vector<8xi8>, %arg1: vector<8xi8>) -> !llvm.struct<(vector<8xi16>, vector<4xi32>, vector<2xi64>)> { // CHECK: %[[V0:.*]] = call <8 x i16> @llvm.aarch64.neon.smull.v8i16(<8 x i8> %{{.*}}, <8 x i8> %{{.*}}) // CHECK-NEXT: %[[V00:.*]] = shufflevector <8 x i16> %3, <8 x i16> %[[V0]], <4 x i32> - %0 = "llvm_arm_neon.smull"(%arg0, %arg1) : (vector<8xi8>, vector<8xi8>) -> vector<8xi16> + %0 = arm_neon.smull %arg0, %arg1 : vector<8xi8> to vector<8xi16> %1 = llvm.shufflevector %0, %0 [3, 4, 5, 6] : vector<8xi16>, vector<8xi16> // CHECK-NEXT: %[[V1:.*]] = call <4 x i32> @llvm.aarch64.neon.smull.v4i32(<4 x i16> %[[V00]], <4 x i16> %[[V00]]) // CHECK-NEXT: %[[V11:.*]] = shufflevector <4 x i32> %[[V1]], <4 x i32> %[[V1]], <2 x i32> - %2 = "llvm_arm_neon.smull"(%1, %1) : (vector<4xi16>, vector<4xi16>) -> vector<4xi32> + %2 = arm_neon.smull %1, %1 : vector<4xi16> to vector<4xi32> %3 = llvm.shufflevector %2, %2 [1, 2] : vector<4xi32>, vector<4xi32> // CHECK-NEXT: %[[V1:.*]] = call <2 x i64> @llvm.aarch64.neon.smull.v2i64(<2 x i32> %[[V11]], <2 x i32> %[[V11]]) - %4 = "llvm_arm_neon.smull"(%3, %3) : (vector<2xi32>, vector<2xi32>) -> vector<2xi64> + %4 = arm_neon.smull %3, %3 : vector<2xi32> to vector<2xi64> %5 = llvm.mlir.undef : !llvm.struct<(vector<8xi16>, vector<4xi32>, vector<2xi64>)> %6 = llvm.insertvalue %0, %5[0] : !llvm.struct<(vector<8xi16>, vector<4xi32>, vector<2xi64>)> diff --git a/mlir/test/mlir-opt/commandline.mlir b/mlir/test/mlir-opt/commandline.mlir --- a/mlir/test/mlir-opt/commandline.mlir +++ b/mlir/test/mlir-opt/commandline.mlir @@ -10,7 +10,6 @@ // CHECK-NEXT: gpu // CHECK-NEXT: linalg // CHECK-NEXT: llvm -// CHECK-NEXT: llvm_arm_neon // CHECK-NEXT: llvm_arm_sve // CHECK-NEXT: llvm_avx512 // CHECK-NEXT: math