r208216 - [ARM64-BE] Correctly deal with single element HFAs in varargs.

James Molloy james.molloy at arm.com
Wed May 7 07:45:56 PDT 2014


Author: jamesm
Date: Wed May  7 09:45:55 2014
New Revision: 208216

URL: http://llvm.org/viewvc/llvm-project?rev=208216&view=rev
Log:
[ARM64-BE] Correctly deal with single element HFAs in varargs.

Just because the first "if" didn't fire, doesn't mean we can not have
an HFA in the "else" clause.

Added:
    cfe/trunk/test/CodeGen/arm64-be-hfa-vararg.c
Modified:
    cfe/trunk/lib/CodeGen/TargetInfo.cpp

Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=208216&r1=208215&r2=208216&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
+++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Wed May  7 09:45:55 2014
@@ -3550,7 +3550,8 @@ static llvm::Value *EmitAArch64VAArg(llv
 
   const Type *Base = 0;
   uint64_t NumMembers;
-  if (isHomogeneousAggregate(Ty, Base, Ctx, &NumMembers) && NumMembers > 1) {
+  bool IsHFA = isHomogeneousAggregate(Ty, Base, Ctx, &NumMembers);
+  if (IsHFA && NumMembers > 1) {
     // Homogeneous aggregates passed in registers will have their elements split
     // and stored 16-bytes apart regardless of size (they're notionally in qN,
     // qN+1, ...). We reload and store into a temporary local variable
@@ -3579,7 +3580,8 @@ static llvm::Value *EmitAArch64VAArg(llv
   } else {
     // Otherwise the object is contiguous in memory
     unsigned BeAlign = reg_top_index == 2 ? 16 : 8;
-    if (CGF.CGM.getDataLayout().isBigEndian() && !isAggregateTypeForABI(Ty) &&
+    if (CGF.CGM.getDataLayout().isBigEndian() &&
+        (IsHFA || !isAggregateTypeForABI(Ty)) &&
         Ctx.getTypeSize(Ty) < (BeAlign * 8)) {
       int Offset = BeAlign - Ctx.getTypeSize(Ty) / 8;
       BaseAddr = CGF.Builder.CreatePtrToInt(BaseAddr, CGF.Int64Ty);

Added: cfe/trunk/test/CodeGen/arm64-be-hfa-vararg.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/arm64-be-hfa-vararg.c?rev=208216&view=auto
==============================================================================
--- cfe/trunk/test/CodeGen/arm64-be-hfa-vararg.c (added)
+++ cfe/trunk/test/CodeGen/arm64-be-hfa-vararg.c Wed May  7 09:45:55 2014
@@ -0,0 +1,13 @@
+// RUN:  %clang_cc1 -triple arm64_be-linux-gnu -ffreestanding -emit-llvm -O0 -o - %s | FileCheck %s
+
+#include <stdarg.h>
+
+// A single member HFA must be aligned just like a non-HFA register argument.
+double callee(int a, ...) {
+// CHECK: %align_be = add i64 %{{.*}}, 8
+  va_list vl;
+  va_start(vl, a);
+  double result = va_arg(vl, struct { double a; }).a;
+  va_end(vl);
+  return result;
+}





More information about the cfe-commits mailing list