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