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