Mercurial > hg > CbC > CbC_gcc
annotate gcc/convert.c @ 139:ae07388db637
fix c-next.c segfault
author | anatofuz |
---|---|
date | Mon, 12 Nov 2018 17:01:46 +0900 |
parents | 84e7813d76e9 |
children | 1830386684a0 |
rev | line source |
---|---|
0 | 1 /* Utility routines for data type conversion for GCC. |
131 | 2 Copyright (C) 1987-2018 Free Software Foundation, Inc. |
0 | 3 |
4 This file is part of GCC. | |
5 | |
6 GCC is free software; you can redistribute it and/or modify it under | |
7 the terms of the GNU General Public License as published by the Free | |
8 Software Foundation; either version 3, or (at your option) any later | |
9 version. | |
10 | |
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
14 for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with GCC; see the file COPYING3. If not see | |
18 <http://www.gnu.org/licenses/>. */ | |
19 | |
20 | |
21 /* These routines are somewhat language-independent utility function | |
22 intended to be called by the language-specific convert () functions. */ | |
23 | |
24 #include "config.h" | |
25 #include "system.h" | |
26 #include "coretypes.h" | |
111 | 27 #include "target.h" |
0 | 28 #include "tree.h" |
111 | 29 #include "diagnostic-core.h" |
30 #include "fold-const.h" | |
31 #include "stor-layout.h" | |
0 | 32 #include "convert.h" |
33 #include "langhooks.h" | |
111 | 34 #include "builtins.h" |
35 #include "ubsan.h" | |
36 #include "stringpool.h" | |
37 #include "attribs.h" | |
38 #include "asan.h" | |
39 | |
40 #define maybe_fold_build1_loc(FOLD_P, LOC, CODE, TYPE, EXPR) \ | |
41 ((FOLD_P) ? fold_build1_loc (LOC, CODE, TYPE, EXPR) \ | |
42 : build1_loc (LOC, CODE, TYPE, EXPR)) | |
43 #define maybe_fold_build2_loc(FOLD_P, LOC, CODE, TYPE, EXPR1, EXPR2) \ | |
44 ((FOLD_P) ? fold_build2_loc (LOC, CODE, TYPE, EXPR1, EXPR2) \ | |
45 : build2_loc (LOC, CODE, TYPE, EXPR1, EXPR2)) | |
0 | 46 |
47 /* Convert EXPR to some pointer or reference type TYPE. | |
48 EXPR must be pointer, reference, integer, enumeral, or literal zero; | |
111 | 49 in other cases error is called. If FOLD_P is true, try to fold the |
50 expression. */ | |
0 | 51 |
111 | 52 static tree |
53 convert_to_pointer_1 (tree type, tree expr, bool fold_p) | |
0 | 54 { |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
55 location_t loc = EXPR_LOCATION (expr); |
0 | 56 if (TREE_TYPE (expr) == type) |
57 return expr; | |
58 | |
59 switch (TREE_CODE (TREE_TYPE (expr))) | |
60 { | |
61 case POINTER_TYPE: | |
62 case REFERENCE_TYPE: | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
63 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
64 /* If the pointers point to different address spaces, conversion needs |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
65 to be done via a ADDR_SPACE_CONVERT_EXPR instead of a NOP_EXPR. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
66 addr_space_t to_as = TYPE_ADDR_SPACE (TREE_TYPE (type)); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
67 addr_space_t from_as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (expr))); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
68 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
69 if (to_as == from_as) |
111 | 70 return maybe_fold_build1_loc (fold_p, loc, NOP_EXPR, type, expr); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
71 else |
111 | 72 return maybe_fold_build1_loc (fold_p, loc, ADDR_SPACE_CONVERT_EXPR, |
73 type, expr); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
74 } |
0 | 75 |
76 case INTEGER_TYPE: | |
77 case ENUMERAL_TYPE: | |
78 case BOOLEAN_TYPE: | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
79 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
80 /* If the input precision differs from the target pointer type |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
81 precision, first convert the input expression to an integer type of |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
82 the target precision. Some targets, e.g. VMS, need several pointer |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
83 sizes to coexist so the latter isn't necessarily POINTER_SIZE. */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
84 unsigned int pprec = TYPE_PRECISION (type); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
85 unsigned int eprec = TYPE_PRECISION (TREE_TYPE (expr)); |
0 | 86 |
111 | 87 if (eprec != pprec) |
88 expr | |
89 = maybe_fold_build1_loc (fold_p, loc, NOP_EXPR, | |
90 lang_hooks.types.type_for_size (pprec, 0), | |
91 expr); | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
92 } |
111 | 93 return maybe_fold_build1_loc (fold_p, loc, CONVERT_EXPR, type, expr); |
0 | 94 |
95 default: | |
96 error ("cannot convert to a pointer type"); | |
111 | 97 return convert_to_pointer_1 (type, integer_zero_node, fold_p); |
0 | 98 } |
99 } | |
100 | |
111 | 101 /* A wrapper around convert_to_pointer_1 that always folds the |
102 expression. */ | |
0 | 103 |
111 | 104 tree |
105 convert_to_pointer (tree type, tree expr) | |
106 { | |
107 return convert_to_pointer_1 (type, expr, true); | |
0 | 108 } |
109 | |
111 | 110 /* A wrapper around convert_to_pointer_1 that only folds the |
111 expression if DOFOLD, or if it is CONSTANT_CLASS_P. */ | |
112 | |
113 tree | |
114 convert_to_pointer_maybe_fold (tree type, tree expr, bool dofold) | |
115 { | |
116 return convert_to_pointer_1 (type, expr, dofold || CONSTANT_CLASS_P (expr)); | |
117 } | |
0 | 118 |
119 /* Convert EXPR to some floating-point type TYPE. | |
120 | |
121 EXPR must be float, fixed-point, integer, or enumeral; | |
111 | 122 in other cases error is called. If FOLD_P is true, try to fold |
123 the expression. */ | |
0 | 124 |
111 | 125 static tree |
126 convert_to_real_1 (tree type, tree expr, bool fold_p) | |
0 | 127 { |
128 enum built_in_function fcode = builtin_mathfn_code (expr); | |
129 tree itype = TREE_TYPE (expr); | |
111 | 130 location_t loc = EXPR_LOCATION (expr); |
131 | |
132 if (TREE_CODE (expr) == COMPOUND_EXPR) | |
133 { | |
134 tree t = convert_to_real_1 (type, TREE_OPERAND (expr, 1), fold_p); | |
135 if (t == TREE_OPERAND (expr, 1)) | |
136 return expr; | |
137 return build2_loc (EXPR_LOCATION (expr), COMPOUND_EXPR, TREE_TYPE (t), | |
138 TREE_OPERAND (expr, 0), t); | |
139 } | |
0 | 140 |
141 /* Disable until we figure out how to decide whether the functions are | |
142 present in runtime. */ | |
143 /* Convert (float)sqrt((double)x) where x is float into sqrtf(x) */ | |
144 if (optimize | |
145 && (TYPE_MODE (type) == TYPE_MODE (double_type_node) | |
146 || TYPE_MODE (type) == TYPE_MODE (float_type_node))) | |
147 { | |
148 switch (fcode) | |
149 { | |
150 #define CASE_MATHFN(FN) case BUILT_IN_##FN: case BUILT_IN_##FN##L: | |
151 CASE_MATHFN (COSH) | |
152 CASE_MATHFN (EXP) | |
153 CASE_MATHFN (EXP10) | |
154 CASE_MATHFN (EXP2) | |
155 CASE_MATHFN (EXPM1) | |
156 CASE_MATHFN (GAMMA) | |
157 CASE_MATHFN (J0) | |
158 CASE_MATHFN (J1) | |
159 CASE_MATHFN (LGAMMA) | |
160 CASE_MATHFN (POW10) | |
161 CASE_MATHFN (SINH) | |
162 CASE_MATHFN (TGAMMA) | |
163 CASE_MATHFN (Y0) | |
164 CASE_MATHFN (Y1) | |
165 /* The above functions may set errno differently with float | |
166 input or output so this transformation is not safe with | |
167 -fmath-errno. */ | |
168 if (flag_errno_math) | |
169 break; | |
111 | 170 gcc_fallthrough (); |
0 | 171 CASE_MATHFN (ACOS) |
172 CASE_MATHFN (ACOSH) | |
173 CASE_MATHFN (ASIN) | |
174 CASE_MATHFN (ASINH) | |
175 CASE_MATHFN (ATAN) | |
176 CASE_MATHFN (ATANH) | |
177 CASE_MATHFN (CBRT) | |
178 CASE_MATHFN (COS) | |
179 CASE_MATHFN (ERF) | |
180 CASE_MATHFN (ERFC) | |
181 CASE_MATHFN (LOG) | |
182 CASE_MATHFN (LOG10) | |
183 CASE_MATHFN (LOG2) | |
184 CASE_MATHFN (LOG1P) | |
185 CASE_MATHFN (SIN) | |
186 CASE_MATHFN (TAN) | |
187 CASE_MATHFN (TANH) | |
111 | 188 /* The above functions are not safe to do this conversion. */ |
189 if (!flag_unsafe_math_optimizations) | |
190 break; | |
191 gcc_fallthrough (); | |
192 CASE_MATHFN (SQRT) | |
193 CASE_MATHFN (FABS) | |
194 CASE_MATHFN (LOGB) | |
0 | 195 #undef CASE_MATHFN |
196 { | |
197 tree arg0 = strip_float_extensions (CALL_EXPR_ARG (expr, 0)); | |
198 tree newtype = type; | |
199 | |
200 /* We have (outertype)sqrt((innertype)x). Choose the wider mode from | |
201 the both as the safe type for operation. */ | |
202 if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (type)) | |
203 newtype = TREE_TYPE (arg0); | |
204 | |
111 | 205 /* We consider to convert |
206 | |
207 (T1) sqrtT2 ((T2) exprT3) | |
208 to | |
209 (T1) sqrtT4 ((T4) exprT3) | |
210 | |
211 , where T1 is TYPE, T2 is ITYPE, T3 is TREE_TYPE (ARG0), | |
212 and T4 is NEWTYPE. All those types are of floating point types. | |
213 T4 (NEWTYPE) should be narrower than T2 (ITYPE). This conversion | |
214 is safe only if P1 >= P2*2+2, where P1 and P2 are precisions of | |
215 T2 and T4. See the following URL for a reference: | |
216 http://stackoverflow.com/questions/9235456/determining- | |
217 floating-point-square-root | |
218 */ | |
219 if ((fcode == BUILT_IN_SQRT || fcode == BUILT_IN_SQRTL) | |
220 && !flag_unsafe_math_optimizations) | |
221 { | |
222 /* The following conversion is unsafe even the precision condition | |
223 below is satisfied: | |
224 | |
225 (float) sqrtl ((long double) double_val) -> (float) sqrt (double_val) | |
226 */ | |
227 if (TYPE_MODE (type) != TYPE_MODE (newtype)) | |
228 break; | |
229 | |
230 int p1 = REAL_MODE_FORMAT (TYPE_MODE (itype))->p; | |
231 int p2 = REAL_MODE_FORMAT (TYPE_MODE (newtype))->p; | |
232 if (p1 < p2 * 2 + 2) | |
233 break; | |
234 } | |
235 | |
0 | 236 /* Be careful about integer to fp conversions. |
237 These may overflow still. */ | |
238 if (FLOAT_TYPE_P (TREE_TYPE (arg0)) | |
239 && TYPE_PRECISION (newtype) < TYPE_PRECISION (itype) | |
240 && (TYPE_MODE (newtype) == TYPE_MODE (double_type_node) | |
241 || TYPE_MODE (newtype) == TYPE_MODE (float_type_node))) | |
111 | 242 { |
0 | 243 tree fn = mathfn_built_in (newtype, fcode); |
244 if (fn) | |
111 | 245 { |
246 tree arg = convert_to_real_1 (newtype, arg0, fold_p); | |
247 expr = build_call_expr (fn, 1, arg); | |
248 if (newtype == type) | |
249 return expr; | |
250 } | |
0 | 251 } |
252 } | |
253 default: | |
254 break; | |
255 } | |
256 } | |
257 | |
258 /* Propagate the cast into the operation. */ | |
259 if (itype != type && FLOAT_TYPE_P (type)) | |
260 switch (TREE_CODE (expr)) | |
261 { | |
262 /* Convert (float)-x into -(float)x. This is safe for | |
111 | 263 round-to-nearest rounding mode when the inner type is float. */ |
0 | 264 case ABS_EXPR: |
265 case NEGATE_EXPR: | |
266 if (!flag_rounding_math | |
111 | 267 && FLOAT_TYPE_P (itype) |
268 && TYPE_PRECISION (type) < TYPE_PRECISION (itype)) | |
269 { | |
270 tree arg = convert_to_real_1 (type, TREE_OPERAND (expr, 0), | |
271 fold_p); | |
272 return build1 (TREE_CODE (expr), type, arg); | |
273 } | |
0 | 274 break; |
275 /* Convert (outertype)((innertype0)a+(innertype1)b) | |
276 into ((newtype)a+(newtype)b) where newtype | |
277 is the widest mode from all of these. */ | |
278 case PLUS_EXPR: | |
279 case MINUS_EXPR: | |
280 case MULT_EXPR: | |
281 case RDIV_EXPR: | |
282 { | |
283 tree arg0 = strip_float_extensions (TREE_OPERAND (expr, 0)); | |
284 tree arg1 = strip_float_extensions (TREE_OPERAND (expr, 1)); | |
285 | |
286 if (FLOAT_TYPE_P (TREE_TYPE (arg0)) | |
287 && FLOAT_TYPE_P (TREE_TYPE (arg1)) | |
288 && DECIMAL_FLOAT_TYPE_P (itype) == DECIMAL_FLOAT_TYPE_P (type)) | |
289 { | |
290 tree newtype = type; | |
291 | |
292 if (TYPE_MODE (TREE_TYPE (arg0)) == SDmode | |
293 || TYPE_MODE (TREE_TYPE (arg1)) == SDmode | |
294 || TYPE_MODE (type) == SDmode) | |
295 newtype = dfloat32_type_node; | |
296 if (TYPE_MODE (TREE_TYPE (arg0)) == DDmode | |
297 || TYPE_MODE (TREE_TYPE (arg1)) == DDmode | |
298 || TYPE_MODE (type) == DDmode) | |
299 newtype = dfloat64_type_node; | |
300 if (TYPE_MODE (TREE_TYPE (arg0)) == TDmode | |
301 || TYPE_MODE (TREE_TYPE (arg1)) == TDmode | |
302 || TYPE_MODE (type) == TDmode) | |
303 newtype = dfloat128_type_node; | |
304 if (newtype == dfloat32_type_node | |
305 || newtype == dfloat64_type_node | |
306 || newtype == dfloat128_type_node) | |
307 { | |
308 expr = build2 (TREE_CODE (expr), newtype, | |
111 | 309 convert_to_real_1 (newtype, arg0, |
310 fold_p), | |
311 convert_to_real_1 (newtype, arg1, | |
312 fold_p)); | |
0 | 313 if (newtype == type) |
314 return expr; | |
315 break; | |
316 } | |
317 | |
318 if (TYPE_PRECISION (TREE_TYPE (arg0)) > TYPE_PRECISION (newtype)) | |
319 newtype = TREE_TYPE (arg0); | |
320 if (TYPE_PRECISION (TREE_TYPE (arg1)) > TYPE_PRECISION (newtype)) | |
321 newtype = TREE_TYPE (arg1); | |
322 /* Sometimes this transformation is safe (cannot | |
323 change results through affecting double rounding | |
324 cases) and sometimes it is not. If NEWTYPE is | |
325 wider than TYPE, e.g. (float)((long double)double | |
326 + (long double)double) converted to | |
327 (float)(double + double), the transformation is | |
328 unsafe regardless of the details of the types | |
329 involved; double rounding can arise if the result | |
330 of NEWTYPE arithmetic is a NEWTYPE value half way | |
331 between two representable TYPE values but the | |
332 exact value is sufficiently different (in the | |
333 right direction) for this difference to be | |
334 visible in ITYPE arithmetic. If NEWTYPE is the | |
335 same as TYPE, however, the transformation may be | |
336 safe depending on the types involved: it is safe | |
337 if the ITYPE has strictly more than twice as many | |
338 mantissa bits as TYPE, can represent infinities | |
339 and NaNs if the TYPE can, and has sufficient | |
340 exponent range for the product or ratio of two | |
341 values representable in the TYPE to be within the | |
342 range of normal values of ITYPE. */ | |
343 if (TYPE_PRECISION (newtype) < TYPE_PRECISION (itype) | |
344 && (flag_unsafe_math_optimizations | |
345 || (TYPE_PRECISION (newtype) == TYPE_PRECISION (type) | |
346 && real_can_shorten_arithmetic (TYPE_MODE (itype), | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
347 TYPE_MODE (type)) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
348 && !excess_precision_type (newtype)))) |
0 | 349 { |
350 expr = build2 (TREE_CODE (expr), newtype, | |
111 | 351 convert_to_real_1 (newtype, arg0, |
352 fold_p), | |
353 convert_to_real_1 (newtype, arg1, | |
354 fold_p)); | |
0 | 355 if (newtype == type) |
356 return expr; | |
357 } | |
358 } | |
359 } | |
360 break; | |
361 default: | |
362 break; | |
363 } | |
364 | |
365 switch (TREE_CODE (TREE_TYPE (expr))) | |
366 { | |
367 case REAL_TYPE: | |
368 /* Ignore the conversion if we don't need to store intermediate | |
369 results and neither type is a decimal float. */ | |
111 | 370 return build1_loc (loc, |
371 (flag_float_store | |
372 || DECIMAL_FLOAT_TYPE_P (type) | |
373 || DECIMAL_FLOAT_TYPE_P (itype)) | |
374 ? CONVERT_EXPR : NOP_EXPR, type, expr); | |
0 | 375 |
376 case INTEGER_TYPE: | |
377 case ENUMERAL_TYPE: | |
378 case BOOLEAN_TYPE: | |
379 return build1 (FLOAT_EXPR, type, expr); | |
380 | |
381 case FIXED_POINT_TYPE: | |
382 return build1 (FIXED_CONVERT_EXPR, type, expr); | |
383 | |
384 case COMPLEX_TYPE: | |
385 return convert (type, | |
111 | 386 maybe_fold_build1_loc (fold_p, loc, REALPART_EXPR, |
387 TREE_TYPE (TREE_TYPE (expr)), | |
388 expr)); | |
0 | 389 |
390 case POINTER_TYPE: | |
391 case REFERENCE_TYPE: | |
392 error ("pointer value used where a floating point value was expected"); | |
111 | 393 return convert_to_real_1 (type, integer_zero_node, fold_p); |
0 | 394 |
395 default: | |
396 error ("aggregate value used where a float was expected"); | |
111 | 397 return convert_to_real_1 (type, integer_zero_node, fold_p); |
0 | 398 } |
399 } | |
400 | |
111 | 401 /* A wrapper around convert_to_real_1 that always folds the |
402 expression. */ | |
403 | |
404 tree | |
405 convert_to_real (tree type, tree expr) | |
406 { | |
407 return convert_to_real_1 (type, expr, true); | |
408 } | |
409 | |
410 /* A wrapper around convert_to_real_1 that only folds the | |
411 expression if DOFOLD, or if it is CONSTANT_CLASS_P. */ | |
412 | |
413 tree | |
414 convert_to_real_maybe_fold (tree type, tree expr, bool dofold) | |
415 { | |
416 return convert_to_real_1 (type, expr, dofold || CONSTANT_CLASS_P (expr)); | |
417 } | |
418 | |
419 /* Try to narrow EX_FORM ARG0 ARG1 in narrowed arg types producing a | |
420 result in TYPE. */ | |
421 | |
422 static tree | |
423 do_narrow (location_t loc, | |
424 enum tree_code ex_form, tree type, tree arg0, tree arg1, | |
425 tree expr, unsigned inprec, unsigned outprec, bool dofold) | |
426 { | |
427 /* Do the arithmetic in type TYPEX, | |
428 then convert result to TYPE. */ | |
429 tree typex = type; | |
430 | |
431 /* Can't do arithmetic in enumeral types | |
432 so use an integer type that will hold the values. */ | |
433 if (TREE_CODE (typex) == ENUMERAL_TYPE) | |
434 typex = lang_hooks.types.type_for_size (TYPE_PRECISION (typex), | |
435 TYPE_UNSIGNED (typex)); | |
436 | |
437 /* The type demotion below might cause doing unsigned arithmetic | |
438 instead of signed, and thus hide overflow bugs. */ | |
439 if ((ex_form == PLUS_EXPR || ex_form == MINUS_EXPR) | |
440 && !TYPE_UNSIGNED (typex) | |
441 && sanitize_flags_p (SANITIZE_SI_OVERFLOW)) | |
442 return NULL_TREE; | |
443 | |
444 /* But now perhaps TYPEX is as wide as INPREC. | |
445 In that case, do nothing special here. | |
446 (Otherwise would recurse infinitely in convert. */ | |
447 if (TYPE_PRECISION (typex) != inprec) | |
448 { | |
449 /* Don't do unsigned arithmetic where signed was wanted, | |
450 or vice versa. | |
451 Exception: if both of the original operands were | |
452 unsigned then we can safely do the work as unsigned. | |
453 Exception: shift operations take their type solely | |
454 from the first argument. | |
455 Exception: the LSHIFT_EXPR case above requires that | |
456 we perform this operation unsigned lest we produce | |
457 signed-overflow undefinedness. | |
458 And we may need to do it as unsigned | |
459 if we truncate to the original size. */ | |
460 if (TYPE_UNSIGNED (TREE_TYPE (expr)) | |
461 || (TYPE_UNSIGNED (TREE_TYPE (arg0)) | |
462 && (TYPE_UNSIGNED (TREE_TYPE (arg1)) | |
463 || ex_form == LSHIFT_EXPR | |
464 || ex_form == RSHIFT_EXPR | |
465 || ex_form == LROTATE_EXPR | |
466 || ex_form == RROTATE_EXPR)) | |
467 || ex_form == LSHIFT_EXPR | |
468 /* If we have !flag_wrapv, and either ARG0 or | |
469 ARG1 is of a signed type, we have to do | |
470 PLUS_EXPR, MINUS_EXPR or MULT_EXPR in an unsigned | |
471 type in case the operation in outprec precision | |
472 could overflow. Otherwise, we would introduce | |
473 signed-overflow undefinedness. */ | |
131 | 474 || ((!(INTEGRAL_TYPE_P (TREE_TYPE (arg0)) |
475 && TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0))) | |
476 || !(INTEGRAL_TYPE_P (TREE_TYPE (arg1)) | |
477 && TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg1)))) | |
111 | 478 && ((TYPE_PRECISION (TREE_TYPE (arg0)) * 2u |
479 > outprec) | |
480 || (TYPE_PRECISION (TREE_TYPE (arg1)) * 2u | |
481 > outprec)) | |
482 && (ex_form == PLUS_EXPR | |
483 || ex_form == MINUS_EXPR | |
484 || ex_form == MULT_EXPR))) | |
485 { | |
486 if (!TYPE_UNSIGNED (typex)) | |
487 typex = unsigned_type_for (typex); | |
488 } | |
489 else | |
490 { | |
491 if (TYPE_UNSIGNED (typex)) | |
492 typex = signed_type_for (typex); | |
493 } | |
494 /* We should do away with all this once we have a proper | |
495 type promotion/demotion pass, see PR45397. */ | |
496 expr = maybe_fold_build2_loc (dofold, loc, ex_form, typex, | |
497 convert (typex, arg0), | |
498 convert (typex, arg1)); | |
499 return convert (type, expr); | |
500 } | |
501 | |
502 return NULL_TREE; | |
503 } | |
504 | |
0 | 505 /* Convert EXPR to some integer (or enum) type TYPE. |
506 | |
507 EXPR must be pointer, integer, discrete (enum, char, or bool), float, | |
508 fixed-point or vector; in other cases error is called. | |
509 | |
111 | 510 If DOFOLD is TRUE, we try to simplify newly-created patterns by folding. |
511 | |
0 | 512 The result of this is always supposed to be a newly created tree node |
513 not in use in any existing structure. */ | |
514 | |
111 | 515 static tree |
516 convert_to_integer_1 (tree type, tree expr, bool dofold) | |
0 | 517 { |
518 enum tree_code ex_form = TREE_CODE (expr); | |
519 tree intype = TREE_TYPE (expr); | |
111 | 520 unsigned int inprec = element_precision (intype); |
521 unsigned int outprec = element_precision (type); | |
522 location_t loc = EXPR_LOCATION (expr); | |
0 | 523 |
524 /* An INTEGER_TYPE cannot be incomplete, but an ENUMERAL_TYPE can | |
525 be. Consider `enum E = { a, b = (enum E) 3 };'. */ | |
526 if (!COMPLETE_TYPE_P (type)) | |
527 { | |
528 error ("conversion to incomplete type"); | |
529 return error_mark_node; | |
530 } | |
531 | |
111 | 532 if (ex_form == COMPOUND_EXPR) |
533 { | |
534 tree t = convert_to_integer_1 (type, TREE_OPERAND (expr, 1), dofold); | |
535 if (t == TREE_OPERAND (expr, 1)) | |
536 return expr; | |
537 return build2_loc (EXPR_LOCATION (expr), COMPOUND_EXPR, TREE_TYPE (t), | |
538 TREE_OPERAND (expr, 0), t); | |
539 } | |
540 | |
0 | 541 /* Convert e.g. (long)round(d) -> lround(d). */ |
542 /* If we're converting to char, we may encounter differing behavior | |
543 between converting from double->char vs double->long->char. | |
544 We're in "undefined" territory but we prefer to be conservative, | |
545 so only proceed in "unsafe" math mode. */ | |
546 if (optimize | |
547 && (flag_unsafe_math_optimizations | |
548 || (long_integer_type_node | |
549 && outprec >= TYPE_PRECISION (long_integer_type_node)))) | |
550 { | |
551 tree s_expr = strip_float_extensions (expr); | |
552 tree s_intype = TREE_TYPE (s_expr); | |
553 const enum built_in_function fcode = builtin_mathfn_code (s_expr); | |
554 tree fn = 0; | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
555 |
0 | 556 switch (fcode) |
557 { | |
558 CASE_FLT_FN (BUILT_IN_CEIL): | |
131 | 559 CASE_FLT_FN_FLOATN_NX (BUILT_IN_CEIL): |
0 | 560 /* Only convert in ISO C99 mode. */ |
111 | 561 if (!targetm.libc_has_function (function_c99_misc)) |
0 | 562 break; |
111 | 563 if (outprec < TYPE_PRECISION (integer_type_node) |
564 || (outprec == TYPE_PRECISION (integer_type_node) | |
0 | 565 && !TYPE_UNSIGNED (type))) |
111 | 566 fn = mathfn_built_in (s_intype, BUILT_IN_ICEIL); |
567 else if (outprec == TYPE_PRECISION (long_integer_type_node) | |
568 && !TYPE_UNSIGNED (type)) | |
0 | 569 fn = mathfn_built_in (s_intype, BUILT_IN_LCEIL); |
570 else if (outprec == TYPE_PRECISION (long_long_integer_type_node) | |
571 && !TYPE_UNSIGNED (type)) | |
572 fn = mathfn_built_in (s_intype, BUILT_IN_LLCEIL); | |
573 break; | |
574 | |
575 CASE_FLT_FN (BUILT_IN_FLOOR): | |
131 | 576 CASE_FLT_FN_FLOATN_NX (BUILT_IN_FLOOR): |
0 | 577 /* Only convert in ISO C99 mode. */ |
111 | 578 if (!targetm.libc_has_function (function_c99_misc)) |
0 | 579 break; |
111 | 580 if (outprec < TYPE_PRECISION (integer_type_node) |
581 || (outprec == TYPE_PRECISION (integer_type_node) | |
0 | 582 && !TYPE_UNSIGNED (type))) |
111 | 583 fn = mathfn_built_in (s_intype, BUILT_IN_IFLOOR); |
584 else if (outprec == TYPE_PRECISION (long_integer_type_node) | |
585 && !TYPE_UNSIGNED (type)) | |
0 | 586 fn = mathfn_built_in (s_intype, BUILT_IN_LFLOOR); |
587 else if (outprec == TYPE_PRECISION (long_long_integer_type_node) | |
588 && !TYPE_UNSIGNED (type)) | |
589 fn = mathfn_built_in (s_intype, BUILT_IN_LLFLOOR); | |
590 break; | |
591 | |
592 CASE_FLT_FN (BUILT_IN_ROUND): | |
131 | 593 CASE_FLT_FN_FLOATN_NX (BUILT_IN_ROUND): |
111 | 594 /* Only convert in ISO C99 mode and with -fno-math-errno. */ |
595 if (!targetm.libc_has_function (function_c99_misc) || flag_errno_math) | |
596 break; | |
597 if (outprec < TYPE_PRECISION (integer_type_node) | |
598 || (outprec == TYPE_PRECISION (integer_type_node) | |
0 | 599 && !TYPE_UNSIGNED (type))) |
111 | 600 fn = mathfn_built_in (s_intype, BUILT_IN_IROUND); |
601 else if (outprec == TYPE_PRECISION (long_integer_type_node) | |
602 && !TYPE_UNSIGNED (type)) | |
0 | 603 fn = mathfn_built_in (s_intype, BUILT_IN_LROUND); |
604 else if (outprec == TYPE_PRECISION (long_long_integer_type_node) | |
605 && !TYPE_UNSIGNED (type)) | |
606 fn = mathfn_built_in (s_intype, BUILT_IN_LLROUND); | |
607 break; | |
608 | |
609 CASE_FLT_FN (BUILT_IN_NEARBYINT): | |
131 | 610 CASE_FLT_FN_FLOATN_NX (BUILT_IN_NEARBYINT): |
0 | 611 /* Only convert nearbyint* if we can ignore math exceptions. */ |
612 if (flag_trapping_math) | |
613 break; | |
111 | 614 gcc_fallthrough (); |
0 | 615 CASE_FLT_FN (BUILT_IN_RINT): |
131 | 616 CASE_FLT_FN_FLOATN_NX (BUILT_IN_RINT): |
111 | 617 /* Only convert in ISO C99 mode and with -fno-math-errno. */ |
618 if (!targetm.libc_has_function (function_c99_misc) || flag_errno_math) | |
619 break; | |
620 if (outprec < TYPE_PRECISION (integer_type_node) | |
621 || (outprec == TYPE_PRECISION (integer_type_node) | |
0 | 622 && !TYPE_UNSIGNED (type))) |
111 | 623 fn = mathfn_built_in (s_intype, BUILT_IN_IRINT); |
624 else if (outprec == TYPE_PRECISION (long_integer_type_node) | |
625 && !TYPE_UNSIGNED (type)) | |
0 | 626 fn = mathfn_built_in (s_intype, BUILT_IN_LRINT); |
627 else if (outprec == TYPE_PRECISION (long_long_integer_type_node) | |
628 && !TYPE_UNSIGNED (type)) | |
629 fn = mathfn_built_in (s_intype, BUILT_IN_LLRINT); | |
630 break; | |
631 | |
632 CASE_FLT_FN (BUILT_IN_TRUNC): | |
131 | 633 CASE_FLT_FN_FLOATN_NX (BUILT_IN_TRUNC): |
111 | 634 return convert_to_integer_1 (type, CALL_EXPR_ARG (s_expr, 0), dofold); |
0 | 635 |
636 default: | |
637 break; | |
638 } | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
639 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
640 if (fn) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
641 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
642 tree newexpr = build_call_expr (fn, 1, CALL_EXPR_ARG (s_expr, 0)); |
111 | 643 return convert_to_integer_1 (type, newexpr, dofold); |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
644 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
645 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
646 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
647 /* Convert (int)logb(d) -> ilogb(d). */ |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
648 if (optimize |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
649 && flag_unsafe_math_optimizations |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
650 && !flag_trapping_math && !flag_errno_math && flag_finite_math_only |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
651 && integer_type_node |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
652 && (outprec > TYPE_PRECISION (integer_type_node) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
653 || (outprec == TYPE_PRECISION (integer_type_node) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
654 && !TYPE_UNSIGNED (type)))) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
655 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
656 tree s_expr = strip_float_extensions (expr); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
657 tree s_intype = TREE_TYPE (s_expr); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
658 const enum built_in_function fcode = builtin_mathfn_code (s_expr); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
659 tree fn = 0; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
660 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
661 switch (fcode) |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
662 { |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
663 CASE_FLT_FN (BUILT_IN_LOGB): |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
664 fn = mathfn_built_in (s_intype, BUILT_IN_ILOGB); |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
665 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
666 |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
667 default: |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
668 break; |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
669 } |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
670 |
0 | 671 if (fn) |
672 { | |
673 tree newexpr = build_call_expr (fn, 1, CALL_EXPR_ARG (s_expr, 0)); | |
111 | 674 return convert_to_integer_1 (type, newexpr, dofold); |
0 | 675 } |
676 } | |
677 | |
678 switch (TREE_CODE (intype)) | |
679 { | |
680 case POINTER_TYPE: | |
681 case REFERENCE_TYPE: | |
131 | 682 if (integer_zerop (expr) && !TREE_OVERFLOW (expr)) |
0 | 683 return build_int_cst (type, 0); |
684 | |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
685 /* Convert to an unsigned integer of the correct width first, and from |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
686 there widen/truncate to the required type. Some targets support the |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
687 coexistence of multiple valid pointer sizes, so fetch the one we need |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
688 from the type. */ |
111 | 689 if (!dofold) |
690 return build1 (CONVERT_EXPR, type, expr); | |
0 | 691 expr = fold_build1 (CONVERT_EXPR, |
55
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
692 lang_hooks.types.type_for_size |
77e2b8dfacca
update it from 4.4.3 to 4.5.0
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
19
diff
changeset
|
693 (TYPE_PRECISION (intype), 0), |
0 | 694 expr); |
695 return fold_convert (type, expr); | |
696 | |
697 case INTEGER_TYPE: | |
698 case ENUMERAL_TYPE: | |
699 case BOOLEAN_TYPE: | |
700 case OFFSET_TYPE: | |
701 /* If this is a logical operation, which just returns 0 or 1, we can | |
702 change the type of the expression. */ | |
703 | |
704 if (TREE_CODE_CLASS (ex_form) == tcc_comparison) | |
705 { | |
706 expr = copy_node (expr); | |
707 TREE_TYPE (expr) = type; | |
708 return expr; | |
709 } | |
710 | |
711 /* If we are widening the type, put in an explicit conversion. | |
712 Similarly if we are not changing the width. After this, we know | |
713 we are truncating EXPR. */ | |
714 | |
715 else if (outprec >= inprec) | |
716 { | |
717 enum tree_code code; | |
718 | |
719 /* If the precision of the EXPR's type is K bits and the | |
720 destination mode has more bits, and the sign is changing, | |
721 it is not safe to use a NOP_EXPR. For example, suppose | |
722 that EXPR's type is a 3-bit unsigned integer type, the | |
723 TYPE is a 3-bit signed integer type, and the machine mode | |
724 for the types is 8-bit QImode. In that case, the | |
725 conversion necessitates an explicit sign-extension. In | |
726 the signed-to-unsigned case the high-order bits have to | |
727 be cleared. */ | |
728 if (TYPE_UNSIGNED (type) != TYPE_UNSIGNED (TREE_TYPE (expr)) | |
111 | 729 && !type_has_mode_precision_p (TREE_TYPE (expr))) |
0 | 730 code = CONVERT_EXPR; |
731 else | |
732 code = NOP_EXPR; | |
733 | |
111 | 734 return maybe_fold_build1_loc (dofold, loc, code, type, expr); |
0 | 735 } |
736 | |
737 /* If TYPE is an enumeral type or a type with a precision less | |
738 than the number of bits in its mode, do the conversion to the | |
739 type corresponding to its mode, then do a nop conversion | |
740 to TYPE. */ | |
741 else if (TREE_CODE (type) == ENUMERAL_TYPE | |
131 | 742 || maybe_ne (outprec, GET_MODE_PRECISION (TYPE_MODE (type)))) |
111 | 743 { |
131 | 744 expr |
745 = convert_to_integer_1 (lang_hooks.types.type_for_mode | |
746 (TYPE_MODE (type), TYPE_UNSIGNED (type)), | |
747 expr, dofold); | |
111 | 748 return maybe_fold_build1_loc (dofold, loc, NOP_EXPR, type, expr); |
749 } | |
0 | 750 |
751 /* Here detect when we can distribute the truncation down past some | |
752 arithmetic. For example, if adding two longs and converting to an | |
753 int, we can equally well convert both to ints and then add. | |
754 For the operations handled here, such truncation distribution | |
755 is always safe. | |
756 It is desirable in these cases: | |
757 1) when truncating down to full-word from a larger size | |
758 2) when truncating takes no work. | |
759 3) when at least one operand of the arithmetic has been extended | |
760 (as by C's default conversions). In this case we need two conversions | |
761 if we do the arithmetic as already requested, so we might as well | |
762 truncate both and then combine. Perhaps that way we need only one. | |
763 | |
764 Note that in general we cannot do the arithmetic in a type | |
765 shorter than the desired result of conversion, even if the operands | |
766 are both extended from a shorter type, because they might overflow | |
767 if combined in that type. The exceptions to this--the times when | |
768 two narrow values can be combined in their narrow type even to | |
769 make a wider result--are handled by "shorten" in build_binary_op. */ | |
770 | |
111 | 771 if (dofold) |
772 switch (ex_form) | |
773 { | |
774 case RSHIFT_EXPR: | |
775 /* We can pass truncation down through right shifting | |
776 when the shift count is a nonpositive constant. */ | |
777 if (TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST | |
778 && tree_int_cst_sgn (TREE_OPERAND (expr, 1)) <= 0) | |
779 goto trunc1; | |
780 break; | |
0 | 781 |
111 | 782 case LSHIFT_EXPR: |
783 /* We can pass truncation down through left shifting | |
784 when the shift count is a nonnegative constant and | |
785 the target type is unsigned. */ | |
786 if (TREE_CODE (TREE_OPERAND (expr, 1)) == INTEGER_CST | |
787 && tree_int_cst_sgn (TREE_OPERAND (expr, 1)) >= 0 | |
788 && TYPE_UNSIGNED (type) | |
789 && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST) | |
790 { | |
791 /* If shift count is less than the width of the truncated type, | |
792 really shift. */ | |
793 if (tree_int_cst_lt (TREE_OPERAND (expr, 1), TYPE_SIZE (type))) | |
794 /* In this case, shifting is like multiplication. */ | |
795 goto trunc1; | |
796 else | |
797 { | |
798 /* If it is >= that width, result is zero. | |
799 Handling this with trunc1 would give the wrong result: | |
800 (int) ((long long) a << 32) is well defined (as 0) | |
801 but (int) a << 32 is undefined and would get a | |
802 warning. */ | |
803 | |
804 tree t = build_int_cst (type, 0); | |
805 | |
806 /* If the original expression had side-effects, we must | |
807 preserve it. */ | |
808 if (TREE_SIDE_EFFECTS (expr)) | |
809 return build2 (COMPOUND_EXPR, type, expr, t); | |
810 else | |
811 return t; | |
812 } | |
813 } | |
814 break; | |
815 | |
816 case TRUNC_DIV_EXPR: | |
0 | 817 { |
111 | 818 tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), NULL_TREE); |
819 tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), NULL_TREE); | |
820 | |
821 /* Don't distribute unless the output precision is at least as | |
822 big as the actual inputs and it has the same signedness. */ | |
823 if (outprec >= TYPE_PRECISION (TREE_TYPE (arg0)) | |
824 && outprec >= TYPE_PRECISION (TREE_TYPE (arg1)) | |
825 /* If signedness of arg0 and arg1 don't match, | |
826 we can't necessarily find a type to compare them in. */ | |
827 && (TYPE_UNSIGNED (TREE_TYPE (arg0)) | |
828 == TYPE_UNSIGNED (TREE_TYPE (arg1))) | |
829 /* Do not change the sign of the division. */ | |
830 && (TYPE_UNSIGNED (TREE_TYPE (expr)) | |
831 == TYPE_UNSIGNED (TREE_TYPE (arg0))) | |
832 /* Either require unsigned division or a division by | |
833 a constant that is not -1. */ | |
834 && (TYPE_UNSIGNED (TREE_TYPE (arg0)) | |
835 || (TREE_CODE (arg1) == INTEGER_CST | |
836 && !integer_all_onesp (arg1)))) | |
0 | 837 { |
111 | 838 tree tem = do_narrow (loc, ex_form, type, arg0, arg1, |
839 expr, inprec, outprec, dofold); | |
840 if (tem) | |
841 return tem; | |
842 } | |
843 break; | |
844 } | |
845 | |
846 case MAX_EXPR: | |
847 case MIN_EXPR: | |
848 case MULT_EXPR: | |
849 { | |
850 tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type); | |
851 tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type); | |
852 | |
853 /* Don't distribute unless the output precision is at least as | |
854 big as the actual inputs. Otherwise, the comparison of the | |
855 truncated values will be wrong. */ | |
856 if (outprec >= TYPE_PRECISION (TREE_TYPE (arg0)) | |
857 && outprec >= TYPE_PRECISION (TREE_TYPE (arg1)) | |
858 /* If signedness of arg0 and arg1 don't match, | |
859 we can't necessarily find a type to compare them in. */ | |
860 && (TYPE_UNSIGNED (TREE_TYPE (arg0)) | |
861 == TYPE_UNSIGNED (TREE_TYPE (arg1)))) | |
862 goto trunc1; | |
863 break; | |
864 } | |
0 | 865 |
111 | 866 case PLUS_EXPR: |
867 case MINUS_EXPR: | |
868 case BIT_AND_EXPR: | |
869 case BIT_IOR_EXPR: | |
870 case BIT_XOR_EXPR: | |
871 trunc1: | |
872 { | |
873 tree arg0 = get_unwidened (TREE_OPERAND (expr, 0), type); | |
874 tree arg1 = get_unwidened (TREE_OPERAND (expr, 1), type); | |
0 | 875 |
111 | 876 /* Do not try to narrow operands of pointer subtraction; |
877 that will interfere with other folding. */ | |
878 if (ex_form == MINUS_EXPR | |
879 && CONVERT_EXPR_P (arg0) | |
880 && CONVERT_EXPR_P (arg1) | |
881 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (arg0, 0))) | |
882 && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (arg1, 0)))) | |
883 break; | |
884 | |
885 if (outprec >= BITS_PER_WORD | |
886 || targetm.truly_noop_truncation (outprec, inprec) | |
887 || inprec > TYPE_PRECISION (TREE_TYPE (arg0)) | |
888 || inprec > TYPE_PRECISION (TREE_TYPE (arg1))) | |
889 { | |
890 tree tem = do_narrow (loc, ex_form, type, arg0, arg1, | |
891 expr, inprec, outprec, dofold); | |
892 if (tem) | |
893 return tem; | |
0 | 894 } |
895 } | |
111 | 896 break; |
0 | 897 |
111 | 898 case NEGATE_EXPR: |
899 /* Using unsigned arithmetic for signed types may hide overflow | |
900 bugs. */ | |
901 if (!TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (expr, 0))) | |
902 && sanitize_flags_p (SANITIZE_SI_OVERFLOW)) | |
903 break; | |
904 /* Fall through. */ | |
905 case BIT_NOT_EXPR: | |
906 /* This is not correct for ABS_EXPR, | |
907 since we must test the sign before truncation. */ | |
908 { | |
909 /* Do the arithmetic in type TYPEX, | |
910 then convert result to TYPE. */ | |
911 tree typex = type; | |
912 | |
913 /* Can't do arithmetic in enumeral types | |
914 so use an integer type that will hold the values. */ | |
915 if (TREE_CODE (typex) == ENUMERAL_TYPE) | |
916 typex | |
917 = lang_hooks.types.type_for_size (TYPE_PRECISION (typex), | |
918 TYPE_UNSIGNED (typex)); | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
919 |
111 | 920 if (!TYPE_UNSIGNED (typex)) |
921 typex = unsigned_type_for (typex); | |
922 return convert (type, | |
923 fold_build1 (ex_form, typex, | |
924 convert (typex, | |
925 TREE_OPERAND (expr, 0)))); | |
926 } | |
63
b7f97abdc517
update gcc from gcc-4.5.0 to gcc-4.6
ryoma <e075725@ie.u-ryukyu.ac.jp>
parents:
55
diff
changeset
|
927 |
111 | 928 CASE_CONVERT: |
131 | 929 { |
930 tree argtype = TREE_TYPE (TREE_OPERAND (expr, 0)); | |
931 /* Don't introduce a "can't convert between vector values | |
932 of different size" error. */ | |
933 if (TREE_CODE (argtype) == VECTOR_TYPE | |
934 && maybe_ne (GET_MODE_SIZE (TYPE_MODE (argtype)), | |
935 GET_MODE_SIZE (TYPE_MODE (type)))) | |
936 break; | |
937 } | |
111 | 938 /* If truncating after truncating, might as well do all at once. |
939 If truncating after extending, we may get rid of wasted work. */ | |
940 return convert (type, get_unwidened (TREE_OPERAND (expr, 0), type)); | |
0 | 941 |
111 | 942 case COND_EXPR: |
943 /* It is sometimes worthwhile to push the narrowing down through | |
944 the conditional and never loses. A COND_EXPR may have a throw | |
945 as one operand, which then has void type. Just leave void | |
946 operands as they are. */ | |
947 return | |
948 fold_build3 (COND_EXPR, type, TREE_OPERAND (expr, 0), | |
949 VOID_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 1))) | |
950 ? TREE_OPERAND (expr, 1) | |
951 : convert (type, TREE_OPERAND (expr, 1)), | |
952 VOID_TYPE_P (TREE_TYPE (TREE_OPERAND (expr, 2))) | |
953 ? TREE_OPERAND (expr, 2) | |
954 : convert (type, TREE_OPERAND (expr, 2))); | |
955 | |
956 default: | |
0 | 957 break; |
958 } | |
959 | |
111 | 960 /* When parsing long initializers, we might end up with a lot of casts. |
961 Shortcut this. */ | |
962 if (TREE_CODE (expr) == INTEGER_CST) | |
963 return fold_convert (type, expr); | |
0 | 964 return build1 (CONVERT_EXPR, type, expr); |
965 | |
966 case REAL_TYPE: | |
111 | 967 if (sanitize_flags_p (SANITIZE_FLOAT_CAST) |
968 && current_function_decl != NULL_TREE) | |
969 { | |
970 expr = save_expr (expr); | |
971 tree check = ubsan_instrument_float_cast (loc, type, expr); | |
972 expr = build1 (FIX_TRUNC_EXPR, type, expr); | |
973 if (check == NULL_TREE) | |
974 return expr; | |
975 return maybe_fold_build2_loc (dofold, loc, COMPOUND_EXPR, | |
976 TREE_TYPE (expr), check, expr); | |
977 } | |
978 else | |
979 return build1 (FIX_TRUNC_EXPR, type, expr); | |
0 | 980 |
981 case FIXED_POINT_TYPE: | |
982 return build1 (FIXED_CONVERT_EXPR, type, expr); | |
983 | |
984 case COMPLEX_TYPE: | |
111 | 985 expr = maybe_fold_build1_loc (dofold, loc, REALPART_EXPR, |
986 TREE_TYPE (TREE_TYPE (expr)), expr); | |
987 return convert (type, expr); | |
0 | 988 |
989 case VECTOR_TYPE: | |
990 if (!tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (TREE_TYPE (expr)))) | |
991 { | |
111 | 992 error ("can%'t convert a vector of type %qT" |
993 " to type %qT which has different size", | |
994 TREE_TYPE (expr), type); | |
0 | 995 return error_mark_node; |
996 } | |
997 return build1 (VIEW_CONVERT_EXPR, type, expr); | |
998 | |
999 default: | |
1000 error ("aggregate value used where an integer was expected"); | |
1001 return convert (type, integer_zero_node); | |
1002 } | |
1003 } | |
1004 | |
111 | 1005 /* Convert EXPR to some integer (or enum) type TYPE. |
1006 | |
1007 EXPR must be pointer, integer, discrete (enum, char, or bool), float, | |
1008 fixed-point or vector; in other cases error is called. | |
1009 | |
1010 The result of this is always supposed to be a newly created tree node | |
1011 not in use in any existing structure. */ | |
0 | 1012 |
1013 tree | |
111 | 1014 convert_to_integer (tree type, tree expr) |
1015 { | |
1016 return convert_to_integer_1 (type, expr, true); | |
1017 } | |
1018 | |
1019 /* A wrapper around convert_to_complex_1 that only folds the | |
1020 expression if DOFOLD, or if it is CONSTANT_CLASS_P. */ | |
1021 | |
1022 tree | |
1023 convert_to_integer_maybe_fold (tree type, tree expr, bool dofold) | |
0 | 1024 { |
111 | 1025 return convert_to_integer_1 (type, expr, dofold || CONSTANT_CLASS_P (expr)); |
1026 } | |
1027 | |
1028 /* Convert EXPR to the complex type TYPE in the usual ways. If FOLD_P is | |
1029 true, try to fold the expression. */ | |
1030 | |
1031 static tree | |
1032 convert_to_complex_1 (tree type, tree expr, bool fold_p) | |
1033 { | |
1034 location_t loc = EXPR_LOCATION (expr); | |
0 | 1035 tree subtype = TREE_TYPE (type); |
1036 | |
1037 switch (TREE_CODE (TREE_TYPE (expr))) | |
1038 { | |
1039 case REAL_TYPE: | |
1040 case FIXED_POINT_TYPE: | |
1041 case INTEGER_TYPE: | |
1042 case ENUMERAL_TYPE: | |
1043 case BOOLEAN_TYPE: | |
1044 return build2 (COMPLEX_EXPR, type, convert (subtype, expr), | |
1045 convert (subtype, integer_zero_node)); | |
1046 | |
1047 case COMPLEX_TYPE: | |
1048 { | |
1049 tree elt_type = TREE_TYPE (TREE_TYPE (expr)); | |
1050 | |
1051 if (TYPE_MAIN_VARIANT (elt_type) == TYPE_MAIN_VARIANT (subtype)) | |
1052 return expr; | |
111 | 1053 else if (TREE_CODE (expr) == COMPOUND_EXPR) |
1054 { | |
1055 tree t = convert_to_complex_1 (type, TREE_OPERAND (expr, 1), | |
1056 fold_p); | |
1057 if (t == TREE_OPERAND (expr, 1)) | |
1058 return expr; | |
1059 return build2_loc (EXPR_LOCATION (expr), COMPOUND_EXPR, | |
1060 TREE_TYPE (t), TREE_OPERAND (expr, 0), t); | |
1061 } | |
0 | 1062 else if (TREE_CODE (expr) == COMPLEX_EXPR) |
111 | 1063 return maybe_fold_build2_loc (fold_p, loc, COMPLEX_EXPR, type, |
1064 convert (subtype, | |
1065 TREE_OPERAND (expr, 0)), | |
1066 convert (subtype, | |
1067 TREE_OPERAND (expr, 1))); | |
0 | 1068 else |
1069 { | |
1070 expr = save_expr (expr); | |
111 | 1071 tree realp = maybe_fold_build1_loc (fold_p, loc, REALPART_EXPR, |
1072 TREE_TYPE (TREE_TYPE (expr)), | |
1073 expr); | |
1074 tree imagp = maybe_fold_build1_loc (fold_p, loc, IMAGPART_EXPR, | |
1075 TREE_TYPE (TREE_TYPE (expr)), | |
1076 expr); | |
1077 return maybe_fold_build2_loc (fold_p, loc, COMPLEX_EXPR, type, | |
1078 convert (subtype, realp), | |
1079 convert (subtype, imagp)); | |
0 | 1080 } |
1081 } | |
1082 | |
1083 case POINTER_TYPE: | |
1084 case REFERENCE_TYPE: | |
1085 error ("pointer value used where a complex was expected"); | |
111 | 1086 return convert_to_complex_1 (type, integer_zero_node, fold_p); |
0 | 1087 |
1088 default: | |
1089 error ("aggregate value used where a complex was expected"); | |
111 | 1090 return convert_to_complex_1 (type, integer_zero_node, fold_p); |
0 | 1091 } |
1092 } | |
1093 | |
111 | 1094 /* A wrapper around convert_to_complex_1 that always folds the |
1095 expression. */ | |
1096 | |
1097 tree | |
1098 convert_to_complex (tree type, tree expr) | |
1099 { | |
1100 return convert_to_complex_1 (type, expr, true); | |
1101 } | |
1102 | |
1103 /* A wrapper around convert_to_complex_1 that only folds the | |
1104 expression if DOFOLD, or if it is CONSTANT_CLASS_P. */ | |
1105 | |
1106 tree | |
1107 convert_to_complex_maybe_fold (tree type, tree expr, bool dofold) | |
1108 { | |
1109 return convert_to_complex_1 (type, expr, dofold || CONSTANT_CLASS_P (expr)); | |
1110 } | |
1111 | |
0 | 1112 /* Convert EXPR to the vector type TYPE in the usual ways. */ |
1113 | |
1114 tree | |
1115 convert_to_vector (tree type, tree expr) | |
1116 { | |
1117 switch (TREE_CODE (TREE_TYPE (expr))) | |
1118 { | |
1119 case INTEGER_TYPE: | |
1120 case VECTOR_TYPE: | |
1121 if (!tree_int_cst_equal (TYPE_SIZE (type), TYPE_SIZE (TREE_TYPE (expr)))) | |
1122 { | |
111 | 1123 error ("can%'t convert a value of type %qT" |
1124 " to vector type %qT which has different size", | |
1125 TREE_TYPE (expr), type); | |
0 | 1126 return error_mark_node; |
1127 } | |
1128 return build1 (VIEW_CONVERT_EXPR, type, expr); | |
1129 | |
1130 default: | |
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
|
1131 error ("can%'t convert value to a vector"); |
0 | 1132 return error_mark_node; |
1133 } | |
1134 } | |
1135 | |
1136 /* Convert EXPR to some fixed-point type TYPE. | |
1137 | |
1138 EXPR must be fixed-point, float, integer, or enumeral; | |
1139 in other cases error is called. */ | |
1140 | |
1141 tree | |
1142 convert_to_fixed (tree type, tree expr) | |
1143 { | |
1144 if (integer_zerop (expr)) | |
1145 { | |
1146 tree fixed_zero_node = build_fixed (type, FCONST0 (TYPE_MODE (type))); | |
1147 return fixed_zero_node; | |
1148 } | |
1149 else if (integer_onep (expr) && ALL_SCALAR_ACCUM_MODE_P (TYPE_MODE (type))) | |
1150 { | |
1151 tree fixed_one_node = build_fixed (type, FCONST1 (TYPE_MODE (type))); | |
1152 return fixed_one_node; | |
1153 } | |
1154 | |
1155 switch (TREE_CODE (TREE_TYPE (expr))) | |
1156 { | |
1157 case FIXED_POINT_TYPE: | |
1158 case INTEGER_TYPE: | |
1159 case ENUMERAL_TYPE: | |
1160 case BOOLEAN_TYPE: | |
1161 case REAL_TYPE: | |
1162 return build1 (FIXED_CONVERT_EXPR, type, expr); | |
1163 | |
1164 case COMPLEX_TYPE: | |
1165 return convert (type, | |
1166 fold_build1 (REALPART_EXPR, | |
1167 TREE_TYPE (TREE_TYPE (expr)), expr)); | |
1168 | |
1169 default: | |
1170 error ("aggregate value used where a fixed-point was expected"); | |
1171 return error_mark_node; | |
1172 } | |
1173 } |