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