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