annotate gcc/testsuite/gcc.dg/strlenopt-70.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
145
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
1 /* PR tree-optimization/91183 - strlen of a strcpy result with a conditional
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
2 source not folded
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
3 Test to verify that strlen can determine string lengths from wider stores
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
4 than narrow characters. This matters because on targets that can handle
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
5 unaligned stores and where GCC lowers multi-character stores into smaller
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
6 numbers of wider stores.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
7 { dg-do compile }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
8 { dg-options "-O2 -fdump-tree-optimized" } */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
9
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
10 #include "strlenopt.h"
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
11
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
12 #define CHAR_BIT __CHAR_BIT__
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
13
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
14 typedef __UINT16_TYPE__ uint16_t;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
15 typedef __UINT32_TYPE__ uint32_t;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
16 typedef __UINT64_TYPE__ uint64_t;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
17 typedef __UINT64_TYPE__ uint64_t;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
18
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
19 #define CAT(x, y) x ## y
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
20 #define CONCAT(x, y) CAT (x, y)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
21 #define FAILNAME(name) CONCAT (call_ ## name ##_on_line_, __LINE__)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
22
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
23 #define FAIL(name) do { \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
24 extern void FAILNAME (name) (void); \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
25 FAILNAME (name)(); \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
26 } while (0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
27
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
28 /* Macros to emit a call to function named
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
29 call_failed_to_be_eliminated_on_line_NNN()
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
30 for each call that's expected to be eliminated. The dg-final
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
31 scan-tree-dump-time directive at the bottom of the test verifies
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
32 that no such call appears in output. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
33 #define ELIM(expr) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
34 if ((expr)) FAIL (not_eliminated); else (void)0
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
35
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
36 /* Verify that 'strlen (A) EXPECT' is folded to true. When non-null,
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
37 the first sizeof (INIT) - 1 bytes of the INIT arrray are stored
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
38 in A first, followed by *(TYPE*)A = ASSIGN. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
39 #define T(init, type, off, assign, expect) do { \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
40 char a[32]; \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
41 memcpy (a, init ? init : "", init ? sizeof init - 1 : 0); \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
42 *(type*)(a + off) = assign; \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
43 ELIM (!(strlen (a) expect)); \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
44 } while (0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
45
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
46 /* Same as T but works around the optimizer dropping the initializing
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
47 store before the assignment and defeating the strlen optimization. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
48 #define TX(init, type, off, assign, expect) do { \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
49 char a[32]; \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
50 strcpy (a, init + 2); \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
51 strcat (a, init + sizeof (init) - 3); \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
52 *(type*)(a + off) = assign; \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
53 ELIM (!(strlen (a) expect)); \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
54 } while (0)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
55
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
56 /* Evaluates to an element at index I of the literal S padded with nuls
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
57 on the right. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
58 #define ELT(s, i) ((s "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")[i])
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
59
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
60 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
61 /* Form a big-endian 16, 32, 64, and 128-byte integer from a string. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
62 # define I16(s) (((uint16_t)ELT (s, 0) << 8) + (uint16_t)ELT (s, 1))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
63 # define I32(s) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
64 (((uint32_t)ELT (s, 0) << 24) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
65 + ((uint32_t)ELT (s, 1) << 16) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
66 + ((uint32_t)ELT (s, 2) << 8) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
67 + (uint32_t)ELT (s, 3))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
68 # define I64(s) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
69 (((uint64_t)ELT (s, 0) << 56) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
70 + ((uint64_t)ELT (s, 1) << 48) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
71 + ((uint64_t)ELT (s, 2) << 40) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
72 + ((uint64_t)ELT (s, 3) << 32) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
73 + ((uint64_t)ELT (s, 4) << 24) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
74 + ((uint64_t)ELT (s, 5) << 16) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
75 + ((uint64_t)ELT (s, 6) << 8) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
76 + ELT (s, 7))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
77 # define I128(s) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
78 (((uint128_t)ELT (s, 0) << (64 + 56)) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
79 + ((uint128_t)ELT (s, 1) << (64 + 48)) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
80 + ((uint128_t)ELT (s, 2) << (64 + 40)) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
81 + ((uint128_t)ELT (s, 3) << (64 + 32)) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
82 + ((uint128_t)ELT (s, 4) << (64 + 24)) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
83 + ((uint128_t)ELT (s, 5) << (64 + 16)) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
84 + ((uint128_t)ELT (s, 6) << (64 + 8)) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
85 + ((uint128_t)ELT (s, 7) << 64) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
86 + ((uint128_t)ELT (s, 8) << 56) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
87 + ((uint128_t)ELT (s, 9) << 48) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
88 + ((uint128_t)ELT (s, 10) << 40) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
89 + ((uint128_t)ELT (s, 11) << 32) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
90 + ((uint128_t)ELT (s, 12) << 24) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
91 + ((uint128_t)ELT (s, 13) << 16) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
92 + ((uint128_t)ELT (s, 14) << 8) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
93 + (uint128_t)ELT (s, 15))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
94
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
95 #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
96 /* Form a little-endian 16, 32, 64, and 128-byte integer from a string. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
97 # define I16(s) (((uint16_t)ELT (s, 1) << 8) + (uint16_t)ELT (s, 0))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
98 # define I32(s) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
99 (((uint32_t)ELT (s, 3) << 24) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
100 + ((uint32_t)ELT (s, 2) << 16) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
101 + ((uint32_t)ELT (s, 1) << 8) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
102 + (uint32_t)ELT (s, 0))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
103 # define I64(s) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
104 (((uint64_t)ELT (s, 7) << 56) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
105 + ((uint64_t)ELT (s, 6) << 48) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
106 + ((uint64_t)ELT (s, 5) << 40) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
107 + ((uint64_t)ELT (s, 4) << 32) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
108 + ((uint64_t)ELT (s, 3) << 24) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
109 + ((uint64_t)ELT (s, 2) << 16) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
110 + ((uint64_t)ELT (s, 1) << 8) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
111 + ELT (s, 0))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
112 # define I128(s) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
113 (((uint128_t)ELT (s, 15) << (64 + 56)) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
114 + ((uint128_t)ELT (s, 14) << (64 + 48)) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
115 + ((uint128_t)ELT (s, 13) << (64 + 40)) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
116 + ((uint128_t)ELT (s, 12) << (64 + 32)) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
117 + ((uint128_t)ELT (s, 11) << (64 + 24)) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
118 + ((uint128_t)ELT (s, 10) << (64 + 16)) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
119 + ((uint128_t)ELT (s, 9) << (64 + 8)) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
120 + ((uint128_t)ELT (s, 8) << 64) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
121 + ((uint128_t)ELT (s, 7) << 56) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
122 + ((uint128_t)ELT (s, 6) << 48) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
123 + ((uint128_t)ELT (s, 5) << 40) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
124 + ((uint128_t)ELT (s, 4) << 32) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
125 + ((uint128_t)ELT (s, 3) << 24) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
126 + ((uint128_t)ELT (s, 2) << 16) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
127 + ((uint128_t)ELT (s, 1) << 8) \
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
128 + (uint128_t)ELT (s, 0))
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
129 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
130
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
131 #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
132
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
133 void store_16bit_be (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
134 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
135 T ("xxx", uint16_t, 0, 0x0001, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
136 T ("xxx", uint16_t, 0, 0x0010, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
137 T ("xxx", uint16_t, 0, 0x0011, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
138 T ("xxx", uint16_t, 0, 0x0100, == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
139 T ("xxx", uint16_t, 0, 0x1000, == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
140 T ("xxx", uint16_t, 0, 0x1100, == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
141 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
142
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
143 #elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
144
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
145 void store_16bit_le (int i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
146 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
147 uint16_t x0000 = I16 ("\0\0");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
148 uint16_t x0001 = 0x0001;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
149 uint16_t x0010 = 0x0010;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
150 uint16_t x0011 = 0x0011;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
151 uint16_t x0100 = 0x0100;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
152 uint16_t x1000 = 0x1000;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
153 uint16_t x1100 = 0x1100;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
154
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
155 T (0, uint16_t, 0, x0000, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
156 T ("x", uint16_t, 0, x0000, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
157 T ("xx", uint16_t, 0, x0000, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
158 T ("xxxx", uint16_t, 0, x0000, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
159 T (0, uint16_t, 0, x0001, == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
160 T ("\0\0\0", uint16_t, 0, x0001, == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
161 T (0, uint16_t, 0, x0010, == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
162 T ("x\0\0", uint16_t, 0, x0010, == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
163 T (0, uint16_t, 0, x0011, == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
164 T ("xx\0", uint16_t, 0, x0011, == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
165 T (0, uint16_t, 0, x0100, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
166 T ("\0\0\0", uint16_t, 0, x0100, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
167 T (0, uint16_t, 0, x1000, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
168 T ("x\0\0", uint16_t, 0, x1000, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
169 T (0, uint16_t, 0, x1100, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
170 T ("xx\0", uint16_t, 0, x1100, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
171
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
172 // FIXME: This fails because of the next test but succeeds on its own.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
173 // T (0, uint16_t, 0, i ? x0001 : x0010, == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
174 T ("xxx", uint16_t, 0, i ? x0100 : x1100, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
175 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
176
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
177 #endif
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
178
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
179 void store_32bit (volatile int i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
180 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
181 T (0, uint32_t, 0, 0, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
182 T ("x", uint32_t, 0, 0, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
183 T ("xx", uint32_t, 0, 0, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
184 T ("xxx", uint32_t, 0, 0, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
185 T ("xxxx", uint32_t, 0, 0, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
186
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
187 T ("\0", uint32_t, 1, 0, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
188 T ("x", uint32_t, 1, 0, == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
189 T ("xx", uint32_t, 2, 0, == 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
190 T ("xxx", uint32_t, 3, 0, == 3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
191
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
192 T ("xxx", uint32_t, 0, I32 ("\1\0\0\0"), == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
193 T ("xxx", uint32_t, 0, I32 ("\0\1\0\0"), == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
194 T ("xxx", uint32_t, 0, I32 ("\0\0\1\0"), == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
195 T ("xxx", uint32_t, 0, I32 ("\0\0\0\1"), == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
196
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
197 T ("xxx", uint32_t, 0, I32 ("\1\2\0\0"), == 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
198 T ("xxx", uint32_t, 0, I32 ("\0\1\2\0"), == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
199 T ("xxx", uint32_t, 0, I32 ("\0\0\1\2"), == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
200
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
201 T ("xxx", uint32_t, 0, I32 ("\1\2\3\0"), == 3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
202 T ("xxx", uint32_t, 0, I32 ("\0\1\2\3"), == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
203
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
204 uint32_t x123_ = I32 ("123\0");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
205 uint32_t x12__ = I32 ("12\0\0");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
206 uint32_t x1___ = I32 ("1\0\0\0");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
207
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
208 // FIXME: Upper bound not implemented yet.
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
209 /* T ("xxxx", uint32_t, 0, i ? x123_ : x12__, <= 3); */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
210 T ("xxxx", uint32_t, 0, i ? x123_ : x12__, >= 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
211 T ("xxxx", uint32_t, 0, i ? x12__ : x123_, >= 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
212 /* T ("xxxx", uint32_t, 0, i ? x123_ : x1___, <= 3); */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
213 T ("xxxx", uint32_t, 0, i ? x123_ : x1___, >= 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
214 T ("xxxx", uint32_t, 0, i ? x1___ : x123_, >= 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
215
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
216 TX ("abcde", uint32_t, 0, i ? I32 ("1234") : I32 ("1235"), == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
217 TX ("abcde", uint32_t, 1, i ? I32 ("1234") : I32 ("1235"), == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
218
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
219 TX ("abcdef", uint32_t, 0, i ? I32 ("1235") : I32 ("1234"), == 6);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
220 TX ("abcdef", uint32_t, 1, i ? I32 ("1235") : I32 ("1234"), == 6);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
221 TX ("abcdef", uint32_t, 2, i ? I32 ("1235") : I32 ("1234"), == 6);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
222 TX ("abcdef", uint32_t, 3, i ? I32 ("124\0") : I32 ("123\0"), == 6);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
223 TX ("abcdef", uint32_t, 3, i ? I32 ("12\0\0") : I32 ("13\0\0"), == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
224
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
225 TX ("abcdef", uint32_t, 3, i ? I32 ("12\0\0") : I32 ("123\0"), >= 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
226 /* FIXME: Upper bound not implemented yet. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
227 /* TX ("abcdef", uint32_t, 3, i ? I32 ("12\0\0") : I32 ("123\0"), < 7); */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
228 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
229
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
230 void store_64bit (int i)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
231 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
232 T ("xxxxxxx", uint64_t, 0, I64 ("\1\0\0\0\0\0\0\0\0"), == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
233 T ("xxxxxxx", uint64_t, 0, I64 ("\0\1\0\0\0\0\0\0\0"), == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
234 T ("xxxxxxx", uint64_t, 0, I64 ("\0\0\1\0\0\0\0\0\0"), == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
235 T ("xxxxxxx", uint64_t, 0, I64 ("\0\0\0\1\0\0\0\0\0"), == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
236 T ("xxxxxxx", uint64_t, 0, I64 ("\0\0\0\0\1\0\0\0\0"), == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
237 T ("xxxxxxx", uint64_t, 0, I64 ("\0\0\0\0\0\1\0\0\0"), == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
238 T ("xxxxxxx", uint64_t, 0, I64 ("\0\0\0\0\0\0\1\0\0"), == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
239 T ("xxxxxxx", uint64_t, 0, I64 ("\0\0\0\0\0\0\0\1\0"), == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
240
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
241 T ("xxxxxxx", uint64_t, 0, I64 ("\1\2\0\0\0\0\0\0\0"), == 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
242 T ("xxxxxxx", uint64_t, 0, I64 ("\0\1\2\0\0\0\0\0\0"), == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
243 T ("xxxxxxx", uint64_t, 0, I64 ("\0\0\1\2\0\0\0\0\0"), == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
244
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
245 T ("xxxxxxx", uint64_t, 0, I64 ("\1\2\3\0\0\0\0\0\0"), == 3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
246 T ("xxxxxxx", uint64_t, 0, I64 ("\0\1\2\3\0\0\0\0\0"), == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
247
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
248 T ("xxxxxxx", uint64_t, 0, I64 ("\1\2\3\4\0\0\0\0\0"), == 4);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
249 T ("xxxxxxx", uint64_t, 0, I64 ("\1\2\3\4\5\0\0\0\0"), == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
250 T ("xxxxxxx", uint64_t, 0, I64 ("\1\2\3\4\5\6\0\0\0"), == 6);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
251 T ("xxxxxxx", uint64_t, 0, I64 ("\1\2\3\4\5\6\7\0\0"), == 7);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
252
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
253 uint64_t x7777777_ = I64 ("\7\7\7\7\7\7\7");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
254 uint64_t x666666__ = I64 ("\6\6\6\6\6\6\0");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
255 uint64_t x4444____ = I64 ("\4\4\4\4\0\0\0");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
256 uint64_t x4343____ = I64 ("\4\3\4\3\0\0\0");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
257 uint64_t x1_______ = I64 ("\1\0\0\0\0\0\0");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
258
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
259 /* FIXME: Upper bound not implemented yet. */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
260 /* T ("x\0xxxxxx", uint64_t, 0, i ? x7777777_ : x666666__, <= 7); */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
261 T ("xx\0xxxxx", uint64_t, 0, i ? x7777777_ : x666666__, >= 6);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
262 T ("xxx\0xxxx", uint64_t, 1, i ? x7777777_ : x666666__, >= 7);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
263 /* T ("xxx\0xxxx", uint64_t, 0, i ? x666666__ : x1, <= 6); */
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
264 T ("xxxx\0xxx", uint64_t, 0, i ? x666666__ : x1_______, >= 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
265 T ("xxxxxx\0x", uint64_t, 0, i ? x4444____ : x4343____, == 4);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
266 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
267
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
268 #if __SIZEOF_INT128__
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
269
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
270 typedef __uint128_t uint128_t;
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
271
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
272 void store_128bit (void)
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
273 {
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
274 uint128_t x1 = I128 ("\1");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
275 uint128_t x1z1 = I128 ("\0\1");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
276 uint128_t x2z1 = I128 ("\0\0\1");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
277 uint128_t x3z1 = I128 ("\0\0\0\1");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
278 uint128_t x4z1 = I128 ("\0\0\0\0\1");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
279 uint128_t x5z1 = I128 ("\0\0\0\0\0\1");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
280 uint128_t x6z1 = I128 ("\0\0\0\0\0\0\1");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
281 uint128_t x7z1 = I128 ("\0\0\0\0\0\0\0\1");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
282 uint128_t x8z1 = I128 ("\0\0\0\0\0\0\0\0\1");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
283 uint128_t x9z1 = I128 ("\0\0\0\0\0\0\0\0\0\1");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
284 uint128_t x10z1 = I128 ("\0\0\0\0\0\0\0\0\0\0\1");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
285 uint128_t x11z1 = I128 ("\0\0\0\0\0\0\0\0\0\0\0\1");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
286 uint128_t x12z1 = I128 ("\0\0\0\0\0\0\0\0\0\0\0\0\1");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
287 uint128_t x13z1 = I128 ("\0\0\0\0\0\0\0\0\0\0\0\0\0\1");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
288 uint128_t x14z1 = I128 ("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
289 uint128_t x15z1 = I128 ("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1");
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
290
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
291 T ("xxxxxxx", uint128_t, 0, x1, == 1);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
292 T ("xxxxxxx", uint128_t, 0, x1z1, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
293 T ("xxxxxxx", uint128_t, 0, x2z1, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
294 T ("xxxxxxx", uint128_t, 0, x3z1, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
295 T ("xxxxxxx", uint128_t, 0, x4z1, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
296 T ("xxxxxxx", uint128_t, 0, x5z1, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
297 T ("xxxxxxx", uint128_t, 0, x6z1, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
298 T ("xxxxxxx", uint128_t, 0, x7z1, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
299 T ("xxxxxxx", uint128_t, 0, x8z1, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
300 T ("xxxxxxx", uint128_t, 0, x9z1, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
301 T ("xxxxxxx", uint128_t, 0, x10z1, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
302 T ("xxxxxxx", uint128_t, 0, x11z1, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
303 T ("xxxxxxx", uint128_t, 0, x12z1, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
304 T ("xxxxxxx", uint128_t, 0, x13z1, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
305 T ("xxxxxxx", uint128_t, 0, x14z1, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
306 T ("xxxxxxx", uint128_t, 0, x15z1, == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
307
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
308 T ("xxxxxxx", uint128_t, 0, I128 ("\2\1"), == 2);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
309 T ("xxxxxxx", uint128_t, 0, I128 ("\0\2\1"), == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
310
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
311 T ("xxxxxxx", uint128_t, 0, I128 ("\3\2\1"), == 3);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
312 T ("xxxxxxx", uint128_t, 0, I128 ("\0\3\2\1"), == 0);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
313
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
314 T ("xxxxxxx", uint128_t, 0, I128 ("\1\2\3\4"), == 4);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
315 T ("xxxxxxx", uint128_t, 0, I128 ("\1\2\3\4\5"), == 5);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
316 T ("xxxxxxx", uint128_t, 0, I128 ("\1\2\3\4\5\6"), == 6);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
317 T ("xxxxxxx", uint128_t, 0, I128 ("\1\2\3\4\5\6\7"), == 7);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
318 T ("xxxxxxx", uint128_t, 0, I128 ("\1\2\3\4\5\6\7\10"), == 8);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
319 T ("xxxxxxx", uint128_t, 0, I128 ("\1\2\3\4\5\6\7\10\11"), == 9);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
320 T ("xxxxxxx", uint128_t, 0, I128 ("\1\2\3\4\5\6\7\10\11\12"), == 10);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
321 T ("xxxxxxx", uint128_t, 0, I128 ("\1\2\3\4\5\6\7\10\11\12\13"), == 11);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
322 T ("xxxxxxx", uint128_t, 0, I128 ("\1\2\3\4\5\6\7\10\11\12\13\14"), == 12);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
323 T ("xxxxxxx", uint128_t, 0, I128 ("\1\2\3\4\5\6\7\10\11\12\13\14\15"), == 13);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
324 T ("xxxxxxx", uint128_t, 0, I128 ("\1\2\3\4\5\6\7\10\11\12\13\14\15\16"), == 14);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
325 T ("xxxxxxx", uint128_t, 0, I128 ("\1\2\3\4\5\6\7\10\11\12\13\14\15\16\17"), == 15);
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
326 }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
327
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
328 #endif // __SIZEOF_INT128__
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
329
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
330 /* { dg-final { scan-tree-dump-times "strlen" 0 "optimized" } }
1830386684a0 gcc-9.2.0
anatofuz
parents:
diff changeset
331 { dg-final { scan-tree-dump-times "_not_eliminated_" 0 "optimized" } } */