summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGen/mips-varargs.c
diff options
context:
space:
mode:
authorDaniel Sanders <daniel.sanders@imgtec.com>2014-09-22 13:27:06 +0000
committerDaniel Sanders <daniel.sanders@imgtec.com>2014-09-22 13:27:06 +0000
commit8d36a61f52896d68d6a1087354934a7405347b5d (patch)
tree8d4482da0d20858fe052e33c42d59f69388a49d7 /clang/test/CodeGen/mips-varargs.c
parentbe9f12102fff344e53affe5cd13c088a3fb71712 (diff)
downloadbcm5719-llvm-8d36a61f52896d68d6a1087354934a7405347b5d.tar.gz
bcm5719-llvm-8d36a61f52896d68d6a1087354934a7405347b5d.zip
[mips] Correct alignment of vectors passed in varargs for the O32 ABI.
Summary: Vectors are normally 16-byte aligned, however the O32 ABI enforces a maximum alignment of 8-bytes since the base of the stack is 8-byte aligned. Previously, this was enforced on the caller side, but not on the callee side. This fixes the output of OpenCL's printf when given vectors. Reviewers: atanasyan Reviewed By: atanasyan Subscribers: llvm-commits, pekka.jaaskelainen Differential Revision: http://reviews.llvm.org/D5433 llvm-svn: 218248
Diffstat (limited to 'clang/test/CodeGen/mips-varargs.c')
-rw-r--r--clang/test/CodeGen/mips-varargs.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/clang/test/CodeGen/mips-varargs.c b/clang/test/CodeGen/mips-varargs.c
new file mode 100644
index 00000000000..c7a66beca9b
--- /dev/null
+++ b/clang/test/CodeGen/mips-varargs.c
@@ -0,0 +1,53 @@
+// RUN: %clang -target mips-unknown-linux -O3 -S -o - -emit-llvm %s | FileCheck %s -check-prefix=ALL -check-prefix=O32
+// RUN: %clang -target mips64-unknown-linux -O3 -S -o - -emit-llvm -mabi=n32 %s | FileCheck %s -check-prefix=ALL -check-prefix=N32
+// RUN: %clang -target mips64-unknown-linux -O3 -S -o - -emit-llvm %s | FileCheck %s -check-prefix=ALL -check-prefix=N64
+
+#include <stdarg.h>
+
+typedef int v4i32 __attribute__ ((__vector_size__ (16)));
+
+int test_v4i32(char *fmt, ...) {
+ va_list va;
+
+ va_start(va, fmt);
+ v4i32 v = va_arg(va, v4i32);
+ va_end(va);
+
+ return v[0];
+}
+
+// ALL: define i32 @test_v4i32(i8*{{.*}} %fmt, ...)
+// ALL: entry:
+//
+// O32: %va = alloca i8*, align [[PTRALIGN:4]]
+// N32: %va = alloca i8*, align [[PTRALIGN:4]]
+// N64: %va = alloca i8*, align [[PTRALIGN:8]]
+//
+// ALL: %va1 = bitcast i8** %va to i8*
+// ALL: call void @llvm.va_start(i8* %va1)
+// ALL: %ap.cur = load i8** %va, align [[PTRALIGN]]
+//
+// O32: %0 = ptrtoint i8* %ap.cur to [[PTRTYPE:i32]]
+// N32: %0 = ptrtoint i8* %ap.cur to [[PTRTYPE:i32]]
+// N64: %0 = ptrtoint i8* %ap.cur to [[PTRTYPE:i64]]
+//
+// Vectors are 16-byte aligned, however the O32 ABI has a maximum alignment of
+// 8-bytes since the base of the stack is 8-byte aligned.
+// O32: %1 = add i32 %0, 7
+// O32: %2 = and i32 %1, -8
+//
+// N32: %1 = add i32 %0, 15
+// N32: %2 = and i32 %1, -16
+//
+// N64: %1 = add i64 %0, 15
+// N64: %2 = and i64 %1, -16
+//
+// ALL: %3 = inttoptr [[PTRTYPE]] %2 to <4 x i32>*
+// ALL: %4 = inttoptr [[PTRTYPE]] %2 to i8*
+// ALL: %ap.next = getelementptr i8* %4, [[PTRTYPE]] 16
+// ALL: store i8* %ap.next, i8** %va, align [[PTRALIGN]]
+// ALL: %5 = load <4 x i32>* %3, align 16
+// ALL: call void @llvm.va_end(i8* %va1)
+// ALL: %vecext = extractelement <4 x i32> %5, i32 0
+// ALL: ret i32 %vecext
+// ALL: }
OpenPOWER on IntegriCloud