diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp index 35d495d4dfab8..7af3c676182e5 100644 --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -5793,8 +5793,14 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo, } // Apply the attributes and calling convention. - CI->setAttributes(Attrs); - CI->setCallingConv(static_cast(CallingConv)); + + // If this is a call to an intrinsic, ignore the attributes that would + // normally be deduced from the AST function declaration + the default + // attributes imposed by the language and/or target. + if (!isa(CI)) { + CI->setAttributes(Attrs); + CI->setCallingConv(static_cast(CallingConv)); + } // Apply various metadata. diff --git a/clang/test/CodeGen/llvm-intrinsic-call.c b/clang/test/CodeGen/llvm-intrinsic-call.c new file mode 100644 index 0000000000000..f71769d652765 --- /dev/null +++ b/clang/test/CodeGen/llvm-intrinsic-call.c @@ -0,0 +1,13 @@ +// RUN: %clang_cc1 %s -emit-llvm -o - | FileCheck %s + +float llvm_sin_f32(float) asm("llvm.sin.f32"); + +float test(float a) { + return llvm_sin_f32(a); +} + +// CHECK: call float @llvm.sin.f32(float {{%.+}}){{$}} + +// CHECK: declare float @llvm.sin.f32(float) [[ATTRS:#[0-9]+]] + +// CHECK: attributes [[ATTRS]] = { nocallback nofree nosync nounwind speculatable willreturn memory(none) } diff --git a/clang/test/CodeGenCUDA/surface.cu b/clang/test/CodeGenCUDA/surface.cu index 4106673f3138a..c9e9f1543ec7d 100644 --- a/clang/test/CodeGenCUDA/surface.cu +++ b/clang/test/CodeGenCUDA/surface.cu @@ -29,7 +29,7 @@ __attribute__((device)) int suld_2d_zero(surface, int, int) asm("llvm.n // DEVICE-LABEL: i32 @_Z3fooii(i32 noundef %x, i32 noundef %y) // DEVICE: call i64 @llvm.nvvm.texsurf.handle.internal.p1(ptr addrspace(1) @surf) -// DEVICE: call noundef i32 @llvm.nvvm.suld.2d.i32.zero(i64 %{{.*}}, i32 noundef %{{.*}}, i32 noundef %{{.*}}) +// DEVICE: call i32 @llvm.nvvm.suld.2d.i32.zero(i64 %{{.*}}, i32 %{{.*}}, i32 %{{.*}}) __attribute__((device)) int foo(int x, int y) { return suld_2d_zero(surf, x, y); }