xref: /llvm-project/clang/test/CodeGen/allow-ubsan-check.c (revision ef92e6b99fc2a881f70c4e21bbdd6ae7a0c446c8)
1 // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -O1 -o - %s -fsanitize=signed-integer-overflow,integer-divide-by-zero,null,local-bounds -mllvm -ubsan-guard-checks | FileCheck %s
3 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -O1 -o - %s -fsanitize=signed-integer-overflow,integer-divide-by-zero,null,local-bounds -mllvm -ubsan-guard-checks -fsanitize-trap=signed-integer-overflow,integer-divide-by-zero,null,local-bounds | FileCheck %s --check-prefixes=TR
4 // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -O1 -o - %s -fsanitize=signed-integer-overflow,integer-divide-by-zero,null,local-bounds -mllvm -ubsan-guard-checks -fsanitize-recover=signed-integer-overflow,integer-divide-by-zero,null,local-bounds | FileCheck %s --check-prefixes=REC
5 
6 
7 // CHECK-LABEL: define dso_local noundef i32 @div(
8 // CHECK-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
9 // CHECK-NEXT:  [[ENTRY:.*:]]
10 // CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[Y]], 0, !nosanitize [[META2:![0-9]+]]
11 // CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i32 [[X]], -2147483648, !nosanitize [[META2]]
12 // CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[Y]], -1, !nosanitize [[META2]]
13 // CHECK-NEXT:    [[OR_NOT5:%.*]] = and i1 [[TMP1]], [[TMP2]]
14 // CHECK-NEXT:    [[DOTNOT3:%.*]] = or i1 [[TMP0]], [[OR_NOT5]]
15 // CHECK-NEXT:    [[TMP3:%.*]] = tail call i1 @llvm.allow.ubsan.check(i8 3), !nosanitize [[META2]]
16 // CHECK-NEXT:    [[DOTNOT1:%.*]] = and i1 [[DOTNOT3]], [[TMP3]]
17 // CHECK-NEXT:    br i1 [[DOTNOT1]], label %[[HANDLER_DIVREM_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
18 // CHECK:       [[HANDLER_DIVREM_OVERFLOW]]:
19 // CHECK-NEXT:    [[TMP4:%.*]] = zext i32 [[X]] to i64, !nosanitize [[META2]]
20 // CHECK-NEXT:    [[TMP5:%.*]] = zext i32 [[Y]] to i64, !nosanitize [[META2]]
21 // CHECK-NEXT:    tail call void @__ubsan_handle_divrem_overflow_abort(ptr nonnull @[[GLOB1:[0-9]+]], i64 [[TMP4]], i64 [[TMP5]]) #[[ATTR6:[0-9]+]], !nosanitize [[META2]]
22 // CHECK-NEXT:    unreachable, !nosanitize [[META2]]
23 // CHECK:       [[CONT]]:
24 // CHECK-NEXT:    [[DIV:%.*]] = sdiv i32 [[X]], [[Y]]
25 // CHECK-NEXT:    ret i32 [[DIV]]
26 //
27 // TR-LABEL: define dso_local noundef i32 @div(
28 // TR-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
29 // TR-NEXT:  [[ENTRY:.*:]]
30 // TR-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[Y]], 0, !nosanitize [[META2:![0-9]+]]
31 // TR-NEXT:    [[TMP1:%.*]] = icmp eq i32 [[X]], -2147483648, !nosanitize [[META2]]
32 // TR-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[Y]], -1, !nosanitize [[META2]]
33 // TR-NEXT:    [[OR_NOT5:%.*]] = and i1 [[TMP1]], [[TMP2]]
34 // TR-NEXT:    [[DOTNOT3:%.*]] = or i1 [[TMP0]], [[OR_NOT5]]
35 // TR-NEXT:    [[TMP3:%.*]] = tail call i1 @llvm.allow.ubsan.check(i8 3), !nosanitize [[META2]]
36 // TR-NEXT:    [[DOTNOT1:%.*]] = and i1 [[DOTNOT3]], [[TMP3]]
37 // TR-NEXT:    br i1 [[DOTNOT1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
38 // TR:       [[TRAP]]:
39 // TR-NEXT:    tail call void @llvm.ubsantrap(i8 3) #[[ATTR5:[0-9]+]], !nosanitize [[META2]]
40 // TR-NEXT:    unreachable, !nosanitize [[META2]]
41 // TR:       [[CONT]]:
42 // TR-NEXT:    [[DIV:%.*]] = sdiv i32 [[X]], [[Y]]
43 // TR-NEXT:    ret i32 [[DIV]]
44 //
45 // REC-LABEL: define dso_local noundef i32 @div(
46 // REC-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
47 // REC-NEXT:  [[ENTRY:.*:]]
48 // REC-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[Y]], 0, !nosanitize [[META2:![0-9]+]]
49 // REC-NEXT:    [[TMP1:%.*]] = icmp eq i32 [[X]], -2147483648, !nosanitize [[META2]]
50 // REC-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[Y]], -1, !nosanitize [[META2]]
51 // REC-NEXT:    [[OR_NOT5:%.*]] = and i1 [[TMP1]], [[TMP2]]
52 // REC-NEXT:    [[DOTNOT3:%.*]] = or i1 [[TMP0]], [[OR_NOT5]]
53 // REC-NEXT:    [[TMP3:%.*]] = tail call i1 @llvm.allow.ubsan.check(i8 3), !nosanitize [[META2]]
54 // REC-NEXT:    [[DOTNOT1:%.*]] = and i1 [[DOTNOT3]], [[TMP3]]
55 // REC-NEXT:    br i1 [[DOTNOT1]], label %[[HANDLER_DIVREM_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]]
56 // REC:       [[HANDLER_DIVREM_OVERFLOW]]:
57 // REC-NEXT:    [[TMP4:%.*]] = zext i32 [[X]] to i64, !nosanitize [[META2]]
58 // REC-NEXT:    [[TMP5:%.*]] = zext i32 [[Y]] to i64, !nosanitize [[META2]]
59 // REC-NEXT:    tail call void @__ubsan_handle_divrem_overflow(ptr nonnull @[[GLOB1:[0-9]+]], i64 [[TMP4]], i64 [[TMP5]]) #[[ATTR6:[0-9]+]], !nosanitize [[META2]]
60 // REC-NEXT:    br label %[[CONT]], !nosanitize [[META2]]
61 // REC:       [[CONT]]:
62 // REC-NEXT:    [[DIV:%.*]] = sdiv i32 [[X]], [[Y]]
63 // REC-NEXT:    ret i32 [[DIV]]
64 //
65 int div(int x, int y) {
66   return x / y;
67 }
68 
69 // CHECK-LABEL: define dso_local i32 @null(
70 // CHECK-SAME: ptr noundef readonly [[X:%.*]]) local_unnamed_addr #[[ATTR0]] {
71 // CHECK-NEXT:  [[ENTRY:.*:]]
72 // CHECK-NEXT:    [[TMP0:%.*]] = icmp eq ptr [[X]], null, !nosanitize [[META2]]
73 // CHECK-NEXT:    [[TMP1:%.*]] = tail call i1 @llvm.allow.ubsan.check(i8 22), !nosanitize [[META2]]
74 // CHECK-NEXT:    [[DOTNOT1:%.*]] = and i1 [[TMP0]], [[TMP1]]
75 // CHECK-NEXT:    br i1 [[DOTNOT1]], label %[[HANDLER_TYPE_MISMATCH:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
76 // CHECK:       [[HANDLER_TYPE_MISMATCH]]:
77 // CHECK-NEXT:    tail call void @__ubsan_handle_type_mismatch_v1_abort(ptr nonnull @[[GLOB2:[0-9]+]], i64 0) #[[ATTR6]], !nosanitize [[META2]]
78 // CHECK-NEXT:    unreachable, !nosanitize [[META2]]
79 // CHECK:       [[CONT]]:
80 // CHECK-NEXT:    [[TMP2:%.*]] = load i32, ptr [[X]], align 4, !tbaa [[TBAA4:![0-9]+]]
81 // CHECK-NEXT:    ret i32 [[TMP2]]
82 //
83 // TR-LABEL: define dso_local i32 @null(
84 // TR-SAME: ptr noundef readonly [[X:%.*]]) local_unnamed_addr #[[ATTR0]] {
85 // TR-NEXT:  [[ENTRY:.*:]]
86 // TR-NEXT:    [[TMP0:%.*]] = icmp eq ptr [[X]], null, !nosanitize [[META2]]
87 // TR-NEXT:    [[TMP1:%.*]] = tail call i1 @llvm.allow.ubsan.check(i8 22), !nosanitize [[META2]]
88 // TR-NEXT:    [[DOTNOT1:%.*]] = and i1 [[TMP0]], [[TMP1]]
89 // TR-NEXT:    br i1 [[DOTNOT1]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
90 // TR:       [[TRAP]]:
91 // TR-NEXT:    tail call void @llvm.ubsantrap(i8 22) #[[ATTR5]], !nosanitize [[META2]]
92 // TR-NEXT:    unreachable, !nosanitize [[META2]]
93 // TR:       [[CONT]]:
94 // TR-NEXT:    [[TMP2:%.*]] = load i32, ptr [[X]], align 4, !tbaa [[TBAA3:![0-9]+]]
95 // TR-NEXT:    ret i32 [[TMP2]]
96 //
97 // REC-LABEL: define dso_local i32 @null(
98 // REC-SAME: ptr noundef readonly [[X:%.*]]) local_unnamed_addr #[[ATTR0]] {
99 // REC-NEXT:  [[ENTRY:.*:]]
100 // REC-NEXT:    [[TMP0:%.*]] = icmp eq ptr [[X]], null, !nosanitize [[META2]]
101 // REC-NEXT:    [[TMP1:%.*]] = tail call i1 @llvm.allow.ubsan.check(i8 22), !nosanitize [[META2]]
102 // REC-NEXT:    [[DOTNOT1:%.*]] = and i1 [[TMP0]], [[TMP1]]
103 // REC-NEXT:    br i1 [[DOTNOT1]], label %[[HANDLER_TYPE_MISMATCH:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
104 // REC:       [[HANDLER_TYPE_MISMATCH]]:
105 // REC-NEXT:    tail call void @__ubsan_handle_type_mismatch_v1(ptr nonnull @[[GLOB2:[0-9]+]], i64 0) #[[ATTR6]], !nosanitize [[META2]]
106 // REC-NEXT:    br label %[[CONT]], !nosanitize [[META2]]
107 // REC:       [[CONT]]:
108 // REC-NEXT:    [[TMP2:%.*]] = load i32, ptr [[X]], align 4, !tbaa [[TBAA4:![0-9]+]]
109 // REC-NEXT:    ret i32 [[TMP2]]
110 //
111 int null(int* x) {
112   return *x;
113 }
114 
115 // CHECK-LABEL: define dso_local noundef i32 @overflow(
116 // CHECK-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
117 // CHECK-NEXT:  [[ENTRY:.*:]]
118 // CHECK-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 [[Y]]), !nosanitize [[META2]]
119 // CHECK-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
120 // CHECK-NEXT:    [[TMP2:%.*]] = tail call i1 @llvm.allow.ubsan.check(i8 0), !nosanitize [[META2]]
121 // CHECK-NEXT:    [[DOTDEMORGAN:%.*]] = and i1 [[TMP1]], [[TMP2]]
122 // CHECK-NEXT:    br i1 [[DOTDEMORGAN]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
123 // CHECK:       [[HANDLER_ADD_OVERFLOW]]:
124 // CHECK-NEXT:    [[TMP3:%.*]] = zext i32 [[X]] to i64, !nosanitize [[META2]]
125 // CHECK-NEXT:    [[TMP4:%.*]] = zext i32 [[Y]] to i64, !nosanitize [[META2]]
126 // CHECK-NEXT:    tail call void @__ubsan_handle_add_overflow_abort(ptr nonnull @[[GLOB3:[0-9]+]], i64 [[TMP3]], i64 [[TMP4]]) #[[ATTR6]], !nosanitize [[META2]]
127 // CHECK-NEXT:    unreachable, !nosanitize [[META2]]
128 // CHECK:       [[CONT]]:
129 // CHECK-NEXT:    [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
130 // CHECK-NEXT:    ret i32 [[TMP5]]
131 //
132 // TR-LABEL: define dso_local noundef i32 @overflow(
133 // TR-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
134 // TR-NEXT:  [[ENTRY:.*:]]
135 // TR-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 [[Y]]), !nosanitize [[META2]]
136 // TR-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
137 // TR-NEXT:    [[TMP2:%.*]] = tail call i1 @llvm.allow.ubsan.check(i8 0), !nosanitize [[META2]]
138 // TR-NEXT:    [[DOTDEMORGAN:%.*]] = and i1 [[TMP1]], [[TMP2]]
139 // TR-NEXT:    br i1 [[DOTDEMORGAN]], label %[[TRAP:.*]], label %[[CONT:.*]], !nosanitize [[META2]]
140 // TR:       [[TRAP]]:
141 // TR-NEXT:    tail call void @llvm.ubsantrap(i8 0) #[[ATTR5]], !nosanitize [[META2]]
142 // TR-NEXT:    unreachable, !nosanitize [[META2]]
143 // TR:       [[CONT]]:
144 // TR-NEXT:    [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
145 // TR-NEXT:    ret i32 [[TMP3]]
146 //
147 // REC-LABEL: define dso_local noundef i32 @overflow(
148 // REC-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) local_unnamed_addr #[[ATTR0]] {
149 // REC-NEXT:  [[ENTRY:.*:]]
150 // REC-NEXT:    [[TMP0:%.*]] = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[X]], i32 [[Y]]), !nosanitize [[META2]]
151 // REC-NEXT:    [[TMP1:%.*]] = extractvalue { i32, i1 } [[TMP0]], 1, !nosanitize [[META2]]
152 // REC-NEXT:    [[TMP2:%.*]] = tail call i1 @llvm.allow.ubsan.check(i8 0), !nosanitize [[META2]]
153 // REC-NEXT:    [[DOTDEMORGAN:%.*]] = and i1 [[TMP1]], [[TMP2]]
154 // REC-NEXT:    br i1 [[DOTDEMORGAN]], label %[[HANDLER_ADD_OVERFLOW:.*]], label %[[CONT:.*]], !prof [[PROF3]], !nosanitize [[META2]]
155 // REC:       [[HANDLER_ADD_OVERFLOW]]:
156 // REC-NEXT:    [[TMP3:%.*]] = zext i32 [[X]] to i64, !nosanitize [[META2]]
157 // REC-NEXT:    [[TMP4:%.*]] = zext i32 [[Y]] to i64, !nosanitize [[META2]]
158 // REC-NEXT:    tail call void @__ubsan_handle_add_overflow(ptr nonnull @[[GLOB3:[0-9]+]], i64 [[TMP3]], i64 [[TMP4]]) #[[ATTR6]], !nosanitize [[META2]]
159 // REC-NEXT:    br label %[[CONT]], !nosanitize [[META2]]
160 // REC:       [[CONT]]:
161 // REC-NEXT:    [[TMP5:%.*]] = extractvalue { i32, i1 } [[TMP0]], 0, !nosanitize [[META2]]
162 // REC-NEXT:    ret i32 [[TMP5]]
163 //
164 int overflow(int x, int y) {
165   return x + y;
166 }
167 
168 void use(double*);
169 
170 // CHECK-LABEL: define dso_local double @lbounds(
171 // CHECK-SAME: i32 noundef [[B:%.*]], i32 noundef [[I:%.*]]) local_unnamed_addr #[[ATTR0]] {
172 // CHECK-NEXT:  [[ENTRY:.*:]]
173 // CHECK-NEXT:    [[TMP0:%.*]] = zext i32 [[B]] to i64
174 // CHECK-NEXT:    [[VLA:%.*]] = alloca double, i64 [[TMP0]], align 16
175 // CHECK-NEXT:    call void @use(ptr noundef nonnull [[VLA]]) #[[ATTR7:[0-9]+]]
176 // CHECK-NEXT:    [[IDXPROM:%.*]] = sext i32 [[I]] to i64
177 // CHECK-NEXT:    [[TMP1:%.*]] = icmp ule i64 [[TMP0]], [[IDXPROM]]
178 // CHECK-NEXT:    [[TMP2:%.*]] = call i1 @llvm.allow.ubsan.check(i8 71), !nosanitize [[META2]]
179 // CHECK-NEXT:    [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]], !nosanitize [[META2]]
180 // CHECK-NEXT:    br i1 [[TMP3]], label %[[TRAP:.*]], label %[[BB4:.*]]
181 // CHECK:       [[BB4]]:
182 // CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[VLA]], i64 [[IDXPROM]]
183 // CHECK-NEXT:    [[TMP5:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA8:![0-9]+]]
184 // CHECK-NEXT:    ret double [[TMP5]]
185 // CHECK:       [[TRAP]]:
186 // CHECK-NEXT:    call void @__ubsan_handle_local_out_of_bounds_abort() #[[ATTR6]], !nosanitize [[META2]]
187 // CHECK-NEXT:    unreachable, !nosanitize [[META2]]
188 //
189 // TR-LABEL: define dso_local double @lbounds(
190 // TR-SAME: i32 noundef [[B:%.*]], i32 noundef [[I:%.*]]) local_unnamed_addr #[[ATTR0]] {
191 // TR-NEXT:  [[ENTRY:.*:]]
192 // TR-NEXT:    [[TMP0:%.*]] = zext i32 [[B]] to i64
193 // TR-NEXT:    [[VLA:%.*]] = alloca double, i64 [[TMP0]], align 16
194 // TR-NEXT:    call void @use(ptr noundef nonnull [[VLA]]) #[[ATTR6:[0-9]+]]
195 // TR-NEXT:    [[IDXPROM:%.*]] = sext i32 [[I]] to i64
196 // TR-NEXT:    [[TMP1:%.*]] = icmp ule i64 [[TMP0]], [[IDXPROM]]
197 // TR-NEXT:    [[TMP2:%.*]] = call i1 @llvm.allow.ubsan.check(i8 71), !nosanitize [[META2]]
198 // TR-NEXT:    [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]], !nosanitize [[META2]]
199 // TR-NEXT:    br i1 [[TMP3]], label %[[TRAP:.*]], label %[[BB4:.*]]
200 // TR:       [[BB4]]:
201 // TR-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[VLA]], i64 [[IDXPROM]]
202 // TR-NEXT:    [[TMP5:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA7:![0-9]+]]
203 // TR-NEXT:    ret double [[TMP5]]
204 // TR:       [[TRAP]]:
205 // TR-NEXT:    call void @llvm.ubsantrap(i8 71) #[[ATTR5]], !nosanitize [[META2]]
206 // TR-NEXT:    unreachable, !nosanitize [[META2]]
207 //
208 // REC-LABEL: define dso_local double @lbounds(
209 // REC-SAME: i32 noundef [[B:%.*]], i32 noundef [[I:%.*]]) local_unnamed_addr #[[ATTR0]] {
210 // REC-NEXT:  [[ENTRY:.*:]]
211 // REC-NEXT:    [[TMP0:%.*]] = zext i32 [[B]] to i64
212 // REC-NEXT:    [[VLA:%.*]] = alloca double, i64 [[TMP0]], align 16
213 // REC-NEXT:    call void @use(ptr noundef nonnull [[VLA]]) #[[ATTR5:[0-9]+]]
214 // REC-NEXT:    [[IDXPROM:%.*]] = sext i32 [[I]] to i64
215 // REC-NEXT:    [[TMP1:%.*]] = icmp ule i64 [[TMP0]], [[IDXPROM]]
216 // REC-NEXT:    [[TMP2:%.*]] = call i1 @llvm.allow.ubsan.check(i8 71), !nosanitize [[META2]]
217 // REC-NEXT:    [[TMP3:%.*]] = and i1 [[TMP1]], [[TMP2]], !nosanitize [[META2]]
218 // REC-NEXT:    br i1 [[TMP3]], label %[[TRAP:.*]], label %[[BB4:.*]]
219 // REC:       [[BB4]]:
220 // REC-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds double, ptr [[VLA]], i64 [[IDXPROM]]
221 // REC-NEXT:    [[TMP5:%.*]] = load double, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA8:![0-9]+]]
222 // REC-NEXT:    ret double [[TMP5]]
223 // REC:       [[TRAP]]:
224 // REC-NEXT:    call void @__ubsan_handle_local_out_of_bounds() #[[ATTR6]], !nosanitize [[META2]]
225 // REC-NEXT:    br label %[[BB4]], !nosanitize [[META2]]
226 //
227 double lbounds(int b, int i) {
228   double a[b];
229   use(a);
230   return a[i];
231 }
232 
233 //.
234 // CHECK: [[META2]] = !{}
235 // CHECK: [[PROF3]] = !{!"branch_weights", i32 1, i32 1048575}
236 // CHECK: [[TBAA4]] = !{[[META5:![0-9]+]], [[META5]], i64 0}
237 // CHECK: [[META5]] = !{!"int", [[META6:![0-9]+]], i64 0}
238 // CHECK: [[META6]] = !{!"omnipotent char", [[META7:![0-9]+]], i64 0}
239 // CHECK: [[META7]] = !{!"Simple C/C++ TBAA"}
240 // CHECK: [[TBAA8]] = !{[[META9:![0-9]+]], [[META9]], i64 0}
241 // CHECK: [[META9]] = !{!"double", [[META6]], i64 0}
242 //.
243 // TR: [[META2]] = !{}
244 // TR: [[TBAA3]] = !{[[META4:![0-9]+]], [[META4]], i64 0}
245 // TR: [[META4]] = !{!"int", [[META5:![0-9]+]], i64 0}
246 // TR: [[META5]] = !{!"omnipotent char", [[META6:![0-9]+]], i64 0}
247 // TR: [[META6]] = !{!"Simple C/C++ TBAA"}
248 // TR: [[TBAA7]] = !{[[META8:![0-9]+]], [[META8]], i64 0}
249 // TR: [[META8]] = !{!"double", [[META5]], i64 0}
250 //.
251 // REC: [[META2]] = !{}
252 // REC: [[PROF3]] = !{!"branch_weights", i32 1, i32 1048575}
253 // REC: [[TBAA4]] = !{[[META5:![0-9]+]], [[META5]], i64 0}
254 // REC: [[META5]] = !{!"int", [[META6:![0-9]+]], i64 0}
255 // REC: [[META6]] = !{!"omnipotent char", [[META7:![0-9]+]], i64 0}
256 // REC: [[META7]] = !{!"Simple C/C++ TBAA"}
257 // REC: [[TBAA8]] = !{[[META9:![0-9]+]], [[META9]], i64 0}
258 // REC: [[META9]] = !{!"double", [[META6]], i64 0}
259 //.
260