Skip to content

Commit 7d482e9

Browse files
committed
Fix TBAA for unsigned fixed-point types
Summary: Unsigned types can alias the corresponding signed types. I don't see that this is explicitly mentioned in the Embedded-C specification, but I think it should work the same as for the integer types. Patch by: materi Reviewers: ebevhan, leonardchan Reviewed By: leonardchan Subscribers: kosarev, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D76856
1 parent a98662f commit 7d482e9

File tree

2 files changed

+137
-0
lines changed

2 files changed

+137
-0
lines changed

clang/lib/CodeGen/CodeGenTBAA.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,34 @@ llvm::MDNode *CodeGenTBAA::getTypeInfoHelper(const Type *Ty) {
141141
case BuiltinType::UInt128:
142142
return getTypeInfo(Context.Int128Ty);
143143

144+
case BuiltinType::UShortFract:
145+
return getTypeInfo(Context.ShortFractTy);
146+
case BuiltinType::UFract:
147+
return getTypeInfo(Context.FractTy);
148+
case BuiltinType::ULongFract:
149+
return getTypeInfo(Context.LongFractTy);
150+
151+
case BuiltinType::SatUShortFract:
152+
return getTypeInfo(Context.SatShortFractTy);
153+
case BuiltinType::SatUFract:
154+
return getTypeInfo(Context.SatFractTy);
155+
case BuiltinType::SatULongFract:
156+
return getTypeInfo(Context.SatLongFractTy);
157+
158+
case BuiltinType::UShortAccum:
159+
return getTypeInfo(Context.ShortAccumTy);
160+
case BuiltinType::UAccum:
161+
return getTypeInfo(Context.AccumTy);
162+
case BuiltinType::ULongAccum:
163+
return getTypeInfo(Context.LongAccumTy);
164+
165+
case BuiltinType::SatUShortAccum:
166+
return getTypeInfo(Context.SatShortAccumTy);
167+
case BuiltinType::SatUAccum:
168+
return getTypeInfo(Context.SatAccumTy);
169+
case BuiltinType::SatULongAccum:
170+
return getTypeInfo(Context.SatLongAccumTy);
171+
144172
// Treat all other builtin types as distinct types. This includes
145173
// treating wchar_t, char16_t, and char32_t as distinct from their
146174
// "underlying types".
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
// RUN: %clang_cc1 -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"

0 commit comments

Comments
 (0)