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