// 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_TBAA2:![0-9]+]], !range [[RNG6:![0-9]+]], !noundef [[META7:![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_TBAA2]], !range [[RNG6]], !noundef [[META7]] // 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_TBAA2]], !range [[RNG6]], !noundef [[META7]] // 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_TBAA2]], !range [[RNG6]], !noundef [[META7]] // 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_TBAA2]] // 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_TBAA2]], !range [[RNG6]], !noundef [[META7]] // 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_TBAA2]], !range [[RNG6]], !noundef [[META7]] // 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_TBAA2]] // 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_TBAA2]], !range [[RNG6]], !noundef [[META7]] // 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 [[LOOP8:![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_TBAA2]], !range [[RNG6]], !noundef [[META7]] // 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_TBAA2]] // CHECK-NEXT: br label %[[WHILE_COND3]], !llvm.loop [[LOOP11:![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_TBAA2]], !range [[RNG6]], !noundef [[META7]] // 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 [[LOOP12:![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_TBAA2]], !range [[RNG6]], !noundef [[META7]] // 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 [[LOOP13:![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_TBAA2]], !range [[RNG6]], !noundef [[META7]] // 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 [[LOOP14:![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_TBAA2]], !range [[RNG6]], !noundef [[META7]] // 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 [[LOOP15:![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_TBAA2]], !range [[RNG6]], !noundef [[META7]] // 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_TBAA2]] // 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_TBAA2]], !range [[RNG6]], !noundef [[META7]] // 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_TBAA2]] // 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_TBAA2]], !range [[RNG6]], !noundef [[META7]] // 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_TBAA16:![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_TBAA2]] // CHECK-NEXT: br label %[[IF_END]] // CHECK: [[IF_END]]: // CHECK-NEXT: [[TMP2:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA2]], !range [[RNG6]], !noundef [[META7]] // 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_TBAA16]] // 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_TBAA2]] // 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: [[BOOL_TBAA2]] = !{[[META3:![0-9]+]], [[META3]], i64 0} // CHECK: [[META3]] = !{!"bool", [[META4:![0-9]+]], i64 0} // CHECK: [[META4]] = !{!"omnipotent char", [[META5:![0-9]+]], i64 0} // CHECK: [[META5]] = !{!"Simple C++ TBAA"} // CHECK: [[RNG6]] = !{i8 0, i8 2} // CHECK: [[META7]] = !{} // CHECK: [[LOOP8]] = distinct !{[[LOOP8]], [[META9:![0-9]+]], [[META10:![0-9]+]]} // CHECK: [[META9]] = !{!"llvm.loop.mustprogress"} // CHECK: [[META10]] = !{!"llvm.loop.unroll.disable"} // CHECK: [[LOOP11]] = distinct !{[[LOOP11]], [[META9]], [[META10]]} // CHECK: [[LOOP12]] = distinct !{[[LOOP12]], [[META9]], [[META10]]} // CHECK: [[LOOP13]] = distinct !{[[LOOP13]], [[META9]], [[META10]]} // CHECK: [[LOOP14]] = distinct !{[[LOOP14]], [[META9]], [[META10]]} // CHECK: [[LOOP15]] = distinct !{[[LOOP15]], [[META9]], [[META10]]} // CHECK: [[INT_TBAA16]] = !{[[META17:![0-9]+]], [[META17]], i64 0} // CHECK: [[META17]] = !{!"int", [[META4]], i64 0} //.