Use the alignment from lvalue emission to more accurately compute the alignment
of a pointer for builtin emission, instead of just depending on the type of the
pointee.  <rdar://problem/11314941>.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@162425 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/test/CodeGen/builtin-memfns.c b/test/CodeGen/builtin-memfns.c
index 72d3406..4a06160 100644
--- a/test/CodeGen/builtin-memfns.c
+++ b/test/CodeGen/builtin-memfns.c
@@ -63,3 +63,23 @@
   __builtin_memset(hwparams, 0, 256);  // No crash alignment = 1
   // CHECK: call void @llvm.memset{{.*}}256, i32 1, i1 false)
 }
+
+// <rdar://problem/11314941>
+// Make sure we don't over-estimate the alignment of fields of
+// packed structs.
+struct PS {
+  int modes[4];
+} __attribute__((packed));
+struct PS ps;
+void test8(int *arg) {
+  // CHECK: @test8
+  // CHECK: call void @llvm.memcpy{{.*}} 16, i32 1, i1 false)
+  __builtin_memcpy(arg, ps.modes, sizeof(struct PS));
+}
+
+__attribute((aligned(16))) int x[4], y[4];
+void test9() {
+  // CHECK: @test9
+  // CHECK: call void @llvm.memcpy{{.*}} 16, i32 16, i1 false)
+  __builtin_memcpy(x, y, sizeof(y));
+}