xref: /aosp_15_r20/external/clang/test/CodeGen/alignment.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple i386-unknown-linux-gnu -emit-llvm %s -o - | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li __attribute((aligned(16))) float a[128];
4*67e74705SXin Li union {int a[4]; __attribute((aligned(16))) float b[4];} b;
5*67e74705SXin Li 
6*67e74705SXin Li // CHECK: @a = {{.*}}zeroinitializer, align 16
7*67e74705SXin Li // CHECK: @b = {{.*}}zeroinitializer, align 16
8*67e74705SXin Li 
9*67e74705SXin Li long long int test5[1024];
10*67e74705SXin Li // CHECK-DAG: @test5 = common global [1024 x i64] zeroinitializer, align 8
11*67e74705SXin Li 
12*67e74705SXin Li // PR5279 - Reduced alignment on typedef.
13*67e74705SXin Li typedef int myint __attribute__((aligned(1)));
14*67e74705SXin Li 
test1(myint * p)15*67e74705SXin Li void test1(myint *p) {
16*67e74705SXin Li   *p = 0;
17*67e74705SXin Li }
18*67e74705SXin Li // CHECK: @test1(
19*67e74705SXin Li // CHECK: store i32 0, i32* {{.*}}, align 1
20*67e74705SXin Li // CHECK: ret void
21*67e74705SXin Li 
test1a(myint * p)22*67e74705SXin Li int test1a(myint *p) {
23*67e74705SXin Li   return *p;
24*67e74705SXin Li }
25*67e74705SXin Li // CHECK: @test1a(
26*67e74705SXin Li // CHECK: load i32, i32* {{.*}}, align 1
27*67e74705SXin Li // CHECK: ret i32
28*67e74705SXin Li 
29*67e74705SXin Li 
30*67e74705SXin Li // PR5279 - Reduced alignment on typedef.
31*67e74705SXin Li typedef float __attribute__((vector_size(16), aligned(4))) packedfloat4;
32*67e74705SXin Li 
test2(packedfloat4 * p)33*67e74705SXin Li void test2(packedfloat4 *p) {
34*67e74705SXin Li   *p = (packedfloat4) { 3.2f, 2.3f, 0.1f, 0.0f };
35*67e74705SXin Li }
36*67e74705SXin Li // CHECK: @test2(
37*67e74705SXin Li // CHECK: store <4 x float> {{.*}}, align 4
38*67e74705SXin Li // CHECK: ret void
39*67e74705SXin Li 
40*67e74705SXin Li 
41*67e74705SXin Li // PR5279 - Reduced alignment on typedef.
42*67e74705SXin Li typedef float __attribute__((ext_vector_type(3), aligned(4))) packedfloat3;
test3(packedfloat3 * p)43*67e74705SXin Li void test3(packedfloat3 *p) {
44*67e74705SXin Li   *p = (packedfloat3) { 3.2f, 2.3f, 0.1f };
45*67e74705SXin Li }
46*67e74705SXin Li // CHECK: @test3(
47*67e74705SXin Li // CHECK: %{{.*}} = bitcast <3 x float>* %{{.*}} to <4 x float>*
48*67e74705SXin Li // CHECK: store <4 x float> {{.*}}, align 4
49*67e74705SXin Li // CHECK: ret void
50*67e74705SXin Li 
51*67e74705SXin Li 
52*67e74705SXin Li 
53*67e74705SXin Li typedef float __attribute__((vector_size(16), aligned(64))) float4align64;
54*67e74705SXin Li 
55*67e74705SXin Li // rdar://10639962 - Typedef alignment lost in p[]-style dereferencing
test4(float4align64 * p)56*67e74705SXin Li void test4(float4align64 *p) {
57*67e74705SXin Li   p[0] = (float4align64){ 3.2f, 2.3f, 0.1f, 0.0f };
58*67e74705SXin Li }
59*67e74705SXin Li // CHECK: @test4(
60*67e74705SXin Li // CHECK: store <4 x float> {{.*}}, <4 x float>* {{.*}}, align 64
61*67e74705SXin Li 
62*67e74705SXin Li // PR24944 - Typedef alignment not honored on no-op cast.
63*67e74705SXin Li typedef float __attribute__((vector_size(16), aligned(16))) float4align16;
64*67e74705SXin Li typedef float __attribute__((vector_size(16), aligned(2))) float4align2;
test6(float4align64 * p)65*67e74705SXin Li void test6(float4align64 *p) {
66*67e74705SXin Li     float4align64 vec = *(float4align2*) p;
67*67e74705SXin Li }
68*67e74705SXin Li // CHECK-LABEL: @test6
69*67e74705SXin Li // CHECK:       load <4 x float>, <4 x float>* {{.*}}, align 2
70