Mercurial > hg > CbC > CbC_gcc
comparison gcc/testsuite/gcc.dg/strlenopt-44.c @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | |
children | 1830386684a0 |
comparison
equal
deleted
inserted
replaced
111:04ced10e8804 | 131:84e7813d76e9 |
---|---|
1 /* PR tree-optimization/86083 - handle non-constant assignments in strlen | |
2 { dg-do compile } | |
3 { dg-options "-O2 -Wall -fdump-tree-optimized" } */ | |
4 | |
5 #include "range.h" | |
6 #include "strlenopt.h" | |
7 | |
8 #define CAT(x, y) x ## y | |
9 #define CONCAT(x, y) CAT (x, y) | |
10 #define FAILNAME(name) CONCAT (call_ ## name ##_on_line_, __LINE__) | |
11 | |
12 #define FAIL(name) do { \ | |
13 extern void FAILNAME (name) (void); \ | |
14 FAILNAME (name)(); \ | |
15 } while (0) | |
16 | |
17 /* Macro to emit a call to funcation named | |
18 call_in_true_branch_not_eliminated_on_line_NNN() | |
19 for each call that's expected to be eliminated. The dg-final | |
20 scan-tree-dump-time directive at the bottom of the test verifies | |
21 that no such call appears in output. */ | |
22 #define ASSERT_ELIM(expr) \ | |
23 if (!(expr)) FAIL (in_true_branch_not_eliminated); else (void)0 | |
24 | |
25 /* Macro to emit a call to a function named | |
26 call_made_in_{true,false}_branch_on_line_NNN() | |
27 for each call that's expected to be retained. The dg-final | |
28 scan-tree-dump-time directive at the bottom of the test verifies | |
29 that the expected number of both kinds of calls appears in output | |
30 (a pair for each line with the invocation of the KEEP() macro. */ | |
31 #define ASSERT_KEEP(expr) \ | |
32 if (expr) \ | |
33 FAIL (made_in_true_branch); \ | |
34 else \ | |
35 FAIL (made_in_false_branch) | |
36 | |
37 | |
38 #define ELIM(init, i, c, res) \ | |
39 do { \ | |
40 char a[] = init; \ | |
41 a[i] = c; \ | |
42 ASSERT_ELIM (strlen (a) == res); \ | |
43 } while (0) | |
44 | |
45 #define KEEP(init, i, c, res) \ | |
46 do { \ | |
47 char a[] = init; \ | |
48 a[i] = c; \ | |
49 ASSERT_KEEP (strlen (a) == res); \ | |
50 } while (0) | |
51 | |
52 | |
53 void test_elim_range (char c) | |
54 { | |
55 ELIM ("1", 0, UR (1, 2), 1); | |
56 ELIM ("1", 0, UR (1, 127), 1); | |
57 ELIM ("1", 0, UR ('0', '9'), 1); | |
58 | |
59 ELIM ("12", 0, UR (1, 127), 2); | |
60 ELIM ("12", 1, UR (1, 127), 2); | |
61 | |
62 ELIM ("123", 0, UR (1, 9), 3); | |
63 ELIM ("123", 1, UR (10, 99), 3); | |
64 ELIM ("123", 2, UR (100, 127), 3); | |
65 } | |
66 | |
67 void test_elim_anti_range (const char *s) | |
68 { | |
69 char c = *s++; | |
70 ELIM ("123", 0, c ? c : 'x', 3); | |
71 | |
72 c = *s++; | |
73 ELIM ("1234", 1, c ? c : 'y', 4); | |
74 | |
75 c = *s++; | |
76 ELIM ("123", 2, c ? c : 'z', 3); | |
77 } | |
78 | |
79 #line 1000 | |
80 | |
81 void test_keep (void) | |
82 { | |
83 size_t uchar_max = (unsigned char)-1; | |
84 | |
85 KEEP ("1", 0, UR (1, uchar_max + 1), 1); | |
86 KEEP ("1\0\3", 1, UR (1, 2), 1); | |
87 } | |
88 | |
89 /* { dg-final { scan-tree-dump-times "call_in_true_branch_not_eliminated_" 0 "optimized" } } | |
90 | |
91 { dg-final { scan-tree-dump-times "call_made_in_true_branch_on_line_1\[0-9\]\[0-9\]\[0-9\]" 2 "optimized" } } | |
92 { dg-final { scan-tree-dump-times "call_made_in_false_branch_on_line_1\[0-9\]\[0-9\]\[0-9\]" 2 "optimized" } } */ |