// Test to ensure RHS condition of logical operators isn't evaluated more than // one time when instrumenting RHS counter blocks for branch coverage. // 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 %s // CHECK-LABEL: define {{.*}}@_Z5test1b // CHECK-COUNT-1: = call {{.*}}@_Z5fval1v() // CHECK-NOT: = call {{.*}}@_Z5fval1v() extern bool fval1(); bool test1(bool a) { return (a && fval1()); } // CHECK-LABEL: define {{.*}}@_Z5test2b // CHECK-COUNT-1: call {{.*}}_Z5fval2v() // CHECK-NOT: call {{.*}}_Z5fval2v() extern bool fval2(); bool test2(bool a) { return (a || fval2()); } // CHECK-LABEL: define {{.*}}@_Z5test3v // CHECK-COUNT-1: call {{.*}}_Z5fval3v() // CHECK-NOT: call {{.*}}_Z5fval3v() extern bool fval3(); bool test3() { return (1 && fval3()); } // CHECK-LABEL: define {{.*}}@_Z5test4v // CHECK-COUNT-1: call {{.*}}_Z5fval4v() // CHECK-NOT: call {{.*}}_Z5fval4v() extern bool fval4(); bool test4() { return (0 || fval4()); } // CHECK-LABEL: define {{.*}}@_Z5test5b // CHECK-COUNT-1: call {{.*}}_Z5fval5v() // CHECK-NOT: call {{.*}}_Z5fval5v() extern bool fval5(); bool test5(bool a) { if (a && fval5()) return true; return false; } // CHECK-LABEL: define {{.*}}@_Z5test6b // CHECK-COUNT-1: call {{.*}}_Z5fval6v() // CHECK-NOT: call {{.*}}_Z5fval6v() extern bool fval6(); bool test6(bool a) { if (a || fval6()) return true; return false; } // CHECK-LABEL: define {{.*}}@_Z5test7v // CHECK-COUNT-1: call {{.*}}_Z5fval7v() // CHECK-NOT: call {{.*}}_Z5fval7v() extern bool fval7(); bool test7() { if (1 && fval7()) return true; return false; } // CHECK-LABEL: define {{.*}}@_Z5test8v // CHECK-COUNT-1: call {{.*}}_Z5fval8v() // CHECK-NOT: call {{.*}}_Z5fval8v() extern bool fval8(); bool test8() { if (0 || fval8()) return true; return false; }