blob: 2af292961a331790de37f3ffe61d2afe5260de94 [file] [log] [blame] [edit]
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 6
// RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - -triple=x86_64-- | FileCheck %s
extern volatile bool b;
extern volatile int i;
extern bool A();
extern bool B();
// CHECK-LABEL: define dso_local noundef zeroext i1 @_Z1fv(
// CHECK-SAME: ) #[[ATTR0:[0-9]+]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[RETVAL:%.*]] = alloca i1, align 1
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6:![0-9]+]], !range [[RNG8:![0-9]+]], !noundef [[META9:![0-9]+]]
// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1
// CHECK-NEXT: [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 true)
// CHECK-NEXT: br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
// CHECK: [[IF_THEN]]:
// CHECK-NEXT: [[CALL:%.*]] = call noundef zeroext i1 @_Z1Av()
// CHECK-NEXT: store i1 [[CALL]], ptr [[RETVAL]], align 1
// CHECK-NEXT: br label %[[RETURN:.*]]
// CHECK: [[IF_END]]:
// CHECK-NEXT: [[CALL1:%.*]] = call noundef zeroext i1 @_Z1Bv()
// CHECK-NEXT: store i1 [[CALL1]], ptr [[RETVAL]], align 1
// CHECK-NEXT: br label %[[RETURN]]
// CHECK: [[RETURN]]:
// CHECK-NEXT: [[TMP1:%.*]] = load i1, ptr [[RETVAL]], align 1
// CHECK-NEXT: ret i1 [[TMP1]]
//
bool f() {
if (b)
[[likely]] {
return A();
}
return B();
}
// CHECK-LABEL: define dso_local noundef zeroext i1 @_Z1gv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[RETVAL:%.*]] = alloca i1, align 1
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]
// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1
// CHECK-NEXT: [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)
// CHECK-NEXT: br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
// CHECK: [[IF_THEN]]:
// CHECK-NEXT: [[CALL:%.*]] = call noundef zeroext i1 @_Z1Av()
// CHECK-NEXT: store i1 [[CALL]], ptr [[RETVAL]], align 1
// CHECK-NEXT: br label %[[RETURN:.*]]
// CHECK: [[IF_END]]:
// CHECK-NEXT: [[CALL1:%.*]] = call noundef zeroext i1 @_Z1Bv()
// CHECK-NEXT: store i1 [[CALL1]], ptr [[RETVAL]], align 1
// CHECK-NEXT: br label %[[RETURN]]
// CHECK: [[RETURN]]:
// CHECK-NEXT: [[TMP1:%.*]] = load i1, ptr [[RETVAL]], align 1
// CHECK-NEXT: ret i1 [[TMP1]]
//
bool g() {
if (b)
[[unlikely]] {
return A();
}
return B();
}
// CHECK-LABEL: define dso_local noundef zeroext i1 @_Z1hv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[RETVAL:%.*]] = alloca i1, align 1
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]
// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1
// CHECK-NEXT: [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)
// CHECK-NEXT: br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
// CHECK: [[IF_THEN]]:
// CHECK-NEXT: [[CALL:%.*]] = call noundef zeroext i1 @_Z1Av()
// CHECK-NEXT: store i1 [[CALL]], ptr [[RETVAL]], align 1
// CHECK-NEXT: br label %[[RETURN:.*]]
// CHECK: [[IF_END]]:
// CHECK-NEXT: [[CALL1:%.*]] = call noundef zeroext i1 @_Z1Bv()
// CHECK-NEXT: store i1 [[CALL1]], ptr [[RETVAL]], align 1
// CHECK-NEXT: br label %[[RETURN]]
// CHECK: [[RETURN]]:
// CHECK-NEXT: [[TMP1:%.*]] = load i1, ptr [[RETVAL]], align 1
// CHECK-NEXT: ret i1 [[TMP1]]
//
bool h() {
if (b)
[[unlikely]] return A();
return B();
}
// CHECK-LABEL: define dso_local void @_Z8NullStmtv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]
// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1
// CHECK-NEXT: [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)
// CHECK-NEXT: br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
// CHECK: [[IF_THEN]]:
// CHECK-NEXT: br label %[[IF_END:.*]]
// CHECK: [[IF_ELSE]]:
// CHECK-NEXT: store volatile i8 1, ptr @b, align 1, !tbaa [[BOOL_TBAA6]]
// CHECK-NEXT: br label %[[IF_END]]
// CHECK: [[IF_END]]:
// CHECK-NEXT: ret void
//
void NullStmt() {
if (b)
[[unlikely]];
else {
// Make sure the branches aren't optimized away.
b = true;
}
}
// CHECK-LABEL: define dso_local void @_Z6IfStmtv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]
// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1
// CHECK-NEXT: [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)
// CHECK-NEXT: br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_END2:.*]]
// CHECK: [[IF_THEN]]:
// CHECK-NEXT: [[CALL:%.*]] = call noundef zeroext i1 @_Z1Bv()
// CHECK-NEXT: br i1 [[CALL]], label %[[IF_THEN1:.*]], label %[[IF_END:.*]]
// CHECK: [[IF_THEN1]]:
// CHECK-NEXT: br label %[[IF_END]]
// CHECK: [[IF_END]]:
// CHECK-NEXT: br label %[[IF_END2]]
// CHECK: [[IF_END2]]:
// CHECK-NEXT: [[TMP1:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]
// CHECK-NEXT: [[LOADEDV3:%.*]] = trunc i8 [[TMP1]] to i1
// CHECK-NEXT: br i1 [[LOADEDV3]], label %[[IF_THEN4:.*]], label %[[IF_END8:.*]]
// CHECK: [[IF_THEN4]]:
// CHECK-NEXT: [[CALL5:%.*]] = call noundef zeroext i1 @_Z1Bv()
// CHECK-NEXT: [[CALL5_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CALL5]], i1 false)
// CHECK-NEXT: br i1 [[CALL5_EXPVAL]], label %[[IF_THEN6:.*]], label %[[IF_END7:.*]]
// CHECK: [[IF_THEN6]]:
// CHECK-NEXT: store volatile i8 0, ptr @b, align 1, !tbaa [[BOOL_TBAA6]]
// CHECK-NEXT: br label %[[IF_END7]]
// CHECK: [[IF_END7]]:
// CHECK-NEXT: br label %[[IF_END8]]
// CHECK: [[IF_END8]]:
// CHECK-NEXT: ret void
//
void IfStmt() {
if (b)
[[unlikely]] if (B()) {}
if (b) {
if (B())
[[unlikely]] { b = false; }
}
}
// CHECK-LABEL: define dso_local void @_Z9WhileStmtv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]
// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1
// CHECK-NEXT: [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)
// CHECK-NEXT: br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
// CHECK: [[IF_THEN]]:
// CHECK-NEXT: br label %[[WHILE_COND:.*]]
// CHECK: [[WHILE_COND]]:
// CHECK-NEXT: [[CALL:%.*]] = call noundef zeroext i1 @_Z1Bv()
// CHECK-NEXT: br i1 [[CALL]], label %[[WHILE_BODY:.*]], label %[[WHILE_END:.*]]
// CHECK: [[WHILE_BODY]]:
// CHECK-NEXT: br label %[[WHILE_COND]], !llvm.loop [[LOOP10:![0-9]+]]
// CHECK: [[WHILE_END]]:
// CHECK-NEXT: br label %[[IF_END]]
// CHECK: [[IF_END]]:
// CHECK-NEXT: [[TMP1:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]
// CHECK-NEXT: [[LOADEDV1:%.*]] = trunc i8 [[TMP1]] to i1
// CHECK-NEXT: br i1 [[LOADEDV1]], label %[[IF_THEN2:.*]], label %[[IF_END7:.*]]
// CHECK: [[IF_THEN2]]:
// CHECK-NEXT: br label %[[WHILE_COND3:.*]]
// CHECK: [[WHILE_COND3]]:
// CHECK-NEXT: [[CALL4:%.*]] = call noundef zeroext i1 @_Z1Bv()
// CHECK-NEXT: [[CALL4_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CALL4]], i1 false)
// CHECK-NEXT: br i1 [[CALL4_EXPVAL]], label %[[WHILE_BODY5:.*]], label %[[WHILE_END6:.*]]
// CHECK: [[WHILE_BODY5]]:
// CHECK-NEXT: store volatile i8 0, ptr @b, align 1, !tbaa [[BOOL_TBAA6]]
// CHECK-NEXT: br label %[[WHILE_COND3]], !llvm.loop [[LOOP13:![0-9]+]]
// CHECK: [[WHILE_END6]]:
// CHECK-NEXT: br label %[[IF_END7]]
// CHECK: [[IF_END7]]:
// CHECK-NEXT: ret void
//
void WhileStmt() {
if (b)
[[unlikely]] while (B()) {}
if (b)
while (B())
[[unlikely]] { b = false; }
}
// CHECK-LABEL: define dso_local void @_Z6DoStmtv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]
// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1
// CHECK-NEXT: [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)
// CHECK-NEXT: br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
// CHECK: [[IF_THEN]]:
// CHECK-NEXT: br label %[[DO_BODY:.*]]
// CHECK: [[DO_BODY]]:
// CHECK-NEXT: br label %[[DO_COND:.*]]
// CHECK: [[DO_COND]]:
// CHECK-NEXT: [[CALL:%.*]] = call noundef zeroext i1 @_Z1Bv()
// CHECK-NEXT: br i1 [[CALL]], label %[[DO_BODY]], label %[[DO_END:.*]], !llvm.loop [[LOOP14:![0-9]+]]
// CHECK: [[DO_END]]:
// CHECK-NEXT: br label %[[IF_END]]
// CHECK: [[IF_END]]:
// CHECK-NEXT: [[TMP1:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]
// CHECK-NEXT: [[LOADEDV1:%.*]] = trunc i8 [[TMP1]] to i1
// CHECK-NEXT: br i1 [[LOADEDV1]], label %[[IF_THEN2:.*]], label %[[IF_END7:.*]]
// CHECK: [[IF_THEN2]]:
// CHECK-NEXT: br label %[[DO_BODY3:.*]]
// CHECK: [[DO_BODY3]]:
// CHECK-NEXT: br label %[[DO_COND4:.*]]
// CHECK: [[DO_COND4]]:
// CHECK-NEXT: [[CALL5:%.*]] = call noundef zeroext i1 @_Z1Bv()
// CHECK-NEXT: br i1 [[CALL5]], label %[[DO_BODY3]], label %[[DO_END6:.*]], !llvm.loop [[LOOP15:![0-9]+]]
// CHECK: [[DO_END6]]:
// CHECK-NEXT: br label %[[IF_END7]]
// CHECK: [[IF_END7]]:
// CHECK-NEXT: ret void
//
void DoStmt() {
if (b)
[[unlikely]] do {}
while (B())
;
if (b)
do
[[unlikely]] {}
while (B());
}
// CHECK-LABEL: define dso_local void @_Z7ForStmtv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]
// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1
// CHECK-NEXT: [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)
// CHECK-NEXT: br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]
// CHECK: [[IF_THEN]]:
// CHECK-NEXT: br label %[[FOR_COND:.*]]
// CHECK: [[FOR_COND]]:
// CHECK-NEXT: [[CALL:%.*]] = call noundef zeroext i1 @_Z1Bv()
// CHECK-NEXT: br i1 [[CALL]], label %[[FOR_BODY:.*]], label %[[FOR_END:.*]]
// CHECK: [[FOR_BODY]]:
// CHECK-NEXT: br label %[[FOR_COND]], !llvm.loop [[LOOP16:![0-9]+]]
// CHECK: [[FOR_END]]:
// CHECK-NEXT: br label %[[IF_END]]
// CHECK: [[IF_END]]:
// CHECK-NEXT: [[TMP1:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]
// CHECK-NEXT: [[LOADEDV1:%.*]] = trunc i8 [[TMP1]] to i1
// CHECK-NEXT: br i1 [[LOADEDV1]], label %[[IF_THEN2:.*]], label %[[IF_END7:.*]]
// CHECK: [[IF_THEN2]]:
// CHECK-NEXT: br label %[[FOR_COND3:.*]]
// CHECK: [[FOR_COND3]]:
// CHECK-NEXT: [[CALL4:%.*]] = call noundef zeroext i1 @_Z1Bv()
// CHECK-NEXT: [[CALL4_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CALL4]], i1 false)
// CHECK-NEXT: br i1 [[CALL4_EXPVAL]], label %[[FOR_BODY5:.*]], label %[[FOR_END6:.*]]
// CHECK: [[FOR_BODY5]]:
// CHECK-NEXT: br label %[[FOR_COND3]], !llvm.loop [[LOOP17:![0-9]+]]
// CHECK: [[FOR_END6]]:
// CHECK-NEXT: br label %[[IF_END7]]
// CHECK: [[IF_END7]]:
// CHECK-NEXT: ret void
//
void ForStmt() {
if (b)
[[unlikely]] for (; B();) {}
if (b)
for (; B();)
[[unlikely]] {}
}
// CHECK-LABEL: define dso_local void @_Z8GotoStmtv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]
// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1
// CHECK-NEXT: [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)
// CHECK-NEXT: br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
// CHECK: [[IF_THEN]]:
// CHECK-NEXT: br label %[[END:.*]]
// CHECK: [[IF_ELSE]]:
// CHECK-NEXT: store volatile i8 1, ptr @b, align 1, !tbaa [[BOOL_TBAA6]]
// CHECK-NEXT: br label %[[IF_END:.*]]
// CHECK: [[IF_END]]:
// CHECK-NEXT: br label %[[END]]
// CHECK: [[END]]:
// CHECK-NEXT: ret void
//
void GotoStmt() {
if (b)
[[unlikely]] goto end;
else {
// Make sure the branches aren't optimized away.
b = true;
}
end:;
}
// CHECK-LABEL: define dso_local void @_Z10ReturnStmtv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]
// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1
// CHECK-NEXT: [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)
// CHECK-NEXT: br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
// CHECK: [[IF_THEN]]:
// CHECK-NEXT: br label %[[IF_END:.*]]
// CHECK: [[IF_ELSE]]:
// CHECK-NEXT: store volatile i8 1, ptr @b, align 1, !tbaa [[BOOL_TBAA6]]
// CHECK-NEXT: br label %[[IF_END]]
// CHECK: [[IF_END]]:
// CHECK-NEXT: ret void
//
void ReturnStmt() {
if (b)
[[unlikely]] return;
else {
// Make sure the branches aren't optimized away.
b = true;
}
}
// CHECK-LABEL: define dso_local void @_Z10SwitchStmtv(
// CHECK-SAME: ) #[[ATTR0]] {
// CHECK-NEXT: [[ENTRY:.*:]]
// CHECK-NEXT: [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]
// CHECK-NEXT: [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1
// CHECK-NEXT: [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)
// CHECK-NEXT: br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]
// CHECK: [[IF_THEN]]:
// CHECK-NEXT: [[TMP1:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2:![0-9]+]]
// CHECK-NEXT: switch i32 [[TMP1]], label %[[SW_EPILOG:.*]] [
// CHECK-NEXT: ]
// CHECK: [[SW_EPILOG]]:
// CHECK-NEXT: br label %[[IF_END:.*]]
// CHECK: [[IF_ELSE]]:
// CHECK-NEXT: store volatile i8 1, ptr @b, align 1, !tbaa [[BOOL_TBAA6]]
// CHECK-NEXT: br label %[[IF_END]]
// CHECK: [[IF_END]]:
// CHECK-NEXT: [[TMP2:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]
// CHECK-NEXT: [[LOADEDV1:%.*]] = trunc i8 [[TMP2]] to i1
// CHECK-NEXT: br i1 [[LOADEDV1]], label %[[IF_THEN2:.*]], label %[[IF_ELSE4:.*]]
// CHECK: [[IF_THEN2]]:
// CHECK-NEXT: [[TMP3:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]
// CHECK-NEXT: switch i32 [[TMP3]], label %[[SW_EPILOG3:.*]] [
// CHECK-NEXT: ]
// CHECK: [[SW_EPILOG3]]:
// CHECK-NEXT: br label %[[IF_END5:.*]]
// CHECK: [[IF_ELSE4]]:
// CHECK-NEXT: store volatile i8 1, ptr @b, align 1, !tbaa [[BOOL_TBAA6]]
// CHECK-NEXT: br label %[[IF_END5]]
// CHECK: [[IF_END5]]:
// CHECK-NEXT: ret void
//
void SwitchStmt() {
if (b)
[[unlikely]] switch (i) {}
else {
// Make sure the branches aren't optimized away.
b = true;
}
if (b)
switch (i)
[[unlikely]] {}
else {
// Make sure the branches aren't optimized away.
b = true;
}
}
//.
// CHECK: [[INT_TBAA2]] = !{[[META3:![0-9]+]], [[META3]], i64 0}
// CHECK: [[META3]] = !{!"int", [[META4:![0-9]+]], i64 0}
// CHECK: [[META4]] = !{!"omnipotent char", [[META5:![0-9]+]], i64 0}
// CHECK: [[META5]] = !{!"Simple C++ TBAA"}
// CHECK: [[BOOL_TBAA6]] = !{[[META7:![0-9]+]], [[META7]], i64 0}
// CHECK: [[META7]] = !{!"bool", [[META4]], i64 0}
// CHECK: [[RNG8]] = !{i8 0, i8 2}
// CHECK: [[META9]] = !{}
// CHECK: [[LOOP10]] = distinct !{[[LOOP10]], [[META11:![0-9]+]], [[META12:![0-9]+]]}
// CHECK: [[META11]] = !{!"llvm.loop.mustprogress"}
// CHECK: [[META12]] = !{!"llvm.loop.unroll.disable"}
// CHECK: [[LOOP13]] = distinct !{[[LOOP13]], [[META11]], [[META12]]}
// CHECK: [[LOOP14]] = distinct !{[[LOOP14]], [[META11]], [[META12]]}
// CHECK: [[LOOP15]] = distinct !{[[LOOP15]], [[META11]], [[META12]]}
// CHECK: [[LOOP16]] = distinct !{[[LOOP16]], [[META11]], [[META12]]}
// CHECK: [[LOOP17]] = distinct !{[[LOOP17]], [[META11]], [[META12]]}
//.