[cfe-commits] r145574 - in /cfe/trunk: lib/CodeGen/CGExpr.cpp lib/CodeGen/TargetInfo.cpp lib/CodeGen/TargetInfo.h test/CodeGen/x86_64-arguments.c
Eli Friedman
eli.friedman at gmail.com
Wed Nov 30 20:53:19 PST 2011
Author: efriedma
Date: Wed Nov 30 22:53:19 2011
New Revision: 145574
URL: http://llvm.org/viewvc/llvm-project?rev=145574&view=rev
Log:
Don't use a varargs convention for calls unprototyped functions where one of the arguments is an AVX vector.
Modified:
cfe/trunk/lib/CodeGen/CGExpr.cpp
cfe/trunk/lib/CodeGen/TargetInfo.cpp
cfe/trunk/lib/CodeGen/TargetInfo.h
cfe/trunk/test/CodeGen/x86_64-arguments.c
Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=145574&r1=145573&r2=145574&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExpr.cpp Wed Nov 30 22:53:19 2011
@@ -2458,7 +2458,7 @@
// call. The way we make this work is to cast to the exact type
// of the promoted arguments.
if (isa<FunctionNoProtoType>(FnType) &&
- !getTargetHooks().isNoProtoCallVariadic(FnType->getCallConv())) {
+ !getTargetHooks().isNoProtoCallVariadic(FnInfo)) {
assert(cast<llvm::FunctionType>(Callee->getType()->getContainedType(0))
->isVarArg());
llvm::Type *CalleeTy = getTypes().GetFunctionType(FnInfo, false);
Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=145574&r1=145573&r2=145574&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
+++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Wed Nov 30 22:53:19 2011
@@ -98,7 +98,8 @@
return 32;
}
-bool TargetCodeGenInfo::isNoProtoCallVariadic(CallingConv CC) const {
+bool TargetCodeGenInfo::isNoProtoCallVariadic(
+ const CodeGen::CGFunctionInfo &) const {
// The following conventions are known to require this to be false:
// x86_stdcall
// MIPS
@@ -978,13 +979,31 @@
return X86AdjustInlineAsmType(CGF, Constraint, Ty);
}
- bool isNoProtoCallVariadic(CallingConv CC) const {
+ bool isNoProtoCallVariadic(const CodeGen::CGFunctionInfo &FI) const {
// The default CC on x86-64 sets %al to the number of SSA
// registers used, and GCC sets this when calling an unprototyped
- // function, so we override the default behavior.
- if (CC == CC_Default || CC == CC_C) return true;
+ // function, so we override the default behavior. However, don't do
+ // that when AVX types are involved.
+ if (FI.getCallingConvention() == llvm::CallingConv::C) {
+ bool HasAVXType = false;
+ for (CGFunctionInfo::const_arg_iterator it = FI.arg_begin(),
+ ie = FI.arg_end();
+ it != ie; ++it) {
+ if (it->info.isDirect()) {
+ llvm::Type *Ty = it->info.getCoerceToType();
+ if (llvm::VectorType *VTy = dyn_cast_or_null<llvm::VectorType>(Ty)) {
+ if (VTy->getBitWidth() > 128) {
+ HasAVXType = true;
+ break;
+ }
+ }
+ }
+ }
+ if (!HasAVXType)
+ return true;
+ }
- return TargetCodeGenInfo::isNoProtoCallVariadic(CC);
+ return TargetCodeGenInfo::isNoProtoCallVariadic(FI);
}
};
Modified: cfe/trunk/lib/CodeGen/TargetInfo.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.h?rev=145574&r1=145573&r2=145574&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/TargetInfo.h (original)
+++ cfe/trunk/lib/CodeGen/TargetInfo.h Wed Nov 30 22:53:19 2011
@@ -32,6 +32,7 @@
namespace CodeGen {
class CodeGenModule;
class CodeGenFunction;
+ class CGFunctionInfo;
}
/// TargetCodeGenInfo - This class organizes various target-specific
@@ -160,7 +161,7 @@
/// same way and some out-of-band information is passed for the
/// benefit of variadic callees, as is the case for x86-64.
/// In this case the ABI should be consulted.
- virtual bool isNoProtoCallVariadic(CallingConv CC) const;
+ virtual bool isNoProtoCallVariadic(const CodeGen::CGFunctionInfo &) const;
};
}
Modified: cfe/trunk/test/CodeGen/x86_64-arguments.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/x86_64-arguments.c?rev=145574&r1=145573&r2=145574&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/x86_64-arguments.c (original)
+++ cfe/trunk/test/CodeGen/x86_64-arguments.c Wed Nov 30 22:53:19 2011
@@ -326,3 +326,11 @@
{
return 0;
}
+
+// Make sure we don't use a varargs convention for a function without a
+// prototype where AVX types are involved.
+// CHECK: @test45
+// CHECK: call i32 bitcast (i32 (...)* @f45 to i32 (<8 x float>)*)
+int f45();
+__m256 x45;
+void test45() { f45(x45); }
More information about the cfe-commits
mailing list