brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.7 KiB · 9660e85 Raw
261 lines · c
1// Test visualization of general branch constructs in C.2 3 4 5 6 7void simple_loops() {           // CHECK: @LINE|{{.*}}simple_loops()8  int i;9  for (i = 0; i < 100; ++i) {   // BRCOV: Branch ([[@LINE]]:15): [True: [[#min(C,100)]], False: 1]10  }11  while (i > 0)                 // BRCOV: Branch ([[@LINE]]:10): [True: [[#min(C,100)]], False: 1]12    i--;13  do {} while (i++ < 75);       // BRCOV: Branch ([[@LINE]]:16): [True: [[#min(C,75)]], False: 1]14 15}16 17void conditionals() {           // CHECK: @LINE|{{.*}}conditionals()18  for (int i = 0; i < 100; ++i) {//BRCOV: Branch ([[@LINE]]:19): [True: [[#min(C,100)]], False: 1]19    if (i % 2) {                // BRCOV: Branch ([[@LINE]]:9): [True: [[#min(C,50)]], False: [[#min(C,50)]]]20      if (i) {}                 // BRCOV: Branch ([[@LINE]]:11): [True: [[#min(C,50)]], False: 0]21    } else if (i % 3) {         // BRCOV: Branch ([[@LINE]]:16): [True: [[#min(C,33)]], False: [[#min(C,17)]]]22      if (i) {}                 // BRCOV: Branch ([[@LINE]]:11): [True: [[#min(C,33)]], False: 0]23    } else {24      if (i) {}                 // BRCOV: Branch ([[@LINE]]:11): [True: [[#min(C,16)]], False: 1]25    }26                                // BRCOV: Branch ([[@LINE+1]]:9): [True: [[#min(C,100)]], Folded]27    if (1 && i) {}              // BRCOV: Branch ([[@LINE]]:14): [True: [[#min(C,99)]], False: 1]28    if (0 || i) {}              // BRCOV: Branch ([[@LINE]]:9): [Folded, False: [[#min(C,100)]]]29  }                             // BRCOV: Branch ([[@LINE-1]]:14): [True: [[#min(C,99)]], False: 1]30 31}32 33void early_exits() {            // CHECK: @LINE|{{.*}}early_exits()34  int i = 0;35 36  if (i) {}                     // BRCOV: Branch ([[@LINE]]:7): [True: 0, False: 1]37 38  while (i < 100) {             // BRCOV: Branch ([[@LINE]]:10): [True: [[#min(C,51)]], False: 0]39    i++;40    if (i > 50)                 // BRCOV: Branch ([[@LINE]]:9): [True: 1, False: [[#min(C,50)]]]41      break;42    if (i % 2)                  // BRCOV: Branch ([[@LINE]]:9): [True: [[#min(C,25)]], False: [[#min(C,25)]]]43      continue;44  }45 46  if (i) {}                     // BRCOV: Branch ([[@LINE]]:7): [True: 1, False: 0]47 48  do {49    if (i > 75)                 // BRCOV: Branch ([[@LINE]]:9): [True: 1, False: [[#min(C,25)]]]50      return;51    else52      i++;53  } while (i < 100);            // BRCOV: Branch ([[@LINE]]:12): [True: [[#min(C,25)]], False: 0]54 55  if (i) {}                     // BRCOV: Branch ([[@LINE]]:7): [True: 0, False: 0]56 57}58 59void jumps() {                  // CHECK: @LINE|{{.*}}jumps()60  int i;61 62  for (i = 0; i < 2; ++i) {     // BRCOV: Branch ([[@LINE]]:15): [True: 1, False: 0]63    goto outofloop;64    // Never reached -> no weights65    if (i) {}                   // BRCOV: Branch ([[@LINE]]:9): [True: 0, False: 0]66  }67 68outofloop:69  if (i) {}                     // BRCOV: Branch ([[@LINE]]:7): [True: 0, False: 1]70 71  goto loop1;72 73  while (i) {                   // BRCOV: Branch ([[@LINE]]:10): [True: 0, False: 1]74  loop1:75    if (i) {}                   // BRCOV: Branch ([[@LINE]]:9): [True: 0, False: 1]76  }77 78  goto loop2;79first:80second:81third:82  i++;83  if (i < 3)                    // BRCOV: Branch ([[@LINE]]:7): [True: [[#min(C,2)]], False: 1]84    goto loop2;85 86  while (i < 3) {               // BRCOV: Branch ([[@LINE]]:10): [True: 0, False: 1]87  loop2:88    switch (i) {89    case 0:                     // BRCOV: Branch ([[@LINE]]:5): [True: 1, Folded]90      goto first;91    case 1:                     // BRCOV: Branch ([[@LINE]]:5): [True: 1, Folded]92      goto second;93    case 2:                     // BRCOV: Branch ([[@LINE]]:5): [True: 1, Folded]94      goto third;95    }96  }97 98  for (i = 0; i < 10; ++i) {    // BRCOV: Branch ([[@LINE]]:15): [True: [[#min(C,10)]], False: 1]99    goto withinloop;100                                // never reached -> no weights101    if (i) {}                   // BRCOV: Branch ([[@LINE]]:9): [True: 0, False: 0]102  withinloop:103    if (i) {}                   // BRCOV: Branch ([[@LINE]]:9): [True: [[#min(C,9)]], False: 1]104  }105 106}107 108void switches() {               // CHECK: @LINE|{{.*}}switches()109  static int weights[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5};110 111  // No cases -> no weights112  switch (weights[0]) {113  default:                      // BRCOV: Branch ([[@LINE]]:3): [True: 1, Folded]114    break;115  }116                                // BRCOV: Branch ([[@LINE+1]]:63): [True: [[#min(C,15)]], False: 0]117  for (int i = 0, len = sizeof(weights) / sizeof(weights[0]); i < len; ++i) {118    switch (i[weights]) {119    case 1:                     // BRCOV: Branch ([[@LINE]]:5): [True: 1, Folded]120      if (i) {}                 // BRCOV: Branch ([[@LINE]]:11): [True: 0, False: 1]121      // fallthrough122    case 2:                     // BRCOV: Branch ([[@LINE]]:5): [True: [[#min(C,2)]], Folded]123      if (i) {}                 // BRCOV: Branch ([[@LINE]]:11): [True: [[#min(C,2)]], False: 1]124      break;125    case 3:                     // BRCOV: Branch ([[@LINE]]:5): [True: [[#min(C,3)]], Folded]126      if (i) {}                 // BRCOV: Branch ([[@LINE]]:11): [True: [[#min(C,3)]], False: 0]127      continue;128    case 4:                     // BRCOV: Branch ([[@LINE]]:5): [True: [[#min(C,4)]], Folded]129      if (i) {}                 // BRCOV: Branch ([[@LINE]]:11): [True: [[#min(C,4)]], False: 0]130      switch (i) {131      case 6 ... 9:             // BRCOV: Branch ([[@LINE]]:7): [True: [[#min(C,4)]], Folded]132        if (i) {}               // BRCOV: Branch ([[@LINE]]:13): [True: [[#min(C,4)]], False: 0]133        continue;134      }135 136    default:                    // BRCOV: Branch ([[@LINE]]:5): [True: [[#min(C,5)]], Folded]137      if (i == len - 1)         // BRCOV: Branch ([[@LINE]]:11): [True: 1, False: [[#min(C,4)]]]138        return;139    }140  }141 142  // Never reached -> no weights143  if (weights[0]) {}            // BRCOV: Branch ([[@LINE]]:7): [True: 0, False: 0]144 145}146 147void big_switch() {             // CHECK: @LINE|{{.*}}big_switch()148  for (int i = 0; i < 32; ++i) {// BRCOV: Branch ([[@LINE]]:19): [True: [[#min(C,32)]], False: 1]149    switch (1 << i) {150    case (1 << 0):              // BRCOV: Branch ([[@LINE]]:5): [True: 1, Folded]151      if (i) {}                 // BRCOV: Branch ([[@LINE]]:11): [True: 0, False: 1]152      // fallthrough153    case (1 << 1):              // BRCOV: Branch ([[@LINE]]:5): [True: 1, Folded]154      if (i) {}                 // BRCOV: Branch ([[@LINE]]:11): [True: 1, False: 1]155      break;156    case (1 << 2) ... (1 << 12):// BRCOV: Branch ([[@LINE]]:5): [True: [[#min(C,11)]], Folded]157      if (i) {}                 // BRCOV: Branch ([[@LINE]]:11): [True: [[#min(C,11)]], False: 0]158      break;159      // The branch for the large case range above appears after the case body.160 161    case (1 << 13):             // BRCOV: Branch ([[@LINE]]:5): [True: 1, Folded]162      if (i) {}                 // BRCOV: Branch ([[@LINE]]:11): [True: 1, False: 0]163      break;164    case (1 << 14) ... (1 << 28)://BRCOV: Branch ([[@LINE]]:5): [True: [[#min(C,15)]], Folded]165      if (i) {}                 // BRCOV: Branch ([[@LINE]]:11): [True: [[#min(C,15)]], False: 0]166      break;167    // The branch for the large case range above appears after the case body.168 169    case (1 << 29) ... ((1 << 29) + 1):170      if (i) {}                 // BRCOV: Branch ([[@LINE]]:11): [True: 1, False: 0]171      break;172    default:                    // BRCOV: Branch ([[@LINE]]:5): [True: [[#min(C,2)]], Folded]173      if (i) {}                 // BRCOV: Branch ([[@LINE]]:11): [True: [[#min(C,2)]], False: 0]174      break;175    }176  }177 178}179 180void boolean_operators() {      // CHECK: @LINE|{{.*}}boolean_operators()181  int v;182  for (int i = 0; i < 100; ++i) {183    v = i % 3 || i;             // BRCOV: Branch ([[@LINE]]:9): [True: [[#min(C,66)]], False: [[#min(C,34)]]]184                                // BRCOV: Branch ([[@LINE-1]]:18): [True: [[#min(C,33)]], False: 1]185    v = i % 3 && i;             // BRCOV: Branch ([[@LINE]]:9): [True: [[#min(C,66)]], False: [[#min(C,34)]]]186                                // BRCOV: Branch ([[@LINE-1]]:18): [True: [[#min(C,66)]], False: 0]187    v = i % 3 || i % 2 || i;    // BRCOV: Branch ([[@LINE]]:9): [True: [[#min(C,66)]], False: [[#min(C,34)]]]188                                // BRCOV: Branch ([[@LINE-1]]:18): [True: [[#min(C,17)]], False: [[#min(C,17)]]]189    v = i % 2 && i % 3 && i;    // BRCOV: Branch ([[@LINE-2]]:27): [True: [[#min(C,16)]], False: 1]190  }                             // BRCOV: Branch ([[@LINE-1]]:9): [True: [[#min(C,50)]], False: [[#min(C,50)]]]191                                // BRCOV: Branch ([[@LINE-2]]:18): [True: [[#min(C,33)]], False: [[#min(C,17)]]]192}                               // BRCOV: Branch ([[@LINE-3]]:27): [True: [[#min(C,33)]], False: 0]193 194void boolop_loops() {           // CHECK: @LINE|{{.*}}boolop_loops()195  int i = 100;196 197  while (i && i > 50)           // BRCOV: Branch ([[@LINE]]:10): [True: [[#min(C,51)]], False: 0]198    i--;                        // BRCOV: Branch ([[@LINE-1]]:15): [True: [[#min(C,50)]], False: 1]199 200  while ((i % 2) || (i > 0))    // BRCOV: Branch ([[@LINE]]:10): [True: [[#min(C,25)]], False: [[#min(C,26)]]]201    i--;                        // BRCOV: Branch ([[@LINE-1]]:21): [True: [[#min(C,25)]], False: 1]202 203  for (i = 100; i && i > 50; --i);  // BRCOV: Branch ([[@LINE]]:17): [True: [[#min(C,51)]], False: 0]204                                    // BRCOV: Branch ([[@LINE-1]]:22): [True: [[#min(C,50)]], False: 1]205  for (; (i % 2) || (i > 0); --i);  // BRCOV: Branch ([[@LINE]]:10): [True: [[#min(C,25)]], False: [[#min(C,26)]]]206                                    // BRCOV: Branch ([[@LINE-1]]:21): [True: [[#min(C,25)]], False: 1]207}208 209void conditional_operator() {   // CHECK: @LINE|{{.*}}conditional_operator()210  int i = 100;211 212  int j = i < 50 ? i : 1;       // BRCOV: Branch ([[@LINE]]:11): [True: 0, False: 1]213 214  int k = i ?: 0;               // BRCOV: Branch ([[@LINE]]:11): [True: 1, False: 0]215 216}217 218void do_fallthrough() {         // CHECK: @LINE|{{.*}}do_fallthrough()219  for (int i = 0; i < 10; ++i) {// BRCOV: Branch ([[@LINE]]:19): [True: [[#min(C,10)]], False: 1]220    int j = 0;221    do {222      // The number of exits out of this do-loop via the break statement223      // exceeds the counter value for the loop (which does not include the224      // fallthrough count). Make sure that does not violate any assertions.225      if (i < 8) break;226      j++;227    } while (j < 2);            // BRCOV: Branch ([[@LINE]]:14): [True: [[#min(C,2)]], False: [[#min(C,2)]]]228  }229}230 231static void static_func() {     // CHECK: @LINE|{{.*}}static_func()232  for (int i = 0; i < 10; ++i) {// BRCOV: Branch ([[@LINE]]:19): [True: [[#min(C,10)]], False: 1]233  }234}235 236 237 238 239 240 241 242 243 244 245int main(int argc, const char *argv[]) {246  simple_loops();247  conditionals();248  early_exits();249  jumps();250  switches();251  big_switch();252  boolean_operators();253  boolop_loops();254  conditional_operator();255  do_fallthrough();256  static_func();257  (void)0;258  (void)0;259  return 0;260}261