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

Reply via email to