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