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