llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-mlir @llvm/pr-subscribers-mlir-llvm Author: Erich Keane (erichkeane) <details> <summary>Changes</summary> This patch adds the 'no-builtins' and 'no-builtin-XXX' attributes from LLVM-IR to both LLVMIR-MLIR and Clang lowering. However, I've done a slightly different implementation of them. LLVM-IR represents them as 'no-builtins' and 'no-builtin-NAME', where the latter can be multiple names. This is problematic for the MLIR for a variety of reasons, most particularly is our preference for explicit attribute (of which the latter is an infinite list). Additionally of course, our inability to have dashes in attribute names is troublesome. Therefore, I've lowered them instead as `nobuiltins` for both, which is an array attribute. IF the array attribute is empty, it is intended to mean 'all functions' (ie, the same as `no-builtins`), else it is a list of StringAttrs that contain the variants of `NAME`. I considered using nobuiltins=['*'] for the 'all functions', but that seemed like a differentiation without purpose. --- Patch is 43.61 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/178899.diff 18 Files Affected: - (modified) clang/include/clang/CIR/Dialect/IR/CIRDialect.td (+1) - (modified) clang/lib/CIR/CodeGen/CIRGenCall.cpp (+50-2) - (added) clang/test/CIR/CodeGen/no-builtin-attr.cpp (+204) - (modified) clang/test/CIR/CodeGenBuiltins/X86/avx512-reduceIntrin.c (+4-4) - (modified) clang/test/CIR/CodeGenBuiltins/X86/avx512-reduceMinMaxIntrin.c (+4-4) - (modified) clang/test/CIR/CodeGenBuiltins/X86/avx512fp16-builtins.c (+4-4) - (modified) clang/test/CIR/CodeGenBuiltins/X86/avx512vlbf16-builtins.c (+6-6) - (modified) clang/test/CIR/CodeGenBuiltins/X86/avx512vlfp16-builtins.c (+8-8) - (modified) mlir/include/mlir/Dialect/LLVMIR/LLVMOps.td (+2) - (modified) mlir/lib/Dialect/LLVMIR/IR/LLVMDialect.cpp (+4-4) - (modified) mlir/lib/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.cpp (+14) - (modified) mlir/lib/Target/LLVMIR/ModuleImport.cpp (+59-7) - (modified) mlir/lib/Target/LLVMIR/ModuleTranslation.cpp (+13) - (modified) mlir/test/Dialect/LLVMIR/func.mlir (+12) - (modified) mlir/test/Dialect/LLVMIR/roundtrip.mlir (+6) - (modified) mlir/test/Target/LLVMIR/Import/function-attributes.ll (+12) - (modified) mlir/test/Target/LLVMIR/Import/instructions.ll (+24) - (modified) mlir/test/Target/LLVMIR/llvmir.mlir (+23) ``````````diff diff --git a/clang/include/clang/CIR/Dialect/IR/CIRDialect.td b/clang/include/clang/CIR/Dialect/IR/CIRDialect.td index 079b4cd87d019..bbd9831e73a50 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIRDialect.td +++ b/clang/include/clang/CIR/Dialect/IR/CIRDialect.td @@ -60,6 +60,7 @@ def CIR_Dialect : Dialect { // of a [a-zA-Z0-9_] character regex(numbers only if not first), so there is // no way to get an underscore into this, even with escaping. static llvm::StringRef getModularFormatAttrName() { return "modular_format"; } + static llvm::StringRef getNoBuiltinsAttrName() { return "nobuiltins"; } void registerAttributes(); void registerTypes(); diff --git a/clang/lib/CIR/CodeGen/CIRGenCall.cpp b/clang/lib/CIR/CodeGen/CIRGenCall.cpp index 809d775e77d55..46118300d5a9e 100644 --- a/clang/lib/CIR/CodeGen/CIRGenCall.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenCall.cpp @@ -111,6 +111,45 @@ static void addAttributesFromFunctionProtoType(CIRGenBuilderTy &builder, mlir::UnitAttr::get(builder.getContext())); } +static void addNoBuiltinAttributes(mlir::MLIRContext &ctx, + mlir::NamedAttrList &attrs, + const LangOptions &langOpts, + const NoBuiltinAttr *nba = nullptr) { + // First, handle the language options passed through -fno-builtin. + // or, if there is a wildcard in the builtin names specified through the + // attribute, disable them all. + if (langOpts.NoBuiltin || + (nba && llvm::is_contained(nba->builtinNames(), "*"))) { + // -fno-builtin disables them all. + // Empty attribute means 'all'. + attrs.set(cir::CIRDialect::getNoBuiltinsAttrName(), + mlir::ArrayAttr::get(&ctx, {})); + return; + } + + llvm::SmallVector<mlir::Attribute> nbFuncs; + auto addNoBuiltinAttr = [&ctx, &nbFuncs](StringRef builtinName) { + auto attrMatches = [=](mlir::Attribute a) { + return mlir::cast<mlir::StringAttr>(a).getValue() == builtinName; + }; + if (nbFuncs.end() == llvm::find_if(nbFuncs, attrMatches)) + nbFuncs.push_back(mlir::StringAttr::get(&ctx, builtinName)); + }; + + // Then, add attributes for builtins specified through -fno-builtin-<name>. + llvm::for_each(langOpts.NoBuiltinFuncs, addNoBuiltinAttr); + + if (nba) { + // Now, let's check the __attribute__((no_builtin("...")) attribute added to + // the source. + llvm::for_each(nba->builtinNames(), addNoBuiltinAttr); + } + + if (!nbFuncs.empty()) + attrs.set(cir::CIRDialect::getNoBuiltinsAttrName(), + mlir::ArrayAttr::get(&ctx, nbFuncs)); +} + /// Construct the CIR attribute list of a function or call. void CIRGenModule::constructAttributeList(llvm::StringRef name, const CIRGenFunctionInfo &info, @@ -137,6 +176,13 @@ void CIRGenModule::constructAttributeList(llvm::StringRef name, const Decl *targetDecl = calleeInfo.getCalleeDecl().getDecl(); + // TODO(cir): OMP Assume Attributes should be here. + + const NoBuiltinAttr *nba = nullptr; + + // TODO(cir): Some work for arg memory effects can be done here, as it is in + // classic codegen. + if (targetDecl) { if (targetDecl->hasAttr<NoThrowAttr>()) addUnitAttr(cir::CIRDialect::getNoThrowAttrName()); @@ -173,7 +219,7 @@ void CIRGenModule::constructAttributeList(llvm::StringRef name, if (!(attrOnCallSite && isVirtualCall)) { if (func->isNoReturn()) addUnitAttr(cir::CIRDialect::getNoReturnAttrName()); - // TODO(cir): Set NoBuiltinAttr here. + nba = func->getAttr<NoBuiltinAttr>(); } } @@ -230,7 +276,9 @@ void CIRGenModule::constructAttributeList(llvm::StringRef name, builder.getStringAttr(llvm::join(args, ","))); } - // TODO(cir): We should set nobuiltin and default function attrs here. + addNoBuiltinAttributes(getMLIRContext(), attrs, getLangOpts(), nba); + + // TODO(cir): We should set default function attrs here. // TODO(cir): There is another region of `if (targetDecl)` that handles // removing some attributes that are necessary modifications of the diff --git a/clang/test/CIR/CodeGen/no-builtin-attr.cpp b/clang/test/CIR/CodeGen/no-builtin-attr.cpp new file mode 100644 index 0000000000000..6abdb8835d5dd --- /dev/null +++ b/clang/test/CIR/CodeGen/no-builtin-attr.cpp @@ -0,0 +1,204 @@ +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir +// RUN: FileCheck --input-file=%t.cir %s -check-prefixes=CIR,CIR-DEF +// +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t.ll +// RUN: FileCheck --input-file=%t.ll %s -check-prefixes=LLVM,LLVM-DEF +// +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o %t.ll +// RUN: FileCheck --input-file=%t.ll %s -check-prefixes=LLVM,LLVM-DEF +// +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir -fno-builtin-memcmp %s -o %t.cir +// RUN: FileCheck --input-file=%t.cir %s -check-prefixes=CIR,CIR-SPC +// +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm -fno-builtin-memcmp %s -o %t.ll +// RUN: FileCheck --input-file=%t.ll %s -check-prefixes=LLVM,LLVM-SPC +// +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fno-builtin-memcmp %s -o %t.ll +// RUN: FileCheck --input-file=%t.ll %s -check-prefixes=LLVM,LLVM-SPC +// +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir -fno-builtin-memcmp -fno-builtin-memset %s -o %t.cir +// RUN: FileCheck --input-file=%t.cir %s -check-prefixes=CIR,CIR-BTH +// +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm -fno-builtin-memcmp -fno-builtin-memset %s -o %t.ll +// RUN: FileCheck --input-file=%t.ll %s -check-prefixes=LLVM,LLVM-BTH +// +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fno-builtin-memcmp -fno-builtin-memset %s -o %t.ll +// RUN: FileCheck --input-file=%t.ll %s -check-prefixes=LLVM,LLVM-BTH +// +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir -fno-builtin %s -o %t.cir +// RUN: FileCheck --input-file=%t.cir %s -check-prefixes=CIR,CIR-ALL +// +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm -fno-builtin %s -o %t.ll +// RUN: FileCheck --input-file=%t.ll %s -check-prefixes=LLVM,LLVM-ALL +// +// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -fno-builtin %s -o %t.ll +// RUN: FileCheck --input-file=%t.ll %s -check-prefixes=LLVM,LLVM-ALL + +extern "C" { +// CIR: cir.func{{.*}}@normal() attributes { +// CIR-DEF-NOT: nobuiltins +// CIR-SPC-SAME: nobuiltins = ["memcmp"] +// CIR-BTH-SAME: nobuiltins = ["memcmp", "memset"] +// CIR-ALL-SAME: nobuiltins = [] +// LLVM: define{{.*}}normal() #[[NORM_ATTR:.*]] { +__attribute__((cold)) // to force attributes on the call to be around. +void normal(){} + +// CIR: cir.func{{.*}}@no_builtins() attributes { +// CIR-DEF-SAME: nobuiltins = [] +// CIR-SPC-SAME: nobuiltins = [] +// CIR-BTH-SAME: nobuiltins = [] +// CIR-ALL-SAME: nobuiltins = [] +// LLVM: define{{.*}}no_builtins() #[[NB_ATTR:.*]] { +__attribute__((no_builtin)) +__attribute__((hot)) // force unique attributes +void no_builtins() {} + +// CIR: cir.func{{.*}}@no_memcpy() attributes { +// CIR-DEF-SAME: nobuiltins = ["memcpy"] +// CIR-SPC-SAME: nobuiltins = ["memcmp", "memcpy"] +// CIR-BTH-SAME: nobuiltins = ["memcmp", "memset", "memcpy"] +// CIR-ALL-SAME: nobuiltins = [] +// LLVM: define{{.*}}no_memcpy() #[[NO_MCPY_ATTR:.*]] { +__attribute__((no_builtin("memcpy"))) +__attribute__((leaf)) // force unique attributes +void no_memcpy() {} + +// CIR: cir.func{{.*}}@no_memcmp() attributes { +// CIR-DEF-SAME: nobuiltins = ["memcmp"] +// CIR-SPC-SAME: nobuiltins = ["memcmp"] +// CIR-BTH-SAME: nobuiltins = ["memcmp", "memset"] +// CIR-ALL-SAME: nobuiltins = [] +// LLVM: define{{.*}}no_memcmp() #[[NO_MCMP_ATTR:.*]] { +__attribute__((no_builtin("memcmp"))) +__attribute__((noduplicate)) // force unique attributes +void no_memcmp() {} + +// CIR: cir.func{{.*}}@no_both() attributes { +// CIR-DEF-SAME: nobuiltins = ["memcmp", "memcpy"] +// CIR-SPC-SAME: nobuiltins = ["memcmp", "memcpy"] +// CIR-BTH-SAME: nobuiltins = ["memcmp", "memset", "memcpy"] +// CIR-ALL-SAME: nobuiltins = [] +// LLVM: define{{.*}}no_both() #[[NO_BOTH_ATTR:.*]] { +__attribute__((no_builtin("memcpy"))) +__attribute__((no_builtin("memcmp"))) +__attribute__((convergent)) // force unique attributes +void no_both(){} +} + +void caller() { + // CIR: cir.call @normal() { + // CIR-DEF-NOT: nobuiltins + // CIR-SPC-SAME: nobuiltins = ["memcmp"] + // CIR-BTH-SAME: nobuiltins = ["memcmp", "memset"] + // CIR-ALL-SAME: nobuiltins = [] + // LLVM: call void @normal() #[[NORM_CALL_ATTR:.*]] + normal(); + // CIR: cir.call @no_builtins() { + // CIR-DEF-SAME: nobuiltins = [] + // CIR-SPC-SAME: nobuiltins = [] + // CIR-BTH-SAME: nobuiltins = [] + // CIR-ALL-SAME: nobuiltins = [] + // LLVM: call void @no_builtins() #[[NB_CALL_ATTR:.*]] + no_builtins(); + // CIR: cir.call @no_memcpy() { + // CIR-DEF-SAME: nobuiltins = ["memcpy"] + // CIR-SPC-SAME: nobuiltins = ["memcmp", "memcpy"] + // CIR-BTH-SAME: nobuiltins = ["memcmp", "memset", "memcpy"] + // CIR-ALL-SAME: nobuiltins = [] + // LLVM: call void @no_memcpy() #[[NO_MCPY_CALL_ATTR:.*]] + no_memcpy(); + // CIR: cir.call @no_memcmp() { + // CIR-DEF-SAME: nobuiltins = ["memcmp"] + // CIR-SPC-SAME: nobuiltins = ["memcmp"] + // CIR-BTH-SAME: nobuiltins = ["memcmp", "memset"] + // CIR-ALL-SAME: nobuiltins = [] + // LLVM: call void @no_memcmp() #[[NO_MCMP_CALL_ATTR:.*]] + no_memcmp(); + // CIR: cir.call @no_both() { + // CIR-DEF-SAME: nobuiltins = ["memcmp", "memcpy"] + // CIR-SPC-SAME: nobuiltins = ["memcmp", "memcpy"] + // CIR-BTH-SAME: nobuiltins = ["memcmp", "memset", "memcpy"] + // CIR-ALL-SAME: nobuiltins = [] + // LLVM: call void @no_both() #[[NO_BOTH_CALL_ATTR:.*]] + no_both(); +} + +// LLVM: attributes #[[NORM_ATTR]] = { +// LLVM-DEF-NOT: no-builtin +// LLVM-SPC-SAME: "no-builtin-memcmp" +// LLVM-BTH-SAME: "no-builtin-memcmp" +// LLVM-BTH-SAME: "no-builtin-memset" +// LLVM-ALL-SAME:"no-builtins" +// +// LLVM: attributes #[[NB_ATTR]] = { +// LLVM-DEF-SAME:"no-builtins" +// LLVM-SPC-SAME:"no-builtins" +// LLVM-BTH-SAME:"no-builtins" +// LLVM-ALL-SAME:"no-builtins" +// +// LLVM: attributes #[[NO_MCPY_ATTR]] = { +// LLVM-DEF-SAME: "no-builtin-memcpy" +// LLVM-SPC-SAME: "no-builtin-memcmp" +// LLVM-SPC-SAME: "no-builtin-memcpy" +// LLVM-BTH-SAME: "no-builtin-memcmp" +// LLVM-BTH-SAME: "no-builtin-memcpy" +// LLVM-BTH-SAME: "no-builtin-memset" +// LLVM-ALL-SAME:"no-builtins" +// +// LLVM: attributes #[[NO_MCMP_ATTR]] = { +// LLVM-DEF-SAME: "no-builtin-memcmp" +// LLVM-SPC-SAME: "no-builtin-memcmp" +// LLVM-BTH-SAME: "no-builtin-memcmp" +// LLVM-BTH-SAME: "no-builtin-memset" +// LLVM-ALL-SAME:"no-builtins" +// +// LLVM: attributes #[[NO_BOTH_ATTR]] = { +// LLVM-DEF-SAME: "no-builtin-memcmp" +// LLVM-DEF-SAME: "no-builtin-memcpy" +// LLVM-SPC-SAME: "no-builtin-memcmp" +// LLVM-SPC-SAME: "no-builtin-memcpy" +// LLVM-BTH-SAME: "no-builtin-memcmp" +// LLVM-BTH-SAME: "no-builtin-memcpy" +// LLVM-BTH-SAME: "no-builtin-memset" +// LLVM-ALL-SAME:"no-builtins" +// +// +// LLVM: attributes #[[NORM_CALL_ATTR]] = { +// LLVM-DEF-NOT: no-builtin +// LLVM-SPC-SAME: "no-builtin-memcmp" +// LLVM-BTH-SAME: "no-builtin-memcmp" +// LLVM-BTH-SAME: "no-builtin-memset" +// LLVM-ALL-SAME:"no-builtins" +// +// LLVM: attributes #[[NB_CALL_ATTR]] = { +// LLVM-DEF-SAME:"no-builtins" +// LLVM-SPC-SAME:"no-builtins" +// LLVM-BTH-SAME:"no-builtins" +// LLVM-ALL-SAME:"no-builtins" +// +// LLVM: attributes #[[NO_MCPY_CALL_ATTR]] = { +// LLVM-DEF-SAME: "no-builtin-memcpy" +// LLVM-SPC-SAME: "no-builtin-memcmp" +// LLVM-SPC-SAME: "no-builtin-memcpy" +// LLVM-BTH-SAME: "no-builtin-memcmp" +// LLVM-BTH-SAME: "no-builtin-memcpy" +// LLVM-BTH-SAME: "no-builtin-memset" +// LLVM-ALL-SAME:"no-builtins" +// +// LLVM: attributes #[[NO_MCMP_CALL_ATTR]] = { +// LLVM-DEF-SAME: "no-builtin-memcmp" +// LLVM-SPC-SAME: "no-builtin-memcmp" +// LLVM-BTH-SAME: "no-builtin-memcmp" +// LLVM-BTH-SAME: "no-builtin-memset" +// LLVM-ALL-SAME:"no-builtins" +// +// LLVM: attributes #[[NO_BOTH_CALL_ATTR]] = { +// LLVM-DEF-SAME: "no-builtin-memcmp" +// LLVM-DEF-SAME: "no-builtin-memcpy" +// LLVM-SPC-SAME: "no-builtin-memcmp" +// LLVM-SPC-SAME: "no-builtin-memcpy" +// LLVM-BTH-SAME: "no-builtin-memcmp" +// LLVM-BTH-SAME: "no-builtin-memcpy" +// LLVM-BTH-SAME: "no-builtin-memset" +// LLVM-ALL-SAME:"no-builtins" diff --git a/clang/test/CIR/CodeGenBuiltins/X86/avx512-reduceIntrin.c b/clang/test/CIR/CodeGenBuiltins/X86/avx512-reduceIntrin.c index bc4249ffd25fc..e10c7cbd104c4 100644 --- a/clang/test/CIR/CodeGenBuiltins/X86/avx512-reduceIntrin.c +++ b/clang/test/CIR/CodeGenBuiltins/X86/avx512-reduceIntrin.c @@ -10,7 +10,7 @@ double test_mm512_reduce_add_pd(__m512d __W, double ExtraAddOp){ // CIR: cir.call_llvm_intrinsic "vector.reduce.fadd" %[[R:.*]], %[[V:.*]] : (!cir.double, !cir.vector<8 x !cir.double>) -> !cir.double // CIR-LABEL: test_mm512_reduce_add_pd - // CIR: cir.call @_mm512_reduce_add_pd(%[[VEC:.*]]) : (!cir.vector<8 x !cir.double>) -> !cir.double + // CIR: cir.call @_mm512_reduce_add_pd(%[[VEC:.*]]) {nobuiltins = []} : (!cir.vector<8 x !cir.double>) -> !cir.double // LLVM-LABEL: test_mm512_reduce_add_pd // LLVM: call double @llvm.vector.reduce.fadd.v8f64(double -0.000000e+00, <8 x double> %{{.*}}) @@ -27,7 +27,7 @@ double test_mm512_reduce_mul_pd(__m512d __W, double ExtraMulOp){ // CIR: cir.call_llvm_intrinsic "vector.reduce.fmul" %[[R:.*]], %[[V:.*]] : (!cir.double, !cir.vector<8 x !cir.double>) -> !cir.double // CIR-LABEL: test_mm512_reduce_mul_pd - // CIR: cir.call @_mm512_reduce_mul_pd(%[[VEC:.*]]) : (!cir.vector<8 x !cir.double>) -> !cir.double + // CIR: cir.call @_mm512_reduce_mul_pd(%[[VEC:.*]]) {nobuiltins = []} : (!cir.vector<8 x !cir.double>) -> !cir.double // LLVM-LABEL: test_mm512_reduce_mul_pd // LLVM: call double @llvm.vector.reduce.fmul.v8f64(double 1.000000e+00, <8 x double> %{{.*}}) @@ -45,7 +45,7 @@ float test_mm512_reduce_add_ps(__m512 __W){ // CIR: cir.call_llvm_intrinsic "vector.reduce.fadd" %[[R:.*]], %[[V:.*]] : (!cir.float, !cir.vector<16 x !cir.float>) -> !cir.float // CIR-LABEL: test_mm512_reduce_add_ps - // CIR: cir.call @_mm512_reduce_add_ps(%[[VEC:.*]]) : (!cir.vector<16 x !cir.float>) -> !cir.float + // CIR: cir.call @_mm512_reduce_add_ps(%[[VEC:.*]]) {nobuiltins = []} : (!cir.vector<16 x !cir.float>) -> !cir.float // LLVM-LABEL: test_mm512_reduce_add_ps // LLVM: call float @llvm.vector.reduce.fadd.v16f32(float -0.000000e+00, <16 x float> %{{.*}}) @@ -60,7 +60,7 @@ float test_mm512_reduce_mul_ps(__m512 __W){ // CIR: cir.call_llvm_intrinsic "vector.reduce.fmul" %[[R:.*]], %[[V:.*]] : (!cir.float, !cir.vector<16 x !cir.float>) -> !cir.float // CIR-LABEL: test_mm512_reduce_mul_ps - // CIR: cir.call @_mm512_reduce_mul_ps(%[[VEC:.*]]) : (!cir.vector<16 x !cir.float>) -> !cir.float + // CIR: cir.call @_mm512_reduce_mul_ps(%[[VEC:.*]]) {nobuiltins = []} : (!cir.vector<16 x !cir.float>) -> !cir.float // LLVM-LABEL: test_mm512_reduce_mul_ps // LLVM: call float @llvm.vector.reduce.fmul.v16f32(float 1.000000e+00, <16 x float> %{{.*}}) diff --git a/clang/test/CIR/CodeGenBuiltins/X86/avx512-reduceMinMaxIntrin.c b/clang/test/CIR/CodeGenBuiltins/X86/avx512-reduceMinMaxIntrin.c index 104e76fa6ad03..334b41f6db526 100644 --- a/clang/test/CIR/CodeGenBuiltins/X86/avx512-reduceMinMaxIntrin.c +++ b/clang/test/CIR/CodeGenBuiltins/X86/avx512-reduceMinMaxIntrin.c @@ -9,7 +9,7 @@ double test_mm512_reduce_max_pd(__m512d __W, double ExtraAddOp){ // CIR: cir.call_llvm_intrinsic "vector.reduce.fmax" %[[V:.*]] : (!cir.vector<8 x !cir.double>) -> !cir.double // CIR-LABEL: test_mm512_reduce_max_pd - // CIR: cir.call @_mm512_reduce_max_pd(%[[VEC:.*]]) : (!cir.vector<8 x !cir.double>) -> !cir.double + // CIR: cir.call @_mm512_reduce_max_pd(%[[VEC:.*]]) {nobuiltins = []} : (!cir.vector<8 x !cir.double>) -> !cir.double // LLVM-LABEL: test_mm512_reduce_max_pd // LLVM: call double @llvm.vector.reduce.fmax.v8f64(<8 x double> %{{.*}}) @@ -26,7 +26,7 @@ double test_mm512_reduce_min_pd(__m512d __W, double ExtraMulOp){ // CIR: cir.call_llvm_intrinsic "vector.reduce.fmin" %[[V:.*]] : (!cir.vector<8 x !cir.double>) -> !cir.double // CIR-LABEL: test_mm512_reduce_min_pd - // CIR: cir.call @_mm512_reduce_min_pd(%[[VEC:.*]]) : (!cir.vector<8 x !cir.double>) -> !cir.double + // CIR: cir.call @_mm512_reduce_min_pd(%[[VEC:.*]]) {nobuiltins = []} : (!cir.vector<8 x !cir.double>) -> !cir.double // LLVM-LABEL: test_mm512_reduce_min_pd // LLVM: call double @llvm.vector.reduce.fmin.v8f64(<8 x double> %{{.*}}) @@ -43,7 +43,7 @@ float test_mm512_reduce_max_ps(__m512 __W){ // CIR: cir.call_llvm_intrinsic "vector.reduce.fmax" %[[V:.*]] : (!cir.vector<16 x !cir.float>) -> !cir.float // CIR-LABEL: test_mm512_reduce_max_ps - // CIR: cir.call @_mm512_reduce_max_ps(%[[VEC:.*]]) : (!cir.vector<16 x !cir.float>) -> !cir.float + // CIR: cir.call @_mm512_reduce_max_ps(%[[VEC:.*]]) {nobuiltins = []} : (!cir.vector<16 x !cir.float>) -> !cir.float // LLVM-LABEL: test_mm512_reduce_max_ps // LLVM: call float @llvm.vector.reduce.fmax.v16f32(<16 x float> %{{.*}}) @@ -58,7 +58,7 @@ float test_mm512_reduce_min_ps(__m512 __W){ // CIR: cir.call_llvm_intrinsic "vector.reduce.fmin" %[[V:.*]] : (!cir.vector<16 x !cir.float>) -> !cir.float // CIR-LABEL: test_mm512_reduce_min_ps - // CIR: cir.call @_mm512_reduce_min_ps(%[[VEC:.*]]) : (!cir.vector<16 x !cir.float>) -> !cir.float + // CIR: cir.call @_mm512_reduce_min_ps(%[[VEC:.*]]) {nobuiltins = []} : (!cir.vector<16 x !cir.float>) -> !cir.float // LLVM-LABEL: test_mm512_reduce_min_ps // LLVM: call float @llvm.vector.reduce.fmin.v16f32(<16 x float> %{{.*}}) diff --git a/clang/test/CIR/CodeGenBuiltins/X86/avx512fp16-builtins.c b/clang/test/CIR/CodeGenBuiltins/X86/avx512fp16-builtins.c index 74e40c0d5a76e..92bb9cf0dc02a 100644 --- a/clang/test/CIR/CodeGenBuiltins/X86/avx512fp16-builtins.c +++ b/clang/test/CIR/CodeGenBuiltins/X86/avx512fp16-builtins.c @@ -70,7 +70,7 @@ _Float16 test_mm512_reduce_add_ph(__m512h __W) { // CIR: cir.call_llvm_intrinsic "vector.reduce.fadd" %[[R:.*]], %[[V:.*]] : (!cir.f16, !cir.vector<32 x !cir.f16>) -> !cir.f16 // CIR-LABEL: test_mm512_reduce_add_ph - // CIR: cir.call @_mm512_reduce_add_ph(%[[VEC:.*]]) : (!cir.vector<32 x !cir.f16>) -> !cir.f16 + // CIR: cir.call @_mm512_reduce_add_ph(%[[VEC:.*]]) {nobuiltins = []} : (!cir.vector<32 x !cir.f16>) -> !cir.f16 // LLVM-LABEL: test_mm512_reduce_add_ph // LLVM: call half @llvm.vector.reduce.fadd.v32f16(half 0xH8000, <32 x half> %{{.*}}) @@ -85,7 +85,7 @@ _Float16 test_mm512_reduce_mul_ph(__m512h __W) { // CIR: cir.call_llvm_intrinsic "vector.reduce.fmul" %[[R:.*]], %[[V:.*]] : (!cir.f16, !cir.vector<32 x !cir.f16>) -> !cir.f16 // CIR-LABEL: test_mm512_reduce_mul_ph - // CIR: cir.call @_mm512_reduce_mul_ph(%[[VEC:.*]]) : (!cir.vector<32 x !cir.f16>) -> !cir.f16 + // CIR: cir.call @_mm512_reduce_mul_ph(%[[VEC:.*]]) {nobuiltins = []} : (!cir.vector<32 x !cir.f16>) -> !cir.f16 // LLVM-LABEL: test_mm512_reduce_mul_ph // LLVM: call half @llvm.vector.reduce.fmul.v32f16(half 0xH3C00, <32 x half> %{{.*}}) @@ -100,7 +100,7 @@ _Float16 test_mm512_reduce_max_ph(__m512h __W) { // CIR: cir.call_llvm_intrinsic "vector.reduce.fmax" %[[V:.*]] (!cir.vector<32 x !cir.f16>) -> !cir.f16 // CIR-LABEL: test_mm512_reduce_max_ph - // CIR: cir.call @_mm512_reduce_max_ph(%[[VEC:.*]]) : (!cir.vector<32 x !cir.f16>) -> !cir.f16 + // CIR: cir.call @_mm512_reduce_max_ph(%[[VEC:.*]]) {nobuiltins = []} : (!cir.vector<32 x !cir.f16>) -> !cir.f16 // LLVM-LABEL: test_mm512_reduce_max_ph // LLVM: call half @llvm.vector.reduce.fmax.v32f16(<32 x half> %{{.*}}) @@ -115,7 +115,7 @@ _Float16 test_mm512_reduce_min_ph(__m512h __W) { // CIR: cir.call_llvm_intrinsic "vector.reduce.fmin" %[[V:.*]] (!cir.vector<32 x !cir.f16>) -> !cir.f16 // CIR-LABEL: test_mm512_reduce_min_ph - // CIR: cir.call @_mm512_reduce_min_ph(%[[VEC:.*]]) : (!cir.vector<32 x !cir.f16>) -> !cir.f16 + // CIR: cir.call @_mm512_reduce_min_ph(%[[VEC:.*]]) {nobuiltins = []} : (!cir.vector<32 x !cir.f16>) -> !cir.f16 // LLVM-LABEL: test_mm512_reduce_min_ph // ... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/178899 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
