brintos

brintos / llvm-project-archived public Read only

0
0
Text · 16.5 KiB · 2af2929 Raw
403 lines · cpp
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 62// RUN: %clang_cc1 -O1 -disable-llvm-passes -emit-llvm %s -o - -triple=x86_64-- | FileCheck %s3 4extern volatile bool b;5extern volatile int i;6extern bool A();7extern bool B();8 9// CHECK-LABEL: define dso_local noundef zeroext i1 @_Z1fv(10// CHECK-SAME: ) #[[ATTR0:[0-9]+]] {11// CHECK-NEXT:  [[ENTRY:.*:]]12// CHECK-NEXT:    [[RETVAL:%.*]] = alloca i1, align 113// CHECK-NEXT:    [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6:![0-9]+]], !range [[RNG8:![0-9]+]], !noundef [[META9:![0-9]+]]14// CHECK-NEXT:    [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i115// CHECK-NEXT:    [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 true)16// CHECK-NEXT:    br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]17// CHECK:       [[IF_THEN]]:18// CHECK-NEXT:    [[CALL:%.*]] = call noundef zeroext i1 @_Z1Av()19// CHECK-NEXT:    store i1 [[CALL]], ptr [[RETVAL]], align 120// CHECK-NEXT:    br label %[[RETURN:.*]]21// CHECK:       [[IF_END]]:22// CHECK-NEXT:    [[CALL1:%.*]] = call noundef zeroext i1 @_Z1Bv()23// CHECK-NEXT:    store i1 [[CALL1]], ptr [[RETVAL]], align 124// CHECK-NEXT:    br label %[[RETURN]]25// CHECK:       [[RETURN]]:26// CHECK-NEXT:    [[TMP1:%.*]] = load i1, ptr [[RETVAL]], align 127// CHECK-NEXT:    ret i1 [[TMP1]]28//29bool f() {30  if (b)31    [[likely]] {32      return A();33    }34  return B();35}36 37// CHECK-LABEL: define dso_local noundef zeroext i1 @_Z1gv(38// CHECK-SAME: ) #[[ATTR0]] {39// CHECK-NEXT:  [[ENTRY:.*:]]40// CHECK-NEXT:    [[RETVAL:%.*]] = alloca i1, align 141// CHECK-NEXT:    [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]42// CHECK-NEXT:    [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i143// CHECK-NEXT:    [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)44// CHECK-NEXT:    br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]45// CHECK:       [[IF_THEN]]:46// CHECK-NEXT:    [[CALL:%.*]] = call noundef zeroext i1 @_Z1Av()47// CHECK-NEXT:    store i1 [[CALL]], ptr [[RETVAL]], align 148// CHECK-NEXT:    br label %[[RETURN:.*]]49// CHECK:       [[IF_END]]:50// CHECK-NEXT:    [[CALL1:%.*]] = call noundef zeroext i1 @_Z1Bv()51// CHECK-NEXT:    store i1 [[CALL1]], ptr [[RETVAL]], align 152// CHECK-NEXT:    br label %[[RETURN]]53// CHECK:       [[RETURN]]:54// CHECK-NEXT:    [[TMP1:%.*]] = load i1, ptr [[RETVAL]], align 155// CHECK-NEXT:    ret i1 [[TMP1]]56//57bool g() {58  if (b)59    [[unlikely]] {60      return A();61    }62 63  return B();64}65 66// CHECK-LABEL: define dso_local noundef zeroext i1 @_Z1hv(67// CHECK-SAME: ) #[[ATTR0]] {68// CHECK-NEXT:  [[ENTRY:.*:]]69// CHECK-NEXT:    [[RETVAL:%.*]] = alloca i1, align 170// CHECK-NEXT:    [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]71// CHECK-NEXT:    [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i172// CHECK-NEXT:    [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)73// CHECK-NEXT:    br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]74// CHECK:       [[IF_THEN]]:75// CHECK-NEXT:    [[CALL:%.*]] = call noundef zeroext i1 @_Z1Av()76// CHECK-NEXT:    store i1 [[CALL]], ptr [[RETVAL]], align 177// CHECK-NEXT:    br label %[[RETURN:.*]]78// CHECK:       [[IF_END]]:79// CHECK-NEXT:    [[CALL1:%.*]] = call noundef zeroext i1 @_Z1Bv()80// CHECK-NEXT:    store i1 [[CALL1]], ptr [[RETVAL]], align 181// CHECK-NEXT:    br label %[[RETURN]]82// CHECK:       [[RETURN]]:83// CHECK-NEXT:    [[TMP1:%.*]] = load i1, ptr [[RETVAL]], align 184// CHECK-NEXT:    ret i1 [[TMP1]]85//86bool h() {87  if (b)88    [[unlikely]] return A();89 90  return B();91}92 93// CHECK-LABEL: define dso_local void @_Z8NullStmtv(94// CHECK-SAME: ) #[[ATTR0]] {95// CHECK-NEXT:  [[ENTRY:.*:]]96// CHECK-NEXT:    [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]97// CHECK-NEXT:    [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i198// CHECK-NEXT:    [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)99// CHECK-NEXT:    br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]100// CHECK:       [[IF_THEN]]:101// CHECK-NEXT:    br label %[[IF_END:.*]]102// CHECK:       [[IF_ELSE]]:103// CHECK-NEXT:    store volatile i8 1, ptr @b, align 1, !tbaa [[BOOL_TBAA6]]104// CHECK-NEXT:    br label %[[IF_END]]105// CHECK:       [[IF_END]]:106// CHECK-NEXT:    ret void107//108void NullStmt() {109  if (b)110    [[unlikely]];111  else {112    // Make sure the branches aren't optimized away.113    b = true;114  }115}116 117// CHECK-LABEL: define dso_local void @_Z6IfStmtv(118// CHECK-SAME: ) #[[ATTR0]] {119// CHECK-NEXT:  [[ENTRY:.*:]]120// CHECK-NEXT:    [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]121// CHECK-NEXT:    [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1122// CHECK-NEXT:    [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)123// CHECK-NEXT:    br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_END2:.*]]124// CHECK:       [[IF_THEN]]:125// CHECK-NEXT:    [[CALL:%.*]] = call noundef zeroext i1 @_Z1Bv()126// CHECK-NEXT:    br i1 [[CALL]], label %[[IF_THEN1:.*]], label %[[IF_END:.*]]127// CHECK:       [[IF_THEN1]]:128// CHECK-NEXT:    br label %[[IF_END]]129// CHECK:       [[IF_END]]:130// CHECK-NEXT:    br label %[[IF_END2]]131// CHECK:       [[IF_END2]]:132// CHECK-NEXT:    [[TMP1:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]133// CHECK-NEXT:    [[LOADEDV3:%.*]] = trunc i8 [[TMP1]] to i1134// CHECK-NEXT:    br i1 [[LOADEDV3]], label %[[IF_THEN4:.*]], label %[[IF_END8:.*]]135// CHECK:       [[IF_THEN4]]:136// CHECK-NEXT:    [[CALL5:%.*]] = call noundef zeroext i1 @_Z1Bv()137// CHECK-NEXT:    [[CALL5_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CALL5]], i1 false)138// CHECK-NEXT:    br i1 [[CALL5_EXPVAL]], label %[[IF_THEN6:.*]], label %[[IF_END7:.*]]139// CHECK:       [[IF_THEN6]]:140// CHECK-NEXT:    store volatile i8 0, ptr @b, align 1, !tbaa [[BOOL_TBAA6]]141// CHECK-NEXT:    br label %[[IF_END7]]142// CHECK:       [[IF_END7]]:143// CHECK-NEXT:    br label %[[IF_END8]]144// CHECK:       [[IF_END8]]:145// CHECK-NEXT:    ret void146//147void IfStmt() {148  if (b)149    [[unlikely]] if (B()) {}150 151  if (b) {152    if (B())153      [[unlikely]] { b = false; }154  }155}156 157// CHECK-LABEL: define dso_local void @_Z9WhileStmtv(158// CHECK-SAME: ) #[[ATTR0]] {159// CHECK-NEXT:  [[ENTRY:.*:]]160// CHECK-NEXT:    [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]161// CHECK-NEXT:    [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1162// CHECK-NEXT:    [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)163// CHECK-NEXT:    br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]164// CHECK:       [[IF_THEN]]:165// CHECK-NEXT:    br label %[[WHILE_COND:.*]]166// CHECK:       [[WHILE_COND]]:167// CHECK-NEXT:    [[CALL:%.*]] = call noundef zeroext i1 @_Z1Bv()168// CHECK-NEXT:    br i1 [[CALL]], label %[[WHILE_BODY:.*]], label %[[WHILE_END:.*]]169// CHECK:       [[WHILE_BODY]]:170// CHECK-NEXT:    br label %[[WHILE_COND]], !llvm.loop [[LOOP10:![0-9]+]]171// CHECK:       [[WHILE_END]]:172// CHECK-NEXT:    br label %[[IF_END]]173// CHECK:       [[IF_END]]:174// CHECK-NEXT:    [[TMP1:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]175// CHECK-NEXT:    [[LOADEDV1:%.*]] = trunc i8 [[TMP1]] to i1176// CHECK-NEXT:    br i1 [[LOADEDV1]], label %[[IF_THEN2:.*]], label %[[IF_END7:.*]]177// CHECK:       [[IF_THEN2]]:178// CHECK-NEXT:    br label %[[WHILE_COND3:.*]]179// CHECK:       [[WHILE_COND3]]:180// CHECK-NEXT:    [[CALL4:%.*]] = call noundef zeroext i1 @_Z1Bv()181// CHECK-NEXT:    [[CALL4_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CALL4]], i1 false)182// CHECK-NEXT:    br i1 [[CALL4_EXPVAL]], label %[[WHILE_BODY5:.*]], label %[[WHILE_END6:.*]]183// CHECK:       [[WHILE_BODY5]]:184// CHECK-NEXT:    store volatile i8 0, ptr @b, align 1, !tbaa [[BOOL_TBAA6]]185// CHECK-NEXT:    br label %[[WHILE_COND3]], !llvm.loop [[LOOP13:![0-9]+]]186// CHECK:       [[WHILE_END6]]:187// CHECK-NEXT:    br label %[[IF_END7]]188// CHECK:       [[IF_END7]]:189// CHECK-NEXT:    ret void190//191void WhileStmt() {192  if (b)193    [[unlikely]] while (B()) {}194 195  if (b)196    while (B())197      [[unlikely]] { b = false; }198}199 200// CHECK-LABEL: define dso_local void @_Z6DoStmtv(201// CHECK-SAME: ) #[[ATTR0]] {202// CHECK-NEXT:  [[ENTRY:.*:]]203// CHECK-NEXT:    [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]204// CHECK-NEXT:    [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1205// CHECK-NEXT:    [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)206// CHECK-NEXT:    br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]207// CHECK:       [[IF_THEN]]:208// CHECK-NEXT:    br label %[[DO_BODY:.*]]209// CHECK:       [[DO_BODY]]:210// CHECK-NEXT:    br label %[[DO_COND:.*]]211// CHECK:       [[DO_COND]]:212// CHECK-NEXT:    [[CALL:%.*]] = call noundef zeroext i1 @_Z1Bv()213// CHECK-NEXT:    br i1 [[CALL]], label %[[DO_BODY]], label %[[DO_END:.*]], !llvm.loop [[LOOP14:![0-9]+]]214// CHECK:       [[DO_END]]:215// CHECK-NEXT:    br label %[[IF_END]]216// CHECK:       [[IF_END]]:217// CHECK-NEXT:    [[TMP1:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]218// CHECK-NEXT:    [[LOADEDV1:%.*]] = trunc i8 [[TMP1]] to i1219// CHECK-NEXT:    br i1 [[LOADEDV1]], label %[[IF_THEN2:.*]], label %[[IF_END7:.*]]220// CHECK:       [[IF_THEN2]]:221// CHECK-NEXT:    br label %[[DO_BODY3:.*]]222// CHECK:       [[DO_BODY3]]:223// CHECK-NEXT:    br label %[[DO_COND4:.*]]224// CHECK:       [[DO_COND4]]:225// CHECK-NEXT:    [[CALL5:%.*]] = call noundef zeroext i1 @_Z1Bv()226// CHECK-NEXT:    br i1 [[CALL5]], label %[[DO_BODY3]], label %[[DO_END6:.*]], !llvm.loop [[LOOP15:![0-9]+]]227// CHECK:       [[DO_END6]]:228// CHECK-NEXT:    br label %[[IF_END7]]229// CHECK:       [[IF_END7]]:230// CHECK-NEXT:    ret void231//232void DoStmt() {233  if (b)234    [[unlikely]] do {}235    while (B())236      ;237 238  if (b)239    do240      [[unlikely]] {}241    while (B());242}243 244// CHECK-LABEL: define dso_local void @_Z7ForStmtv(245// CHECK-SAME: ) #[[ATTR0]] {246// CHECK-NEXT:  [[ENTRY:.*:]]247// CHECK-NEXT:    [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]248// CHECK-NEXT:    [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1249// CHECK-NEXT:    [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)250// CHECK-NEXT:    br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_END:.*]]251// CHECK:       [[IF_THEN]]:252// CHECK-NEXT:    br label %[[FOR_COND:.*]]253// CHECK:       [[FOR_COND]]:254// CHECK-NEXT:    [[CALL:%.*]] = call noundef zeroext i1 @_Z1Bv()255// CHECK-NEXT:    br i1 [[CALL]], label %[[FOR_BODY:.*]], label %[[FOR_END:.*]]256// CHECK:       [[FOR_BODY]]:257// CHECK-NEXT:    br label %[[FOR_COND]], !llvm.loop [[LOOP16:![0-9]+]]258// CHECK:       [[FOR_END]]:259// CHECK-NEXT:    br label %[[IF_END]]260// CHECK:       [[IF_END]]:261// CHECK-NEXT:    [[TMP1:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]262// CHECK-NEXT:    [[LOADEDV1:%.*]] = trunc i8 [[TMP1]] to i1263// CHECK-NEXT:    br i1 [[LOADEDV1]], label %[[IF_THEN2:.*]], label %[[IF_END7:.*]]264// CHECK:       [[IF_THEN2]]:265// CHECK-NEXT:    br label %[[FOR_COND3:.*]]266// CHECK:       [[FOR_COND3]]:267// CHECK-NEXT:    [[CALL4:%.*]] = call noundef zeroext i1 @_Z1Bv()268// CHECK-NEXT:    [[CALL4_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[CALL4]], i1 false)269// CHECK-NEXT:    br i1 [[CALL4_EXPVAL]], label %[[FOR_BODY5:.*]], label %[[FOR_END6:.*]]270// CHECK:       [[FOR_BODY5]]:271// CHECK-NEXT:    br label %[[FOR_COND3]], !llvm.loop [[LOOP17:![0-9]+]]272// CHECK:       [[FOR_END6]]:273// CHECK-NEXT:    br label %[[IF_END7]]274// CHECK:       [[IF_END7]]:275// CHECK-NEXT:    ret void276//277void ForStmt() {278  if (b)279    [[unlikely]] for (; B();) {}280 281  if (b)282    for (; B();)283      [[unlikely]] {}284}285 286// CHECK-LABEL: define dso_local void @_Z8GotoStmtv(287// CHECK-SAME: ) #[[ATTR0]] {288// CHECK-NEXT:  [[ENTRY:.*:]]289// CHECK-NEXT:    [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]290// CHECK-NEXT:    [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1291// CHECK-NEXT:    [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)292// CHECK-NEXT:    br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]293// CHECK:       [[IF_THEN]]:294// CHECK-NEXT:    br label %[[END:.*]]295// CHECK:       [[IF_ELSE]]:296// CHECK-NEXT:    store volatile i8 1, ptr @b, align 1, !tbaa [[BOOL_TBAA6]]297// CHECK-NEXT:    br label %[[IF_END:.*]]298// CHECK:       [[IF_END]]:299// CHECK-NEXT:    br label %[[END]]300// CHECK:       [[END]]:301// CHECK-NEXT:    ret void302//303void GotoStmt() {304  if (b)305    [[unlikely]] goto end;306  else {307    // Make sure the branches aren't optimized away.308    b = true;309  }310end:;311}312 313// CHECK-LABEL: define dso_local void @_Z10ReturnStmtv(314// CHECK-SAME: ) #[[ATTR0]] {315// CHECK-NEXT:  [[ENTRY:.*:]]316// CHECK-NEXT:    [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]317// CHECK-NEXT:    [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1318// CHECK-NEXT:    [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)319// CHECK-NEXT:    br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]320// CHECK:       [[IF_THEN]]:321// CHECK-NEXT:    br label %[[IF_END:.*]]322// CHECK:       [[IF_ELSE]]:323// CHECK-NEXT:    store volatile i8 1, ptr @b, align 1, !tbaa [[BOOL_TBAA6]]324// CHECK-NEXT:    br label %[[IF_END]]325// CHECK:       [[IF_END]]:326// CHECK-NEXT:    ret void327//328void ReturnStmt() {329  if (b)330    [[unlikely]] return;331  else {332    // Make sure the branches aren't optimized away.333    b = true;334  }335}336 337// CHECK-LABEL: define dso_local void @_Z10SwitchStmtv(338// CHECK-SAME: ) #[[ATTR0]] {339// CHECK-NEXT:  [[ENTRY:.*:]]340// CHECK-NEXT:    [[TMP0:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]341// CHECK-NEXT:    [[LOADEDV:%.*]] = trunc i8 [[TMP0]] to i1342// CHECK-NEXT:    [[LOADEDV_EXPVAL:%.*]] = call i1 @llvm.expect.i1(i1 [[LOADEDV]], i1 false)343// CHECK-NEXT:    br i1 [[LOADEDV_EXPVAL]], label %[[IF_THEN:.*]], label %[[IF_ELSE:.*]]344// CHECK:       [[IF_THEN]]:345// CHECK-NEXT:    [[TMP1:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2:![0-9]+]]346// CHECK-NEXT:    switch i32 [[TMP1]], label %[[SW_EPILOG:.*]] [347// CHECK-NEXT:    ]348// CHECK:       [[SW_EPILOG]]:349// CHECK-NEXT:    br label %[[IF_END:.*]]350// CHECK:       [[IF_ELSE]]:351// CHECK-NEXT:    store volatile i8 1, ptr @b, align 1, !tbaa [[BOOL_TBAA6]]352// CHECK-NEXT:    br label %[[IF_END]]353// CHECK:       [[IF_END]]:354// CHECK-NEXT:    [[TMP2:%.*]] = load volatile i8, ptr @b, align 1, !tbaa [[BOOL_TBAA6]], !range [[RNG8]], !noundef [[META9]]355// CHECK-NEXT:    [[LOADEDV1:%.*]] = trunc i8 [[TMP2]] to i1356// CHECK-NEXT:    br i1 [[LOADEDV1]], label %[[IF_THEN2:.*]], label %[[IF_ELSE4:.*]]357// CHECK:       [[IF_THEN2]]:358// CHECK-NEXT:    [[TMP3:%.*]] = load volatile i32, ptr @i, align 4, !tbaa [[INT_TBAA2]]359// CHECK-NEXT:    switch i32 [[TMP3]], label %[[SW_EPILOG3:.*]] [360// CHECK-NEXT:    ]361// CHECK:       [[SW_EPILOG3]]:362// CHECK-NEXT:    br label %[[IF_END5:.*]]363// CHECK:       [[IF_ELSE4]]:364// CHECK-NEXT:    store volatile i8 1, ptr @b, align 1, !tbaa [[BOOL_TBAA6]]365// CHECK-NEXT:    br label %[[IF_END5]]366// CHECK:       [[IF_END5]]:367// CHECK-NEXT:    ret void368//369void SwitchStmt() {370  if (b)371    [[unlikely]] switch (i) {}372  else {373    // Make sure the branches aren't optimized away.374    b = true;375  }376  if (b)377    switch (i)378      [[unlikely]] {}379  else {380    // Make sure the branches aren't optimized away.381    b = true;382  }383}384 385//.386// CHECK: [[INT_TBAA2]] = !{[[META3:![0-9]+]], [[META3]], i64 0}387// CHECK: [[META3]] = !{!"int", [[META4:![0-9]+]], i64 0}388// CHECK: [[META4]] = !{!"omnipotent char", [[META5:![0-9]+]], i64 0}389// CHECK: [[META5]] = !{!"Simple C++ TBAA"}390// CHECK: [[BOOL_TBAA6]] = !{[[META7:![0-9]+]], [[META7]], i64 0}391// CHECK: [[META7]] = !{!"bool", [[META4]], i64 0}392// CHECK: [[RNG8]] = !{i8 0, i8 2}393// CHECK: [[META9]] = !{}394// CHECK: [[LOOP10]] = distinct !{[[LOOP10]], [[META11:![0-9]+]], [[META12:![0-9]+]]}395// CHECK: [[META11]] = !{!"llvm.loop.mustprogress"}396// CHECK: [[META12]] = !{!"llvm.loop.unroll.disable"}397// CHECK: [[LOOP13]] = distinct !{[[LOOP13]], [[META11]], [[META12]]}398// CHECK: [[LOOP14]] = distinct !{[[LOOP14]], [[META11]], [[META12]]}399// CHECK: [[LOOP15]] = distinct !{[[LOOP15]], [[META11]], [[META12]]}400// CHECK: [[LOOP16]] = distinct !{[[LOOP16]], [[META11]], [[META12]]}401// CHECK: [[LOOP17]] = distinct !{[[LOOP17]], [[META11]], [[META12]]}402//.403