77 lines · cpp
1// Test to ensure RHS condition of logical operators isn't evaluated more than2// one time when instrumenting RHS counter blocks for branch coverage.3 4// RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++11 -main-file-name branch-profdup.cpp %s -o - -emit-llvm -fprofile-instrument=clang | FileCheck -allow-deprecated-dag-overlap %s5 6// CHECK-LABEL: define {{.*}}@_Z5test1b7// CHECK-COUNT-1: = call {{.*}}@_Z5fval1v()8// CHECK-NOT: = call {{.*}}@_Z5fval1v()9extern bool fval1();10bool test1(bool a) {11 return (a && fval1());12}13 14// CHECK-LABEL: define {{.*}}@_Z5test2b15// CHECK-COUNT-1: call {{.*}}_Z5fval2v()16// CHECK-NOT: call {{.*}}_Z5fval2v()17extern bool fval2();18bool test2(bool a) {19 return (a || fval2());20}21 22// CHECK-LABEL: define {{.*}}@_Z5test3v23// CHECK-COUNT-1: call {{.*}}_Z5fval3v()24// CHECK-NOT: call {{.*}}_Z5fval3v()25extern bool fval3();26bool test3() {27 return (1 && fval3());28}29 30// CHECK-LABEL: define {{.*}}@_Z5test4v31// CHECK-COUNT-1: call {{.*}}_Z5fval4v()32// CHECK-NOT: call {{.*}}_Z5fval4v()33extern bool fval4();34bool test4() {35 return (0 || fval4());36}37 38// CHECK-LABEL: define {{.*}}@_Z5test5b39// CHECK-COUNT-1: call {{.*}}_Z5fval5v()40// CHECK-NOT: call {{.*}}_Z5fval5v()41extern bool fval5();42bool test5(bool a) {43 if (a && fval5())44 return true;45 return false;46}47 48// CHECK-LABEL: define {{.*}}@_Z5test6b49// CHECK-COUNT-1: call {{.*}}_Z5fval6v()50// CHECK-NOT: call {{.*}}_Z5fval6v()51extern bool fval6();52bool test6(bool a) {53 if (a || fval6())54 return true;55 return false;56}57 58// CHECK-LABEL: define {{.*}}@_Z5test7v59// CHECK-COUNT-1: call {{.*}}_Z5fval7v()60// CHECK-NOT: call {{.*}}_Z5fval7v()61extern bool fval7();62bool test7() {63 if (1 && fval7())64 return true;65 return false;66}67 68// CHECK-LABEL: define {{.*}}@_Z5test8v69// CHECK-COUNT-1: call {{.*}}_Z5fval8v()70// CHECK-NOT: call {{.*}}_Z5fval8v()71extern bool fval8();72bool test8() {73 if (0 || fval8())74 return true;75 return false;76}77