1*67e74705SXin Li // RUN: %clang_cc1 -triple s390x-linux-gnu -emit-llvm %s -o - | FileCheck %s
2*67e74705SXin Li
3*67e74705SXin Li // SystemZ prefers to align all global variables to two bytes.
4*67e74705SXin Li
5*67e74705SXin Li struct test {
6*67e74705SXin Li signed char a;
7*67e74705SXin Li };
8*67e74705SXin Li
9*67e74705SXin Li char c;
10*67e74705SXin Li // CHECK-DAG: @c = common global i8 0, align 2
11*67e74705SXin Li
12*67e74705SXin Li struct test s;
13*67e74705SXin Li // CHECK-DAG: @s = common global %struct.test zeroinitializer, align 2
14*67e74705SXin Li
15*67e74705SXin Li extern char ec;
16*67e74705SXin Li // CHECK-DAG: @ec = external global i8, align 2
17*67e74705SXin Li
18*67e74705SXin Li extern struct test es;
19*67e74705SXin Li // CHECK-DAG: @es = external global %struct.test, align 2
20*67e74705SXin Li
21*67e74705SXin Li // Dummy function to make sure external symbols are used.
func(void)22*67e74705SXin Li void func (void)
23*67e74705SXin Li {
24*67e74705SXin Li c = ec;
25*67e74705SXin Li s = es;
26*67e74705SXin Li }
27*67e74705SXin Li
28*67e74705SXin Li
29*67e74705SXin Li // Alignment should be respected for coerced argument loads
30*67e74705SXin Li
31*67e74705SXin Li struct arg { long y __attribute__((packed, aligned(4))); };
32*67e74705SXin Li
33*67e74705SXin Li extern struct arg x;
34*67e74705SXin Li void f(struct arg);
35*67e74705SXin Li
test(void)36*67e74705SXin Li void test (void)
37*67e74705SXin Li {
38*67e74705SXin Li f(x);
39*67e74705SXin Li }
40*67e74705SXin Li
41*67e74705SXin Li // CHECK-LABEL: @test
42*67e74705SXin Li // CHECK: load i64, i64* getelementptr inbounds (%struct.arg, %struct.arg* @x, i32 0, i32 0), align 4
43*67e74705SXin Li
44