1 // RUN: %clang_cc1 -no-opaque-pointers -triple x86_64-apple-darwin -O1 -ffixed-point %s -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK 2 // 3 // Check that we generate correct TBAA metadata for fixed-point types. 4 5 void sfract(unsigned short _Fract *p, short _Fract *q, 6 unsigned _Sat short _Fract *r, _Sat short _Fract *s) { 7 // CHECK-LABEL: define{{.*}} void @sfract 8 // CHECK: store i8 -128, i8* %p, align 1, !tbaa [[TAG_sf:!.*]] 9 // CHECK: store i8 -64, i8* %q, align 1, !tbaa [[TAG_sf]] 10 // CHECK: store i8 -128, i8* %r, align 1, !tbaa [[TAG_sat_sf:!.*]] 11 // CHECK: store i8 -64, i8* %s, align 1, !tbaa [[TAG_sat_sf]] 12 *p = 0.5hur; 13 *q = -0.5hr; 14 *r = 0.5hur; 15 *s = -0.5hr; 16 } 17 18 void fract(unsigned _Fract *p, _Fract *q, 19 unsigned _Sat _Fract *r, _Sat _Fract *s) { 20 // CHECK-LABEL: define{{.*}} void @fract 21 // CHECK: store i16 -32768, i16* %p, align 2, !tbaa [[TAG_f:!.*]] 22 // CHECK: store i16 -16384, i16* %q, align 2, !tbaa [[TAG_f]] 23 // CHECK: store i16 -32768, i16* %r, align 2, !tbaa [[TAG_sat_f:!.*]] 24 // CHECK: store i16 -16384, i16* %s, align 2, !tbaa [[TAG_sat_f]] 25 *p = 0.5ur; 26 *q = -0.5r; 27 *r = 0.5ur; 28 *s = -0.5r; 29 } 30 31 void lfract(unsigned long _Fract *p, long _Fract *q, 32 unsigned _Sat long _Fract *r, _Sat long _Fract *s) { 33 // CHECK-LABEL: define{{.*}} void @lfract 34 // CHECK: store i32 -2147483648, i32* %p, align 4, !tbaa [[TAG_lf:!.*]] 35 // CHECK: store i32 -1073741824, i32* %q, align 4, !tbaa [[TAG_lf]] 36 // CHECK: store i32 -2147483648, i32* %r, align 4, !tbaa [[TAG_sat_lf:!.*]] 37 // CHECK: store i32 -1073741824, i32* %s, align 4, !tbaa [[TAG_sat_lf]] 38 *p = 0.5ulr; 39 *q = -0.5lr; 40 *r = 0.5ulr; 41 *s = -0.5lr; 42 } 43 44 void saccum(unsigned short _Accum *p, short _Accum *q, 45 unsigned _Sat short _Accum *r, _Sat short _Accum *s) { 46 // CHECK-LABEL: define{{.*}} void @saccum 47 // CHECK: store i16 128, i16* %p, align 2, !tbaa [[TAG_sk:!.*]] 48 // CHECK: store i16 -64, i16* %q, align 2, !tbaa [[TAG_sk]] 49 // CHECK: store i16 128, i16* %r, align 2, !tbaa [[TAG_sat_sk:!.*]] 50 // CHECK: store i16 -64, i16* %s, align 2, !tbaa [[TAG_sat_sk]] 51 *p = 0.5huk; 52 *q = -0.5hk; 53 *r = 0.5huk; 54 *s = -0.5hk; 55 } 56 57 void accum(unsigned _Accum *p, _Accum *q, 58 unsigned _Sat _Accum *r, _Sat _Accum *s) { 59 // CHECK-LABEL: define{{.*}} void @accum 60 // CHECK: store i32 32768, i32* %p, align 4, !tbaa [[TAG_k:!.*]] 61 // CHECK: store i32 -16384, i32* %q, align 4, !tbaa [[TAG_k]] 62 // CHECK: store i32 32768, i32* %r, align 4, !tbaa [[TAG_sat_k:!.*]] 63 // CHECK: store i32 -16384, i32* %s, align 4, !tbaa [[TAG_sat_k]] 64 *p = 0.5uk; 65 *q = -0.5k; 66 *r = 0.5uk; 67 *s = -0.5k; 68 } 69 70 void laccum(unsigned long _Accum *p, long _Accum *q, 71 unsigned _Sat long _Accum *r, _Sat long _Accum *s) { 72 // CHECK-LABEL: define{{.*}} void @laccum 73 // CHECK: store i64 2147483648, i64* %p, align 8, !tbaa [[TAG_lk:!.*]] 74 // CHECK: store i64 -1073741824, i64* %q, align 8, !tbaa [[TAG_lk]] 75 // CHECK: store i64 2147483648, i64* %r, align 8, !tbaa [[TAG_sat_lk:!.*]] 76 // CHECK: store i64 -1073741824, i64* %s, align 8, !tbaa [[TAG_sat_lk]] 77 *p = 0.5ulk; 78 *q = -0.5lk; 79 *r = 0.5ulk; 80 *s = -0.5lk; 81 } 82 83 // CHECK-DAG: [[TAG_sf]] = !{[[TYPE_sf:!.*]], [[TYPE_sf]], i64 0} 84 // CHECK-DAG: [[TYPE_sf]] = !{!"short _Fract" 85 // CHECK-DAG: [[TAG_f]] = !{[[TYPE_f:!.*]], [[TYPE_f]], i64 0} 86 // CHECK-DAG: [[TYPE_f]] = !{!"_Fract" 87 // CHECK-DAG: [[TAG_lf]] = !{[[TYPE_lf:!.*]], [[TYPE_lf]], i64 0} 88 // CHECK-DAG: [[TYPE_lf]] = !{!"long _Fract" 89 90 // CHECK-DAG: [[TAG_sat_sf]] = !{[[TYPE_sat_sf:!.*]], [[TYPE_sat_sf]], i64 0} 91 // CHECK-DAG: [[TYPE_sat_sf]] = !{!"_Sat short _Fract" 92 // CHECK-DAG: [[TAG_sat_f]] = !{[[TYPE_sat_f:!.*]], [[TYPE_sat_f]], i64 0} 93 // CHECK-DAG: [[TYPE_sat_f]] = !{!"_Sat _Fract" 94 // CHECK-DAG: [[TAG_sat_lf]] = !{[[TYPE_sat_lf:!.*]], [[TYPE_sat_lf]], i64 0} 95 // CHECK-DAG: [[TYPE_sat_lf]] = !{!"_Sat long _Fract" 96 97 // CHECK-DAG: [[TAG_sk]] = !{[[TYPE_sk:!.*]], [[TYPE_sk]], i64 0} 98 // CHECK-DAG: [[TYPE_sk]] = !{!"short _Accum" 99 // CHECK-DAG: [[TAG_k]] = !{[[TYPE_k:!.*]], [[TYPE_k]], i64 0} 100 // CHECK-DAG: [[TYPE_k]] = !{!"_Accum" 101 // CHECK-DAG: [[TAG_lk]] = !{[[TYPE_lk:!.*]], [[TYPE_lk]], i64 0} 102 // CHECK-DAG: [[TYPE_lk]] = !{!"long _Accum" 103 104 // CHECK-DAG: [[TAG_sat_sk]] = !{[[TYPE_sat_sk:!.*]], [[TYPE_sat_sk]], i64 0} 105 // CHECK-DAG: [[TYPE_sat_sk]] = !{!"_Sat short _Accum" 106 // CHECK-DAG: [[TAG_sat_k]] = !{[[TYPE_sat_k:!.*]], [[TYPE_sat_k]], i64 0} 107 // CHECK-DAG: [[TYPE_sat_k]] = !{!"_Sat _Accum" 108 // CHECK-DAG: [[TAG_sat_lk]] = !{[[TYPE_sat_lk:!.*]], [[TYPE_sat_lk]], i64 0} 109 // CHECK-DAG: [[TYPE_sat_lk]] = !{!"_Sat long _Accum" 110