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: load {{.*}}* [[Xaddr]]
    131 // CHECK-NEXT: getelementptr inbounds [100 x i32]* %A, i32 0,
    132 // CHECK-NEXT: load i32*
    133 }
    134 
    135 int f12() {
    136   // PR3150
    137   // CHECK-LABEL: define i32 @f12
    138   // CHECK: ret i32 1
    139   return 1||1;
    140 }
    141 
    142 // Make sure negate of fp uses -0.0 for proper -0 handling.
    143 double f13(double X) {
    144   // CHECK-LABEL: define double @f13
    145   // CHECK: fsub double -0.0
    146   return -X;
    147 }
    148 
    149 // Check operations on incomplete types.
    150 void f14(struct s14 *a) {
    151   (void) &*a;
    152 }
    153 
    154 // CHECK-LABEL: define void @f15
    155 void f15() {
    156   extern void f15_start(void);
    157   f15_start();
    158   // CHECK: call void @f15_start()
    159 
    160   extern void *f15_v(void);
    161   extern const void *f15_cv(void);
    162   extern volatile void *f15_vv(void);
    163   *f15_v(); *f15_v(), *f15_v(); f15_v() ? *f15_v() : *f15_v();
    164   *f15_cv(); *f15_cv(), *f15_cv(); f15_cv() ? *f15_cv() : *f15_cv();
    165   *f15_vv(); *f15_vv(), *f15_vv(); f15_vv() ? *f15_vv() : *f15_vv();
    166   // CHECK-NOT: load
    167   // CHECK: ret void
    168 }
    169 
    170 // PR8967: this was crashing
    171 // CHECK-LABEL: define void @f16()
    172 void f16() {
    173   __extension__({ goto lbl; });
    174  lbl:
    175   ;
    176 }
    177 
    178 // PR13704: negative increment in i128 is not preserved.
    179 // CHECK-LABEL: define void @f17()
    180 void f17() {
    181   extern void extfunc(__int128);
    182   __int128 x = 2;
    183   x--;
    184   extfunc(x);
    185 // CHECK: add nsw i128 %{{.}}, -1
    186 }
    187