comparison clang/test/CodeGen/packed-arrays.c @ 207:2e18cbf3894f

LLVM12
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 08 Jun 2021 06:07:14 +0900
parents 1d019706d866
children c4bab56944e8
comparison
equal deleted inserted replaced
173:0572611fdcc8 207:2e18cbf3894f
21 unsigned int x[2]; 21 unsigned int x[2];
22 unsigned int y; 22 unsigned int y;
23 unsigned int z; 23 unsigned int z;
24 }; 24 };
25 25
26 // CHECK: @align0 = local_unnamed_addr global i32 1 26 // CHECK: @align0 ={{.*}} local_unnamed_addr global i32 1
27 int align0 = __alignof(struct s0); 27 int align0 = __alignof(struct s0);
28 // CHECK: @align1 = local_unnamed_addr global i32 4 28 // CHECK: @align1 ={{.*}} local_unnamed_addr global i32 4
29 int align1 = __alignof(struct s1); 29 int align1 = __alignof(struct s1);
30 // CHECK: @align2 = local_unnamed_addr global i32 1 30 // CHECK: @align2 ={{.*}} local_unnamed_addr global i32 1
31 int align2 = __alignof(struct s2); 31 int align2 = __alignof(struct s2);
32 // CHECK: @align3 = local_unnamed_addr global i32 1 32 // CHECK: @align3 ={{.*}} local_unnamed_addr global i32 1
33 int align3 = __alignof(struct s3); 33 int align3 = __alignof(struct s3);
34 34
35 // CHECK: @align0_x = local_unnamed_addr global i32 1 35 // CHECK: @align0_x ={{.*}} local_unnamed_addr global i32 1
36 int align0_x = __alignof(((struct s0*) 0)->x); 36 int align0_x = __alignof(((struct s0*) 0)->x);
37 // 37 //
38 // CHECK: @align1_x = local_unnamed_addr global i32 1 38 // CHECK: @align1_x ={{.*}} local_unnamed_addr global i32 1
39 int align1_x = __alignof(((struct s1*) 0)->x); 39 int align1_x = __alignof(((struct s1*) 0)->x);
40 // CHECK: @align2_x = local_unnamed_addr global i32 1 40 // CHECK: @align2_x ={{.*}} local_unnamed_addr global i32 1
41 int align2_x = __alignof(((struct s2*) 0)->x); 41 int align2_x = __alignof(((struct s2*) 0)->x);
42 // CHECK: @align3_x = local_unnamed_addr global i32 1 42 // CHECK: @align3_x ={{.*}} local_unnamed_addr global i32 1
43 int align3_x = __alignof(((struct s3*) 0)->x); 43 int align3_x = __alignof(((struct s3*) 0)->x);
44 44
45 // CHECK: @align0_x0 = local_unnamed_addr global i32 4 45 // CHECK: @align0_x0 ={{.*}} local_unnamed_addr global i32 4
46 int align0_x0 = __alignof(((struct s0*) 0)->x[0]); 46 int align0_x0 = __alignof(((struct s0*) 0)->x[0]);
47 // CHECK: @align1_x0 = local_unnamed_addr global i32 4 47 // CHECK: @align1_x0 ={{.*}} local_unnamed_addr global i32 4
48 int align1_x0 = __alignof(((struct s1*) 0)->x[0]); 48 int align1_x0 = __alignof(((struct s1*) 0)->x[0]);
49 // CHECK: @align2_x0 = local_unnamed_addr global i32 4 49 // CHECK: @align2_x0 ={{.*}} local_unnamed_addr global i32 4
50 int align2_x0 = __alignof(((struct s2*) 0)->x[0]); 50 int align2_x0 = __alignof(((struct s2*) 0)->x[0]);
51 // CHECK: @align3_x0 = local_unnamed_addr global i32 4 51 // CHECK: @align3_x0 ={{.*}} local_unnamed_addr global i32 4
52 int align3_x0 = __alignof(((struct s3*) 0)->x[0]); 52 int align3_x0 = __alignof(((struct s3*) 0)->x[0]);
53 53
54 // CHECK-LABEL: define i32 @f0_a 54 // CHECK-LABEL: define{{.*}} i32 @f0_a
55 // CHECK: load i32, i32* %{{.*}}, align 1 55 // CHECK: load i32, i32* %{{.*}}, align 1
56 // CHECK: } 56 // CHECK: }
57 // CHECK-LABEL: define i32 @f0_b 57 // CHECK-LABEL: define{{.*}} i32 @f0_b
58 // CHECK: load i32, i32* %{{.*}}, align 4 58 // CHECK: load i32, i32* %{{.*}}, align 4
59 // CHECK: } 59 // CHECK: }
60 int f0_a(struct s0 *a) { 60 int f0_a(struct s0 *a) {
61 return a->x[1]; 61 return a->x[1];
62 } 62 }
66 66
67 // Note that 'y' still causes struct s1 to be four-byte aligned. 67 // Note that 'y' still causes struct s1 to be four-byte aligned.
68 68
69 // Note that we are incompatible with GCC on this example. 69 // Note that we are incompatible with GCC on this example.
70 // 70 //
71 // CHECK-LABEL: define i32 @f1_a 71 // CHECK-LABEL: define{{.*}} i32 @f1_a
72 // CHECK: load i32, i32* %{{.*}}, align 4 72 // CHECK: load i32, i32* %{{.*}}, align 4
73 // CHECK: } 73 // CHECK: }
74 // CHECK-LABEL: define i32 @f1_b 74 // CHECK-LABEL: define{{.*}} i32 @f1_b
75 // CHECK: load i32, i32* %{{.*}}, align 4 75 // CHECK: load i32, i32* %{{.*}}, align 4
76 // CHECK: } 76 // CHECK: }
77 77
78 // Note that we are incompatible with GCC on this example. 78 // Note that we are incompatible with GCC on this example.
79 // 79 //
80 // CHECK-LABEL: define i32 @f1_c 80 // CHECK-LABEL: define{{.*}} i32 @f1_c
81 // CHECK: load i32, i32* %{{.*}}, align 4 81 // CHECK: load i32, i32* %{{.*}}, align 4
82 // CHECK: } 82 // CHECK: }
83 // CHECK-LABEL: define i32 @f1_d 83 // CHECK-LABEL: define{{.*}} i32 @f1_d
84 // CHECK: load i32, i32* %{{.*}}, align 4 84 // CHECK: load i32, i32* %{{.*}}, align 4
85 // CHECK: } 85 // CHECK: }
86 int f1_a(struct s1 *a) { 86 int f1_a(struct s1 *a) {
87 return a->x[1]; 87 return a->x[1];
88 } 88 }
94 } 94 }
95 int f1_d(struct s1 *a) { 95 int f1_d(struct s1 *a) {
96 return a->z; 96 return a->z;
97 } 97 }
98 98
99 // CHECK-LABEL: define i32 @f2_a 99 // CHECK-LABEL: define{{.*}} i32 @f2_a
100 // CHECK: load i32, i32* %{{.*}}, align 1 100 // CHECK: load i32, i32* %{{.*}}, align 1
101 // CHECK: } 101 // CHECK: }
102 // CHECK-LABEL: define i32 @f2_b 102 // CHECK-LABEL: define{{.*}} i32 @f2_b
103 // CHECK: load i32, i32* %{{.*}}, align 4 103 // CHECK: load i32, i32* %{{.*}}, align 4
104 // CHECK: } 104 // CHECK: }
105 // CHECK-LABEL: define i32 @f2_c 105 // CHECK-LABEL: define{{.*}} i32 @f2_c
106 // CHECK: load i32, i32* %{{.*}}, align 1 106 // CHECK: load i32, i32* %{{.*}}, align 1
107 // CHECK: } 107 // CHECK: }
108 // CHECK-LABEL: define i32 @f2_d 108 // CHECK-LABEL: define{{.*}} i32 @f2_d
109 // CHECK: load i32, i32* %{{.*}}, align 1 109 // CHECK: load i32, i32* %{{.*}}, align 1
110 // CHECK: } 110 // CHECK: }
111 int f2_a(struct s2 *a) { 111 int f2_a(struct s2 *a) {
112 return a->x[1]; 112 return a->x[1];
113 } 113 }
119 } 119 }
120 int f2_d(struct s2 *a) { 120 int f2_d(struct s2 *a) {
121 return a->z; 121 return a->z;
122 } 122 }
123 123
124 // CHECK-LABEL: define i32 @f3_a 124 // CHECK-LABEL: define{{.*}} i32 @f3_a
125 // CHECK: load i32, i32* %{{.*}}, align 1 125 // CHECK: load i32, i32* %{{.*}}, align 1
126 // CHECK: } 126 // CHECK: }
127 // CHECK-LABEL: define i32 @f3_b 127 // CHECK-LABEL: define{{.*}} i32 @f3_b
128 // CHECK: load i32, i32* %{{.*}}, align 4 128 // CHECK: load i32, i32* %{{.*}}, align 4
129 // CHECK: } 129 // CHECK: }
130 // CHECK-LABEL: define i32 @f3_c 130 // CHECK-LABEL: define{{.*}} i32 @f3_c
131 // CHECK: load i32, i32* %{{.*}}, align 1 131 // CHECK: load i32, i32* %{{.*}}, align 1
132 // CHECK: } 132 // CHECK: }
133 // CHECK-LABEL: define i32 @f3_d 133 // CHECK-LABEL: define{{.*}} i32 @f3_d
134 // CHECK: load i32, i32* %{{.*}}, align 1 134 // CHECK: load i32, i32* %{{.*}}, align 1
135 // CHECK: } 135 // CHECK: }
136 int f3_a(struct s3 *a) { 136 int f3_a(struct s3 *a) {
137 return a->x[1]; 137 return a->x[1];
138 } 138 }
146 return a->z; 146 return a->z;
147 } 147 }
148 148
149 // Verify we don't claim things are overaligned. 149 // Verify we don't claim things are overaligned.
150 // 150 //
151 // CHECK-LABEL: define double @f4 151 // CHECK-LABEL: define{{.*}} double @f4
152 // CHECK: load double, double* {{.*}}, align 8 152 // CHECK: load double, double* {{.*}}, align 8
153 // CHECK: } 153 // CHECK: }
154 extern double g4[5] __attribute__((aligned(16))); 154 extern double g4[5] __attribute__((aligned(16)));
155 double f4() { 155 double f4() {
156 return g4[1]; 156 return g4[1];