annotate clang/test/CodeGen/exprs.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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 // RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -emit-llvm -o - | FileCheck %s
anatofuz
parents:
diff changeset
2
anatofuz
parents:
diff changeset
3 // PR1895
anatofuz
parents:
diff changeset
4 // sizeof function
anatofuz
parents:
diff changeset
5 int zxcv(void);
anatofuz
parents:
diff changeset
6 int x=sizeof(zxcv);
anatofuz
parents:
diff changeset
7 int y=__alignof__(zxcv);
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9
anatofuz
parents:
diff changeset
10 void *test(int *i) {
anatofuz
parents:
diff changeset
11 short a = 1;
anatofuz
parents:
diff changeset
12 i += a;
anatofuz
parents:
diff changeset
13 i + a;
anatofuz
parents:
diff changeset
14 a + i;
anatofuz
parents:
diff changeset
15 }
anatofuz
parents:
diff changeset
16
anatofuz
parents:
diff changeset
17 _Bool test2b;
anatofuz
parents:
diff changeset
18 int test2() { if (test2b); return 0; }
anatofuz
parents:
diff changeset
19
anatofuz
parents:
diff changeset
20 // PR1921
anatofuz
parents:
diff changeset
21 int test3() {
anatofuz
parents:
diff changeset
22 const unsigned char *bp;
anatofuz
parents:
diff changeset
23 bp -= (short)1;
anatofuz
parents:
diff changeset
24 }
anatofuz
parents:
diff changeset
25
anatofuz
parents:
diff changeset
26 // PR2080 - sizeof void
anatofuz
parents:
diff changeset
27 int t1 = sizeof(void);
anatofuz
parents:
diff changeset
28 int t2 = __alignof__(void);
anatofuz
parents:
diff changeset
29 void test4() {
anatofuz
parents:
diff changeset
30 t1 = sizeof(void);
anatofuz
parents:
diff changeset
31 t2 = __alignof__(void);
anatofuz
parents:
diff changeset
32
anatofuz
parents:
diff changeset
33 t1 = sizeof(test4());
anatofuz
parents:
diff changeset
34 t2 = __alignof__(test4());
anatofuz
parents:
diff changeset
35 }
anatofuz
parents:
diff changeset
36
anatofuz
parents:
diff changeset
37 // 'const float' promotes to double in varargs.
anatofuz
parents:
diff changeset
38 int test5(const float x, float float_number) {
anatofuz
parents:
diff changeset
39 return __builtin_isless(x, float_number);
anatofuz
parents:
diff changeset
40 }
anatofuz
parents:
diff changeset
41
anatofuz
parents:
diff changeset
42 // this one shouldn't fold
anatofuz
parents:
diff changeset
43 int ola() {
anatofuz
parents:
diff changeset
44 int a=2;
anatofuz
parents:
diff changeset
45 if ((0, (int)a) & 2) { return 1; }
anatofuz
parents:
diff changeset
46 return 2;
anatofuz
parents:
diff changeset
47 }
anatofuz
parents:
diff changeset
48
anatofuz
parents:
diff changeset
49 // this one shouldn't fold as well
anatofuz
parents:
diff changeset
50 void eMaisUma() {
anatofuz
parents:
diff changeset
51 double t[1];
anatofuz
parents:
diff changeset
52 if (*t)
anatofuz
parents:
diff changeset
53 return;
anatofuz
parents:
diff changeset
54 }
anatofuz
parents:
diff changeset
55
anatofuz
parents:
diff changeset
56 // rdar://6520707
anatofuz
parents:
diff changeset
57 void f0(void (*fp)(void), void (*fp2)(void)) {
anatofuz
parents:
diff changeset
58 int x = fp - fp2;
anatofuz
parents:
diff changeset
59 }
anatofuz
parents:
diff changeset
60
anatofuz
parents:
diff changeset
61 // noop casts as lvalues.
anatofuz
parents:
diff changeset
62 struct X {
anatofuz
parents:
diff changeset
63 int Y;
anatofuz
parents:
diff changeset
64 };
anatofuz
parents:
diff changeset
65 struct X foo();
anatofuz
parents:
diff changeset
66 int bar() {
anatofuz
parents:
diff changeset
67 return ((struct X)foo()).Y + 1;
anatofuz
parents:
diff changeset
68 }
anatofuz
parents:
diff changeset
69
anatofuz
parents:
diff changeset
70 // PR3809: INC/DEC of function pointers.
anatofuz
parents:
diff changeset
71 void f2(void);
anatofuz
parents:
diff changeset
72 unsigned f1(void) {
anatofuz
parents:
diff changeset
73 void (*fp)(void) = f2;
anatofuz
parents:
diff changeset
74
anatofuz
parents:
diff changeset
75 ++fp;
anatofuz
parents:
diff changeset
76 fp++;
anatofuz
parents:
diff changeset
77 --fp;
anatofuz
parents:
diff changeset
78 fp--;
anatofuz
parents:
diff changeset
79 return (unsigned) fp;
anatofuz
parents:
diff changeset
80 }
anatofuz
parents:
diff changeset
81
anatofuz
parents:
diff changeset
82 union f3_x {int x; float y;};
anatofuz
parents:
diff changeset
83 int f3() {return ((union f3_x)2).x;}
anatofuz
parents:
diff changeset
84
anatofuz
parents:
diff changeset
85 union f4_y {int x; _Complex float y;};
anatofuz
parents:
diff changeset
86 _Complex float f4() {return ((union f4_y)(_Complex float)2.0).y;}
anatofuz
parents:
diff changeset
87
anatofuz
parents:
diff changeset
88 struct f5_a { int a; } f5_a;
anatofuz
parents:
diff changeset
89 union f5_z {int x; struct f5_a y;};
anatofuz
parents:
diff changeset
90 struct f5_a f5() {return ((union f5_z)f5_a).y;}
anatofuz
parents:
diff changeset
91
anatofuz
parents:
diff changeset
92 // ?: in "lvalue"
anatofuz
parents:
diff changeset
93 struct s6 { int f0; };
anatofuz
parents:
diff changeset
94 int f6(int a0, struct s6 a1, struct s6 a2) {
anatofuz
parents:
diff changeset
95 return (a0 ? a1 : a2).f0;
anatofuz
parents:
diff changeset
96 }
anatofuz
parents:
diff changeset
97
anatofuz
parents:
diff changeset
98 // PR4026
anatofuz
parents:
diff changeset
99 void f7() {
anatofuz
parents:
diff changeset
100 __func__;
anatofuz
parents:
diff changeset
101 }
anatofuz
parents:
diff changeset
102
anatofuz
parents:
diff changeset
103 // PR4067
anatofuz
parents:
diff changeset
104 int f8() {
anatofuz
parents:
diff changeset
105 return ({ foo(); }).Y;
anatofuz
parents:
diff changeset
106 }
anatofuz
parents:
diff changeset
107
anatofuz
parents:
diff changeset
108 // rdar://6880558
anatofuz
parents:
diff changeset
109 struct S;
anatofuz
parents:
diff changeset
110 struct C {
anatofuz
parents:
diff changeset
111 int i;
anatofuz
parents:
diff changeset
112 struct S *tab[];
anatofuz
parents:
diff changeset
113 };
anatofuz
parents:
diff changeset
114 struct S { struct C c; };
anatofuz
parents:
diff changeset
115 void f9(struct S *x) {
anatofuz
parents:
diff changeset
116 foo(((void)1, x->c).tab[0]);
anatofuz
parents:
diff changeset
117 }
anatofuz
parents:
diff changeset
118
anatofuz
parents:
diff changeset
119 void f10() {
anatofuz
parents:
diff changeset
120 __builtin_sin(0);
anatofuz
parents:
diff changeset
121 }
anatofuz
parents:
diff changeset
122
anatofuz
parents:
diff changeset
123 // rdar://7530813
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
124 // CHECK-LABEL: define{{.*}} i32 @f11
150
anatofuz
parents:
diff changeset
125 int f11(long X) {
anatofuz
parents:
diff changeset
126 int A[100];
anatofuz
parents:
diff changeset
127 return A[X];
anatofuz
parents:
diff changeset
128
anatofuz
parents:
diff changeset
129 // CHECK: [[Xaddr:%[^ ]+]] = alloca i64, align 8
anatofuz
parents:
diff changeset
130 // CHECK: [[A:%.*]] = alloca [100 x i32], align
anatofuz
parents:
diff changeset
131 // CHECK: [[X:%.*]] = load {{.*}}, {{.*}}* [[Xaddr]]
anatofuz
parents:
diff changeset
132 // CHECK-NEXT: [[T0:%.*]] = getelementptr inbounds [100 x i32], [100 x i32]* [[A]], i64 0, i64 [[X]]
anatofuz
parents:
diff changeset
133 // CHECK-NEXT: load i32, i32* [[T0]], align 4
anatofuz
parents:
diff changeset
134 }
anatofuz
parents:
diff changeset
135
anatofuz
parents:
diff changeset
136 int f12() {
anatofuz
parents:
diff changeset
137 // PR3150
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
138 // CHECK-LABEL: define{{.*}} i32 @f12
150
anatofuz
parents:
diff changeset
139 // CHECK: ret i32 1
anatofuz
parents:
diff changeset
140 return 1||1;
anatofuz
parents:
diff changeset
141 }
anatofuz
parents:
diff changeset
142
anatofuz
parents:
diff changeset
143 // Make sure negate of fp uses -0.0 for proper -0 handling.
anatofuz
parents:
diff changeset
144 double f13(double X) {
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
145 // CHECK-LABEL: define{{.*}} double @f13
150
anatofuz
parents:
diff changeset
146 // CHECK: fneg double
anatofuz
parents:
diff changeset
147 return -X;
anatofuz
parents:
diff changeset
148 }
anatofuz
parents:
diff changeset
149
anatofuz
parents:
diff changeset
150 // Check operations on incomplete types.
anatofuz
parents:
diff changeset
151 void f14(struct s14 *a) {
anatofuz
parents:
diff changeset
152 (void) &*a;
anatofuz
parents:
diff changeset
153 }
anatofuz
parents:
diff changeset
154
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
155 // CHECK-LABEL: define{{.*}} void @f15
150
anatofuz
parents:
diff changeset
156 void f15() {
anatofuz
parents:
diff changeset
157 extern void f15_start(void);
anatofuz
parents:
diff changeset
158 f15_start();
anatofuz
parents:
diff changeset
159 // CHECK: call void @f15_start()
anatofuz
parents:
diff changeset
160
anatofuz
parents:
diff changeset
161 extern void *f15_v(void);
anatofuz
parents:
diff changeset
162 extern const void *f15_cv(void);
anatofuz
parents:
diff changeset
163 extern volatile void *f15_vv(void);
anatofuz
parents:
diff changeset
164 *f15_v(); *f15_v(), *f15_v(); f15_v() ? *f15_v() : *f15_v();
anatofuz
parents:
diff changeset
165 *f15_cv(); *f15_cv(), *f15_cv(); f15_cv() ? *f15_cv() : *f15_cv();
anatofuz
parents:
diff changeset
166 *f15_vv(); *f15_vv(), *f15_vv(); f15_vv() ? *f15_vv() : *f15_vv();
anatofuz
parents:
diff changeset
167 // CHECK-NOT: load
anatofuz
parents:
diff changeset
168 // CHECK: ret void
anatofuz
parents:
diff changeset
169 }
anatofuz
parents:
diff changeset
170
anatofuz
parents:
diff changeset
171 // PR8967: this was crashing
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
172 // CHECK-LABEL: define{{.*}} void @f16()
150
anatofuz
parents:
diff changeset
173 void f16() {
anatofuz
parents:
diff changeset
174 __extension__({ goto lbl; });
anatofuz
parents:
diff changeset
175 lbl:
anatofuz
parents:
diff changeset
176 ;
anatofuz
parents:
diff changeset
177 }
anatofuz
parents:
diff changeset
178
anatofuz
parents:
diff changeset
179 // PR13704: negative increment in i128 is not preserved.
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
180 // CHECK-LABEL: define{{.*}} void @f17()
150
anatofuz
parents:
diff changeset
181 void f17() {
anatofuz
parents:
diff changeset
182 extern void extfunc(__int128);
anatofuz
parents:
diff changeset
183 __int128 x = 2;
anatofuz
parents:
diff changeset
184 x--;
anatofuz
parents:
diff changeset
185 extfunc(x);
anatofuz
parents:
diff changeset
186 // CHECK: add nsw i128 %{{.}}, -1
anatofuz
parents:
diff changeset
187 }
anatofuz
parents:
diff changeset
188
anatofuz
parents:
diff changeset
189 // PR23597: We should evaluate union cast operands even if the cast is unused.
anatofuz
parents:
diff changeset
190 typedef union u {
anatofuz
parents:
diff changeset
191 int i;
anatofuz
parents:
diff changeset
192 } strct;
anatofuz
parents:
diff changeset
193 int returns_int(void);
anatofuz
parents:
diff changeset
194 void f18() {
anatofuz
parents:
diff changeset
195 (strct)returns_int();
anatofuz
parents:
diff changeset
196 }
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
197 // CHECK-LABEL: define{{.*}} void @f18()
150
anatofuz
parents:
diff changeset
198 // CHECK: call i32 @returns_int()
anatofuz
parents:
diff changeset
199
anatofuz
parents:
diff changeset
200 // Ensure the right stmt is returned
anatofuz
parents:
diff changeset
201 int f19() {
anatofuz
parents:
diff changeset
202 return ({ 3;;4;; });
anatofuz
parents:
diff changeset
203 }
207
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
204 // CHECK-LABEL: define{{.*}} i32 @f19()
150
anatofuz
parents:
diff changeset
205 // CHECK: [[T:%.*]] = alloca i32
anatofuz
parents:
diff changeset
206 // CHECK: store i32 4, i32* [[T]]
anatofuz
parents:
diff changeset
207 // CHECK: [[L:%.*]] = load i32, i32* [[T]]
anatofuz
parents:
diff changeset
208 // CHECK: ret i32 [[L]]