OSDN Git Service

2011-01-13 Tobias Burnus <burnus@net-b.de>
[pf3gnuchains/gcc-fork.git] / gcc / builtins.c
1 /* Expand builtin functions.
2    Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4    Free Software Foundation, Inc.
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"
25 #include "tm.h"
26 #include "machmode.h"
27 #include "rtl.h"
28 #include "tree.h"
29 #include "realmpfr.h"
30 #include "gimple.h"
31 #include "flags.h"
32 #include "regs.h"
33 #include "hard-reg-set.h"
34 #include "except.h"
35 #include "function.h"
36 #include "insn-config.h"
37 #include "expr.h"
38 #include "optabs.h"
39 #include "libfuncs.h"
40 #include "recog.h"
41 #include "output.h"
42 #include "typeclass.h"
43 #include "predict.h"
44 #include "tm_p.h"
45 #include "target.h"
46 #include "langhooks.h"
47 #include "basic-block.h"
48 #include "tree-mudflap.h"
49 #include "tree-flow.h"
50 #include "value-prof.h"
51 #include "diagnostic-core.h"
52 #include "builtins.h"
53
54
55 #ifndef PAD_VARARGS_DOWN
56 #define PAD_VARARGS_DOWN BYTES_BIG_ENDIAN
57 #endif
58 static tree do_mpc_arg1 (tree, tree, int (*)(mpc_ptr, mpc_srcptr, mpc_rnd_t));
59
60 struct target_builtins default_target_builtins;
61 #if SWITCHABLE_TARGET
62 struct target_builtins *this_target_builtins = &default_target_builtins;
63 #endif
64
65 /* Define the names of the builtin function types and codes.  */
66 const char *const built_in_class_names[4]
67   = {"NOT_BUILT_IN", "BUILT_IN_FRONTEND", "BUILT_IN_MD", "BUILT_IN_NORMAL"};
68
69 #define DEF_BUILTIN(X, N, C, T, LT, B, F, NA, AT, IM, COND) #X,
70 const char * built_in_names[(int) END_BUILTINS] =
71 {
72 #include "builtins.def"
73 };
74 #undef DEF_BUILTIN
75
76 /* Setup an array of _DECL trees, make sure each element is
77    initialized to NULL_TREE.  */
78 tree built_in_decls[(int) END_BUILTINS];
79 /* Declarations used when constructing the builtin implicitly in the compiler.
80    It may be NULL_TREE when this is invalid (for instance runtime is not
81    required to implement the function call in all cases).  */
82 tree implicit_built_in_decls[(int) END_BUILTINS];
83
84 static const char *c_getstr (tree);
85 static rtx c_readstr (const char *, enum machine_mode);
86 static int target_char_cast (tree, char *);
87 static rtx get_memory_rtx (tree, tree);
88 static int apply_args_size (void);
89 static int apply_result_size (void);
90 #if defined (HAVE_untyped_call) || defined (HAVE_untyped_return)
91 static rtx result_vector (int, rtx);
92 #endif
93 static void expand_builtin_update_setjmp_buf (rtx);
94 static void expand_builtin_prefetch (tree);
95 static rtx expand_builtin_apply_args (void);
96 static rtx expand_builtin_apply_args_1 (void);
97 static rtx expand_builtin_apply (rtx, rtx, rtx);
98 static void expand_builtin_return (rtx);
99 static enum type_class type_to_class (tree);
100 static rtx expand_builtin_classify_type (tree);
101 static void expand_errno_check (tree, rtx);
102 static rtx expand_builtin_mathfn (tree, rtx, rtx);
103 static rtx expand_builtin_mathfn_2 (tree, rtx, rtx);
104 static rtx expand_builtin_mathfn_3 (tree, rtx, rtx);
105 static rtx expand_builtin_mathfn_ternary (tree, rtx, rtx);
106 static rtx expand_builtin_interclass_mathfn (tree, rtx);
107 static rtx expand_builtin_sincos (tree);
108 static rtx expand_builtin_cexpi (tree, rtx);
109 static rtx expand_builtin_int_roundingfn (tree, rtx);
110 static rtx expand_builtin_int_roundingfn_2 (tree, rtx);
111 static rtx expand_builtin_next_arg (void);
112 static rtx expand_builtin_va_start (tree);
113 static rtx expand_builtin_va_end (tree);
114 static rtx expand_builtin_va_copy (tree);
115 static rtx expand_builtin_memcmp (tree, rtx, enum machine_mode);
116 static rtx expand_builtin_strcmp (tree, rtx);
117 static rtx expand_builtin_strncmp (tree, rtx, enum machine_mode);
118 static rtx builtin_memcpy_read_str (void *, HOST_WIDE_INT, enum machine_mode);
119 static rtx expand_builtin_memcpy (tree, rtx);
120 static rtx expand_builtin_mempcpy (tree, rtx, enum machine_mode);
121 static rtx expand_builtin_mempcpy_args (tree, tree, tree, rtx,
122                                         enum machine_mode, int);
123 static rtx expand_builtin_strcpy (tree, rtx);
124 static rtx expand_builtin_strcpy_args (tree, tree, rtx);
125 static rtx expand_builtin_stpcpy (tree, rtx, enum machine_mode);
126 static rtx expand_builtin_strncpy (tree, rtx);
127 static rtx builtin_memset_gen_str (void *, HOST_WIDE_INT, enum machine_mode);
128 static rtx expand_builtin_memset (tree, rtx, enum machine_mode);
129 static rtx expand_builtin_memset_args (tree, tree, tree, rtx, enum machine_mode, tree);
130 static rtx expand_builtin_bzero (tree);
131 static rtx expand_builtin_strlen (tree, rtx, enum machine_mode);
132 static rtx expand_builtin_alloca (tree, bool);
133 static rtx expand_builtin_unop (enum machine_mode, tree, rtx, rtx, optab);
134 static rtx expand_builtin_frame_address (tree, tree);
135 static tree stabilize_va_list_loc (location_t, tree, int);
136 static rtx expand_builtin_expect (tree, rtx);
137 static tree fold_builtin_constant_p (tree);
138 static tree fold_builtin_expect (location_t, tree, tree);
139 static tree fold_builtin_classify_type (tree);
140 static tree fold_builtin_strlen (location_t, tree, tree);
141 static tree fold_builtin_inf (location_t, tree, int);
142 static tree fold_builtin_nan (tree, tree, int);
143 static tree rewrite_call_expr (location_t, tree, int, tree, int, ...);
144 static bool validate_arg (const_tree, enum tree_code code);
145 static bool integer_valued_real_p (tree);
146 static tree fold_trunc_transparent_mathfn (location_t, tree, tree);
147 static bool readonly_data_expr (tree);
148 static rtx expand_builtin_fabs (tree, rtx, rtx);
149 static rtx expand_builtin_signbit (tree, rtx);
150 static tree fold_builtin_sqrt (location_t, tree, tree);
151 static tree fold_builtin_cbrt (location_t, tree, tree);
152 static tree fold_builtin_pow (location_t, tree, tree, tree, tree);
153 static tree fold_builtin_powi (location_t, tree, tree, tree, tree);
154 static tree fold_builtin_cos (location_t, tree, tree, tree);
155 static tree fold_builtin_cosh (location_t, tree, tree, tree);
156 static tree fold_builtin_tan (tree, tree);
157 static tree fold_builtin_trunc (location_t, tree, tree);
158 static tree fold_builtin_floor (location_t, tree, tree);
159 static tree fold_builtin_ceil (location_t, tree, tree);
160 static tree fold_builtin_round (location_t, tree, tree);
161 static tree fold_builtin_int_roundingfn (location_t, tree, tree);
162 static tree fold_builtin_bitop (tree, tree);
163 static tree fold_builtin_memory_op (location_t, tree, tree, tree, tree, bool, int);
164 static tree fold_builtin_strchr (location_t, tree, tree, tree);
165 static tree fold_builtin_memchr (location_t, tree, tree, tree, tree);
166 static tree fold_builtin_memcmp (location_t, tree, tree, tree);
167 static tree fold_builtin_strcmp (location_t, tree, tree);
168 static tree fold_builtin_strncmp (location_t, tree, tree, tree);
169 static tree fold_builtin_signbit (location_t, tree, tree);
170 static tree fold_builtin_copysign (location_t, tree, tree, tree, tree);
171 static tree fold_builtin_isascii (location_t, tree);
172 static tree fold_builtin_toascii (location_t, tree);
173 static tree fold_builtin_isdigit (location_t, tree);
174 static tree fold_builtin_fabs (location_t, tree, tree);
175 static tree fold_builtin_abs (location_t, tree, tree);
176 static tree fold_builtin_unordered_cmp (location_t, tree, tree, tree, enum tree_code,
177                                         enum tree_code);
178 static tree fold_builtin_n (location_t, tree, tree *, int, bool);
179 static tree fold_builtin_0 (location_t, tree, bool);
180 static tree fold_builtin_1 (location_t, tree, tree, bool);
181 static tree fold_builtin_2 (location_t, tree, tree, tree, bool);
182 static tree fold_builtin_3 (location_t, tree, tree, tree, tree, bool);
183 static tree fold_builtin_4 (location_t, tree, tree, tree, tree, tree, bool);
184 static tree fold_builtin_varargs (location_t, tree, tree, bool);
185
186 static tree fold_builtin_strpbrk (location_t, tree, tree, tree);
187 static tree fold_builtin_strstr (location_t, tree, tree, tree);
188 static tree fold_builtin_strrchr (location_t, tree, tree, tree);
189 static tree fold_builtin_strcat (location_t, tree, tree);
190 static tree fold_builtin_strncat (location_t, tree, tree, tree);
191 static tree fold_builtin_strspn (location_t, tree, tree);
192 static tree fold_builtin_strcspn (location_t, tree, tree);
193 static tree fold_builtin_sprintf (location_t, tree, tree, tree, int);
194
195 static rtx expand_builtin_object_size (tree);
196 static rtx expand_builtin_memory_chk (tree, rtx, enum machine_mode,
197                                       enum built_in_function);
198 static void maybe_emit_chk_warning (tree, enum built_in_function);
199 static void maybe_emit_sprintf_chk_warning (tree, enum built_in_function);
200 static void maybe_emit_free_warning (tree);
201 static tree fold_builtin_object_size (tree, tree);
202 static tree fold_builtin_strcat_chk (location_t, tree, tree, tree, tree);
203 static tree fold_builtin_strncat_chk (location_t, tree, tree, tree, tree, tree);
204 static tree fold_builtin_sprintf_chk (location_t, tree, enum built_in_function);
205 static tree fold_builtin_printf (location_t, tree, tree, tree, bool, enum built_in_function);
206 static tree fold_builtin_fprintf (location_t, tree, tree, tree, tree, bool,
207                                   enum built_in_function);
208 static bool init_target_chars (void);
209
210 static unsigned HOST_WIDE_INT target_newline;
211 static unsigned HOST_WIDE_INT target_percent;
212 static unsigned HOST_WIDE_INT target_c;
213 static unsigned HOST_WIDE_INT target_s;
214 static char target_percent_c[3];
215 static char target_percent_s[3];
216 static char target_percent_s_newline[4];
217 static tree do_mpfr_arg1 (tree, tree, int (*)(mpfr_ptr, mpfr_srcptr, mp_rnd_t),
218                           const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, bool);
219 static tree do_mpfr_arg2 (tree, tree, tree,
220                           int (*)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mp_rnd_t));
221 static tree do_mpfr_arg3 (tree, tree, tree, tree,
222                           int (*)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mpfr_srcptr, mp_rnd_t));
223 static tree do_mpfr_sincos (tree, tree, tree);
224 static tree do_mpfr_bessel_n (tree, tree, tree,
225                               int (*)(mpfr_ptr, long, mpfr_srcptr, mp_rnd_t),
226                               const REAL_VALUE_TYPE *, bool);
227 static tree do_mpfr_remquo (tree, tree, tree);
228 static tree do_mpfr_lgamma_r (tree, tree, tree);
229
230 /* Return true if NAME starts with __builtin_ or __sync_.  */
231
232 bool
233 is_builtin_name (const char *name)
234 {
235   if (strncmp (name, "__builtin_", 10) == 0)
236     return true;
237   if (strncmp (name, "__sync_", 7) == 0)
238     return true;
239   return false;
240 }
241
242
243 /* Return true if DECL is a function symbol representing a built-in.  */
244
245 bool
246 is_builtin_fn (tree decl)
247 {
248   return TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl);
249 }
250
251
252 /* Return true if NODE should be considered for inline expansion regardless
253    of the optimization level.  This means whenever a function is invoked with
254    its "internal" name, which normally contains the prefix "__builtin".  */
255
256 static bool
257 called_as_built_in (tree node)
258 {
259   /* Note that we must use DECL_NAME, not DECL_ASSEMBLER_NAME_SET_P since
260      we want the name used to call the function, not the name it
261      will have. */
262   const char *name = IDENTIFIER_POINTER (DECL_NAME (node));
263   return is_builtin_name (name);
264 }
265
266 /* Return the alignment in bits of EXP, an object.
267    Don't return more than MAX_ALIGN no matter what.  */
268
269 unsigned int
270 get_object_alignment (tree exp, unsigned int max_align)
271 {
272   HOST_WIDE_INT bitsize, bitpos;
273   tree offset;
274   enum machine_mode mode;
275   int unsignedp, volatilep;
276   unsigned int align, inner;
277
278   /* Get the innermost object and the constant (bitpos) and possibly
279      variable (offset) offset of the access.  */
280   exp = get_inner_reference (exp, &bitsize, &bitpos, &offset,
281                              &mode, &unsignedp, &volatilep, true);
282
283   /* Extract alignment information from the innermost object and
284      possibly adjust bitpos and offset.  */
285   if (TREE_CODE (exp) == CONST_DECL)
286     exp = DECL_INITIAL (exp);
287   if (DECL_P (exp)
288       && TREE_CODE (exp) != LABEL_DECL)
289     align = DECL_ALIGN (exp);
290   else if (CONSTANT_CLASS_P (exp))
291     {
292       align = TYPE_ALIGN (TREE_TYPE (exp));
293 #ifdef CONSTANT_ALIGNMENT
294       align = (unsigned)CONSTANT_ALIGNMENT (exp, align);
295 #endif
296     }
297   else if (TREE_CODE (exp) == VIEW_CONVERT_EXPR)
298     align = TYPE_ALIGN (TREE_TYPE (exp));
299   else if (TREE_CODE (exp) == INDIRECT_REF)
300     align = TYPE_ALIGN (TREE_TYPE (exp));
301   else if (TREE_CODE (exp) == MEM_REF)
302     {
303       tree addr = TREE_OPERAND (exp, 0);
304       struct ptr_info_def *pi;
305       if (TREE_CODE (addr) == BIT_AND_EXPR
306           && TREE_CODE (TREE_OPERAND (addr, 1)) == INTEGER_CST)
307         {
308           align = (TREE_INT_CST_LOW (TREE_OPERAND (addr, 1))
309                     & -TREE_INT_CST_LOW (TREE_OPERAND (addr, 1)));
310           align *= BITS_PER_UNIT;
311           addr = TREE_OPERAND (addr, 0);
312         }
313       else
314         align = BITS_PER_UNIT;
315       if (TREE_CODE (addr) == SSA_NAME
316           && (pi = SSA_NAME_PTR_INFO (addr)))
317         {
318           bitpos += (pi->misalign * BITS_PER_UNIT) & ~(align - 1);
319           align = MAX (pi->align * BITS_PER_UNIT, align);
320         }
321       else if (TREE_CODE (addr) == ADDR_EXPR)
322         align = MAX (align, get_object_alignment (TREE_OPERAND (addr, 0),
323                                                   max_align));
324       bitpos += mem_ref_offset (exp).low * BITS_PER_UNIT;
325     }
326   else if (TREE_CODE (exp) == TARGET_MEM_REF)
327     {
328       struct ptr_info_def *pi;
329       tree addr = TMR_BASE (exp);
330       if (TREE_CODE (addr) == BIT_AND_EXPR
331           && TREE_CODE (TREE_OPERAND (addr, 1)) == INTEGER_CST)
332         {
333           align = (TREE_INT_CST_LOW (TREE_OPERAND (addr, 1))
334                    & -TREE_INT_CST_LOW (TREE_OPERAND (addr, 1)));
335           align *= BITS_PER_UNIT;
336           addr = TREE_OPERAND (addr, 0);
337         }
338       else
339         align = BITS_PER_UNIT;
340       if (TREE_CODE (addr) == SSA_NAME
341           && (pi = SSA_NAME_PTR_INFO (addr)))
342         {
343           bitpos += (pi->misalign * BITS_PER_UNIT) & ~(align - 1);
344           align = MAX (pi->align * BITS_PER_UNIT, align);
345         }
346       else if (TREE_CODE (addr) == ADDR_EXPR)
347         align = MAX (align, get_object_alignment (TREE_OPERAND (addr, 0),
348                                                   max_align));
349       if (TMR_OFFSET (exp))
350         bitpos += TREE_INT_CST_LOW (TMR_OFFSET (exp)) * BITS_PER_UNIT;
351       if (TMR_INDEX (exp) && TMR_STEP (exp))
352         {
353           unsigned HOST_WIDE_INT step = TREE_INT_CST_LOW (TMR_STEP (exp));
354           align = MIN (align, (step & -step) * BITS_PER_UNIT);
355         }
356       else if (TMR_INDEX (exp))
357         align = BITS_PER_UNIT;
358       if (TMR_INDEX2 (exp))
359         align = BITS_PER_UNIT;
360     }
361   else
362     align = BITS_PER_UNIT;
363
364   /* If there is a non-constant offset part extract the maximum
365      alignment that can prevail.  */
366   inner = max_align;
367   while (offset)
368     {
369       tree next_offset;
370
371       if (TREE_CODE (offset) == PLUS_EXPR)
372         {
373           next_offset = TREE_OPERAND (offset, 0);
374           offset = TREE_OPERAND (offset, 1);
375         }
376       else
377         next_offset = NULL;
378       if (host_integerp (offset, 1))
379         {
380           /* Any overflow in calculating offset_bits won't change
381              the alignment.  */
382           unsigned offset_bits
383             = ((unsigned) tree_low_cst (offset, 1) * BITS_PER_UNIT);
384
385           if (offset_bits)
386             inner = MIN (inner, (offset_bits & -offset_bits));
387         }
388       else if (TREE_CODE (offset) == MULT_EXPR
389                && host_integerp (TREE_OPERAND (offset, 1), 1))
390         {
391           /* Any overflow in calculating offset_factor won't change
392              the alignment.  */
393           unsigned offset_factor
394             = ((unsigned) tree_low_cst (TREE_OPERAND (offset, 1), 1)
395                * BITS_PER_UNIT);
396
397           if (offset_factor)
398             inner = MIN (inner, (offset_factor & -offset_factor));
399         }
400       else
401         {
402           inner = MIN (inner, BITS_PER_UNIT);
403           break;
404         }
405       offset = next_offset;
406     }
407
408   /* Alignment is innermost object alignment adjusted by the constant
409      and non-constant offset parts.  */
410   align = MIN (align, inner);
411   bitpos = bitpos & (align - 1);
412
413   /* align and bitpos now specify known low bits of the pointer.
414      ptr & (align - 1) == bitpos.  */
415
416   if (bitpos != 0)
417     align = (bitpos & -bitpos);
418
419   return MIN (align, max_align);
420 }
421
422 /* Returns true iff we can trust that alignment information has been
423    calculated properly.  */
424
425 bool
426 can_trust_pointer_alignment (void)
427 {
428   /* We rely on TER to compute accurate alignment information.  */
429   return (optimize && flag_tree_ter);
430 }
431
432 /* Return the alignment in bits of EXP, a pointer valued expression.
433    But don't return more than MAX_ALIGN no matter what.
434    The alignment returned is, by default, the alignment of the thing that
435    EXP points to.  If it is not a POINTER_TYPE, 0 is returned.
436
437    Otherwise, look at the expression to see if we can do better, i.e., if the
438    expression is actually pointing at an object whose alignment is tighter.  */
439
440 unsigned int
441 get_pointer_alignment (tree exp, unsigned int max_align)
442 {
443   STRIP_NOPS (exp);
444
445   if (TREE_CODE (exp) == ADDR_EXPR)
446     return get_object_alignment (TREE_OPERAND (exp, 0), max_align);
447   else if (TREE_CODE (exp) == SSA_NAME
448            && POINTER_TYPE_P (TREE_TYPE (exp)))
449     {
450       struct ptr_info_def *pi = SSA_NAME_PTR_INFO (exp);
451       unsigned align;
452       if (!pi)
453         return BITS_PER_UNIT;
454       if (pi->misalign != 0)
455         align = (pi->misalign & -pi->misalign);
456       else
457         align = pi->align;
458       return MIN (max_align, align * BITS_PER_UNIT);
459     }
460
461   return POINTER_TYPE_P (TREE_TYPE (exp)) ? BITS_PER_UNIT : 0;
462 }
463
464 /* Compute the length of a C string.  TREE_STRING_LENGTH is not the right
465    way, because it could contain a zero byte in the middle.
466    TREE_STRING_LENGTH is the size of the character array, not the string.
467
468    ONLY_VALUE should be nonzero if the result is not going to be emitted
469    into the instruction stream and zero if it is going to be expanded.
470    E.g. with i++ ? "foo" : "bar", if ONLY_VALUE is nonzero, constant 3
471    is returned, otherwise NULL, since
472    len = c_strlen (src, 1); if (len) expand_expr (len, ...); would not
473    evaluate the side-effects.
474
475    The value returned is of type `ssizetype'.
476
477    Unfortunately, string_constant can't access the values of const char
478    arrays with initializers, so neither can we do so here.  */
479
480 tree
481 c_strlen (tree src, int only_value)
482 {
483   tree offset_node;
484   HOST_WIDE_INT offset;
485   int max;
486   const char *ptr;
487   location_t loc;
488
489   STRIP_NOPS (src);
490   if (TREE_CODE (src) == COND_EXPR
491       && (only_value || !TREE_SIDE_EFFECTS (TREE_OPERAND (src, 0))))
492     {
493       tree len1, len2;
494
495       len1 = c_strlen (TREE_OPERAND (src, 1), only_value);
496       len2 = c_strlen (TREE_OPERAND (src, 2), only_value);
497       if (tree_int_cst_equal (len1, len2))
498         return len1;
499     }
500
501   if (TREE_CODE (src) == COMPOUND_EXPR
502       && (only_value || !TREE_SIDE_EFFECTS (TREE_OPERAND (src, 0))))
503     return c_strlen (TREE_OPERAND (src, 1), only_value);
504
505   loc = EXPR_LOC_OR_HERE (src);
506
507   src = string_constant (src, &offset_node);
508   if (src == 0)
509     return NULL_TREE;
510
511   max = TREE_STRING_LENGTH (src) - 1;
512   ptr = TREE_STRING_POINTER (src);
513
514   if (offset_node && TREE_CODE (offset_node) != INTEGER_CST)
515     {
516       /* If the string has an internal zero byte (e.g., "foo\0bar"), we can't
517          compute the offset to the following null if we don't know where to
518          start searching for it.  */
519       int i;
520
521       for (i = 0; i < max; i++)
522         if (ptr[i] == 0)
523           return NULL_TREE;
524
525       /* We don't know the starting offset, but we do know that the string
526          has no internal zero bytes.  We can assume that the offset falls
527          within the bounds of the string; otherwise, the programmer deserves
528          what he gets.  Subtract the offset from the length of the string,
529          and return that.  This would perhaps not be valid if we were dealing
530          with named arrays in addition to literal string constants.  */
531
532       return size_diffop_loc (loc, size_int (max), offset_node);
533     }
534
535   /* We have a known offset into the string.  Start searching there for
536      a null character if we can represent it as a single HOST_WIDE_INT.  */
537   if (offset_node == 0)
538     offset = 0;
539   else if (! host_integerp (offset_node, 0))
540     offset = -1;
541   else
542     offset = tree_low_cst (offset_node, 0);
543
544   /* If the offset is known to be out of bounds, warn, and call strlen at
545      runtime.  */
546   if (offset < 0 || offset > max)
547     {
548      /* Suppress multiple warnings for propagated constant strings.  */
549       if (! TREE_NO_WARNING (src))
550         {
551           warning_at (loc, 0, "offset outside bounds of constant string");
552           TREE_NO_WARNING (src) = 1;
553         }
554       return NULL_TREE;
555     }
556
557   /* Use strlen to search for the first zero byte.  Since any strings
558      constructed with build_string will have nulls appended, we win even
559      if we get handed something like (char[4])"abcd".
560
561      Since OFFSET is our starting index into the string, no further
562      calculation is needed.  */
563   return ssize_int (strlen (ptr + offset));
564 }
565
566 /* Return a char pointer for a C string if it is a string constant
567    or sum of string constant and integer constant.  */
568
569 static const char *
570 c_getstr (tree src)
571 {
572   tree offset_node;
573
574   src = string_constant (src, &offset_node);
575   if (src == 0)
576     return 0;
577
578   if (offset_node == 0)
579     return TREE_STRING_POINTER (src);
580   else if (!host_integerp (offset_node, 1)
581            || compare_tree_int (offset_node, TREE_STRING_LENGTH (src) - 1) > 0)
582     return 0;
583
584   return TREE_STRING_POINTER (src) + tree_low_cst (offset_node, 1);
585 }
586
587 /* Return a CONST_INT or CONST_DOUBLE corresponding to target reading
588    GET_MODE_BITSIZE (MODE) bits from string constant STR.  */
589
590 static rtx
591 c_readstr (const char *str, enum machine_mode mode)
592 {
593   HOST_WIDE_INT c[2];
594   HOST_WIDE_INT ch;
595   unsigned int i, j;
596
597   gcc_assert (GET_MODE_CLASS (mode) == MODE_INT);
598
599   c[0] = 0;
600   c[1] = 0;
601   ch = 1;
602   for (i = 0; i < GET_MODE_SIZE (mode); i++)
603     {
604       j = i;
605       if (WORDS_BIG_ENDIAN)
606         j = GET_MODE_SIZE (mode) - i - 1;
607       if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN
608           && GET_MODE_SIZE (mode) > UNITS_PER_WORD)
609         j = j + UNITS_PER_WORD - 2 * (j % UNITS_PER_WORD) - 1;
610       j *= BITS_PER_UNIT;
611       gcc_assert (j < 2 * HOST_BITS_PER_WIDE_INT);
612
613       if (ch)
614         ch = (unsigned char) str[i];
615       c[j / HOST_BITS_PER_WIDE_INT] |= ch << (j % HOST_BITS_PER_WIDE_INT);
616     }
617   return immed_double_const (c[0], c[1], mode);
618 }
619
620 /* Cast a target constant CST to target CHAR and if that value fits into
621    host char type, return zero and put that value into variable pointed to by
622    P.  */
623
624 static int
625 target_char_cast (tree cst, char *p)
626 {
627   unsigned HOST_WIDE_INT val, hostval;
628
629   if (TREE_CODE (cst) != INTEGER_CST
630       || CHAR_TYPE_SIZE > HOST_BITS_PER_WIDE_INT)
631     return 1;
632
633   val = TREE_INT_CST_LOW (cst);
634   if (CHAR_TYPE_SIZE < HOST_BITS_PER_WIDE_INT)
635     val &= (((unsigned HOST_WIDE_INT) 1) << CHAR_TYPE_SIZE) - 1;
636
637   hostval = val;
638   if (HOST_BITS_PER_CHAR < HOST_BITS_PER_WIDE_INT)
639     hostval &= (((unsigned HOST_WIDE_INT) 1) << HOST_BITS_PER_CHAR) - 1;
640
641   if (val != hostval)
642     return 1;
643
644   *p = hostval;
645   return 0;
646 }
647
648 /* Similar to save_expr, but assumes that arbitrary code is not executed
649    in between the multiple evaluations.  In particular, we assume that a
650    non-addressable local variable will not be modified.  */
651
652 static tree
653 builtin_save_expr (tree exp)
654 {
655   if (TREE_ADDRESSABLE (exp) == 0
656       && (TREE_CODE (exp) == PARM_DECL
657           || (TREE_CODE (exp) == VAR_DECL && !TREE_STATIC (exp))))
658     return exp;
659
660   return save_expr (exp);
661 }
662
663 /* Given TEM, a pointer to a stack frame, follow the dynamic chain COUNT
664    times to get the address of either a higher stack frame, or a return
665    address located within it (depending on FNDECL_CODE).  */
666
667 static rtx
668 expand_builtin_return_addr (enum built_in_function fndecl_code, int count)
669 {
670   int i;
671
672 #ifdef INITIAL_FRAME_ADDRESS_RTX
673   rtx tem = INITIAL_FRAME_ADDRESS_RTX;
674 #else
675   rtx tem;
676
677   /* For a zero count with __builtin_return_address, we don't care what
678      frame address we return, because target-specific definitions will
679      override us.  Therefore frame pointer elimination is OK, and using
680      the soft frame pointer is OK.
681
682      For a nonzero count, or a zero count with __builtin_frame_address,
683      we require a stable offset from the current frame pointer to the
684      previous one, so we must use the hard frame pointer, and
685      we must disable frame pointer elimination.  */
686   if (count == 0 && fndecl_code == BUILT_IN_RETURN_ADDRESS)
687     tem = frame_pointer_rtx;
688   else
689     {
690       tem = hard_frame_pointer_rtx;
691
692       /* Tell reload not to eliminate the frame pointer.  */
693       crtl->accesses_prior_frames = 1;
694     }
695 #endif
696
697   /* Some machines need special handling before we can access
698      arbitrary frames.  For example, on the SPARC, we must first flush
699      all register windows to the stack.  */
700 #ifdef SETUP_FRAME_ADDRESSES
701   if (count > 0)
702     SETUP_FRAME_ADDRESSES ();
703 #endif
704
705   /* On the SPARC, the return address is not in the frame, it is in a
706      register.  There is no way to access it off of the current frame
707      pointer, but it can be accessed off the previous frame pointer by
708      reading the value from the register window save area.  */
709 #ifdef RETURN_ADDR_IN_PREVIOUS_FRAME
710   if (fndecl_code == BUILT_IN_RETURN_ADDRESS)
711     count--;
712 #endif
713
714   /* Scan back COUNT frames to the specified frame.  */
715   for (i = 0; i < count; i++)
716     {
717       /* Assume the dynamic chain pointer is in the word that the
718          frame address points to, unless otherwise specified.  */
719 #ifdef DYNAMIC_CHAIN_ADDRESS
720       tem = DYNAMIC_CHAIN_ADDRESS (tem);
721 #endif
722       tem = memory_address (Pmode, tem);
723       tem = gen_frame_mem (Pmode, tem);
724       tem = copy_to_reg (tem);
725     }
726
727   /* For __builtin_frame_address, return what we've got.  But, on
728      the SPARC for example, we may have to add a bias.  */
729   if (fndecl_code == BUILT_IN_FRAME_ADDRESS)
730 #ifdef FRAME_ADDR_RTX
731     return FRAME_ADDR_RTX (tem);
732 #else
733     return tem;
734 #endif
735
736   /* For __builtin_return_address, get the return address from that frame.  */
737 #ifdef RETURN_ADDR_RTX
738   tem = RETURN_ADDR_RTX (count, tem);
739 #else
740   tem = memory_address (Pmode,
741                         plus_constant (tem, GET_MODE_SIZE (Pmode)));
742   tem = gen_frame_mem (Pmode, tem);
743 #endif
744   return tem;
745 }
746
747 /* Alias set used for setjmp buffer.  */
748 static alias_set_type setjmp_alias_set = -1;
749
750 /* Construct the leading half of a __builtin_setjmp call.  Control will
751    return to RECEIVER_LABEL.  This is also called directly by the SJLJ
752    exception handling code.  */
753
754 void
755 expand_builtin_setjmp_setup (rtx buf_addr, rtx receiver_label)
756 {
757   enum machine_mode sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL);
758   rtx stack_save;
759   rtx mem;
760
761   if (setjmp_alias_set == -1)
762     setjmp_alias_set = new_alias_set ();
763
764   buf_addr = convert_memory_address (Pmode, buf_addr);
765
766   buf_addr = force_reg (Pmode, force_operand (buf_addr, NULL_RTX));
767
768   /* We store the frame pointer and the address of receiver_label in
769      the buffer and use the rest of it for the stack save area, which
770      is machine-dependent.  */
771
772   mem = gen_rtx_MEM (Pmode, buf_addr);
773   set_mem_alias_set (mem, setjmp_alias_set);
774   emit_move_insn (mem, targetm.builtin_setjmp_frame_value ());
775
776   mem = gen_rtx_MEM (Pmode, plus_constant (buf_addr, GET_MODE_SIZE (Pmode))),
777   set_mem_alias_set (mem, setjmp_alias_set);
778
779   emit_move_insn (validize_mem (mem),
780                   force_reg (Pmode, gen_rtx_LABEL_REF (Pmode, receiver_label)));
781
782   stack_save = gen_rtx_MEM (sa_mode,
783                             plus_constant (buf_addr,
784                                            2 * GET_MODE_SIZE (Pmode)));
785   set_mem_alias_set (stack_save, setjmp_alias_set);
786   emit_stack_save (SAVE_NONLOCAL, &stack_save, NULL_RTX);
787
788   /* If there is further processing to do, do it.  */
789 #ifdef HAVE_builtin_setjmp_setup
790   if (HAVE_builtin_setjmp_setup)
791     emit_insn (gen_builtin_setjmp_setup (buf_addr));
792 #endif
793
794   /* Tell optimize_save_area_alloca that extra work is going to
795      need to go on during alloca.  */
796   cfun->calls_setjmp = 1;
797
798   /* We have a nonlocal label.   */
799   cfun->has_nonlocal_label = 1;
800 }
801
802 /* Construct the trailing part of a __builtin_setjmp call.  This is
803    also called directly by the SJLJ exception handling code.  */
804
805 void
806 expand_builtin_setjmp_receiver (rtx receiver_label ATTRIBUTE_UNUSED)
807 {
808   rtx chain;
809
810   /* Clobber the FP when we get here, so we have to make sure it's
811      marked as used by this function.  */
812   emit_use (hard_frame_pointer_rtx);
813
814   /* Mark the static chain as clobbered here so life information
815      doesn't get messed up for it.  */
816   chain = targetm.calls.static_chain (current_function_decl, true);
817   if (chain && REG_P (chain))
818     emit_clobber (chain);
819
820   /* Now put in the code to restore the frame pointer, and argument
821      pointer, if needed.  */
822 #ifdef HAVE_nonlocal_goto
823   if (! HAVE_nonlocal_goto)
824 #endif
825     {
826       emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx);
827       /* This might change the hard frame pointer in ways that aren't
828          apparent to early optimization passes, so force a clobber.  */
829       emit_clobber (hard_frame_pointer_rtx);
830     }
831
832 #if !HARD_FRAME_POINTER_IS_ARG_POINTER
833   if (fixed_regs[ARG_POINTER_REGNUM])
834     {
835 #ifdef ELIMINABLE_REGS
836       size_t i;
837       static const struct elims {const int from, to;} elim_regs[] = ELIMINABLE_REGS;
838
839       for (i = 0; i < ARRAY_SIZE (elim_regs); i++)
840         if (elim_regs[i].from == ARG_POINTER_REGNUM
841             && elim_regs[i].to == HARD_FRAME_POINTER_REGNUM)
842           break;
843
844       if (i == ARRAY_SIZE (elim_regs))
845 #endif
846         {
847           /* Now restore our arg pointer from the address at which it
848              was saved in our stack frame.  */
849           emit_move_insn (crtl->args.internal_arg_pointer,
850                           copy_to_reg (get_arg_pointer_save_area ()));
851         }
852     }
853 #endif
854
855 #ifdef HAVE_builtin_setjmp_receiver
856   if (HAVE_builtin_setjmp_receiver)
857     emit_insn (gen_builtin_setjmp_receiver (receiver_label));
858   else
859 #endif
860 #ifdef HAVE_nonlocal_goto_receiver
861     if (HAVE_nonlocal_goto_receiver)
862       emit_insn (gen_nonlocal_goto_receiver ());
863     else
864 #endif
865       { /* Nothing */ }
866
867   /* We must not allow the code we just generated to be reordered by
868      scheduling.  Specifically, the update of the frame pointer must
869      happen immediately, not later.  */
870   emit_insn (gen_blockage ());
871 }
872
873 /* __builtin_longjmp is passed a pointer to an array of five words (not
874    all will be used on all machines).  It operates similarly to the C
875    library function of the same name, but is more efficient.  Much of
876    the code below is copied from the handling of non-local gotos.  */
877
878 static void
879 expand_builtin_longjmp (rtx buf_addr, rtx value)
880 {
881   rtx fp, lab, stack, insn, last;
882   enum machine_mode sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL);
883
884   /* DRAP is needed for stack realign if longjmp is expanded to current
885      function  */
886   if (SUPPORTS_STACK_ALIGNMENT)
887     crtl->need_drap = true;
888
889   if (setjmp_alias_set == -1)
890     setjmp_alias_set = new_alias_set ();
891
892   buf_addr = convert_memory_address (Pmode, buf_addr);
893
894   buf_addr = force_reg (Pmode, buf_addr);
895
896   /* We require that the user must pass a second argument of 1, because
897      that is what builtin_setjmp will return.  */
898   gcc_assert (value == const1_rtx);
899
900   last = get_last_insn ();
901 #ifdef HAVE_builtin_longjmp
902   if (HAVE_builtin_longjmp)
903     emit_insn (gen_builtin_longjmp (buf_addr));
904   else
905 #endif
906     {
907       fp = gen_rtx_MEM (Pmode, buf_addr);
908       lab = gen_rtx_MEM (Pmode, plus_constant (buf_addr,
909                                                GET_MODE_SIZE (Pmode)));
910
911       stack = gen_rtx_MEM (sa_mode, plus_constant (buf_addr,
912                                                    2 * GET_MODE_SIZE (Pmode)));
913       set_mem_alias_set (fp, setjmp_alias_set);
914       set_mem_alias_set (lab, setjmp_alias_set);
915       set_mem_alias_set (stack, setjmp_alias_set);
916
917       /* Pick up FP, label, and SP from the block and jump.  This code is
918          from expand_goto in stmt.c; see there for detailed comments.  */
919 #ifdef HAVE_nonlocal_goto
920       if (HAVE_nonlocal_goto)
921         /* We have to pass a value to the nonlocal_goto pattern that will
922            get copied into the static_chain pointer, but it does not matter
923            what that value is, because builtin_setjmp does not use it.  */
924         emit_insn (gen_nonlocal_goto (value, lab, stack, fp));
925       else
926 #endif
927         {
928           lab = copy_to_reg (lab);
929
930           emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
931           emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
932
933           emit_move_insn (hard_frame_pointer_rtx, fp);
934           emit_stack_restore (SAVE_NONLOCAL, stack, NULL_RTX);
935
936           emit_use (hard_frame_pointer_rtx);
937           emit_use (stack_pointer_rtx);
938           emit_indirect_jump (lab);
939         }
940     }
941
942   /* Search backwards and mark the jump insn as a non-local goto.
943      Note that this precludes the use of __builtin_longjmp to a
944      __builtin_setjmp target in the same function.  However, we've
945      already cautioned the user that these functions are for
946      internal exception handling use only.  */
947   for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
948     {
949       gcc_assert (insn != last);
950
951       if (JUMP_P (insn))
952         {
953           add_reg_note (insn, REG_NON_LOCAL_GOTO, const0_rtx);
954           break;
955         }
956       else if (CALL_P (insn))
957         break;
958     }
959 }
960
961 /* Expand a call to __builtin_nonlocal_goto.  We're passed the target label
962    and the address of the save area.  */
963
964 static rtx
965 expand_builtin_nonlocal_goto (tree exp)
966 {
967   tree t_label, t_save_area;
968   rtx r_label, r_save_area, r_fp, r_sp, insn;
969
970   if (!validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
971     return NULL_RTX;
972
973   t_label = CALL_EXPR_ARG (exp, 0);
974   t_save_area = CALL_EXPR_ARG (exp, 1);
975
976   r_label = expand_normal (t_label);
977   r_label = convert_memory_address (Pmode, r_label);
978   r_save_area = expand_normal (t_save_area);
979   r_save_area = convert_memory_address (Pmode, r_save_area);
980   /* Copy the address of the save location to a register just in case it was based
981     on the frame pointer.   */
982   r_save_area = copy_to_reg (r_save_area);
983   r_fp = gen_rtx_MEM (Pmode, r_save_area);
984   r_sp = gen_rtx_MEM (STACK_SAVEAREA_MODE (SAVE_NONLOCAL),
985                       plus_constant (r_save_area, GET_MODE_SIZE (Pmode)));
986
987   crtl->has_nonlocal_goto = 1;
988
989 #ifdef HAVE_nonlocal_goto
990   /* ??? We no longer need to pass the static chain value, afaik.  */
991   if (HAVE_nonlocal_goto)
992     emit_insn (gen_nonlocal_goto (const0_rtx, r_label, r_sp, r_fp));
993   else
994 #endif
995     {
996       r_label = copy_to_reg (r_label);
997
998       emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
999       emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
1000
1001       /* Restore frame pointer for containing function.
1002          This sets the actual hard register used for the frame pointer
1003          to the location of the function's incoming static chain info.
1004          The non-local goto handler will then adjust it to contain the
1005          proper value and reload the argument pointer, if needed.  */
1006       emit_move_insn (hard_frame_pointer_rtx, r_fp);
1007       emit_stack_restore (SAVE_NONLOCAL, r_sp, NULL_RTX);
1008
1009       /* USE of hard_frame_pointer_rtx added for consistency;
1010          not clear if really needed.  */
1011       emit_use (hard_frame_pointer_rtx);
1012       emit_use (stack_pointer_rtx);
1013
1014       /* If the architecture is using a GP register, we must
1015          conservatively assume that the target function makes use of it.
1016          The prologue of functions with nonlocal gotos must therefore
1017          initialize the GP register to the appropriate value, and we
1018          must then make sure that this value is live at the point
1019          of the jump.  (Note that this doesn't necessarily apply
1020          to targets with a nonlocal_goto pattern; they are free
1021          to implement it in their own way.  Note also that this is
1022          a no-op if the GP register is a global invariant.)  */
1023       if ((unsigned) PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
1024           && fixed_regs[PIC_OFFSET_TABLE_REGNUM])
1025         emit_use (pic_offset_table_rtx);
1026
1027       emit_indirect_jump (r_label);
1028     }
1029
1030   /* Search backwards to the jump insn and mark it as a
1031      non-local goto.  */
1032   for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
1033     {
1034       if (JUMP_P (insn))
1035         {
1036           add_reg_note (insn, REG_NON_LOCAL_GOTO, const0_rtx);
1037           break;
1038         }
1039       else if (CALL_P (insn))
1040         break;
1041     }
1042
1043   return const0_rtx;
1044 }
1045
1046 /* __builtin_update_setjmp_buf is passed a pointer to an array of five words
1047    (not all will be used on all machines) that was passed to __builtin_setjmp.
1048    It updates the stack pointer in that block to correspond to the current
1049    stack pointer.  */
1050
1051 static void
1052 expand_builtin_update_setjmp_buf (rtx buf_addr)
1053 {
1054   enum machine_mode sa_mode = Pmode;
1055   rtx stack_save;
1056
1057
1058 #ifdef HAVE_save_stack_nonlocal
1059   if (HAVE_save_stack_nonlocal)
1060     sa_mode = insn_data[(int) CODE_FOR_save_stack_nonlocal].operand[0].mode;
1061 #endif
1062 #ifdef STACK_SAVEAREA_MODE
1063   sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL);
1064 #endif
1065
1066   stack_save
1067     = gen_rtx_MEM (sa_mode,
1068                    memory_address
1069                    (sa_mode,
1070                     plus_constant (buf_addr, 2 * GET_MODE_SIZE (Pmode))));
1071
1072 #ifdef HAVE_setjmp
1073   if (HAVE_setjmp)
1074     emit_insn (gen_setjmp ());
1075 #endif
1076
1077   emit_stack_save (SAVE_NONLOCAL, &stack_save, NULL_RTX);
1078 }
1079
1080 /* Expand a call to __builtin_prefetch.  For a target that does not support
1081    data prefetch, evaluate the memory address argument in case it has side
1082    effects.  */
1083
1084 static void
1085 expand_builtin_prefetch (tree exp)
1086 {
1087   tree arg0, arg1, arg2;
1088   int nargs;
1089   rtx op0, op1, op2;
1090
1091   if (!validate_arglist (exp, POINTER_TYPE, 0))
1092     return;
1093
1094   arg0 = CALL_EXPR_ARG (exp, 0);
1095
1096   /* Arguments 1 and 2 are optional; argument 1 (read/write) defaults to
1097      zero (read) and argument 2 (locality) defaults to 3 (high degree of
1098      locality).  */
1099   nargs = call_expr_nargs (exp);
1100   if (nargs > 1)
1101     arg1 = CALL_EXPR_ARG (exp, 1);
1102   else
1103     arg1 = integer_zero_node;
1104   if (nargs > 2)
1105     arg2 = CALL_EXPR_ARG (exp, 2);
1106   else
1107     arg2 = integer_three_node;
1108
1109   /* Argument 0 is an address.  */
1110   op0 = expand_expr (arg0, NULL_RTX, Pmode, EXPAND_NORMAL);
1111
1112   /* Argument 1 (read/write flag) must be a compile-time constant int.  */
1113   if (TREE_CODE (arg1) != INTEGER_CST)
1114     {
1115       error ("second argument to %<__builtin_prefetch%> must be a constant");
1116       arg1 = integer_zero_node;
1117     }
1118   op1 = expand_normal (arg1);
1119   /* Argument 1 must be either zero or one.  */
1120   if (INTVAL (op1) != 0 && INTVAL (op1) != 1)
1121     {
1122       warning (0, "invalid second argument to %<__builtin_prefetch%>;"
1123                " using zero");
1124       op1 = const0_rtx;
1125     }
1126
1127   /* Argument 2 (locality) must be a compile-time constant int.  */
1128   if (TREE_CODE (arg2) != INTEGER_CST)
1129     {
1130       error ("third argument to %<__builtin_prefetch%> must be a constant");
1131       arg2 = integer_zero_node;
1132     }
1133   op2 = expand_normal (arg2);
1134   /* Argument 2 must be 0, 1, 2, or 3.  */
1135   if (INTVAL (op2) < 0 || INTVAL (op2) > 3)
1136     {
1137       warning (0, "invalid third argument to %<__builtin_prefetch%>; using zero");
1138       op2 = const0_rtx;
1139     }
1140
1141 #ifdef HAVE_prefetch
1142   if (HAVE_prefetch)
1143     {
1144       if ((! (*insn_data[(int) CODE_FOR_prefetch].operand[0].predicate)
1145              (op0,
1146               insn_data[(int) CODE_FOR_prefetch].operand[0].mode))
1147           || (GET_MODE (op0) != Pmode))
1148         {
1149           op0 = convert_memory_address (Pmode, op0);
1150           op0 = force_reg (Pmode, op0);
1151         }
1152       emit_insn (gen_prefetch (op0, op1, op2));
1153     }
1154 #endif
1155
1156   /* Don't do anything with direct references to volatile memory, but
1157      generate code to handle other side effects.  */
1158   if (!MEM_P (op0) && side_effects_p (op0))
1159     emit_insn (op0);
1160 }
1161
1162 /* Get a MEM rtx for expression EXP which is the address of an operand
1163    to be used in a string instruction (cmpstrsi, movmemsi, ..).  LEN is
1164    the maximum length of the block of memory that might be accessed or
1165    NULL if unknown.  */
1166
1167 static rtx
1168 get_memory_rtx (tree exp, tree len)
1169 {
1170   tree orig_exp = exp;
1171   rtx addr, mem;
1172   HOST_WIDE_INT off;
1173
1174   /* When EXP is not resolved SAVE_EXPR, MEM_ATTRS can be still derived
1175      from its expression, for expr->a.b only <variable>.a.b is recorded.  */
1176   if (TREE_CODE (exp) == SAVE_EXPR && !SAVE_EXPR_RESOLVED_P (exp))
1177     exp = TREE_OPERAND (exp, 0);
1178
1179   addr = expand_expr (orig_exp, NULL_RTX, ptr_mode, EXPAND_NORMAL);
1180   mem = gen_rtx_MEM (BLKmode, memory_address (BLKmode, addr));
1181
1182   /* Get an expression we can use to find the attributes to assign to MEM.
1183      If it is an ADDR_EXPR, use the operand.  Otherwise, dereference it if
1184      we can.  First remove any nops.  */
1185   while (CONVERT_EXPR_P (exp)
1186          && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (exp, 0))))
1187     exp = TREE_OPERAND (exp, 0);
1188
1189   off = 0;
1190   if (TREE_CODE (exp) == POINTER_PLUS_EXPR
1191       && TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
1192       && host_integerp (TREE_OPERAND (exp, 1), 0)
1193       && (off = tree_low_cst (TREE_OPERAND (exp, 1), 0)) > 0)
1194     exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
1195   else if (TREE_CODE (exp) == ADDR_EXPR)
1196     exp = TREE_OPERAND (exp, 0);
1197   else if (POINTER_TYPE_P (TREE_TYPE (exp)))
1198     exp = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (exp)), exp);
1199   else
1200     exp = NULL;
1201
1202   /* Honor attributes derived from exp, except for the alias set
1203      (as builtin stringops may alias with anything) and the size
1204      (as stringops may access multiple array elements).  */
1205   if (exp)
1206     {
1207       set_mem_attributes (mem, exp, 0);
1208
1209       if (off)
1210         mem = adjust_automodify_address_nv (mem, BLKmode, NULL, off);
1211
1212       /* Allow the string and memory builtins to overflow from one
1213          field into another, see http://gcc.gnu.org/PR23561.
1214          Thus avoid COMPONENT_REFs in MEM_EXPR unless we know the whole
1215          memory accessed by the string or memory builtin will fit
1216          within the field.  */
1217       if (MEM_EXPR (mem) && TREE_CODE (MEM_EXPR (mem)) == COMPONENT_REF)
1218         {
1219           tree mem_expr = MEM_EXPR (mem);
1220           HOST_WIDE_INT offset = -1, length = -1;
1221           tree inner = exp;
1222
1223           while (TREE_CODE (inner) == ARRAY_REF
1224                  || CONVERT_EXPR_P (inner)
1225                  || TREE_CODE (inner) == VIEW_CONVERT_EXPR
1226                  || TREE_CODE (inner) == SAVE_EXPR)
1227             inner = TREE_OPERAND (inner, 0);
1228
1229           gcc_assert (TREE_CODE (inner) == COMPONENT_REF);
1230
1231           if (MEM_OFFSET (mem)
1232               && CONST_INT_P (MEM_OFFSET (mem)))
1233             offset = INTVAL (MEM_OFFSET (mem));
1234
1235           if (offset >= 0 && len && host_integerp (len, 0))
1236             length = tree_low_cst (len, 0);
1237
1238           while (TREE_CODE (inner) == COMPONENT_REF)
1239             {
1240               tree field = TREE_OPERAND (inner, 1);
1241               gcc_assert (TREE_CODE (mem_expr) == COMPONENT_REF);
1242               gcc_assert (field == TREE_OPERAND (mem_expr, 1));
1243
1244               /* Bitfields are generally not byte-addressable.  */
1245               gcc_assert (!DECL_BIT_FIELD (field)
1246                           || ((tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 1)
1247                                % BITS_PER_UNIT) == 0
1248                               && host_integerp (DECL_SIZE (field), 0)
1249                               && (TREE_INT_CST_LOW (DECL_SIZE (field))
1250                                   % BITS_PER_UNIT) == 0));
1251
1252               /* If we can prove that the memory starting at XEXP (mem, 0) and
1253                  ending at XEXP (mem, 0) + LENGTH will fit into this field, we
1254                  can keep the COMPONENT_REF in MEM_EXPR.  But be careful with
1255                  fields without DECL_SIZE_UNIT like flexible array members.  */
1256               if (length >= 0
1257                   && DECL_SIZE_UNIT (field)
1258                   && host_integerp (DECL_SIZE_UNIT (field), 0))
1259                 {
1260                   HOST_WIDE_INT size
1261                     = TREE_INT_CST_LOW (DECL_SIZE_UNIT (field));
1262                   if (offset <= size
1263                       && length <= size
1264                       && offset + length <= size)
1265                     break;
1266                 }
1267
1268               if (offset >= 0
1269                   && host_integerp (DECL_FIELD_OFFSET (field), 0))
1270                 offset += TREE_INT_CST_LOW (DECL_FIELD_OFFSET (field))
1271                           + tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 1)
1272                             / BITS_PER_UNIT;
1273               else
1274                 {
1275                   offset = -1;
1276                   length = -1;
1277                 }
1278
1279               mem_expr = TREE_OPERAND (mem_expr, 0);
1280               inner = TREE_OPERAND (inner, 0);
1281             }
1282
1283           if (mem_expr == NULL)
1284             offset = -1;
1285           if (mem_expr != MEM_EXPR (mem))
1286             {
1287               set_mem_expr (mem, mem_expr);
1288               set_mem_offset (mem, offset >= 0 ? GEN_INT (offset) : NULL_RTX);
1289             }
1290         }
1291       set_mem_alias_set (mem, 0);
1292       set_mem_size (mem, NULL_RTX);
1293     }
1294
1295   return mem;
1296 }
1297 \f
1298 /* Built-in functions to perform an untyped call and return.  */
1299
1300 #define apply_args_mode \
1301   (this_target_builtins->x_apply_args_mode)
1302 #define apply_result_mode \
1303   (this_target_builtins->x_apply_result_mode)
1304
1305 /* Return the size required for the block returned by __builtin_apply_args,
1306    and initialize apply_args_mode.  */
1307
1308 static int
1309 apply_args_size (void)
1310 {
1311   static int size = -1;
1312   int align;
1313   unsigned int regno;
1314   enum machine_mode mode;
1315
1316   /* The values computed by this function never change.  */
1317   if (size < 0)
1318     {
1319       /* The first value is the incoming arg-pointer.  */
1320       size = GET_MODE_SIZE (Pmode);
1321
1322       /* The second value is the structure value address unless this is
1323          passed as an "invisible" first argument.  */
1324       if (targetm.calls.struct_value_rtx (cfun ? TREE_TYPE (cfun->decl) : 0, 0))
1325         size += GET_MODE_SIZE (Pmode);
1326
1327       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1328         if (FUNCTION_ARG_REGNO_P (regno))
1329           {
1330             mode = targetm.calls.get_raw_arg_mode (regno);
1331
1332             gcc_assert (mode != VOIDmode);
1333
1334             align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
1335             if (size % align != 0)
1336               size = CEIL (size, align) * align;
1337             size += GET_MODE_SIZE (mode);
1338             apply_args_mode[regno] = mode;
1339           }
1340         else
1341           {
1342             apply_args_mode[regno] = VOIDmode;
1343           }
1344     }
1345   return size;
1346 }
1347
1348 /* Return the size required for the block returned by __builtin_apply,
1349    and initialize apply_result_mode.  */
1350
1351 static int
1352 apply_result_size (void)
1353 {
1354   static int size = -1;
1355   int align, regno;
1356   enum machine_mode mode;
1357
1358   /* The values computed by this function never change.  */
1359   if (size < 0)
1360     {
1361       size = 0;
1362
1363       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1364         if (targetm.calls.function_value_regno_p (regno))
1365           {
1366             mode = targetm.calls.get_raw_result_mode (regno);
1367
1368             gcc_assert (mode != VOIDmode);
1369
1370             align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
1371             if (size % align != 0)
1372               size = CEIL (size, align) * align;
1373             size += GET_MODE_SIZE (mode);
1374             apply_result_mode[regno] = mode;
1375           }
1376         else
1377           apply_result_mode[regno] = VOIDmode;
1378
1379       /* Allow targets that use untyped_call and untyped_return to override
1380          the size so that machine-specific information can be stored here.  */
1381 #ifdef APPLY_RESULT_SIZE
1382       size = APPLY_RESULT_SIZE;
1383 #endif
1384     }
1385   return size;
1386 }
1387
1388 #if defined (HAVE_untyped_call) || defined (HAVE_untyped_return)
1389 /* Create a vector describing the result block RESULT.  If SAVEP is true,
1390    the result block is used to save the values; otherwise it is used to
1391    restore the values.  */
1392
1393 static rtx
1394 result_vector (int savep, rtx result)
1395 {
1396   int regno, size, align, nelts;
1397   enum machine_mode mode;
1398   rtx reg, mem;
1399   rtx *savevec = XALLOCAVEC (rtx, FIRST_PSEUDO_REGISTER);
1400
1401   size = nelts = 0;
1402   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1403     if ((mode = apply_result_mode[regno]) != VOIDmode)
1404       {
1405         align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
1406         if (size % align != 0)
1407           size = CEIL (size, align) * align;
1408         reg = gen_rtx_REG (mode, savep ? regno : INCOMING_REGNO (regno));
1409         mem = adjust_address (result, mode, size);
1410         savevec[nelts++] = (savep
1411                             ? gen_rtx_SET (VOIDmode, mem, reg)
1412                             : gen_rtx_SET (VOIDmode, reg, mem));
1413         size += GET_MODE_SIZE (mode);
1414       }
1415   return gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nelts, savevec));
1416 }
1417 #endif /* HAVE_untyped_call or HAVE_untyped_return */
1418
1419 /* Save the state required to perform an untyped call with the same
1420    arguments as were passed to the current function.  */
1421
1422 static rtx
1423 expand_builtin_apply_args_1 (void)
1424 {
1425   rtx registers, tem;
1426   int size, align, regno;
1427   enum machine_mode mode;
1428   rtx struct_incoming_value = targetm.calls.struct_value_rtx (cfun ? TREE_TYPE (cfun->decl) : 0, 1);
1429
1430   /* Create a block where the arg-pointer, structure value address,
1431      and argument registers can be saved.  */
1432   registers = assign_stack_local (BLKmode, apply_args_size (), -1);
1433
1434   /* Walk past the arg-pointer and structure value address.  */
1435   size = GET_MODE_SIZE (Pmode);
1436   if (targetm.calls.struct_value_rtx (cfun ? TREE_TYPE (cfun->decl) : 0, 0))
1437     size += GET_MODE_SIZE (Pmode);
1438
1439   /* Save each register used in calling a function to the block.  */
1440   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1441     if ((mode = apply_args_mode[regno]) != VOIDmode)
1442       {
1443         align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
1444         if (size % align != 0)
1445           size = CEIL (size, align) * align;
1446
1447         tem = gen_rtx_REG (mode, INCOMING_REGNO (regno));
1448
1449         emit_move_insn (adjust_address (registers, mode, size), tem);
1450         size += GET_MODE_SIZE (mode);
1451       }
1452
1453   /* Save the arg pointer to the block.  */
1454   tem = copy_to_reg (crtl->args.internal_arg_pointer);
1455 #ifdef STACK_GROWS_DOWNWARD
1456   /* We need the pointer as the caller actually passed them to us, not
1457      as we might have pretended they were passed.  Make sure it's a valid
1458      operand, as emit_move_insn isn't expected to handle a PLUS.  */
1459   tem
1460     = force_operand (plus_constant (tem, crtl->args.pretend_args_size),
1461                      NULL_RTX);
1462 #endif
1463   emit_move_insn (adjust_address (registers, Pmode, 0), tem);
1464
1465   size = GET_MODE_SIZE (Pmode);
1466
1467   /* Save the structure value address unless this is passed as an
1468      "invisible" first argument.  */
1469   if (struct_incoming_value)
1470     {
1471       emit_move_insn (adjust_address (registers, Pmode, size),
1472                       copy_to_reg (struct_incoming_value));
1473       size += GET_MODE_SIZE (Pmode);
1474     }
1475
1476   /* Return the address of the block.  */
1477   return copy_addr_to_reg (XEXP (registers, 0));
1478 }
1479
1480 /* __builtin_apply_args returns block of memory allocated on
1481    the stack into which is stored the arg pointer, structure
1482    value address, static chain, and all the registers that might
1483    possibly be used in performing a function call.  The code is
1484    moved to the start of the function so the incoming values are
1485    saved.  */
1486
1487 static rtx
1488 expand_builtin_apply_args (void)
1489 {
1490   /* Don't do __builtin_apply_args more than once in a function.
1491      Save the result of the first call and reuse it.  */
1492   if (apply_args_value != 0)
1493     return apply_args_value;
1494   {
1495     /* When this function is called, it means that registers must be
1496        saved on entry to this function.  So we migrate the
1497        call to the first insn of this function.  */
1498     rtx temp;
1499     rtx seq;
1500
1501     start_sequence ();
1502     temp = expand_builtin_apply_args_1 ();
1503     seq = get_insns ();
1504     end_sequence ();
1505
1506     apply_args_value = temp;
1507
1508     /* Put the insns after the NOTE that starts the function.
1509        If this is inside a start_sequence, make the outer-level insn
1510        chain current, so the code is placed at the start of the
1511        function.  If internal_arg_pointer is a non-virtual pseudo,
1512        it needs to be placed after the function that initializes
1513        that pseudo.  */
1514     push_topmost_sequence ();
1515     if (REG_P (crtl->args.internal_arg_pointer)
1516         && REGNO (crtl->args.internal_arg_pointer) > LAST_VIRTUAL_REGISTER)
1517       emit_insn_before (seq, parm_birth_insn);
1518     else
1519       emit_insn_before (seq, NEXT_INSN (entry_of_function ()));
1520     pop_topmost_sequence ();
1521     return temp;
1522   }
1523 }
1524
1525 /* Perform an untyped call and save the state required to perform an
1526    untyped return of whatever value was returned by the given function.  */
1527
1528 static rtx
1529 expand_builtin_apply (rtx function, rtx arguments, rtx argsize)
1530 {
1531   int size, align, regno;
1532   enum machine_mode mode;
1533   rtx incoming_args, result, reg, dest, src, call_insn;
1534   rtx old_stack_level = 0;
1535   rtx call_fusage = 0;
1536   rtx struct_value = targetm.calls.struct_value_rtx (cfun ? TREE_TYPE (cfun->decl) : 0, 0);
1537
1538   arguments = convert_memory_address (Pmode, arguments);
1539
1540   /* Create a block where the return registers can be saved.  */
1541   result = assign_stack_local (BLKmode, apply_result_size (), -1);
1542
1543   /* Fetch the arg pointer from the ARGUMENTS block.  */
1544   incoming_args = gen_reg_rtx (Pmode);
1545   emit_move_insn (incoming_args, gen_rtx_MEM (Pmode, arguments));
1546 #ifndef STACK_GROWS_DOWNWARD
1547   incoming_args = expand_simple_binop (Pmode, MINUS, incoming_args, argsize,
1548                                        incoming_args, 0, OPTAB_LIB_WIDEN);
1549 #endif
1550
1551   /* Push a new argument block and copy the arguments.  Do not allow
1552      the (potential) memcpy call below to interfere with our stack
1553      manipulations.  */
1554   do_pending_stack_adjust ();
1555   NO_DEFER_POP;
1556
1557   /* Save the stack with nonlocal if available.  */
1558 #ifdef HAVE_save_stack_nonlocal
1559   if (HAVE_save_stack_nonlocal)
1560     emit_stack_save (SAVE_NONLOCAL, &old_stack_level, NULL_RTX);
1561   else
1562 #endif
1563     emit_stack_save (SAVE_BLOCK, &old_stack_level, NULL_RTX);
1564
1565   /* Allocate a block of memory onto the stack and copy the memory
1566      arguments to the outgoing arguments address.  We can pass TRUE
1567      as the 4th argument because we just saved the stack pointer
1568      and will restore it right after the call.  */
1569   allocate_dynamic_stack_space (argsize, 0, BIGGEST_ALIGNMENT, true);
1570
1571   /* Set DRAP flag to true, even though allocate_dynamic_stack_space
1572      may have already set current_function_calls_alloca to true.
1573      current_function_calls_alloca won't be set if argsize is zero,
1574      so we have to guarantee need_drap is true here.  */
1575   if (SUPPORTS_STACK_ALIGNMENT)
1576     crtl->need_drap = true;
1577
1578   dest = virtual_outgoing_args_rtx;
1579 #ifndef STACK_GROWS_DOWNWARD
1580   if (CONST_INT_P (argsize))
1581     dest = plus_constant (dest, -INTVAL (argsize));
1582   else
1583     dest = gen_rtx_PLUS (Pmode, dest, negate_rtx (Pmode, argsize));
1584 #endif
1585   dest = gen_rtx_MEM (BLKmode, dest);
1586   set_mem_align (dest, PARM_BOUNDARY);
1587   src = gen_rtx_MEM (BLKmode, incoming_args);
1588   set_mem_align (src, PARM_BOUNDARY);
1589   emit_block_move (dest, src, argsize, BLOCK_OP_NORMAL);
1590
1591   /* Refer to the argument block.  */
1592   apply_args_size ();
1593   arguments = gen_rtx_MEM (BLKmode, arguments);
1594   set_mem_align (arguments, PARM_BOUNDARY);
1595
1596   /* Walk past the arg-pointer and structure value address.  */
1597   size = GET_MODE_SIZE (Pmode);
1598   if (struct_value)
1599     size += GET_MODE_SIZE (Pmode);
1600
1601   /* Restore each of the registers previously saved.  Make USE insns
1602      for each of these registers for use in making the call.  */
1603   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1604     if ((mode = apply_args_mode[regno]) != VOIDmode)
1605       {
1606         align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
1607         if (size % align != 0)
1608           size = CEIL (size, align) * align;
1609         reg = gen_rtx_REG (mode, regno);
1610         emit_move_insn (reg, adjust_address (arguments, mode, size));
1611         use_reg (&call_fusage, reg);
1612         size += GET_MODE_SIZE (mode);
1613       }
1614
1615   /* Restore the structure value address unless this is passed as an
1616      "invisible" first argument.  */
1617   size = GET_MODE_SIZE (Pmode);
1618   if (struct_value)
1619     {
1620       rtx value = gen_reg_rtx (Pmode);
1621       emit_move_insn (value, adjust_address (arguments, Pmode, size));
1622       emit_move_insn (struct_value, value);
1623       if (REG_P (struct_value))
1624         use_reg (&call_fusage, struct_value);
1625       size += GET_MODE_SIZE (Pmode);
1626     }
1627
1628   /* All arguments and registers used for the call are set up by now!  */
1629   function = prepare_call_address (NULL, function, NULL, &call_fusage, 0, 0);
1630
1631   /* Ensure address is valid.  SYMBOL_REF is already valid, so no need,
1632      and we don't want to load it into a register as an optimization,
1633      because prepare_call_address already did it if it should be done.  */
1634   if (GET_CODE (function) != SYMBOL_REF)
1635     function = memory_address (FUNCTION_MODE, function);
1636
1637   /* Generate the actual call instruction and save the return value.  */
1638 #ifdef HAVE_untyped_call
1639   if (HAVE_untyped_call)
1640     emit_call_insn (gen_untyped_call (gen_rtx_MEM (FUNCTION_MODE, function),
1641                                       result, result_vector (1, result)));
1642   else
1643 #endif
1644 #ifdef HAVE_call_value
1645   if (HAVE_call_value)
1646     {
1647       rtx valreg = 0;
1648
1649       /* Locate the unique return register.  It is not possible to
1650          express a call that sets more than one return register using
1651          call_value; use untyped_call for that.  In fact, untyped_call
1652          only needs to save the return registers in the given block.  */
1653       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1654         if ((mode = apply_result_mode[regno]) != VOIDmode)
1655           {
1656             gcc_assert (!valreg); /* HAVE_untyped_call required.  */
1657
1658             valreg = gen_rtx_REG (mode, regno);
1659           }
1660
1661       emit_call_insn (GEN_CALL_VALUE (valreg,
1662                                       gen_rtx_MEM (FUNCTION_MODE, function),
1663                                       const0_rtx, NULL_RTX, const0_rtx));
1664
1665       emit_move_insn (adjust_address (result, GET_MODE (valreg), 0), valreg);
1666     }
1667   else
1668 #endif
1669     gcc_unreachable ();
1670
1671   /* Find the CALL insn we just emitted, and attach the register usage
1672      information.  */
1673   call_insn = last_call_insn ();
1674   add_function_usage_to (call_insn, call_fusage);
1675
1676   /* Restore the stack.  */
1677 #ifdef HAVE_save_stack_nonlocal
1678   if (HAVE_save_stack_nonlocal)
1679     emit_stack_restore (SAVE_NONLOCAL, old_stack_level, NULL_RTX);
1680   else
1681 #endif
1682     emit_stack_restore (SAVE_BLOCK, old_stack_level, NULL_RTX);
1683
1684   OK_DEFER_POP;
1685
1686   /* Return the address of the result block.  */
1687   result = copy_addr_to_reg (XEXP (result, 0));
1688   return convert_memory_address (ptr_mode, result);
1689 }
1690
1691 /* Perform an untyped return.  */
1692
1693 static void
1694 expand_builtin_return (rtx result)
1695 {
1696   int size, align, regno;
1697   enum machine_mode mode;
1698   rtx reg;
1699   rtx call_fusage = 0;
1700
1701   result = convert_memory_address (Pmode, result);
1702
1703   apply_result_size ();
1704   result = gen_rtx_MEM (BLKmode, result);
1705
1706 #ifdef HAVE_untyped_return
1707   if (HAVE_untyped_return)
1708     {
1709       emit_jump_insn (gen_untyped_return (result, result_vector (0, result)));
1710       emit_barrier ();
1711       return;
1712     }
1713 #endif
1714
1715   /* Restore the return value and note that each value is used.  */
1716   size = 0;
1717   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1718     if ((mode = apply_result_mode[regno]) != VOIDmode)
1719       {
1720         align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
1721         if (size % align != 0)
1722           size = CEIL (size, align) * align;
1723         reg = gen_rtx_REG (mode, INCOMING_REGNO (regno));
1724         emit_move_insn (reg, adjust_address (result, mode, size));
1725
1726         push_to_sequence (call_fusage);
1727         emit_use (reg);
1728         call_fusage = get_insns ();
1729         end_sequence ();
1730         size += GET_MODE_SIZE (mode);
1731       }
1732
1733   /* Put the USE insns before the return.  */
1734   emit_insn (call_fusage);
1735
1736   /* Return whatever values was restored by jumping directly to the end
1737      of the function.  */
1738   expand_naked_return ();
1739 }
1740
1741 /* Used by expand_builtin_classify_type and fold_builtin_classify_type.  */
1742
1743 static enum type_class
1744 type_to_class (tree type)
1745 {
1746   switch (TREE_CODE (type))
1747     {
1748     case VOID_TYPE:        return void_type_class;
1749     case INTEGER_TYPE:     return integer_type_class;
1750     case ENUMERAL_TYPE:    return enumeral_type_class;
1751     case BOOLEAN_TYPE:     return boolean_type_class;
1752     case POINTER_TYPE:     return pointer_type_class;
1753     case REFERENCE_TYPE:   return reference_type_class;
1754     case OFFSET_TYPE:      return offset_type_class;
1755     case REAL_TYPE:        return real_type_class;
1756     case COMPLEX_TYPE:     return complex_type_class;
1757     case FUNCTION_TYPE:    return function_type_class;
1758     case METHOD_TYPE:      return method_type_class;
1759     case RECORD_TYPE:      return record_type_class;
1760     case UNION_TYPE:
1761     case QUAL_UNION_TYPE:  return union_type_class;
1762     case ARRAY_TYPE:       return (TYPE_STRING_FLAG (type)
1763                                    ? string_type_class : array_type_class);
1764     case LANG_TYPE:        return lang_type_class;
1765     default:               return no_type_class;
1766     }
1767 }
1768
1769 /* Expand a call EXP to __builtin_classify_type.  */
1770
1771 static rtx
1772 expand_builtin_classify_type (tree exp)
1773 {
1774   if (call_expr_nargs (exp))
1775     return GEN_INT (type_to_class (TREE_TYPE (CALL_EXPR_ARG (exp, 0))));
1776   return GEN_INT (no_type_class);
1777 }
1778
1779 /* This helper macro, meant to be used in mathfn_built_in below,
1780    determines which among a set of three builtin math functions is
1781    appropriate for a given type mode.  The `F' and `L' cases are
1782    automatically generated from the `double' case.  */
1783 #define CASE_MATHFN(BUILT_IN_MATHFN) \
1784   case BUILT_IN_MATHFN: case BUILT_IN_MATHFN##F: case BUILT_IN_MATHFN##L: \
1785   fcode = BUILT_IN_MATHFN; fcodef = BUILT_IN_MATHFN##F ; \
1786   fcodel = BUILT_IN_MATHFN##L ; break;
1787 /* Similar to above, but appends _R after any F/L suffix.  */
1788 #define CASE_MATHFN_REENT(BUILT_IN_MATHFN) \
1789   case BUILT_IN_MATHFN##_R: case BUILT_IN_MATHFN##F_R: case BUILT_IN_MATHFN##L_R: \
1790   fcode = BUILT_IN_MATHFN##_R; fcodef = BUILT_IN_MATHFN##F_R ; \
1791   fcodel = BUILT_IN_MATHFN##L_R ; break;
1792
1793 /* Return mathematic function equivalent to FN but operating directly
1794    on TYPE, if available.  If IMPLICIT is true find the function in
1795    implicit_built_in_decls[], otherwise use built_in_decls[].  If we
1796    can't do the conversion, return zero.  */
1797
1798 static tree
1799 mathfn_built_in_1 (tree type, enum built_in_function fn, bool implicit)
1800 {
1801   tree const *const fn_arr
1802     = implicit ? implicit_built_in_decls : built_in_decls;
1803   enum built_in_function fcode, fcodef, fcodel;
1804
1805   switch (fn)
1806     {
1807       CASE_MATHFN (BUILT_IN_ACOS)
1808       CASE_MATHFN (BUILT_IN_ACOSH)
1809       CASE_MATHFN (BUILT_IN_ASIN)
1810       CASE_MATHFN (BUILT_IN_ASINH)
1811       CASE_MATHFN (BUILT_IN_ATAN)
1812       CASE_MATHFN (BUILT_IN_ATAN2)
1813       CASE_MATHFN (BUILT_IN_ATANH)
1814       CASE_MATHFN (BUILT_IN_CBRT)
1815       CASE_MATHFN (BUILT_IN_CEIL)
1816       CASE_MATHFN (BUILT_IN_CEXPI)
1817       CASE_MATHFN (BUILT_IN_COPYSIGN)
1818       CASE_MATHFN (BUILT_IN_COS)
1819       CASE_MATHFN (BUILT_IN_COSH)
1820       CASE_MATHFN (BUILT_IN_DREM)
1821       CASE_MATHFN (BUILT_IN_ERF)
1822       CASE_MATHFN (BUILT_IN_ERFC)
1823       CASE_MATHFN (BUILT_IN_EXP)
1824       CASE_MATHFN (BUILT_IN_EXP10)
1825       CASE_MATHFN (BUILT_IN_EXP2)
1826       CASE_MATHFN (BUILT_IN_EXPM1)
1827       CASE_MATHFN (BUILT_IN_FABS)
1828       CASE_MATHFN (BUILT_IN_FDIM)
1829       CASE_MATHFN (BUILT_IN_FLOOR)
1830       CASE_MATHFN (BUILT_IN_FMA)
1831       CASE_MATHFN (BUILT_IN_FMAX)
1832       CASE_MATHFN (BUILT_IN_FMIN)
1833       CASE_MATHFN (BUILT_IN_FMOD)
1834       CASE_MATHFN (BUILT_IN_FREXP)
1835       CASE_MATHFN (BUILT_IN_GAMMA)
1836       CASE_MATHFN_REENT (BUILT_IN_GAMMA) /* GAMMA_R */
1837       CASE_MATHFN (BUILT_IN_HUGE_VAL)
1838       CASE_MATHFN (BUILT_IN_HYPOT)
1839       CASE_MATHFN (BUILT_IN_ILOGB)
1840       CASE_MATHFN (BUILT_IN_INF)
1841       CASE_MATHFN (BUILT_IN_ISINF)
1842       CASE_MATHFN (BUILT_IN_J0)
1843       CASE_MATHFN (BUILT_IN_J1)
1844       CASE_MATHFN (BUILT_IN_JN)
1845       CASE_MATHFN (BUILT_IN_LCEIL)
1846       CASE_MATHFN (BUILT_IN_LDEXP)
1847       CASE_MATHFN (BUILT_IN_LFLOOR)
1848       CASE_MATHFN (BUILT_IN_LGAMMA)
1849       CASE_MATHFN_REENT (BUILT_IN_LGAMMA) /* LGAMMA_R */
1850       CASE_MATHFN (BUILT_IN_LLCEIL)
1851       CASE_MATHFN (BUILT_IN_LLFLOOR)
1852       CASE_MATHFN (BUILT_IN_LLRINT)
1853       CASE_MATHFN (BUILT_IN_LLROUND)
1854       CASE_MATHFN (BUILT_IN_LOG)
1855       CASE_MATHFN (BUILT_IN_LOG10)
1856       CASE_MATHFN (BUILT_IN_LOG1P)
1857       CASE_MATHFN (BUILT_IN_LOG2)
1858       CASE_MATHFN (BUILT_IN_LOGB)
1859       CASE_MATHFN (BUILT_IN_LRINT)
1860       CASE_MATHFN (BUILT_IN_LROUND)
1861       CASE_MATHFN (BUILT_IN_MODF)
1862       CASE_MATHFN (BUILT_IN_NAN)
1863       CASE_MATHFN (BUILT_IN_NANS)
1864       CASE_MATHFN (BUILT_IN_NEARBYINT)
1865       CASE_MATHFN (BUILT_IN_NEXTAFTER)
1866       CASE_MATHFN (BUILT_IN_NEXTTOWARD)
1867       CASE_MATHFN (BUILT_IN_POW)
1868       CASE_MATHFN (BUILT_IN_POWI)
1869       CASE_MATHFN (BUILT_IN_POW10)
1870       CASE_MATHFN (BUILT_IN_REMAINDER)
1871       CASE_MATHFN (BUILT_IN_REMQUO)
1872       CASE_MATHFN (BUILT_IN_RINT)
1873       CASE_MATHFN (BUILT_IN_ROUND)
1874       CASE_MATHFN (BUILT_IN_SCALB)
1875       CASE_MATHFN (BUILT_IN_SCALBLN)
1876       CASE_MATHFN (BUILT_IN_SCALBN)
1877       CASE_MATHFN (BUILT_IN_SIGNBIT)
1878       CASE_MATHFN (BUILT_IN_SIGNIFICAND)
1879       CASE_MATHFN (BUILT_IN_SIN)
1880       CASE_MATHFN (BUILT_IN_SINCOS)
1881       CASE_MATHFN (BUILT_IN_SINH)
1882       CASE_MATHFN (BUILT_IN_SQRT)
1883       CASE_MATHFN (BUILT_IN_TAN)
1884       CASE_MATHFN (BUILT_IN_TANH)
1885       CASE_MATHFN (BUILT_IN_TGAMMA)
1886       CASE_MATHFN (BUILT_IN_TRUNC)
1887       CASE_MATHFN (BUILT_IN_Y0)
1888       CASE_MATHFN (BUILT_IN_Y1)
1889       CASE_MATHFN (BUILT_IN_YN)
1890
1891       default:
1892         return NULL_TREE;
1893       }
1894
1895   if (TYPE_MAIN_VARIANT (type) == double_type_node)
1896     return fn_arr[fcode];
1897   else if (TYPE_MAIN_VARIANT (type) == float_type_node)
1898     return fn_arr[fcodef];
1899   else if (TYPE_MAIN_VARIANT (type) == long_double_type_node)
1900     return fn_arr[fcodel];
1901   else
1902     return NULL_TREE;
1903 }
1904
1905 /* Like mathfn_built_in_1(), but always use the implicit array.  */
1906
1907 tree
1908 mathfn_built_in (tree type, enum built_in_function fn)
1909 {
1910   return mathfn_built_in_1 (type, fn, /*implicit=*/ 1);
1911 }
1912
1913 /* If errno must be maintained, expand the RTL to check if the result,
1914    TARGET, of a built-in function call, EXP, is NaN, and if so set
1915    errno to EDOM.  */
1916
1917 static void
1918 expand_errno_check (tree exp, rtx target)
1919 {
1920   rtx lab = gen_label_rtx ();
1921
1922   /* Test the result; if it is NaN, set errno=EDOM because
1923      the argument was not in the domain.  */
1924   do_compare_rtx_and_jump (target, target, EQ, 0, GET_MODE (target),
1925                            NULL_RTX, NULL_RTX, lab,
1926                            /* The jump is very likely.  */
1927                            REG_BR_PROB_BASE - (REG_BR_PROB_BASE / 2000 - 1));
1928
1929 #ifdef TARGET_EDOM
1930   /* If this built-in doesn't throw an exception, set errno directly.  */
1931   if (TREE_NOTHROW (TREE_OPERAND (CALL_EXPR_FN (exp), 0)))
1932     {
1933 #ifdef GEN_ERRNO_RTX
1934       rtx errno_rtx = GEN_ERRNO_RTX;
1935 #else
1936       rtx errno_rtx
1937           = gen_rtx_MEM (word_mode, gen_rtx_SYMBOL_REF (Pmode, "errno"));
1938 #endif
1939       emit_move_insn (errno_rtx, GEN_INT (TARGET_EDOM));
1940       emit_label (lab);
1941       return;
1942     }
1943 #endif
1944
1945   /* Make sure the library call isn't expanded as a tail call.  */
1946   CALL_EXPR_TAILCALL (exp) = 0;
1947
1948   /* We can't set errno=EDOM directly; let the library call do it.
1949      Pop the arguments right away in case the call gets deleted.  */
1950   NO_DEFER_POP;
1951   expand_call (exp, target, 0);
1952   OK_DEFER_POP;
1953   emit_label (lab);
1954 }
1955
1956 /* Expand a call to one of the builtin math functions (sqrt, exp, or log).
1957    Return NULL_RTX if a normal call should be emitted rather than expanding
1958    the function in-line.  EXP is the expression that is a call to the builtin
1959    function; if convenient, the result should be placed in TARGET.
1960    SUBTARGET may be used as the target for computing one of EXP's operands.  */
1961
1962 static rtx
1963 expand_builtin_mathfn (tree exp, rtx target, rtx subtarget)
1964 {
1965   optab builtin_optab;
1966   rtx op0, insns;
1967   tree fndecl = get_callee_fndecl (exp);
1968   enum machine_mode mode;
1969   bool errno_set = false;
1970   tree arg;
1971
1972   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
1973     return NULL_RTX;
1974
1975   arg = CALL_EXPR_ARG (exp, 0);
1976
1977   switch (DECL_FUNCTION_CODE (fndecl))
1978     {
1979     CASE_FLT_FN (BUILT_IN_SQRT):
1980       errno_set = ! tree_expr_nonnegative_p (arg);
1981       builtin_optab = sqrt_optab;
1982       break;
1983     CASE_FLT_FN (BUILT_IN_EXP):
1984       errno_set = true; builtin_optab = exp_optab; break;
1985     CASE_FLT_FN (BUILT_IN_EXP10):
1986     CASE_FLT_FN (BUILT_IN_POW10):
1987       errno_set = true; builtin_optab = exp10_optab; break;
1988     CASE_FLT_FN (BUILT_IN_EXP2):
1989       errno_set = true; builtin_optab = exp2_optab; break;
1990     CASE_FLT_FN (BUILT_IN_EXPM1):
1991       errno_set = true; builtin_optab = expm1_optab; break;
1992     CASE_FLT_FN (BUILT_IN_LOGB):
1993       errno_set = true; builtin_optab = logb_optab; break;
1994     CASE_FLT_FN (BUILT_IN_LOG):
1995       errno_set = true; builtin_optab = log_optab; break;
1996     CASE_FLT_FN (BUILT_IN_LOG10):
1997       errno_set = true; builtin_optab = log10_optab; break;
1998     CASE_FLT_FN (BUILT_IN_LOG2):
1999       errno_set = true; builtin_optab = log2_optab; break;
2000     CASE_FLT_FN (BUILT_IN_LOG1P):
2001       errno_set = true; builtin_optab = log1p_optab; break;
2002     CASE_FLT_FN (BUILT_IN_ASIN):
2003       builtin_optab = asin_optab; break;
2004     CASE_FLT_FN (BUILT_IN_ACOS):
2005       builtin_optab = acos_optab; break;
2006     CASE_FLT_FN (BUILT_IN_TAN):
2007       builtin_optab = tan_optab; break;
2008     CASE_FLT_FN (BUILT_IN_ATAN):
2009       builtin_optab = atan_optab; break;
2010     CASE_FLT_FN (BUILT_IN_FLOOR):
2011       builtin_optab = floor_optab; break;
2012     CASE_FLT_FN (BUILT_IN_CEIL):
2013       builtin_optab = ceil_optab; break;
2014     CASE_FLT_FN (BUILT_IN_TRUNC):
2015       builtin_optab = btrunc_optab; break;
2016     CASE_FLT_FN (BUILT_IN_ROUND):
2017       builtin_optab = round_optab; break;
2018     CASE_FLT_FN (BUILT_IN_NEARBYINT):
2019       builtin_optab = nearbyint_optab;
2020       if (flag_trapping_math)
2021         break;
2022       /* Else fallthrough and expand as rint.  */
2023     CASE_FLT_FN (BUILT_IN_RINT):
2024       builtin_optab = rint_optab; break;
2025     CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
2026       builtin_optab = significand_optab; break;
2027     default:
2028       gcc_unreachable ();
2029     }
2030
2031   /* Make a suitable register to place result in.  */
2032   mode = TYPE_MODE (TREE_TYPE (exp));
2033
2034   if (! flag_errno_math || ! HONOR_NANS (mode))
2035     errno_set = false;
2036
2037   /* Before working hard, check whether the instruction is available.  */
2038   if (optab_handler (builtin_optab, mode) != CODE_FOR_nothing
2039       && (!errno_set || !optimize_insn_for_size_p ()))
2040     {
2041       target = gen_reg_rtx (mode);
2042
2043       /* Wrap the computation of the argument in a SAVE_EXPR, as we may
2044          need to expand the argument again.  This way, we will not perform
2045          side-effects more the once.  */
2046       CALL_EXPR_ARG (exp, 0) = arg = builtin_save_expr (arg);
2047
2048       op0 = expand_expr (arg, subtarget, VOIDmode, EXPAND_NORMAL);
2049
2050       start_sequence ();
2051
2052       /* Compute into TARGET.
2053          Set TARGET to wherever the result comes back.  */
2054       target = expand_unop (mode, builtin_optab, op0, target, 0);
2055
2056       if (target != 0)
2057         {
2058           if (errno_set)
2059             expand_errno_check (exp, target);
2060
2061           /* Output the entire sequence.  */
2062           insns = get_insns ();
2063           end_sequence ();
2064           emit_insn (insns);
2065           return target;
2066         }
2067
2068       /* If we were unable to expand via the builtin, stop the sequence
2069          (without outputting the insns) and call to the library function
2070          with the stabilized argument list.  */
2071       end_sequence ();
2072     }
2073
2074   return expand_call (exp, target, target == const0_rtx);
2075 }
2076
2077 /* Expand a call to the builtin binary math functions (pow and atan2).
2078    Return NULL_RTX if a normal call should be emitted rather than expanding the
2079    function in-line.  EXP is the expression that is a call to the builtin
2080    function; if convenient, the result should be placed in TARGET.
2081    SUBTARGET may be used as the target for computing one of EXP's
2082    operands.  */
2083
2084 static rtx
2085 expand_builtin_mathfn_2 (tree exp, rtx target, rtx subtarget)
2086 {
2087   optab builtin_optab;
2088   rtx op0, op1, insns;
2089   int op1_type = REAL_TYPE;
2090   tree fndecl = get_callee_fndecl (exp);
2091   tree arg0, arg1;
2092   enum machine_mode mode;
2093   bool errno_set = true;
2094
2095   switch (DECL_FUNCTION_CODE (fndecl))
2096     {
2097     CASE_FLT_FN (BUILT_IN_SCALBN):
2098     CASE_FLT_FN (BUILT_IN_SCALBLN):
2099     CASE_FLT_FN (BUILT_IN_LDEXP):
2100       op1_type = INTEGER_TYPE;
2101     default:
2102       break;
2103     }
2104
2105   if (!validate_arglist (exp, REAL_TYPE, op1_type, VOID_TYPE))
2106     return NULL_RTX;
2107
2108   arg0 = CALL_EXPR_ARG (exp, 0);
2109   arg1 = CALL_EXPR_ARG (exp, 1);
2110
2111   switch (DECL_FUNCTION_CODE (fndecl))
2112     {
2113     CASE_FLT_FN (BUILT_IN_POW):
2114       builtin_optab = pow_optab; break;
2115     CASE_FLT_FN (BUILT_IN_ATAN2):
2116       builtin_optab = atan2_optab; break;
2117     CASE_FLT_FN (BUILT_IN_SCALB):
2118       if (REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (exp)))->b != 2)
2119         return 0;
2120       builtin_optab = scalb_optab; break;
2121     CASE_FLT_FN (BUILT_IN_SCALBN):
2122     CASE_FLT_FN (BUILT_IN_SCALBLN):
2123       if (REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (exp)))->b != 2)
2124         return 0;
2125     /* Fall through... */
2126     CASE_FLT_FN (BUILT_IN_LDEXP):
2127       builtin_optab = ldexp_optab; break;
2128     CASE_FLT_FN (BUILT_IN_FMOD):
2129       builtin_optab = fmod_optab; break;
2130     CASE_FLT_FN (BUILT_IN_REMAINDER):
2131     CASE_FLT_FN (BUILT_IN_DREM):
2132       builtin_optab = remainder_optab; break;
2133     default:
2134       gcc_unreachable ();
2135     }
2136
2137   /* Make a suitable register to place result in.  */
2138   mode = TYPE_MODE (TREE_TYPE (exp));
2139
2140   /* Before working hard, check whether the instruction is available.  */
2141   if (optab_handler (builtin_optab, mode) == CODE_FOR_nothing)
2142     return NULL_RTX;
2143
2144   target = gen_reg_rtx (mode);
2145
2146   if (! flag_errno_math || ! HONOR_NANS (mode))
2147     errno_set = false;
2148
2149   if (errno_set && optimize_insn_for_size_p ())
2150     return 0;
2151
2152   /* Always stabilize the argument list.  */
2153   CALL_EXPR_ARG (exp, 0) = arg0 = builtin_save_expr (arg0);
2154   CALL_EXPR_ARG (exp, 1) = arg1 = builtin_save_expr (arg1);
2155
2156   op0 = expand_expr (arg0, subtarget, VOIDmode, EXPAND_NORMAL);
2157   op1 = expand_normal (arg1);
2158
2159   start_sequence ();
2160
2161   /* Compute into TARGET.
2162      Set TARGET to wherever the result comes back.  */
2163   target = expand_binop (mode, builtin_optab, op0, op1,
2164                          target, 0, OPTAB_DIRECT);
2165
2166   /* If we were unable to expand via the builtin, stop the sequence
2167      (without outputting the insns) and call to the library function
2168      with the stabilized argument list.  */
2169   if (target == 0)
2170     {
2171       end_sequence ();
2172       return expand_call (exp, target, target == const0_rtx);
2173     }
2174
2175   if (errno_set)
2176     expand_errno_check (exp, target);
2177
2178   /* Output the entire sequence.  */
2179   insns = get_insns ();
2180   end_sequence ();
2181   emit_insn (insns);
2182
2183   return target;
2184 }
2185
2186 /* Expand a call to the builtin trinary math functions (fma).
2187    Return NULL_RTX if a normal call should be emitted rather than expanding the
2188    function in-line.  EXP is the expression that is a call to the builtin
2189    function; if convenient, the result should be placed in TARGET.
2190    SUBTARGET may be used as the target for computing one of EXP's
2191    operands.  */
2192
2193 static rtx
2194 expand_builtin_mathfn_ternary (tree exp, rtx target, rtx subtarget)
2195 {
2196   optab builtin_optab;
2197   rtx op0, op1, op2, insns;
2198   tree fndecl = get_callee_fndecl (exp);
2199   tree arg0, arg1, arg2;
2200   enum machine_mode mode;
2201
2202   if (!validate_arglist (exp, REAL_TYPE, REAL_TYPE, REAL_TYPE, VOID_TYPE))
2203     return NULL_RTX;
2204
2205   arg0 = CALL_EXPR_ARG (exp, 0);
2206   arg1 = CALL_EXPR_ARG (exp, 1);
2207   arg2 = CALL_EXPR_ARG (exp, 2);
2208
2209   switch (DECL_FUNCTION_CODE (fndecl))
2210     {
2211     CASE_FLT_FN (BUILT_IN_FMA):
2212       builtin_optab = fma_optab; break;
2213     default:
2214       gcc_unreachable ();
2215     }
2216
2217   /* Make a suitable register to place result in.  */
2218   mode = TYPE_MODE (TREE_TYPE (exp));
2219
2220   /* Before working hard, check whether the instruction is available.  */
2221   if (optab_handler (builtin_optab, mode) == CODE_FOR_nothing)
2222     return NULL_RTX;
2223
2224   target = gen_reg_rtx (mode);
2225
2226   /* Always stabilize the argument list.  */
2227   CALL_EXPR_ARG (exp, 0) = arg0 = builtin_save_expr (arg0);
2228   CALL_EXPR_ARG (exp, 1) = arg1 = builtin_save_expr (arg1);
2229   CALL_EXPR_ARG (exp, 2) = arg2 = builtin_save_expr (arg2);
2230
2231   op0 = expand_expr (arg0, subtarget, VOIDmode, EXPAND_NORMAL);
2232   op1 = expand_normal (arg1);
2233   op2 = expand_normal (arg2);
2234
2235   start_sequence ();
2236
2237   /* Compute into TARGET.
2238      Set TARGET to wherever the result comes back.  */
2239   target = expand_ternary_op (mode, builtin_optab, op0, op1, op2,
2240                               target, 0);
2241
2242   /* If we were unable to expand via the builtin, stop the sequence
2243      (without outputting the insns) and call to the library function
2244      with the stabilized argument list.  */
2245   if (target == 0)
2246     {
2247       end_sequence ();
2248       return expand_call (exp, target, target == const0_rtx);
2249     }
2250
2251   /* Output the entire sequence.  */
2252   insns = get_insns ();
2253   end_sequence ();
2254   emit_insn (insns);
2255
2256   return target;
2257 }
2258
2259 /* Expand a call to the builtin sin and cos math functions.
2260    Return NULL_RTX if a normal call should be emitted rather than expanding the
2261    function in-line.  EXP is the expression that is a call to the builtin
2262    function; if convenient, the result should be placed in TARGET.
2263    SUBTARGET may be used as the target for computing one of EXP's
2264    operands.  */
2265
2266 static rtx
2267 expand_builtin_mathfn_3 (tree exp, rtx target, rtx subtarget)
2268 {
2269   optab builtin_optab;
2270   rtx op0, insns;
2271   tree fndecl = get_callee_fndecl (exp);
2272   enum machine_mode mode;
2273   tree arg;
2274
2275   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
2276     return NULL_RTX;
2277
2278   arg = CALL_EXPR_ARG (exp, 0);
2279
2280   switch (DECL_FUNCTION_CODE (fndecl))
2281     {
2282     CASE_FLT_FN (BUILT_IN_SIN):
2283     CASE_FLT_FN (BUILT_IN_COS):
2284       builtin_optab = sincos_optab; break;
2285     default:
2286       gcc_unreachable ();
2287     }
2288
2289   /* Make a suitable register to place result in.  */
2290   mode = TYPE_MODE (TREE_TYPE (exp));
2291
2292   /* Check if sincos insn is available, otherwise fallback
2293      to sin or cos insn.  */
2294   if (optab_handler (builtin_optab, mode) == CODE_FOR_nothing)
2295     switch (DECL_FUNCTION_CODE (fndecl))
2296       {
2297       CASE_FLT_FN (BUILT_IN_SIN):
2298         builtin_optab = sin_optab; break;
2299       CASE_FLT_FN (BUILT_IN_COS):
2300         builtin_optab = cos_optab; break;
2301       default:
2302         gcc_unreachable ();
2303       }
2304
2305   /* Before working hard, check whether the instruction is available.  */
2306   if (optab_handler (builtin_optab, mode) != CODE_FOR_nothing)
2307     {
2308       target = gen_reg_rtx (mode);
2309
2310       /* Wrap the computation of the argument in a SAVE_EXPR, as we may
2311          need to expand the argument again.  This way, we will not perform
2312          side-effects more the once.  */
2313       CALL_EXPR_ARG (exp, 0) = arg = builtin_save_expr (arg);
2314
2315       op0 = expand_expr (arg, subtarget, VOIDmode, EXPAND_NORMAL);
2316
2317       start_sequence ();
2318
2319       /* Compute into TARGET.
2320          Set TARGET to wherever the result comes back.  */
2321       if (builtin_optab == sincos_optab)
2322         {
2323           int result;
2324
2325           switch (DECL_FUNCTION_CODE (fndecl))
2326             {
2327             CASE_FLT_FN (BUILT_IN_SIN):
2328               result = expand_twoval_unop (builtin_optab, op0, 0, target, 0);
2329               break;
2330             CASE_FLT_FN (BUILT_IN_COS):
2331               result = expand_twoval_unop (builtin_optab, op0, target, 0, 0);
2332               break;
2333             default:
2334               gcc_unreachable ();
2335             }
2336           gcc_assert (result);
2337         }
2338       else
2339         {
2340           target = expand_unop (mode, builtin_optab, op0, target, 0);
2341         }
2342
2343       if (target != 0)
2344         {
2345           /* Output the entire sequence.  */
2346           insns = get_insns ();
2347           end_sequence ();
2348           emit_insn (insns);
2349           return target;
2350         }
2351
2352       /* If we were unable to expand via the builtin, stop the sequence
2353          (without outputting the insns) and call to the library function
2354          with the stabilized argument list.  */
2355       end_sequence ();
2356     }
2357
2358   target = expand_call (exp, target, target == const0_rtx);
2359
2360   return target;
2361 }
2362
2363 /* Given an interclass math builtin decl FNDECL and it's argument ARG
2364    return an RTL instruction code that implements the functionality.
2365    If that isn't possible or available return CODE_FOR_nothing.  */
2366
2367 static enum insn_code
2368 interclass_mathfn_icode (tree arg, tree fndecl)
2369 {
2370   bool errno_set = false;
2371   optab builtin_optab = 0;
2372   enum machine_mode mode;
2373
2374   switch (DECL_FUNCTION_CODE (fndecl))
2375     {
2376     CASE_FLT_FN (BUILT_IN_ILOGB):
2377       errno_set = true; builtin_optab = ilogb_optab; break;
2378     CASE_FLT_FN (BUILT_IN_ISINF):
2379       builtin_optab = isinf_optab; break;
2380     case BUILT_IN_ISNORMAL:
2381     case BUILT_IN_ISFINITE:
2382     CASE_FLT_FN (BUILT_IN_FINITE):
2383     case BUILT_IN_FINITED32:
2384     case BUILT_IN_FINITED64:
2385     case BUILT_IN_FINITED128:
2386     case BUILT_IN_ISINFD32:
2387     case BUILT_IN_ISINFD64:
2388     case BUILT_IN_ISINFD128:
2389       /* These builtins have no optabs (yet).  */
2390       break;
2391     default:
2392       gcc_unreachable ();
2393     }
2394
2395   /* There's no easy way to detect the case we need to set EDOM.  */
2396   if (flag_errno_math && errno_set)
2397     return CODE_FOR_nothing;
2398
2399   /* Optab mode depends on the mode of the input argument.  */
2400   mode = TYPE_MODE (TREE_TYPE (arg));
2401
2402   if (builtin_optab)
2403     return optab_handler (builtin_optab, mode);
2404   return CODE_FOR_nothing;
2405 }
2406
2407 /* Expand a call to one of the builtin math functions that operate on
2408    floating point argument and output an integer result (ilogb, isinf,
2409    isnan, etc).
2410    Return 0 if a normal call should be emitted rather than expanding the
2411    function in-line.  EXP is the expression that is a call to the builtin
2412    function; if convenient, the result should be placed in TARGET.  */
2413
2414 static rtx
2415 expand_builtin_interclass_mathfn (tree exp, rtx target)
2416 {
2417   enum insn_code icode = CODE_FOR_nothing;
2418   rtx op0;
2419   tree fndecl = get_callee_fndecl (exp);
2420   enum machine_mode mode;
2421   tree arg;
2422
2423   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
2424     return NULL_RTX;
2425
2426   arg = CALL_EXPR_ARG (exp, 0);
2427   icode = interclass_mathfn_icode (arg, fndecl);
2428   mode = TYPE_MODE (TREE_TYPE (arg));
2429
2430   if (icode != CODE_FOR_nothing)
2431     {
2432       rtx last = get_last_insn ();
2433       tree orig_arg = arg;
2434       /* Make a suitable register to place result in.  */
2435       if (!target
2436           || GET_MODE (target) != TYPE_MODE (TREE_TYPE (exp))
2437           || !insn_data[icode].operand[0].predicate (target, GET_MODE (target)))
2438          target = gen_reg_rtx (TYPE_MODE (TREE_TYPE (exp)));
2439
2440       gcc_assert (insn_data[icode].operand[0].predicate
2441                   (target, GET_MODE (target)));
2442
2443       /* Wrap the computation of the argument in a SAVE_EXPR, as we may
2444          need to expand the argument again.  This way, we will not perform
2445          side-effects more the once.  */
2446       CALL_EXPR_ARG (exp, 0) = arg = builtin_save_expr (arg);
2447
2448       op0 = expand_expr (arg, NULL_RTX, VOIDmode, EXPAND_NORMAL);
2449
2450       if (mode != GET_MODE (op0))
2451         op0 = convert_to_mode (mode, op0, 0);
2452
2453       /* Compute into TARGET.
2454          Set TARGET to wherever the result comes back.  */
2455       if (maybe_emit_unop_insn (icode, target, op0, UNKNOWN))
2456         return target;
2457       delete_insns_since (last);
2458       CALL_EXPR_ARG (exp, 0) = orig_arg;
2459     }
2460
2461   return NULL_RTX;
2462 }
2463
2464 /* Expand a call to the builtin sincos math function.
2465    Return NULL_RTX if a normal call should be emitted rather than expanding the
2466    function in-line.  EXP is the expression that is a call to the builtin
2467    function.  */
2468
2469 static rtx
2470 expand_builtin_sincos (tree exp)
2471 {
2472   rtx op0, op1, op2, target1, target2;
2473   enum machine_mode mode;
2474   tree arg, sinp, cosp;
2475   int result;
2476   location_t loc = EXPR_LOCATION (exp);
2477   tree alias_type, alias_off;
2478
2479   if (!validate_arglist (exp, REAL_TYPE,
2480                          POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
2481     return NULL_RTX;
2482
2483   arg = CALL_EXPR_ARG (exp, 0);
2484   sinp = CALL_EXPR_ARG (exp, 1);
2485   cosp = CALL_EXPR_ARG (exp, 2);
2486
2487   /* Make a suitable register to place result in.  */
2488   mode = TYPE_MODE (TREE_TYPE (arg));
2489
2490   /* Check if sincos insn is available, otherwise emit the call.  */
2491   if (optab_handler (sincos_optab, mode) == CODE_FOR_nothing)
2492     return NULL_RTX;
2493
2494   target1 = gen_reg_rtx (mode);
2495   target2 = gen_reg_rtx (mode);
2496
2497   op0 = expand_normal (arg);
2498   alias_type = build_pointer_type_for_mode (TREE_TYPE (arg), ptr_mode, true);
2499   alias_off = build_int_cst (alias_type, 0);
2500   op1 = expand_normal (fold_build2_loc (loc, MEM_REF, TREE_TYPE (arg),
2501                                         sinp, alias_off));
2502   op2 = expand_normal (fold_build2_loc (loc, MEM_REF, TREE_TYPE (arg),
2503                                         cosp, alias_off));
2504
2505   /* Compute into target1 and target2.
2506      Set TARGET to wherever the result comes back.  */
2507   result = expand_twoval_unop (sincos_optab, op0, target2, target1, 0);
2508   gcc_assert (result);
2509
2510   /* Move target1 and target2 to the memory locations indicated
2511      by op1 and op2.  */
2512   emit_move_insn (op1, target1);
2513   emit_move_insn (op2, target2);
2514
2515   return const0_rtx;
2516 }
2517
2518 /* Expand a call to the internal cexpi builtin to the sincos math function.
2519    EXP is the expression that is a call to the builtin function; if convenient,
2520    the result should be placed in TARGET.  */
2521
2522 static rtx
2523 expand_builtin_cexpi (tree exp, rtx target)
2524 {
2525   tree fndecl = get_callee_fndecl (exp);
2526   tree arg, type;
2527   enum machine_mode mode;
2528   rtx op0, op1, op2;
2529   location_t loc = EXPR_LOCATION (exp);
2530
2531   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
2532     return NULL_RTX;
2533
2534   arg = CALL_EXPR_ARG (exp, 0);
2535   type = TREE_TYPE (arg);
2536   mode = TYPE_MODE (TREE_TYPE (arg));
2537
2538   /* Try expanding via a sincos optab, fall back to emitting a libcall
2539      to sincos or cexp.  We are sure we have sincos or cexp because cexpi
2540      is only generated from sincos, cexp or if we have either of them.  */
2541   if (optab_handler (sincos_optab, mode) != CODE_FOR_nothing)
2542     {
2543       op1 = gen_reg_rtx (mode);
2544       op2 = gen_reg_rtx (mode);
2545
2546       op0 = expand_expr (arg, NULL_RTX, VOIDmode, EXPAND_NORMAL);
2547
2548       /* Compute into op1 and op2.  */
2549       expand_twoval_unop (sincos_optab, op0, op2, op1, 0);
2550     }
2551   else if (TARGET_HAS_SINCOS)
2552     {
2553       tree call, fn = NULL_TREE;
2554       tree top1, top2;
2555       rtx op1a, op2a;
2556
2557       if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIF)
2558         fn = built_in_decls[BUILT_IN_SINCOSF];
2559       else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPI)
2560         fn = built_in_decls[BUILT_IN_SINCOS];
2561       else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIL)
2562         fn = built_in_decls[BUILT_IN_SINCOSL];
2563       else
2564         gcc_unreachable ();
2565
2566       op1 = assign_temp (TREE_TYPE (arg), 0, 1, 1);
2567       op2 = assign_temp (TREE_TYPE (arg), 0, 1, 1);
2568       op1a = copy_to_mode_reg (Pmode, XEXP (op1, 0));
2569       op2a = copy_to_mode_reg (Pmode, XEXP (op2, 0));
2570       top1 = make_tree (build_pointer_type (TREE_TYPE (arg)), op1a);
2571       top2 = make_tree (build_pointer_type (TREE_TYPE (arg)), op2a);
2572
2573       /* Make sure not to fold the sincos call again.  */
2574       call = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn);
2575       expand_normal (build_call_nary (TREE_TYPE (TREE_TYPE (fn)),
2576                                       call, 3, arg, top1, top2));
2577     }
2578   else
2579     {
2580       tree call, fn = NULL_TREE, narg;
2581       tree ctype = build_complex_type (type);
2582
2583       if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIF)
2584         fn = built_in_decls[BUILT_IN_CEXPF];
2585       else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPI)
2586         fn = built_in_decls[BUILT_IN_CEXP];
2587       else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIL)
2588         fn = built_in_decls[BUILT_IN_CEXPL];
2589       else
2590         gcc_unreachable ();
2591
2592       /* If we don't have a decl for cexp create one.  This is the
2593          friendliest fallback if the user calls __builtin_cexpi
2594          without full target C99 function support.  */
2595       if (fn == NULL_TREE)
2596         {
2597           tree fntype;
2598           const char *name = NULL;
2599
2600           if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIF)
2601             name = "cexpf";
2602           else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPI)
2603             name = "cexp";
2604           else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIL)
2605             name = "cexpl";
2606
2607           fntype = build_function_type_list (ctype, ctype, NULL_TREE);
2608           fn = build_fn_decl (name, fntype);
2609         }
2610
2611       narg = fold_build2_loc (loc, COMPLEX_EXPR, ctype,
2612                           build_real (type, dconst0), arg);
2613
2614       /* Make sure not to fold the cexp call again.  */
2615       call = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn);
2616       return expand_expr (build_call_nary (ctype, call, 1, narg),
2617                           target, VOIDmode, EXPAND_NORMAL);
2618     }
2619
2620   /* Now build the proper return type.  */
2621   return expand_expr (build2 (COMPLEX_EXPR, build_complex_type (type),
2622                               make_tree (TREE_TYPE (arg), op2),
2623                               make_tree (TREE_TYPE (arg), op1)),
2624                       target, VOIDmode, EXPAND_NORMAL);
2625 }
2626
2627 /* Conveniently construct a function call expression.  FNDECL names the
2628    function to be called, N is the number of arguments, and the "..."
2629    parameters are the argument expressions.  Unlike build_call_exr
2630    this doesn't fold the call, hence it will always return a CALL_EXPR.  */
2631
2632 static tree
2633 build_call_nofold_loc (location_t loc, tree fndecl, int n, ...)
2634 {
2635   va_list ap;
2636   tree fntype = TREE_TYPE (fndecl);
2637   tree fn = build1 (ADDR_EXPR, build_pointer_type (fntype), fndecl);
2638
2639   va_start (ap, n);
2640   fn = build_call_valist (TREE_TYPE (fntype), fn, n, ap);
2641   va_end (ap);
2642   SET_EXPR_LOCATION (fn, loc);
2643   return fn;
2644 }
2645
2646 /* Expand a call to one of the builtin rounding functions gcc defines
2647    as an extension (lfloor and lceil).  As these are gcc extensions we
2648    do not need to worry about setting errno to EDOM.
2649    If expanding via optab fails, lower expression to (int)(floor(x)).
2650    EXP is the expression that is a call to the builtin function;
2651    if convenient, the result should be placed in TARGET.  */
2652
2653 static rtx
2654 expand_builtin_int_roundingfn (tree exp, rtx target)
2655 {
2656   convert_optab builtin_optab;
2657   rtx op0, insns, tmp;
2658   tree fndecl = get_callee_fndecl (exp);
2659   enum built_in_function fallback_fn;
2660   tree fallback_fndecl;
2661   enum machine_mode mode;
2662   tree arg;
2663
2664   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
2665     gcc_unreachable ();
2666
2667   arg = CALL_EXPR_ARG (exp, 0);
2668
2669   switch (DECL_FUNCTION_CODE (fndecl))
2670     {
2671     CASE_FLT_FN (BUILT_IN_LCEIL):
2672     CASE_FLT_FN (BUILT_IN_LLCEIL):
2673       builtin_optab = lceil_optab;
2674       fallback_fn = BUILT_IN_CEIL;
2675       break;
2676
2677     CASE_FLT_FN (BUILT_IN_LFLOOR):
2678     CASE_FLT_FN (BUILT_IN_LLFLOOR):
2679       builtin_optab = lfloor_optab;
2680       fallback_fn = BUILT_IN_FLOOR;
2681       break;
2682
2683     default:
2684       gcc_unreachable ();
2685     }
2686
2687   /* Make a suitable register to place result in.  */
2688   mode = TYPE_MODE (TREE_TYPE (exp));
2689
2690   target = gen_reg_rtx (mode);
2691
2692   /* Wrap the computation of the argument in a SAVE_EXPR, as we may
2693      need to expand the argument again.  This way, we will not perform
2694      side-effects more the once.  */
2695   CALL_EXPR_ARG (exp, 0) = arg = builtin_save_expr (arg);
2696
2697   op0 = expand_expr (arg, NULL, VOIDmode, EXPAND_NORMAL);
2698
2699   start_sequence ();
2700
2701   /* Compute into TARGET.  */
2702   if (expand_sfix_optab (target, op0, builtin_optab))
2703     {
2704       /* Output the entire sequence.  */
2705       insns = get_insns ();
2706       end_sequence ();
2707       emit_insn (insns);
2708       return target;
2709     }
2710
2711   /* If we were unable to expand via the builtin, stop the sequence
2712      (without outputting the insns).  */
2713   end_sequence ();
2714
2715   /* Fall back to floating point rounding optab.  */
2716   fallback_fndecl = mathfn_built_in (TREE_TYPE (arg), fallback_fn);
2717
2718   /* For non-C99 targets we may end up without a fallback fndecl here
2719      if the user called __builtin_lfloor directly.  In this case emit
2720      a call to the floor/ceil variants nevertheless.  This should result
2721      in the best user experience for not full C99 targets.  */
2722   if (fallback_fndecl == NULL_TREE)
2723     {
2724       tree fntype;
2725       const char *name = NULL;
2726
2727       switch (DECL_FUNCTION_CODE (fndecl))
2728         {
2729         case BUILT_IN_LCEIL:
2730         case BUILT_IN_LLCEIL:
2731           name = "ceil";
2732           break;
2733         case BUILT_IN_LCEILF:
2734         case BUILT_IN_LLCEILF:
2735           name = "ceilf";
2736           break;
2737         case BUILT_IN_LCEILL:
2738         case BUILT_IN_LLCEILL:
2739           name = "ceill";
2740           break;
2741         case BUILT_IN_LFLOOR:
2742         case BUILT_IN_LLFLOOR:
2743           name = "floor";
2744           break;
2745         case BUILT_IN_LFLOORF:
2746         case BUILT_IN_LLFLOORF:
2747           name = "floorf";
2748           break;
2749         case BUILT_IN_LFLOORL:
2750         case BUILT_IN_LLFLOORL:
2751           name = "floorl";
2752           break;
2753         default:
2754           gcc_unreachable ();
2755         }
2756
2757       fntype = build_function_type_list (TREE_TYPE (arg),
2758                                          TREE_TYPE (arg), NULL_TREE);
2759       fallback_fndecl = build_fn_decl (name, fntype);
2760     }
2761
2762   exp = build_call_nofold_loc (EXPR_LOCATION (exp), fallback_fndecl, 1, arg);
2763
2764   tmp = expand_normal (exp);
2765
2766   /* Truncate the result of floating point optab to integer
2767      via expand_fix ().  */
2768   target = gen_reg_rtx (mode);
2769   expand_fix (target, tmp, 0);
2770
2771   return target;
2772 }
2773
2774 /* Expand a call to one of the builtin math functions doing integer
2775    conversion (lrint).
2776    Return 0 if a normal call should be emitted rather than expanding the
2777    function in-line.  EXP is the expression that is a call to the builtin
2778    function; if convenient, the result should be placed in TARGET.  */
2779
2780 static rtx
2781 expand_builtin_int_roundingfn_2 (tree exp, rtx target)
2782 {
2783   convert_optab builtin_optab;
2784   rtx op0, insns;
2785   tree fndecl = get_callee_fndecl (exp);
2786   tree arg;
2787   enum machine_mode mode;
2788
2789   /* There's no easy way to detect the case we need to set EDOM.  */
2790   if (flag_errno_math)
2791     return NULL_RTX;
2792
2793   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
2794      gcc_unreachable ();
2795
2796   arg = CALL_EXPR_ARG (exp, 0);
2797
2798   switch (DECL_FUNCTION_CODE (fndecl))
2799     {
2800     CASE_FLT_FN (BUILT_IN_LRINT):
2801     CASE_FLT_FN (BUILT_IN_LLRINT):
2802       builtin_optab = lrint_optab; break;
2803     CASE_FLT_FN (BUILT_IN_LROUND):
2804     CASE_FLT_FN (BUILT_IN_LLROUND):
2805       builtin_optab = lround_optab; break;
2806     default:
2807       gcc_unreachable ();
2808     }
2809
2810   /* Make a suitable register to place result in.  */
2811   mode = TYPE_MODE (TREE_TYPE (exp));
2812
2813   target = gen_reg_rtx (mode);
2814
2815   /* Wrap the computation of the argument in a SAVE_EXPR, as we may
2816      need to expand the argument again.  This way, we will not perform
2817      side-effects more the once.  */
2818   CALL_EXPR_ARG (exp, 0) = arg = builtin_save_expr (arg);
2819
2820   op0 = expand_expr (arg, NULL, VOIDmode, EXPAND_NORMAL);
2821
2822   start_sequence ();
2823
2824   if (expand_sfix_optab (target, op0, builtin_optab))
2825     {
2826       /* Output the entire sequence.  */
2827       insns = get_insns ();
2828       end_sequence ();
2829       emit_insn (insns);
2830       return target;
2831     }
2832
2833   /* If we were unable to expand via the builtin, stop the sequence
2834      (without outputting the insns) and call to the library function
2835      with the stabilized argument list.  */
2836   end_sequence ();
2837
2838   target = expand_call (exp, target, target == const0_rtx);
2839
2840   return target;
2841 }
2842
2843 /* To evaluate powi(x,n), the floating point value x raised to the
2844    constant integer exponent n, we use a hybrid algorithm that
2845    combines the "window method" with look-up tables.  For an
2846    introduction to exponentiation algorithms and "addition chains",
2847    see section 4.6.3, "Evaluation of Powers" of Donald E. Knuth,
2848    "Seminumerical Algorithms", Vol. 2, "The Art of Computer Programming",
2849    3rd Edition, 1998, and Daniel M. Gordon, "A Survey of Fast Exponentiation
2850    Methods", Journal of Algorithms, Vol. 27, pp. 129-146, 1998.  */
2851
2852 /* Provide a default value for POWI_MAX_MULTS, the maximum number of
2853    multiplications to inline before calling the system library's pow
2854    function.  powi(x,n) requires at worst 2*bits(n)-2 multiplications,
2855    so this default never requires calling pow, powf or powl.  */
2856
2857 #ifndef POWI_MAX_MULTS
2858 #define POWI_MAX_MULTS  (2*HOST_BITS_PER_WIDE_INT-2)
2859 #endif
2860
2861 /* The size of the "optimal power tree" lookup table.  All
2862    exponents less than this value are simply looked up in the
2863    powi_table below.  This threshold is also used to size the
2864    cache of pseudo registers that hold intermediate results.  */
2865 #define POWI_TABLE_SIZE 256
2866
2867 /* The size, in bits of the window, used in the "window method"
2868    exponentiation algorithm.  This is equivalent to a radix of
2869    (1<<POWI_WINDOW_SIZE) in the corresponding "m-ary method".  */
2870 #define POWI_WINDOW_SIZE 3
2871
2872 /* The following table is an efficient representation of an
2873    "optimal power tree".  For each value, i, the corresponding
2874    value, j, in the table states than an optimal evaluation
2875    sequence for calculating pow(x,i) can be found by evaluating
2876    pow(x,j)*pow(x,i-j).  An optimal power tree for the first
2877    100 integers is given in Knuth's "Seminumerical algorithms".  */
2878
2879 static const unsigned char powi_table[POWI_TABLE_SIZE] =
2880   {
2881       0,   1,   1,   2,   2,   3,   3,   4,  /*   0 -   7 */
2882       4,   6,   5,   6,   6,  10,   7,   9,  /*   8 -  15 */
2883       8,  16,   9,  16,  10,  12,  11,  13,  /*  16 -  23 */
2884      12,  17,  13,  18,  14,  24,  15,  26,  /*  24 -  31 */
2885      16,  17,  17,  19,  18,  33,  19,  26,  /*  32 -  39 */
2886      20,  25,  21,  40,  22,  27,  23,  44,  /*  40 -  47 */
2887      24,  32,  25,  34,  26,  29,  27,  44,  /*  48 -  55 */
2888      28,  31,  29,  34,  30,  60,  31,  36,  /*  56 -  63 */
2889      32,  64,  33,  34,  34,  46,  35,  37,  /*  64 -  71 */
2890      36,  65,  37,  50,  38,  48,  39,  69,  /*  72 -  79 */
2891      40,  49,  41,  43,  42,  51,  43,  58,  /*  80 -  87 */
2892      44,  64,  45,  47,  46,  59,  47,  76,  /*  88 -  95 */
2893      48,  65,  49,  66,  50,  67,  51,  66,  /*  96 - 103 */
2894      52,  70,  53,  74,  54, 104,  55,  74,  /* 104 - 111 */
2895      56,  64,  57,  69,  58,  78,  59,  68,  /* 112 - 119 */
2896      60,  61,  61,  80,  62,  75,  63,  68,  /* 120 - 127 */
2897      64,  65,  65, 128,  66, 129,  67,  90,  /* 128 - 135 */
2898      68,  73,  69, 131,  70,  94,  71,  88,  /* 136 - 143 */
2899      72, 128,  73,  98,  74, 132,  75, 121,  /* 144 - 151 */
2900      76, 102,  77, 124,  78, 132,  79, 106,  /* 152 - 159 */
2901      80,  97,  81, 160,  82,  99,  83, 134,  /* 160 - 167 */
2902      84,  86,  85,  95,  86, 160,  87, 100,  /* 168 - 175 */
2903      88, 113,  89,  98,  90, 107,  91, 122,  /* 176 - 183 */
2904      92, 111,  93, 102,  94, 126,  95, 150,  /* 184 - 191 */
2905      96, 128,  97, 130,  98, 133,  99, 195,  /* 192 - 199 */
2906     100, 128, 101, 123, 102, 164, 103, 138,  /* 200 - 207 */
2907     104, 145, 105, 146, 106, 109, 107, 149,  /* 208 - 215 */
2908     108, 200, 109, 146, 110, 170, 111, 157,  /* 216 - 223 */
2909     112, 128, 113, 130, 114, 182, 115, 132,  /* 224 - 231 */
2910     116, 200, 117, 132, 118, 158, 119, 206,  /* 232 - 239 */
2911     120, 240, 121, 162, 122, 147, 123, 152,  /* 240 - 247 */
2912     124, 166, 125, 214, 126, 138, 127, 153,  /* 248 - 255 */
2913   };
2914
2915
2916 /* Return the number of multiplications required to calculate
2917    powi(x,n) where n is less than POWI_TABLE_SIZE.  This is a
2918    subroutine of powi_cost.  CACHE is an array indicating
2919    which exponents have already been calculated.  */
2920
2921 static int
2922 powi_lookup_cost (unsigned HOST_WIDE_INT n, bool *cache)
2923 {
2924   /* If we've already calculated this exponent, then this evaluation
2925      doesn't require any additional multiplications.  */
2926   if (cache[n])
2927     return 0;
2928
2929   cache[n] = true;
2930   return powi_lookup_cost (n - powi_table[n], cache)
2931          + powi_lookup_cost (powi_table[n], cache) + 1;
2932 }
2933
2934 /* Return the number of multiplications required to calculate
2935    powi(x,n) for an arbitrary x, given the exponent N.  This
2936    function needs to be kept in sync with expand_powi below.  */
2937
2938 static int
2939 powi_cost (HOST_WIDE_INT n)
2940 {
2941   bool cache[POWI_TABLE_SIZE];
2942   unsigned HOST_WIDE_INT digit;
2943   unsigned HOST_WIDE_INT val;
2944   int result;
2945
2946   if (n == 0)
2947     return 0;
2948
2949   /* Ignore the reciprocal when calculating the cost.  */
2950   val = (n < 0) ? -n : n;
2951
2952   /* Initialize the exponent cache.  */
2953   memset (cache, 0, POWI_TABLE_SIZE * sizeof (bool));
2954   cache[1] = true;
2955
2956   result = 0;
2957
2958   while (val >= POWI_TABLE_SIZE)
2959     {
2960       if (val & 1)
2961         {
2962           digit = val & ((1 << POWI_WINDOW_SIZE) - 1);
2963           result += powi_lookup_cost (digit, cache)
2964                     + POWI_WINDOW_SIZE + 1;
2965           val >>= POWI_WINDOW_SIZE;
2966         }
2967       else
2968         {
2969           val >>= 1;
2970           result++;
2971         }
2972     }
2973
2974   return result + powi_lookup_cost (val, cache);
2975 }
2976
2977 /* Recursive subroutine of expand_powi.  This function takes the array,
2978    CACHE, of already calculated exponents and an exponent N and returns
2979    an RTX that corresponds to CACHE[1]**N, as calculated in mode MODE.  */
2980
2981 static rtx
2982 expand_powi_1 (enum machine_mode mode, unsigned HOST_WIDE_INT n, rtx *cache)
2983 {
2984   unsigned HOST_WIDE_INT digit;
2985   rtx target, result;
2986   rtx op0, op1;
2987
2988   if (n < POWI_TABLE_SIZE)
2989     {
2990       if (cache[n])
2991         return cache[n];
2992
2993       target = gen_reg_rtx (mode);
2994       cache[n] = target;
2995
2996       op0 = expand_powi_1 (mode, n - powi_table[n], cache);
2997       op1 = expand_powi_1 (mode, powi_table[n], cache);
2998     }
2999   else if (n & 1)
3000     {
3001       target = gen_reg_rtx (mode);
3002       digit = n & ((1 << POWI_WINDOW_SIZE) - 1);
3003       op0 = expand_powi_1 (mode, n - digit, cache);
3004       op1 = expand_powi_1 (mode, digit, cache);
3005     }
3006   else
3007     {
3008       target = gen_reg_rtx (mode);
3009       op0 = expand_powi_1 (mode, n >> 1, cache);
3010       op1 = op0;
3011     }
3012
3013   result = expand_mult (mode, op0, op1, target, 0);
3014   if (result != target)
3015     emit_move_insn (target, result);
3016   return target;
3017 }
3018
3019 /* Expand the RTL to evaluate powi(x,n) in mode MODE.  X is the
3020    floating point operand in mode MODE, and N is the exponent.  This
3021    function needs to be kept in sync with powi_cost above.  */
3022
3023 static rtx
3024 expand_powi (rtx x, enum machine_mode mode, HOST_WIDE_INT n)
3025 {
3026   rtx cache[POWI_TABLE_SIZE];
3027   rtx result;
3028
3029   if (n == 0)
3030     return CONST1_RTX (mode);
3031
3032   memset (cache, 0, sizeof (cache));
3033   cache[1] = x;
3034
3035   result = expand_powi_1 (mode, (n < 0) ? -n : n, cache);
3036
3037   /* If the original exponent was negative, reciprocate the result.  */
3038   if (n < 0)
3039     result = expand_binop (mode, sdiv_optab, CONST1_RTX (mode),
3040                            result, NULL_RTX, 0, OPTAB_LIB_WIDEN);
3041
3042   return result;
3043 }
3044
3045 /* Fold a builtin function call to pow, powf, or powl into a series of sqrts or
3046    cbrts.  Return NULL_RTX if no simplification can be made or expand the tree
3047    if we can simplify it.  */
3048 static rtx
3049 expand_builtin_pow_root (location_t loc, tree arg0, tree arg1, tree type,
3050                          rtx subtarget)
3051 {
3052   if (TREE_CODE (arg1) == REAL_CST
3053       && !TREE_OVERFLOW (arg1)
3054       && flag_unsafe_math_optimizations)
3055     {
3056       enum machine_mode mode = TYPE_MODE (type);
3057       tree sqrtfn = mathfn_built_in (type, BUILT_IN_SQRT);
3058       tree cbrtfn = mathfn_built_in (type, BUILT_IN_CBRT);
3059       REAL_VALUE_TYPE c = TREE_REAL_CST (arg1);
3060       tree op = NULL_TREE;
3061
3062       if (sqrtfn)
3063         {
3064           /* Optimize pow (x, 0.5) into sqrt.  */
3065           if (REAL_VALUES_EQUAL (c, dconsthalf))
3066             op = build_call_nofold_loc (loc, sqrtfn, 1, arg0);
3067
3068           /* Don't do this optimization if we don't have a sqrt insn.  */
3069           else if (optab_handler (sqrt_optab, mode) != CODE_FOR_nothing)
3070             {
3071               REAL_VALUE_TYPE dconst1_4 = dconst1;
3072               REAL_VALUE_TYPE dconst3_4;
3073               SET_REAL_EXP (&dconst1_4, REAL_EXP (&dconst1_4) - 2);
3074
3075               real_from_integer (&dconst3_4, VOIDmode, 3, 0, 0);
3076               SET_REAL_EXP (&dconst3_4, REAL_EXP (&dconst3_4) - 2);
3077
3078               /* Optimize pow (x, 0.25) into sqrt (sqrt (x)).  Assume on most
3079                  machines that a builtin sqrt instruction is smaller than a
3080                  call to pow with 0.25, so do this optimization even if
3081                  -Os.  */
3082               if (REAL_VALUES_EQUAL (c, dconst1_4))
3083                 {
3084                   op = build_call_nofold_loc (loc, sqrtfn, 1, arg0);
3085                   op = build_call_nofold_loc (loc, sqrtfn, 1, op);
3086                 }
3087
3088               /* Optimize pow (x, 0.75) = sqrt (x) * sqrt (sqrt (x)) unless we
3089                  are optimizing for space.  */
3090               else if (optimize_insn_for_speed_p ()
3091                        && !TREE_SIDE_EFFECTS (arg0)
3092                        && REAL_VALUES_EQUAL (c, dconst3_4))
3093                 {
3094                   tree sqrt1 = build_call_expr_loc (loc, sqrtfn, 1, arg0);
3095                   tree sqrt2 = builtin_save_expr (sqrt1);
3096                   tree sqrt3 = build_call_expr_loc (loc, sqrtfn, 1, sqrt1);
3097                   op = fold_build2_loc (loc, MULT_EXPR, type, sqrt2, sqrt3);
3098                 }
3099             }
3100         }
3101
3102       /* Check whether we can do cbrt insstead of pow (x, 1./3.) and
3103          cbrt/sqrts instead of pow (x, 1./6.).  */
3104       if (cbrtfn && ! op
3105           && (tree_expr_nonnegative_p (arg0) || !HONOR_NANS (mode)))
3106         {
3107           /* First try 1/3.  */
3108           REAL_VALUE_TYPE dconst1_3
3109             = real_value_truncate (mode, dconst_third ());
3110
3111           if (REAL_VALUES_EQUAL (c, dconst1_3))
3112             op = build_call_nofold_loc (loc, cbrtfn, 1, arg0);
3113
3114               /* Now try 1/6.  */
3115           else if (optimize_insn_for_speed_p ()
3116                    && optab_handler (sqrt_optab, mode) != CODE_FOR_nothing)
3117             {
3118               REAL_VALUE_TYPE dconst1_6 = dconst1_3;
3119               SET_REAL_EXP (&dconst1_6, REAL_EXP (&dconst1_6) - 1);
3120
3121               if (REAL_VALUES_EQUAL (c, dconst1_6))
3122                 {
3123                   op = build_call_nofold_loc (loc, sqrtfn, 1, arg0);
3124                   op = build_call_nofold_loc (loc, cbrtfn, 1, op);
3125                 }
3126             }
3127         }
3128
3129       if (op)
3130         return expand_expr (op, subtarget, mode, EXPAND_NORMAL);
3131     }
3132
3133   return NULL_RTX;
3134 }
3135
3136 /* Expand a call to the pow built-in mathematical function.  Return NULL_RTX if
3137    a normal call should be emitted rather than expanding the function
3138    in-line.  EXP is the expression that is a call to the builtin
3139    function; if convenient, the result should be placed in TARGET.  */
3140
3141 static rtx
3142 expand_builtin_pow (tree exp, rtx target, rtx subtarget)
3143 {
3144   tree arg0, arg1;
3145   tree fn, narg0;
3146   tree type = TREE_TYPE (exp);
3147   REAL_VALUE_TYPE cint, c, c2;
3148   HOST_WIDE_INT n;
3149   rtx op, op2;
3150   enum machine_mode mode = TYPE_MODE (type);
3151
3152   if (! validate_arglist (exp, REAL_TYPE, REAL_TYPE, VOID_TYPE))
3153     return NULL_RTX;
3154
3155   arg0 = CALL_EXPR_ARG (exp, 0);
3156   arg1 = CALL_EXPR_ARG (exp, 1);
3157
3158   if (TREE_CODE (arg1) != REAL_CST
3159       || TREE_OVERFLOW (arg1))
3160     return expand_builtin_mathfn_2 (exp, target, subtarget);
3161
3162   /* Handle constant exponents.  */
3163
3164   /* For integer valued exponents we can expand to an optimal multiplication
3165      sequence using expand_powi.  */
3166   c = TREE_REAL_CST (arg1);
3167   n = real_to_integer (&c);
3168   real_from_integer (&cint, VOIDmode, n, n < 0 ? -1 : 0, 0);
3169   if (real_identical (&c, &cint)
3170       && ((n >= -1 && n <= 2)
3171           || (flag_unsafe_math_optimizations
3172               && optimize_insn_for_speed_p ()
3173               && powi_cost (n) <= POWI_MAX_MULTS)))
3174     {
3175       op = expand_expr (arg0, subtarget, VOIDmode, EXPAND_NORMAL);
3176       if (n != 1)
3177         {
3178           op = force_reg (mode, op);
3179           op = expand_powi (op, mode, n);
3180         }
3181       return op;
3182     }
3183
3184   narg0 = builtin_save_expr (arg0);
3185
3186   /* If the exponent is not integer valued, check if it is half of an integer.
3187      In this case we can expand to sqrt (x) * x**(n/2).  */
3188   fn = mathfn_built_in (type, BUILT_IN_SQRT);
3189   if (fn != NULL_TREE)
3190     {
3191       real_arithmetic (&c2, MULT_EXPR, &c, &dconst2);
3192       n = real_to_integer (&c2);
3193       real_from_integer (&cint, VOIDmode, n, n < 0 ? -1 : 0, 0);
3194       if (real_identical (&c2, &cint)
3195           && ((flag_unsafe_math_optimizations
3196                && optimize_insn_for_speed_p ()
3197                && powi_cost (n/2) <= POWI_MAX_MULTS)
3198               /* Even the c == 0.5 case cannot be done unconditionally
3199                  when we need to preserve signed zeros, as
3200                  pow (-0, 0.5) is +0, while sqrt(-0) is -0.  */
3201               || (!HONOR_SIGNED_ZEROS (mode) && n == 1)
3202               /* For c == 1.5 we can assume that x * sqrt (x) is always
3203                  smaller than pow (x, 1.5) if sqrt will not be expanded
3204                  as a call.  */
3205               || (n == 3
3206                   && optab_handler (sqrt_optab, mode) != CODE_FOR_nothing)))
3207         {
3208           tree call_expr = build_call_nofold_loc (EXPR_LOCATION (exp), fn, 1,
3209                                                   narg0);
3210           /* Use expand_expr in case the newly built call expression
3211              was folded to a non-call.  */
3212           op = expand_expr (call_expr, subtarget, mode, EXPAND_NORMAL);
3213           if (n != 1)
3214             {
3215               op2 = expand_expr (narg0, subtarget, VOIDmode, EXPAND_NORMAL);
3216               op2 = force_reg (mode, op2);
3217               op2 = expand_powi (op2, mode, abs (n / 2));
3218               op = expand_simple_binop (mode, MULT, op, op2, NULL_RTX,
3219                                         0, OPTAB_LIB_WIDEN);
3220               /* If the original exponent was negative, reciprocate the
3221                  result.  */
3222               if (n < 0)
3223                 op = expand_binop (mode, sdiv_optab, CONST1_RTX (mode),
3224                                    op, NULL_RTX, 0, OPTAB_LIB_WIDEN);
3225             }
3226           return op;
3227         }
3228     }
3229
3230   /* Check whether we can do a series of sqrt or cbrt's instead of the pow
3231      call.  */
3232   op = expand_builtin_pow_root (EXPR_LOCATION (exp), arg0, arg1, type,
3233                                 subtarget);
3234   if (op)
3235     return op;
3236
3237   /* Try if the exponent is a third of an integer.  In this case
3238      we can expand to x**(n/3) * cbrt(x)**(n%3).  As cbrt (x) is
3239      different from pow (x, 1./3.) due to rounding and behavior
3240      with negative x we need to constrain this transformation to
3241      unsafe math and positive x or finite math.  */
3242   fn = mathfn_built_in (type, BUILT_IN_CBRT);
3243   if (fn != NULL_TREE
3244       && flag_unsafe_math_optimizations
3245       && (tree_expr_nonnegative_p (arg0)
3246           || !HONOR_NANS (mode)))
3247     {
3248       REAL_VALUE_TYPE dconst3;
3249       real_from_integer (&dconst3, VOIDmode, 3, 0, 0);
3250       real_arithmetic (&c2, MULT_EXPR, &c, &dconst3);
3251       real_round (&c2, mode, &c2);
3252       n = real_to_integer (&c2);
3253       real_from_integer (&cint, VOIDmode, n, n < 0 ? -1 : 0, 0);
3254       real_arithmetic (&c2, RDIV_EXPR, &cint, &dconst3);
3255       real_convert (&c2, mode, &c2);
3256       if (real_identical (&c2, &c)
3257           && ((optimize_insn_for_speed_p ()
3258                && powi_cost (n/3) <= POWI_MAX_MULTS)
3259               || n == 1))
3260         {
3261           tree call_expr = build_call_nofold_loc (EXPR_LOCATION (exp), fn, 1,
3262                                                   narg0);
3263           op = expand_builtin (call_expr, NULL_RTX, subtarget, mode, 0);
3264           if (abs (n) % 3 == 2)
3265             op = expand_simple_binop (mode, MULT, op, op, op,
3266                                       0, OPTAB_LIB_WIDEN);
3267           if (n != 1)
3268             {
3269               op2 = expand_expr (narg0, subtarget, VOIDmode, EXPAND_NORMAL);
3270               op2 = force_reg (mode, op2);
3271               op2 = expand_powi (op2, mode, abs (n / 3));
3272               op = expand_simple_binop (mode, MULT, op, op2, NULL_RTX,
3273                                         0, OPTAB_LIB_WIDEN);
3274               /* If the original exponent was negative, reciprocate the
3275                  result.  */
3276               if (n < 0)
3277                 op = expand_binop (mode, sdiv_optab, CONST1_RTX (mode),
3278                                    op, NULL_RTX, 0, OPTAB_LIB_WIDEN);
3279             }
3280           return op;
3281         }
3282     }
3283
3284   /* Fall back to optab expansion.  */
3285   return expand_builtin_mathfn_2 (exp, target, subtarget);
3286 }
3287
3288 /* Expand a call to the powi built-in mathematical function.  Return NULL_RTX if
3289    a normal call should be emitted rather than expanding the function
3290    in-line.  EXP is the expression that is a call to the builtin
3291    function; if convenient, the result should be placed in TARGET.  */
3292
3293 static rtx
3294 expand_builtin_powi (tree exp, rtx target)
3295 {
3296   tree arg0, arg1;
3297   rtx op0, op1;
3298   enum machine_mode mode;
3299   enum machine_mode mode2;
3300
3301   if (! validate_arglist (exp, REAL_TYPE, INTEGER_TYPE, VOID_TYPE))
3302     return NULL_RTX;
3303
3304   arg0 = CALL_EXPR_ARG (exp, 0);
3305   arg1 = CALL_EXPR_ARG (exp, 1);
3306   mode = TYPE_MODE (TREE_TYPE (exp));
3307
3308   /* Handle constant power.  */
3309
3310   if (TREE_CODE (arg1) == INTEGER_CST
3311       && !TREE_OVERFLOW (arg1))
3312     {
3313       HOST_WIDE_INT n = TREE_INT_CST_LOW (arg1);
3314
3315       /* If the exponent is -1, 0, 1 or 2, then expand_powi is exact.
3316          Otherwise, check the number of multiplications required.  */
3317       if ((TREE_INT_CST_HIGH (arg1) == 0
3318            || TREE_INT_CST_HIGH (arg1) == -1)
3319           && ((n >= -1 && n <= 2)
3320               || (optimize_insn_for_speed_p ()
3321                   && powi_cost (n) <= POWI_MAX_MULTS)))
3322         {
3323           op0 = expand_expr (arg0, NULL_RTX, VOIDmode, EXPAND_NORMAL);
3324           op0 = force_reg (mode, op0);
3325           return expand_powi (op0, mode, n);
3326         }
3327     }
3328
3329   /* Emit a libcall to libgcc.  */
3330
3331   /* Mode of the 2nd argument must match that of an int.  */
3332   mode2 = mode_for_size (INT_TYPE_SIZE, MODE_INT, 0);
3333
3334   if (target == NULL_RTX)
3335     target = gen_reg_rtx (mode);
3336
3337   op0 = expand_expr (arg0, NULL_RTX, mode, EXPAND_NORMAL);
3338   if (GET_MODE (op0) != mode)
3339     op0 = convert_to_mode (mode, op0, 0);
3340   op1 = expand_expr (arg1, NULL_RTX, mode2, EXPAND_NORMAL);
3341   if (GET_MODE (op1) != mode2)
3342     op1 = convert_to_mode (mode2, op1, 0);
3343
3344   target = emit_library_call_value (optab_libfunc (powi_optab, mode),
3345                                     target, LCT_CONST, mode, 2,
3346                                     op0, mode, op1, mode2);
3347
3348   return target;
3349 }
3350
3351 /* Expand expression EXP which is a call to the strlen builtin.  Return
3352    NULL_RTX if we failed the caller should emit a normal call, otherwise
3353    try to get the result in TARGET, if convenient.  */
3354
3355 static rtx
3356 expand_builtin_strlen (tree exp, rtx target,
3357                        enum machine_mode target_mode)
3358 {
3359   if (!validate_arglist (exp, POINTER_TYPE, VOID_TYPE))
3360     return NULL_RTX;
3361   else
3362     {
3363       rtx pat;
3364       tree len;
3365       tree src = CALL_EXPR_ARG (exp, 0);
3366       rtx result, src_reg, char_rtx, before_strlen;
3367       enum machine_mode insn_mode = target_mode, char_mode;
3368       enum insn_code icode = CODE_FOR_nothing;
3369       unsigned int align;
3370
3371       /* If the length can be computed at compile-time, return it.  */
3372       len = c_strlen (src, 0);
3373       if (len)
3374         return expand_expr (len, target, target_mode, EXPAND_NORMAL);
3375
3376       /* If the length can be computed at compile-time and is constant
3377          integer, but there are side-effects in src, evaluate
3378          src for side-effects, then return len.
3379          E.g. x = strlen (i++ ? "xfoo" + 1 : "bar");
3380          can be optimized into: i++; x = 3;  */
3381       len = c_strlen (src, 1);
3382       if (len && TREE_CODE (len) == INTEGER_CST)
3383         {
3384           expand_expr (src, const0_rtx, VOIDmode, EXPAND_NORMAL);
3385           return expand_expr (len, target, target_mode, EXPAND_NORMAL);
3386         }
3387
3388       align = get_pointer_alignment (src, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
3389
3390       /* If SRC is not a pointer type, don't do this operation inline.  */
3391       if (align == 0)
3392         return NULL_RTX;
3393
3394       /* Bail out if we can't compute strlen in the right mode.  */
3395       while (insn_mode != VOIDmode)
3396         {
3397           icode = optab_handler (strlen_optab, insn_mode);
3398           if (icode != CODE_FOR_nothing)
3399             break;
3400
3401           insn_mode = GET_MODE_WIDER_MODE (insn_mode);
3402         }
3403       if (insn_mode == VOIDmode)
3404         return NULL_RTX;
3405
3406       /* Make a place to write the result of the instruction.  */
3407       result = target;
3408       if (! (result != 0
3409              && REG_P (result)
3410              && GET_MODE (result) == insn_mode
3411              && REGNO (result) >= FIRST_PSEUDO_REGISTER))
3412         result = gen_reg_rtx (insn_mode);
3413
3414       /* Make a place to hold the source address.  We will not expand
3415          the actual source until we are sure that the expansion will
3416          not fail -- there are trees that cannot be expanded twice.  */
3417       src_reg = gen_reg_rtx (Pmode);
3418
3419       /* Mark the beginning of the strlen sequence so we can emit the
3420          source operand later.  */
3421       before_strlen = get_last_insn ();
3422
3423       char_rtx = const0_rtx;
3424       char_mode = insn_data[(int) icode].operand[2].mode;
3425       if (! (*insn_data[(int) icode].operand[2].predicate) (char_rtx,
3426                                                             char_mode))
3427         char_rtx = copy_to_mode_reg (char_mode, char_rtx);
3428
3429       pat = GEN_FCN (icode) (result, gen_rtx_MEM (BLKmode, src_reg),
3430                              char_rtx, GEN_INT (align));
3431       if (! pat)
3432         return NULL_RTX;
3433       emit_insn (pat);
3434
3435       /* Now that we are assured of success, expand the source.  */
3436       start_sequence ();
3437       pat = expand_expr (src, src_reg, ptr_mode, EXPAND_NORMAL);
3438       if (pat != src_reg)
3439         emit_move_insn (src_reg, pat);
3440       pat = get_insns ();
3441       end_sequence ();
3442
3443       if (before_strlen)
3444         emit_insn_after (pat, before_strlen);
3445       else
3446         emit_insn_before (pat, get_insns ());
3447
3448       /* Return the value in the proper mode for this function.  */
3449       if (GET_MODE (result) == target_mode)
3450         target = result;
3451       else if (target != 0)
3452         convert_move (target, result, 0);
3453       else
3454         target = convert_to_mode (target_mode, result, 0);
3455
3456       return target;
3457     }
3458 }
3459
3460 /* Callback routine for store_by_pieces.  Read GET_MODE_BITSIZE (MODE)
3461    bytes from constant string DATA + OFFSET and return it as target
3462    constant.  */
3463
3464 static rtx
3465 builtin_memcpy_read_str (void *data, HOST_WIDE_INT offset,
3466                          enum machine_mode mode)
3467 {
3468   const char *str = (const char *) data;
3469
3470   gcc_assert (offset >= 0
3471               && ((unsigned HOST_WIDE_INT) offset + GET_MODE_SIZE (mode)
3472                   <= strlen (str) + 1));
3473
3474   return c_readstr (str + offset, mode);
3475 }
3476
3477 /* Expand a call EXP to the memcpy builtin.
3478    Return NULL_RTX if we failed, the caller should emit a normal call,
3479    otherwise try to get the result in TARGET, if convenient (and in
3480    mode MODE if that's convenient).  */
3481
3482 static rtx
3483 expand_builtin_memcpy (tree exp, rtx target)
3484 {
3485   if (!validate_arglist (exp,
3486                          POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
3487     return NULL_RTX;
3488   else
3489     {
3490       tree dest = CALL_EXPR_ARG (exp, 0);
3491       tree src = CALL_EXPR_ARG (exp, 1);
3492       tree len = CALL_EXPR_ARG (exp, 2);
3493       const char *src_str;
3494       unsigned int src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
3495       unsigned int dest_align
3496         = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
3497       rtx dest_mem, src_mem, dest_addr, len_rtx;
3498       HOST_WIDE_INT expected_size = -1;
3499       unsigned int expected_align = 0;
3500
3501       /* If DEST is not a pointer type, call the normal function.  */
3502       if (dest_align == 0)
3503         return NULL_RTX;
3504
3505       /* If either SRC is not a pointer type, don't do this
3506          operation in-line.  */
3507       if (src_align == 0)
3508         return NULL_RTX;
3509
3510       if (currently_expanding_gimple_stmt)
3511         stringop_block_profile (currently_expanding_gimple_stmt,
3512                                 &expected_align, &expected_size);
3513
3514       if (expected_align < dest_align)
3515         expected_align = dest_align;
3516       dest_mem = get_memory_rtx (dest, len);
3517       set_mem_align (dest_mem, dest_align);
3518       len_rtx = expand_normal (len);
3519       src_str = c_getstr (src);
3520
3521       /* If SRC is a string constant and block move would be done
3522          by pieces, we can avoid loading the string from memory
3523          and only stored the computed constants.  */
3524       if (src_str
3525           && CONST_INT_P (len_rtx)
3526           && (unsigned HOST_WIDE_INT) INTVAL (len_rtx) <= strlen (src_str) + 1
3527           && can_store_by_pieces (INTVAL (len_rtx), builtin_memcpy_read_str,
3528                                   CONST_CAST (char *, src_str),
3529                                   dest_align, false))
3530         {
3531           dest_mem = store_by_pieces (dest_mem, INTVAL (len_rtx),
3532                                       builtin_memcpy_read_str,
3533                                       CONST_CAST (char *, src_str),
3534                                       dest_align, false, 0);
3535           dest_mem = force_operand (XEXP (dest_mem, 0), target);
3536           dest_mem = convert_memory_address (ptr_mode, dest_mem);
3537           return dest_mem;
3538         }
3539
3540       src_mem = get_memory_rtx (src, len);
3541       set_mem_align (src_mem, src_align);
3542
3543       /* Copy word part most expediently.  */
3544       dest_addr = emit_block_move_hints (dest_mem, src_mem, len_rtx,
3545                                          CALL_EXPR_TAILCALL (exp)
3546                                          ? BLOCK_OP_TAILCALL : BLOCK_OP_NORMAL,
3547                                          expected_align, expected_size);
3548
3549       if (dest_addr == 0)
3550         {
3551           dest_addr = force_operand (XEXP (dest_mem, 0), target);
3552           dest_addr = convert_memory_address (ptr_mode, dest_addr);
3553         }
3554       return dest_addr;
3555     }
3556 }
3557
3558 /* Expand a call EXP to the mempcpy builtin.
3559    Return NULL_RTX if we failed; the caller should emit a normal call,
3560    otherwise try to get the result in TARGET, if convenient (and in
3561    mode MODE if that's convenient).  If ENDP is 0 return the
3562    destination pointer, if ENDP is 1 return the end pointer ala
3563    mempcpy, and if ENDP is 2 return the end pointer minus one ala
3564    stpcpy.  */
3565
3566 static rtx
3567 expand_builtin_mempcpy (tree exp, rtx target, enum machine_mode mode)
3568 {
3569   if (!validate_arglist (exp,
3570                          POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
3571     return NULL_RTX;
3572   else
3573     {
3574       tree dest = CALL_EXPR_ARG (exp, 0);
3575       tree src = CALL_EXPR_ARG (exp, 1);
3576       tree len = CALL_EXPR_ARG (exp, 2);
3577       return expand_builtin_mempcpy_args (dest, src, len,
3578                                           target, mode, /*endp=*/ 1);
3579     }
3580 }
3581
3582 /* Helper function to do the actual work for expand_builtin_mempcpy.  The
3583    arguments to the builtin_mempcpy call DEST, SRC, and LEN are broken out
3584    so that this can also be called without constructing an actual CALL_EXPR.
3585    The other arguments and return value are the same as for
3586    expand_builtin_mempcpy.  */
3587
3588 static rtx
3589 expand_builtin_mempcpy_args (tree dest, tree src, tree len,
3590                              rtx target, enum machine_mode mode, int endp)
3591 {
3592     /* If return value is ignored, transform mempcpy into memcpy.  */
3593   if (target == const0_rtx && implicit_built_in_decls[BUILT_IN_MEMCPY])
3594     {
3595       tree fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
3596       tree result = build_call_nofold_loc (UNKNOWN_LOCATION, fn, 3,
3597                                            dest, src, len);
3598       return expand_expr (result, target, mode, EXPAND_NORMAL);
3599     }
3600   else
3601     {
3602       const char *src_str;
3603       unsigned int src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
3604       unsigned int dest_align
3605         = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
3606       rtx dest_mem, src_mem, len_rtx;
3607
3608       /* If either SRC or DEST is not a pointer type, don't do this
3609          operation in-line.  */
3610       if (dest_align == 0 || src_align == 0)
3611         return NULL_RTX;
3612
3613       /* If LEN is not constant, call the normal function.  */
3614       if (! host_integerp (len, 1))
3615         return NULL_RTX;
3616
3617       len_rtx = expand_normal (len);
3618       src_str = c_getstr (src);
3619
3620       /* If SRC is a string constant and block move would be done
3621          by pieces, we can avoid loading the string from memory
3622          and only stored the computed constants.  */
3623       if (src_str
3624           && CONST_INT_P (len_rtx)
3625           && (unsigned HOST_WIDE_INT) INTVAL (len_rtx) <= strlen (src_str) + 1
3626           && can_store_by_pieces (INTVAL (len_rtx), builtin_memcpy_read_str,
3627                                   CONST_CAST (char *, src_str),
3628                                   dest_align, false))
3629         {
3630           dest_mem = get_memory_rtx (dest, len);
3631           set_mem_align (dest_mem, dest_align);
3632           dest_mem = store_by_pieces (dest_mem, INTVAL (len_rtx),
3633                                       builtin_memcpy_read_str,
3634                                       CONST_CAST (char *, src_str),
3635                                       dest_align, false, endp);
3636           dest_mem = force_operand (XEXP (dest_mem, 0), NULL_RTX);
3637           dest_mem = convert_memory_address (ptr_mode, dest_mem);
3638           return dest_mem;
3639         }
3640
3641       if (CONST_INT_P (len_rtx)
3642           && can_move_by_pieces (INTVAL (len_rtx),
3643                                  MIN (dest_align, src_align)))
3644         {
3645           dest_mem = get_memory_rtx (dest, len);
3646           set_mem_align (dest_mem, dest_align);
3647           src_mem = get_memory_rtx (src, len);
3648           set_mem_align (src_mem, src_align);
3649           dest_mem = move_by_pieces (dest_mem, src_mem, INTVAL (len_rtx),
3650                                      MIN (dest_align, src_align), endp);
3651           dest_mem = force_operand (XEXP (dest_mem, 0), NULL_RTX);
3652           dest_mem = convert_memory_address (ptr_mode, dest_mem);
3653           return dest_mem;
3654         }
3655
3656       return NULL_RTX;
3657     }
3658 }
3659
3660 #ifndef HAVE_movstr
3661 # define HAVE_movstr 0
3662 # define CODE_FOR_movstr CODE_FOR_nothing
3663 #endif
3664
3665 /* Expand into a movstr instruction, if one is available.  Return NULL_RTX if
3666    we failed, the caller should emit a normal call, otherwise try to
3667    get the result in TARGET, if convenient.  If ENDP is 0 return the
3668    destination pointer, if ENDP is 1 return the end pointer ala
3669    mempcpy, and if ENDP is 2 return the end pointer minus one ala
3670    stpcpy.  */
3671
3672 static rtx
3673 expand_movstr (tree dest, tree src, rtx target, int endp)
3674 {
3675   rtx end;
3676   rtx dest_mem;
3677   rtx src_mem;
3678   rtx insn;
3679   const struct insn_data_d * data;
3680
3681   if (!HAVE_movstr)
3682     return NULL_RTX;
3683
3684   dest_mem = get_memory_rtx (dest, NULL);
3685   src_mem = get_memory_rtx (src, NULL);
3686   data = insn_data + CODE_FOR_movstr;
3687   if (!endp)
3688     {
3689       target = force_reg (Pmode, XEXP (dest_mem, 0));
3690       dest_mem = replace_equiv_address (dest_mem, target);
3691       end = gen_reg_rtx (Pmode);
3692     }
3693   else
3694     {
3695       if (target == 0
3696           || target == const0_rtx
3697           || ! (*data->operand[0].predicate) (target, Pmode))
3698         {
3699           end = gen_reg_rtx (Pmode);
3700           if (target != const0_rtx)
3701             target = end;
3702         }
3703       else
3704         end = target;
3705     }
3706
3707   if (data->operand[0].mode != VOIDmode)
3708     end = gen_lowpart (data->operand[0].mode, end);
3709
3710   insn = data->genfun (end, dest_mem, src_mem);
3711
3712   gcc_assert (insn);
3713
3714   emit_insn (insn);
3715
3716   /* movstr is supposed to set end to the address of the NUL
3717      terminator.  If the caller requested a mempcpy-like return value,
3718      adjust it.  */
3719   if (endp == 1 && target != const0_rtx)
3720     {
3721       rtx tem = plus_constant (gen_lowpart (GET_MODE (target), end), 1);
3722       emit_move_insn (target, force_operand (tem, NULL_RTX));
3723     }
3724
3725   return target;
3726 }
3727
3728 /* Expand expression EXP, which is a call to the strcpy builtin.  Return
3729    NULL_RTX if we failed the caller should emit a normal call, otherwise
3730    try to get the result in TARGET, if convenient (and in mode MODE if that's
3731    convenient).  */
3732
3733 static rtx
3734 expand_builtin_strcpy (tree exp, rtx target)
3735 {
3736   if (validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
3737    {
3738      tree dest = CALL_EXPR_ARG (exp, 0);
3739      tree src = CALL_EXPR_ARG (exp, 1);
3740      return expand_builtin_strcpy_args (dest, src, target);
3741    }
3742    return NULL_RTX;
3743 }
3744
3745 /* Helper function to do the actual work for expand_builtin_strcpy.  The
3746    arguments to the builtin_strcpy call DEST and SRC are broken out
3747    so that this can also be called without constructing an actual CALL_EXPR.
3748    The other arguments and return value are the same as for
3749    expand_builtin_strcpy.  */
3750
3751 static rtx
3752 expand_builtin_strcpy_args (tree dest, tree src, rtx target)
3753 {
3754   return expand_movstr (dest, src, target, /*endp=*/0);
3755 }
3756
3757 /* Expand a call EXP to the stpcpy builtin.
3758    Return NULL_RTX if we failed the caller should emit a normal call,
3759    otherwise try to get the result in TARGET, if convenient (and in
3760    mode MODE if that's convenient).  */
3761
3762 static rtx
3763 expand_builtin_stpcpy (tree exp, rtx target, enum machine_mode mode)
3764 {
3765   tree dst, src;
3766   location_t loc = EXPR_LOCATION (exp);
3767
3768   if (!validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
3769     return NULL_RTX;
3770
3771   dst = CALL_EXPR_ARG (exp, 0);
3772   src = CALL_EXPR_ARG (exp, 1);
3773
3774   /* If return value is ignored, transform stpcpy into strcpy.  */
3775   if (target == const0_rtx && implicit_built_in_decls[BUILT_IN_STRCPY])
3776     {
3777       tree fn = implicit_built_in_decls[BUILT_IN_STRCPY];
3778       tree result = build_call_nofold_loc (loc, fn, 2, dst, src);
3779       return expand_expr (result, target, mode, EXPAND_NORMAL);
3780     }
3781   else
3782     {
3783       tree len, lenp1;
3784       rtx ret;
3785
3786       /* Ensure we get an actual string whose length can be evaluated at
3787          compile-time, not an expression containing a string.  This is
3788          because the latter will potentially produce pessimized code
3789          when used to produce the return value.  */
3790       if (! c_getstr (src) || ! (len = c_strlen (src, 0)))
3791         return expand_movstr (dst, src, target, /*endp=*/2);
3792
3793       lenp1 = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
3794       ret = expand_builtin_mempcpy_args (dst, src, lenp1,
3795                                          target, mode, /*endp=*/2);
3796
3797       if (ret)
3798         return ret;
3799
3800       if (TREE_CODE (len) == INTEGER_CST)
3801         {
3802           rtx len_rtx = expand_normal (len);
3803
3804           if (CONST_INT_P (len_rtx))
3805             {
3806               ret = expand_builtin_strcpy_args (dst, src, target);
3807
3808               if (ret)
3809                 {
3810                   if (! target)
3811                     {
3812                       if (mode != VOIDmode)
3813                         target = gen_reg_rtx (mode);
3814                       else
3815                         target = gen_reg_rtx (GET_MODE (ret));
3816                     }
3817                   if (GET_MODE (target) != GET_MODE (ret))
3818                     ret = gen_lowpart (GET_MODE (target), ret);
3819
3820                   ret = plus_constant (ret, INTVAL (len_rtx));
3821                   ret = emit_move_insn (target, force_operand (ret, NULL_RTX));
3822                   gcc_assert (ret);
3823
3824                   return target;
3825                 }
3826             }
3827         }
3828
3829       return expand_movstr (dst, src, target, /*endp=*/2);
3830     }
3831 }
3832
3833 /* Callback routine for store_by_pieces.  Read GET_MODE_BITSIZE (MODE)
3834    bytes from constant string DATA + OFFSET and return it as target
3835    constant.  */
3836
3837 rtx
3838 builtin_strncpy_read_str (void *data, HOST_WIDE_INT offset,
3839                           enum machine_mode mode)
3840 {
3841   const char *str = (const char *) data;
3842
3843   if ((unsigned HOST_WIDE_INT) offset > strlen (str))
3844     return const0_rtx;
3845
3846   return c_readstr (str + offset, mode);
3847 }
3848
3849 /* Expand expression EXP, which is a call to the strncpy builtin.  Return
3850    NULL_RTX if we failed the caller should emit a normal call.  */
3851
3852 static rtx
3853 expand_builtin_strncpy (tree exp, rtx target)
3854 {
3855   location_t loc = EXPR_LOCATION (exp);
3856
3857   if (validate_arglist (exp,
3858                         POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
3859     {
3860       tree dest = CALL_EXPR_ARG (exp, 0);
3861       tree src = CALL_EXPR_ARG (exp, 1);
3862       tree len = CALL_EXPR_ARG (exp, 2);
3863       tree slen = c_strlen (src, 1);
3864
3865       /* We must be passed a constant len and src parameter.  */
3866       if (!host_integerp (len, 1) || !slen || !host_integerp (slen, 1))
3867         return NULL_RTX;
3868
3869       slen = size_binop_loc (loc, PLUS_EXPR, slen, ssize_int (1));
3870
3871       /* We're required to pad with trailing zeros if the requested
3872          len is greater than strlen(s2)+1.  In that case try to
3873          use store_by_pieces, if it fails, punt.  */
3874       if (tree_int_cst_lt (slen, len))
3875         {
3876           unsigned int dest_align
3877             = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
3878           const char *p = c_getstr (src);
3879           rtx dest_mem;
3880
3881           if (!p || dest_align == 0 || !host_integerp (len, 1)
3882               || !can_store_by_pieces (tree_low_cst (len, 1),
3883                                        builtin_strncpy_read_str,
3884                                        CONST_CAST (char *, p),
3885                                        dest_align, false))
3886             return NULL_RTX;
3887
3888           dest_mem = get_memory_rtx (dest, len);
3889           store_by_pieces (dest_mem, tree_low_cst (len, 1),
3890                            builtin_strncpy_read_str,
3891                            CONST_CAST (char *, p), dest_align, false, 0);
3892           dest_mem = force_operand (XEXP (dest_mem, 0), target);
3893           dest_mem = convert_memory_address (ptr_mode, dest_mem);
3894           return dest_mem;
3895         }
3896     }
3897   return NULL_RTX;
3898 }
3899
3900 /* Callback routine for store_by_pieces.  Read GET_MODE_BITSIZE (MODE)
3901    bytes from constant string DATA + OFFSET and return it as target
3902    constant.  */
3903
3904 rtx
3905 builtin_memset_read_str (void *data, HOST_WIDE_INT offset ATTRIBUTE_UNUSED,
3906                          enum machine_mode mode)
3907 {
3908   const char *c = (const char *) data;
3909   char *p = XALLOCAVEC (char, GET_MODE_SIZE (mode));
3910
3911   memset (p, *c, GET_MODE_SIZE (mode));
3912
3913   return c_readstr (p, mode);
3914 }
3915
3916 /* Callback routine for store_by_pieces.  Return the RTL of a register
3917    containing GET_MODE_SIZE (MODE) consecutive copies of the unsigned
3918    char value given in the RTL register data.  For example, if mode is
3919    4 bytes wide, return the RTL for 0x01010101*data.  */
3920
3921 static rtx
3922 builtin_memset_gen_str (void *data, HOST_WIDE_INT offset ATTRIBUTE_UNUSED,
3923                         enum machine_mode mode)
3924 {
3925   rtx target, coeff;
3926   size_t size;
3927   char *p;
3928
3929   size = GET_MODE_SIZE (mode);
3930   if (size == 1)
3931     return (rtx) data;
3932
3933   p = XALLOCAVEC (char, size);
3934   memset (p, 1, size);
3935   coeff = c_readstr (p, mode);
3936
3937   target = convert_to_mode (mode, (rtx) data, 1);
3938   target = expand_mult (mode, target, coeff, NULL_RTX, 1);
3939   return force_reg (mode, target);
3940 }
3941
3942 /* Expand expression EXP, which is a call to the memset builtin.  Return
3943    NULL_RTX if we failed the caller should emit a normal call, otherwise
3944    try to get the result in TARGET, if convenient (and in mode MODE if that's
3945    convenient).  */
3946
3947 static rtx
3948 expand_builtin_memset (tree exp, rtx target, enum machine_mode mode)
3949 {
3950   if (!validate_arglist (exp,
3951                          POINTER_TYPE, INTEGER_TYPE, INTEGER_TYPE, VOID_TYPE))
3952     return NULL_RTX;
3953   else
3954     {
3955       tree dest = CALL_EXPR_ARG (exp, 0);
3956       tree val = CALL_EXPR_ARG (exp, 1);
3957       tree len = CALL_EXPR_ARG (exp, 2);
3958       return expand_builtin_memset_args (dest, val, len, target, mode, exp);
3959     }
3960 }
3961
3962 /* Helper function to do the actual work for expand_builtin_memset.  The
3963    arguments to the builtin_memset call DEST, VAL, and LEN are broken out
3964    so that this can also be called without constructing an actual CALL_EXPR.
3965    The other arguments and return value are the same as for
3966    expand_builtin_memset.  */
3967
3968 static rtx
3969 expand_builtin_memset_args (tree dest, tree val, tree len,
3970                             rtx target, enum machine_mode mode, tree orig_exp)
3971 {
3972   tree fndecl, fn;
3973   enum built_in_function fcode;
3974   char c;
3975   unsigned int dest_align;
3976   rtx dest_mem, dest_addr, len_rtx;
3977   HOST_WIDE_INT expected_size = -1;
3978   unsigned int expected_align = 0;
3979
3980   dest_align = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
3981
3982   /* If DEST is not a pointer type, don't do this operation in-line.  */
3983   if (dest_align == 0)
3984     return NULL_RTX;
3985
3986   if (currently_expanding_gimple_stmt)
3987     stringop_block_profile (currently_expanding_gimple_stmt,
3988                             &expected_align, &expected_size);
3989
3990   if (expected_align < dest_align)
3991     expected_align = dest_align;
3992
3993   /* If the LEN parameter is zero, return DEST.  */
3994   if (integer_zerop (len))
3995     {
3996       /* Evaluate and ignore VAL in case it has side-effects.  */
3997       expand_expr (val, const0_rtx, VOIDmode, EXPAND_NORMAL);
3998       return expand_expr (dest, target, mode, EXPAND_NORMAL);
3999     }
4000
4001   /* Stabilize the arguments in case we fail.  */
4002   dest = builtin_save_expr (dest);
4003   val = builtin_save_expr (val);
4004   len = builtin_save_expr (len);
4005
4006   len_rtx = expand_normal (len);
4007   dest_mem = get_memory_rtx (dest, len);
4008
4009   if (TREE_CODE (val) != INTEGER_CST)
4010     {
4011       rtx val_rtx;
4012
4013       val_rtx = expand_normal (val);
4014       val_rtx = convert_to_mode (TYPE_MODE (unsigned_char_type_node),
4015                                  val_rtx, 0);
4016
4017       /* Assume that we can memset by pieces if we can store
4018        * the coefficients by pieces (in the required modes).
4019        * We can't pass builtin_memset_gen_str as that emits RTL.  */
4020       c = 1;
4021       if (host_integerp (len, 1)
4022           && can_store_by_pieces (tree_low_cst (len, 1),
4023                                   builtin_memset_read_str, &c, dest_align,
4024                                   true))
4025         {
4026           val_rtx = force_reg (TYPE_MODE (unsigned_char_type_node),
4027                                val_rtx);
4028           store_by_pieces (dest_mem, tree_low_cst (len, 1),
4029                            builtin_memset_gen_str, val_rtx, dest_align,
4030                            true, 0);
4031         }
4032       else if (!set_storage_via_setmem (dest_mem, len_rtx, val_rtx,
4033                                         dest_align, expected_align,
4034                                         expected_size))
4035         goto do_libcall;
4036
4037       dest_mem = force_operand (XEXP (dest_mem, 0), NULL_RTX);
4038       dest_mem = convert_memory_address (ptr_mode, dest_mem);
4039       return dest_mem;
4040     }
4041
4042   if (target_char_cast (val, &c))
4043     goto do_libcall;
4044
4045   if (c)
4046     {
4047       if (host_integerp (len, 1)
4048           && can_store_by_pieces (tree_low_cst (len, 1),
4049                                   builtin_memset_read_str, &c, dest_align,
4050                                   true))
4051         store_by_pieces (dest_mem, tree_low_cst (len, 1),
4052                          builtin_memset_read_str, &c, dest_align, true, 0);
4053       else if (!set_storage_via_setmem (dest_mem, len_rtx, GEN_INT (c),
4054                                         dest_align, expected_align,
4055                                         expected_size))
4056         goto do_libcall;
4057
4058       dest_mem = force_operand (XEXP (dest_mem, 0), NULL_RTX);
4059       dest_mem = convert_memory_address (ptr_mode, dest_mem);
4060       return dest_mem;
4061     }
4062
4063   set_mem_align (dest_mem, dest_align);
4064   dest_addr = clear_storage_hints (dest_mem, len_rtx,
4065                                    CALL_EXPR_TAILCALL (orig_exp)
4066                                    ? BLOCK_OP_TAILCALL : BLOCK_OP_NORMAL,
4067                                    expected_align, expected_size);
4068
4069   if (dest_addr == 0)
4070     {
4071       dest_addr = force_operand (XEXP (dest_mem, 0), NULL_RTX);
4072       dest_addr = convert_memory_address (ptr_mode, dest_addr);
4073     }
4074
4075   return dest_addr;
4076
4077  do_libcall:
4078   fndecl = get_callee_fndecl (orig_exp);
4079   fcode = DECL_FUNCTION_CODE (fndecl);
4080   if (fcode == BUILT_IN_MEMSET)
4081     fn = build_call_nofold_loc (EXPR_LOCATION (orig_exp), fndecl, 3,
4082                                 dest, val, len);
4083   else if (fcode == BUILT_IN_BZERO)
4084     fn = build_call_nofold_loc (EXPR_LOCATION (orig_exp), fndecl, 2,
4085                                 dest, len);
4086   else
4087     gcc_unreachable ();
4088   gcc_assert (TREE_CODE (fn) == CALL_EXPR);
4089   CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (orig_exp);
4090   return expand_call (fn, target, target == const0_rtx);
4091 }
4092
4093 /* Expand expression EXP, which is a call to the bzero builtin.  Return
4094    NULL_RTX if we failed the caller should emit a normal call.  */
4095
4096 static rtx
4097 expand_builtin_bzero (tree exp)
4098 {
4099   tree dest, size;
4100   location_t loc = EXPR_LOCATION (exp);
4101
4102   if (!validate_arglist (exp, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
4103     return NULL_RTX;
4104
4105   dest = CALL_EXPR_ARG (exp, 0);
4106   size = CALL_EXPR_ARG (exp, 1);
4107
4108   /* New argument list transforming bzero(ptr x, int y) to
4109      memset(ptr x, int 0, size_t y).   This is done this way
4110      so that if it isn't expanded inline, we fallback to
4111      calling bzero instead of memset.  */
4112
4113   return expand_builtin_memset_args (dest, integer_zero_node,
4114                                      fold_convert_loc (loc, sizetype, size),
4115                                      const0_rtx, VOIDmode, exp);
4116 }
4117
4118 /* Expand expression EXP, which is a call to the memcmp built-in function.
4119    Return NULL_RTX if we failed and the
4120    caller should emit a normal call, otherwise try to get the result in
4121    TARGET, if convenient (and in mode MODE, if that's convenient).  */
4122
4123 static rtx
4124 expand_builtin_memcmp (tree exp, ATTRIBUTE_UNUSED rtx target,
4125                        ATTRIBUTE_UNUSED enum machine_mode mode)
4126 {
4127   location_t loc ATTRIBUTE_UNUSED = EXPR_LOCATION (exp);
4128
4129   if (!validate_arglist (exp,
4130                          POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
4131     return NULL_RTX;
4132
4133 #if defined HAVE_cmpmemsi || defined HAVE_cmpstrnsi
4134   {
4135     rtx arg1_rtx, arg2_rtx, arg3_rtx;
4136     rtx result;
4137     rtx insn;
4138     tree arg1 = CALL_EXPR_ARG (exp, 0);
4139     tree arg2 = CALL_EXPR_ARG (exp, 1);
4140     tree len = CALL_EXPR_ARG (exp, 2);
4141
4142     unsigned int arg1_align
4143       = get_pointer_alignment (arg1, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
4144     unsigned int arg2_align
4145       = get_pointer_alignment (arg2, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
4146     enum machine_mode insn_mode;
4147
4148 #ifdef HAVE_cmpmemsi
4149     if (HAVE_cmpmemsi)
4150       insn_mode = insn_data[(int) CODE_FOR_cmpmemsi].operand[0].mode;
4151     else
4152 #endif
4153 #ifdef HAVE_cmpstrnsi
4154     if (HAVE_cmpstrnsi)
4155       insn_mode = insn_data[(int) CODE_FOR_cmpstrnsi].operand[0].mode;
4156     else
4157 #endif
4158       return NULL_RTX;
4159
4160     /* If we don't have POINTER_TYPE, call the function.  */
4161     if (arg1_align == 0 || arg2_align == 0)
4162       return NULL_RTX;
4163
4164     /* Make a place to write the result of the instruction.  */
4165     result = target;
4166     if (! (result != 0
4167            && REG_P (result) && GET_MODE (result) == insn_mode
4168            && REGNO (result) >= FIRST_PSEUDO_REGISTER))
4169       result = gen_reg_rtx (insn_mode);
4170
4171     arg1_rtx = get_memory_rtx (arg1, len);
4172     arg2_rtx = get_memory_rtx (arg2, len);
4173     arg3_rtx = expand_normal (fold_convert_loc (loc, sizetype, len));
4174
4175     /* Set MEM_SIZE as appropriate.  */
4176     if (CONST_INT_P (arg3_rtx))
4177       {
4178         set_mem_size (arg1_rtx, arg3_rtx);
4179         set_mem_size (arg2_rtx, arg3_rtx);
4180       }
4181
4182 #ifdef HAVE_cmpmemsi
4183     if (HAVE_cmpmemsi)
4184       insn = gen_cmpmemsi (result, arg1_rtx, arg2_rtx, arg3_rtx,
4185                            GEN_INT (MIN (arg1_align, arg2_align)));
4186     else
4187 #endif
4188 #ifdef HAVE_cmpstrnsi
4189     if (HAVE_cmpstrnsi)
4190       insn = gen_cmpstrnsi (result, arg1_rtx, arg2_rtx, arg3_rtx,
4191                             GEN_INT (MIN (arg1_align, arg2_align)));
4192     else
4193 #endif
4194       gcc_unreachable ();
4195
4196     if (insn)
4197       emit_insn (insn);
4198     else
4199       emit_library_call_value (memcmp_libfunc, result, LCT_PURE,
4200                                TYPE_MODE (integer_type_node), 3,
4201                                XEXP (arg1_rtx, 0), Pmode,
4202                                XEXP (arg2_rtx, 0), Pmode,
4203                                convert_to_mode (TYPE_MODE (sizetype), arg3_rtx,
4204                                                 TYPE_UNSIGNED (sizetype)),
4205                                TYPE_MODE (sizetype));
4206
4207     /* Return the value in the proper mode for this function.  */
4208     mode = TYPE_MODE (TREE_TYPE (exp));
4209     if (GET_MODE (result) == mode)
4210       return result;
4211     else if (target != 0)
4212       {
4213         convert_move (target, result, 0);
4214         return target;
4215       }
4216     else
4217       return convert_to_mode (mode, result, 0);
4218   }
4219 #endif
4220
4221   return NULL_RTX;
4222 }
4223
4224 /* Expand expression EXP, which is a call to the strcmp builtin.  Return NULL_RTX
4225    if we failed the caller should emit a normal call, otherwise try to get
4226    the result in TARGET, if convenient.  */
4227
4228 static rtx
4229 expand_builtin_strcmp (tree exp, ATTRIBUTE_UNUSED rtx target)
4230 {
4231   if (!validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
4232     return NULL_RTX;
4233
4234 #if defined HAVE_cmpstrsi || defined HAVE_cmpstrnsi
4235   if (direct_optab_handler (cmpstr_optab, SImode) != CODE_FOR_nothing
4236       || direct_optab_handler (cmpstrn_optab, SImode) != CODE_FOR_nothing)
4237     {
4238       rtx arg1_rtx, arg2_rtx;
4239       rtx result, insn = NULL_RTX;
4240       tree fndecl, fn;
4241       tree arg1 = CALL_EXPR_ARG (exp, 0);
4242       tree arg2 = CALL_EXPR_ARG (exp, 1);
4243
4244       unsigned int arg1_align
4245         = get_pointer_alignment (arg1, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
4246       unsigned int arg2_align
4247         = get_pointer_alignment (arg2, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
4248
4249       /* If we don't have POINTER_TYPE, call the function.  */
4250       if (arg1_align == 0 || arg2_align == 0)
4251         return NULL_RTX;
4252
4253       /* Stabilize the arguments in case gen_cmpstr(n)si fail.  */
4254       arg1 = builtin_save_expr (arg1);
4255       arg2 = builtin_save_expr (arg2);
4256
4257       arg1_rtx = get_memory_rtx (arg1, NULL);
4258       arg2_rtx = get_memory_rtx (arg2, NULL);
4259
4260 #ifdef HAVE_cmpstrsi
4261       /* Try to call cmpstrsi.  */
4262       if (HAVE_cmpstrsi)
4263         {
4264           enum machine_mode insn_mode
4265             = insn_data[(int) CODE_FOR_cmpstrsi].operand[0].mode;
4266
4267           /* Make a place to write the result of the instruction.  */
4268           result = target;
4269           if (! (result != 0
4270                  && REG_P (result) && GET_MODE (result) == insn_mode
4271                  && REGNO (result) >= FIRST_PSEUDO_REGISTER))
4272             result = gen_reg_rtx (insn_mode);
4273
4274           insn = gen_cmpstrsi (result, arg1_rtx, arg2_rtx,
4275                                GEN_INT (MIN (arg1_align, arg2_align)));
4276         }
4277 #endif
4278 #ifdef HAVE_cmpstrnsi
4279       /* Try to determine at least one length and call cmpstrnsi.  */
4280       if (!insn && HAVE_cmpstrnsi)
4281         {
4282           tree len;
4283           rtx arg3_rtx;
4284
4285           enum machine_mode insn_mode
4286             = insn_data[(int) CODE_FOR_cmpstrnsi].operand[0].mode;
4287           tree len1 = c_strlen (arg1, 1);
4288           tree len2 = c_strlen (arg2, 1);
4289
4290           if (len1)
4291             len1 = size_binop (PLUS_EXPR, ssize_int (1), len1);
4292           if (len2)
4293             len2 = size_binop (PLUS_EXPR, ssize_int (1), len2);
4294
4295           /* If we don't have a constant length for the first, use the length
4296              of the second, if we know it.  We don't require a constant for
4297              this case; some cost analysis could be done if both are available
4298              but neither is constant.  For now, assume they're equally cheap,
4299              unless one has side effects.  If both strings have constant lengths,
4300              use the smaller.  */
4301
4302           if (!len1)
4303             len = len2;
4304           else if (!len2)
4305             len = len1;
4306           else if (TREE_SIDE_EFFECTS (len1))
4307             len = len2;
4308           else if (TREE_SIDE_EFFECTS (len2))
4309             len = len1;
4310           else if (TREE_CODE (len1) != INTEGER_CST)
4311             len = len2;
4312           else if (TREE_CODE (len2) != INTEGER_CST)
4313             len = len1;
4314           else if (tree_int_cst_lt (len1, len2))
4315             len = len1;
4316           else
4317             len = len2;
4318
4319           /* If both arguments have side effects, we cannot optimize.  */
4320           if (!len || TREE_SIDE_EFFECTS (len))
4321             goto do_libcall;
4322
4323           arg3_rtx = expand_normal (len);
4324
4325           /* Make a place to write the result of the instruction.  */
4326           result = target;
4327           if (! (result != 0
4328                  && REG_P (result) && GET_MODE (result) == insn_mode
4329                  && REGNO (result) >= FIRST_PSEUDO_REGISTER))
4330             result = gen_reg_rtx (insn_mode);
4331
4332           insn = gen_cmpstrnsi (result, arg1_rtx, arg2_rtx, arg3_rtx,
4333                                 GEN_INT (MIN (arg1_align, arg2_align)));
4334         }
4335 #endif
4336
4337       if (insn)
4338         {
4339           enum machine_mode mode;
4340           emit_insn (insn);
4341
4342           /* Return the value in the proper mode for this function.  */
4343           mode = TYPE_MODE (TREE_TYPE (exp));
4344           if (GET_MODE (result) == mode)
4345             return result;
4346           if (target == 0)
4347             return convert_to_mode (mode, result, 0);
4348           convert_move (target, result, 0);
4349           return target;
4350         }
4351
4352       /* Expand the library call ourselves using a stabilized argument
4353          list to avoid re-evaluating the function's arguments twice.  */
4354 #ifdef HAVE_cmpstrnsi
4355     do_libcall:
4356 #endif
4357       fndecl = get_callee_fndecl (exp);
4358       fn = build_call_nofold_loc (EXPR_LOCATION (exp), fndecl, 2, arg1, arg2);
4359       gcc_assert (TREE_CODE (fn) == CALL_EXPR);
4360       CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (exp);
4361       return expand_call (fn, target, target == const0_rtx);
4362     }
4363 #endif
4364   return NULL_RTX;
4365 }
4366
4367 /* Expand expression EXP, which is a call to the strncmp builtin. Return
4368    NULL_RTX if we failed the caller should emit a normal call, otherwise try to get
4369    the result in TARGET, if convenient.  */
4370
4371 static rtx
4372 expand_builtin_strncmp (tree exp, ATTRIBUTE_UNUSED rtx target,
4373                         ATTRIBUTE_UNUSED enum machine_mode mode)
4374 {
4375   location_t loc ATTRIBUTE_UNUSED = EXPR_LOCATION (exp);
4376
4377   if (!validate_arglist (exp,
4378                          POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
4379     return NULL_RTX;
4380
4381   /* If c_strlen can determine an expression for one of the string
4382      lengths, and it doesn't have side effects, then emit cmpstrnsi
4383      using length MIN(strlen(string)+1, arg3).  */
4384 #ifdef HAVE_cmpstrnsi
4385   if (HAVE_cmpstrnsi)
4386   {
4387     tree len, len1, len2;
4388     rtx arg1_rtx, arg2_rtx, arg3_rtx;
4389     rtx result, insn;
4390     tree fndecl, fn;
4391     tree arg1 = CALL_EXPR_ARG (exp, 0);
4392     tree arg2 = CALL_EXPR_ARG (exp, 1);
4393     tree arg3 = CALL_EXPR_ARG (exp, 2);
4394
4395     unsigned int arg1_align
4396       = get_pointer_alignment (arg1, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
4397     unsigned int arg2_align
4398       = get_pointer_alignment (arg2, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
4399     enum machine_mode insn_mode
4400       = insn_data[(int) CODE_FOR_cmpstrnsi].operand[0].mode;
4401
4402     len1 = c_strlen (arg1, 1);
4403     len2 = c_strlen (arg2, 1);
4404
4405     if (len1)
4406       len1 = size_binop_loc (loc, PLUS_EXPR, ssize_int (1), len1);
4407     if (len2)
4408       len2 = size_binop_loc (loc, PLUS_EXPR, ssize_int (1), len2);
4409
4410     /* If we don't have a constant length for the first, use the length
4411        of the second, if we know it.  We don't require a constant for
4412        this case; some cost analysis could be done if both are available
4413        but neither is constant.  For now, assume they're equally cheap,
4414        unless one has side effects.  If both strings have constant lengths,
4415        use the smaller.  */
4416
4417     if (!len1)
4418       len = len2;
4419     else if (!len2)
4420       len = len1;
4421     else if (TREE_SIDE_EFFECTS (len1))
4422       len = len2;
4423     else if (TREE_SIDE_EFFECTS (len2))
4424       len = len1;
4425     else if (TREE_CODE (len1) != INTEGER_CST)
4426       len = len2;
4427     else if (TREE_CODE (len2) != INTEGER_CST)
4428       len = len1;
4429     else if (tree_int_cst_lt (len1, len2))
4430       len = len1;
4431     else
4432       len = len2;
4433
4434     /* If both arguments have side effects, we cannot optimize.  */
4435     if (!len || TREE_SIDE_EFFECTS (len))
4436       return NULL_RTX;
4437
4438     /* The actual new length parameter is MIN(len,arg3).  */
4439     len = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (len), len,
4440                        fold_convert_loc (loc, TREE_TYPE (len), arg3));
4441
4442     /* If we don't have POINTER_TYPE, call the function.  */
4443     if (arg1_align == 0 || arg2_align == 0)
4444       return NULL_RTX;
4445
4446     /* Make a place to write the result of the instruction.  */
4447     result = target;
4448     if (! (result != 0
4449            && REG_P (result) && GET_MODE (result) == insn_mode
4450            && REGNO (result) >= FIRST_PSEUDO_REGISTER))
4451       result = gen_reg_rtx (insn_mode);
4452
4453     /* Stabilize the arguments in case gen_cmpstrnsi fails.  */
4454     arg1 = builtin_save_expr (arg1);
4455     arg2 = builtin_save_expr (arg2);
4456     len = builtin_save_expr (len);
4457
4458     arg1_rtx = get_memory_rtx (arg1, len);
4459     arg2_rtx = get_memory_rtx (arg2, len);
4460     arg3_rtx = expand_normal (len);
4461     insn = gen_cmpstrnsi (result, arg1_rtx, arg2_rtx, arg3_rtx,
4462                           GEN_INT (MIN (arg1_align, arg2_align)));
4463     if (insn)
4464       {
4465         emit_insn (insn);
4466
4467         /* Return the value in the proper mode for this function.  */
4468         mode = TYPE_MODE (TREE_TYPE (exp));
4469         if (GET_MODE (result) == mode)
4470           return result;
4471         if (target == 0)
4472           return convert_to_mode (mode, result, 0);
4473         convert_move (target, result, 0);
4474         return target;
4475       }
4476
4477     /* Expand the library call ourselves using a stabilized argument
4478        list to avoid re-evaluating the function's arguments twice.  */
4479     fndecl = get_callee_fndecl (exp);
4480     fn = build_call_nofold_loc (EXPR_LOCATION (exp), fndecl, 3,
4481                                 arg1, arg2, len);
4482     gcc_assert (TREE_CODE (fn) == CALL_EXPR);
4483     CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (exp);
4484     return expand_call (fn, target, target == const0_rtx);
4485   }
4486 #endif
4487   return NULL_RTX;
4488 }
4489
4490 /* Expand a call to __builtin_saveregs, generating the result in TARGET,
4491    if that's convenient.  */
4492
4493 rtx
4494 expand_builtin_saveregs (void)
4495 {
4496   rtx val, seq;
4497
4498   /* Don't do __builtin_saveregs more than once in a function.
4499      Save the result of the first call and reuse it.  */
4500   if (saveregs_value != 0)
4501     return saveregs_value;
4502
4503   /* When this function is called, it means that registers must be
4504      saved on entry to this function.  So we migrate the call to the
4505      first insn of this function.  */
4506
4507   start_sequence ();
4508
4509   /* Do whatever the machine needs done in this case.  */
4510   val = targetm.calls.expand_builtin_saveregs ();
4511
4512   seq = get_insns ();
4513   end_sequence ();
4514
4515   saveregs_value = val;
4516
4517   /* Put the insns after the NOTE that starts the function.  If this
4518      is inside a start_sequence, make the outer-level insn chain current, so
4519      the code is placed at the start of the function.  */
4520   push_topmost_sequence ();
4521   emit_insn_after (seq, entry_of_function ());
4522   pop_topmost_sequence ();
4523
4524   return val;
4525 }
4526
4527 /* Expand a call to __builtin_next_arg.  */
4528
4529 static rtx
4530 expand_builtin_next_arg (void)
4531 {
4532   /* Checking arguments is already done in fold_builtin_next_arg
4533      that must be called before this function.  */
4534   return expand_binop (ptr_mode, add_optab,
4535                        crtl->args.internal_arg_pointer,
4536                        crtl->args.arg_offset_rtx,
4537                        NULL_RTX, 0, OPTAB_LIB_WIDEN);
4538 }
4539
4540 /* Make it easier for the backends by protecting the valist argument
4541    from multiple evaluations.  */
4542
4543 static tree
4544 stabilize_va_list_loc (location_t loc, tree valist, int needs_lvalue)
4545 {
4546   tree vatype = targetm.canonical_va_list_type (TREE_TYPE (valist));
4547
4548   /* The current way of determining the type of valist is completely
4549      bogus.  We should have the information on the va builtin instead.  */
4550   if (!vatype)
4551     vatype = targetm.fn_abi_va_list (cfun->decl);
4552
4553   if (TREE_CODE (vatype) == ARRAY_TYPE)
4554     {
4555       if (TREE_SIDE_EFFECTS (valist))
4556         valist = save_expr (valist);
4557
4558       /* For this case, the backends will be expecting a pointer to
4559          vatype, but it's possible we've actually been given an array
4560          (an actual TARGET_CANONICAL_VA_LIST_TYPE (valist)).
4561          So fix it.  */
4562       if (TREE_CODE (TREE_TYPE (valist)) == ARRAY_TYPE)
4563         {
4564           tree p1 = build_pointer_type (TREE_TYPE (vatype));
4565           valist = build_fold_addr_expr_with_type_loc (loc, valist, p1);
4566         }
4567     }
4568   else
4569     {
4570       tree pt = build_pointer_type (vatype);
4571
4572       if (! needs_lvalue)
4573         {
4574           if (! TREE_SIDE_EFFECTS (valist))
4575             return valist;
4576
4577           valist = fold_build1_loc (loc, ADDR_EXPR, pt, valist);
4578           TREE_SIDE_EFFECTS (valist) = 1;
4579         }
4580
4581       if (TREE_SIDE_EFFECTS (valist))
4582         valist = save_expr (valist);
4583       valist = fold_build2_loc (loc, MEM_REF,
4584                                 vatype, valist, build_int_cst (pt, 0));
4585     }
4586
4587   return valist;
4588 }
4589
4590 /* The "standard" definition of va_list is void*.  */
4591
4592 tree
4593 std_build_builtin_va_list (void)
4594 {
4595   return ptr_type_node;
4596 }
4597
4598 /* The "standard" abi va_list is va_list_type_node.  */
4599
4600 tree
4601 std_fn_abi_va_list (tree fndecl ATTRIBUTE_UNUSED)
4602 {
4603   return va_list_type_node;
4604 }
4605
4606 /* The "standard" type of va_list is va_list_type_node.  */
4607
4608 tree
4609 std_canonical_va_list_type (tree type)
4610 {
4611   tree wtype, htype;
4612
4613   if (INDIRECT_REF_P (type))
4614     type = TREE_TYPE (type);
4615   else if (POINTER_TYPE_P (type) && POINTER_TYPE_P (TREE_TYPE(type)))
4616     type = TREE_TYPE (type);
4617   wtype = va_list_type_node;
4618   htype = type;
4619   /* Treat structure va_list types.  */
4620   if (TREE_CODE (wtype) == RECORD_TYPE && POINTER_TYPE_P (htype))
4621     htype = TREE_TYPE (htype);
4622   else if (TREE_CODE (wtype) == ARRAY_TYPE)
4623     {
4624       /* If va_list is an array type, the argument may have decayed
4625          to a pointer type, e.g. by being passed to another function.
4626          In that case, unwrap both types so that we can compare the
4627          underlying records.  */
4628       if (TREE_CODE (htype) == ARRAY_TYPE
4629           || POINTER_TYPE_P (htype))
4630         {
4631           wtype = TREE_TYPE (wtype);
4632           htype = TREE_TYPE (htype);
4633         }
4634     }
4635   if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
4636     return va_list_type_node;
4637
4638   return NULL_TREE;
4639 }
4640
4641 /* The "standard" implementation of va_start: just assign `nextarg' to
4642    the variable.  */
4643
4644 void
4645 std_expand_builtin_va_start (tree valist, rtx nextarg)
4646 {
4647   rtx va_r = expand_expr (valist, NULL_RTX, VOIDmode, EXPAND_WRITE);
4648   convert_move (va_r, nextarg, 0);
4649 }
4650
4651 /* Expand EXP, a call to __builtin_va_start.  */
4652
4653 static rtx
4654 expand_builtin_va_start (tree exp)
4655 {
4656   rtx nextarg;
4657   tree valist;
4658   location_t loc = EXPR_LOCATION (exp);
4659
4660   if (call_expr_nargs (exp) < 2)
4661     {
4662       error_at (loc, "too few arguments to function %<va_start%>");
4663       return const0_rtx;
4664     }
4665
4666   if (fold_builtin_next_arg (exp, true))
4667     return const0_rtx;
4668
4669   nextarg = expand_builtin_next_arg ();
4670   valist = stabilize_va_list_loc (loc, CALL_EXPR_ARG (exp, 0), 1);
4671
4672   if (targetm.expand_builtin_va_start)
4673     targetm.expand_builtin_va_start (valist, nextarg);
4674   else
4675     std_expand_builtin_va_start (valist, nextarg);
4676
4677   return const0_rtx;
4678 }
4679
4680 /* The "standard" implementation of va_arg: read the value from the
4681    current (padded) address and increment by the (padded) size.  */
4682
4683 tree
4684 std_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
4685                           gimple_seq *post_p)
4686 {
4687   tree addr, t, type_size, rounded_size, valist_tmp;
4688   unsigned HOST_WIDE_INT align, boundary;
4689   bool indirect;
4690
4691 #ifdef ARGS_GROW_DOWNWARD
4692   /* All of the alignment and movement below is for args-grow-up machines.
4693      As of 2004, there are only 3 ARGS_GROW_DOWNWARD targets, and they all
4694      implement their own specialized gimplify_va_arg_expr routines.  */
4695   gcc_unreachable ();
4696 #endif
4697
4698   indirect = pass_by_reference (NULL, TYPE_MODE (type), type, false);
4699   if (indirect)
4700     type = build_pointer_type (type);
4701
4702   align = PARM_BOUNDARY / BITS_PER_UNIT;
4703   boundary = targetm.calls.function_arg_boundary (TYPE_MODE (type), type);
4704
4705   /* When we align parameter on stack for caller, if the parameter
4706      alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
4707      aligned at MAX_SUPPORTED_STACK_ALIGNMENT.  We will match callee
4708      here with caller.  */
4709   if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
4710     boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
4711
4712   boundary /= BITS_PER_UNIT;
4713
4714   /* Hoist the valist value into a temporary for the moment.  */
4715   valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
4716
4717   /* va_list pointer is aligned to PARM_BOUNDARY.  If argument actually
4718      requires greater alignment, we must perform dynamic alignment.  */
4719   if (boundary > align
4720       && !integer_zerop (TYPE_SIZE (type)))
4721     {
4722       t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
4723                   fold_build2 (POINTER_PLUS_EXPR,
4724                                TREE_TYPE (valist),
4725                                valist_tmp, size_int (boundary - 1)));
4726       gimplify_and_add (t, pre_p);
4727
4728       t = fold_convert (sizetype, valist_tmp);
4729       t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
4730                   fold_convert (TREE_TYPE (valist),
4731                                 fold_build2 (BIT_AND_EXPR, sizetype, t,
4732                                              size_int (-boundary))));
4733       gimplify_and_add (t, pre_p);
4734     }
4735   else
4736     boundary = align;
4737
4738   /* If the actual alignment is less than the alignment of the type,
4739      adjust the type accordingly so that we don't assume strict alignment
4740      when dereferencing the pointer.  */
4741   boundary *= BITS_PER_UNIT;
4742   if (boundary < TYPE_ALIGN (type))
4743     {
4744       type = build_variant_type_copy (type);
4745       TYPE_ALIGN (type) = boundary;
4746     }
4747
4748   /* Compute the rounded size of the type.  */
4749   type_size = size_in_bytes (type);
4750   rounded_size = round_up (type_size, align);
4751
4752   /* Reduce rounded_size so it's sharable with the postqueue.  */
4753   gimplify_expr (&rounded_size, pre_p, post_p, is_gimple_val, fb_rvalue);
4754
4755   /* Get AP.  */
4756   addr = valist_tmp;
4757   if (PAD_VARARGS_DOWN && !integer_zerop (rounded_size))
4758     {
4759       /* Small args are padded downward.  */
4760       t = fold_build2_loc (input_location, GT_EXPR, sizetype,
4761                        rounded_size, size_int (align));
4762       t = fold_build3 (COND_EXPR, sizetype, t, size_zero_node,
4763                        size_binop (MINUS_EXPR, rounded_size, type_size));
4764       addr = fold_build2 (POINTER_PLUS_EXPR,
4765                           TREE_TYPE (addr), addr, t);
4766     }
4767
4768   /* Compute new value for AP.  */
4769   t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (valist), valist_tmp, rounded_size);
4770   t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
4771   gimplify_and_add (t, pre_p);
4772
4773   addr = fold_convert (build_pointer_type (type), addr);
4774
4775   if (indirect)
4776     addr = build_va_arg_indirect_ref (addr);
4777
4778   return build_va_arg_indirect_ref (addr);
4779 }
4780
4781 /* Build an indirect-ref expression over the given TREE, which represents a
4782    piece of a va_arg() expansion.  */
4783 tree
4784 build_va_arg_indirect_ref (tree addr)
4785 {
4786   addr = build_fold_indirect_ref_loc (EXPR_LOCATION (addr), addr);
4787
4788   if (flag_mudflap) /* Don't instrument va_arg INDIRECT_REF.  */
4789     mf_mark (addr);
4790
4791   return addr;
4792 }
4793
4794 /* Return a dummy expression of type TYPE in order to keep going after an
4795    error.  */
4796
4797 static tree
4798 dummy_object (tree type)
4799 {
4800   tree t = build_int_cst (build_pointer_type (type), 0);
4801   return build2 (MEM_REF, type, t, t);
4802 }
4803
4804 /* Gimplify __builtin_va_arg, aka VA_ARG_EXPR, which is not really a
4805    builtin function, but a very special sort of operator.  */
4806
4807 enum gimplify_status
4808 gimplify_va_arg_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4809 {
4810   tree promoted_type, have_va_type;
4811   tree valist = TREE_OPERAND (*expr_p, 0);
4812   tree type = TREE_TYPE (*expr_p);
4813   tree t;
4814   location_t loc = EXPR_LOCATION (*expr_p);
4815
4816   /* Verify that valist is of the proper type.  */
4817   have_va_type = TREE_TYPE (valist);
4818   if (have_va_type == error_mark_node)
4819     return GS_ERROR;
4820   have_va_type = targetm.canonical_va_list_type (have_va_type);
4821
4822   if (have_va_type == NULL_TREE)
4823     {
4824       error_at (loc, "first argument to %<va_arg%> not of type %<va_list%>");
4825       return GS_ERROR;
4826     }
4827
4828   /* Generate a diagnostic for requesting data of a type that cannot
4829      be passed through `...' due to type promotion at the call site.  */
4830   if ((promoted_type = lang_hooks.types.type_promotes_to (type))
4831            != type)
4832     {
4833       static bool gave_help;
4834       bool warned;
4835
4836       /* Unfortunately, this is merely undefined, rather than a constraint
4837          violation, so we cannot make this an error.  If this call is never
4838          executed, the program is still strictly conforming.  */
4839       warned = warning_at (loc, 0,
4840                            "%qT is promoted to %qT when passed through %<...%>",
4841                            type, promoted_type);
4842       if (!gave_help && warned)
4843         {
4844           gave_help = true;
4845           inform (loc, "(so you should pass %qT not %qT to %<va_arg%>)",
4846                   promoted_type, type);
4847         }
4848
4849       /* We can, however, treat "undefined" any way we please.
4850          Call abort to encourage the user to fix the program.  */
4851       if (warned)
4852         inform (loc, "if this code is reached, the program will abort");
4853       /* Before the abort, allow the evaluation of the va_list
4854          expression to exit or longjmp.  */
4855       gimplify_and_add (valist, pre_p);
4856       t = build_call_expr_loc (loc,
4857                                implicit_built_in_decls[BUILT_IN_TRAP], 0);
4858       gimplify_and_add (t, pre_p);
4859
4860       /* This is dead code, but go ahead and finish so that the
4861          mode of the result comes out right.  */
4862       *expr_p = dummy_object (type);
4863       return GS_ALL_DONE;
4864     }
4865   else
4866     {
4867       /* Make it easier for the backends by protecting the valist argument
4868          from multiple evaluations.  */
4869       if (TREE_CODE (have_va_type) == ARRAY_TYPE)
4870         {
4871           /* For this case, the backends will be expecting a pointer to
4872              TREE_TYPE (abi), but it's possible we've
4873              actually been given an array (an actual TARGET_FN_ABI_VA_LIST).
4874              So fix it.  */
4875           if (TREE_CODE (TREE_TYPE (valist)) == ARRAY_TYPE)
4876             {
4877               tree p1 = build_pointer_type (TREE_TYPE (have_va_type));
4878               valist = fold_convert_loc (loc, p1,
4879                                          build_fold_addr_expr_loc (loc, valist));
4880             }
4881
4882           gimplify_expr (&valist, pre_p, post_p, is_gimple_val, fb_rvalue);
4883         }
4884       else
4885         gimplify_expr (&valist, pre_p, post_p, is_gimple_min_lval, fb_lvalue);
4886
4887       if (!targetm.gimplify_va_arg_expr)
4888         /* FIXME: Once most targets are converted we should merely
4889            assert this is non-null.  */
4890         return GS_ALL_DONE;
4891
4892       *expr_p = targetm.gimplify_va_arg_expr (valist, type, pre_p, post_p);
4893       return GS_OK;
4894     }
4895 }
4896
4897 /* Expand EXP, a call to __builtin_va_end.  */
4898
4899 static rtx
4900 expand_builtin_va_end (tree exp)
4901 {
4902   tree valist = CALL_EXPR_ARG (exp, 0);
4903
4904   /* Evaluate for side effects, if needed.  I hate macros that don't
4905      do that.  */
4906   if (TREE_SIDE_EFFECTS (valist))
4907     expand_expr (valist, const0_rtx, VOIDmode, EXPAND_NORMAL);
4908
4909   return const0_rtx;
4910 }
4911
4912 /* Expand EXP, a call to __builtin_va_copy.  We do this as a
4913    builtin rather than just as an assignment in stdarg.h because of the
4914    nastiness of array-type va_list types.  */
4915
4916 static rtx
4917 expand_builtin_va_copy (tree exp)
4918 {
4919   tree dst, src, t;
4920   location_t loc = EXPR_LOCATION (exp);
4921
4922   dst = CALL_EXPR_ARG (exp, 0);
4923   src = CALL_EXPR_ARG (exp, 1);
4924
4925   dst = stabilize_va_list_loc (loc, dst, 1);
4926   src = stabilize_va_list_loc (loc, src, 0);
4927
4928   gcc_assert (cfun != NULL && cfun->decl != NULL_TREE);
4929
4930   if (TREE_CODE (targetm.fn_abi_va_list (cfun->decl)) != ARRAY_TYPE)
4931     {
4932       t = build2 (MODIFY_EXPR, targetm.fn_abi_va_list (cfun->decl), dst, src);
4933       TREE_SIDE_EFFECTS (t) = 1;
4934       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4935     }
4936   else
4937     {
4938       rtx dstb, srcb, size;
4939
4940       /* Evaluate to pointers.  */
4941       dstb = expand_expr (dst, NULL_RTX, Pmode, EXPAND_NORMAL);
4942       srcb = expand_expr (src, NULL_RTX, Pmode, EXPAND_NORMAL);
4943       size = expand_expr (TYPE_SIZE_UNIT (targetm.fn_abi_va_list (cfun->decl)),
4944                   NULL_RTX, VOIDmode, EXPAND_NORMAL);
4945
4946       dstb = convert_memory_address (Pmode, dstb);
4947       srcb = convert_memory_address (Pmode, srcb);
4948
4949       /* "Dereference" to BLKmode memories.  */
4950       dstb = gen_rtx_MEM (BLKmode, dstb);
4951       set_mem_alias_set (dstb, get_alias_set (TREE_TYPE (TREE_TYPE (dst))));
4952       set_mem_align (dstb, TYPE_ALIGN (targetm.fn_abi_va_list (cfun->decl)));
4953       srcb = gen_rtx_MEM (BLKmode, srcb);
4954       set_mem_alias_set (srcb, get_alias_set (TREE_TYPE (TREE_TYPE (src))));
4955       set_mem_align (srcb, TYPE_ALIGN (targetm.fn_abi_va_list (cfun->decl)));
4956
4957       /* Copy.  */
4958       emit_block_move (dstb, srcb, size, BLOCK_OP_NORMAL);
4959     }
4960
4961   return const0_rtx;
4962 }
4963
4964 /* Expand a call to one of the builtin functions __builtin_frame_address or
4965    __builtin_return_address.  */
4966
4967 static rtx
4968 expand_builtin_frame_address (tree fndecl, tree exp)
4969 {
4970   /* The argument must be a nonnegative integer constant.
4971      It counts the number of frames to scan up the stack.
4972      The value is the return address saved in that frame.  */
4973   if (call_expr_nargs (exp) == 0)
4974     /* Warning about missing arg was already issued.  */
4975     return const0_rtx;
4976   else if (! host_integerp (CALL_EXPR_ARG (exp, 0), 1))
4977     {
4978       if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FRAME_ADDRESS)
4979         error ("invalid argument to %<__builtin_frame_address%>");
4980       else
4981         error ("invalid argument to %<__builtin_return_address%>");
4982       return const0_rtx;
4983     }
4984   else
4985     {
4986       rtx tem
4987         = expand_builtin_return_addr (DECL_FUNCTION_CODE (fndecl),
4988                                       tree_low_cst (CALL_EXPR_ARG (exp, 0), 1));
4989
4990       /* Some ports cannot access arbitrary stack frames.  */
4991       if (tem == NULL)
4992         {
4993           if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FRAME_ADDRESS)
4994             warning (0, "unsupported argument to %<__builtin_frame_address%>");
4995           else
4996             warning (0, "unsupported argument to %<__builtin_return_address%>");
4997           return const0_rtx;
4998         }
4999
5000       /* For __builtin_frame_address, return what we've got.  */
5001       if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FRAME_ADDRESS)
5002         return tem;
5003
5004       if (!REG_P (tem)
5005           && ! CONSTANT_P (tem))
5006         tem = copy_to_mode_reg (Pmode, tem);
5007       return tem;
5008     }
5009 }
5010
5011 /* Expand EXP, a call to the alloca builtin.  Return NULL_RTX if we
5012    failed and the caller should emit a normal call.  CANNOT_ACCUMULATE
5013    is the same as for allocate_dynamic_stack_space.  */
5014
5015 static rtx
5016 expand_builtin_alloca (tree exp, bool cannot_accumulate)
5017 {
5018   rtx op0;
5019   rtx result;
5020
5021   /* Emit normal call if marked not-inlineable.  */
5022   if (CALL_CANNOT_INLINE_P (exp))
5023     return NULL_RTX;
5024
5025   if (!validate_arglist (exp, INTEGER_TYPE, VOID_TYPE))
5026     return NULL_RTX;
5027
5028   /* Compute the argument.  */
5029   op0 = expand_normal (CALL_EXPR_ARG (exp, 0));
5030
5031   /* Allocate the desired space.  */
5032   result = allocate_dynamic_stack_space (op0, 0, BIGGEST_ALIGNMENT,
5033                                          cannot_accumulate);
5034   result = convert_memory_address (ptr_mode, result);
5035
5036   return result;
5037 }
5038
5039 /* Expand a call to a bswap builtin with argument ARG0.  MODE
5040    is the mode to expand with.  */
5041
5042 static rtx
5043 expand_builtin_bswap (tree exp, rtx target, rtx subtarget)
5044 {
5045   enum machine_mode mode;
5046   tree arg;
5047   rtx op0;
5048
5049   if (!validate_arglist (exp, INTEGER_TYPE, VOID_TYPE))
5050     return NULL_RTX;
5051
5052   arg = CALL_EXPR_ARG (exp, 0);
5053   mode = TYPE_MODE (TREE_TYPE (arg));
5054   op0 = expand_expr (arg, subtarget, VOIDmode, EXPAND_NORMAL);
5055
5056   target = expand_unop (mode, bswap_optab, op0, target, 1);
5057
5058   gcc_assert (target);
5059
5060   return convert_to_mode (mode, target, 0);
5061 }
5062
5063 /* Expand a call to a unary builtin in EXP.
5064    Return NULL_RTX if a normal call should be emitted rather than expanding the
5065    function in-line.  If convenient, the result should be placed in TARGET.
5066    SUBTARGET may be used as the target for computing one of EXP's operands.  */
5067
5068 static rtx
5069 expand_builtin_unop (enum machine_mode target_mode, tree exp, rtx target,
5070                      rtx subtarget, optab op_optab)
5071 {
5072   rtx op0;
5073
5074   if (!validate_arglist (exp, INTEGER_TYPE, VOID_TYPE))
5075     return NULL_RTX;
5076
5077   /* Compute the argument.  */
5078   op0 = expand_expr (CALL_EXPR_ARG (exp, 0),
5079                      (subtarget
5080                       && (TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 0)))
5081                           == GET_MODE (subtarget))) ? subtarget : NULL_RTX,
5082                      VOIDmode, EXPAND_NORMAL);
5083   /* Compute op, into TARGET if possible.
5084      Set TARGET to wherever the result comes back.  */
5085   target = expand_unop (TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 0))),
5086                         op_optab, op0, target, 1);
5087   gcc_assert (target);
5088
5089   return convert_to_mode (target_mode, target, 0);
5090 }
5091
5092 /* Expand a call to __builtin_expect.  We just return our argument
5093    as the builtin_expect semantic should've been already executed by
5094    tree branch prediction pass. */
5095
5096 static rtx
5097 expand_builtin_expect (tree exp, rtx target)
5098 {
5099   tree arg;
5100
5101   if (call_expr_nargs (exp) < 2)
5102     return const0_rtx;
5103   arg = CALL_EXPR_ARG (exp, 0);
5104
5105   target = expand_expr (arg, target, VOIDmode, EXPAND_NORMAL);
5106   /* When guessing was done, the hints should be already stripped away.  */
5107   gcc_assert (!flag_guess_branch_prob
5108               || optimize == 0 || seen_error ());
5109   return target;
5110 }
5111
5112 void
5113 expand_builtin_trap (void)
5114 {
5115 #ifdef HAVE_trap
5116   if (HAVE_trap)
5117     emit_insn (gen_trap ());
5118   else
5119 #endif
5120     emit_library_call (abort_libfunc, LCT_NORETURN, VOIDmode, 0);
5121   emit_barrier ();
5122 }
5123
5124 /* Expand a call to __builtin_unreachable.  We do nothing except emit
5125    a barrier saying that control flow will not pass here.
5126
5127    It is the responsibility of the program being compiled to ensure
5128    that control flow does never reach __builtin_unreachable.  */
5129 static void
5130 expand_builtin_unreachable (void)
5131 {
5132   emit_barrier ();
5133 }
5134
5135 /* Expand EXP, a call to fabs, fabsf or fabsl.
5136    Return NULL_RTX if a normal call should be emitted rather than expanding
5137    the function inline.  If convenient, the result should be placed
5138    in TARGET.  SUBTARGET may be used as the target for computing
5139    the operand.  */
5140
5141 static rtx
5142 expand_builtin_fabs (tree exp, rtx target, rtx subtarget)
5143 {
5144   enum machine_mode mode;
5145   tree arg;
5146   rtx op0;
5147
5148   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
5149     return NULL_RTX;
5150
5151   arg = CALL_EXPR_ARG (exp, 0);
5152   CALL_EXPR_ARG (exp, 0) = arg = builtin_save_expr (arg);
5153   mode = TYPE_MODE (TREE_TYPE (arg));
5154   op0 = expand_expr (arg, subtarget, VOIDmode, EXPAND_NORMAL);
5155   return expand_abs (mode, op0, target, 0, safe_from_p (target, arg, 1));
5156 }
5157
5158 /* Expand EXP, a call to copysign, copysignf, or copysignl.
5159    Return NULL is a normal call should be emitted rather than expanding the
5160    function inline.  If convenient, the result should be placed in TARGET.
5161    SUBTARGET may be used as the target for computing the operand.  */
5162
5163 static rtx
5164 expand_builtin_copysign (tree exp, rtx target, rtx subtarget)
5165 {
5166   rtx op0, op1;
5167   tree arg;
5168
5169   if (!validate_arglist (exp, REAL_TYPE, REAL_TYPE, VOID_TYPE))
5170     return NULL_RTX;
5171
5172   arg = CALL_EXPR_ARG (exp, 0);
5173   op0 = expand_expr (arg, subtarget, VOIDmode, EXPAND_NORMAL);
5174
5175   arg = CALL_EXPR_ARG (exp, 1);
5176   op1 = expand_normal (arg);
5177
5178   return expand_copysign (op0, op1, target);
5179 }
5180
5181 /* Create a new constant string literal and return a char* pointer to it.
5182    The STRING_CST value is the LEN characters at STR.  */
5183 tree
5184 build_string_literal (int len, const char *str)
5185 {
5186   tree t, elem, index, type;
5187
5188   t = build_string (len, str);
5189   elem = build_type_variant (char_type_node, 1, 0);
5190   index = build_index_type (size_int (len - 1));
5191   type = build_array_type (elem, index);
5192   TREE_TYPE (t) = type;
5193   TREE_CONSTANT (t) = 1;
5194   TREE_READONLY (t) = 1;
5195   TREE_STATIC (t) = 1;
5196
5197   type = build_pointer_type (elem);
5198   t = build1 (ADDR_EXPR, type,
5199               build4 (ARRAY_REF, elem,
5200                       t, integer_zero_node, NULL_TREE, NULL_TREE));
5201   return t;
5202 }
5203
5204 /* Expand a call to __builtin___clear_cache.  */
5205
5206 static rtx
5207 expand_builtin___clear_cache (tree exp ATTRIBUTE_UNUSED)
5208 {
5209 #ifndef HAVE_clear_cache
5210 #ifdef CLEAR_INSN_CACHE
5211   /* There is no "clear_cache" insn, and __clear_cache() in libgcc
5212      does something.  Just do the default expansion to a call to
5213      __clear_cache().  */
5214   return NULL_RTX;
5215 #else
5216   /* There is no "clear_cache" insn, and __clear_cache() in libgcc
5217      does nothing.  There is no need to call it.  Do nothing.  */
5218   return const0_rtx;
5219 #endif /* CLEAR_INSN_CACHE */
5220 #else
5221   /* We have a "clear_cache" insn, and it will handle everything.  */
5222   tree begin, end;
5223   rtx begin_rtx, end_rtx;
5224   enum insn_code icode;
5225
5226   /* We must not expand to a library call.  If we did, any
5227      fallback library function in libgcc that might contain a call to
5228      __builtin___clear_cache() would recurse infinitely.  */
5229   if (!validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
5230     {
5231       error ("both arguments to %<__builtin___clear_cache%> must be pointers");
5232       return const0_rtx;
5233     }
5234
5235   if (HAVE_clear_cache)
5236     {
5237       icode = CODE_FOR_clear_cache;
5238
5239       begin = CALL_EXPR_ARG (exp, 0);
5240       begin_rtx = expand_expr (begin, NULL_RTX, Pmode, EXPAND_NORMAL);
5241       begin_rtx = convert_memory_address (Pmode, begin_rtx);
5242       if (!insn_data[icode].operand[0].predicate (begin_rtx, Pmode))
5243         begin_rtx = copy_to_mode_reg (Pmode, begin_rtx);
5244
5245       end = CALL_EXPR_ARG (exp, 1);
5246       end_rtx = expand_expr (end, NULL_RTX, Pmode, EXPAND_NORMAL);
5247       end_rtx = convert_memory_address (Pmode, end_rtx);
5248       if (!insn_data[icode].operand[1].predicate (end_rtx, Pmode))
5249         end_rtx = copy_to_mode_reg (Pmode, end_rtx);
5250
5251       emit_insn (gen_clear_cache (begin_rtx, end_rtx));
5252     }
5253   return const0_rtx;
5254 #endif /* HAVE_clear_cache */
5255 }
5256
5257 /* Given a trampoline address, make sure it satisfies TRAMPOLINE_ALIGNMENT.  */
5258
5259 static rtx
5260 round_trampoline_addr (rtx tramp)
5261 {
5262   rtx temp, addend, mask;
5263
5264   /* If we don't need too much alignment, we'll have been guaranteed
5265      proper alignment by get_trampoline_type.  */
5266   if (TRAMPOLINE_ALIGNMENT <= STACK_BOUNDARY)
5267     return tramp;
5268
5269   /* Round address up to desired boundary.  */
5270   temp = gen_reg_rtx (Pmode);
5271   addend = GEN_INT (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT - 1);
5272   mask = GEN_INT (-TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT);
5273
5274   temp  = expand_simple_binop (Pmode, PLUS, tramp, addend,
5275                                temp, 0, OPTAB_LIB_WIDEN);
5276   tramp = expand_simple_binop (Pmode, AND, temp, mask,
5277                                temp, 0, OPTAB_LIB_WIDEN);
5278
5279   return tramp;
5280 }
5281
5282 static rtx
5283 expand_builtin_init_trampoline (tree exp)
5284 {
5285   tree t_tramp, t_func, t_chain;
5286   rtx m_tramp, r_tramp, r_chain, tmp;
5287
5288   if (!validate_arglist (exp, POINTER_TYPE, POINTER_TYPE,
5289                          POINTER_TYPE, VOID_TYPE))
5290     return NULL_RTX;
5291
5292   t_tramp = CALL_EXPR_ARG (exp, 0);
5293   t_func = CALL_EXPR_ARG (exp, 1);
5294   t_chain = CALL_EXPR_ARG (exp, 2);
5295
5296   r_tramp = expand_normal (t_tramp);
5297   m_tramp = gen_rtx_MEM (BLKmode, r_tramp);
5298   MEM_NOTRAP_P (m_tramp) = 1;
5299
5300   /* The TRAMP argument should be the address of a field within the
5301      local function's FRAME decl.  Let's see if we can fill in the
5302      to fill in the MEM_ATTRs for this memory.  */
5303   if (TREE_CODE (t_tramp) == ADDR_EXPR)
5304     set_mem_attributes_minus_bitpos (m_tramp, TREE_OPERAND (t_tramp, 0),
5305                                      true, 0);
5306
5307   tmp = round_trampoline_addr (r_tramp);
5308   if (tmp != r_tramp)
5309     {
5310       m_tramp = change_address (m_tramp, BLKmode, tmp);
5311       set_mem_align (m_tramp, TRAMPOLINE_ALIGNMENT);
5312       set_mem_size (m_tramp, GEN_INT (TRAMPOLINE_SIZE));
5313     }
5314
5315   /* The FUNC argument should be the address of the nested function.
5316      Extract the actual function decl to pass to the hook.  */
5317   gcc_assert (TREE_CODE (t_func) == ADDR_EXPR);
5318   t_func = TREE_OPERAND (t_func, 0);
5319   gcc_assert (TREE_CODE (t_func) == FUNCTION_DECL);
5320
5321   r_chain = expand_normal (t_chain);
5322
5323   /* Generate insns to initialize the trampoline.  */
5324   targetm.calls.trampoline_init (m_tramp, t_func, r_chain);
5325
5326   trampolines_created = 1;
5327
5328   warning_at (DECL_SOURCE_LOCATION (t_func), OPT_Wtrampolines,
5329               "trampoline generated for nested function %qD", t_func);
5330
5331   return const0_rtx;
5332 }
5333
5334 static rtx
5335 expand_builtin_adjust_trampoline (tree exp)
5336 {
5337   rtx tramp;
5338
5339   if (!validate_arglist (exp, POINTER_TYPE, VOID_TYPE))
5340     return NULL_RTX;
5341
5342   tramp = expand_normal (CALL_EXPR_ARG (exp, 0));
5343   tramp = round_trampoline_addr (tramp);
5344   if (targetm.calls.trampoline_adjust_address)
5345     tramp = targetm.calls.trampoline_adjust_address (tramp);
5346
5347   return tramp;
5348 }
5349
5350 /* Expand the call EXP to the built-in signbit, signbitf or signbitl
5351    function.  The function first checks whether the back end provides
5352    an insn to implement signbit for the respective mode.  If not, it
5353    checks whether the floating point format of the value is such that
5354    the sign bit can be extracted.  If that is not the case, the
5355    function returns NULL_RTX to indicate that a normal call should be
5356    emitted rather than expanding the function in-line.  EXP is the
5357    expression that is a call to the builtin function; if convenient,
5358    the result should be placed in TARGET.  */
5359 static rtx
5360 expand_builtin_signbit (tree exp, rtx target)
5361 {
5362   const struct real_format *fmt;
5363   enum machine_mode fmode, imode, rmode;
5364   tree arg;
5365   int word, bitpos;
5366   enum insn_code icode;
5367   rtx temp;
5368   location_t loc = EXPR_LOCATION (exp);
5369
5370   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
5371     return NULL_RTX;
5372
5373   arg = CALL_EXPR_ARG (exp, 0);
5374   fmode = TYPE_MODE (TREE_TYPE (arg));
5375   rmode = TYPE_MODE (TREE_TYPE (exp));
5376   fmt = REAL_MODE_FORMAT (fmode);
5377
5378   arg = builtin_save_expr (arg);
5379
5380   /* Expand the argument yielding a RTX expression. */
5381   temp = expand_normal (arg);
5382
5383   /* Check if the back end provides an insn that handles signbit for the
5384      argument's mode. */
5385   icode = optab_handler (signbit_optab, fmode);
5386   if (icode != CODE_FOR_nothing)
5387     {
5388       rtx last = get_last_insn ();
5389       target = gen_reg_rtx (TYPE_MODE (TREE_TYPE (exp)));
5390       if (maybe_emit_unop_insn (icode, target, temp, UNKNOWN))
5391         return target;
5392       delete_insns_since (last);
5393     }
5394
5395   /* For floating point formats without a sign bit, implement signbit
5396      as "ARG < 0.0".  */
5397   bitpos = fmt->signbit_ro;
5398   if (bitpos < 0)
5399   {
5400     /* But we can't do this if the format supports signed zero.  */
5401     if (fmt->has_signed_zero && HONOR_SIGNED_ZEROS (fmode))
5402       return NULL_RTX;
5403
5404     arg = fold_build2_loc (loc, LT_EXPR, TREE_TYPE (exp), arg,
5405                        build_real (TREE_TYPE (arg), dconst0));
5406     return expand_expr (arg, target, VOIDmode, EXPAND_NORMAL);
5407   }
5408
5409   if (GET_MODE_SIZE (fmode) <= UNITS_PER_WORD)
5410     {
5411       imode = int_mode_for_mode (fmode);
5412       if (imode == BLKmode)
5413         return NULL_RTX;
5414       temp = gen_lowpart (imode, temp);
5415     }
5416   else
5417     {
5418       imode = word_mode;
5419       /* Handle targets with different FP word orders.  */
5420       if (FLOAT_WORDS_BIG_ENDIAN)
5421         word = (GET_MODE_BITSIZE (fmode) - bitpos) / BITS_PER_WORD;
5422       else
5423         word = bitpos / BITS_PER_WORD;
5424       temp = operand_subword_force (temp, word, fmode);
5425       bitpos = bitpos % BITS_PER_WORD;
5426     }
5427
5428   /* Force the intermediate word_mode (or narrower) result into a
5429      register.  This avoids attempting to create paradoxical SUBREGs
5430      of floating point modes below.  */
5431   temp = force_reg (imode, temp);
5432
5433   /* If the bitpos is within the "result mode" lowpart, the operation
5434      can be implement with a single bitwise AND.  Otherwise, we need
5435      a right shift and an AND.  */
5436
5437   if (bitpos < GET_MODE_BITSIZE (rmode))
5438     {
5439       double_int mask = double_int_setbit (double_int_zero, bitpos);
5440
5441       if (GET_MODE_SIZE (imode) > GET_MODE_SIZE (rmode))
5442         temp = gen_lowpart (rmode, temp);
5443       temp = expand_binop (rmode, and_optab, temp,
5444                            immed_double_int_const (mask, rmode),
5445                            NULL_RTX, 1, OPTAB_LIB_WIDEN);
5446     }
5447   else
5448     {
5449       /* Perform a logical right shift to place the signbit in the least
5450          significant bit, then truncate the result to the desired mode
5451          and mask just this bit.  */
5452       temp = expand_shift (RSHIFT_EXPR, imode, temp,
5453                            build_int_cst (NULL_TREE, bitpos), NULL_RTX, 1);
5454       temp = gen_lowpart (rmode, temp);
5455       temp = expand_binop (rmode, and_optab, temp, const1_rtx,
5456                            NULL_RTX, 1, OPTAB_LIB_WIDEN);
5457     }
5458
5459   return temp;
5460 }
5461
5462 /* Expand fork or exec calls.  TARGET is the desired target of the
5463    call.  EXP is the call. FN is the
5464    identificator of the actual function.  IGNORE is nonzero if the
5465    value is to be ignored.  */
5466
5467 static rtx
5468 expand_builtin_fork_or_exec (tree fn, tree exp, rtx target, int ignore)
5469 {
5470   tree id, decl;
5471   tree call;
5472
5473   /* If we are not profiling, just call the function.  */
5474   if (!profile_arc_flag)
5475     return NULL_RTX;
5476
5477   /* Otherwise call the wrapper.  This should be equivalent for the rest of
5478      compiler, so the code does not diverge, and the wrapper may run the
5479      code necessary for keeping the profiling sane.  */
5480
5481   switch (DECL_FUNCTION_CODE (fn))
5482     {
5483     case BUILT_IN_FORK:
5484       id = get_identifier ("__gcov_fork");
5485       break;
5486
5487     case BUILT_IN_EXECL:
5488       id = get_identifier ("__gcov_execl");
5489       break;
5490
5491     case BUILT_IN_EXECV:
5492       id = get_identifier ("__gcov_execv");
5493       break;
5494
5495     case BUILT_IN_EXECLP:
5496       id = get_identifier ("__gcov_execlp");
5497       break;
5498
5499     case BUILT_IN_EXECLE:
5500       id = get_identifier ("__gcov_execle");
5501       break;
5502
5503     case BUILT_IN_EXECVP:
5504       id = get_identifier ("__gcov_execvp");
5505       break;
5506
5507     case BUILT_IN_EXECVE:
5508       id = get_identifier ("__gcov_execve");
5509       break;
5510
5511     default:
5512       gcc_unreachable ();
5513     }
5514
5515   decl = build_decl (DECL_SOURCE_LOCATION (fn),
5516                      FUNCTION_DECL, id, TREE_TYPE (fn));
5517   DECL_EXTERNAL (decl) = 1;
5518   TREE_PUBLIC (decl) = 1;
5519   DECL_ARTIFICIAL (decl) = 1;
5520   TREE_NOTHROW (decl) = 1;
5521   DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
5522   DECL_VISIBILITY_SPECIFIED (decl) = 1;
5523   call = rewrite_call_expr (EXPR_LOCATION (exp), exp, 0, decl, 0);
5524   return expand_call (call, target, ignore);
5525  }
5526
5527
5528 \f
5529 /* Reconstitute a mode for a __sync intrinsic operation.  Since the type of
5530    the pointer in these functions is void*, the tree optimizers may remove
5531    casts.  The mode computed in expand_builtin isn't reliable either, due
5532    to __sync_bool_compare_and_swap.
5533
5534    FCODE_DIFF should be fcode - base, where base is the FOO_1 code for the
5535    group of builtins.  This gives us log2 of the mode size.  */
5536
5537 static inline enum machine_mode
5538 get_builtin_sync_mode (int fcode_diff)
5539 {
5540   /* The size is not negotiable, so ask not to get BLKmode in return
5541      if the target indicates that a smaller size would be better.  */
5542   return mode_for_size (BITS_PER_UNIT << fcode_diff, MODE_INT, 0);
5543 }
5544
5545 /* Expand the memory expression LOC and return the appropriate memory operand
5546    for the builtin_sync operations.  */
5547
5548 static rtx
5549 get_builtin_sync_mem (tree loc, enum machine_mode mode)
5550 {
5551   rtx addr, mem;
5552
5553   addr = expand_expr (loc, NULL_RTX, ptr_mode, EXPAND_SUM);
5554   addr = convert_memory_address (Pmode, addr);
5555
5556   /* Note that we explicitly do not want any alias information for this
5557      memory, so that we kill all other live memories.  Otherwise we don't
5558      satisfy the full barrier semantics of the intrinsic.  */
5559   mem = validize_mem (gen_rtx_MEM (mode, addr));
5560
5561   /* The alignment needs to be at least according to that of the mode.  */
5562   set_mem_align (mem, MAX (GET_MODE_ALIGNMENT (mode),
5563                            get_pointer_alignment (loc, BIGGEST_ALIGNMENT)));
5564   set_mem_alias_set (mem, ALIAS_SET_MEMORY_BARRIER);
5565   MEM_VOLATILE_P (mem) = 1;
5566
5567   return mem;
5568 }
5569
5570 /* Expand the __sync_xxx_and_fetch and __sync_fetch_and_xxx intrinsics.
5571    EXP is the CALL_EXPR.  CODE is the rtx code
5572    that corresponds to the arithmetic or logical operation from the name;
5573    an exception here is that NOT actually means NAND.  TARGET is an optional
5574    place for us to store the results; AFTER is true if this is the
5575    fetch_and_xxx form.  IGNORE is true if we don't actually care about
5576    the result of the operation at all.  */
5577
5578 static rtx
5579 expand_builtin_sync_operation (enum machine_mode mode, tree exp,
5580                                enum rtx_code code, bool after,
5581                                rtx target, bool ignore)
5582 {
5583   rtx val, mem;
5584   enum machine_mode old_mode;
5585   location_t loc = EXPR_LOCATION (exp);
5586
5587   if (code == NOT && warn_sync_nand)
5588     {
5589       tree fndecl = get_callee_fndecl (exp);
5590       enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
5591
5592       static bool warned_f_a_n, warned_n_a_f;
5593
5594       switch (fcode)
5595         {
5596         case BUILT_IN_FETCH_AND_NAND_1:
5597         case BUILT_IN_FETCH_AND_NAND_2:
5598         case BUILT_IN_FETCH_AND_NAND_4:
5599         case BUILT_IN_FETCH_AND_NAND_8:
5600         case BUILT_IN_FETCH_AND_NAND_16:
5601
5602           if (warned_f_a_n)
5603             break;
5604
5605           fndecl = implicit_built_in_decls[BUILT_IN_FETCH_AND_NAND_N];
5606           inform (loc, "%qD changed semantics in GCC 4.4", fndecl);
5607           warned_f_a_n = true;
5608           break;
5609
5610         case BUILT_IN_NAND_AND_FETCH_1:
5611         case BUILT_IN_NAND_AND_FETCH_2:
5612         case BUILT_IN_NAND_AND_FETCH_4:
5613         case BUILT_IN_NAND_AND_FETCH_8:
5614         case BUILT_IN_NAND_AND_FETCH_16:
5615
5616           if (warned_n_a_f)
5617             break;
5618
5619           fndecl = implicit_built_in_decls[BUILT_IN_NAND_AND_FETCH_N];
5620           inform (loc, "%qD changed semantics in GCC 4.4", fndecl);
5621           warned_n_a_f = true;
5622           break;
5623
5624         default:
5625           gcc_unreachable ();
5626         }
5627     }
5628
5629   /* Expand the operands.  */
5630   mem = get_builtin_sync_mem (CALL_EXPR_ARG (exp, 0), mode);
5631
5632   val = expand_expr (CALL_EXPR_ARG (exp, 1), NULL_RTX, mode, EXPAND_NORMAL);
5633   /* If VAL is promoted to a wider mode, convert it back to MODE.  Take care
5634      of CONST_INTs, where we know the old_mode only from the call argument.  */
5635   old_mode = GET_MODE (val);
5636   if (old_mode == VOIDmode)
5637     old_mode = TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 1)));
5638   val = convert_modes (mode, old_mode, val, 1);
5639
5640   if (ignore)
5641     return expand_sync_operation (mem, val, code);
5642   else
5643     return expand_sync_fetch_operation (mem, val, code, after, target);
5644 }
5645
5646 /* Expand the __sync_val_compare_and_swap and __sync_bool_compare_and_swap
5647    intrinsics. EXP is the CALL_EXPR.  IS_BOOL is
5648    true if this is the boolean form.  TARGET is a place for us to store the
5649    results; this is NOT optional if IS_BOOL is true.  */
5650
5651 static rtx
5652 expand_builtin_compare_and_swap (enum machine_mode mode, tree exp,
5653                                  bool is_bool, rtx target)
5654 {
5655   rtx old_val, new_val, mem;
5656   enum machine_mode old_mode;
5657
5658   /* Expand the operands.  */
5659   mem = get_builtin_sync_mem (CALL_EXPR_ARG (exp, 0), mode);
5660
5661
5662   old_val = expand_expr (CALL_EXPR_ARG (exp, 1), NULL_RTX,
5663                          mode, EXPAND_NORMAL);
5664   /* If VAL is promoted to a wider mode, convert it back to MODE.  Take care
5665      of CONST_INTs, where we know the old_mode only from the call argument.  */
5666   old_mode = GET_MODE (old_val);
5667   if (old_mode == VOIDmode)
5668     old_mode = TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 1)));
5669   old_val = convert_modes (mode, old_mode, old_val, 1);
5670
5671   new_val = expand_expr (CALL_EXPR_ARG (exp, 2), NULL_RTX,
5672                          mode, EXPAND_NORMAL);
5673   /* If VAL is promoted to a wider mode, convert it back to MODE.  Take care
5674      of CONST_INTs, where we know the old_mode only from the call argument.  */
5675   old_mode = GET_MODE (new_val);
5676   if (old_mode == VOIDmode)
5677     old_mode = TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 2)));
5678   new_val = convert_modes (mode, old_mode, new_val, 1);
5679
5680   if (is_bool)
5681     return expand_bool_compare_and_swap (mem, old_val, new_val, target);
5682   else
5683     return expand_val_compare_and_swap (mem, old_val, new_val, target);
5684 }
5685
5686 /* Expand the __sync_lock_test_and_set intrinsic.  Note that the most
5687    general form is actually an atomic exchange, and some targets only
5688    support a reduced form with the second argument being a constant 1.
5689    EXP is the CALL_EXPR; TARGET is an optional place for us to store
5690    the results.  */
5691
5692 static rtx
5693 expand_builtin_lock_test_and_set (enum machine_mode mode, tree exp,
5694                                   rtx target)
5695 {
5696   rtx val, mem;
5697   enum machine_mode old_mode;
5698
5699   /* Expand the operands.  */
5700   mem = get_builtin_sync_mem (CALL_EXPR_ARG (exp, 0), mode);
5701   val = expand_expr (CALL_EXPR_ARG (exp, 1), NULL_RTX, mode, EXPAND_NORMAL);
5702   /* If VAL is promoted to a wider mode, convert it back to MODE.  Take care
5703      of CONST_INTs, where we know the old_mode only from the call argument.  */
5704   old_mode = GET_MODE (val);
5705   if (old_mode == VOIDmode)
5706     old_mode = TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 1)));
5707   val = convert_modes (mode, old_mode, val, 1);
5708
5709   return expand_sync_lock_test_and_set (mem, val, target);
5710 }
5711
5712 /* Expand the __sync_synchronize intrinsic.  */
5713
5714 static void
5715 expand_builtin_synchronize (void)
5716 {
5717   gimple x;
5718   VEC (tree, gc) *v_clobbers;
5719
5720 #ifdef HAVE_memory_barrier
5721   if (HAVE_memory_barrier)
5722     {
5723       emit_insn (gen_memory_barrier ());
5724       return;
5725     }
5726 #endif
5727
5728   if (synchronize_libfunc != NULL_RTX)
5729     {
5730       emit_library_call (synchronize_libfunc, LCT_NORMAL, VOIDmode, 0);
5731       return;
5732     }
5733
5734   /* If no explicit memory barrier instruction is available, create an
5735      empty asm stmt with a memory clobber.  */
5736   v_clobbers = VEC_alloc (tree, gc, 1);
5737   VEC_quick_push (tree, v_clobbers,
5738                   tree_cons (NULL, build_string (6, "memory"), NULL));
5739   x = gimple_build_asm_vec ("", NULL, NULL, v_clobbers, NULL);
5740   gimple_asm_set_volatile (x, true);
5741   expand_asm_stmt (x);
5742 }
5743
5744 /* Expand the __sync_lock_release intrinsic.  EXP is the CALL_EXPR.  */
5745
5746 static void
5747 expand_builtin_lock_release (enum machine_mode mode, tree exp)
5748 {
5749   enum insn_code icode;
5750   rtx mem, insn;
5751   rtx val = const0_rtx;
5752
5753   /* Expand the operands.  */
5754   mem = get_builtin_sync_mem (CALL_EXPR_ARG (exp, 0), mode);
5755
5756   /* If there is an explicit operation in the md file, use it.  */
5757   icode = direct_optab_handler (sync_lock_release_optab, mode);
5758   if (icode != CODE_FOR_nothing)
5759     {
5760       if (!insn_data[icode].operand[1].predicate (val, mode))
5761         val = force_reg (mode, val);
5762
5763       insn = GEN_FCN (icode) (mem, val);
5764       if (insn)
5765         {
5766           emit_insn (insn);
5767           return;
5768         }
5769     }
5770
5771   /* Otherwise we can implement this operation by emitting a barrier
5772      followed by a store of zero.  */
5773   expand_builtin_synchronize ();
5774   emit_move_insn (mem, val);
5775 }
5776 \f
5777 /* Expand an expression EXP that calls a built-in function,
5778    with result going to TARGET if that's convenient
5779    (and in mode MODE if that's convenient).
5780    SUBTARGET may be used as the target for computing one of EXP's operands.
5781    IGNORE is nonzero if the value is to be ignored.  */
5782
5783 rtx
5784 expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode,
5785                 int ignore)
5786 {
5787   tree fndecl = get_callee_fndecl (exp);
5788   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
5789   enum machine_mode target_mode = TYPE_MODE (TREE_TYPE (exp));
5790   int flags;
5791
5792   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
5793     return targetm.expand_builtin (exp, target, subtarget, mode, ignore);
5794
5795   /* When not optimizing, generate calls to library functions for a certain
5796      set of builtins.  */
5797   if (!optimize
5798       && !called_as_built_in (fndecl)
5799       && DECL_ASSEMBLER_NAME_SET_P (fndecl)
5800       && fcode != BUILT_IN_ALLOCA
5801       && fcode != BUILT_IN_FREE)
5802     return expand_call (exp, target, ignore);
5803
5804   /* The built-in function expanders test for target == const0_rtx
5805      to determine whether the function's result will be ignored.  */
5806   if (ignore)
5807     target = const0_rtx;
5808
5809   /* If the result of a pure or const built-in function is ignored, and
5810      none of its arguments are volatile, we can avoid expanding the
5811      built-in call and just evaluate the arguments for side-effects.  */
5812   if (target == const0_rtx
5813       && ((flags = flags_from_decl_or_type (fndecl)) & (ECF_CONST | ECF_PURE))
5814       && !(flags & ECF_LOOPING_CONST_OR_PURE))
5815     {
5816       bool volatilep = false;
5817       tree arg;
5818       call_expr_arg_iterator iter;
5819
5820       FOR_EACH_CALL_EXPR_ARG (arg, iter, exp)
5821         if (TREE_THIS_VOLATILE (arg))
5822           {
5823             volatilep = true;
5824             break;
5825           }
5826
5827       if (! volatilep)
5828         {
5829           FOR_EACH_CALL_EXPR_ARG (arg, iter, exp)
5830             expand_expr (arg, const0_rtx, VOIDmode, EXPAND_NORMAL);
5831           return const0_rtx;
5832         }
5833     }
5834
5835   switch (fcode)
5836     {
5837     CASE_FLT_FN (BUILT_IN_FABS):
5838       target = expand_builtin_fabs (exp, target, subtarget);
5839       if (target)
5840         return target;
5841       break;
5842
5843     CASE_FLT_FN (BUILT_IN_COPYSIGN):
5844       target = expand_builtin_copysign (exp, target, subtarget);
5845       if (target)
5846         return target;
5847       break;
5848
5849       /* Just do a normal library call if we were unable to fold
5850          the values.  */
5851     CASE_FLT_FN (BUILT_IN_CABS):
5852       break;
5853
5854     CASE_FLT_FN (BUILT_IN_EXP):
5855     CASE_FLT_FN (BUILT_IN_EXP10):
5856     CASE_FLT_FN (BUILT_IN_POW10):
5857     CASE_FLT_FN (BUILT_IN_EXP2):
5858     CASE_FLT_FN (BUILT_IN_EXPM1):
5859     CASE_FLT_FN (BUILT_IN_LOGB):
5860     CASE_FLT_FN (BUILT_IN_LOG):
5861     CASE_FLT_FN (BUILT_IN_LOG10):
5862     CASE_FLT_FN (BUILT_IN_LOG2):
5863     CASE_FLT_FN (BUILT_IN_LOG1P):
5864     CASE_FLT_FN (BUILT_IN_TAN):
5865     CASE_FLT_FN (BUILT_IN_ASIN):
5866     CASE_FLT_FN (BUILT_IN_ACOS):
5867     CASE_FLT_FN (BUILT_IN_ATAN):
5868     CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
5869       /* Treat these like sqrt only if unsafe math optimizations are allowed,
5870          because of possible accuracy problems.  */
5871       if (! flag_unsafe_math_optimizations)
5872         break;
5873     CASE_FLT_FN (BUILT_IN_SQRT):
5874     CASE_FLT_FN (BUILT_IN_FLOOR):
5875     CASE_FLT_FN (BUILT_IN_CEIL):
5876     CASE_FLT_FN (BUILT_IN_TRUNC):
5877     CASE_FLT_FN (BUILT_IN_ROUND):
5878     CASE_FLT_FN (BUILT_IN_NEARBYINT):
5879     CASE_FLT_FN (BUILT_IN_RINT):
5880       target = expand_builtin_mathfn (exp, target, subtarget);
5881       if (target)
5882         return target;
5883       break;
5884
5885     CASE_FLT_FN (BUILT_IN_FMA):
5886       target = expand_builtin_mathfn_ternary (exp, target, subtarget);
5887       if (target)
5888         return target;
5889       break;
5890
5891     CASE_FLT_FN (BUILT_IN_ILOGB):
5892       if (! flag_unsafe_math_optimizations)
5893         break;
5894     CASE_FLT_FN (BUILT_IN_ISINF):
5895     CASE_FLT_FN (BUILT_IN_FINITE):
5896     case BUILT_IN_ISFINITE:
5897     case BUILT_IN_ISNORMAL:
5898       target = expand_builtin_interclass_mathfn (exp, target);
5899       if (target)
5900         return target;
5901       break;
5902
5903     CASE_FLT_FN (BUILT_IN_LCEIL):
5904     CASE_FLT_FN (BUILT_IN_LLCEIL):
5905     CASE_FLT_FN (BUILT_IN_LFLOOR):
5906     CASE_FLT_FN (BUILT_IN_LLFLOOR):
5907       target = expand_builtin_int_roundingfn (exp, target);
5908       if (target)
5909         return target;
5910       break;
5911
5912     CASE_FLT_FN (BUILT_IN_LRINT):
5913     CASE_FLT_FN (BUILT_IN_LLRINT):
5914     CASE_FLT_FN (BUILT_IN_LROUND):
5915     CASE_FLT_FN (BUILT_IN_LLROUND):
5916       target = expand_builtin_int_roundingfn_2 (exp, target);
5917       if (target)
5918         return target;
5919       break;
5920
5921     CASE_FLT_FN (BUILT_IN_POW):
5922       target = expand_builtin_pow (exp, target, subtarget);
5923       if (target)
5924         return target;
5925       break;
5926
5927     CASE_FLT_FN (BUILT_IN_POWI):
5928       target = expand_builtin_powi (exp, target);
5929       if (target)
5930         return target;
5931       break;
5932
5933     CASE_FLT_FN (BUILT_IN_ATAN2):
5934     CASE_FLT_FN (BUILT_IN_LDEXP):
5935     CASE_FLT_FN (BUILT_IN_SCALB):
5936     CASE_FLT_FN (BUILT_IN_SCALBN):
5937     CASE_FLT_FN (BUILT_IN_SCALBLN):
5938       if (! flag_unsafe_math_optimizations)
5939         break;
5940
5941     CASE_FLT_FN (BUILT_IN_FMOD):
5942     CASE_FLT_FN (BUILT_IN_REMAINDER):
5943     CASE_FLT_FN (BUILT_IN_DREM):
5944       target = expand_builtin_mathfn_2 (exp, target, subtarget);
5945       if (target)
5946         return target;
5947       break;
5948
5949     CASE_FLT_FN (BUILT_IN_CEXPI):
5950       target = expand_builtin_cexpi (exp, target);
5951       gcc_assert (target);
5952       return target;
5953
5954     CASE_FLT_FN (BUILT_IN_SIN):
5955     CASE_FLT_FN (BUILT_IN_COS):
5956       if (! flag_unsafe_math_optimizations)
5957         break;
5958       target = expand_builtin_mathfn_3 (exp, target, subtarget);
5959       if (target)
5960         return target;
5961       break;
5962
5963     CASE_FLT_FN (BUILT_IN_SINCOS):
5964       if (! flag_unsafe_math_optimizations)
5965         break;
5966       target = expand_builtin_sincos (exp);
5967       if (target)
5968         return target;
5969       break;
5970
5971     case BUILT_IN_APPLY_ARGS:
5972       return expand_builtin_apply_args ();
5973
5974       /* __builtin_apply (FUNCTION, ARGUMENTS, ARGSIZE) invokes
5975          FUNCTION with a copy of the parameters described by
5976          ARGUMENTS, and ARGSIZE.  It returns a block of memory
5977          allocated on the stack into which is stored all the registers
5978          that might possibly be used for returning the result of a
5979          function.  ARGUMENTS is the value returned by
5980          __builtin_apply_args.  ARGSIZE is the number of bytes of
5981          arguments that must be copied.  ??? How should this value be
5982          computed?  We'll also need a safe worst case value for varargs
5983          functions.  */
5984     case BUILT_IN_APPLY:
5985       if (!validate_arglist (exp, POINTER_TYPE,
5986                              POINTER_TYPE, INTEGER_TYPE, VOID_TYPE)
5987           && !validate_arglist (exp, REFERENCE_TYPE,
5988                                 POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
5989         return const0_rtx;
5990       else
5991         {
5992           rtx ops[3];
5993
5994           ops[0] = expand_normal (CALL_EXPR_ARG (exp, 0));
5995           ops[1] = expand_normal (CALL_EXPR_ARG (exp, 1));
5996           ops[2] = expand_normal (CALL_EXPR_ARG (exp, 2));
5997
5998           return expand_builtin_apply (ops[0], ops[1], ops[2]);
5999         }
6000
6001       /* __builtin_return (RESULT) causes the function to return the
6002          value described by RESULT.  RESULT is address of the block of
6003          memory returned by __builtin_apply.  */
6004     case BUILT_IN_RETURN:
6005       if (validate_arglist (exp, POINTER_TYPE, VOID_TYPE))
6006         expand_builtin_return (expand_normal (CALL_EXPR_ARG (exp, 0)));
6007       return const0_rtx;
6008
6009     case BUILT_IN_SAVEREGS:
6010       return expand_builtin_saveregs ();
6011
6012     case BUILT_IN_VA_ARG_PACK:
6013       /* All valid uses of __builtin_va_arg_pack () are removed during
6014          inlining.  */
6015       error ("%Kinvalid use of %<__builtin_va_arg_pack ()%>", exp);
6016       return const0_rtx;
6017
6018     case BUILT_IN_VA_ARG_PACK_LEN:
6019       /* All valid uses of __builtin_va_arg_pack_len () are removed during
6020          inlining.  */
6021       error ("%Kinvalid use of %<__builtin_va_arg_pack_len ()%>", exp);
6022       return const0_rtx;
6023
6024       /* Return the address of the first anonymous stack arg.  */
6025     case BUILT_IN_NEXT_ARG:
6026       if (fold_builtin_next_arg (exp, false))
6027         return const0_rtx;
6028       return expand_builtin_next_arg ();
6029
6030     case BUILT_IN_CLEAR_CACHE:
6031       target = expand_builtin___clear_cache (exp);
6032       if (target)
6033         return target;
6034       break;
6035
6036     case BUILT_IN_CLASSIFY_TYPE:
6037       return expand_builtin_classify_type (exp);
6038
6039     case BUILT_IN_CONSTANT_P:
6040       return const0_rtx;
6041
6042     case BUILT_IN_FRAME_ADDRESS:
6043     case BUILT_IN_RETURN_ADDRESS:
6044       return expand_builtin_frame_address (fndecl, exp);
6045
6046     /* Returns the address of the area where the structure is returned.
6047        0 otherwise.  */
6048     case BUILT_IN_AGGREGATE_INCOMING_ADDRESS:
6049       if (call_expr_nargs (exp) != 0
6050           || ! AGGREGATE_TYPE_P (TREE_TYPE (TREE_TYPE (current_function_decl)))
6051           || !MEM_P (DECL_RTL (DECL_RESULT (current_function_decl))))
6052         return const0_rtx;
6053       else
6054         return XEXP (DECL_RTL (DECL_RESULT (current_function_decl)), 0);
6055
6056     case BUILT_IN_ALLOCA:
6057       /* If the allocation stems from the declaration of a variable-sized
6058          object, it cannot accumulate.  */
6059       target = expand_builtin_alloca (exp, ALLOCA_FOR_VAR_P (exp));
6060       if (target)
6061         return target;
6062       break;
6063
6064     case BUILT_IN_STACK_SAVE:
6065       return expand_stack_save ();
6066
6067     case BUILT_IN_STACK_RESTORE:
6068       expand_stack_restore (CALL_EXPR_ARG (exp, 0));
6069       return const0_rtx;
6070
6071     case BUILT_IN_BSWAP32:
6072     case BUILT_IN_BSWAP64:
6073       target = expand_builtin_bswap (exp, target, subtarget);
6074
6075       if (target)
6076         return target;
6077       break;
6078
6079     CASE_INT_FN (BUILT_IN_FFS):
6080     case BUILT_IN_FFSIMAX:
6081       target = expand_builtin_unop (target_mode, exp, target,
6082                                     subtarget, ffs_optab);
6083       if (target)
6084         return target;
6085       break;
6086
6087     CASE_INT_FN (BUILT_IN_CLZ):
6088     case BUILT_IN_CLZIMAX:
6089       target = expand_builtin_unop (target_mode, exp, target,
6090                                     subtarget, clz_optab);
6091       if (target)
6092         return target;
6093       break;
6094
6095     CASE_INT_FN (BUILT_IN_CTZ):
6096     case BUILT_IN_CTZIMAX:
6097       target = expand_builtin_unop (target_mode, exp, target,
6098                                     subtarget, ctz_optab);
6099       if (target)
6100         return target;
6101       break;
6102
6103     CASE_INT_FN (BUILT_IN_POPCOUNT):
6104     case BUILT_IN_POPCOUNTIMAX:
6105       target = expand_builtin_unop (target_mode, exp, target,
6106                                     subtarget, popcount_optab);
6107       if (target)
6108         return target;
6109       break;
6110
6111     CASE_INT_FN (BUILT_IN_PARITY):
6112     case BUILT_IN_PARITYIMAX:
6113       target = expand_builtin_unop (target_mode, exp, target,
6114                                     subtarget, parity_optab);
6115       if (target)
6116         return target;
6117       break;
6118
6119     case BUILT_IN_STRLEN:
6120       target = expand_builtin_strlen (exp, target, target_mode);
6121       if (target)
6122         return target;
6123       break;
6124
6125     case BUILT_IN_STRCPY:
6126       target = expand_builtin_strcpy (exp, target);
6127       if (target)
6128         return target;
6129       break;
6130
6131     case BUILT_IN_STRNCPY:
6132       target = expand_builtin_strncpy (exp, target);
6133       if (target)
6134         return target;
6135       break;
6136
6137     case BUILT_IN_STPCPY:
6138       target = expand_builtin_stpcpy (exp, target, mode);
6139       if (target)
6140         return target;
6141       break;
6142
6143     case BUILT_IN_MEMCPY:
6144       target = expand_builtin_memcpy (exp, target);
6145       if (target)
6146         return target;
6147       break;
6148
6149     case BUILT_IN_MEMPCPY:
6150       target = expand_builtin_mempcpy (exp, target, mode);
6151       if (target)
6152         return target;
6153       break;
6154
6155     case BUILT_IN_MEMSET:
6156       target = expand_builtin_memset (exp, target, mode);
6157       if (target)
6158         return target;
6159       break;
6160
6161     case BUILT_IN_BZERO:
6162       target = expand_builtin_bzero (exp);
6163       if (target)
6164         return target;
6165       break;
6166
6167     case BUILT_IN_STRCMP:
6168       target = expand_builtin_strcmp (exp, target);
6169       if (target)
6170         return target;
6171       break;
6172
6173     case BUILT_IN_STRNCMP:
6174       target = expand_builtin_strncmp (exp, target, mode);
6175       if (target)
6176         return target;
6177       break;
6178
6179     case BUILT_IN_BCMP:
6180     case BUILT_IN_MEMCMP:
6181       target = expand_builtin_memcmp (exp, target, mode);
6182       if (target)
6183         return target;
6184       break;
6185
6186     case BUILT_IN_SETJMP:
6187       /* This should have been lowered to the builtins below.  */
6188       gcc_unreachable ();
6189
6190     case BUILT_IN_SETJMP_SETUP:
6191       /* __builtin_setjmp_setup is passed a pointer to an array of five words
6192           and the receiver label.  */
6193       if (validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
6194         {
6195           rtx buf_addr = expand_expr (CALL_EXPR_ARG (exp, 0), subtarget,
6196                                       VOIDmode, EXPAND_NORMAL);
6197           tree label = TREE_OPERAND (CALL_EXPR_ARG (exp, 1), 0);
6198           rtx label_r = label_rtx (label);
6199
6200           /* This is copied from the handling of non-local gotos.  */
6201           expand_builtin_setjmp_setup (buf_addr, label_r);
6202           nonlocal_goto_handler_labels
6203             = gen_rtx_EXPR_LIST (VOIDmode, label_r,
6204                                  nonlocal_goto_handler_labels);
6205           /* ??? Do not let expand_label treat us as such since we would
6206              not want to be both on the list of non-local labels and on
6207              the list of forced labels.  */
6208           FORCED_LABEL (label) = 0;
6209           return const0_rtx;
6210         }
6211       break;
6212
6213     case BUILT_IN_SETJMP_DISPATCHER:
6214        /* __builtin_setjmp_dispatcher is passed the dispatcher label.  */
6215       if (validate_arglist (exp, POINTER_TYPE, VOID_TYPE))
6216         {
6217           tree label = TREE_OPERAND (CALL_EXPR_ARG (exp, 0), 0);
6218           rtx label_r = label_rtx (label);
6219
6220           /* Remove the dispatcher label from the list of non-local labels
6221              since the receiver labels have been added to it above.  */
6222           remove_node_from_expr_list (label_r, &nonlocal_goto_handler_labels);
6223           return const0_rtx;
6224         }
6225       break;
6226
6227     case BUILT_IN_SETJMP_RECEIVER:
6228        /* __builtin_setjmp_receiver is passed the receiver label.  */
6229       if (validate_arglist (exp, POINTER_TYPE, VOID_TYPE))
6230         {
6231           tree label = TREE_OPERAND (CALL_EXPR_ARG (exp, 0), 0);
6232           rtx label_r = label_rtx (label);
6233
6234           expand_builtin_setjmp_receiver (label_r);
6235           return const0_rtx;
6236         }
6237       break;
6238
6239       /* __builtin_longjmp is passed a pointer to an array of five words.
6240          It's similar to the C library longjmp function but works with
6241          __builtin_setjmp above.  */
6242     case BUILT_IN_LONGJMP:
6243       if (validate_arglist (exp, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
6244         {
6245           rtx buf_addr = expand_expr (CALL_EXPR_ARG (exp, 0), subtarget,
6246                                       VOIDmode, EXPAND_NORMAL);
6247           rtx value = expand_normal (CALL_EXPR_ARG (exp, 1));
6248
6249           if (value != const1_rtx)
6250             {
6251               error ("%<__builtin_longjmp%> second argument must be 1");
6252               return const0_rtx;
6253             }
6254
6255           expand_builtin_longjmp (buf_addr, value);
6256           return const0_rtx;
6257         }
6258       break;
6259
6260     case BUILT_IN_NONLOCAL_GOTO:
6261       target = expand_builtin_nonlocal_goto (exp);
6262       if (target)
6263         return target;
6264       break;
6265
6266       /* This updates the setjmp buffer that is its argument with the value
6267          of the current stack pointer.  */
6268     case BUILT_IN_UPDATE_SETJMP_BUF:
6269       if (validate_arglist (exp, POINTER_TYPE, VOID_TYPE))
6270         {
6271           rtx buf_addr
6272             = expand_normal (CALL_EXPR_ARG (exp, 0));
6273
6274           expand_builtin_update_setjmp_buf (buf_addr);
6275           return const0_rtx;
6276         }
6277       break;
6278
6279     case BUILT_IN_TRAP:
6280       expand_builtin_trap ();
6281       return const0_rtx;
6282
6283     case BUILT_IN_UNREACHABLE:
6284       expand_builtin_unreachable ();
6285       return const0_rtx;
6286
6287     CASE_FLT_FN (BUILT_IN_SIGNBIT):
6288     case BUILT_IN_SIGNBITD32:
6289     case BUILT_IN_SIGNBITD64:
6290     case BUILT_IN_SIGNBITD128:
6291       target = expand_builtin_signbit (exp, target);
6292       if (target)
6293         return target;
6294       break;
6295
6296       /* Various hooks for the DWARF 2 __throw routine.  */
6297     case BUILT_IN_UNWIND_INIT:
6298       expand_builtin_unwind_init ();
6299       return const0_rtx;
6300     case BUILT_IN_DWARF_CFA:
6301       return virtual_cfa_rtx;
6302 #ifdef DWARF2_UNWIND_INFO
6303     case BUILT_IN_DWARF_SP_COLUMN:
6304       return expand_builtin_dwarf_sp_column ();
6305     case BUILT_IN_INIT_DWARF_REG_SIZES:
6306       expand_builtin_init_dwarf_reg_sizes (CALL_EXPR_ARG (exp, 0));
6307       return const0_rtx;
6308 #endif
6309     case BUILT_IN_FROB_RETURN_ADDR:
6310       return expand_builtin_frob_return_addr (CALL_EXPR_ARG (exp, 0));
6311     case BUILT_IN_EXTRACT_RETURN_ADDR:
6312       return expand_builtin_extract_return_addr (CALL_EXPR_ARG (exp, 0));
6313     case BUILT_IN_EH_RETURN:
6314       expand_builtin_eh_return (CALL_EXPR_ARG (exp, 0),
6315                                 CALL_EXPR_ARG (exp, 1));
6316       return const0_rtx;
6317 #ifdef EH_RETURN_DATA_REGNO
6318     case BUILT_IN_EH_RETURN_DATA_REGNO:
6319       return expand_builtin_eh_return_data_regno (exp);
6320 #endif
6321     case BUILT_IN_EXTEND_POINTER:
6322       return expand_builtin_extend_pointer (CALL_EXPR_ARG (exp, 0));
6323     case BUILT_IN_EH_POINTER:
6324       return expand_builtin_eh_pointer (exp);
6325     case BUILT_IN_EH_FILTER:
6326       return expand_builtin_eh_filter (exp);
6327     case BUILT_IN_EH_COPY_VALUES:
6328       return expand_builtin_eh_copy_values (exp);
6329
6330     case BUILT_IN_VA_START:
6331       return expand_builtin_va_start (exp);
6332     case BUILT_IN_VA_END:
6333       return expand_builtin_va_end (exp);
6334     case BUILT_IN_VA_COPY:
6335       return expand_builtin_va_copy (exp);
6336     case BUILT_IN_EXPECT:
6337       return expand_builtin_expect (exp, target);
6338     case BUILT_IN_PREFETCH:
6339       expand_builtin_prefetch (exp);
6340       return const0_rtx;
6341
6342     case BUILT_IN_INIT_TRAMPOLINE:
6343       return expand_builtin_init_trampoline (exp);
6344     case BUILT_IN_ADJUST_TRAMPOLINE:
6345       return expand_builtin_adjust_trampoline (exp);
6346
6347     case BUILT_IN_FORK:
6348     case BUILT_IN_EXECL:
6349     case BUILT_IN_EXECV:
6350     case BUILT_IN_EXECLP:
6351     case BUILT_IN_EXECLE:
6352     case BUILT_IN_EXECVP:
6353     case BUILT_IN_EXECVE:
6354       target = expand_builtin_fork_or_exec (fndecl, exp, target, ignore);
6355       if (target)
6356         return target;
6357       break;
6358
6359     case BUILT_IN_FETCH_AND_ADD_1:
6360     case BUILT_IN_FETCH_AND_ADD_2:
6361     case BUILT_IN_FETCH_AND_ADD_4:
6362     case BUILT_IN_FETCH_AND_ADD_8:
6363     case BUILT_IN_FETCH_AND_ADD_16:
6364       mode = get_builtin_sync_mode (fcode - BUILT_IN_FETCH_AND_ADD_1);
6365       target = expand_builtin_sync_operation (mode, exp, PLUS,
6366                                               false, target, ignore);
6367       if (target)
6368         return target;
6369       break;
6370
6371     case BUILT_IN_FETCH_AND_SUB_1:
6372     case BUILT_IN_FETCH_AND_SUB_2:
6373     case BUILT_IN_FETCH_AND_SUB_4:
6374     case BUILT_IN_FETCH_AND_SUB_8:
6375     case BUILT_IN_FETCH_AND_SUB_16:
6376       mode = get_builtin_sync_mode (fcode - BUILT_IN_FETCH_AND_SUB_1);
6377       target = expand_builtin_sync_operation (mode, exp, MINUS,
6378                                               false, target, ignore);
6379       if (target)
6380         return target;
6381       break;
6382
6383     case BUILT_IN_FETCH_AND_OR_1:
6384     case BUILT_IN_FETCH_AND_OR_2:
6385     case BUILT_IN_FETCH_AND_OR_4:
6386     case BUILT_IN_FETCH_AND_OR_8:
6387     case BUILT_IN_FETCH_AND_OR_16:
6388       mode = get_builtin_sync_mode (fcode - BUILT_IN_FETCH_AND_OR_1);
6389       target = expand_builtin_sync_operation (mode, exp, IOR,
6390                                               false, target, ignore);
6391       if (target)
6392         return target;
6393       break;
6394
6395     case BUILT_IN_FETCH_AND_AND_1:
6396     case BUILT_IN_FETCH_AND_AND_2:
6397     case BUILT_IN_FETCH_AND_AND_4:
6398     case BUILT_IN_FETCH_AND_AND_8:
6399     case BUILT_IN_FETCH_AND_AND_16:
6400       mode = get_builtin_sync_mode (fcode - BUILT_IN_FETCH_AND_AND_1);
6401       target = expand_builtin_sync_operation (mode, exp, AND,
6402                                               false, target, ignore);
6403       if (target)
6404         return target;
6405       break;
6406
6407     case BUILT_IN_FETCH_AND_XOR_1:
6408     case BUILT_IN_FETCH_AND_XOR_2:
6409     case BUILT_IN_FETCH_AND_XOR_4:
6410     case BUILT_IN_FETCH_AND_XOR_8:
6411     case BUILT_IN_FETCH_AND_XOR_16:
6412       mode = get_builtin_sync_mode (fcode - BUILT_IN_FETCH_AND_XOR_1);
6413       target = expand_builtin_sync_operation (mode, exp, XOR,
6414                                               false, target, ignore);
6415       if (target)
6416         return target;
6417       break;
6418
6419     case BUILT_IN_FETCH_AND_NAND_1:
6420     case BUILT_IN_FETCH_AND_NAND_2:
6421     case BUILT_IN_FETCH_AND_NAND_4:
6422     case BUILT_IN_FETCH_AND_NAND_8:
6423     case BUILT_IN_FETCH_AND_NAND_16:
6424       mode = get_builtin_sync_mode (fcode - BUILT_IN_FETCH_AND_NAND_1);
6425       target = expand_builtin_sync_operation (mode, exp, NOT,
6426                                               false, target, ignore);
6427       if (target)
6428         return target;
6429       break;
6430
6431     case BUILT_IN_ADD_AND_FETCH_1:
6432     case BUILT_IN_ADD_AND_FETCH_2:
6433     case BUILT_IN_ADD_AND_FETCH_4:
6434     case BUILT_IN_ADD_AND_FETCH_8:
6435     case BUILT_IN_ADD_AND_FETCH_16:
6436       mode = get_builtin_sync_mode (fcode - BUILT_IN_ADD_AND_FETCH_1);
6437       target = expand_builtin_sync_operation (mode, exp, PLUS,
6438                                               true, target, ignore);
6439       if (target)
6440         return target;
6441       break;
6442
6443     case BUILT_IN_SUB_AND_FETCH_1:
6444     case BUILT_IN_SUB_AND_FETCH_2:
6445     case BUILT_IN_SUB_AND_FETCH_4:
6446     case BUILT_IN_SUB_AND_FETCH_8:
6447     case BUILT_IN_SUB_AND_FETCH_16:
6448       mode = get_builtin_sync_mode (fcode - BUILT_IN_SUB_AND_FETCH_1);
6449       target = expand_builtin_sync_operation (mode, exp, MINUS,
6450                                               true, target, ignore);
6451       if (target)
6452         return target;
6453       break;
6454
6455     case BUILT_IN_OR_AND_FETCH_1:
6456     case BUILT_IN_OR_AND_FETCH_2:
6457     case BUILT_IN_OR_AND_FETCH_4:
6458     case BUILT_IN_OR_AND_FETCH_8:
6459     case BUILT_IN_OR_AND_FETCH_16:
6460       mode = get_builtin_sync_mode (fcode - BUILT_IN_OR_AND_FETCH_1);
6461       target = expand_builtin_sync_operation (mode, exp, IOR,
6462                                               true, target, ignore);
6463       if (target)
6464         return target;
6465       break;
6466
6467     case BUILT_IN_AND_AND_FETCH_1:
6468     case BUILT_IN_AND_AND_FETCH_2:
6469     case BUILT_IN_AND_AND_FETCH_4:
6470     case BUILT_IN_AND_AND_FETCH_8:
6471     case BUILT_IN_AND_AND_FETCH_16:
6472       mode = get_builtin_sync_mode (fcode - BUILT_IN_AND_AND_FETCH_1);
6473       target = expand_builtin_sync_operation (mode, exp, AND,
6474                                               true, target, ignore);
6475       if (target)
6476         return target;
6477       break;
6478
6479     case BUILT_IN_XOR_AND_FETCH_1:
6480     case BUILT_IN_XOR_AND_FETCH_2:
6481     case BUILT_IN_XOR_AND_FETCH_4:
6482     case BUILT_IN_XOR_AND_FETCH_8:
6483     case BUILT_IN_XOR_AND_FETCH_16:
6484       mode = get_builtin_sync_mode (fcode - BUILT_IN_XOR_AND_FETCH_1);
6485       target = expand_builtin_sync_operation (mode, exp, XOR,
6486                                               true, target, ignore);
6487       if (target)
6488         return target;
6489       break;
6490
6491     case BUILT_IN_NAND_AND_FETCH_1:
6492     case BUILT_IN_NAND_AND_FETCH_2:
6493     case BUILT_IN_NAND_AND_FETCH_4:
6494     case BUILT_IN_NAND_AND_FETCH_8:
6495     case BUILT_IN_NAND_AND_FETCH_16:
6496       mode = get_builtin_sync_mode (fcode - BUILT_IN_NAND_AND_FETCH_1);
6497       target = expand_builtin_sync_operation (mode, exp, NOT,
6498                                               true, target, ignore);
6499       if (target)
6500         return target;
6501       break;
6502
6503     case BUILT_IN_BOOL_COMPARE_AND_SWAP_1:
6504     case BUILT_IN_BOOL_COMPARE_AND_SWAP_2:
6505     case BUILT_IN_BOOL_COMPARE_AND_SWAP_4:
6506     case BUILT_IN_BOOL_COMPARE_AND_SWAP_8:
6507     case BUILT_IN_BOOL_COMPARE_AND_SWAP_16:
6508       if (mode == VOIDmode)
6509         mode = TYPE_MODE (boolean_type_node);
6510       if (!target || !register_operand (target, mode))
6511         target = gen_reg_rtx (mode);
6512
6513       mode = get_builtin_sync_mode (fcode - BUILT_IN_BOOL_COMPARE_AND_SWAP_1);
6514       target = expand_builtin_compare_and_swap (mode, exp, true, target);
6515       if (target)
6516         return target;
6517       break;
6518
6519     case BUILT_IN_VAL_COMPARE_AND_SWAP_1:
6520     case BUILT_IN_VAL_COMPARE_AND_SWAP_2:
6521     case BUILT_IN_VAL_COMPARE_AND_SWAP_4:
6522     case BUILT_IN_VAL_COMPARE_AND_SWAP_8:
6523     case BUILT_IN_VAL_COMPARE_AND_SWAP_16:
6524       mode = get_builtin_sync_mode (fcode - BUILT_IN_VAL_COMPARE_AND_SWAP_1);
6525       target = expand_builtin_compare_and_swap (mode, exp, false, target);
6526       if (target)
6527         return target;
6528       break;
6529
6530     case BUILT_IN_LOCK_TEST_AND_SET_1:
6531     case BUILT_IN_LOCK_TEST_AND_SET_2:
6532     case BUILT_IN_LOCK_TEST_AND_SET_4:
6533     case BUILT_IN_LOCK_TEST_AND_SET_8:
6534     case BUILT_IN_LOCK_TEST_AND_SET_16:
6535       mode = get_builtin_sync_mode (fcode - BUILT_IN_LOCK_TEST_AND_SET_1);
6536       target = expand_builtin_lock_test_and_set (mode, exp, target);
6537       if (target)
6538         return target;
6539       break;
6540
6541     case BUILT_IN_LOCK_RELEASE_1:
6542     case BUILT_IN_LOCK_RELEASE_2:
6543     case BUILT_IN_LOCK_RELEASE_4:
6544     case BUILT_IN_LOCK_RELEASE_8:
6545     case BUILT_IN_LOCK_RELEASE_16:
6546       mode = get_builtin_sync_mode (fcode - BUILT_IN_LOCK_RELEASE_1);
6547       expand_builtin_lock_release (mode, exp);
6548       return const0_rtx;
6549
6550     case BUILT_IN_SYNCHRONIZE:
6551       expand_builtin_synchronize ();
6552       return const0_rtx;
6553
6554     case BUILT_IN_OBJECT_SIZE:
6555       return expand_builtin_object_size (exp);
6556
6557     case BUILT_IN_MEMCPY_CHK:
6558     case BUILT_IN_MEMPCPY_CHK:
6559     case BUILT_IN_MEMMOVE_CHK:
6560     case BUILT_IN_MEMSET_CHK:
6561       target = expand_builtin_memory_chk (exp, target, mode, fcode);
6562       if (target)
6563         return target;
6564       break;
6565
6566     case BUILT_IN_STRCPY_CHK:
6567     case BUILT_IN_STPCPY_CHK:
6568     case BUILT_IN_STRNCPY_CHK:
6569     case BUILT_IN_STRCAT_CHK:
6570     case BUILT_IN_STRNCAT_CHK:
6571     case BUILT_IN_SNPRINTF_CHK:
6572     case BUILT_IN_VSNPRINTF_CHK:
6573       maybe_emit_chk_warning (exp, fcode);
6574       break;
6575
6576     case BUILT_IN_SPRINTF_CHK:
6577     case BUILT_IN_VSPRINTF_CHK:
6578       maybe_emit_sprintf_chk_warning (exp, fcode);
6579       break;
6580
6581     case BUILT_IN_FREE:
6582       maybe_emit_free_warning (exp);
6583       break;
6584
6585     default:    /* just do library call, if unknown builtin */
6586       break;
6587     }
6588
6589   /* The switch statement above can drop through to cause the function
6590      to be called normally.  */
6591   return expand_call (exp, target, ignore);
6592 }
6593
6594 /* Determine whether a tree node represents a call to a built-in
6595    function.  If the tree T is a call to a built-in function with
6596    the right number of arguments of the appropriate types, return
6597    the DECL_FUNCTION_CODE of the call, e.g. BUILT_IN_SQRT.
6598    Otherwise the return value is END_BUILTINS.  */
6599
6600 enum built_in_function
6601 builtin_mathfn_code (const_tree t)
6602 {
6603   const_tree fndecl, arg, parmlist;
6604   const_tree argtype, parmtype;
6605   const_call_expr_arg_iterator iter;
6606
6607   if (TREE_CODE (t) != CALL_EXPR
6608       || TREE_CODE (CALL_EXPR_FN (t)) != ADDR_EXPR)
6609     return END_BUILTINS;
6610
6611   fndecl = get_callee_fndecl (t);
6612   if (fndecl == NULL_TREE
6613       || TREE_CODE (fndecl) != FUNCTION_DECL
6614       || ! DECL_BUILT_IN (fndecl)
6615       || DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
6616     return END_BUILTINS;
6617
6618   parmlist = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
6619   init_const_call_expr_arg_iterator (t, &iter);
6620   for (; parmlist; parmlist = TREE_CHAIN (parmlist))
6621     {
6622       /* If a function doesn't take a variable number of arguments,
6623          the last element in the list will have type `void'.  */
6624       parmtype = TREE_VALUE (parmlist);
6625       if (VOID_TYPE_P (parmtype))
6626         {
6627           if (more_const_call_expr_args_p (&iter))
6628             return END_BUILTINS;
6629           return DECL_FUNCTION_CODE (fndecl);
6630         }
6631
6632       if (! more_const_call_expr_args_p (&iter))
6633         return END_BUILTINS;
6634
6635       arg = next_const_call_expr_arg (&iter);
6636       argtype = TREE_TYPE (arg);
6637
6638       if (SCALAR_FLOAT_TYPE_P (parmtype))
6639         {
6640           if (! SCALAR_FLOAT_TYPE_P (argtype))
6641             return END_BUILTINS;
6642         }
6643       else if (COMPLEX_FLOAT_TYPE_P (parmtype))
6644         {
6645           if (! COMPLEX_FLOAT_TYPE_P (argtype))
6646             return END_BUILTINS;
6647         }
6648       else if (POINTER_TYPE_P (parmtype))
6649         {
6650           if (! POINTER_TYPE_P (argtype))
6651             return END_BUILTINS;
6652         }
6653       else if (INTEGRAL_TYPE_P (parmtype))
6654         {
6655           if (! INTEGRAL_TYPE_P (argtype))
6656             return END_BUILTINS;
6657         }
6658       else
6659         return END_BUILTINS;
6660     }
6661
6662   /* Variable-length argument list.  */
6663   return DECL_FUNCTION_CODE (fndecl);
6664 }
6665
6666 /* Fold a call to __builtin_constant_p, if we know its argument ARG will
6667    evaluate to a constant.  */
6668
6669 static tree
6670 fold_builtin_constant_p (tree arg)
6671 {
6672   /* We return 1 for a numeric type that's known to be a constant
6673      value at compile-time or for an aggregate type that's a
6674      literal constant.  */
6675   STRIP_NOPS (arg);
6676
6677   /* If we know this is a constant, emit the constant of one.  */
6678   if (CONSTANT_CLASS_P (arg)
6679       || (TREE_CODE (arg) == CONSTRUCTOR
6680           && TREE_CONSTANT (arg)))
6681     return integer_one_node;
6682   if (TREE_CODE (arg) == ADDR_EXPR)
6683     {
6684        tree op = TREE_OPERAND (arg, 0);
6685        if (TREE_CODE (op) == STRING_CST
6686            || (TREE_CODE (op) == ARRAY_REF
6687                && integer_zerop (TREE_OPERAND (op, 1))
6688                && TREE_CODE (TREE_OPERAND (op, 0)) == STRING_CST))
6689          return integer_one_node;
6690     }
6691
6692   /* If this expression has side effects, show we don't know it to be a
6693      constant.  Likewise if it's a pointer or aggregate type since in
6694      those case we only want literals, since those are only optimized
6695      when generating RTL, not later.
6696      And finally, if we are compiling an initializer, not code, we
6697      need to return a definite result now; there's not going to be any
6698      more optimization done.  */
6699   if (TREE_SIDE_EFFECTS (arg)
6700       || AGGREGATE_TYPE_P (TREE_TYPE (arg))
6701       || POINTER_TYPE_P (TREE_TYPE (arg))
6702       || cfun == 0
6703       || folding_initializer)
6704     return integer_zero_node;
6705
6706   return NULL_TREE;
6707 }
6708
6709 /* Create builtin_expect with PRED and EXPECTED as its arguments and
6710    return it as a truthvalue.  */
6711
6712 static tree
6713 build_builtin_expect_predicate (location_t loc, tree pred, tree expected)
6714 {
6715   tree fn, arg_types, pred_type, expected_type, call_expr, ret_type;
6716
6717   fn = built_in_decls[BUILT_IN_EXPECT];
6718   arg_types = TYPE_ARG_TYPES (TREE_TYPE (fn));
6719   ret_type = TREE_TYPE (TREE_TYPE (fn));
6720   pred_type = TREE_VALUE (arg_types);
6721   expected_type = TREE_VALUE (TREE_CHAIN (arg_types));
6722
6723   pred = fold_convert_loc (loc, pred_type, pred);
6724   expected = fold_convert_loc (loc, expected_type, expected);
6725   call_expr = build_call_expr_loc (loc, fn, 2, pred, expected);
6726
6727   return build2 (NE_EXPR, TREE_TYPE (pred), call_expr,
6728                  build_int_cst (ret_type, 0));
6729 }
6730
6731 /* Fold a call to builtin_expect with arguments ARG0 and ARG1.  Return
6732    NULL_TREE if no simplification is possible.  */
6733
6734 static tree
6735 fold_builtin_expect (location_t loc, tree arg0, tree arg1)
6736 {
6737   tree inner, fndecl;
6738   enum tree_code code;
6739
6740   /* If this is a builtin_expect within a builtin_expect keep the
6741      inner one.  See through a comparison against a constant.  It
6742      might have been added to create a thruthvalue.  */
6743   inner = arg0;
6744   if (COMPARISON_CLASS_P (inner)
6745       && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST)
6746     inner = TREE_OPERAND (inner, 0);
6747
6748   if (TREE_CODE (inner) == CALL_EXPR
6749       && (fndecl = get_callee_fndecl (inner))
6750       && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
6751       && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_EXPECT)
6752     return arg0;
6753
6754   /* Distribute the expected value over short-circuiting operators.
6755      See through the cast from truthvalue_type_node to long.  */
6756   inner = arg0;
6757   while (TREE_CODE (inner) == NOP_EXPR
6758          && INTEGRAL_TYPE_P (TREE_TYPE (inner))
6759          && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (inner, 0))))
6760     inner = TREE_OPERAND (inner, 0);
6761
6762   code = TREE_CODE (inner);
6763   if (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR)
6764     {
6765       tree op0 = TREE_OPERAND (inner, 0);
6766       tree op1 = TREE_OPERAND (inner, 1);
6767
6768       op0 = build_builtin_expect_predicate (loc, op0, arg1);
6769       op1 = build_builtin_expect_predicate (loc, op1, arg1);
6770       inner = build2 (code, TREE_TYPE (inner), op0, op1);
6771
6772       return fold_convert_loc (loc, TREE_TYPE (arg0), inner);
6773     }
6774
6775   /* If the argument isn't invariant then there's nothing else we can do.  */
6776   if (!TREE_CONSTANT (arg0))
6777     return NULL_TREE;
6778
6779   /* If we expect that a comparison against the argument will fold to
6780      a constant return the constant.  In practice, this means a true
6781      constant or the address of a non-weak symbol.  */
6782   inner = arg0;
6783   STRIP_NOPS (inner);
6784   if (TREE_CODE (inner) == ADDR_EXPR)
6785     {
6786       do
6787         {
6788           inner = TREE_OPERAND (inner, 0);
6789         }
6790       while (TREE_CODE (inner) == COMPONENT_REF
6791              || TREE_CODE (inner) == ARRAY_REF);
6792       if ((TREE_CODE (inner) == VAR_DECL
6793            || TREE_CODE (inner) == FUNCTION_DECL)
6794           && DECL_WEAK (inner))
6795         return NULL_TREE;
6796     }
6797
6798   /* Otherwise, ARG0 already has the proper type for the return value.  */
6799   return arg0;
6800 }
6801
6802 /* Fold a call to __builtin_classify_type with argument ARG.  */
6803
6804 static tree
6805 fold_builtin_classify_type (tree arg)
6806 {
6807   if (arg == 0)
6808     return build_int_cst (NULL_TREE, no_type_class);
6809
6810   return build_int_cst (NULL_TREE, type_to_class (TREE_TYPE (arg)));
6811 }
6812
6813 /* Fold a call to __builtin_strlen with argument ARG.  */
6814
6815 static tree
6816 fold_builtin_strlen (location_t loc, tree type, tree arg)
6817 {
6818   if (!validate_arg (arg, POINTER_TYPE))
6819     return NULL_TREE;
6820   else
6821     {
6822       tree len = c_strlen (arg, 0);
6823
6824       if (len)
6825         return fold_convert_loc (loc, type, len);
6826
6827       return NULL_TREE;
6828     }
6829 }
6830
6831 /* Fold a call to __builtin_inf or __builtin_huge_val.  */
6832
6833 static tree
6834 fold_builtin_inf (location_t loc, tree type, int warn)
6835 {
6836   REAL_VALUE_TYPE real;
6837
6838   /* __builtin_inff is intended to be usable to define INFINITY on all
6839      targets.  If an infinity is not available, INFINITY expands "to a
6840      positive constant of type float that overflows at translation
6841      time", footnote "In this case, using INFINITY will violate the
6842      constraint in 6.4.4 and thus require a diagnostic." (C99 7.12#4).
6843      Thus we pedwarn to ensure this constraint violation is
6844      diagnosed.  */
6845   if (!MODE_HAS_INFINITIES (TYPE_MODE (type)) && warn)
6846     pedwarn (loc, 0, "target format does not support infinity");
6847
6848   real_inf (&real);
6849   return build_real (type, real);
6850 }
6851
6852 /* Fold a call to __builtin_nan or __builtin_nans with argument ARG.  */
6853
6854 static tree
6855 fold_builtin_nan (tree arg, tree type, int quiet)
6856 {
6857   REAL_VALUE_TYPE real;
6858   const char *str;
6859
6860   if (!validate_arg (arg, POINTER_TYPE))
6861     return NULL_TREE;
6862   str = c_getstr (arg);
6863   if (!str)
6864     return NULL_TREE;
6865
6866   if (!real_nan (&real, str, quiet, TYPE_MODE (type)))
6867     return NULL_TREE;
6868
6869   return build_real (type, real);
6870 }
6871
6872 /* Return true if the floating point expression T has an integer value.
6873    We also allow +Inf, -Inf and NaN to be considered integer values.  */
6874
6875 static bool
6876 integer_valued_real_p (tree t)
6877 {
6878   switch (TREE_CODE (t))
6879     {
6880     case FLOAT_EXPR:
6881       return true;
6882
6883     case ABS_EXPR:
6884     case SAVE_EXPR:
6885       return integer_valued_real_p (TREE_OPERAND (t, 0));
6886
6887     case COMPOUND_EXPR:
6888     case MODIFY_EXPR:
6889     case BIND_EXPR:
6890       return integer_valued_real_p (TREE_OPERAND (t, 1));
6891
6892     case PLUS_EXPR:
6893     case MINUS_EXPR:
6894     case MULT_EXPR:
6895     case MIN_EXPR:
6896     case MAX_EXPR:
6897       return integer_valued_real_p (TREE_OPERAND (t, 0))
6898              && integer_valued_real_p (TREE_OPERAND (t, 1));
6899
6900     case COND_EXPR:
6901       return integer_valued_real_p (TREE_OPERAND (t, 1))
6902              && integer_valued_real_p (TREE_OPERAND (t, 2));
6903
6904     case REAL_CST:
6905       return real_isinteger (TREE_REAL_CST_PTR (t), TYPE_MODE (TREE_TYPE (t)));
6906
6907     case NOP_EXPR:
6908       {
6909         tree type = TREE_TYPE (TREE_OPERAND (t, 0));
6910         if (TREE_CODE (type) == INTEGER_TYPE)
6911           return true;
6912         if (TREE_CODE (type) == REAL_TYPE)
6913           return integer_valued_real_p (TREE_OPERAND (t, 0));
6914         break;
6915       }
6916
6917     case CALL_EXPR:
6918       switch (builtin_mathfn_code (t))
6919         {
6920         CASE_FLT_FN (BUILT_IN_CEIL):
6921         CASE_FLT_FN (BUILT_IN_FLOOR):
6922         CASE_FLT_FN (BUILT_IN_NEARBYINT):
6923         CASE_FLT_FN (BUILT_IN_RINT):
6924         CASE_FLT_FN (BUILT_IN_ROUND):
6925         CASE_FLT_FN (BUILT_IN_TRUNC):
6926           return true;
6927
6928         CASE_FLT_FN (BUILT_IN_FMIN):
6929         CASE_FLT_FN (BUILT_IN_FMAX):
6930           return integer_valued_real_p (CALL_EXPR_ARG (t, 0))
6931             && integer_valued_real_p (CALL_EXPR_ARG (t, 1));
6932
6933         default:
6934           break;
6935         }
6936       break;
6937
6938     default:
6939       break;
6940     }
6941   return false;
6942 }
6943
6944 /* FNDECL is assumed to be a builtin where truncation can be propagated
6945    across (for instance floor((double)f) == (double)floorf (f).
6946    Do the transformation for a call with argument ARG.  */
6947
6948 static tree
6949 fold_trunc_transparent_mathfn (location_t loc, tree fndecl, tree arg)
6950 {
6951   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
6952
6953   if (!validate_arg (arg, REAL_TYPE))
6954     return NULL_TREE;
6955
6956   /* Integer rounding functions are idempotent.  */
6957   if (fcode == builtin_mathfn_code (arg))
6958     return arg;
6959
6960   /* If argument is already integer valued, and we don't need to worry
6961      about setting errno, there's no need to perform rounding.  */
6962   if (! flag_errno_math && integer_valued_real_p (arg))
6963     return arg;
6964
6965   if (optimize)
6966     {
6967       tree arg0 = strip_float_extensions (arg);
6968       tree ftype = TREE_TYPE (TREE_TYPE (fndecl));
6969       tree newtype = TREE_TYPE (arg0);
6970       tree decl;
6971
6972       if (TYPE_PRECISION (newtype) < TYPE_PRECISION (ftype)
6973           && (decl = mathfn_built_in (newtype, fcode)))
6974         return fold_convert_loc (loc, ftype,
6975                                  build_call_expr_loc (loc, decl, 1,
6976                                                   fold_convert_loc (loc,
6977                                                                     newtype,
6978                                                                     arg0)));
6979     }
6980   return NULL_TREE;
6981 }
6982
6983 /* FNDECL is assumed to be builtin which can narrow the FP type of
6984    the argument, for instance lround((double)f) -> lroundf (f).
6985    Do the transformation for a call with argument ARG.  */
6986
6987 static tree
6988 fold_fixed_mathfn (location_t loc, tree fndecl, tree arg)
6989 {
6990   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
6991
6992   if (!validate_arg (arg, REAL_TYPE))
6993     return NULL_TREE;
6994
6995   /* If argument is already integer valued, and we don't need to worry
6996      about setting errno, there's no need to perform rounding.  */
6997   if (! flag_errno_math && integer_valued_real_p (arg))
6998     return fold_build1_loc (loc, FIX_TRUNC_EXPR,
6999                         TREE_TYPE (TREE_TYPE (fndecl)), arg);
7000
7001   if (optimize)
7002     {
7003       tree ftype = TREE_TYPE (arg);
7004       tree arg0 = strip_float_extensions (arg);
7005       tree newtype = TREE_TYPE (arg0);
7006       tree decl;
7007
7008       if (TYPE_PRECISION (newtype) < TYPE_PRECISION (ftype)
7009           && (decl = mathfn_built_in (newtype, fcode)))
7010         return build_call_expr_loc (loc, decl, 1,
7011                                 fold_convert_loc (loc, newtype, arg0));
7012     }
7013
7014   /* Canonicalize llround (x) to lround (x) on LP64 targets where
7015      sizeof (long long) == sizeof (long).  */
7016   if (TYPE_PRECISION (long_long_integer_type_node)
7017       == TYPE_PRECISION (long_integer_type_node))
7018     {
7019       tree newfn = NULL_TREE;
7020       switch (fcode)
7021         {
7022         CASE_FLT_FN (BUILT_IN_LLCEIL):
7023           newfn = mathfn_built_in (TREE_TYPE (arg), BUILT_IN_LCEIL);
7024           break;
7025
7026         CASE_FLT_FN (BUILT_IN_LLFLOOR):
7027           newfn = mathfn_built_in (TREE_TYPE (arg), BUILT_IN_LFLOOR);
7028           break;
7029
7030         CASE_FLT_FN (BUILT_IN_LLROUND):
7031           newfn = mathfn_built_in (TREE_TYPE (arg), BUILT_IN_LROUND);
7032           break;
7033
7034         CASE_FLT_FN (BUILT_IN_LLRINT):
7035           newfn = mathfn_built_in (TREE_TYPE (arg), BUILT_IN_LRINT);
7036           break;
7037
7038         default:
7039           break;
7040         }
7041
7042       if (newfn)
7043         {
7044           tree newcall = build_call_expr_loc (loc, newfn, 1, arg);
7045           return fold_convert_loc (loc,
7046                                    TREE_TYPE (TREE_TYPE (fndecl)), newcall);
7047         }
7048     }
7049
7050   return NULL_TREE;
7051 }
7052
7053 /* Fold call to builtin cabs, cabsf or cabsl with argument ARG.  TYPE is the
7054    return type.  Return NULL_TREE if no simplification can be made.  */
7055
7056 static tree
7057 fold_builtin_cabs (location_t loc, tree arg, tree type, tree fndecl)
7058 {
7059   tree res;
7060
7061   if (!validate_arg (arg, COMPLEX_TYPE)
7062       || TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) != REAL_TYPE)
7063     return NULL_TREE;
7064
7065   /* Calculate the result when the argument is a constant.  */
7066   if (TREE_CODE (arg) == COMPLEX_CST
7067       && (res = do_mpfr_arg2 (TREE_REALPART (arg), TREE_IMAGPART (arg),
7068                               type, mpfr_hypot)))
7069     return res;
7070
7071   if (TREE_CODE (arg) == COMPLEX_EXPR)
7072     {
7073       tree real = TREE_OPERAND (arg, 0);
7074       tree imag = TREE_OPERAND (arg, 1);
7075
7076       /* If either part is zero, cabs is fabs of the other.  */
7077       if (real_zerop (real))
7078         return fold_build1_loc (loc, ABS_EXPR, type, imag);
7079       if (real_zerop (imag))
7080         return fold_build1_loc (loc, ABS_EXPR, type, real);
7081
7082       /* cabs(x+xi) -> fabs(x)*sqrt(2).  */
7083       if (flag_unsafe_math_optimizations
7084           && operand_equal_p (real, imag, OEP_PURE_SAME))
7085         {
7086           const REAL_VALUE_TYPE sqrt2_trunc
7087             = real_value_truncate (TYPE_MODE (type), dconst_sqrt2 ());
7088           STRIP_NOPS (real);
7089           return fold_build2_loc (loc, MULT_EXPR, type,
7090                               fold_build1_loc (loc, ABS_EXPR, type, real),
7091                               build_real (type, sqrt2_trunc));
7092         }
7093     }
7094
7095   /* Optimize cabs(-z) and cabs(conj(z)) as cabs(z).  */
7096   if (TREE_CODE (arg) == NEGATE_EXPR
7097       || TREE_CODE (arg) == CONJ_EXPR)
7098     return build_call_expr_loc (loc, fndecl, 1, TREE_OPERAND (arg, 0));
7099
7100   /* Don't do this when optimizing for size.  */
7101   if (flag_unsafe_math_optimizations
7102       && optimize && optimize_function_for_speed_p (cfun))
7103     {
7104       tree sqrtfn = mathfn_built_in (type, BUILT_IN_SQRT);
7105
7106       if (sqrtfn != NULL_TREE)
7107         {
7108           tree rpart, ipart, result;
7109
7110           arg = builtin_save_expr (arg);
7111
7112           rpart = fold_build1_loc (loc, REALPART_EXPR, type, arg);
7113           ipart = fold_build1_loc (loc, IMAGPART_EXPR, type, arg);
7114
7115           rpart = builtin_save_expr (rpart);
7116           ipart = builtin_save_expr (ipart);
7117
7118           result = fold_build2_loc (loc, PLUS_EXPR, type,
7119                                 fold_build2_loc (loc, MULT_EXPR, type,
7120                                              rpart, rpart),
7121                                 fold_build2_loc (loc, MULT_EXPR, type,
7122                                              ipart, ipart));
7123
7124           return build_call_expr_loc (loc, sqrtfn, 1, result);
7125         }
7126     }
7127
7128   return NULL_TREE;
7129 }
7130
7131 /* Build a complex (inf +- 0i) for the result of cproj.  TYPE is the
7132    complex tree type of the result.  If NEG is true, the imaginary
7133    zero is negative.  */
7134
7135 static tree
7136 build_complex_cproj (tree type, bool neg)
7137 {
7138   REAL_VALUE_TYPE rinf, rzero = dconst0;
7139   
7140   real_inf (&rinf);
7141   rzero.sign = neg;
7142   return build_complex (type, build_real (TREE_TYPE (type), rinf),
7143                         build_real (TREE_TYPE (type), rzero));
7144 }
7145
7146 /* Fold call to builtin cproj, cprojf or cprojl with argument ARG.  TYPE is the
7147    return type.  Return NULL_TREE if no simplification can be made.  */
7148
7149 static tree
7150 fold_builtin_cproj (location_t loc, tree arg, tree type)
7151 {
7152   if (!validate_arg (arg, COMPLEX_TYPE)
7153       || TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) != REAL_TYPE)
7154     return NULL_TREE;
7155
7156   /* If there are no infinities, return arg.  */
7157   if (! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (type))))
7158     return non_lvalue_loc (loc, arg);
7159
7160   /* Calculate the result when the argument is a constant.  */
7161   if (TREE_CODE (arg) == COMPLEX_CST)
7162     {
7163       const REAL_VALUE_TYPE *real = TREE_REAL_CST_PTR (TREE_REALPART (arg));
7164       const REAL_VALUE_TYPE *imag = TREE_REAL_CST_PTR (TREE_IMAGPART (arg));
7165       
7166       if (real_isinf (real) || real_isinf (imag))
7167         return build_complex_cproj (type, imag->sign);
7168       else
7169         return arg;
7170     }
7171   else if (TREE_CODE (arg) == COMPLEX_EXPR)
7172     {
7173       tree real = TREE_OPERAND (arg, 0);
7174       tree imag = TREE_OPERAND (arg, 1);
7175
7176       STRIP_NOPS (real);
7177       STRIP_NOPS (imag);
7178       
7179       /* If the real part is inf and the imag part is known to be
7180          nonnegative, return (inf + 0i).  Remember side-effects are
7181          possible in the imag part.  */
7182       if (TREE_CODE (real) == REAL_CST
7183           && real_isinf (TREE_REAL_CST_PTR (real))
7184           && tree_expr_nonnegative_p (imag))
7185         return omit_one_operand_loc (loc, type,
7186                                      build_complex_cproj (type, false),
7187                                      arg);
7188       
7189       /* If the imag part is inf, return (inf+I*copysign(0,imag)).
7190          Remember side-effects are possible in the real part.  */
7191       if (TREE_CODE (imag) == REAL_CST
7192           && real_isinf (TREE_REAL_CST_PTR (imag)))
7193         return
7194           omit_one_operand_loc (loc, type,
7195                                 build_complex_cproj (type, TREE_REAL_CST_PTR
7196                                                      (imag)->sign), arg);
7197     }
7198
7199   return NULL_TREE;
7200 }
7201
7202 /* Fold a builtin function call to sqrt, sqrtf, or sqrtl with argument ARG.
7203    Return NULL_TREE if no simplification can be made.  */
7204
7205 static tree
7206 fold_builtin_sqrt (location_t loc, tree arg, tree type)
7207 {
7208
7209   enum built_in_function fcode;
7210   tree res;
7211
7212   if (!validate_arg (arg, REAL_TYPE))
7213     return NULL_TREE;
7214
7215   /* Calculate the result when the argument is a constant.  */
7216   if ((res = do_mpfr_arg1 (arg, type, mpfr_sqrt, &dconst0, NULL, true)))
7217     return res;
7218
7219   /* Optimize sqrt(expN(x)) = expN(x*0.5).  */
7220   fcode = builtin_mathfn_code (arg);
7221   if (flag_unsafe_math_optimizations && BUILTIN_EXPONENT_P (fcode))
7222     {
7223       tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg), 0);
7224       arg = fold_build2_loc (loc, MULT_EXPR, type,
7225                          CALL_EXPR_ARG (arg, 0),
7226                          build_real (type, dconsthalf));
7227       return build_call_expr_loc (loc, expfn, 1, arg);
7228     }
7229
7230   /* Optimize sqrt(Nroot(x)) -> pow(x,1/(2*N)).  */
7231   if (flag_unsafe_math_optimizations && BUILTIN_ROOT_P (fcode))
7232     {
7233       tree powfn = mathfn_built_in (type, BUILT_IN_POW);
7234
7235       if (powfn)
7236         {
7237           tree arg0 = CALL_EXPR_ARG (arg, 0);
7238           tree tree_root;
7239           /* The inner root was either sqrt or cbrt.  */
7240           /* This was a conditional expression but it triggered a bug
7241              in Sun C 5.5.  */
7242           REAL_VALUE_TYPE dconstroot;
7243           if (BUILTIN_SQRT_P (fcode))
7244             dconstroot = dconsthalf;
7245           else
7246             dconstroot = dconst_third ();
7247
7248           /* Adjust for the outer root.  */
7249           SET_REAL_EXP (&dconstroot, REAL_EXP (&dconstroot) - 1);
7250           dconstroot = real_value_truncate (TYPE_MODE (type), dconstroot);
7251           tree_root = build_real (type, dconstroot);
7252           return build_call_expr_loc (loc, powfn, 2, arg0, tree_root);
7253         }
7254     }
7255
7256   /* Optimize sqrt(pow(x,y)) = pow(|x|,y*0.5).  */
7257   if (flag_unsafe_math_optimizations
7258       && (fcode == BUILT_IN_POW
7259           || fcode == BUILT_IN_POWF
7260           || fcode == BUILT_IN_POWL))
7261     {
7262       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg), 0);
7263       tree arg0 = CALL_EXPR_ARG (arg, 0);
7264       tree arg1 = CALL_EXPR_ARG (arg, 1);
7265       tree narg1;
7266       if (!tree_expr_nonnegative_p (arg0))
7267         arg0 = build1 (ABS_EXPR, type, arg0);
7268       narg1 = fold_build2_loc (loc, MULT_EXPR, type, arg1,
7269                            build_real (type, dconsthalf));
7270       return build_call_expr_loc (loc, powfn, 2, arg0, narg1);
7271     }
7272
7273   return NULL_TREE;
7274 }
7275
7276 /* Fold a builtin function call to cbrt, cbrtf, or cbrtl with argument ARG.
7277    Return NULL_TREE if no simplification can be made.  */
7278
7279 static tree
7280 fold_builtin_cbrt (location_t loc, tree arg, tree type)
7281 {
7282   const enum built_in_function fcode = builtin_mathfn_code (arg);
7283   tree res;
7284
7285   if (!validate_arg (arg, REAL_TYPE))
7286     return NULL_TREE;
7287
7288   /* Calculate the result when the argument is a constant.  */
7289   if ((res = do_mpfr_arg1 (arg, type, mpfr_cbrt, NULL, NULL, 0)))
7290     return res;
7291
7292   if (flag_unsafe_math_optimizations)
7293     {
7294       /* Optimize cbrt(expN(x)) -> expN(x/3).  */
7295       if (BUILTIN_EXPONENT_P (fcode))
7296         {
7297           tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg), 0);
7298           const REAL_VALUE_TYPE third_trunc =
7299             real_value_truncate (TYPE_MODE (type), dconst_third ());
7300           arg = fold_build2_loc (loc, MULT_EXPR, type,
7301                              CALL_EXPR_ARG (arg, 0),
7302                              build_real (type, third_trunc));
7303           return build_call_expr_loc (loc, expfn, 1, arg);
7304         }
7305
7306       /* Optimize cbrt(sqrt(x)) -> pow(x,1/6).  */
7307       if (BUILTIN_SQRT_P (fcode))
7308         {
7309           tree powfn = mathfn_built_in (type, BUILT_IN_POW);
7310
7311           if (powfn)
7312             {
7313               tree arg0 = CALL_EXPR_ARG (arg, 0);
7314               tree tree_root;
7315               REAL_VALUE_TYPE dconstroot = dconst_third ();
7316
7317               SET_REAL_EXP (&dconstroot, REAL_EXP (&dconstroot) - 1);
7318               dconstroot = real_value_truncate (TYPE_MODE (type), dconstroot);
7319               tree_root = build_real (type, dconstroot);
7320               return build_call_expr_loc (loc, powfn, 2, arg0, tree_root);
7321             }
7322         }
7323
7324       /* Optimize cbrt(cbrt(x)) -> pow(x,1/9) iff x is nonnegative.  */
7325       if (BUILTIN_CBRT_P (fcode))
7326         {
7327           tree arg0 = CALL_EXPR_ARG (arg, 0);
7328           if (tree_expr_nonnegative_p (arg0))
7329             {
7330               tree powfn = mathfn_built_in (type, BUILT_IN_POW);
7331
7332               if (powfn)
7333                 {
7334                   tree tree_root;
7335                   REAL_VALUE_TYPE dconstroot;
7336
7337                   real_arithmetic (&dconstroot, MULT_EXPR,
7338                                    dconst_third_ptr (), dconst_third_ptr ());
7339                   dconstroot = real_value_truncate (TYPE_MODE (type), dconstroot);
7340                   tree_root = build_real (type, dconstroot);
7341                   return build_call_expr_loc (loc, powfn, 2, arg0, tree_root);
7342                 }
7343             }
7344         }
7345
7346       /* Optimize cbrt(pow(x,y)) -> pow(x,y/3) iff x is nonnegative.  */
7347       if (fcode == BUILT_IN_POW
7348           || fcode == BUILT_IN_POWF
7349           || fcode == BUILT_IN_POWL)
7350         {
7351           tree arg00 = CALL_EXPR_ARG (arg, 0);
7352           tree arg01 = CALL_EXPR_ARG (arg, 1);
7353           if (tree_expr_nonnegative_p (arg00))
7354             {
7355               tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg), 0);
7356               const REAL_VALUE_TYPE dconstroot
7357                 = real_value_truncate (TYPE_MODE (type), dconst_third ());
7358               tree narg01 = fold_build2_loc (loc, MULT_EXPR, type, arg01,
7359                                          build_real (type, dconstroot));
7360               return build_call_expr_loc (loc, powfn, 2, arg00, narg01);
7361             }
7362         }
7363     }
7364   return NULL_TREE;
7365 }
7366
7367 /* Fold function call to builtin cos, cosf, or cosl with argument ARG.
7368    TYPE is the type of the return value.  Return NULL_TREE if no
7369    simplification can be made.  */
7370
7371 static tree
7372 fold_builtin_cos (location_t loc,
7373                   tree arg, tree type, tree fndecl)
7374 {
7375   tree res, narg;
7376
7377   if (!validate_arg (arg, REAL_TYPE))
7378     return NULL_TREE;
7379
7380   /* Calculate the result when the argument is a constant.  */
7381   if ((res = do_mpfr_arg1 (arg, type, mpfr_cos, NULL, NULL, 0)))
7382     return res;
7383
7384   /* Optimize cos(-x) into cos (x).  */
7385   if ((narg = fold_strip_sign_ops (arg)))
7386     return build_call_expr_loc (loc, fndecl, 1, narg);
7387
7388   return NULL_TREE;
7389 }
7390
7391 /* Fold function call to builtin cosh, coshf, or coshl with argument ARG.
7392    Return NULL_TREE if no simplification can be made.  */
7393
7394 static tree
7395 fold_builtin_cosh (location_t loc, tree arg, tree type, tree fndecl)
7396 {
7397   if (validate_arg (arg, REAL_TYPE))
7398     {
7399       tree res, narg;
7400
7401       /* Calculate the result when the argument is a constant.  */
7402       if ((res = do_mpfr_arg1 (arg, type, mpfr_cosh, NULL, NULL, 0)))
7403         return res;
7404
7405       /* Optimize cosh(-x) into cosh (x).  */
7406       if ((narg = fold_strip_sign_ops (arg)))
7407         return build_call_expr_loc (loc, fndecl, 1, narg);
7408     }
7409
7410   return NULL_TREE;
7411 }
7412
7413 /* Fold function call to builtin ccos (or ccosh if HYPER is TRUE) with
7414    argument ARG.  TYPE is the type of the return value.  Return
7415    NULL_TREE if no simplification can be made.  */
7416
7417 static tree
7418 fold_builtin_ccos (location_t loc, tree arg, tree type, tree fndecl,
7419                    bool hyper)
7420 {
7421   if (validate_arg (arg, COMPLEX_TYPE)
7422       && TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) == REAL_TYPE)
7423     {
7424       tree tmp;
7425
7426       /* Calculate the result when the argument is a constant.  */
7427       if ((tmp = do_mpc_arg1 (arg, type, (hyper ? mpc_cosh : mpc_cos))))
7428         return tmp;
7429
7430       /* Optimize fn(-x) into fn(x).  */
7431       if ((tmp = fold_strip_sign_ops (arg)))
7432         return build_call_expr_loc (loc, fndecl, 1, tmp);
7433     }
7434
7435   return NULL_TREE;
7436 }
7437
7438 /* Fold function call to builtin tan, tanf, or tanl with argument ARG.
7439    Return NULL_TREE if no simplification can be made.  */
7440
7441 static tree
7442 fold_builtin_tan (tree arg, tree type)
7443 {
7444   enum built_in_function fcode;
7445   tree res;
7446
7447   if (!validate_arg (arg, REAL_TYPE))
7448     return NULL_TREE;
7449
7450   /* Calculate the result when the argument is a constant.  */
7451   if ((res = do_mpfr_arg1 (arg, type, mpfr_tan, NULL, NULL, 0)))
7452     return res;
7453
7454   /* Optimize tan(atan(x)) = x.  */
7455   fcode = builtin_mathfn_code (arg);
7456   if (flag_unsafe_math_optimizations
7457       && (fcode == BUILT_IN_ATAN
7458           || fcode == BUILT_IN_ATANF
7459           || fcode == BUILT_IN_ATANL))
7460     return CALL_EXPR_ARG (arg, 0);
7461
7462   return NULL_TREE;
7463 }
7464
7465 /* Fold function call to builtin sincos, sincosf, or sincosl.  Return
7466    NULL_TREE if no simplification can be made.  */
7467
7468 static tree
7469 fold_builtin_sincos (location_t loc,
7470                      tree arg0, tree arg1, tree arg2)
7471 {
7472   tree type;
7473   tree res, fn, call;
7474
7475   if (!validate_arg (arg0, REAL_TYPE)
7476       || !validate_arg (arg1, POINTER_TYPE)
7477       || !validate_arg (arg2, POINTER_TYPE))
7478     return NULL_TREE;
7479
7480   type = TREE_TYPE (arg0);
7481
7482   /* Calculate the result when the argument is a constant.  */
7483   if ((res = do_mpfr_sincos (arg0, arg1, arg2)))
7484     return res;
7485
7486   /* Canonicalize sincos to cexpi.  */
7487   if (!TARGET_C99_FUNCTIONS)
7488     return NULL_TREE;
7489   fn = mathfn_built_in (type, BUILT_IN_CEXPI);
7490   if (!fn)
7491     return NULL_TREE;
7492
7493   call = build_call_expr_loc (loc, fn, 1, arg0);
7494   call = builtin_save_expr (call);
7495
7496   return build2 (COMPOUND_EXPR, void_type_node,
7497                  build2 (MODIFY_EXPR, void_type_node,
7498                          build_fold_indirect_ref_loc (loc, arg1),
7499                          build1 (IMAGPART_EXPR, type, call)),
7500                  build2 (MODIFY_EXPR, void_type_node,
7501                          build_fold_indirect_ref_loc (loc, arg2),
7502                          build1 (REALPART_EXPR, type, call)));
7503 }
7504
7505 /* Fold function call to builtin cexp, cexpf, or cexpl.  Return
7506    NULL_TREE if no simplification can be made.  */
7507
7508 static tree
7509 fold_builtin_cexp (location_t loc, tree arg0, tree type)
7510 {
7511   tree rtype;
7512   tree realp, imagp, ifn;
7513   tree res;
7514
7515   if (!validate_arg (arg0, COMPLEX_TYPE)
7516       || TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) != REAL_TYPE)
7517     return NULL_TREE;
7518
7519   /* Calculate the result when the argument is a constant.  */
7520   if ((res = do_mpc_arg1 (arg0, type, mpc_exp)))
7521     return res;
7522
7523   rtype = TREE_TYPE (TREE_TYPE (arg0));
7524
7525   /* In case we can figure out the real part of arg0 and it is constant zero
7526      fold to cexpi.  */
7527   if (!TARGET_C99_FUNCTIONS)
7528     return NULL_TREE;
7529   ifn = mathfn_built_in (rtype, BUILT_IN_CEXPI);
7530   if (!ifn)
7531     return NULL_TREE;
7532
7533   if ((realp = fold_unary_loc (loc, REALPART_EXPR, rtype, arg0))
7534       && real_zerop (realp))
7535     {
7536       tree narg = fold_build1_loc (loc, IMAGPART_EXPR, rtype, arg0);
7537       return build_call_expr_loc (loc, ifn, 1, narg);
7538     }
7539
7540   /* In case we can easily decompose real and imaginary parts split cexp
7541      to exp (r) * cexpi (i).  */
7542   if (flag_unsafe_math_optimizations
7543       && realp)
7544     {
7545       tree rfn, rcall, icall;
7546
7547       rfn = mathfn_built_in (rtype, BUILT_IN_EXP);
7548       if (!rfn)
7549         return NULL_TREE;
7550
7551       imagp = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg0);
7552       if (!imagp)
7553         return NULL_TREE;
7554
7555       icall = build_call_expr_loc (loc, ifn, 1, imagp);
7556       icall = builtin_save_expr (icall);
7557       rcall = build_call_expr_loc (loc, rfn, 1, realp);
7558       rcall = builtin_save_expr (rcall);
7559       return fold_build2_loc (loc, COMPLEX_EXPR, type,
7560                           fold_build2_loc (loc, MULT_EXPR, rtype,
7561                                        rcall,
7562                                        fold_build1_loc (loc, REALPART_EXPR,
7563                                                     rtype, icall)),
7564                           fold_build2_loc (loc, MULT_EXPR, rtype,
7565                                        rcall,
7566                                        fold_build1_loc (loc, IMAGPART_EXPR,
7567                                                     rtype, icall)));
7568     }
7569
7570   return NULL_TREE;
7571 }
7572
7573 /* Fold function call to builtin trunc, truncf or truncl with argument ARG.
7574    Return NULL_TREE if no simplification can be made.  */
7575
7576 static tree
7577 fold_builtin_trunc (location_t loc, tree fndecl, tree arg)
7578 {
7579   if (!validate_arg (arg, REAL_TYPE))
7580     return NULL_TREE;
7581
7582   /* Optimize trunc of constant value.  */
7583   if (TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg))
7584     {
7585       REAL_VALUE_TYPE r, x;
7586       tree type = TREE_TYPE (TREE_TYPE (fndecl));
7587
7588       x = TREE_REAL_CST (arg);
7589       real_trunc (&r, TYPE_MODE (type), &x);
7590       return build_real (type, r);
7591     }
7592
7593   return fold_trunc_transparent_mathfn (loc, fndecl, arg);
7594 }
7595
7596 /* Fold function call to builtin floor, floorf or floorl with argument ARG.
7597    Return NULL_TREE if no simplification can be made.  */
7598
7599 static tree
7600 fold_builtin_floor (location_t loc, tree fndecl, tree arg)
7601 {
7602   if (!validate_arg (arg, REAL_TYPE))
7603     return NULL_TREE;
7604
7605   /* Optimize floor of constant value.  */
7606   if (TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg))
7607     {
7608       REAL_VALUE_TYPE x;
7609
7610       x = TREE_REAL_CST (arg);
7611       if (! REAL_VALUE_ISNAN (x) || ! flag_errno_math)
7612         {
7613           tree type = TREE_TYPE (TREE_TYPE (fndecl));
7614           REAL_VALUE_TYPE r;
7615
7616           real_floor (&r, TYPE_MODE (type), &x);
7617           return build_real (type, r);
7618         }
7619     }
7620
7621   /* Fold floor (x) where x is nonnegative to trunc (x).  */
7622   if (tree_expr_nonnegative_p (arg))
7623     {
7624       tree truncfn = mathfn_built_in (TREE_TYPE (arg), BUILT_IN_TRUNC);
7625       if (truncfn)
7626         return build_call_expr_loc (loc, truncfn, 1, arg);
7627     }
7628
7629   return fold_trunc_transparent_mathfn (loc, fndecl, arg);
7630 }
7631
7632 /* Fold function call to builtin ceil, ceilf or ceill with argument ARG.
7633    Return NULL_TREE if no simplification can be made.  */
7634
7635 static tree
7636 fold_builtin_ceil (location_t loc, tree fndecl, tree arg)
7637 {
7638   if (!validate_arg (arg, REAL_TYPE))
7639     return NULL_TREE;
7640
7641   /* Optimize ceil of constant value.  */
7642   if (TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg))
7643     {
7644       REAL_VALUE_TYPE x;
7645
7646       x = TREE_REAL_CST (arg);
7647       if (! REAL_VALUE_ISNAN (x) || ! flag_errno_math)
7648         {
7649           tree type = TREE_TYPE (TREE_TYPE (fndecl));
7650           REAL_VALUE_TYPE r;
7651
7652           real_ceil (&r, TYPE_MODE (type), &x);
7653           return build_real (type, r);
7654         }
7655     }
7656
7657   return fold_trunc_transparent_mathfn (loc, fndecl, arg);
7658 }
7659
7660 /* Fold function call to builtin round, roundf or roundl with argument ARG.
7661    Return NULL_TREE if no simplification can be made.  */
7662
7663 static tree
7664 fold_builtin_round (location_t loc, tree fndecl, tree arg)
7665 {
7666   if (!validate_arg (arg, REAL_TYPE))
7667     return NULL_TREE;
7668
7669   /* Optimize round of constant value.  */
7670   if (TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg))
7671     {
7672       REAL_VALUE_TYPE x;
7673
7674       x = TREE_REAL_CST (arg);
7675       if (! REAL_VALUE_ISNAN (x) || ! flag_errno_math)
7676         {
7677           tree type = TREE_TYPE (TREE_TYPE (fndecl));
7678           REAL_VALUE_TYPE r;
7679
7680           real_round (&r, TYPE_MODE (type), &x);
7681           return build_real (type, r);
7682         }
7683     }
7684
7685   return fold_trunc_transparent_mathfn (loc, fndecl, arg);
7686 }
7687
7688 /* Fold function call to builtin lround, lroundf or lroundl (or the
7689    corresponding long long versions) and other rounding functions.  ARG
7690    is the argument to the call.  Return NULL_TREE if no simplification
7691    can be made.  */
7692
7693 static tree
7694 fold_builtin_int_roundingfn (location_t loc, tree fndecl, tree arg)
7695 {
7696   if (!validate_arg (arg, REAL_TYPE))
7697     return NULL_TREE;
7698
7699   /* Optimize lround of constant value.  */
7700   if (TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg))
7701     {
7702       const REAL_VALUE_TYPE x = TREE_REAL_CST (arg);
7703
7704       if (real_isfinite (&x))
7705         {
7706           tree itype = TREE_TYPE (TREE_TYPE (fndecl));
7707           tree ftype = TREE_TYPE (arg);
7708           double_int val;
7709           REAL_VALUE_TYPE r;
7710
7711           switch (DECL_FUNCTION_CODE (fndecl))
7712             {
7713             CASE_FLT_FN (BUILT_IN_LFLOOR):
7714             CASE_FLT_FN (BUILT_IN_LLFLOOR):
7715               real_floor (&r, TYPE_MODE (ftype), &x);
7716               break;
7717
7718             CASE_FLT_FN (BUILT_IN_LCEIL):
7719             CASE_FLT_FN (BUILT_IN_LLCEIL):
7720               real_ceil (&r, TYPE_MODE (ftype), &x);
7721               break;
7722
7723             CASE_FLT_FN (BUILT_IN_LROUND):
7724             CASE_FLT_FN (BUILT_IN_LLROUND):
7725               real_round (&r, TYPE_MODE (ftype), &x);
7726               break;
7727
7728             default:
7729               gcc_unreachable ();
7730             }
7731
7732           real_to_integer2 ((HOST_WIDE_INT *)&val.low, &val.high, &r);
7733           if (double_int_fits_to_tree_p (itype, val))
7734             return double_int_to_tree (itype, val);
7735         }
7736     }
7737
7738   switch (DECL_FUNCTION_CODE (fndecl))
7739     {
7740     CASE_FLT_FN (BUILT_IN_LFLOOR):
7741     CASE_FLT_FN (BUILT_IN_LLFLOOR):
7742       /* Fold lfloor (x) where x is nonnegative to FIX_TRUNC (x).  */
7743       if (tree_expr_nonnegative_p (arg))
7744         return fold_build1_loc (loc, FIX_TRUNC_EXPR,
7745                             TREE_TYPE (TREE_TYPE (fndecl)), arg);
7746       break;
7747     default:;
7748     }
7749
7750   return fold_fixed_mathfn (loc, fndecl, arg);
7751 }
7752
7753 /* Fold function call to builtin ffs, clz, ctz, popcount and parity
7754    and their long and long long variants (i.e. ffsl and ffsll).  ARG is
7755    the argument to the call.  Return NULL_TREE if no simplification can
7756    be made.  */
7757
7758 static tree
7759 fold_builtin_bitop (tree fndecl, tree arg)
7760 {
7761   if (!validate_arg (arg, INTEGER_TYPE))
7762     return NULL_TREE;
7763
7764   /* Optimize for constant argument.  */
7765   if (TREE_CODE (arg) == INTEGER_CST && !TREE_OVERFLOW (arg))
7766     {
7767       HOST_WIDE_INT hi, width, result;
7768       unsigned HOST_WIDE_INT lo;
7769       tree type;
7770
7771       type = TREE_TYPE (arg);
7772       width = TYPE_PRECISION (type);
7773       lo = TREE_INT_CST_LOW (arg);
7774
7775       /* Clear all the bits that are beyond the type's precision.  */
7776       if (width > HOST_BITS_PER_WIDE_INT)
7777         {
7778           hi = TREE_INT_CST_HIGH (arg);
7779           if (width < 2 * HOST_BITS_PER_WIDE_INT)
7780             hi &= ~((HOST_WIDE_INT) (-1) >> (width - HOST_BITS_PER_WIDE_INT));
7781         }
7782       else
7783         {
7784           hi = 0;
7785           if (width < HOST_BITS_PER_WIDE_INT)
7786             lo &= ~((unsigned HOST_WIDE_INT) (-1) << width);
7787         }
7788
7789       switch (DECL_FUNCTION_CODE (fndecl))
7790         {
7791         CASE_INT_FN (BUILT_IN_FFS):
7792           if (lo != 0)
7793             result = ffs_hwi (lo);
7794           else if (hi != 0)
7795             result = HOST_BITS_PER_WIDE_INT + ffs_hwi (hi);
7796           else
7797             result = 0;
7798           break;
7799
7800         CASE_INT_FN (BUILT_IN_CLZ):
7801           if (hi != 0)
7802             result = width - floor_log2 (hi) - 1 - HOST_BITS_PER_WIDE_INT;
7803           else if (lo != 0)
7804             result = width - floor_log2 (lo) - 1;
7805           else if (! CLZ_DEFINED_VALUE_AT_ZERO (TYPE_MODE (type), result))
7806             result = width;
7807           break;
7808
7809         CASE_INT_FN (BUILT_IN_CTZ):
7810           if (lo != 0)
7811             result = ctz_hwi (lo);
7812           else if (hi != 0)
7813             result = HOST_BITS_PER_WIDE_INT + ctz_hwi (hi);
7814           else if (! CTZ_DEFINED_VALUE_AT_ZERO (TYPE_MODE (type), result))
7815             result = width;
7816           break;
7817
7818         CASE_INT_FN (BUILT_IN_POPCOUNT):
7819           result = 0;
7820           while (lo)
7821             result++, lo &= lo - 1;
7822           while (hi)
7823             result++, hi &= (unsigned HOST_WIDE_INT) hi - 1;
7824           break;
7825
7826         CASE_INT_FN (BUILT_IN_PARITY):
7827           result = 0;
7828           while (lo)
7829             result++, lo &= lo - 1;
7830           while (hi)
7831             result++, hi &= (unsigned HOST_WIDE_INT) hi - 1;
7832           result &= 1;
7833           break;
7834
7835         default:
7836           gcc_unreachable ();
7837         }
7838
7839       return build_int_cst (TREE_TYPE (TREE_TYPE (fndecl)), result);
7840     }
7841
7842   return NULL_TREE;
7843 }
7844
7845 /* Fold function call to builtin_bswap and the long and long long
7846    variants.  Return NULL_TREE if no simplification can be made.  */
7847 static tree
7848 fold_builtin_bswap (tree fndecl, tree arg)
7849 {
7850   if (! validate_arg (arg, INTEGER_TYPE))
7851     return NULL_TREE;
7852
7853   /* Optimize constant value.  */
7854   if (TREE_CODE (arg) == INTEGER_CST && !TREE_OVERFLOW (arg))
7855     {
7856       HOST_WIDE_INT hi, width, r_hi = 0;
7857       unsigned HOST_WIDE_INT lo, r_lo = 0;
7858       tree type;
7859
7860       type = TREE_TYPE (arg);
7861       width = TYPE_PRECISION (type);
7862       lo = TREE_INT_CST_LOW (arg);
7863       hi = TREE_INT_CST_HIGH (arg);
7864
7865       switch (DECL_FUNCTION_CODE (fndecl))
7866         {
7867           case BUILT_IN_BSWAP32:
7868           case BUILT_IN_BSWAP64:
7869             {
7870               int s;
7871
7872               for (s = 0; s < width; s += 8)
7873                 {
7874                   int d = width - s - 8;
7875                   unsigned HOST_WIDE_INT byte;
7876
7877                   if (s < HOST_BITS_PER_WIDE_INT)
7878                     byte = (lo >> s) & 0xff;
7879                   else
7880                     byte = (hi >> (s - HOST_BITS_PER_WIDE_INT)) & 0xff;
7881
7882                   if (d < HOST_BITS_PER_WIDE_INT)
7883                     r_lo |= byte << d;
7884                   else
7885                     r_hi |= byte << (d - HOST_BITS_PER_WIDE_INT);
7886                 }
7887             }
7888
7889             break;
7890
7891         default:
7892           gcc_unreachable ();
7893         }
7894
7895       if (width < HOST_BITS_PER_WIDE_INT)
7896         return build_int_cst (TREE_TYPE (TREE_TYPE (fndecl)), r_lo);
7897       else
7898         return build_int_cst_wide (TREE_TYPE (TREE_TYPE (fndecl)), r_lo, r_hi);
7899     }
7900
7901   return NULL_TREE;
7902 }
7903
7904 /* A subroutine of fold_builtin to fold the various logarithmic
7905    functions.  Return NULL_TREE if no simplification can me made.
7906    FUNC is the corresponding MPFR logarithm function.  */
7907
7908 static tree
7909 fold_builtin_logarithm (location_t loc, tree fndecl, tree arg,
7910                         int (*func)(mpfr_ptr, mpfr_srcptr, mp_rnd_t))
7911 {
7912   if (validate_arg (arg, REAL_TYPE))
7913     {
7914       tree type = TREE_TYPE (TREE_TYPE (fndecl));
7915       tree res;
7916       const enum built_in_function fcode = builtin_mathfn_code (arg);
7917
7918       /* Calculate the result when the argument is a constant.  */
7919       if ((res = do_mpfr_arg1 (arg, type, func, &dconst0, NULL, false)))
7920         return res;
7921
7922       /* Special case, optimize logN(expN(x)) = x.  */
7923       if (flag_unsafe_math_optimizations
7924           && ((func == mpfr_log
7925                && (fcode == BUILT_IN_EXP
7926                    || fcode == BUILT_IN_EXPF
7927                    || fcode == BUILT_IN_EXPL))
7928               || (func == mpfr_log2
7929                   && (fcode == BUILT_IN_EXP2
7930                       || fcode == BUILT_IN_EXP2F
7931                       || fcode == BUILT_IN_EXP2L))
7932               || (func == mpfr_log10 && (BUILTIN_EXP10_P (fcode)))))
7933         return fold_convert_loc (loc, type, CALL_EXPR_ARG (arg, 0));
7934
7935       /* Optimize logN(func()) for various exponential functions.  We
7936          want to determine the value "x" and the power "exponent" in
7937          order to transform logN(x**exponent) into exponent*logN(x).  */
7938       if (flag_unsafe_math_optimizations)
7939         {
7940           tree exponent = 0, x = 0;
7941
7942           switch (fcode)
7943           {
7944           CASE_FLT_FN (BUILT_IN_EXP):
7945             /* Prepare to do logN(exp(exponent) -> exponent*logN(e).  */
7946             x = build_real (type, real_value_truncate (TYPE_MODE (type),
7947                                                        dconst_e ()));
7948             exponent = CALL_EXPR_ARG (arg, 0);
7949             break;
7950           CASE_FLT_FN (BUILT_IN_EXP2):
7951             /* Prepare to do logN(exp2(exponent) -> exponent*logN(2).  */
7952             x = build_real (type, dconst2);
7953             exponent = CALL_EXPR_ARG (arg, 0);
7954             break;
7955           CASE_FLT_FN (BUILT_IN_EXP10):
7956           CASE_FLT_FN (BUILT_IN_POW10):
7957             /* Prepare to do logN(exp10(exponent) -> exponent*logN(10).  */
7958             {
7959               REAL_VALUE_TYPE dconst10;
7960               real_from_integer (&dconst10, VOIDmode, 10, 0, 0);
7961               x = build_real (type, dconst10);
7962             }
7963             exponent = CALL_EXPR_ARG (arg, 0);
7964             break;
7965           CASE_FLT_FN (BUILT_IN_SQRT):
7966             /* Prepare to do logN(sqrt(x) -> 0.5*logN(x).  */
7967             x = CALL_EXPR_ARG (arg, 0);
7968             exponent = build_real (type, dconsthalf);
7969             break;
7970           CASE_FLT_FN (BUILT_IN_CBRT):
7971             /* Prepare to do logN(cbrt(x) -> (1/3)*logN(x).  */
7972             x = CALL_EXPR_ARG (arg, 0);
7973             exponent = build_real (type, real_value_truncate (TYPE_MODE (type),
7974                                                               dconst_third ()));
7975             break;
7976           CASE_FLT_FN (BUILT_IN_POW):
7977             /* Prepare to do logN(pow(x,exponent) -> exponent*logN(x).  */
7978             x = CALL_EXPR_ARG (arg, 0);
7979             exponent = CALL_EXPR_ARG (arg, 1);
7980             break;
7981           default:
7982             break;
7983           }
7984
7985           /* Now perform the optimization.  */
7986           if (x && exponent)
7987             {
7988               tree logfn = build_call_expr_loc (loc, fndecl, 1, x);
7989               return fold_build2_loc (loc, MULT_EXPR, type, exponent, logfn);
7990             }
7991         }
7992     }
7993
7994   return NULL_TREE;
7995 }
7996
7997 /* Fold a builtin function call to hypot, hypotf, or hypotl.  Return
7998    NULL_TREE if no simplification can be made.  */
7999
8000 static tree
8001 fold_builtin_hypot (location_t loc, tree fndecl,
8002                     tree arg0, tree arg1, tree type)
8003 {
8004   tree res, narg0, narg1;
8005
8006   if (!validate_arg (arg0, REAL_TYPE)
8007       || !validate_arg (arg1, REAL_TYPE))
8008     return NULL_TREE;
8009
8010   /* Calculate the result when the argument is a constant.  */
8011   if ((res = do_mpfr_arg2 (arg0, arg1, type, mpfr_hypot)))
8012     return res;
8013
8014   /* If either argument to hypot has a negate or abs, strip that off.
8015      E.g. hypot(-x,fabs(y)) -> hypot(x,y).  */
8016   narg0 = fold_strip_sign_ops (arg0);
8017   narg1 = fold_strip_sign_ops (arg1);
8018   if (narg0 || narg1)
8019     {
8020       return build_call_expr_loc (loc, fndecl, 2, narg0 ? narg0 : arg0,
8021                               narg1 ? narg1 : arg1);
8022     }
8023
8024   /* If either argument is zero, hypot is fabs of the other.  */
8025   if (real_zerop (arg0))
8026     return fold_build1_loc (loc, ABS_EXPR, type, arg1);
8027   else if (real_zerop (arg1))
8028     return fold_build1_loc (loc, ABS_EXPR, type, arg0);
8029
8030   /* hypot(x,x) -> fabs(x)*sqrt(2).  */
8031   if (flag_unsafe_math_optimizations
8032       && operand_equal_p (arg0, arg1, OEP_PURE_SAME))
8033     {
8034       const REAL_VALUE_TYPE sqrt2_trunc
8035         = real_value_truncate (TYPE_MODE (type), dconst_sqrt2 ());
8036       return fold_build2_loc (loc, MULT_EXPR, type,
8037                           fold_build1_loc (loc, ABS_EXPR, type, arg0),
8038                           build_real (type, sqrt2_trunc));
8039     }
8040
8041   return NULL_TREE;
8042 }
8043
8044
8045 /* Fold a builtin function call to pow, powf, or powl.  Return
8046    NULL_TREE if no simplification can be made.  */
8047 static tree
8048 fold_builtin_pow (location_t loc, tree fndecl, tree arg0, tree arg1, tree type)
8049 {
8050   tree res;
8051
8052   if (!validate_arg (arg0, REAL_TYPE)
8053        || !validate_arg (arg1, REAL_TYPE))
8054     return NULL_TREE;
8055
8056   /* Calculate the result when the argument is a constant.  */
8057   if ((res = do_mpfr_arg2 (arg0, arg1, type, mpfr_pow)))
8058     return res;
8059
8060   /* Optimize pow(1.0,y) = 1.0.  */
8061   if (real_onep (arg0))
8062     return omit_one_operand_loc (loc, type, build_real (type, dconst1), arg1);
8063
8064   if (TREE_CODE (arg1) == REAL_CST
8065       && !TREE_OVERFLOW (arg1))
8066     {
8067       REAL_VALUE_TYPE cint;
8068       REAL_VALUE_TYPE c;
8069       HOST_WIDE_INT n;
8070
8071       c = TREE_REAL_CST (arg1);
8072
8073       /* Optimize pow(x,0.0) = 1.0.  */
8074       if (REAL_VALUES_EQUAL (c, dconst0))
8075         return omit_one_operand_loc (loc, type, build_real (type, dconst1),
8076                                  arg0);
8077
8078       /* Optimize pow(x,1.0) = x.  */
8079       if (REAL_VALUES_EQUAL (c, dconst1))
8080         return arg0;
8081
8082       /* Optimize pow(x,-1.0) = 1.0/x.  */
8083       if (REAL_VALUES_EQUAL (c, dconstm1))
8084         return fold_build2_loc (loc, RDIV_EXPR, type,
8085                             build_real (type, dconst1), arg0);
8086
8087       /* Optimize pow(x,0.5) = sqrt(x).  */
8088       if (flag_unsafe_math_optimizations
8089           && REAL_VALUES_EQUAL (c, dconsthalf))
8090         {
8091           tree sqrtfn = mathfn_built_in (type, BUILT_IN_SQRT);
8092
8093           if (sqrtfn != NULL_TREE)
8094             return build_call_expr_loc (loc, sqrtfn, 1, arg0);
8095         }
8096
8097       /* Optimize pow(x,1.0/3.0) = cbrt(x).  */
8098       if (flag_unsafe_math_optimizations)
8099         {
8100           const REAL_VALUE_TYPE dconstroot
8101             = real_value_truncate (TYPE_MODE (type), dconst_third ());
8102
8103           if (REAL_VALUES_EQUAL (c, dconstroot))
8104             {
8105               tree cbrtfn = mathfn_built_in (type, BUILT_IN_CBRT);
8106               if (cbrtfn != NULL_TREE)
8107                 return build_call_expr_loc (loc, cbrtfn, 1, arg0);
8108             }
8109         }
8110
8111       /* Check for an integer exponent.  */
8112       n = real_to_integer (&c);
8113       real_from_integer (&cint, VOIDmode, n, n < 0 ? -1 : 0, 0);
8114       if (real_identical (&c, &cint))
8115         {
8116           /* Attempt to evaluate pow at compile-time, unless this should
8117              raise an exception.  */
8118           if (TREE_CODE (arg0) == REAL_CST
8119               && !TREE_OVERFLOW (arg0)
8120               && (n > 0
8121                   || (!flag_trapping_math && !flag_errno_math)
8122                   || !REAL_VALUES_EQUAL (TREE_REAL_CST (arg0), dconst0)))
8123             {
8124               REAL_VALUE_TYPE x;
8125               bool inexact;
8126
8127               x = TREE_REAL_CST (arg0);
8128               inexact = real_powi (&x, TYPE_MODE (type), &x, n);
8129               if (flag_unsafe_math_optimizations || !inexact)
8130                 return build_real (type, x);
8131             }
8132
8133           /* Strip sign ops from even integer powers.  */
8134           if ((n & 1) == 0 && flag_unsafe_math_optimizations)
8135             {
8136               tree narg0 = fold_strip_sign_ops (arg0);
8137               if (narg0)
8138                 return build_call_expr_loc (loc, fndecl, 2, narg0, arg1);
8139             }
8140         }
8141     }
8142
8143   if (flag_unsafe_math_optimizations)
8144     {
8145       const enum built_in_function fcode = builtin_mathfn_code (arg0);
8146
8147       /* Optimize pow(expN(x),y) = expN(x*y).  */
8148       if (BUILTIN_EXPONENT_P (fcode))
8149         {
8150           tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
8151           tree arg = CALL_EXPR_ARG (arg0, 0);
8152           arg = fold_build2_loc (loc, MULT_EXPR, type, arg, arg1);
8153           return build_call_expr_loc (loc, expfn, 1, arg);
8154         }
8155
8156       /* Optimize pow(sqrt(x),y) = pow(x,y*0.5).  */
8157       if (BUILTIN_SQRT_P (fcode))
8158         {
8159           tree narg0 = CALL_EXPR_ARG (arg0, 0);
8160           tree narg1 = fold_build2_loc (loc, MULT_EXPR, type, arg1,
8161                                     build_real (type, dconsthalf));
8162           return build_call_expr_loc (loc, fndecl, 2, narg0, narg1);
8163         }
8164
8165       /* Optimize pow(cbrt(x),y) = pow(x,y/3) iff x is nonnegative.  */
8166       if (BUILTIN_CBRT_P (fcode))
8167         {
8168           tree arg = CALL_EXPR_ARG (arg0, 0);
8169           if (tree_expr_nonnegative_p (arg))
8170             {
8171               const REAL_VALUE_TYPE dconstroot
8172                 = real_value_truncate (TYPE_MODE (type), dconst_third ());
8173               tree narg1 = fold_build2_loc (loc, MULT_EXPR, type, arg1,
8174                                         build_real (type, dconstroot));
8175               return build_call_expr_loc (loc, fndecl, 2, arg, narg1);
8176             }
8177         }
8178
8179       /* Optimize pow(pow(x,y),z) = pow(x,y*z) iff x is nonnegative.  */
8180       if (fcode == BUILT_IN_POW
8181           || fcode == BUILT_IN_POWF
8182           || fcode == BUILT_IN_POWL)
8183         {
8184           tree arg00 = CALL_EXPR_ARG (arg0, 0);
8185           if (tree_expr_nonnegative_p (arg00))
8186             {
8187               tree arg01 = CALL_EXPR_ARG (arg0, 1);
8188               tree narg1 = fold_build2_loc (loc, MULT_EXPR, type, arg01, arg1);
8189               return build_call_expr_loc (loc, fndecl, 2, arg00, narg1);
8190             }
8191         }
8192     }
8193
8194   return NULL_TREE;
8195 }
8196
8197 /* Fold a builtin function call to powi, powif, or powil with argument ARG.
8198    Return NULL_TREE if no simplification can be made.  */
8199 static tree
8200 fold_builtin_powi (location_t loc, tree fndecl ATTRIBUTE_UNUSED,
8201                    tree arg0, tree arg1, tree type)
8202 {
8203   if (!validate_arg (arg0, REAL_TYPE)
8204       || !validate_arg (arg1, INTEGER_TYPE))
8205     return NULL_TREE;
8206
8207   /* Optimize pow(1.0,y) = 1.0.  */
8208   if (real_onep (arg0))
8209     return omit_one_operand_loc (loc, type, build_real (type, dconst1), arg1);
8210
8211   if (host_integerp (arg1, 0))
8212     {
8213       HOST_WIDE_INT c = TREE_INT_CST_LOW (arg1);
8214
8215       /* Evaluate powi at compile-time.  */
8216       if (TREE_CODE (arg0) == REAL_CST
8217           && !TREE_OVERFLOW (arg0))
8218         {
8219           REAL_VALUE_TYPE x;
8220           x = TREE_REAL_CST (arg0);
8221           real_powi (&x, TYPE_MODE (type), &x, c);
8222           return build_real (type, x);
8223         }
8224
8225       /* Optimize pow(x,0) = 1.0.  */
8226       if (c == 0)
8227         return omit_one_operand_loc (loc, type, build_real (type, dconst1),
8228                                  arg0);
8229
8230       /* Optimize pow(x,1) = x.  */
8231       if (c == 1)
8232         return arg0;
8233
8234       /* Optimize pow(x,-1) = 1.0/x.  */
8235       if (c == -1)
8236         return fold_build2_loc (loc, RDIV_EXPR, type,
8237                            build_real (type, dconst1), arg0);
8238     }
8239
8240   return NULL_TREE;
8241 }
8242
8243 /* A subroutine of fold_builtin to fold the various exponent
8244    functions.  Return NULL_TREE if no simplification can be made.
8245    FUNC is the corresponding MPFR exponent function.  */
8246
8247 static tree
8248 fold_builtin_exponent (location_t loc, tree fndecl, tree arg,
8249                        int (*func)(mpfr_ptr, mpfr_srcptr, mp_rnd_t))
8250 {
8251   if (validate_arg (arg, REAL_TYPE))
8252     {
8253       tree type = TREE_TYPE (TREE_TYPE (fndecl));
8254       tree res;
8255
8256       /* Calculate the result when the argument is a constant.  */
8257       if ((res = do_mpfr_arg1 (arg, type, func, NULL, NULL, 0)))
8258         return res;
8259
8260       /* Optimize expN(logN(x)) = x.  */
8261       if (flag_unsafe_math_optimizations)
8262         {
8263           const enum built_in_function fcode = builtin_mathfn_code (arg);
8264
8265           if ((func == mpfr_exp
8266                && (fcode == BUILT_IN_LOG
8267                    || fcode == BUILT_IN_LOGF
8268                    || fcode == BUILT_IN_LOGL))
8269               || (func == mpfr_exp2
8270                   && (fcode == BUILT_IN_LOG2
8271                       || fcode == BUILT_IN_LOG2F
8272                       || fcode == BUILT_IN_LOG2L))
8273               || (func == mpfr_exp10
8274                   && (fcode == BUILT_IN_LOG10
8275                       || fcode == BUILT_IN_LOG10F
8276                       || fcode == BUILT_IN_LOG10L)))
8277             return fold_convert_loc (loc, type, CALL_EXPR_ARG (arg, 0));
8278         }
8279     }
8280
8281   return NULL_TREE;
8282 }
8283
8284 /* Return true if VAR is a VAR_DECL or a component thereof.  */
8285
8286 static bool
8287 var_decl_component_p (tree var)
8288 {
8289   tree inner = var;
8290   while (handled_component_p (inner))
8291     inner = TREE_OPERAND (inner, 0);
8292   return SSA_VAR_P (inner);
8293 }
8294
8295 /* Fold function call to builtin memset.  Return
8296    NULL_TREE if no simplification can be made.  */
8297
8298 static tree
8299 fold_builtin_memset (location_t loc, tree dest, tree c, tree len,
8300                      tree type, bool ignore)
8301 {
8302   tree var, ret, etype;
8303   unsigned HOST_WIDE_INT length, cval;
8304
8305   if (! validate_arg (dest, POINTER_TYPE)
8306       || ! validate_arg (c, INTEGER_TYPE)
8307       || ! validate_arg (len, INTEGER_TYPE))
8308     return NULL_TREE;
8309
8310   if (! host_integerp (len, 1))
8311     return NULL_TREE;
8312
8313   /* If the LEN parameter is zero, return DEST.  */
8314   if (integer_zerop (len))
8315     return omit_one_operand_loc (loc, type, dest, c);
8316
8317   if (TREE_CODE (c) != INTEGER_CST || TREE_SIDE_EFFECTS (dest))
8318     return NULL_TREE;
8319
8320   var = dest;
8321   STRIP_NOPS (var);
8322   if (TREE_CODE (var) != ADDR_EXPR)
8323     return NULL_TREE;
8324
8325   var = TREE_OPERAND (var, 0);
8326   if (TREE_THIS_VOLATILE (var))
8327     return NULL_TREE;
8328
8329   etype = TREE_TYPE (var);
8330   if (TREE_CODE (etype) == ARRAY_TYPE)
8331     etype = TREE_TYPE (etype);
8332
8333   if (!INTEGRAL_TYPE_P (etype)
8334       && !POINTER_TYPE_P (etype))
8335     return NULL_TREE;
8336
8337   if (! var_decl_component_p (var))
8338     return NULL_TREE;
8339
8340   length = tree_low_cst (len, 1);
8341   if (GET_MODE_SIZE (TYPE_MODE (etype)) != length
8342       || get_pointer_alignment (dest, BIGGEST_ALIGNMENT) / BITS_PER_UNIT
8343          < length)
8344     return NULL_TREE;
8345
8346   if (length > HOST_BITS_PER_WIDE_INT / BITS_PER_UNIT)
8347     return NULL_TREE;
8348
8349   if (integer_zerop (c))
8350     cval = 0;
8351   else
8352     {
8353       if (CHAR_BIT != 8 || BITS_PER_UNIT != 8 || HOST_BITS_PER_WIDE_INT > 64)
8354         return NULL_TREE;
8355
8356       cval = TREE_INT_CST_LOW (c);
8357       cval &= 0xff;
8358       cval |= cval << 8;
8359       cval |= cval << 16;
8360       cval |= (cval << 31) << 1;
8361     }
8362
8363   ret = build_int_cst_type (etype, cval);
8364   var = build_fold_indirect_ref_loc (loc,
8365                                  fold_convert_loc (loc,
8366                                                    build_pointer_type (etype),
8367                                                    dest));
8368   ret = build2 (MODIFY_EXPR, etype, var, ret);
8369   if (ignore)
8370     return ret;
8371
8372   return omit_one_operand_loc (loc, type, dest, ret);
8373 }
8374
8375 /* Fold function call to builtin memset.  Return
8376    NULL_TREE if no simplification can be made.  */
8377
8378 static tree
8379 fold_builtin_bzero (location_t loc, tree dest, tree size, bool ignore)
8380 {
8381   if (! validate_arg (dest, POINTER_TYPE)
8382       || ! validate_arg (size, INTEGER_TYPE))
8383     return NULL_TREE;
8384
8385   if (!ignore)
8386     return NULL_TREE;
8387
8388   /* New argument list transforming bzero(ptr x, int y) to
8389      memset(ptr x, int 0, size_t y).   This is done this way
8390      so that if it isn't expanded inline, we fallback to
8391      calling bzero instead of memset.  */
8392
8393   return fold_builtin_memset (loc, dest, integer_zero_node,
8394                               fold_convert_loc (loc, sizetype, size),
8395                               void_type_node, ignore);
8396 }
8397
8398 /* Fold function call to builtin mem{{,p}cpy,move}.  Return
8399    NULL_TREE if no simplification can be made.
8400    If ENDP is 0, return DEST (like memcpy).
8401    If ENDP is 1, return DEST+LEN (like mempcpy).
8402    If ENDP is 2, return DEST+LEN-1 (like stpcpy).
8403    If ENDP is 3, return DEST, additionally *SRC and *DEST may overlap
8404    (memmove).   */
8405
8406 static tree
8407 fold_builtin_memory_op (location_t loc, tree dest, tree src,
8408                         tree len, tree type, bool ignore, int endp)
8409 {
8410   tree destvar, srcvar, expr;
8411
8412   if (! validate_arg (dest, POINTER_TYPE)
8413       || ! validate_arg (src, POINTER_TYPE)
8414       || ! validate_arg (len, INTEGER_TYPE))
8415     return NULL_TREE;
8416
8417   /* If the LEN parameter is zero, return DEST.  */
8418   if (integer_zerop (len))
8419     return omit_one_operand_loc (loc, type, dest, src);
8420
8421   /* If SRC and DEST are the same (and not volatile), return
8422      DEST{,+LEN,+LEN-1}.  */
8423   if (operand_equal_p (src, dest, 0))
8424     expr = len;
8425   else
8426     {
8427       tree srctype, desttype;
8428       unsigned int src_align, dest_align;
8429       tree off0;
8430
8431       if (endp == 3)
8432         {
8433           src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
8434           dest_align = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
8435
8436           /* Both DEST and SRC must be pointer types.
8437              ??? This is what old code did.  Is the testing for pointer types
8438              really mandatory?
8439
8440              If either SRC is readonly or length is 1, we can use memcpy.  */
8441           if (!dest_align || !src_align)
8442             return NULL_TREE;
8443           if (readonly_data_expr (src)
8444               || (host_integerp (len, 1)
8445                   && (MIN (src_align, dest_align) / BITS_PER_UNIT
8446                       >= (unsigned HOST_WIDE_INT) tree_low_cst (len, 1))))
8447             {
8448               tree fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
8449               if (!fn)
8450                 return NULL_TREE;
8451               return build_call_expr_loc (loc, fn, 3, dest, src, len);
8452             }
8453
8454           /* If *src and *dest can't overlap, optimize into memcpy as well.  */
8455           if (TREE_CODE (src) == ADDR_EXPR
8456               && TREE_CODE (dest) == ADDR_EXPR)
8457             {
8458               tree src_base, dest_base, fn;
8459               HOST_WIDE_INT src_offset = 0, dest_offset = 0;
8460               HOST_WIDE_INT size = -1;
8461               HOST_WIDE_INT maxsize = -1;
8462
8463               srcvar = TREE_OPERAND (src, 0);
8464               src_base = get_ref_base_and_extent (srcvar, &src_offset,
8465                                                   &size, &maxsize);
8466               destvar = TREE_OPERAND (dest, 0);
8467               dest_base = get_ref_base_and_extent (destvar, &dest_offset,
8468                                                    &size, &maxsize);
8469               if (host_integerp (len, 1))
8470                 maxsize = tree_low_cst (len, 1);
8471               else
8472                 maxsize = -1;
8473               src_offset /= BITS_PER_UNIT;
8474               dest_offset /= BITS_PER_UNIT;
8475               if (SSA_VAR_P (src_base)
8476                   && SSA_VAR_P (dest_base))
8477                 {
8478                   if (operand_equal_p (src_base, dest_base, 0)
8479                       && ranges_overlap_p (src_offset, maxsize,
8480                                            dest_offset, maxsize))
8481                     return NULL_TREE;
8482                 }
8483               else if (TREE_CODE (src_base) == MEM_REF
8484                        && TREE_CODE (dest_base) == MEM_REF)
8485                 {
8486                   double_int off;
8487                   if (! operand_equal_p (TREE_OPERAND (src_base, 0),
8488                                          TREE_OPERAND (dest_base, 0), 0))
8489                     return NULL_TREE;
8490                   off = double_int_add (mem_ref_offset (src_base),
8491                                         shwi_to_double_int (src_offset));
8492                   if (!double_int_fits_in_shwi_p (off))
8493                     return NULL_TREE;
8494                   src_offset = off.low;
8495                   off = double_int_add (mem_ref_offset (dest_base),
8496                                         shwi_to_double_int (dest_offset));
8497                   if (!double_int_fits_in_shwi_p (off))
8498                     return NULL_TREE;
8499                   dest_offset = off.low;
8500                   if (ranges_overlap_p (src_offset, maxsize,
8501                                         dest_offset, maxsize))
8502                     return NULL_TREE;
8503                 }
8504               else
8505                 return NULL_TREE;
8506
8507               fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
8508               if (!fn)
8509                 return NULL_TREE;
8510               return build_call_expr_loc (loc, fn, 3, dest, src, len);
8511             }
8512
8513           /* If the destination and source do not alias optimize into
8514              memcpy as well.  */
8515           if ((is_gimple_min_invariant (dest)
8516                || TREE_CODE (dest) == SSA_NAME)
8517               && (is_gimple_min_invariant (src)
8518                   || TREE_CODE (src) == SSA_NAME))
8519             {
8520               ao_ref destr, srcr;
8521               ao_ref_init_from_ptr_and_size (&destr, dest, len);
8522               ao_ref_init_from_ptr_and_size (&srcr, src, len);
8523               if (!refs_may_alias_p_1 (&destr, &srcr, false))
8524                 {
8525                   tree fn;
8526                   fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
8527                   if (!fn)
8528                     return NULL_TREE;
8529                   return build_call_expr_loc (loc, fn, 3, dest, src, len);
8530                 }
8531             }
8532
8533           return NULL_TREE;
8534         }
8535
8536       if (!host_integerp (len, 0))
8537         return NULL_TREE;
8538       /* FIXME:
8539          This logic lose for arguments like (type *)malloc (sizeof (type)),
8540          since we strip the casts of up to VOID return value from malloc.
8541          Perhaps we ought to inherit type from non-VOID argument here?  */
8542       STRIP_NOPS (src);
8543       STRIP_NOPS (dest);
8544       /* As we fold (void *)(p + CST) to (void *)p + CST undo this here.  */
8545       if (TREE_CODE (src) == POINTER_PLUS_EXPR)
8546         {
8547           tree tem = TREE_OPERAND (src, 0);
8548           STRIP_NOPS (tem);
8549           if (tem != TREE_OPERAND (src, 0))
8550             src = build1 (NOP_EXPR, TREE_TYPE (tem), src);
8551         }
8552       if (TREE_CODE (dest) == POINTER_PLUS_EXPR)
8553         {
8554           tree tem = TREE_OPERAND (dest, 0);
8555           STRIP_NOPS (tem);
8556           if (tem != TREE_OPERAND (dest, 0))
8557             dest = build1 (NOP_EXPR, TREE_TYPE (tem), dest);
8558         }
8559       srctype = TREE_TYPE (TREE_TYPE (src));
8560       if (srctype
8561           && TREE_CODE (srctype) == ARRAY_TYPE
8562           && !tree_int_cst_equal (TYPE_SIZE_UNIT (srctype), len))
8563         {
8564           srctype = TREE_TYPE (srctype);
8565           STRIP_NOPS (src);
8566           src = build1 (NOP_EXPR, build_pointer_type (srctype), src);
8567         }
8568       desttype = TREE_TYPE (TREE_TYPE (dest));
8569       if (desttype
8570           && TREE_CODE (desttype) == ARRAY_TYPE
8571           && !tree_int_cst_equal (TYPE_SIZE_UNIT (desttype), len))
8572         {
8573           desttype = TREE_TYPE (desttype);
8574           STRIP_NOPS (dest);
8575           dest = build1 (NOP_EXPR, build_pointer_type (desttype), dest);
8576         }
8577       if (!srctype || !desttype
8578           || TREE_ADDRESSABLE (srctype)
8579           || TREE_ADDRESSABLE (desttype)
8580           || !TYPE_SIZE_UNIT (srctype)
8581           || !TYPE_SIZE_UNIT (desttype)
8582           || TREE_CODE (TYPE_SIZE_UNIT (srctype)) != INTEGER_CST
8583           || TREE_CODE (TYPE_SIZE_UNIT (desttype)) != INTEGER_CST)
8584         return NULL_TREE;
8585
8586       src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
8587       dest_align = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
8588       if (dest_align < TYPE_ALIGN (desttype)
8589           || src_align < TYPE_ALIGN (srctype))
8590         return NULL_TREE;
8591
8592       if (!ignore)
8593         dest = builtin_save_expr (dest);
8594
8595       /* Build accesses at offset zero with a ref-all character type.  */
8596       off0 = build_int_cst (build_pointer_type_for_mode (char_type_node,
8597                                                          ptr_mode, true), 0);
8598
8599       destvar = dest;
8600       STRIP_NOPS (destvar);
8601       if (TREE_CODE (destvar) == ADDR_EXPR
8602           && var_decl_component_p (TREE_OPERAND (destvar, 0))
8603           && tree_int_cst_equal (TYPE_SIZE_UNIT (desttype), len))
8604         destvar = fold_build2 (MEM_REF, desttype, destvar, off0);
8605       else
8606         destvar = NULL_TREE;
8607
8608       srcvar = src;
8609       STRIP_NOPS (srcvar);
8610       if (TREE_CODE (srcvar) == ADDR_EXPR
8611           && var_decl_component_p (TREE_OPERAND (srcvar, 0))
8612           && tree_int_cst_equal (TYPE_SIZE_UNIT (srctype), len))
8613         {
8614           if (!destvar
8615               || src_align >= TYPE_ALIGN (desttype))
8616             srcvar = fold_build2 (MEM_REF, destvar ? desttype : srctype,
8617                                   srcvar, off0);
8618           else if (!STRICT_ALIGNMENT)
8619             {
8620               srctype = build_aligned_type (TYPE_MAIN_VARIANT (desttype),
8621                                             src_align);
8622               srcvar = fold_build2 (MEM_REF, srctype, srcvar, off0);
8623             }
8624           else
8625             srcvar = NULL_TREE;
8626         }
8627       else
8628         srcvar = NULL_TREE;
8629
8630       if (srcvar == NULL_TREE && destvar == NULL_TREE)
8631         return NULL_TREE;
8632
8633       if (srcvar == NULL_TREE)
8634         {
8635           STRIP_NOPS (src);
8636           if (src_align >= TYPE_ALIGN (desttype))
8637             srcvar = fold_build2 (MEM_REF, desttype, src, off0);
8638           else
8639             {
8640               if (STRICT_ALIGNMENT)
8641                 return NULL_TREE;
8642               srctype = build_aligned_type (TYPE_MAIN_VARIANT (desttype),
8643                                             src_align);
8644               srcvar = fold_build2 (MEM_REF, srctype, src, off0);
8645             }
8646         }
8647       else if (destvar == NULL_TREE)
8648         {
8649           STRIP_NOPS (dest);
8650           if (dest_align >= TYPE_ALIGN (srctype))
8651             destvar = fold_build2 (MEM_REF, srctype, dest, off0);
8652           else
8653             {
8654               if (STRICT_ALIGNMENT)
8655                 return NULL_TREE;
8656               desttype = build_aligned_type (TYPE_MAIN_VARIANT (srctype),
8657                                              dest_align);
8658               destvar = fold_build2 (MEM_REF, desttype, dest, off0);
8659             }
8660         }
8661
8662       expr = build2 (MODIFY_EXPR, TREE_TYPE (destvar), destvar, srcvar);
8663     }
8664
8665   if (ignore)
8666     return expr;
8667
8668   if (endp == 0 || endp == 3)
8669     return omit_one_operand_loc (loc, type, dest, expr);
8670
8671   if (expr == len)
8672     expr = NULL_TREE;
8673
8674   if (endp == 2)
8675     len = fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (len), len,
8676                        ssize_int (1));
8677
8678   len = fold_convert_loc (loc, sizetype, len);
8679   dest = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len);
8680   dest = fold_convert_loc (loc, type, dest);
8681   if (expr)
8682     dest = omit_one_operand_loc (loc, type, dest, expr);
8683   return dest;
8684 }
8685
8686 /* Fold function call to builtin strcpy with arguments DEST and SRC.
8687    If LEN is not NULL, it represents the length of the string to be
8688    copied.  Return NULL_TREE if no simplification can be made.  */
8689
8690 tree
8691 fold_builtin_strcpy (location_t loc, tree fndecl, tree dest, tree src, tree len)
8692 {
8693   tree fn;
8694
8695   if (!validate_arg (dest, POINTER_TYPE)
8696       || !validate_arg (src, POINTER_TYPE))
8697     return NULL_TREE;
8698
8699   /* If SRC and DEST are the same (and not volatile), return DEST.  */
8700   if (operand_equal_p (src, dest, 0))
8701     return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest);
8702
8703   if (optimize_function_for_size_p (cfun))
8704     return NULL_TREE;
8705
8706   fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
8707   if (!fn)
8708     return NULL_TREE;
8709
8710   if (!len)
8711     {
8712       len = c_strlen (src, 1);
8713       if (! len || TREE_SIDE_EFFECTS (len))
8714         return NULL_TREE;
8715     }
8716
8717   len = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
8718   return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)),
8719                            build_call_expr_loc (loc, fn, 3, dest, src, len));
8720 }
8721
8722 /* Fold function call to builtin stpcpy with arguments DEST and SRC.
8723    Return NULL_TREE if no simplification can be made.  */
8724
8725 static tree
8726 fold_builtin_stpcpy (location_t loc, tree fndecl, tree dest, tree src)
8727 {
8728   tree fn, len, lenp1, call, type;
8729
8730   if (!validate_arg (dest, POINTER_TYPE)
8731       || !validate_arg (src, POINTER_TYPE))
8732     return NULL_TREE;
8733
8734   len = c_strlen (src, 1);
8735   if (!len
8736       || TREE_CODE (len) != INTEGER_CST)
8737     return NULL_TREE;
8738
8739   if (optimize_function_for_size_p (cfun)
8740       /* If length is zero it's small enough.  */
8741       && !integer_zerop (len))
8742     return NULL_TREE;
8743
8744   fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
8745   if (!fn)
8746     return NULL_TREE;
8747
8748   lenp1 = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
8749   /* We use dest twice in building our expression.  Save it from
8750      multiple expansions.  */
8751   dest = builtin_save_expr (dest);
8752   call = build_call_expr_loc (loc, fn, 3, dest, src, lenp1);
8753
8754   type = TREE_TYPE (TREE_TYPE (fndecl));
8755   len = fold_convert_loc (loc, sizetype, len);
8756   dest = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len);
8757   dest = fold_convert_loc (loc, type, dest);
8758   dest = omit_one_operand_loc (loc, type, dest, call);
8759   return dest;
8760 }
8761
8762 /* Fold function call to builtin strncpy with arguments DEST, SRC, and LEN.
8763    If SLEN is not NULL, it represents the length of the source string.
8764    Return NULL_TREE if no simplification can be made.  */
8765
8766 tree
8767 fold_builtin_strncpy (location_t loc, tree fndecl, tree dest,
8768                       tree src, tree len, tree slen)
8769 {
8770   tree fn;
8771
8772   if (!validate_arg (dest, POINTER_TYPE)
8773       || !validate_arg (src, POINTER_TYPE)
8774       || !validate_arg (len, INTEGER_TYPE))
8775     return NULL_TREE;
8776
8777   /* If the LEN parameter is zero, return DEST.  */
8778   if (integer_zerop (len))
8779     return omit_one_operand_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest, src);
8780
8781   /* We can't compare slen with len as constants below if len is not a
8782      constant.  */
8783   if (len == 0 || TREE_CODE (len) != INTEGER_CST)
8784     return NULL_TREE;
8785
8786   if (!slen)
8787     slen = c_strlen (src, 1);
8788
8789   /* Now, we must be passed a constant src ptr parameter.  */
8790   if (slen == 0 || TREE_CODE (slen) != INTEGER_CST)
8791     return NULL_TREE;
8792
8793   slen = size_binop_loc (loc, PLUS_EXPR, slen, ssize_int (1));
8794
8795   /* We do not support simplification of this case, though we do
8796      support it when expanding trees into RTL.  */
8797   /* FIXME: generate a call to __builtin_memset.  */
8798   if (tree_int_cst_lt (slen, len))
8799     return NULL_TREE;
8800
8801   /* OK transform into builtin memcpy.  */
8802   fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
8803   if (!fn)
8804     return NULL_TREE;
8805   return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)),
8806                            build_call_expr_loc (loc, fn, 3, dest, src, len));
8807 }
8808
8809 /* Fold function call to builtin memchr.  ARG1, ARG2 and LEN are the
8810    arguments to the call, and TYPE is its return type.
8811    Return NULL_TREE if no simplification can be made.  */
8812
8813 static tree
8814 fold_builtin_memchr (location_t loc, tree arg1, tree arg2, tree len, tree type)
8815 {
8816   if (!validate_arg (arg1, POINTER_TYPE)
8817       || !validate_arg (arg2, INTEGER_TYPE)
8818       || !validate_arg (len, INTEGER_TYPE))
8819     return NULL_TREE;
8820   else
8821     {
8822       const char *p1;
8823
8824       if (TREE_CODE (arg2) != INTEGER_CST
8825           || !host_integerp (len, 1))
8826         return NULL_TREE;
8827
8828       p1 = c_getstr (arg1);
8829       if (p1 && compare_tree_int (len, strlen (p1) + 1) <= 0)
8830         {
8831           char c;
8832           const char *r;
8833           tree tem;
8834
8835           if (target_char_cast (arg2, &c))
8836             return NULL_TREE;
8837
8838           r = (char *) memchr (p1, c, tree_low_cst (len, 1));
8839
8840           if (r == NULL)
8841             return build_int_cst (TREE_TYPE (arg1), 0);
8842
8843           tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (arg1), arg1,
8844                              size_int (r - p1));
8845           return fold_convert_loc (loc, type, tem);
8846         }
8847       return NULL_TREE;
8848     }
8849 }
8850
8851 /* Fold function call to builtin memcmp with arguments ARG1 and ARG2.
8852    Return NULL_TREE if no simplification can be made.  */
8853
8854 static tree
8855 fold_builtin_memcmp (location_t loc, tree arg1, tree arg2, tree len)
8856 {
8857   const char *p1, *p2;
8858
8859   if (!validate_arg (arg1, POINTER_TYPE)
8860       || !validate_arg (arg2, POINTER_TYPE)
8861       || !validate_arg (len, INTEGER_TYPE))
8862     return NULL_TREE;
8863
8864   /* If the LEN parameter is zero, return zero.  */
8865   if (integer_zerop (len))
8866     return omit_two_operands_loc (loc, integer_type_node, integer_zero_node,
8867                               arg1, arg2);
8868
8869   /* If ARG1 and ARG2 are the same (and not volatile), return zero.  */
8870   if (operand_equal_p (arg1, arg2, 0))
8871     return omit_one_operand_loc (loc, integer_type_node, integer_zero_node, len);
8872
8873   p1 = c_getstr (arg1);
8874   p2 = c_getstr (arg2);
8875
8876   /* If all arguments are constant, and the value of len is not greater
8877      than the lengths of arg1 and arg2, evaluate at compile-time.  */
8878   if (host_integerp (len, 1) && p1 && p2
8879       && compare_tree_int (len, strlen (p1) + 1) <= 0
8880       && compare_tree_int (len, strlen (p2) + 1) <= 0)
8881     {
8882       const int r = memcmp (p1, p2, tree_low_cst (len, 1));
8883
8884       if (r > 0)
8885         return integer_one_node;
8886       else if (r < 0)
8887         return integer_minus_one_node;
8888       else
8889         return integer_zero_node;
8890     }
8891
8892   /* If len parameter is one, return an expression corresponding to
8893      (*(const unsigned char*)arg1 - (const unsigned char*)arg2).  */
8894   if (host_integerp (len, 1) && tree_low_cst (len, 1) == 1)
8895     {
8896       tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
8897       tree cst_uchar_ptr_node
8898         = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
8899
8900       tree ind1
8901         = fold_convert_loc (loc, integer_type_node,
8902                             build1 (INDIRECT_REF, cst_uchar_node,
8903                                     fold_convert_loc (loc,
8904                                                       cst_uchar_ptr_node,
8905                                                       arg1)));
8906       tree ind2
8907         = fold_convert_loc (loc, integer_type_node,
8908                             build1 (INDIRECT_REF, cst_uchar_node,
8909                                     fold_convert_loc (loc,
8910                                                       cst_uchar_ptr_node,
8911                                                       arg2)));
8912       return fold_build2_loc (loc, MINUS_EXPR, integer_type_node, ind1, ind2);
8913     }
8914
8915   return NULL_TREE;
8916 }
8917
8918 /* Fold function call to builtin strcmp with arguments ARG1 and ARG2.
8919    Return NULL_TREE if no simplification can be made.  */
8920
8921 static tree
8922 fold_builtin_strcmp (location_t loc, tree arg1, tree arg2)
8923 {
8924   const char *p1, *p2;
8925
8926   if (!validate_arg (arg1, POINTER_TYPE)
8927       || !validate_arg (arg2, POINTER_TYPE))
8928     return NULL_TREE;
8929
8930   /* If ARG1 and ARG2 are the same (and not volatile), return zero.  */
8931   if (operand_equal_p (arg1, arg2, 0))
8932     return integer_zero_node;
8933
8934   p1 = c_getstr (arg1);
8935   p2 = c_getstr (arg2);
8936
8937   if (p1 && p2)
8938     {
8939       const int i = strcmp (p1, p2);
8940       if (i < 0)
8941         return integer_minus_one_node;
8942       else if (i > 0)
8943         return integer_one_node;
8944       else
8945         return integer_zero_node;
8946     }
8947
8948   /* If the second arg is "", return *(const unsigned char*)arg1.  */
8949   if (p2 && *p2 == '\0')
8950     {
8951       tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
8952       tree cst_uchar_ptr_node
8953         = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
8954
8955       return fold_convert_loc (loc, integer_type_node,
8956                                build1 (INDIRECT_REF, cst_uchar_node,
8957                                        fold_convert_loc (loc,
8958                                                          cst_uchar_ptr_node,
8959                                                          arg1)));
8960     }
8961
8962   /* If the first arg is "", return -*(const unsigned char*)arg2.  */
8963   if (p1 && *p1 == '\0')
8964     {
8965       tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
8966       tree cst_uchar_ptr_node
8967         = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
8968
8969       tree temp
8970         = fold_convert_loc (loc, integer_type_node,
8971                             build1 (INDIRECT_REF, cst_uchar_node,
8972                                     fold_convert_loc (loc,
8973                                                       cst_uchar_ptr_node,
8974                                                       arg2)));
8975       return fold_build1_loc (loc, NEGATE_EXPR, integer_type_node, temp);
8976     }
8977
8978   return NULL_TREE;
8979 }
8980
8981 /* Fold function call to builtin strncmp with arguments ARG1, ARG2, and LEN.
8982    Return NULL_TREE if no simplification can be made.  */
8983
8984 static tree
8985 fold_builtin_strncmp (location_t loc, tree arg1, tree arg2, tree len)
8986 {
8987   const char *p1, *p2;
8988
8989   if (!validate_arg (arg1, POINTER_TYPE)
8990       || !validate_arg (arg2, POINTER_TYPE)
8991       || !validate_arg (len, INTEGER_TYPE))
8992     return NULL_TREE;
8993
8994   /* If the LEN parameter is zero, return zero.  */
8995   if (integer_zerop (len))
8996     return omit_two_operands_loc (loc, integer_type_node, integer_zero_node,
8997                               arg1, arg2);
8998
8999   /* If ARG1 and ARG2 are the same (and not volatile), return zero.  */
9000   if (operand_equal_p (arg1, arg2, 0))
9001     return omit_one_operand_loc (loc, integer_type_node, integer_zero_node, len);
9002
9003   p1 = c_getstr (arg1);
9004   p2 = c_getstr (arg2);
9005
9006   if (host_integerp (len, 1) && p1 && p2)
9007     {
9008       const int i = strncmp (p1, p2, tree_low_cst (len, 1));
9009       if (i > 0)
9010         return integer_one_node;
9011       else if (i < 0)
9012         return integer_minus_one_node;
9013       else
9014         return integer_zero_node;
9015     }
9016
9017   /* If the second arg is "", and the length is greater than zero,
9018      return *(const unsigned char*)arg1.  */
9019   if (p2 && *p2 == '\0'
9020       && TREE_CODE (len) == INTEGER_CST
9021       && tree_int_cst_sgn (len) == 1)
9022     {
9023       tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
9024       tree cst_uchar_ptr_node
9025         = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
9026
9027       return fold_convert_loc (loc, integer_type_node,
9028                                build1 (INDIRECT_REF, cst_uchar_node,
9029                                        fold_convert_loc (loc,
9030                                                          cst_uchar_ptr_node,
9031                                                          arg1)));
9032     }
9033
9034   /* If the first arg is "", and the length is greater than zero,
9035      return -*(const unsigned char*)arg2.  */
9036   if (p1 && *p1 == '\0'
9037       && TREE_CODE (len) == INTEGER_CST
9038       && tree_int_cst_sgn (len) == 1)
9039     {
9040       tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
9041       tree cst_uchar_ptr_node
9042         = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
9043
9044       tree temp = fold_convert_loc (loc, integer_type_node,
9045                                     build1 (INDIRECT_REF, cst_uchar_node,
9046                                             fold_convert_loc (loc,
9047                                                               cst_uchar_ptr_node,
9048                                                               arg2)));
9049       return fold_build1_loc (loc, NEGATE_EXPR, integer_type_node, temp);
9050     }
9051
9052   /* If len parameter is one, return an expression corresponding to
9053      (*(const unsigned char*)arg1 - (const unsigned char*)arg2).  */
9054   if (host_integerp (len, 1) && tree_low_cst (len, 1) == 1)
9055     {
9056       tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
9057       tree cst_uchar_ptr_node
9058         = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
9059
9060       tree ind1 = fold_convert_loc (loc, integer_type_node,
9061                                     build1 (INDIRECT_REF, cst_uchar_node,
9062                                             fold_convert_loc (loc,
9063                                                               cst_uchar_ptr_node,
9064                                                               arg1)));
9065       tree ind2 = fold_convert_loc (loc, integer_type_node,
9066                                     build1 (INDIRECT_REF, cst_uchar_node,
9067                                             fold_convert_loc (loc,
9068                                                               cst_uchar_ptr_node,
9069                                                               arg2)));
9070       return fold_build2_loc (loc, MINUS_EXPR, integer_type_node, ind1, ind2);
9071     }
9072
9073   return NULL_TREE;
9074 }
9075
9076 /* Fold function call to builtin signbit, signbitf or signbitl with argument
9077    ARG.  Return NULL_TREE if no simplification can be made.  */
9078
9079 static tree
9080 fold_builtin_signbit (location_t loc, tree arg, tree type)
9081 {
9082   if (!validate_arg (arg, REAL_TYPE))
9083     return NULL_TREE;
9084
9085   /* If ARG is a compile-time constant, determine the result.  */
9086   if (TREE_CODE (arg) == REAL_CST
9087       && !TREE_OVERFLOW (arg))
9088     {
9089       REAL_VALUE_TYPE c;
9090
9091       c = TREE_REAL_CST (arg);
9092       return (REAL_VALUE_NEGATIVE (c)
9093               ? build_one_cst (type)
9094               : build_zero_cst (type));
9095     }
9096
9097   /* If ARG is non-negative, the result is always zero.  */
9098   if (tree_expr_nonnegative_p (arg))
9099     return omit_one_operand_loc (loc, type, integer_zero_node, arg);
9100
9101   /* If ARG's format doesn't have signed zeros, return "arg < 0.0".  */
9102   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg))))
9103     return fold_build2_loc (loc, LT_EXPR, type, arg,
9104                         build_real (TREE_TYPE (arg), dconst0));
9105
9106   return NULL_TREE;
9107 }
9108
9109 /* Fold function call to builtin copysign, copysignf or copysignl with
9110    arguments ARG1 and ARG2.  Return NULL_TREE if no simplification can
9111    be made.  */
9112
9113 static tree
9114 fold_builtin_copysign (location_t loc, tree fndecl,
9115                        tree arg1, tree arg2, tree type)
9116 {
9117   tree tem;
9118
9119   if (!validate_arg (arg1, REAL_TYPE)
9120       || !validate_arg (arg2, REAL_TYPE))
9121     return NULL_TREE;
9122
9123   /* copysign(X,X) is X.  */
9124   if (operand_equal_p (arg1, arg2, 0))
9125     return fold_convert_loc (loc, type, arg1);
9126
9127   /* If ARG1 and ARG2 are compile-time constants, determine the result.  */
9128   if (TREE_CODE (arg1) == REAL_CST
9129       && TREE_CODE (arg2) == REAL_CST
9130       && !TREE_OVERFLOW (arg1)
9131       && !TREE_OVERFLOW (arg2))
9132     {
9133       REAL_VALUE_TYPE c1, c2;
9134
9135       c1 = TREE_REAL_CST (arg1);
9136       c2 = TREE_REAL_CST (arg2);
9137       /* c1.sign := c2.sign.  */
9138       real_copysign (&c1, &c2);
9139       return build_real (type, c1);
9140     }
9141
9142   /* copysign(X, Y) is fabs(X) when Y is always non-negative.
9143      Remember to evaluate Y for side-effects.  */
9144   if (tree_expr_nonnegative_p (arg2))
9145     return omit_one_operand_loc (loc, type,
9146                              fold_build1_loc (loc, ABS_EXPR, type, arg1),
9147                              arg2);
9148
9149   /* Strip sign changing operations for the first argument.  */
9150   tem = fold_strip_sign_ops (arg1);
9151   if (tem)
9152     return build_call_expr_loc (loc, fndecl, 2, tem, arg2);
9153
9154   return NULL_TREE;
9155 }
9156
9157 /* Fold a call to builtin isascii with argument ARG.  */
9158
9159 static tree
9160 fold_builtin_isascii (location_t loc, tree arg)
9161 {
9162   if (!validate_arg (arg, INTEGER_TYPE))
9163     return NULL_TREE;
9164   else
9165     {
9166       /* Transform isascii(c) -> ((c & ~0x7f) == 0).  */
9167       arg = fold_build2 (BIT_AND_EXPR, integer_type_node, arg,
9168                          build_int_cst (NULL_TREE,
9169                                         ~ (unsigned HOST_WIDE_INT) 0x7f));
9170       return fold_build2_loc (loc, EQ_EXPR, integer_type_node,
9171                           arg, integer_zero_node);
9172     }
9173 }
9174
9175 /* Fold a call to builtin toascii with argument ARG.  */
9176
9177 static tree
9178 fold_builtin_toascii (location_t loc, tree arg)
9179 {
9180   if (!validate_arg (arg, INTEGER_TYPE))
9181     return NULL_TREE;
9182
9183   /* Transform toascii(c) -> (c & 0x7f).  */
9184   return fold_build2_loc (loc, BIT_AND_EXPR, integer_type_node, arg,
9185                       build_int_cst (NULL_TREE, 0x7f));
9186 }
9187
9188 /* Fold a call to builtin isdigit with argument ARG.  */
9189
9190 static tree
9191 fold_builtin_isdigit (location_t loc, tree arg)
9192 {
9193   if (!validate_arg (arg, INTEGER_TYPE))
9194     return NULL_TREE;
9195   else
9196     {
9197       /* Transform isdigit(c) -> (unsigned)(c) - '0' <= 9.  */
9198       /* According to the C standard, isdigit is unaffected by locale.
9199          However, it definitely is affected by the target character set.  */
9200       unsigned HOST_WIDE_INT target_digit0
9201         = lang_hooks.to_target_charset ('0');
9202
9203       if (target_digit0 == 0)
9204         return NULL_TREE;
9205
9206       arg = fold_convert_loc (loc, unsigned_type_node, arg);
9207       arg = fold_build2 (MINUS_EXPR, unsigned_type_node, arg,
9208                          build_int_cst (unsigned_type_node, target_digit0));
9209       return fold_build2_loc (loc, LE_EXPR, integer_type_node, arg,
9210                           build_int_cst (unsigned_type_node, 9));
9211     }
9212 }
9213
9214 /* Fold a call to fabs, fabsf or fabsl with argument ARG.  */
9215
9216 static tree
9217 fold_builtin_fabs (location_t loc, tree arg, tree type)
9218 {
9219   if (!validate_arg (arg, REAL_TYPE))
9220     return NULL_TREE;
9221
9222   arg = fold_convert_loc (loc, type, arg);
9223   if (TREE_CODE (arg) == REAL_CST)
9224     return fold_abs_const (arg, type);
9225   return fold_build1_loc (loc, ABS_EXPR, type, arg);
9226 }
9227
9228 /* Fold a call to abs, labs, llabs or imaxabs with argument ARG.  */
9229
9230 static tree
9231 fold_builtin_abs (location_t loc, tree arg, tree type)
9232 {
9233   if (!validate_arg (arg, INTEGER_TYPE))
9234     return NULL_TREE;
9235
9236   arg = fold_convert_loc (loc, type, arg);
9237   if (TREE_CODE (arg) == INTEGER_CST)
9238     return fold_abs_const (arg, type);
9239   return fold_build1_loc (loc, ABS_EXPR, type, arg);
9240 }
9241
9242 /* Fold a fma operation with arguments ARG[012].  */
9243
9244 tree
9245 fold_fma (location_t loc ATTRIBUTE_UNUSED,
9246           tree type, tree arg0, tree arg1, tree arg2)
9247 {
9248   if (TREE_CODE (arg0) == REAL_CST
9249       && TREE_CODE (arg1) == REAL_CST
9250       && TREE_CODE (arg2) == REAL_CST)
9251     return do_mpfr_arg3 (arg0, arg1, arg2, type, mpfr_fma);
9252
9253   return NULL_TREE;
9254 }
9255
9256 /* Fold a call to fma, fmaf, or fmal with arguments ARG[012].  */
9257
9258 static tree
9259 fold_builtin_fma (location_t loc, tree arg0, tree arg1, tree arg2, tree type)
9260 {
9261   if (validate_arg (arg0, REAL_TYPE)
9262       && validate_arg(arg1, REAL_TYPE)
9263       && validate_arg(arg2, REAL_TYPE))
9264     {
9265       tree tem = fold_fma (loc, type, arg0, arg1, arg2);
9266       if (tem)
9267         return tem;
9268
9269       /* ??? Only expand to FMA_EXPR if it's directly supported.  */
9270       if (optab_handler (fma_optab, TYPE_MODE (type)) != CODE_FOR_nothing)
9271         return fold_build3_loc (loc, FMA_EXPR, type, arg0, arg1, arg2);
9272     }
9273   return NULL_TREE;
9274 }
9275
9276 /* Fold a call to builtin fmin or fmax.  */
9277
9278 static tree
9279 fold_builtin_fmin_fmax (location_t loc, tree arg0, tree arg1,
9280                         tree type, bool max)
9281 {
9282   if (validate_arg (arg0, REAL_TYPE) && validate_arg (arg1, REAL_TYPE))
9283     {
9284       /* Calculate the result when the argument is a constant.  */
9285       tree res = do_mpfr_arg2 (arg0, arg1, type, (max ? mpfr_max : mpfr_min));
9286
9287       if (res)
9288         return res;
9289
9290       /* If either argument is NaN, return the other one.  Avoid the
9291          transformation if we get (and honor) a signalling NaN.  Using
9292          omit_one_operand() ensures we create a non-lvalue.  */
9293       if (TREE_CODE (arg0) == REAL_CST
9294           && real_isnan (&TREE_REAL_CST (arg0))
9295           && (! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9296               || ! TREE_REAL_CST (arg0).signalling))
9297         return omit_one_operand_loc (loc, type, arg1, arg0);
9298       if (TREE_CODE (arg1) == REAL_CST
9299           && real_isnan (&TREE_REAL_CST (arg1))
9300           && (! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1)))
9301               || ! TREE_REAL_CST (arg1).signalling))
9302         return omit_one_operand_loc (loc, type, arg0, arg1);
9303
9304       /* Transform fmin/fmax(x,x) -> x.  */
9305       if (operand_equal_p (arg0, arg1, OEP_PURE_SAME))
9306         return omit_one_operand_loc (loc, type, arg0, arg1);
9307
9308       /* Convert fmin/fmax to MIN_EXPR/MAX_EXPR.  C99 requires these
9309          functions to return the numeric arg if the other one is NaN.
9310          These tree codes don't honor that, so only transform if
9311          -ffinite-math-only is set.  C99 doesn't require -0.0 to be
9312          handled, so we don't have to worry about it either.  */
9313       if (flag_finite_math_only)
9314         return fold_build2_loc (loc, (max ? MAX_EXPR : MIN_EXPR), type,
9315                             fold_convert_loc (loc, type, arg0),
9316                             fold_convert_loc (loc, type, arg1));
9317     }
9318   return NULL_TREE;
9319 }
9320
9321 /* Fold a call to builtin carg(a+bi) -> atan2(b,a).  */
9322
9323 static tree
9324 fold_builtin_carg (location_t loc, tree arg, tree type)
9325 {
9326   if (validate_arg (arg, COMPLEX_TYPE)
9327       && TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) == REAL_TYPE)
9328     {
9329       tree atan2_fn = mathfn_built_in (type, BUILT_IN_ATAN2);
9330
9331       if (atan2_fn)
9332         {
9333           tree new_arg = builtin_save_expr (arg);
9334           tree r_arg = fold_build1_loc (loc, REALPART_EXPR, type, new_arg);
9335           tree i_arg = fold_build1_loc (loc, IMAGPART_EXPR, type, new_arg);
9336           return build_call_expr_loc (loc, atan2_fn, 2, i_arg, r_arg);
9337         }
9338     }
9339
9340   return NULL_TREE;
9341 }
9342
9343 /* Fold a call to builtin logb/ilogb.  */
9344
9345 static tree
9346 fold_builtin_logb (location_t loc, tree arg, tree rettype)
9347 {
9348   if (! validate_arg (arg, REAL_TYPE))
9349     return NULL_TREE;
9350
9351   STRIP_NOPS (arg);
9352
9353   if (TREE_CODE (arg) == REAL_CST && ! TREE_OVERFLOW (arg))
9354     {
9355       const REAL_VALUE_TYPE *const value = TREE_REAL_CST_PTR (arg);
9356
9357       switch (value->cl)
9358       {
9359       case rvc_nan:
9360       case rvc_inf:
9361         /* If arg is Inf or NaN and we're logb, return it.  */
9362         if (TREE_CODE (rettype) == REAL_TYPE)
9363           return fold_convert_loc (loc, rettype, arg);
9364         /* Fall through... */
9365       case rvc_zero:
9366         /* Zero may set errno and/or raise an exception for logb, also
9367            for ilogb we don't know FP_ILOGB0.  */
9368         return NULL_TREE;
9369       case rvc_normal:
9370         /* For normal numbers, proceed iff radix == 2.  In GCC,
9371            normalized significands are in the range [0.5, 1.0).  We
9372            want the exponent as if they were [1.0, 2.0) so get the
9373            exponent and subtract 1.  */
9374         if (REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (arg)))->b == 2)
9375           return fold_convert_loc (loc, rettype,
9376                                    build_int_cst (NULL_TREE,
9377                                                   REAL_EXP (value)-1));
9378         break;
9379       }
9380     }
9381
9382   return NULL_TREE;
9383 }
9384
9385 /* Fold a call to builtin significand, if radix == 2.  */
9386
9387 static tree
9388 fold_builtin_significand (location_t loc, tree arg, tree rettype)
9389 {
9390   if (! validate_arg (arg, REAL_TYPE))
9391     return NULL_TREE;
9392
9393   STRIP_NOPS (arg);
9394
9395   if (TREE_CODE (arg) == REAL_CST && ! TREE_OVERFLOW (arg))
9396     {
9397       const REAL_VALUE_TYPE *const value = TREE_REAL_CST_PTR (arg);
9398
9399       switch (value->cl)
9400       {
9401       case rvc_zero:
9402       case rvc_nan:
9403       case rvc_inf:
9404         /* If arg is +-0, +-Inf or +-NaN, then return it.  */
9405         return fold_convert_loc (loc, rettype, arg);
9406       case rvc_normal:
9407         /* For normal numbers, proceed iff radix == 2.  */
9408         if (REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (arg)))->b == 2)
9409           {
9410             REAL_VALUE_TYPE result = *value;
9411             /* In GCC, normalized significands are in the range [0.5,
9412                1.0).  We want them to be [1.0, 2.0) so set the
9413                exponent to 1.  */
9414             SET_REAL_EXP (&result, 1);
9415             return build_real (rettype, result);
9416           }
9417         break;
9418       }
9419     }
9420
9421   return NULL_TREE;
9422 }
9423
9424 /* Fold a call to builtin frexp, we can assume the base is 2.  */
9425
9426 static tree
9427 fold_builtin_frexp (location_t loc, tree arg0, tree arg1, tree rettype)
9428 {
9429   if (! validate_arg (arg0, REAL_TYPE) || ! validate_arg (arg1, POINTER_TYPE))
9430     return NULL_TREE;
9431
9432   STRIP_NOPS (arg0);
9433
9434   if (!(TREE_CODE (arg0) == REAL_CST && ! TREE_OVERFLOW (arg0)))
9435     return NULL_TREE;
9436
9437   arg1 = build_fold_indirect_ref_loc (loc, arg1);
9438
9439   /* Proceed if a valid pointer type was passed in.  */
9440   if (TYPE_MAIN_VARIANT (TREE_TYPE (arg1)) == integer_type_node)
9441     {
9442       const REAL_VALUE_TYPE *const value = TREE_REAL_CST_PTR (arg0);
9443       tree frac, exp;
9444
9445       switch (value->cl)
9446       {
9447       case rvc_zero:
9448         /* For +-0, return (*exp = 0, +-0).  */
9449         exp = integer_zero_node;
9450         frac = arg0;
9451         break;
9452       case rvc_nan:
9453       case rvc_inf:
9454         /* For +-NaN or +-Inf, *exp is unspecified, return arg0.  */
9455         return omit_one_operand_loc (loc, rettype, arg0, arg1);
9456       case rvc_normal:
9457         {
9458           /* Since the frexp function always expects base 2, and in
9459              GCC normalized significands are already in the range
9460              [0.5, 1.0), we have exactly what frexp wants.  */
9461           REAL_VALUE_TYPE frac_rvt = *value;
9462           SET_REAL_EXP (&frac_rvt, 0);
9463           frac = build_real (rettype, frac_rvt);
9464           exp = build_int_cst (NULL_TREE, REAL_EXP (value));
9465         }
9466         break;
9467       default:
9468         gcc_unreachable ();
9469       }
9470
9471       /* Create the COMPOUND_EXPR (*arg1 = trunc, frac). */
9472       arg1 = fold_build2_loc (loc, MODIFY_EXPR, rettype, arg1, exp);
9473       TREE_SIDE_EFFECTS (arg1) = 1;
9474       return fold_build2_loc (loc, COMPOUND_EXPR, rettype, arg1, frac);
9475     }
9476
9477   return NULL_TREE;
9478 }
9479
9480 /* Fold a call to builtin ldexp or scalbn/scalbln.  If LDEXP is true
9481    then we can assume the base is two.  If it's false, then we have to
9482    check the mode of the TYPE parameter in certain cases.  */
9483
9484 static tree
9485 fold_builtin_load_exponent (location_t loc, tree arg0, tree arg1,
9486                             tree type, bool ldexp)
9487 {
9488   if (validate_arg (arg0, REAL_TYPE) && validate_arg (arg1, INTEGER_TYPE))
9489     {
9490       STRIP_NOPS (arg0);
9491       STRIP_NOPS (arg1);
9492
9493       /* If arg0 is 0, Inf or NaN, or if arg1 is 0, then return arg0.  */
9494       if (real_zerop (arg0) || integer_zerop (arg1)
9495           || (TREE_CODE (arg0) == REAL_CST
9496               && !real_isfinite (&TREE_REAL_CST (arg0))))
9497         return omit_one_operand_loc (loc, type, arg0, arg1);
9498
9499       /* If both arguments are constant, then try to evaluate it.  */
9500       if ((ldexp || REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2)
9501           && TREE_CODE (arg0) == REAL_CST && !TREE_OVERFLOW (arg0)
9502           && host_integerp (arg1, 0))
9503         {
9504           /* Bound the maximum adjustment to twice the range of the
9505              mode's valid exponents.  Use abs to ensure the range is
9506              positive as a sanity check.  */
9507           const long max_exp_adj = 2 *
9508             labs (REAL_MODE_FORMAT (TYPE_MODE (type))->emax
9509                  - REAL_MODE_FORMAT (TYPE_MODE (type))->emin);
9510
9511           /* Get the user-requested adjustment.  */
9512           const HOST_WIDE_INT req_exp_adj = tree_low_cst (arg1, 0);
9513
9514           /* The requested adjustment must be inside this range.  This
9515              is a preliminary cap to avoid things like overflow, we
9516              may still fail to compute the result for other reasons.  */
9517           if (-max_exp_adj < req_exp_adj && req_exp_adj < max_exp_adj)
9518             {
9519               REAL_VALUE_TYPE initial_result;
9520
9521               real_ldexp (&initial_result, &TREE_REAL_CST (arg0), req_exp_adj);
9522
9523               /* Ensure we didn't overflow.  */
9524               if (! real_isinf (&initial_result))
9525                 {
9526                   const REAL_VALUE_TYPE trunc_result
9527                     = real_value_truncate (TYPE_MODE (type), initial_result);
9528
9529                   /* Only proceed if the target mode can hold the
9530                      resulting value.  */
9531                   if (REAL_VALUES_EQUAL (initial_result, trunc_result))
9532                     return build_real (type, trunc_result);
9533                 }
9534             }
9535         }
9536     }
9537
9538   return NULL_TREE;
9539 }
9540
9541 /* Fold a call to builtin modf.  */
9542
9543 static tree
9544 fold_builtin_modf (location_t loc, tree arg0, tree arg1, tree rettype)
9545 {
9546   if (! validate_arg (arg0, REAL_TYPE) || ! validate_arg (arg1, POINTER_TYPE))
9547     return NULL_TREE;
9548
9549   STRIP_NOPS (arg0);
9550
9551   if (!(TREE_CODE (arg0) == REAL_CST && ! TREE_OVERFLOW (arg0)))
9552     return NULL_TREE;
9553
9554   arg1 = build_fold_indirect_ref_loc (loc, arg1);
9555
9556   /* Proceed if a valid pointer type was passed in.  */
9557   if (TYPE_MAIN_VARIANT (TREE_TYPE (arg1)) == TYPE_MAIN_VARIANT (rettype))
9558     {
9559       const REAL_VALUE_TYPE *const value = TREE_REAL_CST_PTR (arg0);
9560       REAL_VALUE_TYPE trunc, frac;
9561
9562       switch (value->cl)
9563       {
9564       case rvc_nan:
9565       case rvc_zero:
9566         /* For +-NaN or +-0, return (*arg1 = arg0, arg0).  */
9567         trunc = frac = *value;
9568         break;
9569       case rvc_inf:
9570         /* For +-Inf, return (*arg1 = arg0, +-0).  */
9571         frac = dconst0;
9572         frac.sign = value->sign;
9573         trunc = *value;
9574         break;
9575       case rvc_normal:
9576         /* Return (*arg1 = trunc(arg0), arg0-trunc(arg0)).  */
9577         real_trunc (&trunc, VOIDmode, value);
9578         real_arithmetic (&frac, MINUS_EXPR, value, &trunc);
9579         /* If the original number was negative and already
9580            integral, then the fractional part is -0.0.  */
9581         if (value->sign && frac.cl == rvc_zero)
9582           frac.sign = value->sign;
9583         break;
9584       }
9585
9586       /* Create the COMPOUND_EXPR (*arg1 = trunc, frac). */
9587       arg1 = fold_build2_loc (loc, MODIFY_EXPR, rettype, arg1,
9588                           build_real (rettype, trunc));
9589       TREE_SIDE_EFFECTS (arg1) = 1;
9590       return fold_build2_loc (loc, COMPOUND_EXPR, rettype, arg1,
9591                           build_real (rettype, frac));
9592     }
9593
9594   return NULL_TREE;
9595 }
9596
9597 /* Given a location LOC, an interclass builtin function decl FNDECL
9598    and its single argument ARG, return an folded expression computing
9599    the same, or NULL_TREE if we either couldn't or didn't want to fold
9600    (the latter happen if there's an RTL instruction available).  */
9601
9602 static tree
9603 fold_builtin_interclass_mathfn (location_t loc, tree fndecl, tree arg)
9604 {
9605   enum machine_mode mode;
9606
9607   if (!validate_arg (arg, REAL_TYPE))
9608     return NULL_TREE;
9609
9610   if (interclass_mathfn_icode (arg, fndecl) != CODE_FOR_nothing)
9611     return NULL_TREE;
9612
9613   mode = TYPE_MODE (TREE_TYPE (arg));
9614
9615   /* If there is no optab, try generic code.  */
9616   switch (DECL_FUNCTION_CODE (fndecl))
9617     {
9618       tree result;
9619
9620     CASE_FLT_FN (BUILT_IN_ISINF):
9621       {
9622         /* isinf(x) -> isgreater(fabs(x),DBL_MAX).  */
9623         tree const isgr_fn = built_in_decls[BUILT_IN_ISGREATER];
9624         tree const type = TREE_TYPE (arg);
9625         REAL_VALUE_TYPE r;
9626         char buf[128];
9627
9628         get_max_float (REAL_MODE_FORMAT (mode), buf, sizeof (buf));
9629         real_from_string (&r, buf);
9630         result = build_call_expr (isgr_fn, 2,
9631                                   fold_build1_loc (loc, ABS_EXPR, type, arg),
9632                                   build_real (type, r));
9633         return result;
9634       }
9635     CASE_FLT_FN (BUILT_IN_FINITE):
9636     case BUILT_IN_ISFINITE:
9637       {
9638         /* isfinite(x) -> islessequal(fabs(x),DBL_MAX).  */
9639         tree const isle_fn = built_in_decls[BUILT_IN_ISLESSEQUAL];
9640         tree const type = TREE_TYPE (arg);
9641         REAL_VALUE_TYPE r;
9642         char buf[128];
9643
9644         get_max_float (REAL_MODE_FORMAT (mode), buf, sizeof (buf));
9645         real_from_string (&r, buf);
9646         result = build_call_expr (isle_fn, 2,
9647                                   fold_build1_loc (loc, ABS_EXPR, type, arg),
9648                                   build_real (type, r));
9649         /*result = fold_build2_loc (loc, UNGT_EXPR,
9650                                   TREE_TYPE (TREE_TYPE (fndecl)),
9651                                   fold_build1_loc (loc, ABS_EXPR, type, arg),
9652                                   build_real (type, r));
9653         result = fold_build1_loc (loc, TRUTH_NOT_EXPR,
9654                                   TREE_TYPE (TREE_TYPE (fndecl)),
9655                                   result);*/
9656         return result;
9657       }
9658     case BUILT_IN_ISNORMAL:
9659       {
9660         /* isnormal(x) -> isgreaterequal(fabs(x),DBL_MIN) &
9661            islessequal(fabs(x),DBL_MAX).  */
9662         tree const isle_fn = built_in_decls[BUILT_IN_ISLESSEQUAL];
9663         tree const isge_fn = built_in_decls[BUILT_IN_ISGREATEREQUAL];
9664         tree const type = TREE_TYPE (arg);
9665         REAL_VALUE_TYPE rmax, rmin;
9666         char buf[128];
9667
9668         get_max_float (REAL_MODE_FORMAT (mode), buf, sizeof (buf));
9669         real_from_string (&rmax, buf);
9670         sprintf (buf, "0x1p%d", REAL_MODE_FORMAT (mode)->emin - 1);
9671         real_from_string (&rmin, buf);
9672         arg = builtin_save_expr (fold_build1_loc (loc, ABS_EXPR, type, arg));
9673         result = build_call_expr (isle_fn, 2, arg,
9674                                   build_real (type, rmax));
9675         result = fold_build2 (BIT_AND_EXPR, integer_type_node, result,
9676                               build_call_expr (isge_fn, 2, arg,
9677                                                build_real (type, rmin)));
9678         return result;
9679       }
9680     default:
9681       break;
9682     }
9683
9684   return NULL_TREE;
9685 }
9686
9687 /* Fold a call to __builtin_isnan(), __builtin_isinf, __builtin_finite.
9688    ARG is the argument for the call.  */
9689
9690 static tree
9691 fold_builtin_classify (location_t loc, tree fndecl, tree arg, int builtin_index)
9692 {
9693   tree type = TREE_TYPE (TREE_TYPE (fndecl));
9694   REAL_VALUE_TYPE r;
9695
9696   if (!validate_arg (arg, REAL_TYPE))
9697     return NULL_TREE;
9698
9699   switch (builtin_index)
9700     {
9701     case BUILT_IN_ISINF:
9702       if (!HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg))))
9703         return omit_one_operand_loc (loc, type, integer_zero_node, arg);
9704
9705       if (TREE_CODE (arg) == REAL_CST)
9706         {
9707           r = TREE_REAL_CST (arg);
9708           if (real_isinf (&r))
9709             return real_compare (GT_EXPR, &r, &dconst0)
9710                    ? integer_one_node : integer_minus_one_node;
9711           else
9712             return integer_zero_node;
9713         }
9714
9715       return NULL_TREE;
9716
9717     case BUILT_IN_ISINF_SIGN:
9718       {
9719         /* isinf_sign(x) -> isinf(x) ? (signbit(x) ? -1 : 1) : 0 */
9720         /* In a boolean context, GCC will fold the inner COND_EXPR to
9721            1.  So e.g. "if (isinf_sign(x))" would be folded to just
9722            "if (isinf(x) ? 1 : 0)" which becomes "if (isinf(x))". */
9723         tree signbit_fn = mathfn_built_in_1 (TREE_TYPE (arg), BUILT_IN_SIGNBIT, 0);
9724         tree isinf_fn = built_in_decls[BUILT_IN_ISINF];
9725         tree tmp = NULL_TREE;
9726
9727         arg = builtin_save_expr (arg);
9728
9729         if (signbit_fn && isinf_fn)
9730           {
9731             tree signbit_call = build_call_expr_loc (loc, signbit_fn, 1, arg);
9732             tree isinf_call = build_call_expr_loc (loc, isinf_fn, 1, arg);
9733
9734             signbit_call = fold_build2_loc (loc, NE_EXPR, integer_type_node,
9735                                         signbit_call, integer_zero_node);
9736             isinf_call = fold_build2_loc (loc, NE_EXPR, integer_type_node,
9737                                       isinf_call, integer_zero_node);
9738
9739             tmp = fold_build3_loc (loc, COND_EXPR, integer_type_node, signbit_call,
9740                                integer_minus_one_node, integer_one_node);
9741             tmp = fold_build3_loc (loc, COND_EXPR, integer_type_node,
9742                                isinf_call, tmp,
9743                                integer_zero_node);
9744           }
9745
9746         return tmp;
9747       }
9748
9749     case BUILT_IN_ISFINITE:
9750       if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg)))
9751           && !HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg))))
9752         return omit_one_operand_loc (loc, type, integer_one_node, arg);
9753
9754       if (TREE_CODE (arg) == REAL_CST)
9755         {
9756           r = TREE_REAL_CST (arg);
9757           return real_isfinite (&r) ? integer_one_node : integer_zero_node;
9758         }
9759
9760       return NULL_TREE;
9761
9762     case BUILT_IN_ISNAN:
9763       if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg))))
9764         return omit_one_operand_loc (loc, type, integer_zero_node, arg);
9765
9766       if (TREE_CODE (arg) == REAL_CST)
9767         {
9768           r = TREE_REAL_CST (arg);
9769           return real_isnan (&r) ? integer_one_node : integer_zero_node;
9770         }
9771
9772       arg = builtin_save_expr (arg);
9773       return fold_build2_loc (loc, UNORDERED_EXPR, type, arg, arg);
9774
9775     default:
9776       gcc_unreachable ();
9777     }
9778 }
9779
9780 /* Fold a call to __builtin_fpclassify(int, int, int, int, int, ...).
9781    This builtin will generate code to return the appropriate floating
9782    point classification depending on the value of the floating point
9783    number passed in.  The possible return values must be supplied as
9784    int arguments to the call in the following order: FP_NAN, FP_INFINITE,
9785    FP_NORMAL, FP_SUBNORMAL and FP_ZERO.  The ellipses is for exactly
9786    one floating point argument which is "type generic".  */
9787
9788 static tree
9789 fold_builtin_fpclassify (location_t loc, tree exp)
9790 {
9791   tree fp_nan, fp_infinite, fp_normal, fp_subnormal, fp_zero,
9792     arg, type, res, tmp;
9793   enum machine_mode mode;
9794   REAL_VALUE_TYPE r;
9795   char buf[128];
9796
9797   /* Verify the required arguments in the original call.  */
9798   if (!validate_arglist (exp, INTEGER_TYPE, INTEGER_TYPE,
9799                          INTEGER_TYPE, INTEGER_TYPE,
9800                          INTEGER_TYPE, REAL_TYPE, VOID_TYPE))
9801     return NULL_TREE;
9802
9803   fp_nan = CALL_EXPR_ARG (exp, 0);
9804   fp_infinite = CALL_EXPR_ARG (exp, 1);
9805   fp_normal = CALL_EXPR_ARG (exp, 2);
9806   fp_subnormal = CALL_EXPR_ARG (exp, 3);
9807   fp_zero = CALL_EXPR_ARG (exp, 4);
9808   arg = CALL_EXPR_ARG (exp, 5);
9809   type = TREE_TYPE (arg);
9810   mode = TYPE_MODE (type);
9811   arg = builtin_save_expr (fold_build1_loc (loc, ABS_EXPR, type, arg));
9812
9813   /* fpclassify(x) ->
9814        isnan(x) ? FP_NAN :
9815          (fabs(x) == Inf ? FP_INFINITE :
9816            (fabs(x) >= DBL_MIN ? FP_NORMAL :
9817              (x == 0 ? FP_ZERO : FP_SUBNORMAL))).  */
9818
9819   tmp = fold_build2_loc (loc, EQ_EXPR, integer_type_node, arg,
9820                      build_real (type, dconst0));
9821   res = fold_build3_loc (loc, COND_EXPR, integer_type_node,
9822                      tmp, fp_zero, fp_subnormal);
9823
9824   sprintf (buf, "0x1p%d", REAL_MODE_FORMAT (mode)->emin - 1);
9825   real_from_string (&r, buf);
9826   tmp = fold_build2_loc (loc, GE_EXPR, integer_type_node,
9827                      arg, build_real (type, r));
9828   res = fold_build3_loc (loc, COND_EXPR, integer_type_node, tmp, fp_normal, res);
9829
9830   if (HONOR_INFINITIES (mode))
9831     {
9832       real_inf (&r);
9833       tmp = fold_build2_loc (loc, EQ_EXPR, integer_type_node, arg,
9834                          build_real (type, r));
9835       res = fold_build3_loc (loc, COND_EXPR, integer_type_node, tmp,
9836                          fp_infinite, res);
9837     }
9838
9839   if (HONOR_NANS (mode))
9840     {
9841       tmp = fold_build2_loc (loc, ORDERED_EXPR, integer_type_node, arg, arg);
9842       res = fold_build3_loc (loc, COND_EXPR, integer_type_node, tmp, res, fp_nan);
9843     }
9844
9845   return res;
9846 }
9847
9848 /* Fold a call to an unordered comparison function such as
9849    __builtin_isgreater().  FNDECL is the FUNCTION_DECL for the function
9850    being called and ARG0 and ARG1 are the arguments for the call.
9851    UNORDERED_CODE and ORDERED_CODE are comparison codes that give
9852    the opposite of the desired result.  UNORDERED_CODE is used
9853    for modes that can hold NaNs and ORDERED_CODE is used for
9854    the rest.  */
9855
9856 static tree
9857 fold_builtin_unordered_cmp (location_t loc, tree fndecl, tree arg0, tree arg1,
9858                             enum tree_code unordered_code,
9859                             enum tree_code ordered_code)
9860 {
9861   tree type = TREE_TYPE (TREE_TYPE (fndecl));
9862   enum tree_code code;
9863   tree type0, type1;
9864   enum tree_code code0, code1;
9865   tree cmp_type = NULL_TREE;
9866
9867   type0 = TREE_TYPE (arg0);
9868   type1 = TREE_TYPE (arg1);
9869
9870   code0 = TREE_CODE (type0);
9871   code1 = TREE_CODE (type1);
9872
9873   if (code0 == REAL_TYPE && code1 == REAL_TYPE)
9874     /* Choose the wider of two real types.  */
9875     cmp_type = TYPE_PRECISION (type0) >= TYPE_PRECISION (type1)
9876       ? type0 : type1;
9877   else if (code0 == REAL_TYPE && code1 == INTEGER_TYPE)
9878     cmp_type = type0;
9879   else if (code0 == INTEGER_TYPE && code1 == REAL_TYPE)
9880     cmp_type = type1;
9881
9882   arg0 = fold_convert_loc (loc, cmp_type, arg0);
9883   arg1 = fold_convert_loc (loc, cmp_type, arg1);
9884
9885   if (unordered_code == UNORDERED_EXPR)
9886     {
9887       if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9888         return omit_two_operands_loc (loc, type, integer_zero_node, arg0, arg1);
9889       return fold_build2_loc (loc, UNORDERED_EXPR, type, arg0, arg1);
9890     }
9891
9892   code = HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))) ? unordered_code
9893                                                    : ordered_code;
9894   return fold_build1_loc (loc, TRUTH_NOT_EXPR, type,
9895                       fold_build2_loc (loc, code, type, arg0, arg1));
9896 }
9897
9898 /* Fold a call to built-in function FNDECL with 0 arguments.
9899    IGNORE is true if the result of the function call is ignored.  This
9900    function returns NULL_TREE if no simplification was possible.  */
9901
9902 static tree
9903 fold_builtin_0 (location_t loc, tree fndecl, bool ignore ATTRIBUTE_UNUSED)
9904 {
9905   tree type = TREE_TYPE (TREE_TYPE (fndecl));
9906   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
9907   switch (fcode)
9908     {
9909     CASE_FLT_FN (BUILT_IN_INF):
9910     case BUILT_IN_INFD32:
9911     case BUILT_IN_INFD64:
9912     case BUILT_IN_INFD128:
9913       return fold_builtin_inf (loc, type, true);
9914
9915     CASE_FLT_FN (BUILT_IN_HUGE_VAL):
9916       return fold_builtin_inf (loc, type, false);
9917
9918     case BUILT_IN_CLASSIFY_TYPE:
9919       return fold_builtin_classify_type (NULL_TREE);
9920
9921     default:
9922       break;
9923     }
9924   return NULL_TREE;
9925 }
9926
9927 /* Fold a call to built-in function FNDECL with 1 argument, ARG0.
9928    IGNORE is true if the result of the function call is ignored.  This
9929    function returns NULL_TREE if no simplification was possible.  */
9930
9931 static tree
9932 fold_builtin_1 (location_t loc, tree fndecl, tree arg0, bool ignore)
9933 {
9934   tree type = TREE_TYPE (TREE_TYPE (fndecl));
9935   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
9936   switch (fcode)
9937     {
9938     case BUILT_IN_CONSTANT_P:
9939       {
9940         tree val = fold_builtin_constant_p (arg0);
9941
9942         /* Gimplification will pull the CALL_EXPR for the builtin out of
9943            an if condition.  When not optimizing, we'll not CSE it back.
9944            To avoid link error types of regressions, return false now.  */
9945         if (!val && !optimize)
9946           val = integer_zero_node;
9947
9948         return val;
9949       }
9950
9951     case BUILT_IN_CLASSIFY_TYPE:
9952       return fold_builtin_classify_type (arg0);
9953
9954     case BUILT_IN_STRLEN:
9955       return fold_builtin_strlen (loc, type, arg0);
9956
9957     CASE_FLT_FN (BUILT_IN_FABS):
9958       return fold_builtin_fabs (loc, arg0, type);
9959
9960     case BUILT_IN_ABS:
9961     case BUILT_IN_LABS:
9962     case BUILT_IN_LLABS:
9963     case BUILT_IN_IMAXABS:
9964       return fold_builtin_abs (loc, arg0, type);
9965
9966     CASE_FLT_FN (BUILT_IN_CONJ):
9967       if (validate_arg (arg0, COMPLEX_TYPE)
9968         && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9969         return fold_build1_loc (loc, CONJ_EXPR, type, arg0);
9970     break;
9971
9972     CASE_FLT_FN (BUILT_IN_CREAL):
9973       if (validate_arg (arg0, COMPLEX_TYPE)
9974         && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9975         return non_lvalue_loc (loc, fold_build1_loc (loc, REALPART_EXPR, type, arg0));;
9976     break;
9977
9978     CASE_FLT_FN (BUILT_IN_CIMAG):
9979       if (validate_arg (arg0, COMPLEX_TYPE)
9980           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9981         return non_lvalue_loc (loc, fold_build1_loc (loc, IMAGPART_EXPR, type, arg0));
9982     break;
9983
9984     CASE_FLT_FN (BUILT_IN_CCOS):
9985       return fold_builtin_ccos(loc, arg0, type, fndecl, /*hyper=*/ false);
9986
9987     CASE_FLT_FN (BUILT_IN_CCOSH):
9988       return fold_builtin_ccos(loc, arg0, type, fndecl, /*hyper=*/ true);
9989
9990     CASE_FLT_FN (BUILT_IN_CPROJ):
9991       return fold_builtin_cproj(loc, arg0, type);
9992
9993     CASE_FLT_FN (BUILT_IN_CSIN):
9994       if (validate_arg (arg0, COMPLEX_TYPE)
9995           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9996         return do_mpc_arg1 (arg0, type, mpc_sin);
9997     break;
9998
9999     CASE_FLT_FN (BUILT_IN_CSINH):
10000       if (validate_arg (arg0, COMPLEX_TYPE)
10001           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
10002         return do_mpc_arg1 (arg0, type, mpc_sinh);
10003     break;
10004
10005     CASE_FLT_FN (BUILT_IN_CTAN):
10006       if (validate_arg (arg0, COMPLEX_TYPE)
10007           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
10008         return do_mpc_arg1 (arg0, type, mpc_tan);
10009     break;
10010
10011     CASE_FLT_FN (BUILT_IN_CTANH):
10012       if (validate_arg (arg0, COMPLEX_TYPE)
10013           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
10014         return do_mpc_arg1 (arg0, type, mpc_tanh);
10015     break;
10016
10017     CASE_FLT_FN (BUILT_IN_CLOG):
10018       if (validate_arg (arg0, COMPLEX_TYPE)
10019           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
10020         return do_mpc_arg1 (arg0, type, mpc_log);
10021     break;
10022
10023     CASE_FLT_FN (BUILT_IN_CSQRT):
10024       if (validate_arg (arg0, COMPLEX_TYPE)
10025           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
10026         return do_mpc_arg1 (arg0, type, mpc_sqrt);
10027     break;
10028
10029     CASE_FLT_FN (BUILT_IN_CASIN):
10030       if (validate_arg (arg0, COMPLEX_TYPE)
10031           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
10032         return do_mpc_arg1 (arg0, type, mpc_asin);
10033     break;
10034
10035     CASE_FLT_FN (BUILT_IN_CACOS):
10036       if (validate_arg (arg0, COMPLEX_TYPE)
10037           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
10038         return do_mpc_arg1 (arg0, type, mpc_acos);
10039     break;
10040
10041     CASE_FLT_FN (BUILT_IN_CATAN):
10042       if (validate_arg (arg0, COMPLEX_TYPE)
10043           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
10044         return do_mpc_arg1 (arg0, type, mpc_atan);
10045     break;
10046
10047     CASE_FLT_FN (BUILT_IN_CASINH):
10048       if (validate_arg (arg0, COMPLEX_TYPE)
10049           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
10050         return do_mpc_arg1 (arg0, type, mpc_asinh);
10051     break;
10052
10053     CASE_FLT_FN (BUILT_IN_CACOSH):
10054       if (validate_arg (arg0, COMPLEX_TYPE)
10055           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
10056         return do_mpc_arg1 (arg0, type, mpc_acosh);
10057     break;
10058
10059     CASE_FLT_FN (BUILT_IN_CATANH):
10060       if (validate_arg (arg0, COMPLEX_TYPE)
10061           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
10062         return do_mpc_arg1 (arg0, type, mpc_atanh);
10063     break;
10064
10065     CASE_FLT_FN (BUILT_IN_CABS):
10066       return fold_builtin_cabs (loc, arg0, type, fndecl);
10067
10068     CASE_FLT_FN (BUILT_IN_CARG):
10069       return fold_builtin_carg (loc, arg0, type);
10070
10071     CASE_FLT_FN (BUILT_IN_SQRT):
10072       return fold_builtin_sqrt (loc, arg0, type);
10073
10074     CASE_FLT_FN (BUILT_IN_CBRT):
10075       return fold_builtin_cbrt (loc, arg0, type);
10076
10077     CASE_FLT_FN (BUILT_IN_ASIN):
10078       if (validate_arg (arg0, REAL_TYPE))
10079         return do_mpfr_arg1 (arg0, type, mpfr_asin,
10080                              &dconstm1, &dconst1, true);
10081     break;
10082
10083     CASE_FLT_FN (BUILT_IN_ACOS):
10084       if (validate_arg (arg0, REAL_TYPE))
10085         return do_mpfr_arg1 (arg0, type, mpfr_acos,
10086                              &dconstm1, &dconst1, true);
10087     break;
10088
10089     CASE_FLT_FN (BUILT_IN_ATAN):
10090       if (validate_arg (arg0, REAL_TYPE))
10091         return do_mpfr_arg1 (arg0, type, mpfr_atan, NULL, NULL, 0);
10092     break;
10093
10094     CASE_FLT_FN (BUILT_IN_ASINH):
10095       if (validate_arg (arg0, REAL_TYPE))
10096         return do_mpfr_arg1 (arg0, type, mpfr_asinh, NULL, NULL, 0);
10097     break;
10098
10099     CASE_FLT_FN (BUILT_IN_ACOSH):
10100       if (validate_arg (arg0, REAL_TYPE))
10101         return do_mpfr_arg1 (arg0, type, mpfr_acosh,
10102                              &dconst1, NULL, true);
10103     break;
10104
10105     CASE_FLT_FN (BUILT_IN_ATANH):
10106       if (validate_arg (arg0, REAL_TYPE))
10107         return do_mpfr_arg1 (arg0, type, mpfr_atanh,
10108                              &dconstm1, &dconst1, false);
10109     break;
10110
10111     CASE_FLT_FN (BUILT_IN_SIN):
10112       if (validate_arg (arg0, REAL_TYPE))
10113         return do_mpfr_arg1 (arg0, type, mpfr_sin, NULL, NULL, 0);
10114     break;
10115
10116     CASE_FLT_FN (BUILT_IN_COS):
10117       return fold_builtin_cos (loc, arg0, type, fndecl);
10118
10119     CASE_FLT_FN (BUILT_IN_TAN):
10120       return fold_builtin_tan (arg0, type);
10121
10122     CASE_FLT_FN (BUILT_IN_CEXP):
10123       return fold_builtin_cexp (loc, arg0, type);
10124
10125     CASE_FLT_FN (BUILT_IN_CEXPI):
10126       if (validate_arg (arg0, REAL_TYPE))
10127         return do_mpfr_sincos (arg0, NULL_TREE, NULL_TREE);
10128     break;
10129
10130     CASE_FLT_FN (BUILT_IN_SINH):
10131       if (validate_arg (arg0, REAL_TYPE))
10132         return do_mpfr_arg1 (arg0, type, mpfr_sinh, NULL, NULL, 0);
10133     break;
10134
10135     CASE_FLT_FN (BUILT_IN_COSH):
10136       return fold_builtin_cosh (loc, arg0, type, fndecl);
10137
10138     CASE_FLT_FN (BUILT_IN_TANH):
10139       if (validate_arg (arg0, REAL_TYPE))
10140         return do_mpfr_arg1 (arg0, type, mpfr_tanh, NULL, NULL, 0);
10141     break;
10142
10143     CASE_FLT_FN (BUILT_IN_ERF):
10144       if (validate_arg (arg0, REAL_TYPE))
10145         return do_mpfr_arg1 (arg0, type, mpfr_erf, NULL, NULL, 0);
10146     break;
10147
10148     CASE_FLT_FN (BUILT_IN_ERFC):
10149       if (validate_arg (arg0, REAL_TYPE))
10150         return do_mpfr_arg1 (arg0, type, mpfr_erfc, NULL, NULL, 0);
10151     break;
10152
10153     CASE_FLT_FN (BUILT_IN_TGAMMA):
10154       if (validate_arg (arg0, REAL_TYPE))
10155         return do_mpfr_arg1 (arg0, type, mpfr_gamma, NULL, NULL, 0);
10156     break;
10157
10158     CASE_FLT_FN (BUILT_IN_EXP):
10159       return fold_builtin_exponent (loc, fndecl, arg0, mpfr_exp);
10160
10161     CASE_FLT_FN (BUILT_IN_EXP2):
10162       return fold_builtin_exponent (loc, fndecl, arg0, mpfr_exp2);
10163
10164     CASE_FLT_FN (BUILT_IN_EXP10):
10165     CASE_FLT_FN (BUILT_IN_POW10):
10166       return fold_builtin_exponent (loc, fndecl, arg0, mpfr_exp10);
10167
10168     CASE_FLT_FN (BUILT_IN_EXPM1):
10169       if (validate_arg (arg0, REAL_TYPE))
10170         return do_mpfr_arg1 (arg0, type, mpfr_expm1, NULL, NULL, 0);
10171     break;
10172
10173     CASE_FLT_FN (BUILT_IN_LOG):
10174     return fold_builtin_logarithm (loc, fndecl, arg0, mpfr_log);
10175
10176     CASE_FLT_FN (BUILT_IN_LOG2):
10177       return fold_builtin_logarithm (loc, fndecl, arg0, mpfr_log2);
10178
10179     CASE_FLT_FN (BUILT_IN_LOG10):
10180       return fold_builtin_logarithm (loc, fndecl, arg0, mpfr_log10);
10181
10182     CASE_FLT_FN (BUILT_IN_LOG1P):
10183       if (validate_arg (arg0, REAL_TYPE))
10184         return do_mpfr_arg1 (arg0, type, mpfr_log1p,
10185                              &dconstm1, NULL, false);
10186     break;
10187
10188     CASE_FLT_FN (BUILT_IN_J0):
10189       if (validate_arg (arg0, REAL_TYPE))
10190         return do_mpfr_arg1 (arg0, type, mpfr_j0,
10191                              NULL, NULL, 0);
10192     break;
10193
10194     CASE_FLT_FN (BUILT_IN_J1):
10195       if (validate_arg (arg0, REAL_TYPE))
10196         return do_mpfr_arg1 (arg0, type, mpfr_j1,
10197                              NULL, NULL, 0);
10198     break;
10199
10200     CASE_FLT_FN (BUILT_IN_Y0):
10201       if (validate_arg (arg0, REAL_TYPE))
10202         return do_mpfr_arg1 (arg0, type, mpfr_y0,
10203                              &dconst0, NULL, false);
10204     break;
10205
10206     CASE_FLT_FN (BUILT_IN_Y1):
10207       if (validate_arg (arg0, REAL_TYPE))
10208         return do_mpfr_arg1 (arg0, type, mpfr_y1,
10209                              &dconst0, NULL, false);
10210     break;
10211
10212     CASE_FLT_FN (BUILT_IN_NAN):
10213     case BUILT_IN_NAND32:
10214     case BUILT_IN_NAND64:
10215     case BUILT_IN_NAND128:
10216       return fold_builtin_nan (arg0, type, true);
10217
10218     CASE_FLT_FN (BUILT_IN_NANS):
10219       return fold_builtin_nan (arg0, type, false);
10220
10221     CASE_FLT_FN (BUILT_IN_FLOOR):
10222       return fold_builtin_floor (loc, fndecl, arg0);
10223
10224     CASE_FLT_FN (BUILT_IN_CEIL):
10225       return fold_builtin_ceil (loc, fndecl, arg0);
10226
10227     CASE_FLT_FN (BUILT_IN_TRUNC):
10228       return fold_builtin_trunc (loc, fndecl, arg0);
10229
10230     CASE_FLT_FN (BUILT_IN_ROUND):
10231       return fold_builtin_round (loc, fndecl, arg0);
10232
10233     CASE_FLT_FN (BUILT_IN_NEARBYINT):
10234     CASE_FLT_FN (BUILT_IN_RINT):
10235       return fold_trunc_transparent_mathfn (loc, fndecl, arg0);
10236
10237     CASE_FLT_FN (BUILT_IN_LCEIL):
10238     CASE_FLT_FN (BUILT_IN_LLCEIL):
10239     CASE_FLT_FN (BUILT_IN_LFLOOR):
10240     CASE_FLT_FN (BUILT_IN_LLFLOOR):
10241     CASE_FLT_FN (BUILT_IN_LROUND):
10242     CASE_FLT_FN (BUILT_IN_LLROUND):
10243       return fold_builtin_int_roundingfn (loc, fndecl, arg0);
10244
10245     CASE_FLT_FN (BUILT_IN_LRINT):
10246     CASE_FLT_FN (BUILT_IN_LLRINT):
10247       return fold_fixed_mathfn (loc, fndecl, arg0);
10248
10249     case BUILT_IN_BSWAP32:
10250     case BUILT_IN_BSWAP64:
10251       return fold_builtin_bswap (fndecl, arg0);
10252
10253     CASE_INT_FN (BUILT_IN_FFS):
10254     CASE_INT_FN (BUILT_IN_CLZ):
10255     CASE_INT_FN (BUILT_IN_CTZ):
10256     CASE_INT_FN (BUILT_IN_POPCOUNT):
10257     CASE_INT_FN (BUILT_IN_PARITY):
10258       return fold_builtin_bitop (fndecl, arg0);
10259
10260     CASE_FLT_FN (BUILT_IN_SIGNBIT):
10261       return fold_builtin_signbit (loc, arg0, type);
10262
10263     CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
10264       return fold_builtin_significand (loc, arg0, type);
10265
10266     CASE_FLT_FN (BUILT_IN_ILOGB):
10267     CASE_FLT_FN (BUILT_IN_LOGB):
10268       return fold_builtin_logb (loc, arg0, type);
10269
10270     case BUILT_IN_ISASCII:
10271       return fold_builtin_isascii (loc, arg0);
10272
10273     case BUILT_IN_TOASCII:
10274       return fold_builtin_toascii (loc, arg0);
10275
10276     case BUILT_IN_ISDIGIT:
10277       return fold_builtin_isdigit (loc, arg0);
10278
10279     CASE_FLT_FN (BUILT_IN_FINITE):
10280     case BUILT_IN_FINITED32:
10281     case BUILT_IN_FINITED64:
10282     case BUILT_IN_FINITED128:
10283     case BUILT_IN_ISFINITE:
10284       {
10285         tree ret = fold_builtin_classify (loc, fndecl, arg0, BUILT_IN_ISFINITE);
10286         if (ret)
10287           return ret;
10288         return fold_builtin_interclass_mathfn (loc, fndecl, arg0);
10289       }
10290
10291     CASE_FLT_FN (BUILT_IN_ISINF):
10292     case BUILT_IN_ISINFD32:
10293     case BUILT_IN_ISINFD64:
10294     case BUILT_IN_ISINFD128:
10295       {
10296         tree ret = fold_builtin_classify (loc, fndecl, arg0, BUILT_IN_ISINF);
10297         if (ret)
10298           return ret;
10299         return fold_builtin_interclass_mathfn (loc, fndecl, arg0);
10300       }
10301
10302     case BUILT_IN_ISNORMAL:
10303       return fold_builtin_interclass_mathfn (loc, fndecl, arg0);
10304
10305     case BUILT_IN_ISINF_SIGN:
10306       return fold_builtin_classify (loc, fndecl, arg0, BUILT_IN_ISINF_SIGN);
10307
10308     CASE_FLT_FN (BUILT_IN_ISNAN):
10309     case BUILT_IN_ISNAND32:
10310     case BUILT_IN_ISNAND64:
10311     case BUILT_IN_ISNAND128:
10312       return fold_builtin_classify (loc, fndecl, arg0, BUILT_IN_ISNAN);
10313
10314     case BUILT_IN_PRINTF:
10315     case BUILT_IN_PRINTF_UNLOCKED:
10316     case BUILT_IN_VPRINTF:
10317       return fold_builtin_printf (loc, fndecl, arg0, NULL_TREE, ignore, fcode);
10318
10319     case BUILT_IN_FREE:
10320       if (integer_zerop (arg0))
10321         return build_empty_stmt (loc);
10322       break;
10323
10324     default:
10325       break;
10326     }
10327
10328   return NULL_TREE;
10329
10330 }
10331
10332 /* Fold a call to built-in function FNDECL with 2 arguments, ARG0 and ARG1.
10333    IGNORE is true if the result of the function call is ignored.  This
10334    function returns NULL_TREE if no simplification was possible.  */
10335
10336 static tree
10337 fold_builtin_2 (location_t loc, tree fndecl, tree arg0, tree arg1, bool ignore)
10338 {
10339   tree type = TREE_TYPE (TREE_TYPE (fndecl));
10340   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
10341
10342   switch (fcode)
10343     {
10344     CASE_FLT_FN (BUILT_IN_JN):
10345       if (validate_arg (arg0, INTEGER_TYPE)
10346           && validate_arg (arg1, REAL_TYPE))
10347         return do_mpfr_bessel_n (arg0, arg1, type, mpfr_jn, NULL, 0);
10348     break;
10349
10350     CASE_FLT_FN (BUILT_IN_YN):
10351       if (validate_arg (arg0, INTEGER_TYPE)
10352           && validate_arg (arg1, REAL_TYPE))
10353         return do_mpfr_bessel_n (arg0, arg1, type, mpfr_yn,
10354                                  &dconst0, false);
10355     break;
10356
10357     CASE_FLT_FN (BUILT_IN_DREM):
10358     CASE_FLT_FN (BUILT_IN_REMAINDER):
10359       if (validate_arg (arg0, REAL_TYPE)
10360           && validate_arg(arg1, REAL_TYPE))
10361         return do_mpfr_arg2 (arg0, arg1, type, mpfr_remainder);
10362     break;
10363
10364     CASE_FLT_FN_REENT (BUILT_IN_GAMMA): /* GAMMA_R */
10365     CASE_FLT_FN_REENT (BUILT_IN_LGAMMA): /* LGAMMA_R */
10366       if (validate_arg (arg0, REAL_TYPE)
10367           && validate_arg(arg1, POINTER_TYPE))
10368         return do_mpfr_lgamma_r (arg0, arg1, type);
10369     break;
10370
10371     CASE_FLT_FN (BUILT_IN_ATAN2):
10372       if (validate_arg (arg0, REAL_TYPE)
10373           && validate_arg(arg1, REAL_TYPE))
10374         return do_mpfr_arg2 (arg0, arg1, type, mpfr_atan2);
10375     break;
10376
10377     CASE_FLT_FN (BUILT_IN_FDIM):
10378       if (validate_arg (arg0, REAL_TYPE)
10379           && validate_arg(arg1, REAL_TYPE))
10380         return do_mpfr_arg2 (arg0, arg1, type, mpfr_dim);
10381     break;
10382
10383     CASE_FLT_FN (BUILT_IN_HYPOT):
10384       return fold_builtin_hypot (loc, fndecl, arg0, arg1, type);
10385
10386     CASE_FLT_FN (BUILT_IN_CPOW):
10387       if (validate_arg (arg0, COMPLEX_TYPE)
10388           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE
10389           && validate_arg (arg1, COMPLEX_TYPE)
10390           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg1))) == REAL_TYPE)
10391         return do_mpc_arg2 (arg0, arg1, type, /*do_nonfinite=*/ 0, mpc_pow);
10392     break;
10393
10394     CASE_FLT_FN (BUILT_IN_LDEXP):
10395       return fold_builtin_load_exponent (loc, arg0, arg1, type, /*ldexp=*/true);
10396     CASE_FLT_FN (BUILT_IN_SCALBN):
10397     CASE_FLT_FN (BUILT_IN_SCALBLN):
10398       return fold_builtin_load_exponent (loc, arg0, arg1,
10399                                          type, /*ldexp=*/false);
10400
10401     CASE_FLT_FN (BUILT_IN_FREXP):
10402       return fold_builtin_frexp (loc, arg0, arg1, type);
10403
10404     CASE_FLT_FN (BUILT_IN_MODF):
10405       return fold_builtin_modf (loc, arg0, arg1, type);
10406
10407     case BUILT_IN_BZERO:
10408       return fold_builtin_bzero (loc, arg0, arg1, ignore);
10409
10410     case BUILT_IN_FPUTS:
10411       return fold_builtin_fputs (loc, arg0, arg1, ignore, false, NULL_TREE);
10412
10413     case BUILT_IN_FPUTS_UNLOCKED:
10414       return fold_builtin_fputs (loc, arg0, arg1, ignore, true, NULL_TREE);
10415
10416     case BUILT_IN_STRSTR:
10417       return fold_builtin_strstr (loc, arg0, arg1, type);
10418
10419     case BUILT_IN_STRCAT:
10420       return fold_builtin_strcat (loc, arg0, arg1);
10421
10422     case BUILT_IN_STRSPN:
10423       return fold_builtin_strspn (loc, arg0, arg1);
10424
10425     case BUILT_IN_STRCSPN:
10426       return fold_builtin_strcspn (loc, arg0, arg1);
10427
10428     case BUILT_IN_STRCHR:
10429     case BUILT_IN_INDEX:
10430       return fold_builtin_strchr (loc, arg0, arg1, type);
10431
10432     case BUILT_IN_STRRCHR:
10433     case BUILT_IN_RINDEX:
10434       return fold_builtin_strrchr (loc, arg0, arg1, type);
10435
10436     case BUILT_IN_STRCPY:
10437       return fold_builtin_strcpy (loc, fndecl, arg0, arg1, NULL_TREE);
10438
10439     case BUILT_IN_STPCPY:
10440       if (ignore)
10441         {
10442           tree fn = implicit_built_in_decls[BUILT_IN_STRCPY];
10443           if (!fn)
10444             break;
10445
10446           return build_call_expr_loc (loc, fn, 2, arg0, arg1);
10447         }
10448       else
10449         return fold_builtin_stpcpy (loc, fndecl, arg0, arg1);
10450       break;
10451
10452     case BUILT_IN_STRCMP:
10453       return fold_builtin_strcmp (loc, arg0, arg1);
10454
10455     case BUILT_IN_STRPBRK:
10456       return fold_builtin_strpbrk (loc, arg0, arg1, type);
10457
10458     case BUILT_IN_EXPECT:
10459       return fold_builtin_expect (loc, arg0, arg1);
10460
10461     CASE_FLT_FN (BUILT_IN_POW):
10462       return fold_builtin_pow (loc, fndecl, arg0, arg1, type);
10463
10464     CASE_FLT_FN (BUILT_IN_POWI):
10465       return fold_builtin_powi (loc, fndecl, arg0, arg1, type);
10466
10467     CASE_FLT_FN (BUILT_IN_COPYSIGN):
10468       return fold_builtin_copysign (loc, fndecl, arg0, arg1, type);
10469
10470     CASE_FLT_FN (BUILT_IN_FMIN):
10471       return fold_builtin_fmin_fmax (loc, arg0, arg1, type, /*max=*/false);
10472
10473     CASE_FLT_FN (BUILT_IN_FMAX):
10474       return fold_builtin_fmin_fmax (loc, arg0, arg1, type, /*max=*/true);
10475
10476     case BUILT_IN_ISGREATER:
10477       return fold_builtin_unordered_cmp (loc, fndecl,
10478                                          arg0, arg1, UNLE_EXPR, LE_EXPR);
10479     case BUILT_IN_ISGREATEREQUAL:
10480       return fold_builtin_unordered_cmp (loc, fndecl,
10481                                          arg0, arg1, UNLT_EXPR, LT_EXPR);
10482     case BUILT_IN_ISLESS:
10483       return fold_builtin_unordered_cmp (loc, fndecl,
10484                                          arg0, arg1, UNGE_EXPR, GE_EXPR);
10485     case BUILT_IN_ISLESSEQUAL:
10486       return fold_builtin_unordered_cmp (loc, fndecl,
10487                                          arg0, arg1, UNGT_EXPR, GT_EXPR);
10488     case BUILT_IN_ISLESSGREATER:
10489       return fold_builtin_unordered_cmp (loc, fndecl,
10490                                          arg0, arg1, UNEQ_EXPR, EQ_EXPR);
10491     case BUILT_IN_ISUNORDERED:
10492       return fold_builtin_unordered_cmp (loc, fndecl,
10493                                          arg0, arg1, UNORDERED_EXPR,
10494                                          NOP_EXPR);
10495
10496       /* We do the folding for va_start in the expander.  */
10497     case BUILT_IN_VA_START:
10498       break;
10499
10500     case BUILT_IN_SPRINTF:
10501       return fold_builtin_sprintf (loc, arg0, arg1, NULL_TREE, ignore);
10502
10503     case BUILT_IN_OBJECT_SIZE:
10504       return fold_builtin_object_size (arg0, arg1);
10505
10506     case BUILT_IN_PRINTF:
10507     case BUILT_IN_PRINTF_UNLOCKED:
10508     case BUILT_IN_VPRINTF:
10509       return fold_builtin_printf (loc, fndecl, arg0, arg1, ignore, fcode);
10510
10511     case BUILT_IN_PRINTF_CHK:
10512     case BUILT_IN_VPRINTF_CHK:
10513       if (!validate_arg (arg0, INTEGER_TYPE)
10514           || TREE_SIDE_EFFECTS (arg0))
10515         return NULL_TREE;
10516       else
10517         return fold_builtin_printf (loc, fndecl,
10518                                     arg1, NULL_TREE, ignore, fcode);
10519     break;
10520
10521     case BUILT_IN_FPRINTF:
10522     case BUILT_IN_FPRINTF_UNLOCKED:
10523     case BUILT_IN_VFPRINTF:
10524       return fold_builtin_fprintf (loc, fndecl, arg0, arg1, NULL_TREE,
10525                                    ignore, fcode);
10526
10527     default:
10528       break;
10529     }
10530   return NULL_TREE;
10531 }
10532
10533 /* Fold a call to built-in function FNDECL with 3 arguments, ARG0, ARG1,
10534    and ARG2.  IGNORE is true if the result of the function call is ignored.
10535    This function returns NULL_TREE if no simplification was possible.  */
10536
10537 static tree
10538 fold_builtin_3 (location_t loc, tree fndecl,
10539                 tree arg0, tree arg1, tree arg2, bool ignore)
10540 {
10541   tree type = TREE_TYPE (TREE_TYPE (fndecl));
10542   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
10543   switch (fcode)
10544     {
10545
10546     CASE_FLT_FN (BUILT_IN_SINCOS):
10547       return fold_builtin_sincos (loc, arg0, arg1, arg2);
10548
10549     CASE_FLT_FN (BUILT_IN_FMA):
10550       return fold_builtin_fma (loc, arg0, arg1, arg2, type);
10551     break;
10552
10553     CASE_FLT_FN (BUILT_IN_REMQUO):
10554       if (validate_arg (arg0, REAL_TYPE)
10555           && validate_arg(arg1, REAL_TYPE)
10556           && validate_arg(arg2, POINTER_TYPE))
10557         return do_mpfr_remquo (arg0, arg1, arg2);
10558     break;
10559
10560     case BUILT_IN_MEMSET:
10561       return fold_builtin_memset (loc, arg0, arg1, arg2, type, ignore);
10562
10563     case BUILT_IN_BCOPY:
10564       return fold_builtin_memory_op (loc, arg1, arg0, arg2,
10565                                      void_type_node, true, /*endp=*/3);
10566
10567     case BUILT_IN_MEMCPY:
10568       return fold_builtin_memory_op (loc, arg0, arg1, arg2,
10569                                      type, ignore, /*endp=*/0);
10570
10571     case BUILT_IN_MEMPCPY:
10572       return fold_builtin_memory_op (loc, arg0, arg1, arg2,
10573                                      type, ignore, /*endp=*/1);
10574
10575     case BUILT_IN_MEMMOVE:
10576       return fold_builtin_memory_op (loc, arg0, arg1, arg2,
10577                                      type, ignore, /*endp=*/3);
10578
10579     case BUILT_IN_STRNCAT:
10580       return fold_builtin_strncat (loc, arg0, arg1, arg2);
10581
10582     case BUILT_IN_STRNCPY:
10583       return fold_builtin_strncpy (loc, fndecl, arg0, arg1, arg2, NULL_TREE);
10584
10585     case BUILT_IN_STRNCMP:
10586       return fold_builtin_strncmp (loc, arg0, arg1, arg2);
10587
10588     case BUILT_IN_MEMCHR:
10589       return fold_builtin_memchr (loc, arg0, arg1, arg2, type);
10590
10591     case BUILT_IN_BCMP:
10592     case BUILT_IN_MEMCMP:
10593       return fold_builtin_memcmp (loc, arg0, arg1, arg2);;
10594
10595     case BUILT_IN_SPRINTF:
10596       return fold_builtin_sprintf (loc, arg0, arg1, arg2, ignore);
10597
10598     case BUILT_IN_STRCPY_CHK:
10599     case BUILT_IN_STPCPY_CHK:
10600       return fold_builtin_stxcpy_chk (loc, fndecl, arg0, arg1, arg2, NULL_TREE,
10601                                       ignore, fcode);
10602
10603     case BUILT_IN_STRCAT_CHK:
10604       return fold_builtin_strcat_chk (loc, fndecl, arg0, arg1, arg2);
10605
10606     case BUILT_IN_PRINTF_CHK:
10607     case BUILT_IN_VPRINTF_CHK:
10608       if (!validate_arg (arg0, INTEGER_TYPE)
10609           || TREE_SIDE_EFFECTS (arg0))
10610         return NULL_TREE;
10611       else
10612         return fold_builtin_printf (loc, fndecl, arg1, arg2, ignore, fcode);
10613     break;
10614
10615     case BUILT_IN_FPRINTF:
10616     case BUILT_IN_FPRINTF_UNLOCKED:
10617     case BUILT_IN_VFPRINTF:
10618       return fold_builtin_fprintf (loc, fndecl, arg0, arg1, arg2,
10619                                    ignore, fcode);
10620
10621     case BUILT_IN_FPRINTF_CHK:
10622     case BUILT_IN_VFPRINTF_CHK:
10623       if (!validate_arg (arg1, INTEGER_TYPE)
10624           || TREE_SIDE_EFFECTS (arg1))
10625         return NULL_TREE;
10626       else
10627         return fold_builtin_fprintf (loc, fndecl, arg0, arg2, NULL_TREE,
10628                                      ignore, fcode);
10629
10630     default:
10631       break;
10632     }
10633   return NULL_TREE;
10634 }
10635
10636 /* Fold a call to built-in function FNDECL with 4 arguments, ARG0, ARG1,
10637    ARG2, and ARG3.  IGNORE is true if the result of the function call is
10638    ignored.  This function returns NULL_TREE if no simplification was
10639    possible.  */
10640
10641 static tree
10642 fold_builtin_4 (location_t loc, tree fndecl,
10643                 tree arg0, tree arg1, tree arg2, tree arg3, bool ignore)
10644 {
10645   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
10646
10647   switch (fcode)
10648     {
10649     case BUILT_IN_MEMCPY_CHK:
10650     case BUILT_IN_MEMPCPY_CHK:
10651     case BUILT_IN_MEMMOVE_CHK:
10652     case BUILT_IN_MEMSET_CHK:
10653       return fold_builtin_memory_chk (loc, fndecl, arg0, arg1, arg2, arg3,
10654                                       NULL_TREE, ignore,
10655                                       DECL_FUNCTION_CODE (fndecl));
10656
10657     case BUILT_IN_STRNCPY_CHK:
10658       return fold_builtin_strncpy_chk (loc, arg0, arg1, arg2, arg3, NULL_TREE);
10659
10660     case BUILT_IN_STRNCAT_CHK:
10661       return fold_builtin_strncat_chk (loc, fndecl, arg0, arg1, arg2, arg3);
10662
10663     case BUILT_IN_FPRINTF_CHK:
10664     case BUILT_IN_VFPRINTF_CHK:
10665       if (!validate_arg (arg1, INTEGER_TYPE)
10666           || TREE_SIDE_EFFECTS (arg1))
10667         return NULL_TREE;
10668       else
10669         return fold_builtin_fprintf (loc, fndecl, arg0, arg2, arg3,
10670                                      ignore, fcode);
10671     break;
10672
10673     default:
10674       break;
10675     }
10676   return NULL_TREE;
10677 }
10678
10679 /* Fold a call to built-in function FNDECL.  ARGS is an array of NARGS
10680     arguments, where NARGS <= 4.  IGNORE is true if the result of the
10681     function call is ignored.  This function returns NULL_TREE if no
10682     simplification was possible.  Note that this only folds builtins with
10683     fixed argument patterns.  Foldings that do varargs-to-varargs
10684     transformations, or that match calls with more than 4 arguments,
10685     need to be handled with fold_builtin_varargs instead.  */
10686
10687 #define MAX_ARGS_TO_FOLD_BUILTIN 4
10688
10689 static tree
10690 fold_builtin_n (location_t loc, tree fndecl, tree *args, int nargs, bool ignore)
10691 {
10692   tree ret = NULL_TREE;
10693
10694   switch (nargs)
10695     {
10696     case 0:
10697       ret = fold_builtin_0 (loc, fndecl, ignore);
10698       break;
10699     case 1:
10700       ret = fold_builtin_1 (loc, fndecl, args[0], ignore);
10701       break;
10702     case 2:
10703       ret = fold_builtin_2 (loc, fndecl, args[0], args[1], ignore);
10704       break;
10705     case 3:
10706       ret = fold_builtin_3 (loc, fndecl, args[0], args[1], args[2], ignore);
10707       break;
10708     case 4:
10709       ret = fold_builtin_4 (loc, fndecl, args[0], args[1], args[2], args[3],
10710                             ignore);
10711       break;
10712     default:
10713       break;
10714     }
10715   if (ret)
10716     {
10717       ret = build1 (NOP_EXPR, TREE_TYPE (ret), ret);
10718       SET_EXPR_LOCATION (ret, loc);
10719       TREE_NO_WARNING (ret) = 1;
10720       return ret;
10721     }
10722   return NULL_TREE;
10723 }
10724
10725 /* Builtins with folding operations that operate on "..." arguments
10726    need special handling; we need to store the arguments in a convenient
10727    data structure before attempting any folding.  Fortunately there are
10728    only a few builtins that fall into this category.  FNDECL is the
10729    function, EXP is the CALL_EXPR for the call, and IGNORE is true if the
10730    result of the function call is ignored.  */
10731
10732 static tree
10733 fold_builtin_varargs (location_t loc, tree fndecl, tree exp,
10734                       bool ignore ATTRIBUTE_UNUSED)
10735 {
10736   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
10737   tree ret = NULL_TREE;
10738
10739   switch (fcode)
10740     {
10741     case BUILT_IN_SPRINTF_CHK:
10742     case BUILT_IN_VSPRINTF_CHK:
10743       ret = fold_builtin_sprintf_chk (loc, exp, fcode);
10744       break;
10745
10746     case BUILT_IN_SNPRINTF_CHK:
10747     case BUILT_IN_VSNPRINTF_CHK:
10748       ret = fold_builtin_snprintf_chk (loc, exp, NULL_TREE, fcode);
10749       break;
10750
10751     case BUILT_IN_FPCLASSIFY:
10752       ret = fold_builtin_fpclassify (loc, exp);
10753       break;
10754
10755     default:
10756       break;
10757     }
10758   if (ret)
10759     {
10760       ret = build1 (NOP_EXPR, TREE_TYPE (ret), ret);
10761       SET_EXPR_LOCATION (ret, loc);
10762       TREE_NO_WARNING (ret) = 1;
10763       return ret;
10764     }
10765   return NULL_TREE;
10766 }
10767
10768 /* Return true if FNDECL shouldn't be folded right now.
10769    If a built-in function has an inline attribute always_inline
10770    wrapper, defer folding it after always_inline functions have
10771    been inlined, otherwise e.g. -D_FORTIFY_SOURCE checking
10772    might not be performed.  */
10773
10774 static bool
10775 avoid_folding_inline_builtin (tree fndecl)
10776 {
10777   return (DECL_DECLARED_INLINE_P (fndecl)
10778           && DECL_DISREGARD_INLINE_LIMITS (fndecl)
10779           && cfun
10780           && !cfun->always_inline_functions_inlined
10781           && lookup_attribute ("always_inline", DECL_ATTRIBUTES (fndecl)));
10782 }
10783
10784 /* A wrapper function for builtin folding that prevents warnings for
10785    "statement without effect" and the like, caused by removing the
10786    call node earlier than the warning is generated.  */
10787
10788 tree
10789 fold_call_expr (location_t loc, tree exp, bool ignore)
10790 {
10791   tree ret = NULL_TREE;
10792   tree fndecl = get_callee_fndecl (exp);
10793   if (fndecl
10794       && TREE_CODE (fndecl) == FUNCTION_DECL
10795       && DECL_BUILT_IN (fndecl)
10796       /* If CALL_EXPR_VA_ARG_PACK is set, the arguments aren't finalized
10797          yet.  Defer folding until we see all the arguments
10798          (after inlining).  */
10799       && !CALL_EXPR_VA_ARG_PACK (exp))
10800     {
10801       int nargs = call_expr_nargs (exp);
10802
10803       /* Before gimplification CALL_EXPR_VA_ARG_PACK is not set, but
10804          instead last argument is __builtin_va_arg_pack ().  Defer folding
10805          even in that case, until arguments are finalized.  */
10806       if (nargs && TREE_CODE (CALL_EXPR_ARG (exp, nargs - 1)) == CALL_EXPR)
10807         {
10808           tree fndecl2 = get_callee_fndecl (CALL_EXPR_ARG (exp, nargs - 1));
10809           if (fndecl2
10810               && TREE_CODE (fndecl2) == FUNCTION_DECL
10811               && DECL_BUILT_IN_CLASS (fndecl2) == BUILT_IN_NORMAL
10812               && DECL_FUNCTION_CODE (fndecl2) == BUILT_IN_VA_ARG_PACK)
10813             return NULL_TREE;
10814         }
10815
10816       if (avoid_folding_inline_builtin (fndecl))
10817         return NULL_TREE;
10818
10819       if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
10820         return targetm.fold_builtin (fndecl, call_expr_nargs (exp),
10821                                      CALL_EXPR_ARGP (exp), ignore);
10822       else
10823         {
10824           if (nargs <= MAX_ARGS_TO_FOLD_BUILTIN)
10825             {
10826               tree *args = CALL_EXPR_ARGP (exp);
10827               ret = fold_builtin_n (loc, fndecl, args, nargs, ignore);
10828             }
10829           if (!ret)
10830             ret = fold_builtin_varargs (loc, fndecl, exp, ignore);
10831           if (ret)
10832             return ret;
10833         }
10834     }
10835   return NULL_TREE;
10836 }
10837
10838 /* Conveniently construct a function call expression.  FNDECL names the
10839    function to be called and N arguments are passed in the array
10840    ARGARRAY.  */
10841
10842 tree
10843 build_call_expr_loc_array (location_t loc, tree fndecl, int n, tree *argarray)
10844 {
10845   tree fntype = TREE_TYPE (fndecl);
10846   tree fn = build1 (ADDR_EXPR, build_pointer_type (fntype), fndecl);
10847  
10848   return fold_builtin_call_array (loc, TREE_TYPE (fntype), fn, n, argarray);
10849 }
10850
10851 /* Conveniently construct a function call expression.  FNDECL names the
10852    function to be called and the arguments are passed in the vector
10853    VEC.  */
10854
10855 tree
10856 build_call_expr_loc_vec (location_t loc, tree fndecl, VEC(tree,gc) *vec)
10857 {
10858   return build_call_expr_loc_array (loc, fndecl, VEC_length (tree, vec),
10859                                     VEC_address (tree, vec));
10860 }
10861
10862
10863 /* Conveniently construct a function call expression.  FNDECL names the
10864    function to be called, N is the number of arguments, and the "..."
10865    parameters are the argument expressions.  */
10866
10867 tree
10868 build_call_expr_loc (location_t loc, tree fndecl, int n, ...)
10869 {
10870   va_list ap;
10871   tree *argarray = XALLOCAVEC (tree, n);
10872   int i;
10873
10874   va_start (ap, n);
10875   for (i = 0; i < n; i++)
10876     argarray[i] = va_arg (ap, tree);
10877   va_end (ap);
10878   return build_call_expr_loc_array (loc, fndecl, n, argarray);
10879 }
10880
10881 /* Like build_call_expr_loc (UNKNOWN_LOCATION, ...).  Duplicated because
10882    varargs macros aren't supported by all bootstrap compilers.  */
10883
10884 tree
10885 build_call_expr (tree fndecl, int n, ...)
10886 {
10887   va_list ap;
10888   tree *argarray = XALLOCAVEC (tree, n);
10889   int i;
10890
10891   va_start (ap, n);
10892   for (i = 0; i < n; i++)
10893     argarray[i] = va_arg (ap, tree);
10894   va_end (ap);
10895   return build_call_expr_loc_array (UNKNOWN_LOCATION, fndecl, n, argarray);
10896 }
10897
10898 /* Construct a CALL_EXPR with type TYPE with FN as the function expression.
10899    N arguments are passed in the array ARGARRAY.  */
10900
10901 tree
10902 fold_builtin_call_array (location_t loc, tree type,
10903                          tree fn,
10904                          int n,
10905                          tree *argarray)
10906 {
10907   tree ret = NULL_TREE;
10908    tree exp;
10909
10910   if (TREE_CODE (fn) == ADDR_EXPR)
10911   {
10912     tree fndecl = TREE_OPERAND (fn, 0);
10913     if (TREE_CODE (fndecl) == FUNCTION_DECL
10914         && DECL_BUILT_IN (fndecl))
10915       {
10916         /* If last argument is __builtin_va_arg_pack (), arguments to this
10917            function are not finalized yet.  Defer folding until they are.  */
10918         if (n && TREE_CODE (argarray[n - 1]) == CALL_EXPR)
10919           {
10920             tree fndecl2 = get_callee_fndecl (argarray[n - 1]);
10921             if (fndecl2
10922                 && TREE_CODE (fndecl2) == FUNCTION_DECL
10923                 && DECL_BUILT_IN_CLASS (fndecl2) == BUILT_IN_NORMAL
10924                 && DECL_FUNCTION_CODE (fndecl2) == BUILT_IN_VA_ARG_PACK)
10925               return build_call_array_loc (loc, type, fn, n, argarray);
10926           }
10927         if (avoid_folding_inline_builtin (fndecl))
10928           return build_call_array_loc (loc, type, fn, n, argarray);
10929         if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
10930           {
10931             ret = targetm.fold_builtin (fndecl, n, argarray, false);
10932             if (ret)
10933               return ret;
10934
10935             return build_call_array_loc (loc, type, fn, n, argarray);
10936           }
10937         else if (n <= MAX_ARGS_TO_FOLD_BUILTIN)
10938           {
10939             /* First try the transformations that don't require consing up
10940                an exp.  */
10941             ret = fold_builtin_n (loc, fndecl, argarray, n, false);
10942             if (ret)
10943               return ret;
10944           }
10945
10946         /* If we got this far, we need to build an exp.  */
10947         exp = build_call_array_loc (loc, type, fn, n, argarray);
10948         ret = fold_builtin_varargs (loc, fndecl, exp, false);
10949         return ret ? ret : exp;
10950       }
10951   }
10952
10953   return build_call_array_loc (loc, type, fn, n, argarray);
10954 }
10955
10956 /* Construct a new CALL_EXPR to FNDECL using the tail of the argument
10957    list ARGS along with N new arguments in NEWARGS.  SKIP is the number
10958    of arguments in ARGS to be omitted.  OLDNARGS is the number of
10959    elements in ARGS.  */
10960
10961 static tree
10962 rewrite_call_expr_valist (location_t loc, int oldnargs, tree *args,
10963                           int skip, tree fndecl, int n, va_list newargs)
10964 {
10965   int nargs = oldnargs - skip + n;
10966   tree *buffer;
10967
10968   if (n > 0)
10969     {
10970       int i, j;
10971
10972       buffer = XALLOCAVEC (tree, nargs);
10973       for (i = 0; i < n; i++)
10974         buffer[i] = va_arg (newargs, tree);
10975       for (j = skip; j < oldnargs; j++, i++)
10976         buffer[i] = args[j];
10977     }
10978   else
10979     buffer = args + skip;
10980
10981   return build_call_expr_loc_array (loc, fndecl, nargs, buffer);
10982 }
10983
10984 /* Construct a new CALL_EXPR to FNDECL using the tail of the argument
10985    list ARGS along with N new arguments specified as the "..."
10986    parameters.  SKIP is the number of arguments in ARGS to be omitted.
10987    OLDNARGS is the number of elements in ARGS.  */
10988
10989 static tree
10990 rewrite_call_expr_array (location_t loc, int oldnargs, tree *args,
10991                          int skip, tree fndecl, int n, ...)
10992 {
10993   va_list ap;
10994   tree t;
10995
10996   va_start (ap, n);
10997   t = rewrite_call_expr_valist (loc, oldnargs, args, skip, fndecl, n, ap);
10998   va_end (ap);
10999
11000   return t;
11001 }
11002
11003 /* Construct a new CALL_EXPR using the tail of the argument list of EXP
11004    along with N new arguments specified as the "..." parameters.  SKIP
11005    is the number of arguments in EXP to be omitted.  This function is used
11006    to do varargs-to-varargs transformations.  */
11007
11008 static tree
11009 rewrite_call_expr (location_t loc, tree exp, int skip, tree fndecl, int n, ...)
11010 {
11011   va_list ap;
11012   tree t;
11013
11014   va_start (ap, n);
11015   t = rewrite_call_expr_valist (loc, call_expr_nargs (exp),
11016                                 CALL_EXPR_ARGP (exp), skip, fndecl, n, ap);
11017   va_end (ap);
11018
11019   return t;
11020 }
11021
11022 /* Validate a single argument ARG against a tree code CODE representing
11023    a type.  */
11024
11025 static bool
11026 validate_arg (const_tree arg, enum tree_code code)
11027 {
11028   if (!arg)
11029     return false;
11030   else if (code == POINTER_TYPE)
11031     return POINTER_TYPE_P (TREE_TYPE (arg));
11032   else if (code == INTEGER_TYPE)
11033     return INTEGRAL_TYPE_P (TREE_TYPE (arg));
11034   return code == TREE_CODE (TREE_TYPE (arg));
11035 }
11036
11037 /* This function validates the types of a function call argument list
11038    against a specified list of tree_codes.  If the last specifier is a 0,
11039    that represents an ellipses, otherwise the last specifier must be a
11040    VOID_TYPE.
11041
11042    This is the GIMPLE version of validate_arglist.  Eventually we want to
11043    completely convert builtins.c to work from GIMPLEs and the tree based
11044    validate_arglist will then be removed.  */
11045
11046 bool
11047 validate_gimple_arglist (const_gimple call, ...)
11048 {
11049   enum tree_code code;
11050   bool res = 0;
11051   va_list ap;
11052   const_tree arg;
11053   size_t i;
11054
11055   va_start (ap, call);
11056   i = 0;
11057
11058   do
11059     {
11060       code = (enum tree_code) va_arg (ap, int);
11061       switch (code)
11062         {
11063         case 0:
11064           /* This signifies an ellipses, any further arguments are all ok.  */
11065           res = true;
11066           goto end;
11067         case VOID_TYPE:
11068           /* This signifies an endlink, if no arguments remain, return
11069              true, otherwise return false.  */
11070           res = (i == gimple_call_num_args (call));
11071           goto end;
11072         default:
11073           /* If no parameters remain or the parameter's code does not
11074              match the specified code, return false.  Otherwise continue
11075              checking any remaining arguments.  */
11076           arg = gimple_call_arg (call, i++);
11077           if (!validate_arg (arg, code))
11078             goto end;
11079           break;
11080         }
11081     }
11082   while (1);
11083
11084   /* We need gotos here since we can only have one VA_CLOSE in a
11085      function.  */
11086  end: ;
11087   va_end (ap);
11088
11089   return res;
11090 }
11091
11092 /* This function validates the types of a function call argument list
11093    against a specified list of tree_codes.  If the last specifier is a 0,
11094    that represents an ellipses, otherwise the last specifier must be a
11095    VOID_TYPE.  */
11096
11097 bool
11098 validate_arglist (const_tree callexpr, ...)
11099 {
11100   enum tree_code code;
11101   bool res = 0;
11102   va_list ap;
11103   const_call_expr_arg_iterator iter;
11104   const_tree arg;
11105
11106   va_start (ap, callexpr);
11107   init_const_call_expr_arg_iterator (callexpr, &iter);
11108
11109   do
11110     {
11111       code = (enum tree_code) va_arg (ap, int);
11112       switch (code)
11113         {
11114         case 0:
11115           /* This signifies an ellipses, any further arguments are all ok.  */
11116           res = true;
11117           goto end;
11118         case VOID_TYPE:
11119           /* This signifies an endlink, if no arguments remain, return
11120              true, otherwise return false.  */
11121           res = !more_const_call_expr_args_p (&iter);
11122           goto end;
11123         default:
11124           /* If no parameters remain or the parameter's code does not
11125              match the specified code, return false.  Otherwise continue
11126              checking any remaining arguments.  */
11127           arg = next_const_call_expr_arg (&iter);
11128           if (!validate_arg (arg, code))
11129             goto end;
11130           break;
11131         }
11132     }
11133   while (1);
11134
11135   /* We need gotos here since we can only have one VA_CLOSE in a
11136      function.  */
11137  end: ;
11138   va_end (ap);
11139
11140   return res;
11141 }
11142
11143 /* Default target-specific builtin expander that does nothing.  */
11144
11145 rtx
11146 default_expand_builtin (tree exp ATTRIBUTE_UNUSED,
11147                         rtx target ATTRIBUTE_UNUSED,
11148                         rtx subtarget ATTRIBUTE_UNUSED,
11149                         enum machine_mode mode ATTRIBUTE_UNUSED,
11150                         int ignore ATTRIBUTE_UNUSED)
11151 {
11152   return NULL_RTX;
11153 }
11154
11155 /* Returns true is EXP represents data that would potentially reside
11156    in a readonly section.  */
11157
11158 static bool
11159 readonly_data_expr (tree exp)
11160 {
11161   STRIP_NOPS (exp);
11162
11163   if (TREE_CODE (exp) != ADDR_EXPR)
11164     return false;
11165
11166   exp = get_base_address (TREE_OPERAND (exp, 0));
11167   if (!exp)
11168     return false;
11169
11170   /* Make sure we call decl_readonly_section only for trees it
11171      can handle (since it returns true for everything it doesn't
11172      understand).  */
11173   if (TREE_CODE (exp) == STRING_CST
11174       || TREE_CODE (exp) == CONSTRUCTOR
11175       || (TREE_CODE (exp) == VAR_DECL && TREE_STATIC (exp)))
11176     return decl_readonly_section (exp, 0);
11177   else
11178     return false;
11179 }
11180
11181 /* Simplify a call to the strstr builtin.  S1 and S2 are the arguments
11182    to the call, and TYPE is its return type.
11183
11184    Return NULL_TREE if no simplification was possible, otherwise return the
11185    simplified form of the call as a tree.
11186
11187    The simplified form may be a constant or other expression which
11188    computes the same value, but in a more efficient manner (including
11189    calls to other builtin functions).
11190
11191    The call may contain arguments which need to be evaluated, but
11192    which are not useful to determine the result of the call.  In
11193    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11194    COMPOUND_EXPR will be an argument which must be evaluated.
11195    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11196    COMPOUND_EXPR in the chain will contain the tree for the simplified
11197    form of the builtin function call.  */
11198
11199 static tree
11200 fold_builtin_strstr (location_t loc, tree s1, tree s2, tree type)
11201 {
11202   if (!validate_arg (s1, POINTER_TYPE)
11203       || !validate_arg (s2, POINTER_TYPE))
11204     return NULL_TREE;
11205   else
11206     {
11207       tree fn;
11208       const char *p1, *p2;
11209
11210       p2 = c_getstr (s2);
11211       if (p2 == NULL)
11212         return NULL_TREE;
11213
11214       p1 = c_getstr (s1);
11215       if (p1 != NULL)
11216         {
11217           const char *r = strstr (p1, p2);
11218           tree tem;
11219
11220           if (r == NULL)
11221             return build_int_cst (TREE_TYPE (s1), 0);
11222
11223           /* Return an offset into the constant string argument.  */
11224           tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
11225                              s1, size_int (r - p1));
11226           return fold_convert_loc (loc, type, tem);
11227         }
11228
11229       /* The argument is const char *, and the result is char *, so we need
11230          a type conversion here to avoid a warning.  */
11231       if (p2[0] == '\0')
11232         return fold_convert_loc (loc, type, s1);
11233
11234       if (p2[1] != '\0')
11235         return NULL_TREE;
11236
11237       fn = implicit_built_in_decls[BUILT_IN_STRCHR];
11238       if (!fn)
11239         return NULL_TREE;
11240
11241       /* New argument list transforming strstr(s1, s2) to
11242          strchr(s1, s2[0]).  */
11243       return build_call_expr_loc (loc, fn, 2, s1, build_int_cst (NULL_TREE, p2[0]));
11244     }
11245 }
11246
11247 /* Simplify a call to the strchr builtin.  S1 and S2 are the arguments to
11248    the call, and TYPE is its return type.
11249
11250    Return NULL_TREE if no simplification was possible, otherwise return the
11251    simplified form of the call as a tree.
11252
11253    The simplified form may be a constant or other expression which
11254    computes the same value, but in a more efficient manner (including
11255    calls to other builtin functions).
11256
11257    The call may contain arguments which need to be evaluated, but
11258    which are not useful to determine the result of the call.  In
11259    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11260    COMPOUND_EXPR will be an argument which must be evaluated.
11261    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11262    COMPOUND_EXPR in the chain will contain the tree for the simplified
11263    form of the builtin function call.  */
11264
11265 static tree
11266 fold_builtin_strchr (location_t loc, tree s1, tree s2, tree type)
11267 {
11268   if (!validate_arg (s1, POINTER_TYPE)
11269       || !validate_arg (s2, INTEGER_TYPE))
11270     return NULL_TREE;
11271   else
11272     {
11273       const char *p1;
11274
11275       if (TREE_CODE (s2) != INTEGER_CST)
11276         return NULL_TREE;
11277
11278       p1 = c_getstr (s1);
11279       if (p1 != NULL)
11280         {
11281           char c;
11282           const char *r;
11283           tree tem;
11284
11285           if (target_char_cast (s2, &c))
11286             return NULL_TREE;
11287
11288           r = strchr (p1, c);
11289
11290           if (r == NULL)
11291             return build_int_cst (TREE_TYPE (s1), 0);
11292
11293           /* Return an offset into the constant string argument.  */
11294           tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
11295                              s1, size_int (r - p1));
11296           return fold_convert_loc (loc, type, tem);
11297         }
11298       return NULL_TREE;
11299     }
11300 }
11301
11302 /* Simplify a call to the strrchr builtin.  S1 and S2 are the arguments to
11303    the call, and TYPE is its return type.
11304
11305    Return NULL_TREE if no simplification was possible, otherwise return the
11306    simplified form of the call as a tree.
11307
11308    The simplified form may be a constant or other expression which
11309    computes the same value, but in a more efficient manner (including
11310    calls to other builtin functions).
11311
11312    The call may contain arguments which need to be evaluated, but
11313    which are not useful to determine the result of the call.  In
11314    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11315    COMPOUND_EXPR will be an argument which must be evaluated.
11316    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11317    COMPOUND_EXPR in the chain will contain the tree for the simplified
11318    form of the builtin function call.  */
11319
11320 static tree
11321 fold_builtin_strrchr (location_t loc, tree s1, tree s2, tree type)
11322 {
11323   if (!validate_arg (s1, POINTER_TYPE)
11324       || !validate_arg (s2, INTEGER_TYPE))
11325     return NULL_TREE;
11326   else
11327     {
11328       tree fn;
11329       const char *p1;
11330
11331       if (TREE_CODE (s2) != INTEGER_CST)
11332         return NULL_TREE;
11333
11334       p1 = c_getstr (s1);
11335       if (p1 != NULL)
11336         {
11337           char c;
11338           const char *r;
11339           tree tem;
11340
11341           if (target_char_cast (s2, &c))
11342             return NULL_TREE;
11343
11344           r = strrchr (p1, c);
11345
11346           if (r == NULL)
11347             return build_int_cst (TREE_TYPE (s1), 0);
11348
11349           /* Return an offset into the constant string argument.  */
11350           tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
11351                              s1, size_int (r - p1));
11352           return fold_convert_loc (loc, type, tem);
11353         }
11354
11355       if (! integer_zerop (s2))
11356         return NULL_TREE;
11357
11358       fn = implicit_built_in_decls[BUILT_IN_STRCHR];
11359       if (!fn)
11360         return NULL_TREE;
11361
11362       /* Transform strrchr(s1, '\0') to strchr(s1, '\0').  */
11363       return build_call_expr_loc (loc, fn, 2, s1, s2);
11364     }
11365 }
11366
11367 /* Simplify a call to the strpbrk builtin.  S1 and S2 are the arguments
11368    to the call, and TYPE is its return type.
11369
11370    Return NULL_TREE if no simplification was possible, otherwise return the
11371    simplified form of the call as a tree.
11372
11373    The simplified form may be a constant or other expression which
11374    computes the same value, but in a more efficient manner (including
11375    calls to other builtin functions).
11376
11377    The call may contain arguments which need to be evaluated, but
11378    which are not useful to determine the result of the call.  In
11379    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11380    COMPOUND_EXPR will be an argument which must be evaluated.
11381    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11382    COMPOUND_EXPR in the chain will contain the tree for the simplified
11383    form of the builtin function call.  */
11384
11385 static tree
11386 fold_builtin_strpbrk (location_t loc, tree s1, tree s2, tree type)
11387 {
11388   if (!validate_arg (s1, POINTER_TYPE)
11389       || !validate_arg (s2, POINTER_TYPE))
11390     return NULL_TREE;
11391   else
11392     {
11393       tree fn;
11394       const char *p1, *p2;
11395
11396       p2 = c_getstr (s2);
11397       if (p2 == NULL)
11398         return NULL_TREE;
11399
11400       p1 = c_getstr (s1);
11401       if (p1 != NULL)
11402         {
11403           const char *r = strpbrk (p1, p2);
11404           tree tem;
11405
11406           if (r == NULL)
11407             return build_int_cst (TREE_TYPE (s1), 0);
11408
11409           /* Return an offset into the constant string argument.  */
11410           tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
11411                              s1, size_int (r - p1));
11412           return fold_convert_loc (loc, type, tem);
11413         }
11414
11415       if (p2[0] == '\0')
11416         /* strpbrk(x, "") == NULL.
11417            Evaluate and ignore s1 in case it had side-effects.  */
11418         return omit_one_operand_loc (loc, TREE_TYPE (s1), integer_zero_node, s1);
11419
11420       if (p2[1] != '\0')
11421         return NULL_TREE;  /* Really call strpbrk.  */
11422
11423       fn = implicit_built_in_decls[BUILT_IN_STRCHR];
11424       if (!fn)
11425         return NULL_TREE;
11426
11427       /* New argument list transforming strpbrk(s1, s2) to
11428          strchr(s1, s2[0]).  */
11429       return build_call_expr_loc (loc, fn, 2, s1, build_int_cst (NULL_TREE, p2[0]));
11430     }
11431 }
11432
11433 /* Simplify a call to the strcat builtin.  DST and SRC are the arguments
11434    to the call.
11435
11436    Return NULL_TREE if no simplification was possible, otherwise return the
11437    simplified form of the call as a tree.
11438
11439    The simplified form may be a constant or other expression which
11440    computes the same value, but in a more efficient manner (including
11441    calls to other builtin functions).
11442
11443    The call may contain arguments which need to be evaluated, but
11444    which are not useful to determine the result of the call.  In
11445    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11446    COMPOUND_EXPR will be an argument which must be evaluated.
11447    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11448    COMPOUND_EXPR in the chain will contain the tree for the simplified
11449    form of the builtin function call.  */
11450
11451 static tree
11452 fold_builtin_strcat (location_t loc ATTRIBUTE_UNUSED, tree dst, tree src)
11453 {
11454   if (!validate_arg (dst, POINTER_TYPE)
11455       || !validate_arg (src, POINTER_TYPE))
11456     return NULL_TREE;
11457   else
11458     {
11459       const char *p = c_getstr (src);
11460
11461       /* If the string length is zero, return the dst parameter.  */
11462       if (p && *p == '\0')
11463         return dst;
11464
11465       if (optimize_insn_for_speed_p ())
11466         {
11467           /* See if we can store by pieces into (dst + strlen(dst)).  */
11468           tree newdst, call;
11469           tree strlen_fn = implicit_built_in_decls[BUILT_IN_STRLEN];
11470           tree strcpy_fn = implicit_built_in_decls[BUILT_IN_STRCPY];
11471
11472           if (!strlen_fn || !strcpy_fn)
11473             return NULL_TREE;
11474
11475           /* If we don't have a movstr we don't want to emit an strcpy
11476              call.  We have to do that if the length of the source string
11477              isn't computable (in that case we can use memcpy probably
11478              later expanding to a sequence of mov instructions).  If we
11479              have movstr instructions we can emit strcpy calls.  */
11480           if (!HAVE_movstr)
11481             {
11482               tree len = c_strlen (src, 1);
11483               if (! len || TREE_SIDE_EFFECTS (len))
11484                 return NULL_TREE;
11485             }
11486
11487           /* Stabilize the argument list.  */
11488           dst = builtin_save_expr (dst);
11489
11490           /* Create strlen (dst).  */
11491           newdst = build_call_expr_loc (loc, strlen_fn, 1, dst);
11492           /* Create (dst p+ strlen (dst)).  */
11493
11494           newdst = fold_build2_loc (loc, POINTER_PLUS_EXPR,
11495                                 TREE_TYPE (dst), dst, newdst);
11496           newdst = builtin_save_expr (newdst);
11497
11498           call = build_call_expr_loc (loc, strcpy_fn, 2, newdst, src);
11499           return build2 (COMPOUND_EXPR, TREE_TYPE (dst), call, dst);
11500         }
11501       return NULL_TREE;
11502     }
11503 }
11504
11505 /* Simplify a call to the strncat builtin.  DST, SRC, and LEN are the
11506    arguments to the call.
11507
11508    Return NULL_TREE if no simplification was possible, otherwise return the
11509    simplified form of the call as a tree.
11510
11511    The simplified form may be a constant or other expression which
11512    computes the same value, but in a more efficient manner (including
11513    calls to other builtin functions).
11514
11515    The call may contain arguments which need to be evaluated, but
11516    which are not useful to determine the result of the call.  In
11517    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11518    COMPOUND_EXPR will be an argument which must be evaluated.
11519    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11520    COMPOUND_EXPR in the chain will contain the tree for the simplified
11521    form of the builtin function call.  */
11522
11523 static tree
11524 fold_builtin_strncat (location_t loc, tree dst, tree src, tree len)
11525 {
11526   if (!validate_arg (dst, POINTER_TYPE)
11527       || !validate_arg (src, POINTER_TYPE)
11528       || !validate_arg (len, INTEGER_TYPE))
11529     return NULL_TREE;
11530   else
11531     {
11532       const char *p = c_getstr (src);
11533
11534       /* If the requested length is zero, or the src parameter string
11535          length is zero, return the dst parameter.  */
11536       if (integer_zerop (len) || (p && *p == '\0'))
11537         return omit_two_operands_loc (loc, TREE_TYPE (dst), dst, src, len);
11538
11539       /* If the requested len is greater than or equal to the string
11540          length, call strcat.  */
11541       if (TREE_CODE (len) == INTEGER_CST && p
11542           && compare_tree_int (len, strlen (p)) >= 0)
11543         {
11544           tree fn = implicit_built_in_decls[BUILT_IN_STRCAT];
11545
11546           /* If the replacement _DECL isn't initialized, don't do the
11547              transformation.  */
11548           if (!fn)
11549             return NULL_TREE;
11550
11551           return build_call_expr_loc (loc, fn, 2, dst, src);
11552         }
11553       return NULL_TREE;
11554     }
11555 }
11556
11557 /* Simplify a call to the strspn builtin.  S1 and S2 are the arguments
11558    to the call.
11559
11560    Return NULL_TREE if no simplification was possible, otherwise return the
11561    simplified form of the call as a tree.
11562
11563    The simplified form may be a constant or other expression which
11564    computes the same value, but in a more efficient manner (including
11565    calls to other builtin functions).
11566
11567    The call may contain arguments which need to be evaluated, but
11568    which are not useful to determine the result of the call.  In
11569    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11570    COMPOUND_EXPR will be an argument which must be evaluated.
11571    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11572    COMPOUND_EXPR in the chain will contain the tree for the simplified
11573    form of the builtin function call.  */
11574
11575 static tree
11576 fold_builtin_strspn (location_t loc, tree s1, tree s2)
11577 {
11578   if (!validate_arg (s1, POINTER_TYPE)
11579       || !validate_arg (s2, POINTER_TYPE))
11580     return NULL_TREE;
11581   else
11582     {
11583       const char *p1 = c_getstr (s1), *p2 = c_getstr (s2);
11584
11585       /* If both arguments are constants, evaluate at compile-time.  */
11586       if (p1 && p2)
11587         {
11588           const size_t r = strspn (p1, p2);
11589           return size_int (r);
11590         }
11591
11592       /* If either argument is "", return NULL_TREE.  */
11593       if ((p1 && *p1 == '\0') || (p2 && *p2 == '\0'))
11594         /* Evaluate and ignore both arguments in case either one has
11595            side-effects.  */
11596         return omit_two_operands_loc (loc, size_type_node, size_zero_node,
11597                                   s1, s2);
11598       return NULL_TREE;
11599     }
11600 }
11601
11602 /* Simplify a call to the strcspn builtin.  S1 and S2 are the arguments
11603    to the call.
11604
11605    Return NULL_TREE if no simplification was possible, otherwise return the
11606    simplified form of the call as a tree.
11607
11608    The simplified form may be a constant or other expression which
11609    computes the same value, but in a more efficient manner (including
11610    calls to other builtin functions).
11611
11612    The call may contain arguments which need to be evaluated, but
11613    which are not useful to determine the result of the call.  In
11614    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11615    COMPOUND_EXPR will be an argument which must be evaluated.
11616    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11617    COMPOUND_EXPR in the chain will contain the tree for the simplified
11618    form of the builtin function call.  */
11619
11620 static tree
11621 fold_builtin_strcspn (location_t loc, tree s1, tree s2)
11622 {
11623   if (!validate_arg (s1, POINTER_TYPE)
11624       || !validate_arg (s2, POINTER_TYPE))
11625     return NULL_TREE;
11626   else
11627     {
11628       const char *p1 = c_getstr (s1), *p2 = c_getstr (s2);
11629
11630       /* If both arguments are constants, evaluate at compile-time.  */
11631       if (p1 && p2)
11632         {
11633           const size_t r = strcspn (p1, p2);
11634           return size_int (r);
11635         }
11636
11637       /* If the first argument is "", return NULL_TREE.  */
11638       if (p1 && *p1 == '\0')
11639         {
11640           /* Evaluate and ignore argument s2 in case it has
11641              side-effects.  */
11642           return omit_one_operand_loc (loc, size_type_node,
11643                                    size_zero_node, s2);
11644         }
11645
11646       /* If the second argument is "", return __builtin_strlen(s1).  */
11647       if (p2 && *p2 == '\0')
11648         {
11649           tree fn = implicit_built_in_decls[BUILT_IN_STRLEN];
11650
11651           /* If the replacement _DECL isn't initialized, don't do the
11652              transformation.  */
11653           if (!fn)
11654             return NULL_TREE;
11655
11656           return build_call_expr_loc (loc, fn, 1, s1);
11657         }
11658       return NULL_TREE;
11659     }
11660 }
11661
11662 /* Fold a call to the fputs builtin.  ARG0 and ARG1 are the arguments
11663    to the call.  IGNORE is true if the value returned
11664    by the builtin will be ignored.  UNLOCKED is true is true if this
11665    actually a call to fputs_unlocked.  If LEN in non-NULL, it represents
11666    the known length of the string.  Return NULL_TREE if no simplification
11667    was possible.  */
11668
11669 tree
11670 fold_builtin_fputs (location_t loc, tree arg0, tree arg1,
11671                     bool ignore, bool unlocked, tree len)
11672 {
11673   /* If we're using an unlocked function, assume the other unlocked
11674      functions exist explicitly.  */
11675   tree const fn_fputc = unlocked ? built_in_decls[BUILT_IN_FPUTC_UNLOCKED]
11676     : implicit_built_in_decls[BUILT_IN_FPUTC];
11677   tree const fn_fwrite = unlocked ? built_in_decls[BUILT_IN_FWRITE_UNLOCKED]
11678     : implicit_built_in_decls[BUILT_IN_FWRITE];
11679
11680   /* If the return value is used, don't do the transformation.  */
11681   if (!ignore)
11682     return NULL_TREE;
11683
11684   /* Verify the arguments in the original call.  */
11685   if (!validate_arg (arg0, POINTER_TYPE)
11686       || !validate_arg (arg1, POINTER_TYPE))
11687     return NULL_TREE;
11688
11689   if (! len)
11690     len = c_strlen (arg0, 0);
11691
11692   /* Get the length of the string passed to fputs.  If the length
11693      can't be determined, punt.  */
11694   if (!len
11695       || TREE_CODE (len) != INTEGER_CST)
11696     return NULL_TREE;
11697
11698   switch (compare_tree_int (len, 1))
11699     {
11700     case -1: /* length is 0, delete the call entirely .  */
11701       return omit_one_operand_loc (loc, integer_type_node,
11702                                integer_zero_node, arg1);;
11703
11704     case 0: /* length is 1, call fputc.  */
11705       {
11706         const char *p = c_getstr (arg0);
11707
11708         if (p != NULL)
11709           {
11710             if (fn_fputc)
11711               return build_call_expr_loc (loc, fn_fputc, 2,
11712                                       build_int_cst (NULL_TREE, p[0]), arg1);
11713             else
11714               return NULL_TREE;
11715           }
11716       }
11717       /* FALLTHROUGH */
11718     case 1: /* length is greater than 1, call fwrite.  */
11719       {
11720         /* If optimizing for size keep fputs.  */
11721         if (optimize_function_for_size_p (cfun))
11722           return NULL_TREE;
11723         /* New argument list transforming fputs(string, stream) to
11724            fwrite(string, 1, len, stream).  */
11725         if (fn_fwrite)
11726           return build_call_expr_loc (loc, fn_fwrite, 4, arg0,
11727                                   size_one_node, len, arg1);
11728         else
11729           return NULL_TREE;
11730       }
11731     default:
11732       gcc_unreachable ();
11733     }
11734   return NULL_TREE;
11735 }
11736
11737 /* Fold the next_arg or va_start call EXP. Returns true if there was an error
11738    produced.  False otherwise.  This is done so that we don't output the error
11739    or warning twice or three times.  */
11740
11741 bool
11742 fold_builtin_next_arg (tree exp, bool va_start_p)
11743 {
11744   tree fntype = TREE_TYPE (current_function_decl);
11745   int nargs = call_expr_nargs (exp);
11746   tree arg;
11747
11748   if (!stdarg_p (fntype))
11749     {
11750       error ("%<va_start%> used in function with fixed args");
11751       return true;
11752     }
11753
11754   if (va_start_p)
11755     {
11756       if (va_start_p && (nargs != 2))
11757         {
11758           error ("wrong number of arguments to function %<va_start%>");
11759           return true;
11760         }
11761       arg = CALL_EXPR_ARG (exp, 1);
11762     }
11763   /* We use __builtin_va_start (ap, 0, 0) or __builtin_next_arg (0, 0)
11764      when we checked the arguments and if needed issued a warning.  */
11765   else
11766     {
11767       if (nargs == 0)
11768         {
11769           /* Evidently an out of date version of <stdarg.h>; can't validate
11770              va_start's second argument, but can still work as intended.  */
11771           warning (0, "%<__builtin_next_arg%> called without an argument");
11772           return true;
11773         }
11774       else if (nargs > 1)
11775         {
11776           error ("wrong number of arguments to function %<__builtin_next_arg%>");
11777           return true;
11778         }
11779       arg = CALL_EXPR_ARG (exp, 0);
11780     }
11781
11782   if (TREE_CODE (arg) == SSA_NAME)
11783     arg = SSA_NAME_VAR (arg);
11784
11785   /* We destructively modify the call to be __builtin_va_start (ap, 0)
11786      or __builtin_next_arg (0) the first time we see it, after checking
11787      the arguments and if needed issuing a warning.  */
11788   if (!integer_zerop (arg))
11789     {
11790       tree last_parm = tree_last (DECL_ARGUMENTS (current_function_decl));
11791
11792       /* Strip off all nops for the sake of the comparison.  This
11793          is not quite the same as STRIP_NOPS.  It does more.
11794          We must also strip off INDIRECT_EXPR for C++ reference
11795          parameters.  */
11796       while (CONVERT_EXPR_P (arg)
11797              || TREE_CODE (arg) == INDIRECT_REF)
11798         arg = TREE_OPERAND (arg, 0);
11799       if (arg != last_parm)
11800         {
11801           /* FIXME: Sometimes with the tree optimizers we can get the
11802              not the last argument even though the user used the last
11803              argument.  We just warn and set the arg to be the last
11804              argument so that we will get wrong-code because of
11805              it.  */
11806           warning (0, "second parameter of %<va_start%> not last named argument");
11807         }
11808
11809       /* Undefined by C99 7.15.1.4p4 (va_start):
11810          "If the parameter parmN is declared with the register storage
11811          class, with a function or array type, or with a type that is
11812          not compatible with the type that results after application of
11813          the default argument promotions, the behavior is undefined."
11814       */
11815       else if (DECL_REGISTER (arg))
11816         warning (0, "undefined behaviour when second parameter of "
11817                  "%<va_start%> is declared with %<register%> storage");
11818
11819       /* We want to verify the second parameter just once before the tree
11820          optimizers are run and then avoid keeping it in the tree,
11821          as otherwise we could warn even for correct code like:
11822          void foo (int i, ...)
11823          { va_list ap; i++; va_start (ap, i); va_end (ap); }  */
11824       if (va_start_p)
11825         CALL_EXPR_ARG (exp, 1) = integer_zero_node;
11826       else
11827         CALL_EXPR_ARG (exp, 0) = integer_zero_node;
11828     }
11829   return false;
11830 }
11831
11832
11833 /* Simplify a call to the sprintf builtin with arguments DEST, FMT, and ORIG.
11834    ORIG may be null if this is a 2-argument call.  We don't attempt to
11835    simplify calls with more than 3 arguments.
11836
11837    Return NULL_TREE if no simplification was possible, otherwise return the
11838    simplified form of the call as a tree.  If IGNORED is true, it means that
11839    the caller does not use the returned value of the function.  */
11840
11841 static tree
11842 fold_builtin_sprintf (location_t loc, tree dest, tree fmt,
11843                       tree orig, int ignored)
11844 {
11845   tree call, retval;
11846   const char *fmt_str = NULL;
11847
11848   /* Verify the required arguments in the original call.  We deal with two
11849      types of sprintf() calls: 'sprintf (str, fmt)' and
11850      'sprintf (dest, "%s", orig)'.  */
11851   if (!validate_arg (dest, POINTER_TYPE)
11852       || !validate_arg (fmt, POINTER_TYPE))
11853     return NULL_TREE;
11854   if (orig && !validate_arg (orig, POINTER_TYPE))
11855     return NULL_TREE;
11856
11857   /* Check whether the format is a literal string constant.  */
11858   fmt_str = c_getstr (fmt);
11859   if (fmt_str == NULL)
11860     return NULL_TREE;
11861
11862   call = NULL_TREE;
11863   retval = NULL_TREE;
11864
11865   if (!init_target_chars ())
11866     return NULL_TREE;
11867
11868   /* If the format doesn't contain % args or %%, use strcpy.  */
11869   if (strchr (fmt_str, target_percent) == NULL)
11870     {
11871       tree fn = implicit_built_in_decls[BUILT_IN_STRCPY];
11872
11873       if (!fn)
11874         return NULL_TREE;
11875
11876       /* Don't optimize sprintf (buf, "abc", ptr++).  */
11877       if (orig)
11878         return NULL_TREE;
11879
11880       /* Convert sprintf (str, fmt) into strcpy (str, fmt) when
11881          'format' is known to contain no % formats.  */
11882       call = build_call_expr_loc (loc, fn, 2, dest, fmt);
11883       if (!ignored)
11884         retval = build_int_cst (NULL_TREE, strlen (fmt_str));
11885     }
11886
11887   /* If the format is "%s", use strcpy if the result isn't used.  */
11888   else if (fmt_str && strcmp (fmt_str, target_percent_s) == 0)
11889     {
11890       tree fn;
11891       fn = implicit_built_in_decls[BUILT_IN_STRCPY];
11892
11893       if (!fn)
11894         return NULL_TREE;
11895
11896       /* Don't crash on sprintf (str1, "%s").  */
11897       if (!orig)
11898         return NULL_TREE;
11899
11900       /* Convert sprintf (str1, "%s", str2) into strcpy (str1, str2).  */
11901       if (!ignored)
11902         {
11903           retval = c_strlen (orig, 1);
11904           if (!retval || TREE_CODE (retval) != INTEGER_CST)
11905             return NULL_TREE;
11906         }
11907       call = build_call_expr_loc (loc, fn, 2, dest, orig);
11908     }
11909
11910   if (call && retval)
11911     {
11912       retval = fold_convert_loc
11913         (loc, TREE_TYPE (TREE_TYPE (implicit_built_in_decls[BUILT_IN_SPRINTF])),
11914          retval);
11915       return build2 (COMPOUND_EXPR, TREE_TYPE (retval), call, retval);
11916     }
11917   else
11918     return call;
11919 }
11920
11921 /* Expand a call EXP to __builtin_object_size.  */
11922
11923 rtx
11924 expand_builtin_object_size (tree exp)
11925 {
11926   tree ost;
11927   int object_size_type;
11928   tree fndecl = get_callee_fndecl (exp);
11929
11930   if (!validate_arglist (exp, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
11931     {
11932       error ("%Kfirst argument of %D must be a pointer, second integer constant",
11933              exp, fndecl);
11934       expand_builtin_trap ();
11935       return const0_rtx;
11936     }
11937
11938   ost = CALL_EXPR_ARG (exp, 1);
11939   STRIP_NOPS (ost);
11940
11941   if (TREE_CODE (ost) != INTEGER_CST
11942       || tree_int_cst_sgn (ost) < 0
11943       || compare_tree_int (ost, 3) > 0)
11944     {
11945       error ("%Klast argument of %D is not integer constant between 0 and 3",
11946              exp, fndecl);
11947       expand_builtin_trap ();
11948       return const0_rtx;
11949     }
11950
11951   object_size_type = tree_low_cst (ost, 0);
11952
11953   return object_size_type < 2 ? constm1_rtx : const0_rtx;
11954 }
11955
11956 /* Expand EXP, a call to the __mem{cpy,pcpy,move,set}_chk builtin.
11957    FCODE is the BUILT_IN_* to use.
11958    Return NULL_RTX if we failed; the caller should emit a normal call,
11959    otherwise try to get the result in TARGET, if convenient (and in
11960    mode MODE if that's convenient).  */
11961
11962 static rtx
11963 expand_builtin_memory_chk (tree exp, rtx target, enum machine_mode mode,
11964                            enum built_in_function fcode)
11965 {
11966   tree dest, src, len, size;
11967
11968   if (!validate_arglist (exp,
11969                          POINTER_TYPE,
11970                          fcode == BUILT_IN_MEMSET_CHK
11971                          ? INTEGER_TYPE : POINTER_TYPE,
11972                          INTEGER_TYPE, INTEGER_TYPE, VOID_TYPE))
11973     return NULL_RTX;
11974
11975   dest = CALL_EXPR_ARG (exp, 0);
11976   src = CALL_EXPR_ARG (exp, 1);
11977   len = CALL_EXPR_ARG (exp, 2);
11978   size = CALL_EXPR_ARG (exp, 3);
11979
11980   if (! host_integerp (size, 1))
11981     return NULL_RTX;
11982
11983   if (host_integerp (len, 1) || integer_all_onesp (size))
11984     {
11985       tree fn;
11986
11987       if (! integer_all_onesp (size) && tree_int_cst_lt (size, len))
11988         {
11989           warning_at (tree_nonartificial_location (exp),
11990                       0, "%Kcall to %D will always overflow destination buffer",
11991                       exp, get_callee_fndecl (exp));
11992           return NULL_RTX;
11993         }
11994
11995       fn = NULL_TREE;
11996       /* If __builtin_mem{cpy,pcpy,move,set}_chk is used, assume
11997          mem{cpy,pcpy,move,set} is available.  */
11998       switch (fcode)
11999         {
12000         case BUILT_IN_MEMCPY_CHK:
12001           fn = built_in_decls[BUILT_IN_MEMCPY];
12002           break;
12003         case BUILT_IN_MEMPCPY_CHK:
12004           fn = built_in_decls[BUILT_IN_MEMPCPY];
12005           break;
12006         case BUILT_IN_MEMMOVE_CHK:
12007           fn = built_in_decls[BUILT_IN_MEMMOVE];
12008           break;
12009         case BUILT_IN_MEMSET_CHK:
12010           fn = built_in_decls[BUILT_IN_MEMSET];
12011           break;
12012         default:
12013           break;
12014         }
12015
12016       if (! fn)
12017         return NULL_RTX;
12018
12019       fn = build_call_nofold_loc (EXPR_LOCATION (exp), fn, 3, dest, src, len);
12020       gcc_assert (TREE_CODE (fn) == CALL_EXPR);
12021       CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (exp);
12022       return expand_expr (fn, target, mode, EXPAND_NORMAL);
12023     }
12024   else if (fcode == BUILT_IN_MEMSET_CHK)
12025     return NULL_RTX;
12026   else
12027     {
12028       unsigned int dest_align
12029         = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
12030
12031       /* If DEST is not a pointer type, call the normal function.  */
12032       if (dest_align == 0)
12033         return NULL_RTX;
12034
12035       /* If SRC and DEST are the same (and not volatile), do nothing.  */
12036       if (operand_equal_p (src, dest, 0))
12037         {
12038           tree expr;
12039
12040           if (fcode != BUILT_IN_MEMPCPY_CHK)
12041             {
12042               /* Evaluate and ignore LEN in case it has side-effects.  */
12043               expand_expr (len, const0_rtx, VOIDmode, EXPAND_NORMAL);
12044               return expand_expr (dest, target, mode, EXPAND_NORMAL);
12045             }
12046
12047           expr = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len);
12048           return expand_expr (expr, target, mode, EXPAND_NORMAL);
12049         }
12050
12051       /* __memmove_chk special case.  */
12052       if (fcode == BUILT_IN_MEMMOVE_CHK)
12053         {
12054           unsigned int src_align
12055             = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
12056
12057           if (src_align == 0)
12058             return NULL_RTX;
12059
12060           /* If src is categorized for a readonly section we can use
12061              normal __memcpy_chk.  */
12062           if (readonly_data_expr (src))
12063             {
12064               tree fn = built_in_decls[BUILT_IN_MEMCPY_CHK];
12065               if (!fn)
12066                 return NULL_RTX;
12067               fn = build_call_nofold_loc (EXPR_LOCATION (exp), fn, 4,
12068                                           dest, src, len, size);
12069               gcc_assert (TREE_CODE (fn) == CALL_EXPR);
12070               CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (exp);
12071               return expand_expr (fn, target, mode, EXPAND_NORMAL);
12072             }
12073         }
12074       return NULL_RTX;
12075     }
12076 }
12077
12078 /* Emit warning if a buffer overflow is detected at compile time.  */
12079
12080 static void
12081 maybe_emit_chk_warning (tree exp, enum built_in_function fcode)
12082 {
12083   int is_strlen = 0;
12084   tree len, size;
12085   location_t loc = tree_nonartificial_location (exp);
12086
12087   switch (fcode)
12088     {
12089     case BUILT_IN_STRCPY_CHK:
12090     case BUILT_IN_STPCPY_CHK:
12091     /* For __strcat_chk the warning will be emitted only if overflowing
12092        by at least strlen (dest) + 1 bytes.  */
12093     case BUILT_IN_STRCAT_CHK:
12094       len = CALL_EXPR_ARG (exp, 1);
12095       size = CALL_EXPR_ARG (exp, 2);
12096       is_strlen = 1;
12097       break;
12098     case BUILT_IN_STRNCAT_CHK:
12099     case BUILT_IN_STRNCPY_CHK:
12100       len = CALL_EXPR_ARG (exp, 2);
12101       size = CALL_EXPR_ARG (exp, 3);
12102       break;
12103     case BUILT_IN_SNPRINTF_CHK:
12104     case BUILT_IN_VSNPRINTF_CHK:
12105       len = CALL_EXPR_ARG (exp, 1);
12106       size = CALL_EXPR_ARG (exp, 3);
12107       break;
12108     default:
12109       gcc_unreachable ();
12110     }
12111
12112   if (!len || !size)
12113     return;
12114
12115   if (! host_integerp (size, 1) || integer_all_onesp (size))
12116     return;
12117
12118   if (is_strlen)
12119     {
12120       len = c_strlen (len, 1);
12121       if (! len || ! host_integerp (len, 1) || tree_int_cst_lt (len, size))
12122         return;
12123     }
12124   else if (fcode == BUILT_IN_STRNCAT_CHK)
12125     {
12126       tree src = CALL_EXPR_ARG (exp, 1);
12127       if (! src || ! host_integerp (len, 1) || tree_int_cst_lt (len, size))
12128         return;
12129       src = c_strlen (src, 1);
12130       if (! src || ! host_integerp (src, 1))
12131         {
12132           warning_at (loc, 0, "%Kcall to %D might overflow destination buffer",
12133                       exp, get_callee_fndecl (exp));
12134           return;
12135         }
12136       else if (tree_int_cst_lt (src, size))
12137         return;
12138     }
12139   else if (! host_integerp (len, 1) || ! tree_int_cst_lt (size, len))
12140     return;
12141
12142   warning_at (loc, 0, "%Kcall to %D will always overflow destination buffer",
12143               exp, get_callee_fndecl (exp));
12144 }
12145
12146 /* Emit warning if a buffer overflow is detected at compile time
12147    in __sprintf_chk/__vsprintf_chk calls.  */
12148
12149 static void
12150 maybe_emit_sprintf_chk_warning (tree exp, enum built_in_function fcode)
12151 {
12152   tree size, len, fmt;
12153   const char *fmt_str;
12154   int nargs = call_expr_nargs (exp);
12155
12156   /* Verify the required arguments in the original call.  */
12157
12158   if (nargs < 4)
12159     return;
12160   size = CALL_EXPR_ARG (exp, 2);
12161   fmt = CALL_EXPR_ARG (exp, 3);
12162
12163   if (! host_integerp (size, 1) || integer_all_onesp (size))
12164     return;
12165
12166   /* Check whether the format is a literal string constant.  */
12167   fmt_str = c_getstr (fmt);
12168   if (fmt_str == NULL)
12169     return;
12170
12171   if (!init_target_chars ())
12172     return;
12173
12174   /* If the format doesn't contain % args or %%, we know its size.  */
12175   if (strchr (fmt_str, target_percent) == 0)
12176     len = build_int_cstu (size_type_node, strlen (fmt_str));
12177   /* If the format is "%s" and first ... argument is a string literal,
12178      we know it too.  */
12179   else if (fcode == BUILT_IN_SPRINTF_CHK
12180            && strcmp (fmt_str, target_percent_s) == 0)
12181     {
12182       tree arg;
12183
12184       if (nargs < 5)
12185         return;
12186       arg = CALL_EXPR_ARG (exp, 4);
12187       if (! POINTER_TYPE_P (TREE_TYPE (arg)))
12188         return;
12189
12190       len = c_strlen (arg, 1);
12191       if (!len || ! host_integerp (len, 1))
12192         return;
12193     }
12194   else
12195     return;
12196
12197   if (! tree_int_cst_lt (len, size))
12198     warning_at (tree_nonartificial_location (exp),
12199                 0, "%Kcall to %D will always overflow destination buffer",
12200                 exp, get_callee_fndecl (exp));
12201 }
12202
12203 /* Emit warning if a free is called with address of a variable.  */
12204
12205 static void
12206 maybe_emit_free_warning (tree exp)
12207 {
12208   tree arg = CALL_EXPR_ARG (exp, 0);
12209
12210   STRIP_NOPS (arg);
12211   if (TREE_CODE (arg) != ADDR_EXPR)
12212     return;
12213
12214   arg = get_base_address (TREE_OPERAND (arg, 0));
12215   if (arg == NULL || INDIRECT_REF_P (arg) || TREE_CODE (arg) == MEM_REF)
12216     return;
12217
12218   if (SSA_VAR_P (arg))
12219     warning_at (tree_nonartificial_location (exp),
12220                 0, "%Kattempt to free a non-heap object %qD", exp, arg);
12221   else
12222     warning_at (tree_nonartificial_location (exp),
12223                 0, "%Kattempt to free a non-heap object", exp);
12224 }
12225
12226 /* Fold a call to __builtin_object_size with arguments PTR and OST,
12227    if possible.  */
12228
12229 tree
12230 fold_builtin_object_size (tree ptr, tree ost)
12231 {
12232   unsigned HOST_WIDE_INT bytes;
12233   int object_size_type;
12234
12235   if (!validate_arg (ptr, POINTER_TYPE)
12236       || !validate_arg (ost, INTEGER_TYPE))
12237     return NULL_TREE;
12238
12239   STRIP_NOPS (ost);
12240
12241   if (TREE_CODE (ost) != INTEGER_CST
12242       || tree_int_cst_sgn (ost) < 0
12243       || compare_tree_int (ost, 3) > 0)
12244     return NULL_TREE;
12245
12246   object_size_type = tree_low_cst (ost, 0);
12247
12248   /* __builtin_object_size doesn't evaluate side-effects in its arguments;
12249      if there are any side-effects, it returns (size_t) -1 for types 0 and 1
12250      and (size_t) 0 for types 2 and 3.  */
12251   if (TREE_SIDE_EFFECTS (ptr))
12252     return build_int_cst_type (size_type_node, object_size_type < 2 ? -1 : 0);
12253
12254   if (TREE_CODE (ptr) == ADDR_EXPR)
12255     {
12256       bytes = compute_builtin_object_size (ptr, object_size_type);
12257       if (double_int_fits_to_tree_p (size_type_node,
12258                                      uhwi_to_double_int (bytes)))
12259         return build_int_cstu (size_type_node, bytes);
12260     }
12261   else if (TREE_CODE (ptr) == SSA_NAME)
12262     {
12263       /* If object size is not known yet, delay folding until
12264        later.  Maybe subsequent passes will help determining
12265        it.  */
12266       bytes = compute_builtin_object_size (ptr, object_size_type);
12267       if (bytes != (unsigned HOST_WIDE_INT) (object_size_type < 2 ? -1 : 0)
12268           && double_int_fits_to_tree_p (size_type_node,
12269                                         uhwi_to_double_int (bytes)))
12270         return build_int_cstu (size_type_node, bytes);
12271     }
12272
12273   return NULL_TREE;
12274 }
12275
12276 /* Fold a call to the __mem{cpy,pcpy,move,set}_chk builtin.
12277    DEST, SRC, LEN, and SIZE are the arguments to the call.
12278    IGNORE is true, if return value can be ignored.  FCODE is the BUILT_IN_*
12279    code of the builtin.  If MAXLEN is not NULL, it is maximum length
12280    passed as third argument.  */
12281
12282 tree
12283 fold_builtin_memory_chk (location_t loc, tree fndecl,
12284                          tree dest, tree src, tree len, tree size,
12285                          tree maxlen, bool ignore,
12286                          enum built_in_function fcode)
12287 {
12288   tree fn;
12289
12290   if (!validate_arg (dest, POINTER_TYPE)
12291       || !validate_arg (src,
12292                         (fcode == BUILT_IN_MEMSET_CHK
12293                          ? INTEGER_TYPE : POINTER_TYPE))
12294       || !validate_arg (len, INTEGER_TYPE)
12295       || !validate_arg (size, INTEGER_TYPE))
12296     return NULL_TREE;
12297
12298   /* If SRC and DEST are the same (and not volatile), return DEST
12299      (resp. DEST+LEN for __mempcpy_chk).  */
12300   if (fcode != BUILT_IN_MEMSET_CHK && operand_equal_p (src, dest, 0))
12301     {
12302       if (fcode != BUILT_IN_MEMPCPY_CHK)
12303         return omit_one_operand_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)),
12304                                  dest, len);
12305       else
12306         {
12307           tree temp = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (dest),
12308                                    dest, len);
12309           return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), temp);
12310         }
12311     }
12312
12313   if (! host_integerp (size, 1))
12314     return NULL_TREE;
12315
12316   if (! integer_all_onesp (size))
12317     {
12318       if (! host_integerp (len, 1))
12319         {
12320           /* If LEN is not constant, try MAXLEN too.
12321              For MAXLEN only allow optimizing into non-_ocs function
12322              if SIZE is >= MAXLEN, never convert to __ocs_fail ().  */
12323           if (maxlen == NULL_TREE || ! host_integerp (maxlen, 1))
12324             {
12325               if (fcode == BUILT_IN_MEMPCPY_CHK && ignore)
12326                 {
12327                   /* (void) __mempcpy_chk () can be optimized into
12328                      (void) __memcpy_chk ().  */
12329                   fn = built_in_decls[BUILT_IN_MEMCPY_CHK];
12330                   if (!fn)
12331                     return NULL_TREE;
12332
12333                   return build_call_expr_loc (loc, fn, 4, dest, src, len, size);
12334                 }
12335               return NULL_TREE;
12336             }
12337         }
12338       else
12339         maxlen = len;
12340
12341       if (tree_int_cst_lt (size, maxlen))
12342         return NULL_TREE;
12343     }
12344
12345   fn = NULL_TREE;
12346   /* If __builtin_mem{cpy,pcpy,move,set}_chk is used, assume
12347      mem{cpy,pcpy,move,set} is available.  */
12348   switch (fcode)
12349     {
12350     case BUILT_IN_MEMCPY_CHK:
12351       fn = built_in_decls[BUILT_IN_MEMCPY];
12352       break;
12353     case BUILT_IN_MEMPCPY_CHK:
12354       fn = built_in_decls[BUILT_IN_MEMPCPY];
12355       break;
12356     case BUILT_IN_MEMMOVE_CHK:
12357       fn = built_in_decls[BUILT_IN_MEMMOVE];
12358       break;
12359     case BUILT_IN_MEMSET_CHK:
12360       fn = built_in_decls[BUILT_IN_MEMSET];
12361       break;
12362     default:
12363       break;
12364     }
12365
12366   if (!fn)
12367     return NULL_TREE;
12368
12369   return build_call_expr_loc (loc, fn, 3, dest, src, len);
12370 }
12371
12372 /* Fold a call to the __st[rp]cpy_chk builtin.
12373    DEST, SRC, and SIZE are the arguments to the call.
12374    IGNORE is true if return value can be ignored.  FCODE is the BUILT_IN_*
12375    code of the builtin.  If MAXLEN is not NULL, it is maximum length of
12376    strings passed as second argument.  */
12377
12378 tree
12379 fold_builtin_stxcpy_chk (location_t loc, tree fndecl, tree dest,
12380                          tree src, tree size,
12381                          tree maxlen, bool ignore,
12382                          enum built_in_function fcode)
12383 {
12384   tree len, fn;
12385
12386   if (!validate_arg (dest, POINTER_TYPE)
12387       || !validate_arg (src, POINTER_TYPE)
12388       || !validate_arg (size, INTEGER_TYPE))
12389     return NULL_TREE;
12390
12391   /* If SRC and DEST are the same (and not volatile), return DEST.  */
12392   if (fcode == BUILT_IN_STRCPY_CHK && operand_equal_p (src, dest, 0))
12393     return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest);
12394
12395   if (! host_integerp (size, 1))
12396     return NULL_TREE;
12397
12398   if (! integer_all_onesp (size))
12399     {
12400       len = c_strlen (src, 1);
12401       if (! len || ! host_integerp (len, 1))
12402         {
12403           /* If LEN is not constant, try MAXLEN too.
12404              For MAXLEN only allow optimizing into non-_ocs function
12405              if SIZE is >= MAXLEN, never convert to __ocs_fail ().  */
12406           if (maxlen == NULL_TREE || ! host_integerp (maxlen, 1))
12407             {
12408               if (fcode == BUILT_IN_STPCPY_CHK)
12409                 {
12410                   if (! ignore)
12411                     return NULL_TREE;
12412
12413                   /* If return value of __stpcpy_chk is ignored,
12414                      optimize into __strcpy_chk.  */
12415                   fn = built_in_decls[BUILT_IN_STRCPY_CHK];
12416                   if (!fn)
12417                     return NULL_TREE;
12418
12419                   return build_call_expr_loc (loc, fn, 3, dest, src, size);
12420                 }
12421
12422               if (! len || TREE_SIDE_EFFECTS (len))
12423                 return NULL_TREE;
12424
12425               /* If c_strlen returned something, but not a constant,
12426                  transform __strcpy_chk into __memcpy_chk.  */
12427               fn = built_in_decls[BUILT_IN_MEMCPY_CHK];
12428               if (!fn)
12429                 return NULL_TREE;
12430
12431               len = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
12432               return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)),
12433                                        build_call_expr_loc (loc, fn, 4,
12434                                                         dest, src, len, size));
12435             }
12436         }
12437       else
12438         maxlen = len;
12439
12440       if (! tree_int_cst_lt (maxlen, size))
12441         return NULL_TREE;
12442     }
12443
12444   /* If __builtin_st{r,p}cpy_chk is used, assume st{r,p}cpy is available.  */
12445   fn = built_in_decls[fcode == BUILT_IN_STPCPY_CHK
12446                       ? BUILT_IN_STPCPY : BUILT_IN_STRCPY];
12447   if (!fn)
12448     return NULL_TREE;
12449
12450   return build_call_expr_loc (loc, fn, 2, dest, src);
12451 }
12452
12453 /* Fold a call to the __strncpy_chk builtin.  DEST, SRC, LEN, and SIZE
12454    are the arguments to the call.  If MAXLEN is not NULL, it is maximum
12455    length passed as third argument.  */
12456
12457 tree
12458 fold_builtin_strncpy_chk (location_t loc, tree dest, tree src,
12459                           tree len, tree size, tree maxlen)
12460 {
12461   tree fn;
12462
12463   if (!validate_arg (dest, POINTER_TYPE)
12464       || !validate_arg (src, POINTER_TYPE)
12465       || !validate_arg (len, INTEGER_TYPE)
12466       || !validate_arg (size, INTEGER_TYPE))
12467     return NULL_TREE;
12468
12469   if (! host_integerp (size, 1))
12470     return NULL_TREE;
12471
12472   if (! integer_all_onesp (size))
12473     {
12474       if (! host_integerp (len, 1))
12475         {
12476           /* If LEN is not constant, try MAXLEN too.
12477              For MAXLEN only allow optimizing into non-_ocs function
12478              if SIZE is >= MAXLEN, never convert to __ocs_fail ().  */
12479           if (maxlen == NULL_TREE || ! host_integerp (maxlen, 1))
12480             return NULL_TREE;
12481         }
12482       else
12483         maxlen = len;
12484
12485       if (tree_int_cst_lt (size, maxlen))
12486         return NULL_TREE;
12487     }
12488
12489   /* If __builtin_strncpy_chk is used, assume strncpy is available.  */
12490   fn = built_in_decls[BUILT_IN_STRNCPY];
12491   if (!fn)
12492     return NULL_TREE;
12493
12494   return build_call_expr_loc (loc, fn, 3, dest, src, len);
12495 }
12496
12497 /* Fold a call to the __strcat_chk builtin FNDECL.  DEST, SRC, and SIZE
12498    are the arguments to the call.  */
12499
12500 static tree
12501 fold_builtin_strcat_chk (location_t loc, tree fndecl, tree dest,
12502                          tree src, tree size)
12503 {
12504   tree fn;
12505   const char *p;
12506
12507   if (!validate_arg (dest, POINTER_TYPE)
12508       || !validate_arg (src, POINTER_TYPE)
12509       || !validate_arg (size, INTEGER_TYPE))
12510     return NULL_TREE;
12511
12512   p = c_getstr (src);
12513   /* If the SRC parameter is "", return DEST.  */
12514   if (p && *p == '\0')
12515     return omit_one_operand_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest, src);
12516
12517   if (! host_integerp (size, 1) || ! integer_all_onesp (size))
12518     return NULL_TREE;
12519
12520   /* If __builtin_strcat_chk is used, assume strcat is available.  */
12521   fn = built_in_decls[BUILT_IN_STRCAT];
12522   if (!fn)
12523     return NULL_TREE;
12524
12525   return build_call_expr_loc (loc, fn, 2, dest, src);
12526 }
12527
12528 /* Fold a call to the __strncat_chk builtin with arguments DEST, SRC,
12529    LEN, and SIZE.  */
12530
12531 static tree
12532 fold_builtin_strncat_chk (location_t loc, tree fndecl,
12533                           tree dest, tree src, tree len, tree size)
12534 {
12535   tree fn;
12536   const char *p;
12537
12538   if (!validate_arg (dest, POINTER_TYPE)
12539       || !validate_arg (src, POINTER_TYPE)
12540       || !validate_arg (size, INTEGER_TYPE)
12541       || !validate_arg (size, INTEGER_TYPE))
12542     return NULL_TREE;
12543
12544   p = c_getstr (src);
12545   /* If the SRC parameter is "" or if LEN is 0, return DEST.  */
12546   if (p && *p == '\0')
12547     return omit_one_operand_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest, len);
12548   else if (integer_zerop (len))
12549     return omit_one_operand_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest, src);
12550
12551   if (! host_integerp (size, 1))
12552     return NULL_TREE;
12553
12554   if (! integer_all_onesp (size))
12555     {
12556       tree src_len = c_strlen (src, 1);
12557       if (src_len
12558           && host_integerp (src_len, 1)
12559           && host_integerp (len, 1)
12560           && ! tree_int_cst_lt (len, src_len))
12561         {
12562           /* If LEN >= strlen (SRC), optimize into __strcat_chk.  */
12563           fn = built_in_decls[BUILT_IN_STRCAT_CHK];
12564           if (!fn)
12565             return NULL_TREE;
12566
12567           return build_call_expr_loc (loc, fn, 3, dest, src, size);
12568         }
12569       return NULL_TREE;
12570     }
12571
12572   /* If __builtin_strncat_chk is used, assume strncat is available.  */
12573   fn = built_in_decls[BUILT_IN_STRNCAT];
12574   if (!fn)
12575     return NULL_TREE;
12576
12577   return build_call_expr_loc (loc, fn, 3, dest, src, len);
12578 }
12579
12580 /* Fold a call EXP to __{,v}sprintf_chk having NARGS passed as ARGS.
12581    Return NULL_TREE if a normal call should be emitted rather than
12582    expanding the function inline.  FCODE is either BUILT_IN_SPRINTF_CHK
12583    or BUILT_IN_VSPRINTF_CHK.  */
12584
12585 static tree
12586 fold_builtin_sprintf_chk_1 (location_t loc, int nargs, tree *args,
12587                             enum built_in_function fcode)
12588 {
12589   tree dest, size, len, fn, fmt, flag;
12590   const char *fmt_str;
12591
12592   /* Verify the required arguments in the original call.  */
12593   if (nargs < 4)
12594     return NULL_TREE;
12595   dest = args[0];
12596   if (!validate_arg (dest, POINTER_TYPE))
12597     return NULL_TREE;
12598   flag = args[1];
12599   if (!validate_arg (flag, INTEGER_TYPE))
12600     return NULL_TREE;
12601   size = args[2];
12602   if (!validate_arg (size, INTEGER_TYPE))
12603     return NULL_TREE;
12604   fmt = args[3];
12605   if (!validate_arg (fmt, POINTER_TYPE))
12606     return NULL_TREE;
12607
12608   if (! host_integerp (size, 1))
12609     return NULL_TREE;
12610
12611   len = NULL_TREE;
12612
12613   if (!init_target_chars ())
12614     return NULL_TREE;
12615
12616   /* Check whether the format is a literal string constant.  */
12617   fmt_str = c_getstr (fmt);
12618   if (fmt_str != NULL)
12619     {
12620       /* If the format doesn't contain % args or %%, we know the size.  */
12621       if (strchr (fmt_str, target_percent) == 0)
12622         {
12623           if (fcode != BUILT_IN_SPRINTF_CHK || nargs == 4)
12624             len = build_int_cstu (size_type_node, strlen (fmt_str));
12625         }
12626       /* If the format is "%s" and first ... argument is a string literal,
12627          we know the size too.  */
12628       else if (fcode == BUILT_IN_SPRINTF_CHK
12629                && strcmp (fmt_str, target_percent_s) == 0)
12630         {
12631           tree arg;
12632
12633           if (nargs == 5)
12634             {
12635               arg = args[4];
12636               if (validate_arg (arg, POINTER_TYPE))
12637                 {
12638                   len = c_strlen (arg, 1);
12639                   if (! len || ! host_integerp (len, 1))
12640                     len = NULL_TREE;
12641                 }
12642             }
12643         }
12644     }
12645
12646   if (! integer_all_onesp (size))
12647     {
12648       if (! len || ! tree_int_cst_lt (len, size))
12649         return NULL_TREE;
12650     }
12651
12652   /* Only convert __{,v}sprintf_chk to {,v}sprintf if flag is 0
12653      or if format doesn't contain % chars or is "%s".  */
12654   if (! integer_zerop (flag))
12655     {
12656       if (fmt_str == NULL)
12657         return NULL_TREE;
12658       if (strchr (fmt_str, target_percent) != NULL
12659           && strcmp (fmt_str, target_percent_s))
12660         return NULL_TREE;
12661     }
12662
12663   /* If __builtin_{,v}sprintf_chk is used, assume {,v}sprintf is available.  */
12664   fn = built_in_decls[fcode == BUILT_IN_VSPRINTF_CHK
12665                       ? BUILT_IN_VSPRINTF : BUILT_IN_SPRINTF];
12666   if (!fn)
12667     return NULL_TREE;
12668
12669   return rewrite_call_expr_array (loc, nargs, args, 4, fn, 2, dest, fmt);
12670 }
12671
12672 /* Fold a call EXP to __{,v}sprintf_chk.  Return NULL_TREE if
12673    a normal call should be emitted rather than expanding the function
12674    inline.  FCODE is either BUILT_IN_SPRINTF_CHK or BUILT_IN_VSPRINTF_CHK.  */
12675
12676 static tree
12677 fold_builtin_sprintf_chk (location_t loc, tree exp,
12678                           enum built_in_function fcode)
12679 {
12680   return fold_builtin_sprintf_chk_1 (loc, call_expr_nargs (exp),
12681                                      CALL_EXPR_ARGP (exp), fcode);
12682 }
12683
12684 /* Fold a call EXP to {,v}snprintf having NARGS passed as ARGS.  Return
12685    NULL_TREE if a normal call should be emitted rather than expanding
12686    the function inline.  FCODE is either BUILT_IN_SNPRINTF_CHK or
12687    BUILT_IN_VSNPRINTF_CHK.  If MAXLEN is not NULL, it is maximum length
12688    passed as second argument.  */
12689
12690 static tree
12691 fold_builtin_snprintf_chk_1 (location_t loc, int nargs, tree *args,
12692                              tree maxlen, enum built_in_function fcode)
12693 {
12694   tree dest, size, len, fn, fmt, flag;
12695   const char *fmt_str;
12696
12697   /* Verify the required arguments in the original call.  */
12698   if (nargs < 5)
12699     return NULL_TREE;
12700   dest = args[0];
12701   if (!validate_arg (dest, POINTER_TYPE))
12702     return NULL_TREE;
12703   len = args[1];
12704   if (!validate_arg (len, INTEGER_TYPE))
12705     return NULL_TREE;
12706   flag = args[2];
12707   if (!validate_arg (flag, INTEGER_TYPE))
12708     return NULL_TREE;
12709   size = args[3];
12710   if (!validate_arg (size, INTEGER_TYPE))
12711     return NULL_TREE;
12712   fmt = args[4];
12713   if (!validate_arg (fmt, POINTER_TYPE))
12714     return NULL_TREE;
12715
12716   if (! host_integerp (size, 1))
12717     return NULL_TREE;
12718
12719   if (! integer_all_onesp (size))
12720     {
12721       if (! host_integerp (len, 1))
12722         {
12723           /* If LEN is not constant, try MAXLEN too.
12724              For MAXLEN only allow optimizing into non-_ocs function
12725              if SIZE is >= MAXLEN, never convert to __ocs_fail ().  */
12726           if (maxlen == NULL_TREE || ! host_integerp (maxlen, 1))
12727             return NULL_TREE;
12728         }
12729       else
12730         maxlen = len;
12731
12732       if (tree_int_cst_lt (size, maxlen))
12733         return NULL_TREE;
12734     }
12735
12736   if (!init_target_chars ())
12737     return NULL_TREE;
12738
12739   /* Only convert __{,v}snprintf_chk to {,v}snprintf if flag is 0
12740      or if format doesn't contain % chars or is "%s".  */
12741   if (! integer_zerop (flag))
12742     {
12743       fmt_str = c_getstr (fmt);
12744       if (fmt_str == NULL)
12745         return NULL_TREE;
12746       if (strchr (fmt_str, target_percent) != NULL
12747           && strcmp (fmt_str, target_percent_s))
12748         return NULL_TREE;
12749     }
12750
12751   /* If __builtin_{,v}snprintf_chk is used, assume {,v}snprintf is
12752      available.  */
12753   fn = built_in_decls[fcode == BUILT_IN_VSNPRINTF_CHK
12754                       ? BUILT_IN_VSNPRINTF : BUILT_IN_SNPRINTF];
12755   if (!fn)
12756     return NULL_TREE;
12757
12758   return rewrite_call_expr_array (loc, nargs, args, 5, fn, 3, dest, len, fmt);
12759 }
12760
12761 /* Fold a call EXP to {,v}snprintf.  Return NULL_TREE if
12762    a normal call should be emitted rather than expanding the function
12763    inline.  FCODE is either BUILT_IN_SNPRINTF_CHK or
12764    BUILT_IN_VSNPRINTF_CHK.  If MAXLEN is not NULL, it is maximum length
12765    passed as second argument.  */
12766
12767 tree
12768 fold_builtin_snprintf_chk (location_t loc, tree exp, tree maxlen,
12769                            enum built_in_function fcode)
12770 {
12771   return fold_builtin_snprintf_chk_1 (loc, call_expr_nargs (exp),
12772                                       CALL_EXPR_ARGP (exp), maxlen, fcode);
12773 }
12774
12775 /* Fold a call to the {,v}printf{,_unlocked} and __{,v}printf_chk builtins.
12776    FMT and ARG are the arguments to the call; we don't fold cases with
12777    more than 2 arguments, and ARG may be null if this is a 1-argument case.
12778
12779    Return NULL_TREE if no simplification was possible, otherwise return the
12780    simplified form of the call as a tree.  FCODE is the BUILT_IN_*
12781    code of the function to be simplified.  */
12782
12783 static tree
12784 fold_builtin_printf (location_t loc, tree fndecl, tree fmt,
12785                      tree arg, bool ignore,
12786                      enum built_in_function fcode)
12787 {
12788   tree fn_putchar, fn_puts, newarg, call = NULL_TREE;
12789   const char *fmt_str = NULL;
12790
12791   /* If the return value is used, don't do the transformation.  */
12792   if (! ignore)
12793     return NULL_TREE;
12794
12795   /* Verify the required arguments in the original call.  */
12796   if (!validate_arg (fmt, POINTER_TYPE))
12797     return NULL_TREE;
12798
12799   /* Check whether the format is a literal string constant.  */
12800   fmt_str = c_getstr (fmt);
12801   if (fmt_str == NULL)
12802     return NULL_TREE;
12803
12804   if (fcode == BUILT_IN_PRINTF_UNLOCKED)
12805     {
12806       /* If we're using an unlocked function, assume the other
12807          unlocked functions exist explicitly.  */
12808       fn_putchar = built_in_decls[BUILT_IN_PUTCHAR_UNLOCKED];
12809       fn_puts = built_in_decls[BUILT_IN_PUTS_UNLOCKED];
12810     }
12811   else
12812     {
12813       fn_putchar = implicit_built_in_decls[BUILT_IN_PUTCHAR];
12814       fn_puts = implicit_built_in_decls[BUILT_IN_PUTS];
12815     }
12816
12817   if (!init_target_chars ())
12818     return NULL_TREE;
12819
12820   if (strcmp (fmt_str, target_percent_s) == 0
12821       || strchr (fmt_str, target_percent) == NULL)
12822     {
12823       const char *str;
12824
12825       if (strcmp (fmt_str, target_percent_s) == 0)
12826         {
12827           if (fcode == BUILT_IN_VPRINTF || fcode == BUILT_IN_VPRINTF_CHK)
12828             return NULL_TREE;
12829
12830           if (!arg || !validate_arg (arg, POINTER_TYPE))
12831             return NULL_TREE;
12832
12833           str = c_getstr (arg);
12834           if (str == NULL)
12835             return NULL_TREE;
12836         }
12837       else
12838         {
12839           /* The format specifier doesn't contain any '%' characters.  */
12840           if (fcode != BUILT_IN_VPRINTF && fcode != BUILT_IN_VPRINTF_CHK
12841               && arg)
12842             return NULL_TREE;
12843           str = fmt_str;
12844         }
12845
12846       /* If the string was "", printf does nothing.  */
12847       if (str[0] == '\0')
12848         return build_int_cst (TREE_TYPE (TREE_TYPE (fndecl)), 0);
12849
12850       /* If the string has length of 1, call putchar.  */
12851       if (str[1] == '\0')
12852         {
12853           /* Given printf("c"), (where c is any one character,)
12854              convert "c"[0] to an int and pass that to the replacement
12855              function.  */
12856           newarg = build_int_cst (NULL_TREE, str[0]);
12857           if (fn_putchar)
12858             call = build_call_expr_loc (loc, fn_putchar, 1, newarg);
12859         }
12860       else
12861         {
12862           /* If the string was "string\n", call puts("string").  */
12863           size_t len = strlen (str);
12864           if ((unsigned char)str[len - 1] == target_newline
12865               && (size_t) (int) len == len
12866               && (int) len > 0)
12867             {
12868               char *newstr;
12869               tree offset_node, string_cst;
12870
12871               /* Create a NUL-terminated string that's one char shorter
12872                  than the original, stripping off the trailing '\n'.  */
12873               newarg = build_string_literal (len, str);
12874               string_cst = string_constant (newarg, &offset_node);
12875               gcc_checking_assert (string_cst
12876                                    && (TREE_STRING_LENGTH (string_cst)
12877                                        == (int) len)
12878                                    && integer_zerop (offset_node)
12879                                    && (unsigned char)
12880                                       TREE_STRING_POINTER (string_cst)[len - 1]
12881                                       == target_newline);
12882               /* build_string_literal creates a new STRING_CST,
12883                  modify it in place to avoid double copying.  */
12884               newstr = CONST_CAST (char *, TREE_STRING_POINTER (string_cst));
12885               newstr[len - 1] = '\0';
12886               if (fn_puts)
12887                 call = build_call_expr_loc (loc, fn_puts, 1, newarg);
12888             }
12889           else
12890             /* We'd like to arrange to call fputs(string,stdout) here,
12891                but we need stdout and don't have a way to get it yet.  */
12892             return NULL_TREE;
12893         }
12894     }
12895
12896   /* The other optimizations can be done only on the non-va_list variants.  */
12897   else if (fcode == BUILT_IN_VPRINTF || fcode == BUILT_IN_VPRINTF_CHK)
12898     return NULL_TREE;
12899
12900   /* If the format specifier was "%s\n", call __builtin_puts(arg).  */
12901   else if (strcmp (fmt_str, target_percent_s_newline) == 0)
12902     {
12903       if (!arg || !validate_arg (arg, POINTER_TYPE))
12904         return NULL_TREE;
12905       if (fn_puts)
12906         call = build_call_expr_loc (loc, fn_puts, 1, arg);
12907     }
12908
12909   /* If the format specifier was "%c", call __builtin_putchar(arg).  */
12910   else if (strcmp (fmt_str, target_percent_c) == 0)
12911     {
12912       if (!arg || !validate_arg (arg, INTEGER_TYPE))
12913         return NULL_TREE;
12914       if (fn_putchar)
12915         call = build_call_expr_loc (loc, fn_putchar, 1, arg);
12916     }
12917
12918   if (!call)
12919     return NULL_TREE;
12920
12921   return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), call);
12922 }
12923
12924 /* Fold a call to the {,v}fprintf{,_unlocked} and __{,v}printf_chk builtins.
12925    FP, FMT, and ARG are the arguments to the call.  We don't fold calls with
12926    more than 3 arguments, and ARG may be null in the 2-argument case.
12927
12928    Return NULL_TREE if no simplification was possible, otherwise return the
12929    simplified form of the call as a tree.  FCODE is the BUILT_IN_*
12930    code of the function to be simplified.  */
12931
12932 static tree
12933 fold_builtin_fprintf (location_t loc, tree fndecl, tree fp,
12934                       tree fmt, tree arg, bool ignore,
12935                       enum built_in_function fcode)
12936 {
12937   tree fn_fputc, fn_fputs, call = NULL_TREE;
12938   const char *fmt_str = NULL;
12939
12940   /* If the return value is used, don't do the transformation.  */
12941   if (! ignore)
12942     return NULL_TREE;
12943
12944   /* Verify the required arguments in the original call.  */
12945   if (!validate_arg (fp, POINTER_TYPE))
12946     return NULL_TREE;
12947   if (!validate_arg (fmt, POINTER_TYPE))
12948     return NULL_TREE;
12949
12950   /* Check whether the format is a literal string constant.  */
12951   fmt_str = c_getstr (fmt);
12952   if (fmt_str == NULL)
12953     return NULL_TREE;
12954
12955   if (fcode == BUILT_IN_FPRINTF_UNLOCKED)
12956     {
12957       /* If we're using an unlocked function, assume the other
12958          unlocked functions exist explicitly.  */
12959       fn_fputc = built_in_decls[BUILT_IN_FPUTC_UNLOCKED];
12960       fn_fputs = built_in_decls[BUILT_IN_FPUTS_UNLOCKED];
12961     }
12962   else
12963     {
12964       fn_fputc = implicit_built_in_decls[BUILT_IN_FPUTC];
12965       fn_fputs = implicit_built_in_decls[BUILT_IN_FPUTS];
12966     }
12967
12968   if (!init_target_chars ())
12969     return NULL_TREE;
12970
12971   /* If the format doesn't contain % args or %%, use strcpy.  */
12972   if (strchr (fmt_str, target_percent) == NULL)
12973     {
12974       if (fcode != BUILT_IN_VFPRINTF && fcode != BUILT_IN_VFPRINTF_CHK
12975           && arg)
12976         return NULL_TREE;
12977
12978       /* If the format specifier was "", fprintf does nothing.  */
12979       if (fmt_str[0] == '\0')
12980         {
12981           /* If FP has side-effects, just wait until gimplification is
12982              done.  */
12983           if (TREE_SIDE_EFFECTS (fp))
12984             return NULL_TREE;
12985
12986           return build_int_cst (TREE_TYPE (TREE_TYPE (fndecl)), 0);
12987         }
12988
12989       /* When "string" doesn't contain %, replace all cases of
12990          fprintf (fp, string) with fputs (string, fp).  The fputs
12991          builtin will take care of special cases like length == 1.  */
12992       if (fn_fputs)
12993         call = build_call_expr_loc (loc, fn_fputs, 2, fmt, fp);
12994     }
12995
12996   /* The other optimizations can be done only on the non-va_list variants.  */
12997   else if (fcode == BUILT_IN_VFPRINTF || fcode == BUILT_IN_VFPRINTF_CHK)
12998     return NULL_TREE;
12999
13000   /* If the format specifier was "%s", call __builtin_fputs (arg, fp).  */
13001   else if (strcmp (fmt_str, target_percent_s) == 0)
13002     {
13003       if (!arg || !validate_arg (arg, POINTER_TYPE))
13004         return NULL_TREE;
13005       if (fn_fputs)
13006         call = build_call_expr_loc (loc, fn_fputs, 2, arg, fp);
13007     }
13008
13009   /* If the format specifier was "%c", call __builtin_fputc (arg, fp).  */
13010   else if (strcmp (fmt_str, target_percent_c) == 0)
13011     {
13012       if (!arg || !validate_arg (arg, INTEGER_TYPE))
13013         return NULL_TREE;
13014       if (fn_fputc)
13015         call = build_call_expr_loc (loc, fn_fputc, 2, arg, fp);
13016     }
13017
13018   if (!call)
13019     return NULL_TREE;
13020   return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), call);
13021 }
13022
13023 /* Initialize format string characters in the target charset.  */
13024
13025 static bool
13026 init_target_chars (void)
13027 {
13028   static bool init;
13029   if (!init)
13030     {
13031       target_newline = lang_hooks.to_target_charset ('\n');
13032       target_percent = lang_hooks.to_target_charset ('%');
13033       target_c = lang_hooks.to_target_charset ('c');
13034       target_s = lang_hooks.to_target_charset ('s');
13035       if (target_newline == 0 || target_percent == 0 || target_c == 0
13036           || target_s == 0)
13037         return false;
13038
13039       target_percent_c[0] = target_percent;
13040       target_percent_c[1] = target_c;
13041       target_percent_c[2] = '\0';
13042
13043       target_percent_s[0] = target_percent;
13044       target_percent_s[1] = target_s;
13045       target_percent_s[2] = '\0';
13046
13047       target_percent_s_newline[0] = target_percent;
13048       target_percent_s_newline[1] = target_s;
13049       target_percent_s_newline[2] = target_newline;
13050       target_percent_s_newline[3] = '\0';
13051
13052       init = true;
13053     }
13054   return true;
13055 }
13056
13057 /* Helper function for do_mpfr_arg*().  Ensure M is a normal number
13058    and no overflow/underflow occurred.  INEXACT is true if M was not
13059    exactly calculated.  TYPE is the tree type for the result.  This
13060    function assumes that you cleared the MPFR flags and then
13061    calculated M to see if anything subsequently set a flag prior to
13062    entering this function.  Return NULL_TREE if any checks fail.  */
13063
13064 static tree
13065 do_mpfr_ckconv (mpfr_srcptr m, tree type, int inexact)
13066 {
13067   /* Proceed iff we get a normal number, i.e. not NaN or Inf and no
13068      overflow/underflow occurred.  If -frounding-math, proceed iff the
13069      result of calling FUNC was exact.  */
13070   if (mpfr_number_p (m) && !mpfr_overflow_p () && !mpfr_underflow_p ()
13071       && (!flag_rounding_math || !inexact))
13072     {
13073       REAL_VALUE_TYPE rr;
13074
13075       real_from_mpfr (&rr, m, type, GMP_RNDN);
13076       /* Proceed iff GCC's REAL_VALUE_TYPE can hold the MPFR value,
13077          check for overflow/underflow.  If the REAL_VALUE_TYPE is zero
13078          but the mpft_t is not, then we underflowed in the
13079          conversion.  */
13080       if (real_isfinite (&rr)
13081           && (rr.cl == rvc_zero) == (mpfr_zero_p (m) != 0))
13082         {
13083           REAL_VALUE_TYPE rmode;
13084
13085           real_convert (&rmode, TYPE_MODE (type), &rr);
13086           /* Proceed iff the specified mode can hold the value.  */
13087           if (real_identical (&rmode, &rr))
13088             return build_real (type, rmode);
13089         }
13090     }
13091   return NULL_TREE;
13092 }
13093
13094 /* Helper function for do_mpc_arg*().  Ensure M is a normal complex
13095    number and no overflow/underflow occurred.  INEXACT is true if M
13096    was not exactly calculated.  TYPE is the tree type for the result.
13097    This function assumes that you cleared the MPFR flags and then
13098    calculated M to see if anything subsequently set a flag prior to
13099    entering this function.  Return NULL_TREE if any checks fail, if
13100    FORCE_CONVERT is true, then bypass the checks.  */
13101
13102 static tree
13103 do_mpc_ckconv (mpc_srcptr m, tree type, int inexact, int force_convert)
13104 {
13105   /* Proceed iff we get a normal number, i.e. not NaN or Inf and no
13106      overflow/underflow occurred.  If -frounding-math, proceed iff the
13107      result of calling FUNC was exact.  */
13108   if (force_convert
13109       || (mpfr_number_p (mpc_realref (m)) && mpfr_number_p (mpc_imagref (m))
13110           && !mpfr_overflow_p () && !mpfr_underflow_p ()
13111           && (!flag_rounding_math || !inexact)))
13112     {
13113       REAL_VALUE_TYPE re, im;
13114
13115       real_from_mpfr (&re, mpc_realref (m), TREE_TYPE (type), GMP_RNDN);
13116       real_from_mpfr (&im, mpc_imagref (m), TREE_TYPE (type), GMP_RNDN);
13117       /* Proceed iff GCC's REAL_VALUE_TYPE can hold the MPFR values,
13118          check for overflow/underflow.  If the REAL_VALUE_TYPE is zero
13119          but the mpft_t is not, then we underflowed in the
13120          conversion.  */
13121       if (force_convert
13122           || (real_isfinite (&re) && real_isfinite (&im)
13123               && (re.cl == rvc_zero) == (mpfr_zero_p (mpc_realref (m)) != 0)
13124               && (im.cl == rvc_zero) == (mpfr_zero_p (mpc_imagref (m)) != 0)))
13125         {
13126           REAL_VALUE_TYPE re_mode, im_mode;
13127
13128           real_convert (&re_mode, TYPE_MODE (TREE_TYPE (type)), &re);
13129           real_convert (&im_mode, TYPE_MODE (TREE_TYPE (type)), &im);
13130           /* Proceed iff the specified mode can hold the value.  */
13131           if (force_convert
13132               || (real_identical (&re_mode, &re)
13133                   && real_identical (&im_mode, &im)))
13134             return build_complex (type, build_real (TREE_TYPE (type), re_mode),
13135                                   build_real (TREE_TYPE (type), im_mode));
13136         }
13137     }
13138   return NULL_TREE;
13139 }
13140
13141 /* If argument ARG is a REAL_CST, call the one-argument mpfr function
13142    FUNC on it and return the resulting value as a tree with type TYPE.
13143    If MIN and/or MAX are not NULL, then the supplied ARG must be
13144    within those bounds.  If INCLUSIVE is true, then MIN/MAX are
13145    acceptable values, otherwise they are not.  The mpfr precision is
13146    set to the precision of TYPE.  We assume that function FUNC returns
13147    zero if the result could be calculated exactly within the requested
13148    precision.  */
13149
13150 static tree
13151 do_mpfr_arg1 (tree arg, tree type, int (*func)(mpfr_ptr, mpfr_srcptr, mp_rnd_t),
13152               const REAL_VALUE_TYPE *min, const REAL_VALUE_TYPE *max,
13153               bool inclusive)
13154 {
13155   tree result = NULL_TREE;
13156
13157   STRIP_NOPS (arg);
13158
13159   /* To proceed, MPFR must exactly represent the target floating point
13160      format, which only happens when the target base equals two.  */
13161   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13162       && TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg))
13163     {
13164       const REAL_VALUE_TYPE *const ra = &TREE_REAL_CST (arg);
13165
13166       if (real_isfinite (ra)
13167           && (!min || real_compare (inclusive ? GE_EXPR: GT_EXPR , ra, min))
13168           && (!max || real_compare (inclusive ? LE_EXPR: LT_EXPR , ra, max)))
13169         {
13170           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13171           const int prec = fmt->p;
13172           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13173           int inexact;
13174           mpfr_t m;
13175
13176           mpfr_init2 (m, prec);
13177           mpfr_from_real (m, ra, GMP_RNDN);
13178           mpfr_clear_flags ();
13179           inexact = func (m, m, rnd);
13180           result = do_mpfr_ckconv (m, type, inexact);
13181           mpfr_clear (m);
13182         }
13183     }
13184
13185   return result;
13186 }
13187
13188 /* If argument ARG is a REAL_CST, call the two-argument mpfr function
13189    FUNC on it and return the resulting value as a tree with type TYPE.
13190    The mpfr precision is set to the precision of TYPE.  We assume that
13191    function FUNC returns zero if the result could be calculated
13192    exactly within the requested precision.  */
13193
13194 static tree
13195 do_mpfr_arg2 (tree arg1, tree arg2, tree type,
13196               int (*func)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mp_rnd_t))
13197 {
13198   tree result = NULL_TREE;
13199
13200   STRIP_NOPS (arg1);
13201   STRIP_NOPS (arg2);
13202
13203   /* To proceed, MPFR must exactly represent the target floating point
13204      format, which only happens when the target base equals two.  */
13205   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13206       && TREE_CODE (arg1) == REAL_CST && !TREE_OVERFLOW (arg1)
13207       && TREE_CODE (arg2) == REAL_CST && !TREE_OVERFLOW (arg2))
13208     {
13209       const REAL_VALUE_TYPE *const ra1 = &TREE_REAL_CST (arg1);
13210       const REAL_VALUE_TYPE *const ra2 = &TREE_REAL_CST (arg2);
13211
13212       if (real_isfinite (ra1) && real_isfinite (ra2))
13213         {
13214           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13215           const int prec = fmt->p;
13216           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13217           int inexact;
13218           mpfr_t m1, m2;
13219
13220           mpfr_inits2 (prec, m1, m2, NULL);
13221           mpfr_from_real (m1, ra1, GMP_RNDN);
13222           mpfr_from_real (m2, ra2, GMP_RNDN);
13223           mpfr_clear_flags ();
13224           inexact = func (m1, m1, m2, rnd);
13225           result = do_mpfr_ckconv (m1, type, inexact);
13226           mpfr_clears (m1, m2, NULL);
13227         }
13228     }
13229
13230   return result;
13231 }
13232
13233 /* If argument ARG is a REAL_CST, call the three-argument mpfr function
13234    FUNC on it and return the resulting value as a tree with type TYPE.
13235    The mpfr precision is set to the precision of TYPE.  We assume that
13236    function FUNC returns zero if the result could be calculated
13237    exactly within the requested precision.  */
13238
13239 static tree
13240 do_mpfr_arg3 (tree arg1, tree arg2, tree arg3, tree type,
13241               int (*func)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mpfr_srcptr, mp_rnd_t))
13242 {
13243   tree result = NULL_TREE;
13244
13245   STRIP_NOPS (arg1);
13246   STRIP_NOPS (arg2);
13247   STRIP_NOPS (arg3);
13248
13249   /* To proceed, MPFR must exactly represent the target floating point
13250      format, which only happens when the target base equals two.  */
13251   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13252       && TREE_CODE (arg1) == REAL_CST && !TREE_OVERFLOW (arg1)
13253       && TREE_CODE (arg2) == REAL_CST && !TREE_OVERFLOW (arg2)
13254       && TREE_CODE (arg3) == REAL_CST && !TREE_OVERFLOW (arg3))
13255     {
13256       const REAL_VALUE_TYPE *const ra1 = &TREE_REAL_CST (arg1);
13257       const REAL_VALUE_TYPE *const ra2 = &TREE_REAL_CST (arg2);
13258       const REAL_VALUE_TYPE *const ra3 = &TREE_REAL_CST (arg3);
13259
13260       if (real_isfinite (ra1) && real_isfinite (ra2) && real_isfinite (ra3))
13261         {
13262           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13263           const int prec = fmt->p;
13264           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13265           int inexact;
13266           mpfr_t m1, m2, m3;
13267
13268           mpfr_inits2 (prec, m1, m2, m3, NULL);
13269           mpfr_from_real (m1, ra1, GMP_RNDN);
13270           mpfr_from_real (m2, ra2, GMP_RNDN);
13271           mpfr_from_real (m3, ra3, GMP_RNDN);
13272           mpfr_clear_flags ();
13273           inexact = func (m1, m1, m2, m3, rnd);
13274           result = do_mpfr_ckconv (m1, type, inexact);
13275           mpfr_clears (m1, m2, m3, NULL);
13276         }
13277     }
13278
13279   return result;
13280 }
13281
13282 /* If argument ARG is a REAL_CST, call mpfr_sin_cos() on it and set
13283    the pointers *(ARG_SINP) and *(ARG_COSP) to the resulting values.
13284    If ARG_SINP and ARG_COSP are NULL then the result is returned
13285    as a complex value.
13286    The type is taken from the type of ARG and is used for setting the
13287    precision of the calculation and results.  */
13288
13289 static tree
13290 do_mpfr_sincos (tree arg, tree arg_sinp, tree arg_cosp)
13291 {
13292   tree const type = TREE_TYPE (arg);
13293   tree result = NULL_TREE;
13294
13295   STRIP_NOPS (arg);
13296
13297   /* To proceed, MPFR must exactly represent the target floating point
13298      format, which only happens when the target base equals two.  */
13299   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13300       && TREE_CODE (arg) == REAL_CST
13301       && !TREE_OVERFLOW (arg))
13302     {
13303       const REAL_VALUE_TYPE *const ra = &TREE_REAL_CST (arg);
13304
13305       if (real_isfinite (ra))
13306         {
13307           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13308           const int prec = fmt->p;
13309           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13310           tree result_s, result_c;
13311           int inexact;
13312           mpfr_t m, ms, mc;
13313
13314           mpfr_inits2 (prec, m, ms, mc, NULL);
13315           mpfr_from_real (m, ra, GMP_RNDN);
13316           mpfr_clear_flags ();
13317           inexact = mpfr_sin_cos (ms, mc, m, rnd);
13318           result_s = do_mpfr_ckconv (ms, type, inexact);
13319           result_c = do_mpfr_ckconv (mc, type, inexact);
13320           mpfr_clears (m, ms, mc, NULL);
13321           if (result_s && result_c)
13322             {
13323               /* If we are to return in a complex value do so.  */
13324               if (!arg_sinp && !arg_cosp)
13325                 return build_complex (build_complex_type (type),
13326                                       result_c, result_s);
13327
13328               /* Dereference the sin/cos pointer arguments.  */
13329               arg_sinp = build_fold_indirect_ref (arg_sinp);
13330               arg_cosp = build_fold_indirect_ref (arg_cosp);
13331               /* Proceed if valid pointer type were passed in.  */
13332               if (TYPE_MAIN_VARIANT (TREE_TYPE (arg_sinp)) == TYPE_MAIN_VARIANT (type)
13333                   && TYPE_MAIN_VARIANT (TREE_TYPE (arg_cosp)) == TYPE_MAIN_VARIANT (type))
13334                 {
13335                   /* Set the values. */
13336                   result_s = fold_build2 (MODIFY_EXPR, type, arg_sinp,
13337                                           result_s);
13338                   TREE_SIDE_EFFECTS (result_s) = 1;
13339                   result_c = fold_build2 (MODIFY_EXPR, type, arg_cosp,
13340                                           result_c);
13341                   TREE_SIDE_EFFECTS (result_c) = 1;
13342                   /* Combine the assignments into a compound expr.  */
13343                   result = non_lvalue (fold_build2 (COMPOUND_EXPR, type,
13344                                                     result_s, result_c));
13345                 }
13346             }
13347         }
13348     }
13349   return result;
13350 }
13351
13352 /* If argument ARG1 is an INTEGER_CST and ARG2 is a REAL_CST, call the
13353    two-argument mpfr order N Bessel function FUNC on them and return
13354    the resulting value as a tree with type TYPE.  The mpfr precision
13355    is set to the precision of TYPE.  We assume that function FUNC
13356    returns zero if the result could be calculated exactly within the
13357    requested precision.  */
13358 static tree
13359 do_mpfr_bessel_n (tree arg1, tree arg2, tree type,
13360                   int (*func)(mpfr_ptr, long, mpfr_srcptr, mp_rnd_t),
13361                   const REAL_VALUE_TYPE *min, bool inclusive)
13362 {
13363   tree result = NULL_TREE;
13364
13365   STRIP_NOPS (arg1);
13366   STRIP_NOPS (arg2);
13367
13368   /* To proceed, MPFR must exactly represent the target floating point
13369      format, which only happens when the target base equals two.  */
13370   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13371       && host_integerp (arg1, 0)
13372       && TREE_CODE (arg2) == REAL_CST && !TREE_OVERFLOW (arg2))
13373     {
13374       const HOST_WIDE_INT n = tree_low_cst(arg1, 0);
13375       const REAL_VALUE_TYPE *const ra = &TREE_REAL_CST (arg2);
13376
13377       if (n == (long)n
13378           && real_isfinite (ra)
13379           && (!min || real_compare (inclusive ? GE_EXPR: GT_EXPR , ra, min)))
13380         {
13381           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13382           const int prec = fmt->p;
13383           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13384           int inexact;
13385           mpfr_t m;
13386
13387           mpfr_init2 (m, prec);
13388           mpfr_from_real (m, ra, GMP_RNDN);
13389           mpfr_clear_flags ();
13390           inexact = func (m, n, m, rnd);
13391           result = do_mpfr_ckconv (m, type, inexact);
13392           mpfr_clear (m);
13393         }
13394     }
13395
13396   return result;
13397 }
13398
13399 /* If arguments ARG0 and ARG1 are REAL_CSTs, call mpfr_remquo() to set
13400    the pointer *(ARG_QUO) and return the result.  The type is taken
13401    from the type of ARG0 and is used for setting the precision of the
13402    calculation and results.  */
13403
13404 static tree
13405 do_mpfr_remquo (tree arg0, tree arg1, tree arg_quo)
13406 {
13407   tree const type = TREE_TYPE (arg0);
13408   tree result = NULL_TREE;
13409
13410   STRIP_NOPS (arg0);
13411   STRIP_NOPS (arg1);
13412
13413   /* To proceed, MPFR must exactly represent the target floating point
13414      format, which only happens when the target base equals two.  */
13415   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13416       && TREE_CODE (arg0) == REAL_CST && !TREE_OVERFLOW (arg0)
13417       && TREE_CODE (arg1) == REAL_CST && !TREE_OVERFLOW (arg1))
13418     {
13419       const REAL_VALUE_TYPE *const ra0 = TREE_REAL_CST_PTR (arg0);
13420       const REAL_VALUE_TYPE *const ra1 = TREE_REAL_CST_PTR (arg1);
13421
13422       if (real_isfinite (ra0) && real_isfinite (ra1))
13423         {
13424           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13425           const int prec = fmt->p;
13426           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13427           tree result_rem;
13428           long integer_quo;
13429           mpfr_t m0, m1;
13430
13431           mpfr_inits2 (prec, m0, m1, NULL);
13432           mpfr_from_real (m0, ra0, GMP_RNDN);
13433           mpfr_from_real (m1, ra1, GMP_RNDN);
13434           mpfr_clear_flags ();
13435           mpfr_remquo (m0, &integer_quo, m0, m1, rnd);
13436           /* Remquo is independent of the rounding mode, so pass
13437              inexact=0 to do_mpfr_ckconv().  */
13438           result_rem = do_mpfr_ckconv (m0, type, /*inexact=*/ 0);
13439           mpfr_clears (m0, m1, NULL);
13440           if (result_rem)
13441             {
13442               /* MPFR calculates quo in the host's long so it may
13443                  return more bits in quo than the target int can hold
13444                  if sizeof(host long) > sizeof(target int).  This can
13445                  happen even for native compilers in LP64 mode.  In
13446                  these cases, modulo the quo value with the largest
13447                  number that the target int can hold while leaving one
13448                  bit for the sign.  */
13449               if (sizeof (integer_quo) * CHAR_BIT > INT_TYPE_SIZE)
13450                 integer_quo %= (long)(1UL << (INT_TYPE_SIZE - 1));
13451
13452               /* Dereference the quo pointer argument.  */
13453               arg_quo = build_fold_indirect_ref (arg_quo);
13454               /* Proceed iff a valid pointer type was passed in.  */
13455               if (TYPE_MAIN_VARIANT (TREE_TYPE (arg_quo)) == integer_type_node)
13456                 {
13457                   /* Set the value. */
13458                   tree result_quo = fold_build2 (MODIFY_EXPR,
13459                                                  TREE_TYPE (arg_quo), arg_quo,
13460                                                  build_int_cst (NULL, integer_quo));
13461                   TREE_SIDE_EFFECTS (result_quo) = 1;
13462                   /* Combine the quo assignment with the rem.  */
13463                   result = non_lvalue (fold_build2 (COMPOUND_EXPR, type,
13464                                                     result_quo, result_rem));
13465                 }
13466             }
13467         }
13468     }
13469   return result;
13470 }
13471
13472 /* If ARG is a REAL_CST, call mpfr_lgamma() on it and return the
13473    resulting value as a tree with type TYPE.  The mpfr precision is
13474    set to the precision of TYPE.  We assume that this mpfr function
13475    returns zero if the result could be calculated exactly within the
13476    requested precision.  In addition, the integer pointer represented
13477    by ARG_SG will be dereferenced and set to the appropriate signgam
13478    (-1,1) value.  */
13479
13480 static tree
13481 do_mpfr_lgamma_r (tree arg, tree arg_sg, tree type)
13482 {
13483   tree result = NULL_TREE;
13484
13485   STRIP_NOPS (arg);
13486
13487   /* To proceed, MPFR must exactly represent the target floating point
13488      format, which only happens when the target base equals two.  Also
13489      verify ARG is a constant and that ARG_SG is an int pointer.  */
13490   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13491       && TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg)
13492       && TREE_CODE (TREE_TYPE (arg_sg)) == POINTER_TYPE
13493       && TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (arg_sg))) == integer_type_node)
13494     {
13495       const REAL_VALUE_TYPE *const ra = TREE_REAL_CST_PTR (arg);
13496
13497       /* In addition to NaN and Inf, the argument cannot be zero or a
13498          negative integer.  */
13499       if (real_isfinite (ra)
13500           && ra->cl != rvc_zero
13501           && !(real_isneg(ra) && real_isinteger(ra, TYPE_MODE (type))))
13502         {
13503           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13504           const int prec = fmt->p;
13505           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13506           int inexact, sg;
13507           mpfr_t m;
13508           tree result_lg;
13509
13510           mpfr_init2 (m, prec);
13511           mpfr_from_real (m, ra, GMP_RNDN);
13512           mpfr_clear_flags ();
13513           inexact = mpfr_lgamma (m, &sg, m, rnd);
13514           result_lg = do_mpfr_ckconv (m, type, inexact);
13515           mpfr_clear (m);
13516           if (result_lg)
13517             {
13518               tree result_sg;
13519
13520               /* Dereference the arg_sg pointer argument.  */
13521               arg_sg = build_fold_indirect_ref (arg_sg);
13522               /* Assign the signgam value into *arg_sg. */
13523               result_sg = fold_build2 (MODIFY_EXPR,
13524                                        TREE_TYPE (arg_sg), arg_sg,
13525                                        build_int_cst (NULL, sg));
13526               TREE_SIDE_EFFECTS (result_sg) = 1;
13527               /* Combine the signgam assignment with the lgamma result.  */
13528               result = non_lvalue (fold_build2 (COMPOUND_EXPR, type,
13529                                                 result_sg, result_lg));
13530             }
13531         }
13532     }
13533
13534   return result;
13535 }
13536
13537 /* If argument ARG is a COMPLEX_CST, call the one-argument mpc
13538    function FUNC on it and return the resulting value as a tree with
13539    type TYPE.  The mpfr precision is set to the precision of TYPE.  We
13540    assume that function FUNC returns zero if the result could be
13541    calculated exactly within the requested precision.  */
13542
13543 static tree
13544 do_mpc_arg1 (tree arg, tree type, int (*func)(mpc_ptr, mpc_srcptr, mpc_rnd_t))
13545 {
13546   tree result = NULL_TREE;
13547
13548   STRIP_NOPS (arg);
13549
13550   /* To proceed, MPFR must exactly represent the target floating point
13551      format, which only happens when the target base equals two.  */
13552   if (TREE_CODE (arg) == COMPLEX_CST && !TREE_OVERFLOW (arg)
13553       && TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) == REAL_TYPE
13554       && REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (TREE_TYPE (arg))))->b == 2)
13555     {
13556       const REAL_VALUE_TYPE *const re = TREE_REAL_CST_PTR (TREE_REALPART (arg));
13557       const REAL_VALUE_TYPE *const im = TREE_REAL_CST_PTR (TREE_IMAGPART (arg));
13558
13559       if (real_isfinite (re) && real_isfinite (im))
13560         {
13561           const struct real_format *const fmt =
13562             REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (type)));
13563           const int prec = fmt->p;
13564           const mp_rnd_t rnd = fmt->round_towards_zero ? GMP_RNDZ : GMP_RNDN;
13565           const mpc_rnd_t crnd = fmt->round_towards_zero ? MPC_RNDZZ : MPC_RNDNN;
13566           int inexact;
13567           mpc_t m;
13568
13569           mpc_init2 (m, prec);
13570           mpfr_from_real (mpc_realref(m), re, rnd);
13571           mpfr_from_real (mpc_imagref(m), im, rnd);
13572           mpfr_clear_flags ();
13573           inexact = func (m, m, crnd);
13574           result = do_mpc_ckconv (m, type, inexact, /*force_convert=*/ 0);
13575           mpc_clear (m);
13576         }
13577     }
13578
13579   return result;
13580 }
13581
13582 /* If arguments ARG0 and ARG1 are a COMPLEX_CST, call the two-argument
13583    mpc function FUNC on it and return the resulting value as a tree
13584    with type TYPE.  The mpfr precision is set to the precision of
13585    TYPE.  We assume that function FUNC returns zero if the result
13586    could be calculated exactly within the requested precision.  If
13587    DO_NONFINITE is true, then fold expressions containing Inf or NaN
13588    in the arguments and/or results.  */
13589
13590 tree
13591 do_mpc_arg2 (tree arg0, tree arg1, tree type, int do_nonfinite,
13592              int (*func)(mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t))
13593 {
13594   tree result = NULL_TREE;
13595
13596   STRIP_NOPS (arg0);
13597   STRIP_NOPS (arg1);
13598
13599   /* To proceed, MPFR must exactly represent the target floating point
13600      format, which only happens when the target base equals two.  */
13601   if (TREE_CODE (arg0) == COMPLEX_CST && !TREE_OVERFLOW (arg0)
13602       && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE
13603       && TREE_CODE (arg1) == COMPLEX_CST && !TREE_OVERFLOW (arg1)
13604       && TREE_CODE (TREE_TYPE (TREE_TYPE (arg1))) == REAL_TYPE
13605       && REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0))))->b == 2)
13606     {
13607       const REAL_VALUE_TYPE *const re0 = TREE_REAL_CST_PTR (TREE_REALPART (arg0));
13608       const REAL_VALUE_TYPE *const im0 = TREE_REAL_CST_PTR (TREE_IMAGPART (arg0));
13609       const REAL_VALUE_TYPE *const re1 = TREE_REAL_CST_PTR (TREE_REALPART (arg1));
13610       const REAL_VALUE_TYPE *const im1 = TREE_REAL_CST_PTR (TREE_IMAGPART (arg1));
13611
13612       if (do_nonfinite
13613           || (real_isfinite (re0) && real_isfinite (im0)
13614               && real_isfinite (re1) && real_isfinite (im1)))
13615         {
13616           const struct real_format *const fmt =
13617             REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (type)));
13618           const int prec = fmt->p;
13619           const mp_rnd_t rnd = fmt->round_towards_zero ? GMP_RNDZ : GMP_RNDN;
13620           const mpc_rnd_t crnd = fmt->round_towards_zero ? MPC_RNDZZ : MPC_RNDNN;
13621           int inexact;
13622           mpc_t m0, m1;
13623
13624           mpc_init2 (m0, prec);
13625           mpc_init2 (m1, prec);
13626           mpfr_from_real (mpc_realref(m0), re0, rnd);
13627           mpfr_from_real (mpc_imagref(m0), im0, rnd);
13628           mpfr_from_real (mpc_realref(m1), re1, rnd);
13629           mpfr_from_real (mpc_imagref(m1), im1, rnd);
13630           mpfr_clear_flags ();
13631           inexact = func (m0, m0, m1, crnd);
13632           result = do_mpc_ckconv (m0, type, inexact, do_nonfinite);
13633           mpc_clear (m0);
13634           mpc_clear (m1);
13635         }
13636     }
13637
13638   return result;
13639 }
13640
13641 /* Fold a call STMT to __{,v}sprintf_chk.  Return NULL_TREE if
13642    a normal call should be emitted rather than expanding the function
13643    inline.  FCODE is either BUILT_IN_SPRINTF_CHK or BUILT_IN_VSPRINTF_CHK.  */
13644
13645 static tree
13646 gimple_fold_builtin_sprintf_chk (gimple stmt, enum built_in_function fcode)
13647 {
13648   int nargs = gimple_call_num_args (stmt);
13649
13650   return fold_builtin_sprintf_chk_1 (gimple_location (stmt), nargs,
13651                                      (nargs > 0
13652                                       ? gimple_call_arg_ptr (stmt, 0)
13653                                       : &error_mark_node), fcode);
13654 }
13655
13656 /* Fold a call STMT to {,v}snprintf.  Return NULL_TREE if
13657    a normal call should be emitted rather than expanding the function
13658    inline.  FCODE is either BUILT_IN_SNPRINTF_CHK or
13659    BUILT_IN_VSNPRINTF_CHK.  If MAXLEN is not NULL, it is maximum length
13660    passed as second argument.  */
13661
13662 tree
13663 gimple_fold_builtin_snprintf_chk (gimple stmt, tree maxlen,
13664                                   enum built_in_function fcode)
13665 {
13666   int nargs = gimple_call_num_args (stmt);
13667
13668   return fold_builtin_snprintf_chk_1 (gimple_location (stmt), nargs,
13669                                       (nargs > 0
13670                                        ? gimple_call_arg_ptr (stmt, 0)
13671                                        : &error_mark_node), maxlen, fcode);
13672 }
13673
13674 /* Builtins with folding operations that operate on "..." arguments
13675    need special handling; we need to store the arguments in a convenient
13676    data structure before attempting any folding.  Fortunately there are
13677    only a few builtins that fall into this category.  FNDECL is the
13678    function, EXP is the CALL_EXPR for the call, and IGNORE is true if the
13679    result of the function call is ignored.  */
13680
13681 static tree
13682 gimple_fold_builtin_varargs (tree fndecl, gimple stmt,
13683                              bool ignore ATTRIBUTE_UNUSED)
13684 {
13685   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
13686   tree ret = NULL_TREE;
13687
13688   switch (fcode)
13689     {
13690     case BUILT_IN_SPRINTF_CHK:
13691     case BUILT_IN_VSPRINTF_CHK:
13692       ret = gimple_fold_builtin_sprintf_chk (stmt, fcode);
13693       break;
13694
13695     case BUILT_IN_SNPRINTF_CHK:
13696     case BUILT_IN_VSNPRINTF_CHK:
13697       ret = gimple_fold_builtin_snprintf_chk (stmt, NULL_TREE, fcode);
13698
13699     default:
13700       break;
13701     }
13702   if (ret)
13703     {
13704       ret = build1 (NOP_EXPR, TREE_TYPE (ret), ret);
13705       TREE_NO_WARNING (ret) = 1;
13706       return ret;
13707     }
13708   return NULL_TREE;
13709 }
13710
13711 /* A wrapper function for builtin folding that prevents warnings for
13712    "statement without effect" and the like, caused by removing the
13713    call node earlier than the warning is generated.  */
13714
13715 tree
13716 fold_call_stmt (gimple stmt, bool ignore)
13717 {
13718   tree ret = NULL_TREE;
13719   tree fndecl = gimple_call_fndecl (stmt);
13720   location_t loc = gimple_location (stmt);
13721   if (fndecl
13722       && TREE_CODE (fndecl) == FUNCTION_DECL
13723       && DECL_BUILT_IN (fndecl)
13724       && !gimple_call_va_arg_pack_p (stmt))
13725     {
13726       int nargs = gimple_call_num_args (stmt);
13727       tree *args = (nargs > 0
13728                     ? gimple_call_arg_ptr (stmt, 0)
13729                     : &error_mark_node);
13730
13731       if (avoid_folding_inline_builtin (fndecl))
13732         return NULL_TREE;
13733       if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
13734         {
13735           return targetm.fold_builtin (fndecl, nargs, args, ignore);
13736         }
13737       else
13738         {
13739           if (nargs <= MAX_ARGS_TO_FOLD_BUILTIN)
13740             ret = fold_builtin_n (loc, fndecl, args, nargs, ignore);
13741           if (!ret)
13742             ret = gimple_fold_builtin_varargs (fndecl, stmt, ignore);
13743           if (ret)
13744             {
13745               /* Propagate location information from original call to
13746                  expansion of builtin.  Otherwise things like
13747                  maybe_emit_chk_warning, that operate on the expansion
13748                  of a builtin, will use the wrong location information.  */
13749               if (gimple_has_location (stmt))
13750                 {
13751                   tree realret = ret;
13752                   if (TREE_CODE (ret) == NOP_EXPR)
13753                     realret = TREE_OPERAND (ret, 0);
13754                   if (CAN_HAVE_LOCATION_P (realret)
13755                       && !EXPR_HAS_LOCATION (realret))
13756                     SET_EXPR_LOCATION (realret, loc);
13757                   return realret;
13758                 }
13759               return ret;
13760             }
13761         }
13762     }
13763   return NULL_TREE;
13764 }
13765
13766 /* Look up the function in built_in_decls that corresponds to DECL
13767    and set ASMSPEC as its user assembler name.  DECL must be a
13768    function decl that declares a builtin.  */
13769
13770 void
13771 set_builtin_user_assembler_name (tree decl, const char *asmspec)
13772 {
13773   tree builtin;
13774   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL
13775               && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
13776               && asmspec != 0);
13777
13778   builtin = built_in_decls [DECL_FUNCTION_CODE (decl)];
13779   set_user_assembler_name (builtin, asmspec);
13780   switch (DECL_FUNCTION_CODE (decl))
13781     {
13782     case BUILT_IN_MEMCPY:
13783       init_block_move_fn (asmspec);
13784       memcpy_libfunc = set_user_assembler_libfunc ("memcpy", asmspec);
13785       break;
13786     case BUILT_IN_MEMSET:
13787       init_block_clear_fn (asmspec);
13788       memset_libfunc = set_user_assembler_libfunc ("memset", asmspec);
13789       break;
13790     case BUILT_IN_MEMMOVE:
13791       memmove_libfunc = set_user_assembler_libfunc ("memmove", asmspec);
13792       break;
13793     case BUILT_IN_MEMCMP:
13794       memcmp_libfunc = set_user_assembler_libfunc ("memcmp", asmspec);
13795       break;
13796     case BUILT_IN_ABORT:
13797       abort_libfunc = set_user_assembler_libfunc ("abort", asmspec);
13798       break;
13799     case BUILT_IN_FFS:
13800       if (INT_TYPE_SIZE < BITS_PER_WORD)
13801         {
13802           set_user_assembler_libfunc ("ffs", asmspec);
13803           set_optab_libfunc (ffs_optab, mode_for_size (INT_TYPE_SIZE,
13804                                                        MODE_INT, 0), "ffs");
13805         }
13806       break;
13807     default:
13808       break;
13809     }
13810 }
13811
13812 /* Return true if DECL is a builtin that expands to a constant or similarly
13813    simple code.  */
13814 bool
13815 is_simple_builtin (tree decl)
13816 {
13817   if (decl && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL)
13818     switch (DECL_FUNCTION_CODE (decl))
13819       {
13820         /* Builtins that expand to constants.  */
13821       case BUILT_IN_CONSTANT_P:
13822       case BUILT_IN_EXPECT:
13823       case BUILT_IN_OBJECT_SIZE:
13824       case BUILT_IN_UNREACHABLE:
13825         /* Simple register moves or loads from stack.  */
13826       case BUILT_IN_RETURN_ADDRESS:
13827       case BUILT_IN_EXTRACT_RETURN_ADDR:
13828       case BUILT_IN_FROB_RETURN_ADDR:
13829       case BUILT_IN_RETURN:
13830       case BUILT_IN_AGGREGATE_INCOMING_ADDRESS:
13831       case BUILT_IN_FRAME_ADDRESS:
13832       case BUILT_IN_VA_END:
13833       case BUILT_IN_STACK_SAVE:
13834       case BUILT_IN_STACK_RESTORE:
13835         /* Exception state returns or moves registers around.  */
13836       case BUILT_IN_EH_FILTER:
13837       case BUILT_IN_EH_POINTER:
13838       case BUILT_IN_EH_COPY_VALUES:
13839         return true;
13840
13841       default:
13842         return false;
13843       }
13844
13845   return false;
13846 }
13847
13848 /* Return true if DECL is a builtin that is not expensive, i.e., they are
13849    most probably expanded inline into reasonably simple code.  This is a
13850    superset of is_simple_builtin.  */
13851 bool
13852 is_inexpensive_builtin (tree decl)
13853 {
13854   if (!decl)
13855     return false;
13856   else if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_MD)
13857     return true;
13858   else if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL)
13859     switch (DECL_FUNCTION_CODE (decl))
13860       {
13861       case BUILT_IN_ABS:
13862       case BUILT_IN_ALLOCA:
13863       case BUILT_IN_BSWAP32:
13864       case BUILT_IN_BSWAP64:
13865       case BUILT_IN_CLZ:
13866       case BUILT_IN_CLZIMAX:
13867       case BUILT_IN_CLZL:
13868       case BUILT_IN_CLZLL:
13869       case BUILT_IN_CTZ:
13870       case BUILT_IN_CTZIMAX:
13871       case BUILT_IN_CTZL:
13872       case BUILT_IN_CTZLL:
13873       case BUILT_IN_FFS:
13874       case BUILT_IN_FFSIMAX:
13875       case BUILT_IN_FFSL:
13876       case BUILT_IN_FFSLL:
13877       case BUILT_IN_IMAXABS:
13878       case BUILT_IN_FINITE:
13879       case BUILT_IN_FINITEF:
13880       case BUILT_IN_FINITEL:
13881       case BUILT_IN_FINITED32:
13882       case BUILT_IN_FINITED64:
13883       case BUILT_IN_FINITED128:
13884       case BUILT_IN_FPCLASSIFY:
13885       case BUILT_IN_ISFINITE:
13886       case BUILT_IN_ISINF_SIGN:
13887       case BUILT_IN_ISINF:
13888       case BUILT_IN_ISINFF:
13889       case BUILT_IN_ISINFL:
13890       case BUILT_IN_ISINFD32:
13891       case BUILT_IN_ISINFD64:
13892       case BUILT_IN_ISINFD128:
13893       case BUILT_IN_ISNAN:
13894       case BUILT_IN_ISNANF:
13895       case BUILT_IN_ISNANL:
13896       case BUILT_IN_ISNAND32:
13897       case BUILT_IN_ISNAND64:
13898       case BUILT_IN_ISNAND128:
13899       case BUILT_IN_ISNORMAL:
13900       case BUILT_IN_ISGREATER:
13901       case BUILT_IN_ISGREATEREQUAL:
13902       case BUILT_IN_ISLESS:
13903       case BUILT_IN_ISLESSEQUAL:
13904       case BUILT_IN_ISLESSGREATER:
13905       case BUILT_IN_ISUNORDERED:
13906       case BUILT_IN_VA_ARG_PACK:
13907       case BUILT_IN_VA_ARG_PACK_LEN:
13908       case BUILT_IN_VA_COPY:
13909       case BUILT_IN_TRAP:
13910       case BUILT_IN_SAVEREGS:
13911       case BUILT_IN_POPCOUNTL:
13912       case BUILT_IN_POPCOUNTLL:
13913       case BUILT_IN_POPCOUNTIMAX:
13914       case BUILT_IN_POPCOUNT:
13915       case BUILT_IN_PARITYL:
13916       case BUILT_IN_PARITYLL:
13917       case BUILT_IN_PARITYIMAX:
13918       case BUILT_IN_PARITY:
13919       case BUILT_IN_LABS:
13920       case BUILT_IN_LLABS:
13921       case BUILT_IN_PREFETCH:
13922         return true;
13923
13924       default:
13925         return is_simple_builtin (decl);
13926       }
13927
13928   return false;
13929 }