Mercurial > hg > CbC > CbC_gcc
annotate gcc/gimple.c @ 140:4e440907fcbf
copy CbC goto flang in cfgexpand
remove some CbC unnecessary code
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 14 Nov 2018 00:24:45 +0900 |
parents | d34655255c78 |
children | 351920fa3827 |
rev | line source |
---|---|
0 | 1 /* Gimple IR support functions. |
2 | |
131 | 3 Copyright (C) 2007-2018 Free Software Foundation, Inc. |
0 | 4 Contributed by Aldy Hernandez <aldyh@redhat.com> |
5 | |
6 This file is part of GCC. | |
7 | |
8 GCC is free software; you can redistribute it and/or modify it under | |
9 the terms of the GNU General Public License as published by the Free | |
10 Software Foundation; either version 3, or (at your option) any later | |
11 version. | |
12 | |
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
16 for more details. | |
17 | |
18 You should have received a copy of the GNU General Public License | |
19 along with GCC; see the file COPYING3. If not see | |
20 <http://www.gnu.org/licenses/>. */ | |
21 | |
22 #include "config.h" | |
23 #include "system.h" | |
24 #include "coretypes.h" | |
111 | 25 #include "backend.h" |
0 | 26 #include "tree.h" |
27 #include "gimple.h" | |
111 | 28 #include "ssa.h" |
29 #include "cgraph.h" | |
0 | 30 #include "diagnostic.h" |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
31 #include "alias.h" |
111 | 32 #include "fold-const.h" |
33 #include "calls.h" | |
34 #include "stor-layout.h" | |
35 #include "internal-fn.h" | |
36 #include "tree-eh.h" | |
37 #include "gimple-iterator.h" | |
38 #include "gimple-walk.h" | |
39 #include "gimplify.h" | |
40 #include "target.h" | |
41 #include "builtins.h" | |
42 #include "selftest.h" | |
43 #include "gimple-pretty-print.h" | |
44 #include "stringpool.h" | |
45 #include "attribs.h" | |
46 #include "asan.h" | |
73
ce75bd9117e4
merge calls.c, cfgexpand.c, gcc.c, gimple.c, gimple.h and gimplify.c
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
70
diff
changeset
|
47 #ifndef noCbC |
117 | 48 #include "c/cbc-tree.h" |
73
ce75bd9117e4
merge calls.c, cfgexpand.c, gcc.c, gimple.c, gimple.h and gimplify.c
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
70
diff
changeset
|
49 #endif |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
50 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
51 /* All the tuples have their operand vector (if present) at the very bottom |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
52 of the structure. Therefore, the offset required to find the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
53 operands vector the size of the structure minus the size of the 1 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
54 element tree array at the end (see gimple_ops). */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
55 #define DEFGSSTRUCT(SYM, STRUCT, HAS_TREE_OP) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
56 (HAS_TREE_OP ? sizeof (struct STRUCT) - sizeof (tree) : 0), |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
57 EXPORTED_CONST size_t gimple_ops_offset_[] = { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
58 #include "gsstruct.def" |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
59 }; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
60 #undef DEFGSSTRUCT |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
61 |
111 | 62 #define DEFGSSTRUCT(SYM, STRUCT, HAS_TREE_OP) sizeof (struct STRUCT), |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
63 static const size_t gsstruct_code_size[] = { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
64 #include "gsstruct.def" |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
65 }; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
66 #undef DEFGSSTRUCT |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
67 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
68 #define DEFGSCODE(SYM, NAME, GSSCODE) NAME, |
0 | 69 const char *const gimple_code_name[] = { |
70 #include "gimple.def" | |
71 }; | |
72 #undef DEFGSCODE | |
73 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
74 #define DEFGSCODE(SYM, NAME, GSSCODE) GSSCODE, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
75 EXPORTED_CONST enum gimple_statement_structure_enum gss_for_code_[] = { |
0 | 76 #include "gimple.def" |
77 }; | |
78 #undef DEFGSCODE | |
79 | |
80 /* Gimple stats. */ | |
81 | |
131 | 82 uint64_t gimple_alloc_counts[(int) gimple_alloc_kind_all]; |
83 uint64_t gimple_alloc_sizes[(int) gimple_alloc_kind_all]; | |
0 | 84 |
85 /* Keep in sync with gimple.h:enum gimple_alloc_kind. */ | |
86 static const char * const gimple_alloc_kind_names[] = { | |
87 "assignments", | |
88 "phi nodes", | |
89 "conditionals", | |
90 "everything else" | |
91 }; | |
92 | |
111 | 93 /* Static gimple tuple members. */ |
94 const enum gimple_code gassign::code_; | |
95 const enum gimple_code gcall::code_; | |
96 const enum gimple_code gcond::code_; | |
97 | |
0 | 98 |
99 /* Gimple tuple constructors. | |
100 Note: Any constructor taking a ``gimple_seq'' as a parameter, can | |
101 be passed a NULL to start with an empty sequence. */ | |
102 | |
103 /* Set the code for statement G to CODE. */ | |
104 | |
105 static inline void | |
111 | 106 gimple_set_code (gimple *g, enum gimple_code code) |
0 | 107 { |
111 | 108 g->code = code; |
0 | 109 } |
110 | |
111 /* Return the number of bytes needed to hold a GIMPLE statement with | |
112 code CODE. */ | |
113 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
114 static inline size_t |
0 | 115 gimple_size (enum gimple_code code) |
116 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
117 return gsstruct_code_size[gss_for_code (code)]; |
0 | 118 } |
119 | |
120 /* Allocate memory for a GIMPLE statement with code CODE and NUM_OPS | |
121 operands. */ | |
122 | |
111 | 123 gimple * |
124 gimple_alloc (enum gimple_code code, unsigned num_ops MEM_STAT_DECL) | |
0 | 125 { |
126 size_t size; | |
111 | 127 gimple *stmt; |
0 | 128 |
129 size = gimple_size (code); | |
130 if (num_ops > 0) | |
131 size += sizeof (tree) * (num_ops - 1); | |
132 | |
111 | 133 if (GATHER_STATISTICS) |
134 { | |
135 enum gimple_alloc_kind kind = gimple_alloc_kind (code); | |
136 gimple_alloc_counts[(int) kind]++; | |
137 gimple_alloc_sizes[(int) kind] += size; | |
138 } | |
139 | |
140 stmt = ggc_alloc_cleared_gimple_statement_stat (size PASS_MEM_STAT); | |
0 | 141 gimple_set_code (stmt, code); |
142 gimple_set_num_ops (stmt, num_ops); | |
143 | |
144 /* Do not call gimple_set_modified here as it has other side | |
145 effects and this tuple is still not completely built. */ | |
111 | 146 stmt->modified = 1; |
147 gimple_init_singleton (stmt); | |
0 | 148 |
149 return stmt; | |
150 } | |
151 | |
152 /* Set SUBCODE to be the code of the expression computed by statement G. */ | |
153 | |
154 static inline void | |
111 | 155 gimple_set_subcode (gimple *g, unsigned subcode) |
0 | 156 { |
157 /* We only have 16 bits for the RHS code. Assert that we are not | |
158 overflowing it. */ | |
159 gcc_assert (subcode < (1 << 16)); | |
111 | 160 g->subcode = subcode; |
0 | 161 } |
162 | |
163 | |
164 | |
165 /* Build a tuple with operands. CODE is the statement to build (which | |
111 | 166 must be one of the GIMPLE_WITH_OPS tuples). SUBCODE is the subcode |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
167 for the new tuple. NUM_OPS is the number of operands to allocate. */ |
0 | 168 |
169 #define gimple_build_with_ops(c, s, n) \ | |
170 gimple_build_with_ops_stat (c, s, n MEM_STAT_INFO) | |
171 | |
111 | 172 static gimple * |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
173 gimple_build_with_ops_stat (enum gimple_code code, unsigned subcode, |
0 | 174 unsigned num_ops MEM_STAT_DECL) |
175 { | |
111 | 176 gimple *s = gimple_alloc (code, num_ops PASS_MEM_STAT); |
0 | 177 gimple_set_subcode (s, subcode); |
178 | |
179 return s; | |
180 } | |
181 | |
182 | |
183 /* Build a GIMPLE_RETURN statement returning RETVAL. */ | |
184 | |
111 | 185 greturn * |
0 | 186 gimple_build_return (tree retval) |
187 { | |
111 | 188 greturn *s |
189 = as_a <greturn *> (gimple_build_with_ops (GIMPLE_RETURN, ERROR_MARK, | |
190 2)); | |
0 | 191 if (retval) |
192 gimple_return_set_retval (s, retval); | |
193 return s; | |
194 } | |
195 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
196 /* Reset alias information on call S. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
197 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
198 void |
111 | 199 gimple_call_reset_alias_info (gcall *s) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
200 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
201 if (gimple_call_flags (s) & ECF_CONST) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
202 memset (gimple_call_use_set (s), 0, sizeof (struct pt_solution)); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
203 else |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
204 pt_solution_reset (gimple_call_use_set (s)); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
205 if (gimple_call_flags (s) & (ECF_CONST|ECF_PURE|ECF_NOVOPS)) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
206 memset (gimple_call_clobber_set (s), 0, sizeof (struct pt_solution)); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
207 else |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
208 pt_solution_reset (gimple_call_clobber_set (s)); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
209 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
210 |
111 | 211 /* Helper for gimple_build_call, gimple_build_call_valist, |
212 gimple_build_call_vec and gimple_build_call_from_tree. Build the basic | |
213 components of a GIMPLE_CALL statement to function FN with NARGS | |
214 arguments. */ | |
215 | |
216 static inline gcall * | |
0 | 217 gimple_build_call_1 (tree fn, unsigned nargs) |
218 { | |
111 | 219 gcall *s |
220 = as_a <gcall *> (gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK, | |
221 nargs + 3)); | |
0 | 222 if (TREE_CODE (fn) == FUNCTION_DECL) |
223 fn = build_fold_addr_expr (fn); | |
224 gimple_set_op (s, 1, fn); | |
111 | 225 gimple_call_set_fntype (s, TREE_TYPE (TREE_TYPE (fn))); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
226 gimple_call_reset_alias_info (s); |
0 | 227 return s; |
228 } | |
229 | |
230 | |
231 /* Build a GIMPLE_CALL statement to function FN with the arguments | |
232 specified in vector ARGS. */ | |
233 | |
111 | 234 gcall * |
235 gimple_build_call_vec (tree fn, vec<tree> args) | |
0 | 236 { |
237 unsigned i; | |
111 | 238 unsigned nargs = args.length (); |
239 gcall *call = gimple_build_call_1 (fn, nargs); | |
0 | 240 |
241 for (i = 0; i < nargs; i++) | |
111 | 242 gimple_call_set_arg (call, i, args[i]); |
0 | 243 |
244 return call; | |
245 } | |
246 | |
247 | |
248 /* Build a GIMPLE_CALL statement to function FN. NARGS is the number of | |
249 arguments. The ... are the arguments. */ | |
250 | |
111 | 251 gcall * |
0 | 252 gimple_build_call (tree fn, unsigned nargs, ...) |
253 { | |
254 va_list ap; | |
111 | 255 gcall *call; |
0 | 256 unsigned i; |
257 | |
258 gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn)); | |
259 | |
260 call = gimple_build_call_1 (fn, nargs); | |
261 | |
262 va_start (ap, nargs); | |
263 for (i = 0; i < nargs; i++) | |
264 gimple_call_set_arg (call, i, va_arg (ap, tree)); | |
265 va_end (ap); | |
266 | |
267 return call; | |
268 } | |
269 | |
270 | |
111 | 271 /* Build a GIMPLE_CALL statement to function FN. NARGS is the number of |
272 arguments. AP contains the arguments. */ | |
273 | |
274 gcall * | |
275 gimple_build_call_valist (tree fn, unsigned nargs, va_list ap) | |
276 { | |
277 gcall *call; | |
278 unsigned i; | |
279 | |
280 gcc_assert (TREE_CODE (fn) == FUNCTION_DECL || is_gimple_call_addr (fn)); | |
281 | |
282 call = gimple_build_call_1 (fn, nargs); | |
283 | |
284 for (i = 0; i < nargs; i++) | |
285 gimple_call_set_arg (call, i, va_arg (ap, tree)); | |
286 | |
287 return call; | |
288 } | |
289 | |
290 | |
291 /* Helper for gimple_build_call_internal and gimple_build_call_internal_vec. | |
292 Build the basic components of a GIMPLE_CALL statement to internal | |
293 function FN with NARGS arguments. */ | |
294 | |
295 static inline gcall * | |
296 gimple_build_call_internal_1 (enum internal_fn fn, unsigned nargs) | |
297 { | |
298 gcall *s | |
299 = as_a <gcall *> (gimple_build_with_ops (GIMPLE_CALL, ERROR_MARK, | |
300 nargs + 3)); | |
301 s->subcode |= GF_CALL_INTERNAL; | |
302 gimple_call_set_internal_fn (s, fn); | |
303 gimple_call_reset_alias_info (s); | |
304 return s; | |
305 } | |
306 | |
307 | |
308 /* Build a GIMPLE_CALL statement to internal function FN. NARGS is | |
309 the number of arguments. The ... are the arguments. */ | |
310 | |
311 gcall * | |
312 gimple_build_call_internal (enum internal_fn fn, unsigned nargs, ...) | |
313 { | |
314 va_list ap; | |
315 gcall *call; | |
316 unsigned i; | |
317 | |
318 call = gimple_build_call_internal_1 (fn, nargs); | |
319 va_start (ap, nargs); | |
320 for (i = 0; i < nargs; i++) | |
321 gimple_call_set_arg (call, i, va_arg (ap, tree)); | |
322 va_end (ap); | |
323 | |
324 return call; | |
325 } | |
326 | |
327 | |
328 /* Build a GIMPLE_CALL statement to internal function FN with the arguments | |
329 specified in vector ARGS. */ | |
330 | |
331 gcall * | |
332 gimple_build_call_internal_vec (enum internal_fn fn, vec<tree> args) | |
333 { | |
334 unsigned i, nargs; | |
335 gcall *call; | |
336 | |
337 nargs = args.length (); | |
338 call = gimple_build_call_internal_1 (fn, nargs); | |
339 for (i = 0; i < nargs; i++) | |
340 gimple_call_set_arg (call, i, args[i]); | |
341 | |
342 return call; | |
343 } | |
344 | |
345 | |
0 | 346 /* Build a GIMPLE_CALL statement from CALL_EXPR T. Note that T is |
347 assumed to be in GIMPLE form already. Minimal checking is done of | |
348 this fact. */ | |
349 | |
111 | 350 gcall * |
351 gimple_build_call_from_tree (tree t, tree fnptrtype) | |
0 | 352 { |
353 unsigned i, nargs; | |
111 | 354 gcall *call; |
0 | 355 |
356 gcc_assert (TREE_CODE (t) == CALL_EXPR); | |
357 | |
358 nargs = call_expr_nargs (t); | |
131 | 359 |
360 tree fndecl = NULL_TREE; | |
361 if (CALL_EXPR_FN (t) == NULL_TREE) | |
362 call = gimple_build_call_internal_1 (CALL_EXPR_IFN (t), nargs); | |
363 else | |
364 { | |
365 fndecl = get_callee_fndecl (t); | |
366 call = gimple_build_call_1 (fndecl ? fndecl : CALL_EXPR_FN (t), nargs); | |
367 } | |
0 | 368 |
369 for (i = 0; i < nargs; i++) | |
370 gimple_call_set_arg (call, i, CALL_EXPR_ARG (t, i)); | |
371 | |
372 gimple_set_block (call, TREE_BLOCK (t)); | |
131 | 373 gimple_set_location (call, EXPR_LOCATION (t)); |
0 | 374 |
375 /* Carry all the CALL_EXPR flags to the new GIMPLE_CALL. */ | |
376 gimple_call_set_chain (call, CALL_EXPR_STATIC_CHAIN (t)); | |
377 gimple_call_set_tail (call, CALL_EXPR_TAILCALL (t)); | |
111 | 378 gimple_call_set_must_tail (call, CALL_EXPR_MUST_TAIL_CALL (t)); |
0 | 379 gimple_call_set_return_slot_opt (call, CALL_EXPR_RETURN_SLOT_OPT (t)); |
111 | 380 if (fndecl |
131 | 381 && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL) |
111 | 382 && ALLOCA_FUNCTION_CODE_P (DECL_FUNCTION_CODE (fndecl))) |
383 gimple_call_set_alloca_for_var (call, CALL_ALLOCA_FOR_VAR_P (t)); | |
384 else | |
385 gimple_call_set_from_thunk (call, CALL_FROM_THUNK_P (t)); | |
0 | 386 gimple_call_set_va_arg_pack (call, CALL_EXPR_VA_ARG_PACK (t)); |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
387 gimple_call_set_nothrow (call, TREE_NOTHROW (t)); |
111 | 388 gimple_call_set_by_descriptor (call, CALL_EXPR_BY_DESCRIPTOR (t)); |
73
ce75bd9117e4
merge calls.c, cfgexpand.c, gcc.c, gimple.c, gimple.h and gimplify.c
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
70
diff
changeset
|
389 #ifndef noCbC |
140
4e440907fcbf
copy CbC goto flang in cfgexpand
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
132
diff
changeset
|
390 gimple_call_set_cbc_goto (call, CbC_IS_CbC_GOTO (t)); |
73
ce75bd9117e4
merge calls.c, cfgexpand.c, gcc.c, gimple.c, gimple.h and gimplify.c
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
70
diff
changeset
|
391 #endif |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
392 gimple_set_no_warning (call, TREE_NO_WARNING (t)); |
111 | 393 |
394 if (fnptrtype) | |
395 { | |
396 gimple_call_set_fntype (call, TREE_TYPE (fnptrtype)); | |
397 | |
398 /* Check if it's an indirect CALL and the type has the | |
399 nocf_check attribute. In that case propagate the information | |
400 to the gimple CALL insn. */ | |
401 if (!fndecl) | |
402 { | |
403 gcc_assert (POINTER_TYPE_P (fnptrtype)); | |
404 tree fntype = TREE_TYPE (fnptrtype); | |
405 | |
406 if (lookup_attribute ("nocf_check", TYPE_ATTRIBUTES (fntype))) | |
407 gimple_call_set_nocf_check (call, TRUE); | |
408 } | |
409 } | |
0 | 410 |
411 return call; | |
412 } | |
413 | |
414 | |
415 /* Build a GIMPLE_ASSIGN statement. | |
416 | |
417 LHS of the assignment. | |
418 RHS of the assignment which can be unary or binary. */ | |
419 | |
111 | 420 gassign * |
421 gimple_build_assign (tree lhs, tree rhs MEM_STAT_DECL) | |
0 | 422 { |
423 enum tree_code subcode; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
424 tree op1, op2, op3; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
425 |
111 | 426 extract_ops_from_tree (rhs, &subcode, &op1, &op2, &op3); |
427 return gimple_build_assign (lhs, subcode, op1, op2, op3 PASS_MEM_STAT); | |
0 | 428 } |
429 | |
430 | |
111 | 431 /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands |
432 OP1, OP2 and OP3. */ | |
433 | |
434 static inline gassign * | |
435 gimple_build_assign_1 (tree lhs, enum tree_code subcode, tree op1, | |
436 tree op2, tree op3 MEM_STAT_DECL) | |
0 | 437 { |
438 unsigned num_ops; | |
111 | 439 gassign *p; |
0 | 440 |
441 /* Need 1 operand for LHS and 1 or 2 for the RHS (depending on the | |
442 code). */ | |
443 num_ops = get_gimple_rhs_num_ops (subcode) + 1; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
444 |
111 | 445 p = as_a <gassign *> ( |
446 gimple_build_with_ops_stat (GIMPLE_ASSIGN, (unsigned)subcode, num_ops | |
447 PASS_MEM_STAT)); | |
0 | 448 gimple_assign_set_lhs (p, lhs); |
449 gimple_assign_set_rhs1 (p, op1); | |
450 if (op2) | |
451 { | |
452 gcc_assert (num_ops > 2); | |
453 gimple_assign_set_rhs2 (p, op2); | |
454 } | |
455 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
456 if (op3) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
457 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
458 gcc_assert (num_ops > 3); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
459 gimple_assign_set_rhs3 (p, op3); |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
460 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
461 |
0 | 462 return p; |
463 } | |
464 | |
111 | 465 /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands |
466 OP1, OP2 and OP3. */ | |
467 | |
468 gassign * | |
469 gimple_build_assign (tree lhs, enum tree_code subcode, tree op1, | |
470 tree op2, tree op3 MEM_STAT_DECL) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
471 { |
111 | 472 return gimple_build_assign_1 (lhs, subcode, op1, op2, op3 PASS_MEM_STAT); |
473 } | |
474 | |
475 /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operands | |
476 OP1 and OP2. */ | |
477 | |
478 gassign * | |
479 gimple_build_assign (tree lhs, enum tree_code subcode, tree op1, | |
480 tree op2 MEM_STAT_DECL) | |
481 { | |
482 return gimple_build_assign_1 (lhs, subcode, op1, op2, NULL_TREE | |
483 PASS_MEM_STAT); | |
484 } | |
485 | |
486 /* Build a GIMPLE_ASSIGN statement with subcode SUBCODE and operand OP1. */ | |
487 | |
488 gassign * | |
489 gimple_build_assign (tree lhs, enum tree_code subcode, tree op1 MEM_STAT_DECL) | |
490 { | |
491 return gimple_build_assign_1 (lhs, subcode, op1, NULL_TREE, NULL_TREE | |
492 PASS_MEM_STAT); | |
0 | 493 } |
494 | |
495 | |
496 /* Build a GIMPLE_COND statement. | |
497 | |
498 PRED is the condition used to compare LHS and the RHS. | |
499 T_LABEL is the label to jump to if the condition is true. | |
500 F_LABEL is the label to jump to otherwise. */ | |
501 | |
111 | 502 gcond * |
0 | 503 gimple_build_cond (enum tree_code pred_code, tree lhs, tree rhs, |
504 tree t_label, tree f_label) | |
505 { | |
111 | 506 gcond *p; |
0 | 507 |
508 gcc_assert (TREE_CODE_CLASS (pred_code) == tcc_comparison); | |
111 | 509 p = as_a <gcond *> (gimple_build_with_ops (GIMPLE_COND, pred_code, 4)); |
0 | 510 gimple_cond_set_lhs (p, lhs); |
511 gimple_cond_set_rhs (p, rhs); | |
512 gimple_cond_set_true_label (p, t_label); | |
513 gimple_cond_set_false_label (p, f_label); | |
514 return p; | |
515 } | |
516 | |
517 /* Build a GIMPLE_COND statement from the conditional expression tree | |
518 COND. T_LABEL and F_LABEL are as in gimple_build_cond. */ | |
519 | |
111 | 520 gcond * |
0 | 521 gimple_build_cond_from_tree (tree cond, tree t_label, tree f_label) |
522 { | |
523 enum tree_code code; | |
524 tree lhs, rhs; | |
525 | |
526 gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs); | |
527 return gimple_build_cond (code, lhs, rhs, t_label, f_label); | |
528 } | |
529 | |
530 /* Set code, lhs, and rhs of a GIMPLE_COND from a suitable | |
531 boolean expression tree COND. */ | |
532 | |
533 void | |
111 | 534 gimple_cond_set_condition_from_tree (gcond *stmt, tree cond) |
0 | 535 { |
536 enum tree_code code; | |
537 tree lhs, rhs; | |
538 | |
539 gimple_cond_get_ops_from_tree (cond, &code, &lhs, &rhs); | |
540 gimple_cond_set_condition (stmt, code, lhs, rhs); | |
541 } | |
542 | |
543 /* Build a GIMPLE_LABEL statement for LABEL. */ | |
544 | |
111 | 545 glabel * |
0 | 546 gimple_build_label (tree label) |
547 { | |
111 | 548 glabel *p |
549 = as_a <glabel *> (gimple_build_with_ops (GIMPLE_LABEL, ERROR_MARK, 1)); | |
0 | 550 gimple_label_set_label (p, label); |
551 return p; | |
552 } | |
553 | |
554 /* Build a GIMPLE_GOTO statement to label DEST. */ | |
555 | |
111 | 556 ggoto * |
0 | 557 gimple_build_goto (tree dest) |
558 { | |
111 | 559 ggoto *p |
560 = as_a <ggoto *> (gimple_build_with_ops (GIMPLE_GOTO, ERROR_MARK, 1)); | |
0 | 561 gimple_goto_set_dest (p, dest); |
562 return p; | |
563 } | |
564 | |
565 | |
566 /* Build a GIMPLE_NOP statement. */ | |
567 | |
111 | 568 gimple * |
0 | 569 gimple_build_nop (void) |
570 { | |
571 return gimple_alloc (GIMPLE_NOP, 0); | |
572 } | |
573 | |
574 | |
575 /* Build a GIMPLE_BIND statement. | |
576 VARS are the variables in BODY. | |
577 BLOCK is the containing block. */ | |
578 | |
111 | 579 gbind * |
0 | 580 gimple_build_bind (tree vars, gimple_seq body, tree block) |
581 { | |
111 | 582 gbind *p = as_a <gbind *> (gimple_alloc (GIMPLE_BIND, 0)); |
0 | 583 gimple_bind_set_vars (p, vars); |
584 if (body) | |
585 gimple_bind_set_body (p, body); | |
586 if (block) | |
587 gimple_bind_set_block (p, block); | |
588 return p; | |
589 } | |
590 | |
591 /* Helper function to set the simple fields of a asm stmt. | |
592 | |
593 STRING is a pointer to a string that is the asm blocks assembly code. | |
594 NINPUT is the number of register inputs. | |
595 NOUTPUT is the number of register outputs. | |
596 NCLOBBERS is the number of clobbered registers. | |
597 */ | |
598 | |
111 | 599 static inline gasm * |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
600 gimple_build_asm_1 (const char *string, unsigned ninputs, unsigned noutputs, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
601 unsigned nclobbers, unsigned nlabels) |
0 | 602 { |
111 | 603 gasm *p; |
0 | 604 int size = strlen (string); |
605 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
606 /* ASMs with labels cannot have outputs. This should have been |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
607 enforced by the front end. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
608 gcc_assert (nlabels == 0 || noutputs == 0); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
609 |
111 | 610 p = as_a <gasm *> ( |
611 gimple_build_with_ops (GIMPLE_ASM, ERROR_MARK, | |
612 ninputs + noutputs + nclobbers + nlabels)); | |
613 | |
614 p->ni = ninputs; | |
615 p->no = noutputs; | |
616 p->nc = nclobbers; | |
617 p->nl = nlabels; | |
618 p->string = ggc_alloc_string (string, size); | |
619 | |
620 if (GATHER_STATISTICS) | |
621 gimple_alloc_sizes[(int) gimple_alloc_kind (GIMPLE_ASM)] += size; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
622 |
0 | 623 return p; |
624 } | |
625 | |
626 /* Build a GIMPLE_ASM statement. | |
627 | |
628 STRING is the assembly code. | |
629 NINPUT is the number of register inputs. | |
630 NOUTPUT is the number of register outputs. | |
631 NCLOBBERS is the number of clobbered registers. | |
632 INPUTS is a vector of the input register parameters. | |
633 OUTPUTS is a vector of the output register parameters. | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
634 CLOBBERS is a vector of the clobbered register parameters. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
635 LABELS is a vector of destination labels. */ |
0 | 636 |
111 | 637 gasm * |
638 gimple_build_asm_vec (const char *string, vec<tree, va_gc> *inputs, | |
639 vec<tree, va_gc> *outputs, vec<tree, va_gc> *clobbers, | |
640 vec<tree, va_gc> *labels) | |
0 | 641 { |
111 | 642 gasm *p; |
0 | 643 unsigned i; |
644 | |
645 p = gimple_build_asm_1 (string, | |
111 | 646 vec_safe_length (inputs), |
647 vec_safe_length (outputs), | |
648 vec_safe_length (clobbers), | |
649 vec_safe_length (labels)); | |
650 | |
651 for (i = 0; i < vec_safe_length (inputs); i++) | |
652 gimple_asm_set_input_op (p, i, (*inputs)[i]); | |
653 | |
654 for (i = 0; i < vec_safe_length (outputs); i++) | |
655 gimple_asm_set_output_op (p, i, (*outputs)[i]); | |
656 | |
657 for (i = 0; i < vec_safe_length (clobbers); i++) | |
658 gimple_asm_set_clobber_op (p, i, (*clobbers)[i]); | |
659 | |
660 for (i = 0; i < vec_safe_length (labels); i++) | |
661 gimple_asm_set_label_op (p, i, (*labels)[i]); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
662 |
0 | 663 return p; |
664 } | |
665 | |
666 /* Build a GIMPLE_CATCH statement. | |
667 | |
668 TYPES are the catch types. | |
669 HANDLER is the exception handler. */ | |
670 | |
111 | 671 gcatch * |
0 | 672 gimple_build_catch (tree types, gimple_seq handler) |
673 { | |
111 | 674 gcatch *p = as_a <gcatch *> (gimple_alloc (GIMPLE_CATCH, 0)); |
0 | 675 gimple_catch_set_types (p, types); |
676 if (handler) | |
677 gimple_catch_set_handler (p, handler); | |
678 | |
679 return p; | |
680 } | |
681 | |
682 /* Build a GIMPLE_EH_FILTER statement. | |
683 | |
684 TYPES are the filter's types. | |
685 FAILURE is the filter's failure action. */ | |
686 | |
111 | 687 geh_filter * |
0 | 688 gimple_build_eh_filter (tree types, gimple_seq failure) |
689 { | |
111 | 690 geh_filter *p = as_a <geh_filter *> (gimple_alloc (GIMPLE_EH_FILTER, 0)); |
0 | 691 gimple_eh_filter_set_types (p, types); |
692 if (failure) | |
693 gimple_eh_filter_set_failure (p, failure); | |
694 | |
695 return p; | |
696 } | |
697 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
698 /* Build a GIMPLE_EH_MUST_NOT_THROW statement. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
699 |
111 | 700 geh_mnt * |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
701 gimple_build_eh_must_not_throw (tree decl) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
702 { |
111 | 703 geh_mnt *p = as_a <geh_mnt *> (gimple_alloc (GIMPLE_EH_MUST_NOT_THROW, 0)); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
704 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
705 gcc_assert (TREE_CODE (decl) == FUNCTION_DECL); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
706 gcc_assert (flags_from_decl_or_type (decl) & ECF_NORETURN); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
707 gimple_eh_must_not_throw_set_fndecl (p, decl); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
708 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
709 return p; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
710 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
711 |
111 | 712 /* Build a GIMPLE_EH_ELSE statement. */ |
713 | |
714 geh_else * | |
715 gimple_build_eh_else (gimple_seq n_body, gimple_seq e_body) | |
716 { | |
717 geh_else *p = as_a <geh_else *> (gimple_alloc (GIMPLE_EH_ELSE, 0)); | |
718 gimple_eh_else_set_n_body (p, n_body); | |
719 gimple_eh_else_set_e_body (p, e_body); | |
720 return p; | |
721 } | |
722 | |
0 | 723 /* Build a GIMPLE_TRY statement. |
724 | |
725 EVAL is the expression to evaluate. | |
726 CLEANUP is the cleanup expression. | |
727 KIND is either GIMPLE_TRY_CATCH or GIMPLE_TRY_FINALLY depending on | |
728 whether this is a try/catch or a try/finally respectively. */ | |
729 | |
111 | 730 gtry * |
0 | 731 gimple_build_try (gimple_seq eval, gimple_seq cleanup, |
732 enum gimple_try_flags kind) | |
733 { | |
111 | 734 gtry *p; |
0 | 735 |
736 gcc_assert (kind == GIMPLE_TRY_CATCH || kind == GIMPLE_TRY_FINALLY); | |
111 | 737 p = as_a <gtry *> (gimple_alloc (GIMPLE_TRY, 0)); |
0 | 738 gimple_set_subcode (p, kind); |
739 if (eval) | |
740 gimple_try_set_eval (p, eval); | |
741 if (cleanup) | |
742 gimple_try_set_cleanup (p, cleanup); | |
743 | |
744 return p; | |
745 } | |
746 | |
747 /* Construct a GIMPLE_WITH_CLEANUP_EXPR statement. | |
748 | |
749 CLEANUP is the cleanup expression. */ | |
750 | |
111 | 751 gimple * |
0 | 752 gimple_build_wce (gimple_seq cleanup) |
753 { | |
111 | 754 gimple *p = gimple_alloc (GIMPLE_WITH_CLEANUP_EXPR, 0); |
0 | 755 if (cleanup) |
756 gimple_wce_set_cleanup (p, cleanup); | |
757 | |
758 return p; | |
759 } | |
760 | |
761 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
762 /* Build a GIMPLE_RESX statement. */ |
0 | 763 |
111 | 764 gresx * |
0 | 765 gimple_build_resx (int region) |
766 { | |
111 | 767 gresx *p |
768 = as_a <gresx *> (gimple_build_with_ops (GIMPLE_RESX, ERROR_MARK, 0)); | |
769 p->region = region; | |
0 | 770 return p; |
771 } | |
772 | |
773 | |
774 /* The helper for constructing a gimple switch statement. | |
775 INDEX is the switch's index. | |
776 NLABELS is the number of labels in the switch excluding the default. | |
777 DEFAULT_LABEL is the default label for the switch statement. */ | |
778 | |
111 | 779 gswitch * |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
780 gimple_build_switch_nlabels (unsigned nlabels, tree index, tree default_label) |
0 | 781 { |
782 /* nlabels + 1 default label + 1 index. */ | |
111 | 783 gcc_checking_assert (default_label); |
784 gswitch *p = as_a <gswitch *> (gimple_build_with_ops (GIMPLE_SWITCH, | |
785 ERROR_MARK, | |
786 1 + 1 + nlabels)); | |
0 | 787 gimple_switch_set_index (p, index); |
111 | 788 gimple_switch_set_default_label (p, default_label); |
0 | 789 return p; |
790 } | |
791 | |
792 /* Build a GIMPLE_SWITCH statement. | |
793 | |
794 INDEX is the switch's index. | |
795 DEFAULT_LABEL is the default label | |
796 ARGS is a vector of labels excluding the default. */ | |
797 | |
111 | 798 gswitch * |
799 gimple_build_switch (tree index, tree default_label, vec<tree> args) | |
0 | 800 { |
111 | 801 unsigned i, nlabels = args.length (); |
802 | |
803 gswitch *p = gimple_build_switch_nlabels (nlabels, index, default_label); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
804 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
805 /* Copy the labels from the vector to the switch statement. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
806 for (i = 0; i < nlabels; i++) |
111 | 807 gimple_switch_set_label (p, i + 1, args[i]); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
808 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
809 return p; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
810 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
811 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
812 /* Build a GIMPLE_EH_DISPATCH statement. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
813 |
111 | 814 geh_dispatch * |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
815 gimple_build_eh_dispatch (int region) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
816 { |
111 | 817 geh_dispatch *p |
818 = as_a <geh_dispatch *> ( | |
819 gimple_build_with_ops (GIMPLE_EH_DISPATCH, ERROR_MARK, 0)); | |
820 p->region = region; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
821 return p; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
822 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
823 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
824 /* Build a new GIMPLE_DEBUG_BIND statement. |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
825 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
826 VAR is bound to VALUE; block and location are taken from STMT. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
827 |
111 | 828 gdebug * |
829 gimple_build_debug_bind (tree var, tree value, gimple *stmt MEM_STAT_DECL) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
830 { |
111 | 831 gdebug *p |
832 = as_a <gdebug *> (gimple_build_with_ops_stat (GIMPLE_DEBUG, | |
833 (unsigned)GIMPLE_DEBUG_BIND, 2 | |
834 PASS_MEM_STAT)); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
835 gimple_debug_bind_set_var (p, var); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
836 gimple_debug_bind_set_value (p, value); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
837 if (stmt) |
111 | 838 gimple_set_location (p, gimple_location (stmt)); |
839 | |
840 return p; | |
841 } | |
842 | |
843 | |
844 /* Build a new GIMPLE_DEBUG_SOURCE_BIND statement. | |
845 | |
846 VAR is bound to VALUE; block and location are taken from STMT. */ | |
847 | |
848 gdebug * | |
849 gimple_build_debug_source_bind (tree var, tree value, | |
850 gimple *stmt MEM_STAT_DECL) | |
851 { | |
852 gdebug *p | |
853 = as_a <gdebug *> ( | |
854 gimple_build_with_ops_stat (GIMPLE_DEBUG, | |
855 (unsigned)GIMPLE_DEBUG_SOURCE_BIND, 2 | |
856 PASS_MEM_STAT)); | |
857 | |
858 gimple_debug_source_bind_set_var (p, var); | |
859 gimple_debug_source_bind_set_value (p, value); | |
860 if (stmt) | |
861 gimple_set_location (p, gimple_location (stmt)); | |
0 | 862 |
863 return p; | |
864 } | |
865 | |
866 | |
131 | 867 /* Build a new GIMPLE_DEBUG_BEGIN_STMT statement in BLOCK at |
868 LOCATION. */ | |
869 | |
870 gdebug * | |
871 gimple_build_debug_begin_stmt (tree block, location_t location | |
872 MEM_STAT_DECL) | |
873 { | |
874 gdebug *p | |
875 = as_a <gdebug *> ( | |
876 gimple_build_with_ops_stat (GIMPLE_DEBUG, | |
877 (unsigned)GIMPLE_DEBUG_BEGIN_STMT, 0 | |
878 PASS_MEM_STAT)); | |
879 | |
880 gimple_set_location (p, location); | |
881 gimple_set_block (p, block); | |
882 cfun->debug_marker_count++; | |
883 | |
884 return p; | |
885 } | |
886 | |
887 | |
888 /* Build a new GIMPLE_DEBUG_INLINE_ENTRY statement in BLOCK at | |
889 LOCATION. The BLOCK links to the inlined function. */ | |
890 | |
891 gdebug * | |
892 gimple_build_debug_inline_entry (tree block, location_t location | |
893 MEM_STAT_DECL) | |
894 { | |
895 gdebug *p | |
896 = as_a <gdebug *> ( | |
897 gimple_build_with_ops_stat (GIMPLE_DEBUG, | |
898 (unsigned)GIMPLE_DEBUG_INLINE_ENTRY, 0 | |
899 PASS_MEM_STAT)); | |
900 | |
901 gimple_set_location (p, location); | |
902 gimple_set_block (p, block); | |
903 cfun->debug_marker_count++; | |
904 | |
905 return p; | |
906 } | |
907 | |
908 | |
0 | 909 /* Build a GIMPLE_OMP_CRITICAL statement. |
910 | |
911 BODY is the sequence of statements for which only one thread can execute. | |
111 | 912 NAME is optional identifier for this critical block. |
913 CLAUSES are clauses for this critical block. */ | |
914 | |
915 gomp_critical * | |
916 gimple_build_omp_critical (gimple_seq body, tree name, tree clauses) | |
0 | 917 { |
111 | 918 gomp_critical *p |
919 = as_a <gomp_critical *> (gimple_alloc (GIMPLE_OMP_CRITICAL, 0)); | |
0 | 920 gimple_omp_critical_set_name (p, name); |
111 | 921 gimple_omp_critical_set_clauses (p, clauses); |
0 | 922 if (body) |
923 gimple_omp_set_body (p, body); | |
924 | |
925 return p; | |
926 } | |
927 | |
928 /* Build a GIMPLE_OMP_FOR statement. | |
929 | |
930 BODY is sequence of statements inside the for loop. | |
111 | 931 KIND is the `for' variant. |
932 CLAUSES, are any of the construct's clauses. | |
0 | 933 COLLAPSE is the collapse count. |
934 PRE_BODY is the sequence of statements that are loop invariant. */ | |
935 | |
111 | 936 gomp_for * |
937 gimple_build_omp_for (gimple_seq body, int kind, tree clauses, size_t collapse, | |
0 | 938 gimple_seq pre_body) |
939 { | |
111 | 940 gomp_for *p = as_a <gomp_for *> (gimple_alloc (GIMPLE_OMP_FOR, 0)); |
0 | 941 if (body) |
942 gimple_omp_set_body (p, body); | |
943 gimple_omp_for_set_clauses (p, clauses); | |
111 | 944 gimple_omp_for_set_kind (p, kind); |
945 p->collapse = collapse; | |
946 p->iter = ggc_cleared_vec_alloc<gimple_omp_for_iter> (collapse); | |
947 | |
0 | 948 if (pre_body) |
949 gimple_omp_for_set_pre_body (p, pre_body); | |
950 | |
951 return p; | |
952 } | |
953 | |
954 | |
955 /* Build a GIMPLE_OMP_PARALLEL statement. | |
956 | |
957 BODY is sequence of statements which are executed in parallel. | |
958 CLAUSES, are the OMP parallel construct's clauses. | |
959 CHILD_FN is the function created for the parallel threads to execute. | |
960 DATA_ARG are the shared data argument(s). */ | |
961 | |
111 | 962 gomp_parallel * |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
963 gimple_build_omp_parallel (gimple_seq body, tree clauses, tree child_fn, |
0 | 964 tree data_arg) |
965 { | |
111 | 966 gomp_parallel *p |
967 = as_a <gomp_parallel *> (gimple_alloc (GIMPLE_OMP_PARALLEL, 0)); | |
0 | 968 if (body) |
969 gimple_omp_set_body (p, body); | |
970 gimple_omp_parallel_set_clauses (p, clauses); | |
971 gimple_omp_parallel_set_child_fn (p, child_fn); | |
972 gimple_omp_parallel_set_data_arg (p, data_arg); | |
973 | |
974 return p; | |
975 } | |
976 | |
977 | |
978 /* Build a GIMPLE_OMP_TASK statement. | |
979 | |
980 BODY is sequence of statements which are executed by the explicit task. | |
981 CLAUSES, are the OMP parallel construct's clauses. | |
982 CHILD_FN is the function created for the parallel threads to execute. | |
983 DATA_ARG are the shared data argument(s). | |
984 COPY_FN is the optional function for firstprivate initialization. | |
985 ARG_SIZE and ARG_ALIGN are size and alignment of the data block. */ | |
986 | |
111 | 987 gomp_task * |
0 | 988 gimple_build_omp_task (gimple_seq body, tree clauses, tree child_fn, |
989 tree data_arg, tree copy_fn, tree arg_size, | |
990 tree arg_align) | |
991 { | |
111 | 992 gomp_task *p = as_a <gomp_task *> (gimple_alloc (GIMPLE_OMP_TASK, 0)); |
0 | 993 if (body) |
994 gimple_omp_set_body (p, body); | |
995 gimple_omp_task_set_clauses (p, clauses); | |
996 gimple_omp_task_set_child_fn (p, child_fn); | |
997 gimple_omp_task_set_data_arg (p, data_arg); | |
998 gimple_omp_task_set_copy_fn (p, copy_fn); | |
999 gimple_omp_task_set_arg_size (p, arg_size); | |
1000 gimple_omp_task_set_arg_align (p, arg_align); | |
1001 | |
1002 return p; | |
1003 } | |
1004 | |
1005 | |
1006 /* Build a GIMPLE_OMP_SECTION statement for a sections statement. | |
1007 | |
1008 BODY is the sequence of statements in the section. */ | |
1009 | |
111 | 1010 gimple * |
0 | 1011 gimple_build_omp_section (gimple_seq body) |
1012 { | |
111 | 1013 gimple *p = gimple_alloc (GIMPLE_OMP_SECTION, 0); |
0 | 1014 if (body) |
1015 gimple_omp_set_body (p, body); | |
1016 | |
1017 return p; | |
1018 } | |
1019 | |
1020 | |
1021 /* Build a GIMPLE_OMP_MASTER statement. | |
1022 | |
1023 BODY is the sequence of statements to be executed by just the master. */ | |
1024 | |
111 | 1025 gimple * |
0 | 1026 gimple_build_omp_master (gimple_seq body) |
1027 { | |
111 | 1028 gimple *p = gimple_alloc (GIMPLE_OMP_MASTER, 0); |
1029 if (body) | |
1030 gimple_omp_set_body (p, body); | |
1031 | |
1032 return p; | |
1033 } | |
1034 | |
1035 /* Build a GIMPLE_OMP_GRID_BODY statement. | |
1036 | |
1037 BODY is the sequence of statements to be executed by the kernel. */ | |
1038 | |
1039 gimple * | |
1040 gimple_build_omp_grid_body (gimple_seq body) | |
1041 { | |
1042 gimple *p = gimple_alloc (GIMPLE_OMP_GRID_BODY, 0); | |
1043 if (body) | |
1044 gimple_omp_set_body (p, body); | |
1045 | |
1046 return p; | |
1047 } | |
1048 | |
1049 /* Build a GIMPLE_OMP_TASKGROUP statement. | |
1050 | |
1051 BODY is the sequence of statements to be executed by the taskgroup | |
1052 construct. */ | |
1053 | |
1054 gimple * | |
1055 gimple_build_omp_taskgroup (gimple_seq body) | |
1056 { | |
1057 gimple *p = gimple_alloc (GIMPLE_OMP_TASKGROUP, 0); | |
0 | 1058 if (body) |
1059 gimple_omp_set_body (p, body); | |
1060 | |
1061 return p; | |
1062 } | |
1063 | |
1064 | |
1065 /* Build a GIMPLE_OMP_CONTINUE statement. | |
1066 | |
1067 CONTROL_DEF is the definition of the control variable. | |
1068 CONTROL_USE is the use of the control variable. */ | |
1069 | |
111 | 1070 gomp_continue * |
0 | 1071 gimple_build_omp_continue (tree control_def, tree control_use) |
1072 { | |
111 | 1073 gomp_continue *p |
1074 = as_a <gomp_continue *> (gimple_alloc (GIMPLE_OMP_CONTINUE, 0)); | |
0 | 1075 gimple_omp_continue_set_control_def (p, control_def); |
1076 gimple_omp_continue_set_control_use (p, control_use); | |
1077 return p; | |
1078 } | |
1079 | |
1080 /* Build a GIMPLE_OMP_ORDERED statement. | |
1081 | |
1082 BODY is the sequence of statements inside a loop that will executed in | |
111 | 1083 sequence. |
1084 CLAUSES are clauses for this statement. */ | |
1085 | |
1086 gomp_ordered * | |
1087 gimple_build_omp_ordered (gimple_seq body, tree clauses) | |
0 | 1088 { |
111 | 1089 gomp_ordered *p |
1090 = as_a <gomp_ordered *> (gimple_alloc (GIMPLE_OMP_ORDERED, 0)); | |
1091 gimple_omp_ordered_set_clauses (p, clauses); | |
0 | 1092 if (body) |
1093 gimple_omp_set_body (p, body); | |
1094 | |
1095 return p; | |
1096 } | |
1097 | |
1098 | |
1099 /* Build a GIMPLE_OMP_RETURN statement. | |
1100 WAIT_P is true if this is a non-waiting return. */ | |
1101 | |
111 | 1102 gimple * |
0 | 1103 gimple_build_omp_return (bool wait_p) |
1104 { | |
111 | 1105 gimple *p = gimple_alloc (GIMPLE_OMP_RETURN, 0); |
0 | 1106 if (wait_p) |
1107 gimple_omp_return_set_nowait (p); | |
1108 | |
1109 return p; | |
1110 } | |
1111 | |
1112 | |
1113 /* Build a GIMPLE_OMP_SECTIONS statement. | |
1114 | |
1115 BODY is a sequence of section statements. | |
1116 CLAUSES are any of the OMP sections contsruct's clauses: private, | |
1117 firstprivate, lastprivate, reduction, and nowait. */ | |
1118 | |
111 | 1119 gomp_sections * |
0 | 1120 gimple_build_omp_sections (gimple_seq body, tree clauses) |
1121 { | |
111 | 1122 gomp_sections *p |
1123 = as_a <gomp_sections *> (gimple_alloc (GIMPLE_OMP_SECTIONS, 0)); | |
0 | 1124 if (body) |
1125 gimple_omp_set_body (p, body); | |
1126 gimple_omp_sections_set_clauses (p, clauses); | |
1127 | |
1128 return p; | |
1129 } | |
1130 | |
1131 | |
1132 /* Build a GIMPLE_OMP_SECTIONS_SWITCH. */ | |
1133 | |
111 | 1134 gimple * |
0 | 1135 gimple_build_omp_sections_switch (void) |
1136 { | |
1137 return gimple_alloc (GIMPLE_OMP_SECTIONS_SWITCH, 0); | |
1138 } | |
1139 | |
1140 | |
1141 /* Build a GIMPLE_OMP_SINGLE statement. | |
1142 | |
1143 BODY is the sequence of statements that will be executed once. | |
1144 CLAUSES are any of the OMP single construct's clauses: private, firstprivate, | |
1145 copyprivate, nowait. */ | |
1146 | |
111 | 1147 gomp_single * |
0 | 1148 gimple_build_omp_single (gimple_seq body, tree clauses) |
1149 { | |
111 | 1150 gomp_single *p |
1151 = as_a <gomp_single *> (gimple_alloc (GIMPLE_OMP_SINGLE, 0)); | |
0 | 1152 if (body) |
1153 gimple_omp_set_body (p, body); | |
1154 gimple_omp_single_set_clauses (p, clauses); | |
1155 | |
1156 return p; | |
1157 } | |
1158 | |
1159 | |
111 | 1160 /* Build a GIMPLE_OMP_TARGET statement. |
1161 | |
1162 BODY is the sequence of statements that will be executed. | |
1163 KIND is the kind of the region. | |
1164 CLAUSES are any of the construct's clauses. */ | |
1165 | |
1166 gomp_target * | |
1167 gimple_build_omp_target (gimple_seq body, int kind, tree clauses) | |
1168 { | |
1169 gomp_target *p | |
1170 = as_a <gomp_target *> (gimple_alloc (GIMPLE_OMP_TARGET, 0)); | |
1171 if (body) | |
1172 gimple_omp_set_body (p, body); | |
1173 gimple_omp_target_set_clauses (p, clauses); | |
1174 gimple_omp_target_set_kind (p, kind); | |
1175 | |
1176 return p; | |
1177 } | |
1178 | |
1179 | |
1180 /* Build a GIMPLE_OMP_TEAMS statement. | |
1181 | |
1182 BODY is the sequence of statements that will be executed. | |
1183 CLAUSES are any of the OMP teams construct's clauses. */ | |
1184 | |
1185 gomp_teams * | |
1186 gimple_build_omp_teams (gimple_seq body, tree clauses) | |
1187 { | |
1188 gomp_teams *p = as_a <gomp_teams *> (gimple_alloc (GIMPLE_OMP_TEAMS, 0)); | |
1189 if (body) | |
1190 gimple_omp_set_body (p, body); | |
1191 gimple_omp_teams_set_clauses (p, clauses); | |
1192 | |
1193 return p; | |
1194 } | |
1195 | |
1196 | |
0 | 1197 /* Build a GIMPLE_OMP_ATOMIC_LOAD statement. */ |
1198 | |
111 | 1199 gomp_atomic_load * |
0 | 1200 gimple_build_omp_atomic_load (tree lhs, tree rhs) |
1201 { | |
111 | 1202 gomp_atomic_load *p |
1203 = as_a <gomp_atomic_load *> (gimple_alloc (GIMPLE_OMP_ATOMIC_LOAD, 0)); | |
0 | 1204 gimple_omp_atomic_load_set_lhs (p, lhs); |
1205 gimple_omp_atomic_load_set_rhs (p, rhs); | |
1206 return p; | |
1207 } | |
1208 | |
1209 /* Build a GIMPLE_OMP_ATOMIC_STORE statement. | |
1210 | |
1211 VAL is the value we are storing. */ | |
1212 | |
111 | 1213 gomp_atomic_store * |
0 | 1214 gimple_build_omp_atomic_store (tree val) |
1215 { | |
111 | 1216 gomp_atomic_store *p |
1217 = as_a <gomp_atomic_store *> (gimple_alloc (GIMPLE_OMP_ATOMIC_STORE, 0)); | |
0 | 1218 gimple_omp_atomic_store_set_val (p, val); |
1219 return p; | |
1220 } | |
1221 | |
111 | 1222 /* Build a GIMPLE_TRANSACTION statement. */ |
1223 | |
1224 gtransaction * | |
1225 gimple_build_transaction (gimple_seq body) | |
0 | 1226 { |
111 | 1227 gtransaction *p |
1228 = as_a <gtransaction *> (gimple_alloc (GIMPLE_TRANSACTION, 0)); | |
1229 gimple_transaction_set_body (p, body); | |
1230 gimple_transaction_set_label_norm (p, 0); | |
1231 gimple_transaction_set_label_uninst (p, 0); | |
1232 gimple_transaction_set_label_over (p, 0); | |
0 | 1233 return p; |
1234 } | |
1235 | |
1236 #if defined ENABLE_GIMPLE_CHECKING | |
1237 /* Complain of a gimple type mismatch and die. */ | |
1238 | |
1239 void | |
111 | 1240 gimple_check_failed (const gimple *gs, const char *file, int line, |
0 | 1241 const char *function, enum gimple_code code, |
1242 enum tree_code subcode) | |
1243 { | |
1244 internal_error ("gimple check: expected %s(%s), have %s(%s) in %s, at %s:%d", | |
1245 gimple_code_name[code], | |
111 | 1246 get_tree_code_name (subcode), |
0 | 1247 gimple_code_name[gimple_code (gs)], |
111 | 1248 gs->subcode > 0 |
1249 ? get_tree_code_name ((enum tree_code) gs->subcode) | |
0 | 1250 : "", |
1251 function, trim_filename (file), line); | |
1252 } | |
1253 #endif /* ENABLE_GIMPLE_CHECKING */ | |
1254 | |
1255 | |
1256 /* Link gimple statement GS to the end of the sequence *SEQ_P. If | |
1257 *SEQ_P is NULL, a new sequence is allocated. */ | |
1258 | |
1259 void | |
111 | 1260 gimple_seq_add_stmt (gimple_seq *seq_p, gimple *gs) |
1261 { | |
1262 gimple_stmt_iterator si; | |
1263 if (gs == NULL) | |
1264 return; | |
1265 | |
1266 si = gsi_last (*seq_p); | |
1267 gsi_insert_after (&si, gs, GSI_NEW_STMT); | |
1268 } | |
1269 | |
1270 /* Link gimple statement GS to the end of the sequence *SEQ_P. If | |
1271 *SEQ_P is NULL, a new sequence is allocated. This function is | |
1272 similar to gimple_seq_add_stmt, but does not scan the operands. | |
1273 During gimplification, we need to manipulate statement sequences | |
1274 before the def/use vectors have been constructed. */ | |
1275 | |
1276 void | |
1277 gimple_seq_add_stmt_without_update (gimple_seq *seq_p, gimple *gs) | |
0 | 1278 { |
1279 gimple_stmt_iterator si; | |
1280 | |
1281 if (gs == NULL) | |
1282 return; | |
1283 | |
1284 si = gsi_last (*seq_p); | |
111 | 1285 gsi_insert_after_without_update (&si, gs, GSI_NEW_STMT); |
0 | 1286 } |
1287 | |
1288 /* Append sequence SRC to the end of sequence *DST_P. If *DST_P is | |
1289 NULL, a new sequence is allocated. */ | |
1290 | |
1291 void | |
1292 gimple_seq_add_seq (gimple_seq *dst_p, gimple_seq src) | |
1293 { | |
1294 gimple_stmt_iterator si; | |
1295 if (src == NULL) | |
1296 return; | |
1297 | |
1298 si = gsi_last (*dst_p); | |
1299 gsi_insert_seq_after (&si, src, GSI_NEW_STMT); | |
1300 } | |
1301 | |
111 | 1302 /* Append sequence SRC to the end of sequence *DST_P. If *DST_P is |
1303 NULL, a new sequence is allocated. This function is | |
1304 similar to gimple_seq_add_seq, but does not scan the operands. */ | |
1305 | |
1306 void | |
1307 gimple_seq_add_seq_without_update (gimple_seq *dst_p, gimple_seq src) | |
1308 { | |
1309 gimple_stmt_iterator si; | |
1310 if (src == NULL) | |
1311 return; | |
1312 | |
1313 si = gsi_last (*dst_p); | |
1314 gsi_insert_seq_after_without_update (&si, src, GSI_NEW_STMT); | |
1315 } | |
1316 | |
1317 /* Determine whether to assign a location to the statement GS. */ | |
1318 | |
1319 static bool | |
1320 should_carry_location_p (gimple *gs) | |
1321 { | |
1322 /* Don't emit a line note for a label. We particularly don't want to | |
1323 emit one for the break label, since it doesn't actually correspond | |
1324 to the beginning of the loop/switch. */ | |
1325 if (gimple_code (gs) == GIMPLE_LABEL) | |
1326 return false; | |
1327 | |
1328 return true; | |
1329 } | |
1330 | |
1331 /* Set the location for gimple statement GS to LOCATION. */ | |
1332 | |
1333 static void | |
1334 annotate_one_with_location (gimple *gs, location_t location) | |
1335 { | |
1336 if (!gimple_has_location (gs) | |
1337 && !gimple_do_not_emit_location_p (gs) | |
1338 && should_carry_location_p (gs)) | |
1339 gimple_set_location (gs, location); | |
1340 } | |
1341 | |
1342 /* Set LOCATION for all the statements after iterator GSI in sequence | |
1343 SEQ. If GSI is pointing to the end of the sequence, start with the | |
1344 first statement in SEQ. */ | |
1345 | |
1346 void | |
1347 annotate_all_with_location_after (gimple_seq seq, gimple_stmt_iterator gsi, | |
1348 location_t location) | |
1349 { | |
1350 if (gsi_end_p (gsi)) | |
1351 gsi = gsi_start (seq); | |
1352 else | |
1353 gsi_next (&gsi); | |
1354 | |
1355 for (; !gsi_end_p (gsi); gsi_next (&gsi)) | |
1356 annotate_one_with_location (gsi_stmt (gsi), location); | |
1357 } | |
1358 | |
1359 /* Set the location for all the statements in a sequence STMT_P to LOCATION. */ | |
1360 | |
1361 void | |
1362 annotate_all_with_location (gimple_seq stmt_p, location_t location) | |
1363 { | |
1364 gimple_stmt_iterator i; | |
1365 | |
1366 if (gimple_seq_empty_p (stmt_p)) | |
1367 return; | |
1368 | |
1369 for (i = gsi_start (stmt_p); !gsi_end_p (i); gsi_next (&i)) | |
1370 { | |
1371 gimple *gs = gsi_stmt (i); | |
1372 annotate_one_with_location (gs, location); | |
1373 } | |
1374 } | |
0 | 1375 |
1376 /* Helper function of empty_body_p. Return true if STMT is an empty | |
1377 statement. */ | |
1378 | |
1379 static bool | |
111 | 1380 empty_stmt_p (gimple *stmt) |
0 | 1381 { |
1382 if (gimple_code (stmt) == GIMPLE_NOP) | |
1383 return true; | |
111 | 1384 if (gbind *bind_stmt = dyn_cast <gbind *> (stmt)) |
1385 return empty_body_p (gimple_bind_body (bind_stmt)); | |
0 | 1386 return false; |
1387 } | |
1388 | |
1389 | |
1390 /* Return true if BODY contains nothing but empty statements. */ | |
1391 | |
1392 bool | |
1393 empty_body_p (gimple_seq body) | |
1394 { | |
1395 gimple_stmt_iterator i; | |
1396 | |
1397 if (gimple_seq_empty_p (body)) | |
1398 return true; | |
1399 for (i = gsi_start (body); !gsi_end_p (i); gsi_next (&i)) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1400 if (!empty_stmt_p (gsi_stmt (i)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1401 && !is_gimple_debug (gsi_stmt (i))) |
0 | 1402 return false; |
1403 | |
1404 return true; | |
1405 } | |
1406 | |
1407 | |
1408 /* Perform a deep copy of sequence SRC and return the result. */ | |
1409 | |
1410 gimple_seq | |
1411 gimple_seq_copy (gimple_seq src) | |
1412 { | |
1413 gimple_stmt_iterator gsi; | |
111 | 1414 gimple_seq new_seq = NULL; |
1415 gimple *stmt; | |
0 | 1416 |
1417 for (gsi = gsi_start (src); !gsi_end_p (gsi); gsi_next (&gsi)) | |
1418 { | |
1419 stmt = gimple_copy (gsi_stmt (gsi)); | |
1420 gimple_seq_add_stmt (&new_seq, stmt); | |
1421 } | |
1422 | |
1423 return new_seq; | |
1424 } | |
1425 | |
1426 | |
111 | 1427 |
1428 /* Return true if calls C1 and C2 are known to go to the same function. */ | |
1429 | |
1430 bool | |
1431 gimple_call_same_target_p (const gimple *c1, const gimple *c2) | |
0 | 1432 { |
111 | 1433 if (gimple_call_internal_p (c1)) |
1434 return (gimple_call_internal_p (c2) | |
1435 && gimple_call_internal_fn (c1) == gimple_call_internal_fn (c2) | |
1436 && (!gimple_call_internal_unique_p (as_a <const gcall *> (c1)) | |
1437 || c1 == c2)); | |
0 | 1438 else |
111 | 1439 return (gimple_call_fn (c1) == gimple_call_fn (c2) |
1440 || (gimple_call_fndecl (c1) | |
1441 && gimple_call_fndecl (c1) == gimple_call_fndecl (c2))); | |
0 | 1442 } |
1443 | |
1444 /* Detect flags from a GIMPLE_CALL. This is just like | |
1445 call_expr_flags, but for gimple tuples. */ | |
1446 | |
1447 int | |
111 | 1448 gimple_call_flags (const gimple *stmt) |
0 | 1449 { |
1450 int flags; | |
1451 tree decl = gimple_call_fndecl (stmt); | |
1452 | |
1453 if (decl) | |
1454 flags = flags_from_decl_or_type (decl); | |
111 | 1455 else if (gimple_call_internal_p (stmt)) |
1456 flags = internal_fn_flags (gimple_call_internal_fn (stmt)); | |
0 | 1457 else |
111 | 1458 flags = flags_from_decl_or_type (gimple_call_fntype (stmt)); |
1459 | |
1460 if (stmt->subcode & GF_CALL_NOTHROW) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1461 flags |= ECF_NOTHROW; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1462 |
111 | 1463 if (stmt->subcode & GF_CALL_BY_DESCRIPTOR) |
1464 flags |= ECF_BY_DESCRIPTOR; | |
1465 | |
0 | 1466 return flags; |
1467 } | |
1468 | |
111 | 1469 /* Return the "fn spec" string for call STMT. */ |
1470 | |
1471 static const_tree | |
1472 gimple_call_fnspec (const gcall *stmt) | |
1473 { | |
1474 tree type, attr; | |
1475 | |
1476 if (gimple_call_internal_p (stmt)) | |
1477 return internal_fn_fnspec (gimple_call_internal_fn (stmt)); | |
1478 | |
1479 type = gimple_call_fntype (stmt); | |
1480 if (!type) | |
1481 return NULL_TREE; | |
1482 | |
1483 attr = lookup_attribute ("fn spec", TYPE_ATTRIBUTES (type)); | |
1484 if (!attr) | |
1485 return NULL_TREE; | |
1486 | |
1487 return TREE_VALUE (TREE_VALUE (attr)); | |
1488 } | |
1489 | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1490 /* Detects argument flags for argument number ARG on call STMT. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1491 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1492 int |
111 | 1493 gimple_call_arg_flags (const gcall *stmt, unsigned arg) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1494 { |
111 | 1495 const_tree attr = gimple_call_fnspec (stmt); |
1496 | |
1497 if (!attr || 1 + arg >= (unsigned) TREE_STRING_LENGTH (attr)) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1498 return 0; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1499 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1500 switch (TREE_STRING_POINTER (attr)[1 + arg]) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1501 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1502 case 'x': |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1503 case 'X': |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1504 return EAF_UNUSED; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1505 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1506 case 'R': |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1507 return EAF_DIRECT | EAF_NOCLOBBER | EAF_NOESCAPE; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1508 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1509 case 'r': |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1510 return EAF_NOCLOBBER | EAF_NOESCAPE; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1511 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1512 case 'W': |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1513 return EAF_DIRECT | EAF_NOESCAPE; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1514 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1515 case 'w': |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1516 return EAF_NOESCAPE; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1517 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1518 case '.': |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1519 default: |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1520 return 0; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1521 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1522 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1523 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1524 /* Detects return flags for the call STMT. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1525 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1526 int |
111 | 1527 gimple_call_return_flags (const gcall *stmt) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1528 { |
111 | 1529 const_tree attr; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1530 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1531 if (gimple_call_flags (stmt) & ECF_MALLOC) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1532 return ERF_NOALIAS; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1533 |
111 | 1534 attr = gimple_call_fnspec (stmt); |
1535 if (!attr || TREE_STRING_LENGTH (attr) < 1) | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1536 return 0; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1537 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1538 switch (TREE_STRING_POINTER (attr)[0]) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1539 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1540 case '1': |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1541 case '2': |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1542 case '3': |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1543 case '4': |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1544 return ERF_RETURNS_ARG | (TREE_STRING_POINTER (attr)[0] - '1'); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1545 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1546 case 'm': |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1547 return ERF_NOALIAS; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1548 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1549 case '.': |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1550 default: |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1551 return 0; |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1552 } |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
1553 } |
0 | 1554 |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1555 |
131 | 1556 /* Return true if call STMT is known to return a non-zero result. */ |
1557 | |
1558 bool | |
1559 gimple_call_nonnull_result_p (gcall *call) | |
1560 { | |
1561 tree fndecl = gimple_call_fndecl (call); | |
1562 if (!fndecl) | |
1563 return false; | |
1564 if (flag_delete_null_pointer_checks && !flag_check_new | |
1565 && DECL_IS_OPERATOR_NEW (fndecl) | |
1566 && !TREE_NOTHROW (fndecl)) | |
1567 return true; | |
1568 | |
1569 /* References are always non-NULL. */ | |
1570 if (flag_delete_null_pointer_checks | |
1571 && TREE_CODE (TREE_TYPE (fndecl)) == REFERENCE_TYPE) | |
1572 return true; | |
1573 | |
1574 if (flag_delete_null_pointer_checks | |
1575 && lookup_attribute ("returns_nonnull", | |
1576 TYPE_ATTRIBUTES (gimple_call_fntype (call)))) | |
1577 return true; | |
1578 return gimple_alloca_call_p (call); | |
1579 } | |
1580 | |
1581 | |
1582 /* If CALL returns a non-null result in an argument, return that arg. */ | |
1583 | |
1584 tree | |
1585 gimple_call_nonnull_arg (gcall *call) | |
1586 { | |
1587 tree fndecl = gimple_call_fndecl (call); | |
1588 if (!fndecl) | |
1589 return NULL_TREE; | |
1590 | |
1591 unsigned rf = gimple_call_return_flags (call); | |
1592 if (rf & ERF_RETURNS_ARG) | |
1593 { | |
1594 unsigned argnum = rf & ERF_RETURN_ARG_MASK; | |
1595 if (argnum < gimple_call_num_args (call)) | |
1596 { | |
1597 tree arg = gimple_call_arg (call, argnum); | |
1598 if (SSA_VAR_P (arg) | |
1599 && infer_nonnull_range_by_attribute (call, arg)) | |
1600 return arg; | |
1601 } | |
1602 } | |
1603 return NULL_TREE; | |
1604 } | |
1605 | |
1606 | |
0 | 1607 /* Return true if GS is a copy assignment. */ |
1608 | |
1609 bool | |
111 | 1610 gimple_assign_copy_p (gimple *gs) |
0 | 1611 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1612 return (gimple_assign_single_p (gs) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1613 && is_gimple_val (gimple_op (gs, 1))); |
0 | 1614 } |
1615 | |
1616 | |
1617 /* Return true if GS is a SSA_NAME copy assignment. */ | |
1618 | |
1619 bool | |
111 | 1620 gimple_assign_ssa_name_copy_p (gimple *gs) |
0 | 1621 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1622 return (gimple_assign_single_p (gs) |
0 | 1623 && TREE_CODE (gimple_assign_lhs (gs)) == SSA_NAME |
1624 && TREE_CODE (gimple_assign_rhs1 (gs)) == SSA_NAME); | |
1625 } | |
1626 | |
1627 | |
1628 /* Return true if GS is an assignment with a unary RHS, but the | |
1629 operator has no effect on the assigned value. The logic is adapted | |
1630 from STRIP_NOPS. This predicate is intended to be used in tuplifying | |
1631 instances in which STRIP_NOPS was previously applied to the RHS of | |
1632 an assignment. | |
1633 | |
1634 NOTE: In the use cases that led to the creation of this function | |
1635 and of gimple_assign_single_p, it is typical to test for either | |
1636 condition and to proceed in the same manner. In each case, the | |
1637 assigned value is represented by the single RHS operand of the | |
1638 assignment. I suspect there may be cases where gimple_assign_copy_p, | |
1639 gimple_assign_single_p, or equivalent logic is used where a similar | |
1640 treatment of unary NOPs is appropriate. */ | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1641 |
0 | 1642 bool |
111 | 1643 gimple_assign_unary_nop_p (gimple *gs) |
0 | 1644 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1645 return (is_gimple_assign (gs) |
0 | 1646 && (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (gs)) |
1647 || gimple_assign_rhs_code (gs) == NON_LVALUE_EXPR) | |
1648 && gimple_assign_rhs1 (gs) != error_mark_node | |
1649 && (TYPE_MODE (TREE_TYPE (gimple_assign_lhs (gs))) | |
1650 == TYPE_MODE (TREE_TYPE (gimple_assign_rhs1 (gs))))); | |
1651 } | |
1652 | |
1653 /* Set BB to be the basic block holding G. */ | |
1654 | |
1655 void | |
111 | 1656 gimple_set_bb (gimple *stmt, basic_block bb) |
0 | 1657 { |
111 | 1658 stmt->bb = bb; |
1659 | |
1660 if (gimple_code (stmt) != GIMPLE_LABEL) | |
1661 return; | |
0 | 1662 |
1663 /* If the statement is a label, add the label to block-to-labels map | |
1664 so that we can speed up edge creation for GIMPLE_GOTOs. */ | |
111 | 1665 if (cfun->cfg) |
0 | 1666 { |
1667 tree t; | |
1668 int uid; | |
1669 | |
111 | 1670 t = gimple_label_label (as_a <glabel *> (stmt)); |
0 | 1671 uid = LABEL_DECL_UID (t); |
1672 if (uid == -1) | |
1673 { | |
111 | 1674 unsigned old_len = |
1675 vec_safe_length (label_to_block_map_for_fn (cfun)); | |
0 | 1676 LABEL_DECL_UID (t) = uid = cfun->cfg->last_label_uid++; |
1677 if (old_len <= (unsigned) uid) | |
1678 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
1679 unsigned new_len = 3 * uid / 2 + 1; |
0 | 1680 |
111 | 1681 vec_safe_grow_cleared (label_to_block_map_for_fn (cfun), |
0 | 1682 new_len); |
1683 } | |
1684 } | |
1685 | |
111 | 1686 (*label_to_block_map_for_fn (cfun))[uid] = bb; |
0 | 1687 } |
1688 } | |
1689 | |
1690 | |
1691 /* Modify the RHS of the assignment pointed-to by GSI using the | |
1692 operands in the expression tree EXPR. | |
1693 | |
1694 NOTE: The statement pointed-to by GSI may be reallocated if it | |
1695 did not have enough operand slots. | |
1696 | |
1697 This function is useful to convert an existing tree expression into | |
1698 the flat representation used for the RHS of a GIMPLE assignment. | |
1699 It will reallocate memory as needed to expand or shrink the number | |
1700 of operand slots needed to represent EXPR. | |
1701 | |
1702 NOTE: If you find yourself building a tree and then calling this | |
1703 function, you are most certainly doing it the slow way. It is much | |
1704 better to build a new assignment or to use the function | |
1705 gimple_assign_set_rhs_with_ops, which does not require an | |
1706 expression tree to be built. */ | |
1707 | |
1708 void | |
1709 gimple_assign_set_rhs_from_tree (gimple_stmt_iterator *gsi, tree expr) | |
1710 { | |
1711 enum tree_code subcode; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1712 tree op1, op2, op3; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1713 |
111 | 1714 extract_ops_from_tree (expr, &subcode, &op1, &op2, &op3); |
1715 gimple_assign_set_rhs_with_ops (gsi, subcode, op1, op2, op3); | |
0 | 1716 } |
1717 | |
1718 | |
1719 /* Set the RHS of assignment statement pointed-to by GSI to CODE with | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1720 operands OP1, OP2 and OP3. |
0 | 1721 |
1722 NOTE: The statement pointed-to by GSI may be reallocated if it | |
1723 did not have enough operand slots. */ | |
1724 | |
1725 void | |
111 | 1726 gimple_assign_set_rhs_with_ops (gimple_stmt_iterator *gsi, enum tree_code code, |
1727 tree op1, tree op2, tree op3) | |
0 | 1728 { |
1729 unsigned new_rhs_ops = get_gimple_rhs_num_ops (code); | |
111 | 1730 gimple *stmt = gsi_stmt (*gsi); |
0 | 1731 |
1732 /* If the new CODE needs more operands, allocate a new statement. */ | |
1733 if (gimple_num_ops (stmt) < new_rhs_ops + 1) | |
1734 { | |
1735 tree lhs = gimple_assign_lhs (stmt); | |
111 | 1736 gimple *new_stmt = gimple_alloc (gimple_code (stmt), new_rhs_ops + 1); |
0 | 1737 memcpy (new_stmt, stmt, gimple_size (gimple_code (stmt))); |
111 | 1738 gimple_init_singleton (new_stmt); |
1739 gsi_replace (gsi, new_stmt, false); | |
0 | 1740 stmt = new_stmt; |
1741 | |
1742 /* The LHS needs to be reset as this also changes the SSA name | |
1743 on the LHS. */ | |
1744 gimple_assign_set_lhs (stmt, lhs); | |
1745 } | |
1746 | |
1747 gimple_set_num_ops (stmt, new_rhs_ops + 1); | |
1748 gimple_set_subcode (stmt, code); | |
1749 gimple_assign_set_rhs1 (stmt, op1); | |
1750 if (new_rhs_ops > 1) | |
1751 gimple_assign_set_rhs2 (stmt, op2); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1752 if (new_rhs_ops > 2) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
1753 gimple_assign_set_rhs3 (stmt, op3); |
0 | 1754 } |
1755 | |
1756 | |
1757 /* Return the LHS of a statement that performs an assignment, | |
1758 either a GIMPLE_ASSIGN or a GIMPLE_CALL. Returns NULL_TREE | |
1759 for a call to a function that returns no value, or for a | |
1760 statement other than an assignment or a call. */ | |
1761 | |
1762 tree | |
111 | 1763 gimple_get_lhs (const gimple *stmt) |
0 | 1764 { |
1765 enum gimple_code code = gimple_code (stmt); | |
1766 | |
1767 if (code == GIMPLE_ASSIGN) | |
1768 return gimple_assign_lhs (stmt); | |
1769 else if (code == GIMPLE_CALL) | |
1770 return gimple_call_lhs (stmt); | |
1771 else | |
1772 return NULL_TREE; | |
1773 } | |
1774 | |
1775 | |
1776 /* Set the LHS of a statement that performs an assignment, | |
1777 either a GIMPLE_ASSIGN or a GIMPLE_CALL. */ | |
1778 | |
1779 void | |
111 | 1780 gimple_set_lhs (gimple *stmt, tree lhs) |
0 | 1781 { |
1782 enum gimple_code code = gimple_code (stmt); | |
1783 | |
1784 if (code == GIMPLE_ASSIGN) | |
1785 gimple_assign_set_lhs (stmt, lhs); | |
1786 else if (code == GIMPLE_CALL) | |
1787 gimple_call_set_lhs (stmt, lhs); | |
1788 else | |
111 | 1789 gcc_unreachable (); |
0 | 1790 } |
1791 | |
1792 | |
1793 /* Return a deep copy of statement STMT. All the operands from STMT | |
1794 are reallocated and copied using unshare_expr. The DEF, USE, VDEF | |
111 | 1795 and VUSE operand arrays are set to empty in the new copy. The new |
1796 copy isn't part of any sequence. */ | |
1797 | |
1798 gimple * | |
1799 gimple_copy (gimple *stmt) | |
0 | 1800 { |
1801 enum gimple_code code = gimple_code (stmt); | |
1802 unsigned num_ops = gimple_num_ops (stmt); | |
111 | 1803 gimple *copy = gimple_alloc (code, num_ops); |
0 | 1804 unsigned i; |
1805 | |
1806 /* Shallow copy all the fields from STMT. */ | |
1807 memcpy (copy, stmt, gimple_size (code)); | |
111 | 1808 gimple_init_singleton (copy); |
0 | 1809 |
1810 /* If STMT has sub-statements, deep-copy them as well. */ | |
1811 if (gimple_has_substatements (stmt)) | |
1812 { | |
1813 gimple_seq new_seq; | |
1814 tree t; | |
1815 | |
1816 switch (gimple_code (stmt)) | |
1817 { | |
1818 case GIMPLE_BIND: | |
111 | 1819 { |
1820 gbind *bind_stmt = as_a <gbind *> (stmt); | |
1821 gbind *bind_copy = as_a <gbind *> (copy); | |
1822 new_seq = gimple_seq_copy (gimple_bind_body (bind_stmt)); | |
1823 gimple_bind_set_body (bind_copy, new_seq); | |
1824 gimple_bind_set_vars (bind_copy, | |
1825 unshare_expr (gimple_bind_vars (bind_stmt))); | |
1826 gimple_bind_set_block (bind_copy, gimple_bind_block (bind_stmt)); | |
1827 } | |
0 | 1828 break; |
1829 | |
1830 case GIMPLE_CATCH: | |
111 | 1831 { |
1832 gcatch *catch_stmt = as_a <gcatch *> (stmt); | |
1833 gcatch *catch_copy = as_a <gcatch *> (copy); | |
1834 new_seq = gimple_seq_copy (gimple_catch_handler (catch_stmt)); | |
1835 gimple_catch_set_handler (catch_copy, new_seq); | |
1836 t = unshare_expr (gimple_catch_types (catch_stmt)); | |
1837 gimple_catch_set_types (catch_copy, t); | |
1838 } | |
0 | 1839 break; |
1840 | |
1841 case GIMPLE_EH_FILTER: | |
111 | 1842 { |
1843 geh_filter *eh_filter_stmt = as_a <geh_filter *> (stmt); | |
1844 geh_filter *eh_filter_copy = as_a <geh_filter *> (copy); | |
1845 new_seq | |
1846 = gimple_seq_copy (gimple_eh_filter_failure (eh_filter_stmt)); | |
1847 gimple_eh_filter_set_failure (eh_filter_copy, new_seq); | |
1848 t = unshare_expr (gimple_eh_filter_types (eh_filter_stmt)); | |
1849 gimple_eh_filter_set_types (eh_filter_copy, t); | |
1850 } | |
1851 break; | |
1852 | |
1853 case GIMPLE_EH_ELSE: | |
1854 { | |
1855 geh_else *eh_else_stmt = as_a <geh_else *> (stmt); | |
1856 geh_else *eh_else_copy = as_a <geh_else *> (copy); | |
1857 new_seq = gimple_seq_copy (gimple_eh_else_n_body (eh_else_stmt)); | |
1858 gimple_eh_else_set_n_body (eh_else_copy, new_seq); | |
1859 new_seq = gimple_seq_copy (gimple_eh_else_e_body (eh_else_stmt)); | |
1860 gimple_eh_else_set_e_body (eh_else_copy, new_seq); | |
1861 } | |
0 | 1862 break; |
1863 | |
1864 case GIMPLE_TRY: | |
111 | 1865 { |
1866 gtry *try_stmt = as_a <gtry *> (stmt); | |
1867 gtry *try_copy = as_a <gtry *> (copy); | |
1868 new_seq = gimple_seq_copy (gimple_try_eval (try_stmt)); | |
1869 gimple_try_set_eval (try_copy, new_seq); | |
1870 new_seq = gimple_seq_copy (gimple_try_cleanup (try_stmt)); | |
1871 gimple_try_set_cleanup (try_copy, new_seq); | |
1872 } | |
0 | 1873 break; |
1874 | |
1875 case GIMPLE_OMP_FOR: | |
1876 new_seq = gimple_seq_copy (gimple_omp_for_pre_body (stmt)); | |
1877 gimple_omp_for_set_pre_body (copy, new_seq); | |
1878 t = unshare_expr (gimple_omp_for_clauses (stmt)); | |
1879 gimple_omp_for_set_clauses (copy, t); | |
111 | 1880 { |
1881 gomp_for *omp_for_copy = as_a <gomp_for *> (copy); | |
1882 omp_for_copy->iter = ggc_vec_alloc<gimple_omp_for_iter> | |
1883 ( gimple_omp_for_collapse (stmt)); | |
1884 } | |
0 | 1885 for (i = 0; i < gimple_omp_for_collapse (stmt); i++) |
1886 { | |
1887 gimple_omp_for_set_cond (copy, i, | |
1888 gimple_omp_for_cond (stmt, i)); | |
1889 gimple_omp_for_set_index (copy, i, | |
1890 gimple_omp_for_index (stmt, i)); | |
1891 t = unshare_expr (gimple_omp_for_initial (stmt, i)); | |
1892 gimple_omp_for_set_initial (copy, i, t); | |
1893 t = unshare_expr (gimple_omp_for_final (stmt, i)); | |
1894 gimple_omp_for_set_final (copy, i, t); | |
1895 t = unshare_expr (gimple_omp_for_incr (stmt, i)); | |
1896 gimple_omp_for_set_incr (copy, i, t); | |
1897 } | |
1898 goto copy_omp_body; | |
1899 | |
1900 case GIMPLE_OMP_PARALLEL: | |
111 | 1901 { |
1902 gomp_parallel *omp_par_stmt = as_a <gomp_parallel *> (stmt); | |
1903 gomp_parallel *omp_par_copy = as_a <gomp_parallel *> (copy); | |
1904 t = unshare_expr (gimple_omp_parallel_clauses (omp_par_stmt)); | |
1905 gimple_omp_parallel_set_clauses (omp_par_copy, t); | |
1906 t = unshare_expr (gimple_omp_parallel_child_fn (omp_par_stmt)); | |
1907 gimple_omp_parallel_set_child_fn (omp_par_copy, t); | |
1908 t = unshare_expr (gimple_omp_parallel_data_arg (omp_par_stmt)); | |
1909 gimple_omp_parallel_set_data_arg (omp_par_copy, t); | |
1910 } | |
0 | 1911 goto copy_omp_body; |
1912 | |
1913 case GIMPLE_OMP_TASK: | |
1914 t = unshare_expr (gimple_omp_task_clauses (stmt)); | |
1915 gimple_omp_task_set_clauses (copy, t); | |
1916 t = unshare_expr (gimple_omp_task_child_fn (stmt)); | |
1917 gimple_omp_task_set_child_fn (copy, t); | |
1918 t = unshare_expr (gimple_omp_task_data_arg (stmt)); | |
1919 gimple_omp_task_set_data_arg (copy, t); | |
1920 t = unshare_expr (gimple_omp_task_copy_fn (stmt)); | |
1921 gimple_omp_task_set_copy_fn (copy, t); | |
1922 t = unshare_expr (gimple_omp_task_arg_size (stmt)); | |
1923 gimple_omp_task_set_arg_size (copy, t); | |
1924 t = unshare_expr (gimple_omp_task_arg_align (stmt)); | |
1925 gimple_omp_task_set_arg_align (copy, t); | |
1926 goto copy_omp_body; | |
1927 | |
1928 case GIMPLE_OMP_CRITICAL: | |
111 | 1929 t = unshare_expr (gimple_omp_critical_name |
1930 (as_a <gomp_critical *> (stmt))); | |
1931 gimple_omp_critical_set_name (as_a <gomp_critical *> (copy), t); | |
1932 t = unshare_expr (gimple_omp_critical_clauses | |
1933 (as_a <gomp_critical *> (stmt))); | |
1934 gimple_omp_critical_set_clauses (as_a <gomp_critical *> (copy), t); | |
1935 goto copy_omp_body; | |
1936 | |
1937 case GIMPLE_OMP_ORDERED: | |
1938 t = unshare_expr (gimple_omp_ordered_clauses | |
1939 (as_a <gomp_ordered *> (stmt))); | |
1940 gimple_omp_ordered_set_clauses (as_a <gomp_ordered *> (copy), t); | |
0 | 1941 goto copy_omp_body; |
1942 | |
1943 case GIMPLE_OMP_SECTIONS: | |
1944 t = unshare_expr (gimple_omp_sections_clauses (stmt)); | |
1945 gimple_omp_sections_set_clauses (copy, t); | |
1946 t = unshare_expr (gimple_omp_sections_control (stmt)); | |
1947 gimple_omp_sections_set_control (copy, t); | |
111 | 1948 goto copy_omp_body; |
0 | 1949 |
1950 case GIMPLE_OMP_SINGLE: | |
111 | 1951 { |
1952 gomp_single *omp_single_copy = as_a <gomp_single *> (copy); | |
1953 t = unshare_expr (gimple_omp_single_clauses (stmt)); | |
1954 gimple_omp_single_set_clauses (omp_single_copy, t); | |
1955 } | |
1956 goto copy_omp_body; | |
1957 | |
1958 case GIMPLE_OMP_TARGET: | |
1959 { | |
1960 gomp_target *omp_target_stmt = as_a <gomp_target *> (stmt); | |
1961 gomp_target *omp_target_copy = as_a <gomp_target *> (copy); | |
1962 t = unshare_expr (gimple_omp_target_clauses (omp_target_stmt)); | |
1963 gimple_omp_target_set_clauses (omp_target_copy, t); | |
1964 t = unshare_expr (gimple_omp_target_data_arg (omp_target_stmt)); | |
1965 gimple_omp_target_set_data_arg (omp_target_copy, t); | |
1966 } | |
1967 goto copy_omp_body; | |
1968 | |
1969 case GIMPLE_OMP_TEAMS: | |
1970 { | |
1971 gomp_teams *omp_teams_copy = as_a <gomp_teams *> (copy); | |
1972 t = unshare_expr (gimple_omp_teams_clauses (stmt)); | |
1973 gimple_omp_teams_set_clauses (omp_teams_copy, t); | |
1974 } | |
1975 /* FALLTHRU */ | |
1976 | |
0 | 1977 case GIMPLE_OMP_SECTION: |
1978 case GIMPLE_OMP_MASTER: | |
111 | 1979 case GIMPLE_OMP_TASKGROUP: |
1980 case GIMPLE_OMP_GRID_BODY: | |
0 | 1981 copy_omp_body: |
1982 new_seq = gimple_seq_copy (gimple_omp_body (stmt)); | |
1983 gimple_omp_set_body (copy, new_seq); | |
1984 break; | |
1985 | |
111 | 1986 case GIMPLE_TRANSACTION: |
1987 new_seq = gimple_seq_copy (gimple_transaction_body ( | |
1988 as_a <gtransaction *> (stmt))); | |
1989 gimple_transaction_set_body (as_a <gtransaction *> (copy), | |
1990 new_seq); | |
1991 break; | |
1992 | |
0 | 1993 case GIMPLE_WITH_CLEANUP_EXPR: |
1994 new_seq = gimple_seq_copy (gimple_wce_cleanup (stmt)); | |
1995 gimple_wce_set_cleanup (copy, new_seq); | |
1996 break; | |
1997 | |
1998 default: | |
1999 gcc_unreachable (); | |
2000 } | |
2001 } | |
2002 | |
2003 /* Make copy of operands. */ | |
111 | 2004 for (i = 0; i < num_ops; i++) |
2005 gimple_set_op (copy, i, unshare_expr (gimple_op (stmt, i))); | |
2006 | |
2007 if (gimple_has_mem_ops (stmt)) | |
0 | 2008 { |
111 | 2009 gimple_set_vdef (copy, gimple_vdef (stmt)); |
2010 gimple_set_vuse (copy, gimple_vuse (stmt)); | |
2011 } | |
2012 | |
2013 /* Clear out SSA operand vectors on COPY. */ | |
2014 if (gimple_has_ops (stmt)) | |
2015 { | |
2016 gimple_set_use_ops (copy, NULL); | |
0 | 2017 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2018 /* SSA operands need to be updated. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2019 gimple_set_modified (copy, true); |
0 | 2020 } |
2021 | |
131 | 2022 if (gimple_debug_nonbind_marker_p (stmt)) |
2023 cfun->debug_marker_count++; | |
2024 | |
0 | 2025 return copy; |
2026 } | |
2027 | |
2028 | |
2029 /* Return true if statement S has side-effects. We consider a | |
2030 statement to have side effects if: | |
2031 | |
2032 - It is a GIMPLE_CALL not marked with ECF_PURE or ECF_CONST. | |
2033 - Any of its operands are marked TREE_THIS_VOLATILE or TREE_SIDE_EFFECTS. */ | |
2034 | |
2035 bool | |
111 | 2036 gimple_has_side_effects (const gimple *s) |
0 | 2037 { |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2038 if (is_gimple_debug (s)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2039 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2040 |
0 | 2041 /* We don't have to scan the arguments to check for |
2042 volatile arguments, though, at present, we still | |
2043 do a scan to check for TREE_SIDE_EFFECTS. */ | |
2044 if (gimple_has_volatile_ops (s)) | |
2045 return true; | |
2046 | |
111 | 2047 if (gimple_code (s) == GIMPLE_ASM |
2048 && gimple_asm_volatile_p (as_a <const gasm *> (s))) | |
2049 return true; | |
0 | 2050 |
2051 if (is_gimple_call (s)) | |
2052 { | |
111 | 2053 int flags = gimple_call_flags (s); |
2054 | |
2055 /* An infinite loop is considered a side effect. */ | |
2056 if (!(flags & (ECF_CONST | ECF_PURE)) | |
2057 || (flags & ECF_LOOPING_CONST_OR_PURE)) | |
2058 return true; | |
0 | 2059 |
2060 return false; | |
2061 } | |
2062 | |
2063 return false; | |
2064 } | |
2065 | |
2066 /* Helper for gimple_could_trap_p and gimple_assign_rhs_could_trap_p. | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2067 Return true if S can trap. When INCLUDE_MEM is true, check whether |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2068 the memory operations could trap. When INCLUDE_STORES is true and |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2069 S is a GIMPLE_ASSIGN, the LHS of the assignment is also checked. */ |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2070 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2071 bool |
111 | 2072 gimple_could_trap_p_1 (gimple *s, bool include_mem, bool include_stores) |
0 | 2073 { |
2074 tree t, div = NULL_TREE; | |
2075 enum tree_code op; | |
2076 | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2077 if (include_mem) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2078 { |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2079 unsigned i, start = (is_gimple_assign (s) && !include_stores) ? 1 : 0; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2080 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2081 for (i = start; i < gimple_num_ops (s); i++) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2082 if (tree_could_trap_p (gimple_op (s, i))) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2083 return true; |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2084 } |
0 | 2085 |
2086 switch (gimple_code (s)) | |
2087 { | |
2088 case GIMPLE_ASM: | |
111 | 2089 return gimple_asm_volatile_p (as_a <gasm *> (s)); |
0 | 2090 |
2091 case GIMPLE_CALL: | |
2092 t = gimple_call_fndecl (s); | |
2093 /* Assume that calls to weak functions may trap. */ | |
2094 if (!t || !DECL_P (t) || DECL_WEAK (t)) | |
2095 return true; | |
2096 return false; | |
2097 | |
2098 case GIMPLE_ASSIGN: | |
2099 t = gimple_expr_type (s); | |
2100 op = gimple_assign_rhs_code (s); | |
2101 if (get_gimple_rhs_class (op) == GIMPLE_BINARY_RHS) | |
2102 div = gimple_assign_rhs2 (s); | |
2103 return (operation_could_trap_p (op, FLOAT_TYPE_P (t), | |
2104 (INTEGRAL_TYPE_P (t) | |
2105 && TYPE_OVERFLOW_TRAPS (t)), | |
2106 div)); | |
2107 | |
111 | 2108 case GIMPLE_COND: |
2109 t = TREE_TYPE (gimple_cond_lhs (s)); | |
2110 return operation_could_trap_p (gimple_cond_code (s), | |
2111 FLOAT_TYPE_P (t), false, NULL_TREE); | |
2112 | |
0 | 2113 default: |
2114 break; | |
2115 } | |
2116 | |
2117 return false; | |
2118 } | |
2119 | |
2120 /* Return true if statement S can trap. */ | |
2121 | |
2122 bool | |
111 | 2123 gimple_could_trap_p (gimple *s) |
0 | 2124 { |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2125 return gimple_could_trap_p_1 (s, true, true); |
0 | 2126 } |
2127 | |
2128 /* Return true if RHS of a GIMPLE_ASSIGN S can trap. */ | |
2129 | |
2130 bool | |
111 | 2131 gimple_assign_rhs_could_trap_p (gimple *s) |
0 | 2132 { |
2133 gcc_assert (is_gimple_assign (s)); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2134 return gimple_could_trap_p_1 (s, true, false); |
0 | 2135 } |
2136 | |
2137 | |
2138 /* Print debugging information for gimple stmts generated. */ | |
2139 | |
2140 void | |
2141 dump_gimple_statistics (void) | |
2142 { | |
131 | 2143 int i; |
2144 uint64_t total_tuples = 0, total_bytes = 0; | |
0 | 2145 |
111 | 2146 if (! GATHER_STATISTICS) |
2147 { | |
131 | 2148 fprintf (stderr, "No GIMPLE statistics\n"); |
111 | 2149 return; |
2150 } | |
2151 | |
0 | 2152 fprintf (stderr, "\nGIMPLE statements\n"); |
2153 fprintf (stderr, "Kind Stmts Bytes\n"); | |
2154 fprintf (stderr, "---------------------------------------\n"); | |
2155 for (i = 0; i < (int) gimple_alloc_kind_all; ++i) | |
2156 { | |
131 | 2157 fprintf (stderr, "%-20s %7" PRIu64 " %10" PRIu64 "\n", |
2158 gimple_alloc_kind_names[i], gimple_alloc_counts[i], | |
2159 gimple_alloc_sizes[i]); | |
0 | 2160 total_tuples += gimple_alloc_counts[i]; |
2161 total_bytes += gimple_alloc_sizes[i]; | |
2162 } | |
2163 fprintf (stderr, "---------------------------------------\n"); | |
131 | 2164 fprintf (stderr, "%-20s %7" PRIu64 " %10" PRIu64 "\n", "Total", |
2165 total_tuples, total_bytes); | |
0 | 2166 fprintf (stderr, "---------------------------------------\n"); |
2167 } | |
2168 | |
2169 | |
2170 /* Return the number of operands needed on the RHS of a GIMPLE | |
2171 assignment for an expression with tree code CODE. */ | |
2172 | |
2173 unsigned | |
2174 get_gimple_rhs_num_ops (enum tree_code code) | |
2175 { | |
2176 enum gimple_rhs_class rhs_class = get_gimple_rhs_class (code); | |
2177 | |
2178 if (rhs_class == GIMPLE_UNARY_RHS || rhs_class == GIMPLE_SINGLE_RHS) | |
2179 return 1; | |
2180 else if (rhs_class == GIMPLE_BINARY_RHS) | |
2181 return 2; | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2182 else if (rhs_class == GIMPLE_TERNARY_RHS) |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2183 return 3; |
0 | 2184 else |
2185 gcc_unreachable (); | |
2186 } | |
2187 | |
2188 #define DEFTREECODE(SYM, STRING, TYPE, NARGS) \ | |
2189 (unsigned char) \ | |
2190 ((TYPE) == tcc_unary ? GIMPLE_UNARY_RHS \ | |
2191 : ((TYPE) == tcc_binary \ | |
2192 || (TYPE) == tcc_comparison) ? GIMPLE_BINARY_RHS \ | |
2193 : ((TYPE) == tcc_constant \ | |
2194 || (TYPE) == tcc_declaration \ | |
2195 || (TYPE) == tcc_reference) ? GIMPLE_SINGLE_RHS \ | |
2196 : ((SYM) == TRUTH_AND_EXPR \ | |
2197 || (SYM) == TRUTH_OR_EXPR \ | |
2198 || (SYM) == TRUTH_XOR_EXPR) ? GIMPLE_BINARY_RHS \ | |
2199 : (SYM) == TRUTH_NOT_EXPR ? GIMPLE_UNARY_RHS \ | |
111 | 2200 : ((SYM) == COND_EXPR \ |
2201 || (SYM) == WIDEN_MULT_PLUS_EXPR \ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2202 || (SYM) == WIDEN_MULT_MINUS_EXPR \ |
111 | 2203 || (SYM) == DOT_PROD_EXPR \ |
2204 || (SYM) == SAD_EXPR \ | |
2205 || (SYM) == REALIGN_LOAD_EXPR \ | |
2206 || (SYM) == VEC_COND_EXPR \ | |
2207 || (SYM) == VEC_PERM_EXPR \ | |
131 | 2208 || (SYM) == BIT_INSERT_EXPR) ? GIMPLE_TERNARY_RHS \ |
111 | 2209 : ((SYM) == CONSTRUCTOR \ |
0 | 2210 || (SYM) == OBJ_TYPE_REF \ |
2211 || (SYM) == ASSERT_EXPR \ | |
2212 || (SYM) == ADDR_EXPR \ | |
2213 || (SYM) == WITH_SIZE_EXPR \ | |
111 | 2214 || (SYM) == SSA_NAME) ? GIMPLE_SINGLE_RHS \ |
0 | 2215 : GIMPLE_INVALID_RHS), |
2216 #define END_OF_BASE_TREE_CODES (unsigned char) GIMPLE_INVALID_RHS, | |
2217 | |
2218 const unsigned char gimple_rhs_class_table[] = { | |
2219 #include "all-tree.def" | |
2220 }; | |
2221 | |
2222 #undef DEFTREECODE | |
2223 #undef END_OF_BASE_TREE_CODES | |
2224 | |
2225 /* Canonicalize a tree T for use in a COND_EXPR as conditional. Returns | |
2226 a canonicalized tree that is valid for a COND_EXPR or NULL_TREE, if | |
2227 we failed to create one. */ | |
2228 | |
2229 tree | |
2230 canonicalize_cond_expr_cond (tree t) | |
2231 { | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2232 /* Strip conversions around boolean operations. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2233 if (CONVERT_EXPR_P (t) |
111 | 2234 && (truth_value_p (TREE_CODE (TREE_OPERAND (t, 0))) |
2235 || TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) | |
2236 == BOOLEAN_TYPE)) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2237 t = TREE_OPERAND (t, 0); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2238 |
0 | 2239 /* For !x use x == 0. */ |
111 | 2240 if (TREE_CODE (t) == TRUTH_NOT_EXPR) |
0 | 2241 { |
2242 tree top0 = TREE_OPERAND (t, 0); | |
2243 t = build2 (EQ_EXPR, TREE_TYPE (t), | |
2244 top0, build_int_cst (TREE_TYPE (top0), 0)); | |
2245 } | |
2246 /* For cmp ? 1 : 0 use cmp. */ | |
2247 else if (TREE_CODE (t) == COND_EXPR | |
2248 && COMPARISON_CLASS_P (TREE_OPERAND (t, 0)) | |
2249 && integer_onep (TREE_OPERAND (t, 1)) | |
2250 && integer_zerop (TREE_OPERAND (t, 2))) | |
2251 { | |
2252 tree top0 = TREE_OPERAND (t, 0); | |
2253 t = build2 (TREE_CODE (top0), TREE_TYPE (t), | |
2254 TREE_OPERAND (top0, 0), TREE_OPERAND (top0, 1)); | |
2255 } | |
111 | 2256 /* For x ^ y use x != y. */ |
2257 else if (TREE_CODE (t) == BIT_XOR_EXPR) | |
2258 t = build2 (NE_EXPR, TREE_TYPE (t), | |
2259 TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)); | |
2260 | |
0 | 2261 if (is_gimple_condexpr (t)) |
2262 return t; | |
2263 | |
2264 return NULL_TREE; | |
2265 } | |
2266 | |
2267 /* Build a GIMPLE_CALL identical to STMT but skipping the arguments in | |
2268 the positions marked by the set ARGS_TO_SKIP. */ | |
2269 | |
111 | 2270 gcall * |
2271 gimple_call_copy_skip_args (gcall *stmt, bitmap args_to_skip) | |
0 | 2272 { |
2273 int i; | |
2274 int nargs = gimple_call_num_args (stmt); | |
111 | 2275 auto_vec<tree> vargs (nargs); |
2276 gcall *new_stmt; | |
0 | 2277 |
2278 for (i = 0; i < nargs; i++) | |
2279 if (!bitmap_bit_p (args_to_skip, i)) | |
111 | 2280 vargs.quick_push (gimple_call_arg (stmt, i)); |
2281 | |
2282 if (gimple_call_internal_p (stmt)) | |
2283 new_stmt = gimple_build_call_internal_vec (gimple_call_internal_fn (stmt), | |
2284 vargs); | |
2285 else | |
2286 new_stmt = gimple_build_call_vec (gimple_call_fn (stmt), vargs); | |
2287 | |
0 | 2288 if (gimple_call_lhs (stmt)) |
2289 gimple_call_set_lhs (new_stmt, gimple_call_lhs (stmt)); | |
2290 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2291 gimple_set_vuse (new_stmt, gimple_vuse (stmt)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2292 gimple_set_vdef (new_stmt, gimple_vdef (stmt)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2293 |
0 | 2294 if (gimple_has_location (stmt)) |
2295 gimple_set_location (new_stmt, gimple_location (stmt)); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2296 gimple_call_copy_flags (new_stmt, stmt); |
0 | 2297 gimple_call_set_chain (new_stmt, gimple_call_chain (stmt)); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2298 |
73
ce75bd9117e4
merge calls.c, cfgexpand.c, gcc.c, gimple.c, gimple.h and gimplify.c
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
70
diff
changeset
|
2299 #ifndef noCbC |
ce75bd9117e4
merge calls.c, cfgexpand.c, gcc.c, gimple.c, gimple.h and gimplify.c
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
70
diff
changeset
|
2300 gimple_call_set_cbc_goto (new_stmt, gimple_call_cbc_goto_p (stmt)); |
ce75bd9117e4
merge calls.c, cfgexpand.c, gcc.c, gimple.c, gimple.h and gimplify.c
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
70
diff
changeset
|
2301 #endif |
ce75bd9117e4
merge calls.c, cfgexpand.c, gcc.c, gimple.c, gimple.h and gimplify.c
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
70
diff
changeset
|
2302 |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2303 gimple_set_modified (new_stmt, true); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2304 |
0 | 2305 return new_stmt; |
2306 } | |
2307 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2308 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2309 |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2310 /* Return true if the field decls F1 and F2 are at the same offset. |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2311 |
111 | 2312 This is intended to be used on GIMPLE types only. */ |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2313 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2314 bool |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2315 gimple_compare_field_offset (tree f1, tree f2) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2316 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2317 if (DECL_OFFSET_ALIGN (f1) == DECL_OFFSET_ALIGN (f2)) |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2318 { |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2319 tree offset1 = DECL_FIELD_OFFSET (f1); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2320 tree offset2 = DECL_FIELD_OFFSET (f2); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2321 return ((offset1 == offset2 |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2322 /* Once gimplification is done, self-referential offsets are |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2323 instantiated as operand #2 of the COMPONENT_REF built for |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2324 each access and reset. Therefore, they are not relevant |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2325 anymore and fields are interchangeable provided that they |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2326 represent the same access. */ |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2327 || (TREE_CODE (offset1) == PLACEHOLDER_EXPR |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2328 && TREE_CODE (offset2) == PLACEHOLDER_EXPR |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2329 && (DECL_SIZE (f1) == DECL_SIZE (f2) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2330 || (TREE_CODE (DECL_SIZE (f1)) == PLACEHOLDER_EXPR |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2331 && TREE_CODE (DECL_SIZE (f2)) == PLACEHOLDER_EXPR) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2332 || operand_equal_p (DECL_SIZE (f1), DECL_SIZE (f2), 0)) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2333 && DECL_ALIGN (f1) == DECL_ALIGN (f2)) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2334 || operand_equal_p (offset1, offset2, 0)) |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2335 && tree_int_cst_equal (DECL_FIELD_BIT_OFFSET (f1), |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2336 DECL_FIELD_BIT_OFFSET (f2))); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2337 } |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2338 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2339 /* Fortran and C do not always agree on what DECL_OFFSET_ALIGN |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2340 should be, so handle differing ones specially by decomposing |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2341 the offset into a byte and bit offset manually. */ |
111 | 2342 if (tree_fits_shwi_p (DECL_FIELD_OFFSET (f1)) |
2343 && tree_fits_shwi_p (DECL_FIELD_OFFSET (f2))) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2344 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2345 unsigned HOST_WIDE_INT byte_offset1, byte_offset2; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2346 unsigned HOST_WIDE_INT bit_offset1, bit_offset2; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2347 bit_offset1 = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (f1)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2348 byte_offset1 = (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f1)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2349 + bit_offset1 / BITS_PER_UNIT); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2350 bit_offset2 = TREE_INT_CST_LOW (DECL_FIELD_BIT_OFFSET (f2)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2351 byte_offset2 = (TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f2)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2352 + bit_offset2 / BITS_PER_UNIT); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2353 if (byte_offset1 != byte_offset2) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2354 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2355 return bit_offset1 % BITS_PER_UNIT == bit_offset2 % BITS_PER_UNIT; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2356 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2357 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2358 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2359 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2360 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2361 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2362 /* Return a type the same as TYPE except unsigned or |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2363 signed according to UNSIGNEDP. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2364 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2365 static tree |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2366 gimple_signed_or_unsigned_type (bool unsignedp, tree type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2367 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2368 tree type1; |
111 | 2369 int i; |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2370 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2371 type1 = TYPE_MAIN_VARIANT (type); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2372 if (type1 == signed_char_type_node |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2373 || type1 == char_type_node |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2374 || type1 == unsigned_char_type_node) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2375 return unsignedp ? unsigned_char_type_node : signed_char_type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2376 if (type1 == integer_type_node || type1 == unsigned_type_node) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2377 return unsignedp ? unsigned_type_node : integer_type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2378 if (type1 == short_integer_type_node || type1 == short_unsigned_type_node) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2379 return unsignedp ? short_unsigned_type_node : short_integer_type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2380 if (type1 == long_integer_type_node || type1 == long_unsigned_type_node) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2381 return unsignedp ? long_unsigned_type_node : long_integer_type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2382 if (type1 == long_long_integer_type_node |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2383 || type1 == long_long_unsigned_type_node) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2384 return unsignedp |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2385 ? long_long_unsigned_type_node |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2386 : long_long_integer_type_node; |
111 | 2387 |
2388 for (i = 0; i < NUM_INT_N_ENTS; i ++) | |
2389 if (int_n_enabled_p[i] | |
2390 && (type1 == int_n_trees[i].unsigned_type | |
2391 || type1 == int_n_trees[i].signed_type)) | |
2392 return unsignedp | |
2393 ? int_n_trees[i].unsigned_type | |
2394 : int_n_trees[i].signed_type; | |
2395 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2396 #if HOST_BITS_PER_WIDE_INT >= 64 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2397 if (type1 == intTI_type_node || type1 == unsigned_intTI_type_node) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2398 return unsignedp ? unsigned_intTI_type_node : intTI_type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2399 #endif |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2400 if (type1 == intDI_type_node || type1 == unsigned_intDI_type_node) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2401 return unsignedp ? unsigned_intDI_type_node : intDI_type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2402 if (type1 == intSI_type_node || type1 == unsigned_intSI_type_node) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2403 return unsignedp ? unsigned_intSI_type_node : intSI_type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2404 if (type1 == intHI_type_node || type1 == unsigned_intHI_type_node) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2405 return unsignedp ? unsigned_intHI_type_node : intHI_type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2406 if (type1 == intQI_type_node || type1 == unsigned_intQI_type_node) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2407 return unsignedp ? unsigned_intQI_type_node : intQI_type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2408 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2409 #define GIMPLE_FIXED_TYPES(NAME) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2410 if (type1 == short_ ## NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2411 || type1 == unsigned_short_ ## NAME ## _type_node) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2412 return unsignedp ? unsigned_short_ ## NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2413 : short_ ## NAME ## _type_node; \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2414 if (type1 == NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2415 || type1 == unsigned_ ## NAME ## _type_node) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2416 return unsignedp ? unsigned_ ## NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2417 : NAME ## _type_node; \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2418 if (type1 == long_ ## NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2419 || type1 == unsigned_long_ ## NAME ## _type_node) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2420 return unsignedp ? unsigned_long_ ## NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2421 : long_ ## NAME ## _type_node; \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2422 if (type1 == long_long_ ## NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2423 || type1 == unsigned_long_long_ ## NAME ## _type_node) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2424 return unsignedp ? unsigned_long_long_ ## NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2425 : long_long_ ## NAME ## _type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2426 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2427 #define GIMPLE_FIXED_MODE_TYPES(NAME) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2428 if (type1 == NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2429 || type1 == u ## NAME ## _type_node) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2430 return unsignedp ? u ## NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2431 : NAME ## _type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2432 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2433 #define GIMPLE_FIXED_TYPES_SAT(NAME) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2434 if (type1 == sat_ ## short_ ## NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2435 || type1 == sat_ ## unsigned_short_ ## NAME ## _type_node) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2436 return unsignedp ? sat_ ## unsigned_short_ ## NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2437 : sat_ ## short_ ## NAME ## _type_node; \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2438 if (type1 == sat_ ## NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2439 || type1 == sat_ ## unsigned_ ## NAME ## _type_node) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2440 return unsignedp ? sat_ ## unsigned_ ## NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2441 : sat_ ## NAME ## _type_node; \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2442 if (type1 == sat_ ## long_ ## NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2443 || type1 == sat_ ## unsigned_long_ ## NAME ## _type_node) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2444 return unsignedp ? sat_ ## unsigned_long_ ## NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2445 : sat_ ## long_ ## NAME ## _type_node; \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2446 if (type1 == sat_ ## long_long_ ## NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2447 || type1 == sat_ ## unsigned_long_long_ ## NAME ## _type_node) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2448 return unsignedp ? sat_ ## unsigned_long_long_ ## NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2449 : sat_ ## long_long_ ## NAME ## _type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2450 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2451 #define GIMPLE_FIXED_MODE_TYPES_SAT(NAME) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2452 if (type1 == sat_ ## NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2453 || type1 == sat_ ## u ## NAME ## _type_node) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2454 return unsignedp ? sat_ ## u ## NAME ## _type_node \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2455 : sat_ ## NAME ## _type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2456 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2457 GIMPLE_FIXED_TYPES (fract); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2458 GIMPLE_FIXED_TYPES_SAT (fract); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2459 GIMPLE_FIXED_TYPES (accum); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2460 GIMPLE_FIXED_TYPES_SAT (accum); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2461 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2462 GIMPLE_FIXED_MODE_TYPES (qq); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2463 GIMPLE_FIXED_MODE_TYPES (hq); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2464 GIMPLE_FIXED_MODE_TYPES (sq); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2465 GIMPLE_FIXED_MODE_TYPES (dq); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2466 GIMPLE_FIXED_MODE_TYPES (tq); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2467 GIMPLE_FIXED_MODE_TYPES_SAT (qq); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2468 GIMPLE_FIXED_MODE_TYPES_SAT (hq); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2469 GIMPLE_FIXED_MODE_TYPES_SAT (sq); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2470 GIMPLE_FIXED_MODE_TYPES_SAT (dq); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2471 GIMPLE_FIXED_MODE_TYPES_SAT (tq); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2472 GIMPLE_FIXED_MODE_TYPES (ha); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2473 GIMPLE_FIXED_MODE_TYPES (sa); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2474 GIMPLE_FIXED_MODE_TYPES (da); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2475 GIMPLE_FIXED_MODE_TYPES (ta); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2476 GIMPLE_FIXED_MODE_TYPES_SAT (ha); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2477 GIMPLE_FIXED_MODE_TYPES_SAT (sa); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2478 GIMPLE_FIXED_MODE_TYPES_SAT (da); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2479 GIMPLE_FIXED_MODE_TYPES_SAT (ta); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2480 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2481 /* For ENUMERAL_TYPEs in C++, must check the mode of the types, not |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2482 the precision; they have precision set to match their range, but |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2483 may use a wider mode to match an ABI. If we change modes, we may |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2484 wind up with bad conversions. For INTEGER_TYPEs in C, must check |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2485 the precision as well, so as to yield correct results for |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2486 bit-field types. C++ does not have these separate bit-field |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2487 types, and producing a signed or unsigned variant of an |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2488 ENUMERAL_TYPE may cause other problems as well. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2489 if (!INTEGRAL_TYPE_P (type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2490 || TYPE_UNSIGNED (type) == unsignedp) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2491 return type; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2492 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2493 #define TYPE_OK(node) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2494 (TYPE_MODE (type) == TYPE_MODE (node) \ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2495 && TYPE_PRECISION (type) == TYPE_PRECISION (node)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2496 if (TYPE_OK (signed_char_type_node)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2497 return unsignedp ? unsigned_char_type_node : signed_char_type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2498 if (TYPE_OK (integer_type_node)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2499 return unsignedp ? unsigned_type_node : integer_type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2500 if (TYPE_OK (short_integer_type_node)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2501 return unsignedp ? short_unsigned_type_node : short_integer_type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2502 if (TYPE_OK (long_integer_type_node)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2503 return unsignedp ? long_unsigned_type_node : long_integer_type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2504 if (TYPE_OK (long_long_integer_type_node)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2505 return (unsignedp |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2506 ? long_long_unsigned_type_node |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2507 : long_long_integer_type_node); |
111 | 2508 |
2509 for (i = 0; i < NUM_INT_N_ENTS; i ++) | |
2510 if (int_n_enabled_p[i] | |
2511 && TYPE_MODE (type) == int_n_data[i].m | |
2512 && TYPE_PRECISION (type) == int_n_data[i].bitsize) | |
2513 return unsignedp | |
2514 ? int_n_trees[i].unsigned_type | |
2515 : int_n_trees[i].signed_type; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2516 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2517 #if HOST_BITS_PER_WIDE_INT >= 64 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2518 if (TYPE_OK (intTI_type_node)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2519 return unsignedp ? unsigned_intTI_type_node : intTI_type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2520 #endif |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2521 if (TYPE_OK (intDI_type_node)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2522 return unsignedp ? unsigned_intDI_type_node : intDI_type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2523 if (TYPE_OK (intSI_type_node)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2524 return unsignedp ? unsigned_intSI_type_node : intSI_type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2525 if (TYPE_OK (intHI_type_node)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2526 return unsignedp ? unsigned_intHI_type_node : intHI_type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2527 if (TYPE_OK (intQI_type_node)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2528 return unsignedp ? unsigned_intQI_type_node : intQI_type_node; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2529 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2530 #undef GIMPLE_FIXED_TYPES |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2531 #undef GIMPLE_FIXED_MODE_TYPES |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2532 #undef GIMPLE_FIXED_TYPES_SAT |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2533 #undef GIMPLE_FIXED_MODE_TYPES_SAT |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2534 #undef TYPE_OK |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2535 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2536 return build_nonstandard_integer_type (TYPE_PRECISION (type), unsignedp); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2537 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2538 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2539 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2540 /* Return an unsigned type the same as TYPE in other respects. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2541 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2542 tree |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2543 gimple_unsigned_type (tree type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2544 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2545 return gimple_signed_or_unsigned_type (true, type); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2546 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2547 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2548 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2549 /* Return a signed type the same as TYPE in other respects. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2550 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2551 tree |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2552 gimple_signed_type (tree type) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2553 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2554 return gimple_signed_or_unsigned_type (false, type); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2555 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2556 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2557 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2558 /* Return the typed-based alias set for T, which may be an expression |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2559 or a type. Return -1 if we don't do anything special. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2560 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2561 alias_set_type |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2562 gimple_get_alias_set (tree t) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2563 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2564 /* That's all the expressions we handle specially. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2565 if (!TYPE_P (t)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2566 return -1; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2567 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2568 /* For convenience, follow the C standard when dealing with |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2569 character types. Any object may be accessed via an lvalue that |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2570 has character type. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2571 if (t == char_type_node |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2572 || t == signed_char_type_node |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2573 || t == unsigned_char_type_node) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2574 return 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2575 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2576 /* Allow aliasing between signed and unsigned variants of the same |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2577 type. We treat the signed variant as canonical. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2578 if (TREE_CODE (t) == INTEGER_TYPE && TYPE_UNSIGNED (t)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2579 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2580 tree t1 = gimple_signed_type (t); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2581 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2582 /* t1 == t can happen for boolean nodes which are always unsigned. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2583 if (t1 != t) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2584 return get_alias_set (t1); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2585 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2586 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2587 return -1; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2588 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2589 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2590 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2591 /* Helper for gimple_ior_addresses_taken_1. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2592 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2593 static bool |
111 | 2594 gimple_ior_addresses_taken_1 (gimple *, tree addr, tree, void *data) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2595 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2596 bitmap addresses_taken = (bitmap)data; |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2597 addr = get_base_address (addr); |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2598 if (addr |
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
2599 && DECL_P (addr)) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2600 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2601 bitmap_set_bit (addresses_taken, DECL_UID (addr)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2602 return true; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2603 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2604 return false; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2605 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2606 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2607 /* Set the bit for the uid of all decls that have their address taken |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2608 in STMT in the ADDRESSES_TAKEN bitmap. Returns true if there |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2609 were any in this stmt. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2610 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2611 bool |
111 | 2612 gimple_ior_addresses_taken (bitmap addresses_taken, gimple *stmt) |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2613 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2614 return walk_stmt_load_store_addr_ops (stmt, addresses_taken, NULL, NULL, |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2615 gimple_ior_addresses_taken_1); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2616 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2617 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2618 |
111 | 2619 /* Return true when STMTs arguments and return value match those of FNDECL, |
2620 a decl of a builtin function. */ | |
2621 | |
2622 bool | |
2623 gimple_builtin_call_types_compatible_p (const gimple *stmt, tree fndecl) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2624 { |
111 | 2625 gcc_checking_assert (DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN); |
2626 | |
2627 tree ret = gimple_call_lhs (stmt); | |
2628 if (ret | |
2629 && !useless_type_conversion_p (TREE_TYPE (ret), | |
2630 TREE_TYPE (TREE_TYPE (fndecl)))) | |
2631 return false; | |
2632 | |
2633 tree targs = TYPE_ARG_TYPES (TREE_TYPE (fndecl)); | |
2634 unsigned nargs = gimple_call_num_args (stmt); | |
2635 for (unsigned i = 0; i < nargs; ++i) | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2636 { |
111 | 2637 /* Variadic args follow. */ |
2638 if (!targs) | |
2639 return true; | |
2640 tree arg = gimple_call_arg (stmt, i); | |
2641 tree type = TREE_VALUE (targs); | |
2642 if (!useless_type_conversion_p (type, TREE_TYPE (arg)) | |
2643 /* char/short integral arguments are promoted to int | |
2644 by several frontends if targetm.calls.promote_prototypes | |
2645 is true. Allow such promotion too. */ | |
2646 && !(INTEGRAL_TYPE_P (type) | |
2647 && TYPE_PRECISION (type) < TYPE_PRECISION (integer_type_node) | |
2648 && targetm.calls.promote_prototypes (TREE_TYPE (fndecl)) | |
2649 && useless_type_conversion_p (integer_type_node, | |
2650 TREE_TYPE (arg)))) | |
2651 return false; | |
2652 targs = TREE_CHAIN (targs); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2653 } |
111 | 2654 if (targs && !VOID_TYPE_P (TREE_VALUE (targs))) |
2655 return false; | |
2656 return true; | |
2657 } | |
2658 | |
2659 /* Return true when STMT is builtins call. */ | |
2660 | |
2661 bool | |
2662 gimple_call_builtin_p (const gimple *stmt) | |
2663 { | |
2664 tree fndecl; | |
2665 if (is_gimple_call (stmt) | |
2666 && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE | |
2667 && DECL_BUILT_IN_CLASS (fndecl) != NOT_BUILT_IN) | |
2668 return gimple_builtin_call_types_compatible_p (stmt, fndecl); | |
2669 return false; | |
2670 } | |
2671 | |
2672 /* Return true when STMT is builtins call to CLASS. */ | |
2673 | |
2674 bool | |
2675 gimple_call_builtin_p (const gimple *stmt, enum built_in_class klass) | |
2676 { | |
2677 tree fndecl; | |
2678 if (is_gimple_call (stmt) | |
2679 && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE | |
2680 && DECL_BUILT_IN_CLASS (fndecl) == klass) | |
2681 return gimple_builtin_call_types_compatible_p (stmt, fndecl); | |
2682 return false; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2683 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
0
diff
changeset
|
2684 |
111 | 2685 /* Return true when STMT is builtins call to CODE of CLASS. */ |
2686 | |
2687 bool | |
2688 gimple_call_builtin_p (const gimple *stmt, enum built_in_function code) | |
2689 { | |
2690 tree fndecl; | |
2691 if (is_gimple_call (stmt) | |
2692 && (fndecl = gimple_call_fndecl (stmt)) != NULL_TREE | |
131 | 2693 && fndecl_built_in_p (fndecl, code)) |
111 | 2694 return gimple_builtin_call_types_compatible_p (stmt, fndecl); |
2695 return false; | |
2696 } | |
2697 | |
2698 /* If CALL is a call to a combined_fn (i.e. an internal function or | |
2699 a normal built-in function), return its code, otherwise return | |
2700 CFN_LAST. */ | |
2701 | |
2702 combined_fn | |
2703 gimple_call_combined_fn (const gimple *stmt) | |
2704 { | |
2705 if (const gcall *call = dyn_cast <const gcall *> (stmt)) | |
2706 { | |
2707 if (gimple_call_internal_p (call)) | |
2708 return as_combined_fn (gimple_call_internal_fn (call)); | |
2709 | |
2710 tree fndecl = gimple_call_fndecl (stmt); | |
2711 if (fndecl | |
131 | 2712 && fndecl_built_in_p (fndecl, BUILT_IN_NORMAL) |
111 | 2713 && gimple_builtin_call_types_compatible_p (stmt, fndecl)) |
2714 return as_combined_fn (DECL_FUNCTION_CODE (fndecl)); | |
2715 } | |
2716 return CFN_LAST; | |
2717 } | |
2718 | |
2719 /* Return true if STMT clobbers memory. STMT is required to be a | |
2720 GIMPLE_ASM. */ | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2721 |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2722 bool |
111 | 2723 gimple_asm_clobbers_memory_p (const gasm *stmt) |
2724 { | |
2725 unsigned i; | |
2726 | |
2727 for (i = 0; i < gimple_asm_nclobbers (stmt); i++) | |
2728 { | |
2729 tree op = gimple_asm_clobber_op (stmt, i); | |
2730 if (strcmp (TREE_STRING_POINTER (TREE_VALUE (op)), "memory") == 0) | |
2731 return true; | |
2732 } | |
2733 | |
2734 /* Non-empty basic ASM implicitly clobbers memory. */ | |
2735 if (gimple_asm_input_p (stmt) && strlen (gimple_asm_string (stmt)) != 0) | |
2736 return true; | |
2737 | |
2738 return false; | |
2739 } | |
2740 | |
2741 /* Dump bitmap SET (assumed to contain VAR_DECLs) to FILE. */ | |
2742 | |
2743 void | |
2744 dump_decl_set (FILE *file, bitmap set) | |
2745 { | |
2746 if (set) | |
2747 { | |
2748 bitmap_iterator bi; | |
2749 unsigned i; | |
2750 | |
2751 fprintf (file, "{ "); | |
2752 | |
2753 EXECUTE_IF_SET_IN_BITMAP (set, 0, i, bi) | |
2754 { | |
2755 fprintf (file, "D.%u", i); | |
2756 fprintf (file, " "); | |
2757 } | |
2758 | |
2759 fprintf (file, "}"); | |
2760 } | |
2761 else | |
2762 fprintf (file, "NIL"); | |
2763 } | |
2764 | |
2765 /* Return true when CALL is a call stmt that definitely doesn't | |
2766 free any memory or makes it unavailable otherwise. */ | |
2767 bool | |
2768 nonfreeing_call_p (gimple *call) | |
2769 { | |
2770 if (gimple_call_builtin_p (call, BUILT_IN_NORMAL) | |
2771 && gimple_call_flags (call) & ECF_LEAF) | |
2772 switch (DECL_FUNCTION_CODE (gimple_call_fndecl (call))) | |
2773 { | |
2774 /* Just in case these become ECF_LEAF in the future. */ | |
2775 case BUILT_IN_FREE: | |
2776 case BUILT_IN_TM_FREE: | |
2777 case BUILT_IN_REALLOC: | |
2778 case BUILT_IN_STACK_RESTORE: | |
2779 return false; | |
2780 default: | |
2781 return true; | |
2782 } | |
2783 else if (gimple_call_internal_p (call)) | |
2784 switch (gimple_call_internal_fn (call)) | |
2785 { | |
2786 case IFN_ABNORMAL_DISPATCHER: | |
2787 return true; | |
2788 case IFN_ASAN_MARK: | |
2789 return tree_to_uhwi (gimple_call_arg (call, 0)) == ASAN_MARK_UNPOISON; | |
2790 default: | |
2791 if (gimple_call_flags (call) & ECF_LEAF) | |
2792 return true; | |
2793 return false; | |
2794 } | |
2795 | |
2796 tree fndecl = gimple_call_fndecl (call); | |
2797 if (!fndecl) | |
2798 return false; | |
2799 struct cgraph_node *n = cgraph_node::get (fndecl); | |
2800 if (!n) | |
2801 return false; | |
2802 enum availability availability; | |
2803 n = n->function_symbol (&availability); | |
2804 if (!n || availability <= AVAIL_INTERPOSABLE) | |
2805 return false; | |
2806 return n->nonfreeing_fn; | |
2807 } | |
2808 | |
2809 /* Return true when CALL is a call stmt that definitely need not | |
2810 be considered to be a memory barrier. */ | |
2811 bool | |
2812 nonbarrier_call_p (gimple *call) | |
2813 { | |
2814 if (gimple_call_flags (call) & (ECF_PURE | ECF_CONST)) | |
2815 return true; | |
2816 /* Should extend this to have a nonbarrier_fn flag, just as above in | |
2817 the nonfreeing case. */ | |
2818 return false; | |
2819 } | |
2820 | |
2821 /* Callback for walk_stmt_load_store_ops. | |
2822 | |
2823 Return TRUE if OP will dereference the tree stored in DATA, FALSE | |
2824 otherwise. | |
2825 | |
2826 This routine only makes a superficial check for a dereference. Thus | |
2827 it must only be used if it is safe to return a false negative. */ | |
2828 static bool | |
2829 check_loadstore (gimple *, tree op, tree, void *data) | |
2830 { | |
2831 if (TREE_CODE (op) == MEM_REF || TREE_CODE (op) == TARGET_MEM_REF) | |
2832 { | |
2833 /* Some address spaces may legitimately dereference zero. */ | |
2834 addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (op)); | |
2835 if (targetm.addr_space.zero_address_valid (as)) | |
2836 return false; | |
2837 | |
2838 return operand_equal_p (TREE_OPERAND (op, 0), (tree)data, 0); | |
2839 } | |
2840 return false; | |
2841 } | |
2842 | |
2843 | |
2844 /* Return true if OP can be inferred to be non-NULL after STMT executes, | |
2845 either by using a pointer dereference or attributes. */ | |
2846 bool | |
2847 infer_nonnull_range (gimple *stmt, tree op) | |
2848 { | |
2849 return infer_nonnull_range_by_dereference (stmt, op) | |
2850 || infer_nonnull_range_by_attribute (stmt, op); | |
2851 } | |
2852 | |
2853 /* Return true if OP can be inferred to be non-NULL after STMT | |
2854 executes by using a pointer dereference. */ | |
2855 bool | |
2856 infer_nonnull_range_by_dereference (gimple *stmt, tree op) | |
2857 { | |
2858 /* We can only assume that a pointer dereference will yield | |
2859 non-NULL if -fdelete-null-pointer-checks is enabled. */ | |
2860 if (!flag_delete_null_pointer_checks | |
2861 || !POINTER_TYPE_P (TREE_TYPE (op)) | |
2862 || gimple_code (stmt) == GIMPLE_ASM) | |
2863 return false; | |
2864 | |
2865 if (walk_stmt_load_store_ops (stmt, (void *)op, | |
2866 check_loadstore, check_loadstore)) | |
2867 return true; | |
2868 | |
2869 return false; | |
2870 } | |
2871 | |
2872 /* Return true if OP can be inferred to be a non-NULL after STMT | |
2873 executes by using attributes. */ | |
2874 bool | |
2875 infer_nonnull_range_by_attribute (gimple *stmt, tree op) | |
2876 { | |
2877 /* We can only assume that a pointer dereference will yield | |
2878 non-NULL if -fdelete-null-pointer-checks is enabled. */ | |
2879 if (!flag_delete_null_pointer_checks | |
2880 || !POINTER_TYPE_P (TREE_TYPE (op)) | |
2881 || gimple_code (stmt) == GIMPLE_ASM) | |
2882 return false; | |
2883 | |
2884 if (is_gimple_call (stmt) && !gimple_call_internal_p (stmt)) | |
2885 { | |
2886 tree fntype = gimple_call_fntype (stmt); | |
2887 tree attrs = TYPE_ATTRIBUTES (fntype); | |
2888 for (; attrs; attrs = TREE_CHAIN (attrs)) | |
2889 { | |
2890 attrs = lookup_attribute ("nonnull", attrs); | |
2891 | |
2892 /* If "nonnull" wasn't specified, we know nothing about | |
2893 the argument. */ | |
2894 if (attrs == NULL_TREE) | |
2895 return false; | |
2896 | |
2897 /* If "nonnull" applies to all the arguments, then ARG | |
2898 is non-null if it's in the argument list. */ | |
2899 if (TREE_VALUE (attrs) == NULL_TREE) | |
2900 { | |
2901 for (unsigned int i = 0; i < gimple_call_num_args (stmt); i++) | |
2902 { | |
2903 if (POINTER_TYPE_P (TREE_TYPE (gimple_call_arg (stmt, i))) | |
2904 && operand_equal_p (op, gimple_call_arg (stmt, i), 0)) | |
2905 return true; | |
2906 } | |
2907 return false; | |
2908 } | |
2909 | |
2910 /* Now see if op appears in the nonnull list. */ | |
2911 for (tree t = TREE_VALUE (attrs); t; t = TREE_CHAIN (t)) | |
2912 { | |
2913 unsigned int idx = TREE_INT_CST_LOW (TREE_VALUE (t)) - 1; | |
2914 if (idx < gimple_call_num_args (stmt)) | |
2915 { | |
2916 tree arg = gimple_call_arg (stmt, idx); | |
2917 if (operand_equal_p (op, arg, 0)) | |
2918 return true; | |
2919 } | |
2920 } | |
2921 } | |
2922 } | |
2923 | |
2924 /* If this function is marked as returning non-null, then we can | |
2925 infer OP is non-null if it is used in the return statement. */ | |
2926 if (greturn *return_stmt = dyn_cast <greturn *> (stmt)) | |
2927 if (gimple_return_retval (return_stmt) | |
2928 && operand_equal_p (gimple_return_retval (return_stmt), op, 0) | |
2929 && lookup_attribute ("returns_nonnull", | |
2930 TYPE_ATTRIBUTES (TREE_TYPE (current_function_decl)))) | |
2931 return true; | |
2932 | |
2933 return false; | |
2934 } | |
2935 | |
2936 /* Compare two case labels. Because the front end should already have | |
2937 made sure that case ranges do not overlap, it is enough to only compare | |
2938 the CASE_LOW values of each case label. */ | |
2939 | |
2940 static int | |
2941 compare_case_labels (const void *p1, const void *p2) | |
2942 { | |
2943 const_tree const case1 = *(const_tree const*)p1; | |
2944 const_tree const case2 = *(const_tree const*)p2; | |
2945 | |
2946 /* The 'default' case label always goes first. */ | |
2947 if (!CASE_LOW (case1)) | |
2948 return -1; | |
2949 else if (!CASE_LOW (case2)) | |
2950 return 1; | |
2951 else | |
2952 return tree_int_cst_compare (CASE_LOW (case1), CASE_LOW (case2)); | |
2953 } | |
2954 | |
2955 /* Sort the case labels in LABEL_VEC in place in ascending order. */ | |
2956 | |
2957 void | |
2958 sort_case_labels (vec<tree> label_vec) | |
2959 { | |
2960 label_vec.qsort (compare_case_labels); | |
2961 } | |
2962 | |
2963 /* Prepare a vector of case labels to be used in a GIMPLE_SWITCH statement. | |
2964 | |
2965 LABELS is a vector that contains all case labels to look at. | |
2966 | |
2967 INDEX_TYPE is the type of the switch index expression. Case labels | |
2968 in LABELS are discarded if their values are not in the value range | |
2969 covered by INDEX_TYPE. The remaining case label values are folded | |
2970 to INDEX_TYPE. | |
2971 | |
2972 If a default case exists in LABELS, it is removed from LABELS and | |
2973 returned in DEFAULT_CASEP. If no default case exists, but the | |
2974 case labels already cover the whole range of INDEX_TYPE, a default | |
2975 case is returned pointing to one of the existing case labels. | |
2976 Otherwise DEFAULT_CASEP is set to NULL_TREE. | |
2977 | |
2978 DEFAULT_CASEP may be NULL, in which case the above comment doesn't | |
2979 apply and no action is taken regardless of whether a default case is | |
2980 found or not. */ | |
2981 | |
2982 void | |
2983 preprocess_case_label_vec_for_gimple (vec<tree> labels, | |
2984 tree index_type, | |
2985 tree *default_casep) | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
2986 { |
111 | 2987 tree min_value, max_value; |
2988 tree default_case = NULL_TREE; | |
2989 size_t i, len; | |
2990 | |
2991 i = 0; | |
2992 min_value = TYPE_MIN_VALUE (index_type); | |
2993 max_value = TYPE_MAX_VALUE (index_type); | |
2994 while (i < labels.length ()) | |
2995 { | |
2996 tree elt = labels[i]; | |
2997 tree low = CASE_LOW (elt); | |
2998 tree high = CASE_HIGH (elt); | |
2999 bool remove_element = FALSE; | |
3000 | |
3001 if (low) | |
3002 { | |
3003 gcc_checking_assert (TREE_CODE (low) == INTEGER_CST); | |
3004 gcc_checking_assert (!high || TREE_CODE (high) == INTEGER_CST); | |
3005 | |
3006 /* This is a non-default case label, i.e. it has a value. | |
3007 | |
3008 See if the case label is reachable within the range of | |
3009 the index type. Remove out-of-range case values. Turn | |
3010 case ranges into a canonical form (high > low strictly) | |
3011 and convert the case label values to the index type. | |
3012 | |
3013 NB: The type of gimple_switch_index() may be the promoted | |
3014 type, but the case labels retain the original type. */ | |
3015 | |
3016 if (high) | |
3017 { | |
3018 /* This is a case range. Discard empty ranges. | |
3019 If the bounds or the range are equal, turn this | |
3020 into a simple (one-value) case. */ | |
3021 int cmp = tree_int_cst_compare (high, low); | |
3022 if (cmp < 0) | |
3023 remove_element = TRUE; | |
3024 else if (cmp == 0) | |
3025 high = NULL_TREE; | |
3026 } | |
3027 | |
3028 if (! high) | |
3029 { | |
3030 /* If the simple case value is unreachable, ignore it. */ | |
3031 if ((TREE_CODE (min_value) == INTEGER_CST | |
3032 && tree_int_cst_compare (low, min_value) < 0) | |
3033 || (TREE_CODE (max_value) == INTEGER_CST | |
3034 && tree_int_cst_compare (low, max_value) > 0)) | |
3035 remove_element = TRUE; | |
3036 else | |
3037 low = fold_convert (index_type, low); | |
3038 } | |
3039 else | |
3040 { | |
3041 /* If the entire case range is unreachable, ignore it. */ | |
3042 if ((TREE_CODE (min_value) == INTEGER_CST | |
3043 && tree_int_cst_compare (high, min_value) < 0) | |
3044 || (TREE_CODE (max_value) == INTEGER_CST | |
3045 && tree_int_cst_compare (low, max_value) > 0)) | |
3046 remove_element = TRUE; | |
3047 else | |
3048 { | |
3049 /* If the lower bound is less than the index type's | |
3050 minimum value, truncate the range bounds. */ | |
3051 if (TREE_CODE (min_value) == INTEGER_CST | |
3052 && tree_int_cst_compare (low, min_value) < 0) | |
3053 low = min_value; | |
3054 low = fold_convert (index_type, low); | |
3055 | |
3056 /* If the upper bound is greater than the index type's | |
3057 maximum value, truncate the range bounds. */ | |
3058 if (TREE_CODE (max_value) == INTEGER_CST | |
3059 && tree_int_cst_compare (high, max_value) > 0) | |
3060 high = max_value; | |
3061 high = fold_convert (index_type, high); | |
3062 | |
3063 /* We may have folded a case range to a one-value case. */ | |
3064 if (tree_int_cst_equal (low, high)) | |
3065 high = NULL_TREE; | |
3066 } | |
3067 } | |
3068 | |
3069 CASE_LOW (elt) = low; | |
3070 CASE_HIGH (elt) = high; | |
3071 } | |
3072 else | |
3073 { | |
3074 gcc_assert (!default_case); | |
3075 default_case = elt; | |
3076 /* The default case must be passed separately to the | |
3077 gimple_build_switch routine. But if DEFAULT_CASEP | |
3078 is NULL, we do not remove the default case (it would | |
3079 be completely lost). */ | |
3080 if (default_casep) | |
3081 remove_element = TRUE; | |
3082 } | |
3083 | |
3084 if (remove_element) | |
3085 labels.ordered_remove (i); | |
3086 else | |
3087 i++; | |
3088 } | |
3089 len = i; | |
3090 | |
3091 if (!labels.is_empty ()) | |
3092 sort_case_labels (labels); | |
3093 | |
3094 if (default_casep && !default_case) | |
3095 { | |
3096 /* If the switch has no default label, add one, so that we jump | |
3097 around the switch body. If the labels already cover the whole | |
3098 range of the switch index_type, add the default label pointing | |
3099 to one of the existing labels. */ | |
3100 if (len | |
3101 && TYPE_MIN_VALUE (index_type) | |
3102 && TYPE_MAX_VALUE (index_type) | |
3103 && tree_int_cst_equal (CASE_LOW (labels[0]), | |
3104 TYPE_MIN_VALUE (index_type))) | |
3105 { | |
3106 tree low, high = CASE_HIGH (labels[len - 1]); | |
3107 if (!high) | |
3108 high = CASE_LOW (labels[len - 1]); | |
3109 if (tree_int_cst_equal (high, TYPE_MAX_VALUE (index_type))) | |
3110 { | |
3111 tree widest_label = labels[0]; | |
3112 for (i = 1; i < len; i++) | |
3113 { | |
3114 high = CASE_LOW (labels[i]); | |
3115 low = CASE_HIGH (labels[i - 1]); | |
3116 if (!low) | |
3117 low = CASE_LOW (labels[i - 1]); | |
3118 | |
3119 if (CASE_HIGH (labels[i]) != NULL_TREE | |
3120 && (CASE_HIGH (widest_label) == NULL_TREE | |
3121 || (wi::gtu_p | |
3122 (wi::to_wide (CASE_HIGH (labels[i])) | |
3123 - wi::to_wide (CASE_LOW (labels[i])), | |
3124 wi::to_wide (CASE_HIGH (widest_label)) | |
3125 - wi::to_wide (CASE_LOW (widest_label)))))) | |
3126 widest_label = labels[i]; | |
3127 | |
3128 if (wi::to_wide (low) + 1 != wi::to_wide (high)) | |
3129 break; | |
3130 } | |
3131 if (i == len) | |
3132 { | |
3133 /* Designate the label with the widest range to be the | |
3134 default label. */ | |
3135 tree label = CASE_LABEL (widest_label); | |
3136 default_case = build_case_label (NULL_TREE, NULL_TREE, | |
3137 label); | |
3138 } | |
3139 } | |
3140 } | |
3141 } | |
3142 | |
3143 if (default_casep) | |
3144 *default_casep = default_case; | |
3145 } | |
3146 | |
3147 /* Set the location of all statements in SEQ to LOC. */ | |
3148 | |
3149 void | |
3150 gimple_seq_set_location (gimple_seq seq, location_t loc) | |
3151 { | |
3152 for (gimple_stmt_iterator i = gsi_start (seq); !gsi_end_p (i); gsi_next (&i)) | |
3153 gimple_set_location (gsi_stmt (i), loc); | |
67
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3154 } |
f6334be47118
update gcc from gcc-4.6-20100522 to gcc-4.6-20110318
nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
parents:
63
diff
changeset
|
3155 |
111 | 3156 /* Release SSA_NAMEs in SEQ as well as the GIMPLE statements. */ |
3157 | |
3158 void | |
3159 gimple_seq_discard (gimple_seq seq) | |
3160 { | |
3161 gimple_stmt_iterator gsi; | |
3162 | |
3163 for (gsi = gsi_start (seq); !gsi_end_p (gsi); ) | |
3164 { | |
3165 gimple *stmt = gsi_stmt (gsi); | |
3166 gsi_remove (&gsi, true); | |
3167 release_defs (stmt); | |
3168 ggc_free (stmt); | |
3169 } | |
3170 } | |
3171 | |
3172 /* See if STMT now calls function that takes no parameters and if so, drop | |
3173 call arguments. This is used when devirtualization machinery redirects | |
3174 to __builtin_unreachable or __cxa_pure_virtual. */ | |
3175 | |
3176 void | |
3177 maybe_remove_unused_call_args (struct function *fn, gimple *stmt) | |
3178 { | |
3179 tree decl = gimple_call_fndecl (stmt); | |
3180 if (TYPE_ARG_TYPES (TREE_TYPE (decl)) | |
3181 && TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (decl))) == void_type_node | |
3182 && gimple_call_num_args (stmt)) | |
3183 { | |
3184 gimple_set_num_ops (stmt, 3); | |
3185 update_stmt_fn (fn, stmt); | |
3186 } | |
3187 } | |
3188 | |
3189 /* Return false if STMT will likely expand to real function call. */ | |
3190 | |
3191 bool | |
3192 gimple_inexpensive_call_p (gcall *stmt) | |
3193 { | |
3194 if (gimple_call_internal_p (stmt)) | |
3195 return true; | |
3196 tree decl = gimple_call_fndecl (stmt); | |
3197 if (decl && is_inexpensive_builtin (decl)) | |
3198 return true; | |
3199 return false; | |
3200 } | |
3201 | |
3202 #if CHECKING_P | |
3203 | |
3204 namespace selftest { | |
3205 | |
3206 /* Selftests for core gimple structures. */ | |
3207 | |
3208 /* Verify that STMT is pretty-printed as EXPECTED. | |
3209 Helper function for selftests. */ | |
3210 | |
3211 static void | |
3212 verify_gimple_pp (const char *expected, gimple *stmt) | |
3213 { | |
3214 pretty_printer pp; | |
131 | 3215 pp_gimple_stmt_1 (&pp, stmt, 0 /* spc */, TDF_NONE /* flags */); |
111 | 3216 ASSERT_STREQ (expected, pp_formatted_text (&pp)); |
3217 } | |
3218 | |
3219 /* Build a GIMPLE_ASSIGN equivalent to | |
3220 tmp = 5; | |
3221 and verify various properties of it. */ | |
3222 | |
3223 static void | |
3224 test_assign_single () | |
3225 { | |
3226 tree type = integer_type_node; | |
3227 tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL, | |
3228 get_identifier ("tmp"), | |
3229 type); | |
3230 tree rhs = build_int_cst (type, 5); | |
3231 gassign *stmt = gimple_build_assign (lhs, rhs); | |
3232 verify_gimple_pp ("tmp = 5;", stmt); | |
3233 | |
3234 ASSERT_TRUE (is_gimple_assign (stmt)); | |
3235 ASSERT_EQ (lhs, gimple_assign_lhs (stmt)); | |
3236 ASSERT_EQ (lhs, gimple_get_lhs (stmt)); | |
3237 ASSERT_EQ (rhs, gimple_assign_rhs1 (stmt)); | |
3238 ASSERT_EQ (NULL, gimple_assign_rhs2 (stmt)); | |
3239 ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt)); | |
3240 ASSERT_TRUE (gimple_assign_single_p (stmt)); | |
3241 ASSERT_EQ (INTEGER_CST, gimple_assign_rhs_code (stmt)); | |
3242 } | |
3243 | |
3244 /* Build a GIMPLE_ASSIGN equivalent to | |
3245 tmp = a * b; | |
3246 and verify various properties of it. */ | |
3247 | |
3248 static void | |
3249 test_assign_binop () | |
3250 { | |
3251 tree type = integer_type_node; | |
3252 tree lhs = build_decl (UNKNOWN_LOCATION, VAR_DECL, | |
3253 get_identifier ("tmp"), | |
3254 type); | |
3255 tree a = build_decl (UNKNOWN_LOCATION, VAR_DECL, | |
3256 get_identifier ("a"), | |
3257 type); | |
3258 tree b = build_decl (UNKNOWN_LOCATION, VAR_DECL, | |
3259 get_identifier ("b"), | |
3260 type); | |
3261 gassign *stmt = gimple_build_assign (lhs, MULT_EXPR, a, b); | |
3262 verify_gimple_pp ("tmp = a * b;", stmt); | |
3263 | |
3264 ASSERT_TRUE (is_gimple_assign (stmt)); | |
3265 ASSERT_EQ (lhs, gimple_assign_lhs (stmt)); | |
3266 ASSERT_EQ (lhs, gimple_get_lhs (stmt)); | |
3267 ASSERT_EQ (a, gimple_assign_rhs1 (stmt)); | |
3268 ASSERT_EQ (b, gimple_assign_rhs2 (stmt)); | |
3269 ASSERT_EQ (NULL, gimple_assign_rhs3 (stmt)); | |
3270 ASSERT_FALSE (gimple_assign_single_p (stmt)); | |
3271 ASSERT_EQ (MULT_EXPR, gimple_assign_rhs_code (stmt)); | |
3272 } | |
3273 | |
3274 /* Build a GIMPLE_NOP and verify various properties of it. */ | |
3275 | |
3276 static void | |
3277 test_nop_stmt () | |
3278 { | |
3279 gimple *stmt = gimple_build_nop (); | |
3280 verify_gimple_pp ("GIMPLE_NOP", stmt); | |
3281 ASSERT_EQ (GIMPLE_NOP, gimple_code (stmt)); | |
3282 ASSERT_EQ (NULL, gimple_get_lhs (stmt)); | |
3283 ASSERT_FALSE (gimple_assign_single_p (stmt)); | |
3284 } | |
3285 | |
3286 /* Build a GIMPLE_RETURN equivalent to | |
3287 return 7; | |
3288 and verify various properties of it. */ | |
3289 | |
3290 static void | |
3291 test_return_stmt () | |
3292 { | |
3293 tree type = integer_type_node; | |
3294 tree val = build_int_cst (type, 7); | |
3295 greturn *stmt = gimple_build_return (val); | |
3296 verify_gimple_pp ("return 7;", stmt); | |
3297 | |
3298 ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt)); | |
3299 ASSERT_EQ (NULL, gimple_get_lhs (stmt)); | |
3300 ASSERT_EQ (val, gimple_return_retval (stmt)); | |
3301 ASSERT_FALSE (gimple_assign_single_p (stmt)); | |
3302 } | |
3303 | |
3304 /* Build a GIMPLE_RETURN equivalent to | |
3305 return; | |
3306 and verify various properties of it. */ | |
3307 | |
3308 static void | |
3309 test_return_without_value () | |
3310 { | |
3311 greturn *stmt = gimple_build_return (NULL); | |
3312 verify_gimple_pp ("return;", stmt); | |
3313 | |
3314 ASSERT_EQ (GIMPLE_RETURN, gimple_code (stmt)); | |
3315 ASSERT_EQ (NULL, gimple_get_lhs (stmt)); | |
3316 ASSERT_EQ (NULL, gimple_return_retval (stmt)); | |
3317 ASSERT_FALSE (gimple_assign_single_p (stmt)); | |
3318 } | |
3319 | |
3320 /* Run all of the selftests within this file. */ | |
3321 | |
3322 void | |
3323 gimple_c_tests () | |
3324 { | |
3325 test_assign_single (); | |
3326 test_assign_binop (); | |
3327 test_nop_stmt (); | |
3328 test_return_stmt (); | |
3329 test_return_without_value (); | |
3330 } | |
3331 | |
3332 } // namespace selftest | |
3333 | |
3334 | |
3335 #endif /* CHECKING_P */ |