261 lines
3.6 KiB
C
261 lines
3.6 KiB
C
|
// Test visualization of general branch constructs in C.
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
void simple_loops() {
|
||
|
int i;
|
||
|
for (i = 0; i < 100; ++i) {
|
||
|
}
|
||
|
while (i > 0)
|
||
|
i--;
|
||
|
do {} while (i++ < 75);
|
||
|
|
||
|
}
|
||
|
|
||
|
void conditionals() {
|
||
|
for (int i = 0; i < 100; ++i) {
|
||
|
if (i % 2) {
|
||
|
if (i) {}
|
||
|
} else if (i % 3) {
|
||
|
if (i) {}
|
||
|
} else {
|
||
|
if (i) {}
|
||
|
}
|
||
|
|
||
|
if (1 && i) {}
|
||
|
if (0 || i) {}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
void early_exits() {
|
||
|
int i = 0;
|
||
|
|
||
|
if (i) {}
|
||
|
|
||
|
while (i < 100) {
|
||
|
i++;
|
||
|
if (i > 50)
|
||
|
break;
|
||
|
if (i % 2)
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if (i) {}
|
||
|
|
||
|
do {
|
||
|
if (i > 75)
|
||
|
return;
|
||
|
else
|
||
|
i++;
|
||
|
} while (i < 100);
|
||
|
|
||
|
if (i) {}
|
||
|
|
||
|
}
|
||
|
|
||
|
void jumps() {
|
||
|
int i;
|
||
|
|
||
|
for (i = 0; i < 2; ++i) {
|
||
|
goto outofloop;
|
||
|
// Never reached -> no weights
|
||
|
if (i) {}
|
||
|
}
|
||
|
|
||
|
outofloop:
|
||
|
if (i) {}
|
||
|
|
||
|
goto loop1;
|
||
|
|
||
|
while (i) {
|
||
|
loop1:
|
||
|
if (i) {}
|
||
|
}
|
||
|
|
||
|
goto loop2;
|
||
|
first:
|
||
|
second:
|
||
|
third:
|
||
|
i++;
|
||
|
if (i < 3)
|
||
|
goto loop2;
|
||
|
|
||
|
while (i < 3) {
|
||
|
loop2:
|
||
|
switch (i) {
|
||
|
case 0:
|
||
|
goto first;
|
||
|
case 1:
|
||
|
goto second;
|
||
|
case 2:
|
||
|
goto third;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < 10; ++i) {
|
||
|
goto withinloop;
|
||
|
// never reached -> no weights
|
||
|
if (i) {}
|
||
|
withinloop:
|
||
|
if (i) {}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
void switches() {
|
||
|
static int weights[] = {1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5};
|
||
|
|
||
|
// No cases -> no weights
|
||
|
switch (weights[0]) {
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
for (int i = 0, len = sizeof(weights) / sizeof(weights[0]); i < len; ++i) {
|
||
|
switch (i[weights]) {
|
||
|
case 1:
|
||
|
if (i) {}
|
||
|
// fallthrough
|
||
|
case 2:
|
||
|
if (i) {}
|
||
|
break;
|
||
|
case 3:
|
||
|
if (i) {}
|
||
|
continue;
|
||
|
case 4:
|
||
|
if (i) {}
|
||
|
switch (i) {
|
||
|
case 6 ... 9:
|
||
|
if (i) {}
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
default:
|
||
|
if (i == len - 1)
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Never reached -> no weights
|
||
|
if (weights[0]) {}
|
||
|
|
||
|
}
|
||
|
|
||
|
void big_switch() {
|
||
|
for (int i = 0; i < 32; ++i) {
|
||
|
switch (1 << i) {
|
||
|
case (1 << 0):
|
||
|
if (i) {}
|
||
|
// fallthrough
|
||
|
case (1 << 1):
|
||
|
if (i) {}
|
||
|
break;
|
||
|
case (1 << 2) ... (1 << 12):
|
||
|
if (i) {}
|
||
|
break;
|
||
|
// The branch for the large case range above appears after the case body.
|
||
|
|
||
|
case (1 << 13):
|
||
|
if (i) {}
|
||
|
break;
|
||
|
case (1 << 14) ... (1 << 28):
|
||
|
if (i) {}
|
||
|
break;
|
||
|
// The branch for the large case range above appears after the case body.
|
||
|
|
||
|
case (1 << 29) ... ((1 << 29) + 1):
|
||
|
if (i) {}
|
||
|
break;
|
||
|
default:
|
||
|
if (i) {}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
void boolean_operators() {
|
||
|
int v;
|
||
|
for (int i = 0; i < 100; ++i) {
|
||
|
v = i % 3 || i;
|
||
|
|
||
|
v = i % 3 && i;
|
||
|
|
||
|
v = i % 3 || i % 2 || i;
|
||
|
|
||
|
v = i % 2 && i % 3 && i;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
void boolop_loops() {
|
||
|
int i = 100;
|
||
|
|
||
|
while (i && i > 50)
|
||
|
i--;
|
||
|
|
||
|
while ((i % 2) || (i > 0))
|
||
|
i--;
|
||
|
|
||
|
for (i = 100; i && i > 50; --i);
|
||
|
|
||
|
for (; (i % 2) || (i > 0); --i);
|
||
|
|
||
|
}
|
||
|
|
||
|
void conditional_operator() {
|
||
|
int i = 100;
|
||
|
|
||
|
int j = i < 50 ? i : 1;
|
||
|
|
||
|
int k = i ?: 0;
|
||
|
|
||
|
}
|
||
|
|
||
|
void do_fallthrough() {
|
||
|
for (int i = 0; i < 10; ++i) {
|
||
|
int j = 0;
|
||
|
do {
|
||
|
// The number of exits out of this do-loop via the break statement
|
||
|
// exceeds the counter value for the loop (which does not include the
|
||
|
// fallthrough count). Make sure that does not violate any assertions.
|
||
|
if (i < 8) break;
|
||
|
j++;
|
||
|
} while (j < 2);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static void static_func() {
|
||
|
for (int i = 0; i < 10; ++i) {
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
int main(int argc, const char *argv[]) {
|
||
|
simple_loops();
|
||
|
conditionals();
|
||
|
early_exits();
|
||
|
jumps();
|
||
|
switches();
|
||
|
big_switch();
|
||
|
boolean_operators();
|
||
|
boolop_loops();
|
||
|
conditional_operator();
|
||
|
do_fallthrough();
|
||
|
static_func();
|
||
|
extern void __llvm_profile_write_file();
|
||
|
__llvm_profile_write_file();
|
||
|
return 0;
|
||
|
}
|