1986b5d156daa3c4463b2ad75df5ece0fc6e1866fDaniel Dunbar// RUN: %clang_cc1 -triple x86_64-unknown-unknown %s -emit-llvm -o - | FileCheck %s
2efdd1574e3cca00ef0410aee8b7ee36eda5a2f71Chris Lattner
3efdd1574e3cca00ef0410aee8b7ee36eda5a2f71Chris Lattner// PR1895
4efdd1574e3cca00ef0410aee8b7ee36eda5a2f71Chris Lattner// sizeof function
5efdd1574e3cca00ef0410aee8b7ee36eda5a2f71Chris Lattnerint zxcv(void);
6efdd1574e3cca00ef0410aee8b7ee36eda5a2f71Chris Lattnerint x=sizeof(zxcv);
7efdd1574e3cca00ef0410aee8b7ee36eda5a2f71Chris Lattnerint y=__alignof__(zxcv);
8efdd1574e3cca00ef0410aee8b7ee36eda5a2f71Chris Lattner
98f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner
108f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattnervoid *test(int *i) {
118f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner short a = 1;
128f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner i += a;
138f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner i + a;
148f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner a + i;
158f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner}
168f925280abe3795ae0fb47f2ba90faea62e26af4Chris Lattner
1701e3c9e06db9ba5729272879c2c9c4659354e707Chris Lattner_Bool test2b;
18c36541e7bfa69cc63e2668a986bc99117559c545Mike Stumpint test2() { if (test2b); return 0; }
1901e3c9e06db9ba5729272879c2c9c4659354e707Chris Lattner
206860f3cef7d5ed22cf7626e357c202124c43c899Chris Lattner// PR1921
216860f3cef7d5ed22cf7626e357c202124c43c899Chris Lattnerint test3() {
226860f3cef7d5ed22cf7626e357c202124c43c899Chris Lattner  const unsigned char *bp;
236860f3cef7d5ed22cf7626e357c202124c43c899Chris Lattner  bp -= (short)1;
246860f3cef7d5ed22cf7626e357c202124c43c899Chris Lattner}
256860f3cef7d5ed22cf7626e357c202124c43c899Chris Lattner
26a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattner// PR2080 - sizeof void
27a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattnerint t1 = sizeof(void);
28a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattnerint t2 = __alignof__(void);
29a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattnervoid test4() {
30a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattner  t1 = sizeof(void);
31a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattner  t2 = __alignof__(void);
32a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattner
33a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattner  t1 = sizeof(test4());
34a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattner  t2 = __alignof__(test4());
35a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattner}
36a269ebfd91c4fa47e051fa1fa904833a022fe025Chris Lattner
373cc5e5b5268d7359c818ca5a2b62a339923020c4Chris Lattner// 'const float' promotes to double in varargs.
383cc5e5b5268d7359c818ca5a2b62a339923020c4Chris Lattnerint test5(const float x, float float_number) {
393cc5e5b5268d7359c818ca5a2b62a339923020c4Chris Lattner  return __builtin_isless(x, float_number);
403cc5e5b5268d7359c818ca5a2b62a339923020c4Chris Lattner}
413cc5e5b5268d7359c818ca5a2b62a339923020c4Chris Lattner
42f9ef0c675b12ab53fdd6c4e3e7226d066d293e99Nuno Lopes// this one shouldn't fold
43f9ef0c675b12ab53fdd6c4e3e7226d066d293e99Nuno Lopesint ola() {
44f9ef0c675b12ab53fdd6c4e3e7226d066d293e99Nuno Lopes  int a=2;
45f9ef0c675b12ab53fdd6c4e3e7226d066d293e99Nuno Lopes  if ((0, (int)a) & 2) { return 1; }
46f9ef0c675b12ab53fdd6c4e3e7226d066d293e99Nuno Lopes  return 2;
47f9ef0c675b12ab53fdd6c4e3e7226d066d293e99Nuno Lopes}
48a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes
49a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes// this one shouldn't fold as well
50a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopesvoid eMaisUma() {
511eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  double t[1];
521eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if (*t)
531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return;
54a468d34bed16861f25aff6c8354f4e75d3358c1aNuno Lopes}
55e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner
56e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner// rdar://6520707
57e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattnervoid f0(void (*fp)(void), void (*fp2)(void)) {
58e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner  int x = fp - fp2;
59e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner}
60e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner
61c3953a61f7e2a9919ce18d418f8b26a8612e87f2Chris Lattner// noop casts as lvalues.
62c3953a61f7e2a9919ce18d418f8b26a8612e87f2Chris Lattnerstruct X {
63c3953a61f7e2a9919ce18d418f8b26a8612e87f2Chris Lattner  int Y;
64c3953a61f7e2a9919ce18d418f8b26a8612e87f2Chris Lattner};
65c3953a61f7e2a9919ce18d418f8b26a8612e87f2Chris Lattnerstruct X foo();
66c3953a61f7e2a9919ce18d418f8b26a8612e87f2Chris Lattnerint bar() {
67c3953a61f7e2a9919ce18d418f8b26a8612e87f2Chris Lattner  return ((struct X)foo()).Y + 1;
68c3953a61f7e2a9919ce18d418f8b26a8612e87f2Chris Lattner}
69e5ed15195b71b8fa440e67d49db0168bb58e4e8aChris Lattner
708cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner// PR3809: INC/DEC of function pointers.
718cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattnervoid f2(void);
728cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattnerunsigned f1(void) {
738cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner  void (*fp)(void) = f2;
748cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner
758cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner  ++fp;
768cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner  fp++;
778cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner  --fp;
788cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner  fp--;
798cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner  return (unsigned) fp;
808cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner}
818cc9d08eb8b2652ca939d724ab64dec906e418a0Chris Lattner
8275dfedaf702822c9e51a4f3c5d3ecf2d2ad99272Chris Lattnerunion f3_x {int x; float y;};
8375dfedaf702822c9e51a4f3c5d3ecf2d2ad99272Chris Lattnerint f3() {return ((union f3_x)2).x;}
8475dfedaf702822c9e51a4f3c5d3ecf2d2ad99272Chris Lattner
8540f929242a58103f7883e7dbe2415787895b5cbeChris Lattnerunion f4_y {int x; _Complex float y;};
8640f929242a58103f7883e7dbe2415787895b5cbeChris Lattner_Complex float f4() {return ((union f4_y)(_Complex float)2.0).y;}
8740f929242a58103f7883e7dbe2415787895b5cbeChris Lattner
8840f929242a58103f7883e7dbe2415787895b5cbeChris Lattnerstruct f5_a { int a; } f5_a;
8940f929242a58103f7883e7dbe2415787895b5cbeChris Lattnerunion f5_z {int x; struct f5_a y;};
9040f929242a58103f7883e7dbe2415787895b5cbeChris Lattnerstruct f5_a f5() {return ((union f5_z)f5_a).y;}
919034558f2f9ac1dc6bd2e74f4481ca62fce28718Daniel Dunbar
929034558f2f9ac1dc6bd2e74f4481ca62fce28718Daniel Dunbar// ?: in "lvalue"
939034558f2f9ac1dc6bd2e74f4481ca62fce28718Daniel Dunbarstruct s6 { int f0; };
949034558f2f9ac1dc6bd2e74f4481ca62fce28718Daniel Dunbarint f6(int a0, struct s6 a1, struct s6 a2) {
959034558f2f9ac1dc6bd2e74f4481ca62fce28718Daniel Dunbar  return (a0 ? a1 : a2).f0;
969034558f2f9ac1dc6bd2e74f4481ca62fce28718Daniel Dunbar}
97f0a990c2aa0b596a7e3cdd8fa2a5909d591ffe66Chris Lattner
98f0a990c2aa0b596a7e3cdd8fa2a5909d591ffe66Chris Lattner// PR4026
99f0a990c2aa0b596a7e3cdd8fa2a5909d591ffe66Chris Lattnervoid f7() {
100f0a990c2aa0b596a7e3cdd8fa2a5909d591ffe66Chris Lattner  __func__;
101f0a990c2aa0b596a7e3cdd8fa2a5909d591ffe66Chris Lattner}
102654599454c8e6cc83b1b9b3af43c49c2f66a26cbChris Lattner
103654599454c8e6cc83b1b9b3af43c49c2f66a26cbChris Lattner// PR4067
104654599454c8e6cc83b1b9b3af43c49c2f66a26cbChris Lattnerint f8() {
105654599454c8e6cc83b1b9b3af43c49c2f66a26cbChris Lattner  return ({ foo(); }).Y;
106654599454c8e6cc83b1b9b3af43c49c2f66a26cbChris Lattner}
1077a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattner
1087a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattner// rdar://6880558
1097a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattnerstruct S;
1107a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattnerstruct C {
1117a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattner  int i;
1127a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattner  struct S *tab[];
1137a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattner};
1147a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattnerstruct S { struct C c; };
1157a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattnervoid f9(struct S *x) {
1167a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattner  foo(((void)1, x->c).tab[0]);
1177a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattner}
1187a574ccd5247189693e0764bf1f5711d33ca6064Chris Lattner
119c08582ba5eef9383702fd3e434de1a6f2f470e3cChris Lattnervoid f10() {
120c08582ba5eef9383702fd3e434de1a6f2f470e3cChris Lattner  __builtin_sin(0);
121c08582ba5eef9383702fd3e434de1a6f2f470e3cChris Lattner}
1229269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner
1239269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner// rdar://7530813
12493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define i32 @f11
1259269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattnerint f11(long X) {
1269269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner  int A[100];
1279269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner  return A[X];
1289269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner
129986b5d156daa3c4463b2ad75df5ece0fc6e1866fDaniel Dunbar// CHECK: [[Xaddr:%[^ ]+]] = alloca i64, align 8
130986b5d156daa3c4463b2ad75df5ece0fc6e1866fDaniel Dunbar// CHECK: load {{.*}}* [[Xaddr]]
1319269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner// CHECK-NEXT: getelementptr inbounds [100 x i32]* %A, i32 0,
1329269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner// CHECK-NEXT: load i32*
1339269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner}
1349269d5c05bebe634dc9f08a37b192c6977fbc067Chris Lattner
135f70d857cbd79b24cb69f4990e31175e95e679a31Chris Lattnerint f12() {
136f70d857cbd79b24cb69f4990e31175e95e679a31Chris Lattner  // PR3150
13793ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define i32 @f12
138f70d857cbd79b24cb69f4990e31175e95e679a31Chris Lattner  // CHECK: ret i32 1
139f70d857cbd79b24cb69f4990e31175e95e679a31Chris Lattner  return 1||1;
140f70d857cbd79b24cb69f4990e31175e95e679a31Chris Lattner}
1414ac0d83090c750bd8ab2c4fc91a6a44c32884cb3Chris Lattner
1424ac0d83090c750bd8ab2c4fc91a6a44c32884cb3Chris Lattner// Make sure negate of fp uses -0.0 for proper -0 handling.
1434ac0d83090c750bd8ab2c4fc91a6a44c32884cb3Chris Lattnerdouble f13(double X) {
14493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin  // CHECK-LABEL: define double @f13
145ce88d0f015344255d6367914374629fbadb99b94Chris Lattner  // CHECK: fsub double -0.0
1464ac0d83090c750bd8ab2c4fc91a6a44c32884cb3Chris Lattner  return -X;
1474ac0d83090c750bd8ab2c4fc91a6a44c32884cb3Chris Lattner}
148f52697a589c1fdd0ff101c472b904d4546e1d373Daniel Dunbar
149f52697a589c1fdd0ff101c472b904d4546e1d373Daniel Dunbar// Check operations on incomplete types.
15085515d64c15838eadb3ffe82b635f8217b04be8aJohn McCallvoid f14(struct s14 *a) {
151f52697a589c1fdd0ff101c472b904d4546e1d373Daniel Dunbar  (void) &*a;
152f52697a589c1fdd0ff101c472b904d4546e1d373Daniel Dunbar}
153f52697a589c1fdd0ff101c472b904d4546e1d373Daniel Dunbar
15493ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f15
155fd569004b78124c1041feee75a1e311166268c8dJohn McCallvoid f15() {
156fd569004b78124c1041feee75a1e311166268c8dJohn McCall  extern void f15_start(void);
157fd569004b78124c1041feee75a1e311166268c8dJohn McCall  f15_start();
158fd569004b78124c1041feee75a1e311166268c8dJohn McCall  // CHECK: call void @f15_start()
159fd569004b78124c1041feee75a1e311166268c8dJohn McCall
160fd569004b78124c1041feee75a1e311166268c8dJohn McCall  extern void *f15_v(void);
161fd569004b78124c1041feee75a1e311166268c8dJohn McCall  extern const void *f15_cv(void);
162fd569004b78124c1041feee75a1e311166268c8dJohn McCall  extern volatile void *f15_vv(void);
163fd569004b78124c1041feee75a1e311166268c8dJohn McCall  *f15_v(); *f15_v(), *f15_v(); f15_v() ? *f15_v() : *f15_v();
164fd569004b78124c1041feee75a1e311166268c8dJohn McCall  *f15_cv(); *f15_cv(), *f15_cv(); f15_cv() ? *f15_cv() : *f15_cv();
165fd569004b78124c1041feee75a1e311166268c8dJohn McCall  *f15_vv(); *f15_vv(), *f15_vv(); f15_vv() ? *f15_vv() : *f15_vv();
166fd569004b78124c1041feee75a1e311166268c8dJohn McCall  // CHECK-NOT: load
16785515d64c15838eadb3ffe82b635f8217b04be8aJohn McCall  // CHECK: ret void
16885515d64c15838eadb3ffe82b635f8217b04be8aJohn McCall}
1698d3d6c93551cc62c6d550f090991bfba1d32d0a4John McCall
1708d3d6c93551cc62c6d550f090991bfba1d32d0a4John McCall// PR8967: this was crashing
17193ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f16()
1728d3d6c93551cc62c6d550f090991bfba1d32d0a4John McCallvoid f16() {
1738d3d6c93551cc62c6d550f090991bfba1d32d0a4John McCall  __extension__({ goto lbl; });
1748d3d6c93551cc62c6d550f090991bfba1d32d0a4John McCall lbl:
1758d3d6c93551cc62c6d550f090991bfba1d32d0a4John McCall  ;
1768d3d6c93551cc62c6d550f090991bfba1d32d0a4John McCall}
177212f80d2ef4b79e42e06bb8525c08eae7d550c1eMichael Liao
178212f80d2ef4b79e42e06bb8525c08eae7d550c1eMichael Liao// PR13704: negative increment in i128 is not preserved.
17993ab6bf534fb6c26563c00f28a8fc5581bb71dfdStephen Lin// CHECK-LABEL: define void @f17()
180212f80d2ef4b79e42e06bb8525c08eae7d550c1eMichael Liaovoid f17() {
181212f80d2ef4b79e42e06bb8525c08eae7d550c1eMichael Liao  extern void extfunc(__int128);
182212f80d2ef4b79e42e06bb8525c08eae7d550c1eMichael Liao  __int128 x = 2;
183212f80d2ef4b79e42e06bb8525c08eae7d550c1eMichael Liao  x--;
184212f80d2ef4b79e42e06bb8525c08eae7d550c1eMichael Liao  extfunc(x);
18547f5a065fcddbebcd66cf86616365055887f4f00Benjamin Kramer// CHECK: add nsw i128 %{{.}}, -1
186212f80d2ef4b79e42e06bb8525c08eae7d550c1eMichael Liao}
187