OSDN Git Service

Unify handling of runtime support functions.
[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, 2011
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 static tree fold_builtin_snprintf (location_t, tree, tree, tree, tree, int);
195
196 static rtx expand_builtin_object_size (tree);
197 static rtx expand_builtin_memory_chk (tree, rtx, enum machine_mode,
198                                       enum built_in_function);
199 static void maybe_emit_chk_warning (tree, enum built_in_function);
200 static void maybe_emit_sprintf_chk_warning (tree, enum built_in_function);
201 static void maybe_emit_free_warning (tree);
202 static tree fold_builtin_object_size (tree, tree);
203 static tree fold_builtin_strcat_chk (location_t, tree, tree, tree, tree);
204 static tree fold_builtin_strncat_chk (location_t, tree, tree, tree, tree, tree);
205 static tree fold_builtin_sprintf_chk (location_t, tree, enum built_in_function);
206 static tree fold_builtin_printf (location_t, tree, tree, tree, bool, enum built_in_function);
207 static tree fold_builtin_fprintf (location_t, tree, tree, tree, tree, bool,
208                                   enum built_in_function);
209 static bool init_target_chars (void);
210
211 static unsigned HOST_WIDE_INT target_newline;
212 static unsigned HOST_WIDE_INT target_percent;
213 static unsigned HOST_WIDE_INT target_c;
214 static unsigned HOST_WIDE_INT target_s;
215 static char target_percent_c[3];
216 static char target_percent_s[3];
217 static char target_percent_s_newline[4];
218 static tree do_mpfr_arg1 (tree, tree, int (*)(mpfr_ptr, mpfr_srcptr, mp_rnd_t),
219                           const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, bool);
220 static tree do_mpfr_arg2 (tree, tree, tree,
221                           int (*)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mp_rnd_t));
222 static tree do_mpfr_arg3 (tree, tree, tree, tree,
223                           int (*)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mpfr_srcptr, mp_rnd_t));
224 static tree do_mpfr_sincos (tree, tree, tree);
225 static tree do_mpfr_bessel_n (tree, tree, tree,
226                               int (*)(mpfr_ptr, long, mpfr_srcptr, mp_rnd_t),
227                               const REAL_VALUE_TYPE *, bool);
228 static tree do_mpfr_remquo (tree, tree, tree);
229 static tree do_mpfr_lgamma_r (tree, tree, tree);
230
231 /* Return true if NAME starts with __builtin_ or __sync_.  */
232
233 bool
234 is_builtin_name (const char *name)
235 {
236   if (strncmp (name, "__builtin_", 10) == 0)
237     return true;
238   if (strncmp (name, "__sync_", 7) == 0)
239     return true;
240   return false;
241 }
242
243
244 /* Return true if DECL is a function symbol representing a built-in.  */
245
246 bool
247 is_builtin_fn (tree decl)
248 {
249   return TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl);
250 }
251
252
253 /* Return true if NODE should be considered for inline expansion regardless
254    of the optimization level.  This means whenever a function is invoked with
255    its "internal" name, which normally contains the prefix "__builtin".  */
256
257 static bool
258 called_as_built_in (tree node)
259 {
260   /* Note that we must use DECL_NAME, not DECL_ASSEMBLER_NAME_SET_P since
261      we want the name used to call the function, not the name it
262      will have. */
263   const char *name = IDENTIFIER_POINTER (DECL_NAME (node));
264   return is_builtin_name (name);
265 }
266
267 /* Return the alignment in bits of EXP, an object.
268    Don't return more than MAX_ALIGN no matter what.  */
269
270 unsigned int
271 get_object_alignment (tree exp, unsigned int max_align)
272 {
273   HOST_WIDE_INT bitsize, bitpos;
274   tree offset;
275   enum machine_mode mode;
276   int unsignedp, volatilep;
277   unsigned int align, inner;
278
279   /* Get the innermost object and the constant (bitpos) and possibly
280      variable (offset) offset of the access.  */
281   exp = get_inner_reference (exp, &bitsize, &bitpos, &offset,
282                              &mode, &unsignedp, &volatilep, true);
283
284   /* Extract alignment information from the innermost object and
285      possibly adjust bitpos and offset.  */
286   if (TREE_CODE (exp) == CONST_DECL)
287     exp = DECL_INITIAL (exp);
288   if (DECL_P (exp)
289       && TREE_CODE (exp) != LABEL_DECL)
290     align = DECL_ALIGN (exp);
291   else if (CONSTANT_CLASS_P (exp))
292     {
293       align = TYPE_ALIGN (TREE_TYPE (exp));
294 #ifdef CONSTANT_ALIGNMENT
295       align = (unsigned)CONSTANT_ALIGNMENT (exp, align);
296 #endif
297     }
298   else if (TREE_CODE (exp) == VIEW_CONVERT_EXPR)
299     align = TYPE_ALIGN (TREE_TYPE (exp));
300   else if (TREE_CODE (exp) == INDIRECT_REF)
301     align = TYPE_ALIGN (TREE_TYPE (exp));
302   else if (TREE_CODE (exp) == MEM_REF)
303     {
304       tree addr = TREE_OPERAND (exp, 0);
305       struct ptr_info_def *pi;
306       if (TREE_CODE (addr) == BIT_AND_EXPR
307           && TREE_CODE (TREE_OPERAND (addr, 1)) == INTEGER_CST)
308         {
309           align = (TREE_INT_CST_LOW (TREE_OPERAND (addr, 1))
310                     & -TREE_INT_CST_LOW (TREE_OPERAND (addr, 1)));
311           align *= BITS_PER_UNIT;
312           addr = TREE_OPERAND (addr, 0);
313         }
314       else
315         align = BITS_PER_UNIT;
316       if (TREE_CODE (addr) == SSA_NAME
317           && (pi = SSA_NAME_PTR_INFO (addr)))
318         {
319           bitpos += (pi->misalign * BITS_PER_UNIT) & ~(align - 1);
320           align = MAX (pi->align * BITS_PER_UNIT, align);
321         }
322       else if (TREE_CODE (addr) == ADDR_EXPR)
323         align = MAX (align, get_object_alignment (TREE_OPERAND (addr, 0),
324                                                   max_align));
325       bitpos += mem_ref_offset (exp).low * BITS_PER_UNIT;
326     }
327   else if (TREE_CODE (exp) == TARGET_MEM_REF)
328     {
329       struct ptr_info_def *pi;
330       tree addr = TMR_BASE (exp);
331       if (TREE_CODE (addr) == BIT_AND_EXPR
332           && TREE_CODE (TREE_OPERAND (addr, 1)) == INTEGER_CST)
333         {
334           align = (TREE_INT_CST_LOW (TREE_OPERAND (addr, 1))
335                    & -TREE_INT_CST_LOW (TREE_OPERAND (addr, 1)));
336           align *= BITS_PER_UNIT;
337           addr = TREE_OPERAND (addr, 0);
338         }
339       else
340         align = BITS_PER_UNIT;
341       if (TREE_CODE (addr) == SSA_NAME
342           && (pi = SSA_NAME_PTR_INFO (addr)))
343         {
344           bitpos += (pi->misalign * BITS_PER_UNIT) & ~(align - 1);
345           align = MAX (pi->align * BITS_PER_UNIT, align);
346         }
347       else if (TREE_CODE (addr) == ADDR_EXPR)
348         align = MAX (align, get_object_alignment (TREE_OPERAND (addr, 0),
349                                                   max_align));
350       if (TMR_OFFSET (exp))
351         bitpos += TREE_INT_CST_LOW (TMR_OFFSET (exp)) * BITS_PER_UNIT;
352       if (TMR_INDEX (exp) && TMR_STEP (exp))
353         {
354           unsigned HOST_WIDE_INT step = TREE_INT_CST_LOW (TMR_STEP (exp));
355           align = MIN (align, (step & -step) * BITS_PER_UNIT);
356         }
357       else if (TMR_INDEX (exp))
358         align = BITS_PER_UNIT;
359       if (TMR_INDEX2 (exp))
360         align = BITS_PER_UNIT;
361     }
362   else
363     align = BITS_PER_UNIT;
364
365   /* If there is a non-constant offset part extract the maximum
366      alignment that can prevail.  */
367   inner = max_align;
368   while (offset)
369     {
370       tree next_offset;
371
372       if (TREE_CODE (offset) == PLUS_EXPR)
373         {
374           next_offset = TREE_OPERAND (offset, 0);
375           offset = TREE_OPERAND (offset, 1);
376         }
377       else
378         next_offset = NULL;
379       if (host_integerp (offset, 1))
380         {
381           /* Any overflow in calculating offset_bits won't change
382              the alignment.  */
383           unsigned offset_bits
384             = ((unsigned) tree_low_cst (offset, 1) * BITS_PER_UNIT);
385
386           if (offset_bits)
387             inner = MIN (inner, (offset_bits & -offset_bits));
388         }
389       else if (TREE_CODE (offset) == MULT_EXPR
390                && host_integerp (TREE_OPERAND (offset, 1), 1))
391         {
392           /* Any overflow in calculating offset_factor won't change
393              the alignment.  */
394           unsigned offset_factor
395             = ((unsigned) tree_low_cst (TREE_OPERAND (offset, 1), 1)
396                * BITS_PER_UNIT);
397
398           if (offset_factor)
399             inner = MIN (inner, (offset_factor & -offset_factor));
400         }
401       else
402         {
403           inner = MIN (inner, BITS_PER_UNIT);
404           break;
405         }
406       offset = next_offset;
407     }
408
409   /* Alignment is innermost object alignment adjusted by the constant
410      and non-constant offset parts.  */
411   align = MIN (align, inner);
412   bitpos = bitpos & (align - 1);
413
414   /* align and bitpos now specify known low bits of the pointer.
415      ptr & (align - 1) == bitpos.  */
416
417   if (bitpos != 0)
418     align = (bitpos & -bitpos);
419
420   return MIN (align, max_align);
421 }
422
423 /* Returns true iff we can trust that alignment information has been
424    calculated properly.  */
425
426 bool
427 can_trust_pointer_alignment (void)
428 {
429   /* We rely on TER to compute accurate alignment information.  */
430   return (optimize && flag_tree_ter);
431 }
432
433 /* Return the alignment in bits of EXP, a pointer valued expression.
434    But don't return more than MAX_ALIGN no matter what.
435    The alignment returned is, by default, the alignment of the thing that
436    EXP points to.  If it is not a POINTER_TYPE, 0 is returned.
437
438    Otherwise, look at the expression to see if we can do better, i.e., if the
439    expression is actually pointing at an object whose alignment is tighter.  */
440
441 unsigned int
442 get_pointer_alignment (tree exp, unsigned int max_align)
443 {
444   STRIP_NOPS (exp);
445
446   if (TREE_CODE (exp) == ADDR_EXPR)
447     return get_object_alignment (TREE_OPERAND (exp, 0), max_align);
448   else if (TREE_CODE (exp) == SSA_NAME
449            && POINTER_TYPE_P (TREE_TYPE (exp)))
450     {
451       struct ptr_info_def *pi = SSA_NAME_PTR_INFO (exp);
452       unsigned align;
453       if (!pi)
454         return BITS_PER_UNIT;
455       if (pi->misalign != 0)
456         align = (pi->misalign & -pi->misalign);
457       else
458         align = pi->align;
459       return MIN (max_align, align * BITS_PER_UNIT);
460     }
461
462   return POINTER_TYPE_P (TREE_TYPE (exp)) ? BITS_PER_UNIT : 0;
463 }
464
465 /* Compute the length of a C string.  TREE_STRING_LENGTH is not the right
466    way, because it could contain a zero byte in the middle.
467    TREE_STRING_LENGTH is the size of the character array, not the string.
468
469    ONLY_VALUE should be nonzero if the result is not going to be emitted
470    into the instruction stream and zero if it is going to be expanded.
471    E.g. with i++ ? "foo" : "bar", if ONLY_VALUE is nonzero, constant 3
472    is returned, otherwise NULL, since
473    len = c_strlen (src, 1); if (len) expand_expr (len, ...); would not
474    evaluate the side-effects.
475
476    The value returned is of type `ssizetype'.
477
478    Unfortunately, string_constant can't access the values of const char
479    arrays with initializers, so neither can we do so here.  */
480
481 tree
482 c_strlen (tree src, int only_value)
483 {
484   tree offset_node;
485   HOST_WIDE_INT offset;
486   int max;
487   const char *ptr;
488   location_t loc;
489
490   STRIP_NOPS (src);
491   if (TREE_CODE (src) == COND_EXPR
492       && (only_value || !TREE_SIDE_EFFECTS (TREE_OPERAND (src, 0))))
493     {
494       tree len1, len2;
495
496       len1 = c_strlen (TREE_OPERAND (src, 1), only_value);
497       len2 = c_strlen (TREE_OPERAND (src, 2), only_value);
498       if (tree_int_cst_equal (len1, len2))
499         return len1;
500     }
501
502   if (TREE_CODE (src) == COMPOUND_EXPR
503       && (only_value || !TREE_SIDE_EFFECTS (TREE_OPERAND (src, 0))))
504     return c_strlen (TREE_OPERAND (src, 1), only_value);
505
506   loc = EXPR_LOC_OR_HERE (src);
507
508   src = string_constant (src, &offset_node);
509   if (src == 0)
510     return NULL_TREE;
511
512   max = TREE_STRING_LENGTH (src) - 1;
513   ptr = TREE_STRING_POINTER (src);
514
515   if (offset_node && TREE_CODE (offset_node) != INTEGER_CST)
516     {
517       /* If the string has an internal zero byte (e.g., "foo\0bar"), we can't
518          compute the offset to the following null if we don't know where to
519          start searching for it.  */
520       int i;
521
522       for (i = 0; i < max; i++)
523         if (ptr[i] == 0)
524           return NULL_TREE;
525
526       /* We don't know the starting offset, but we do know that the string
527          has no internal zero bytes.  We can assume that the offset falls
528          within the bounds of the string; otherwise, the programmer deserves
529          what he gets.  Subtract the offset from the length of the string,
530          and return that.  This would perhaps not be valid if we were dealing
531          with named arrays in addition to literal string constants.  */
532
533       return size_diffop_loc (loc, size_int (max), offset_node);
534     }
535
536   /* We have a known offset into the string.  Start searching there for
537      a null character if we can represent it as a single HOST_WIDE_INT.  */
538   if (offset_node == 0)
539     offset = 0;
540   else if (! host_integerp (offset_node, 0))
541     offset = -1;
542   else
543     offset = tree_low_cst (offset_node, 0);
544
545   /* If the offset is known to be out of bounds, warn, and call strlen at
546      runtime.  */
547   if (offset < 0 || offset > max)
548     {
549      /* Suppress multiple warnings for propagated constant strings.  */
550       if (! TREE_NO_WARNING (src))
551         {
552           warning_at (loc, 0, "offset outside bounds of constant string");
553           TREE_NO_WARNING (src) = 1;
554         }
555       return NULL_TREE;
556     }
557
558   /* Use strlen to search for the first zero byte.  Since any strings
559      constructed with build_string will have nulls appended, we win even
560      if we get handed something like (char[4])"abcd".
561
562      Since OFFSET is our starting index into the string, no further
563      calculation is needed.  */
564   return ssize_int (strlen (ptr + offset));
565 }
566
567 /* Return a char pointer for a C string if it is a string constant
568    or sum of string constant and integer constant.  */
569
570 static const char *
571 c_getstr (tree src)
572 {
573   tree offset_node;
574
575   src = string_constant (src, &offset_node);
576   if (src == 0)
577     return 0;
578
579   if (offset_node == 0)
580     return TREE_STRING_POINTER (src);
581   else if (!host_integerp (offset_node, 1)
582            || compare_tree_int (offset_node, TREE_STRING_LENGTH (src) - 1) > 0)
583     return 0;
584
585   return TREE_STRING_POINTER (src) + tree_low_cst (offset_node, 1);
586 }
587
588 /* Return a CONST_INT or CONST_DOUBLE corresponding to target reading
589    GET_MODE_BITSIZE (MODE) bits from string constant STR.  */
590
591 static rtx
592 c_readstr (const char *str, enum machine_mode mode)
593 {
594   HOST_WIDE_INT c[2];
595   HOST_WIDE_INT ch;
596   unsigned int i, j;
597
598   gcc_assert (GET_MODE_CLASS (mode) == MODE_INT);
599
600   c[0] = 0;
601   c[1] = 0;
602   ch = 1;
603   for (i = 0; i < GET_MODE_SIZE (mode); i++)
604     {
605       j = i;
606       if (WORDS_BIG_ENDIAN)
607         j = GET_MODE_SIZE (mode) - i - 1;
608       if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN
609           && GET_MODE_SIZE (mode) >= UNITS_PER_WORD)
610         j = j + UNITS_PER_WORD - 2 * (j % UNITS_PER_WORD) - 1;
611       j *= BITS_PER_UNIT;
612       gcc_assert (j < 2 * HOST_BITS_PER_WIDE_INT);
613
614       if (ch)
615         ch = (unsigned char) str[i];
616       c[j / HOST_BITS_PER_WIDE_INT] |= ch << (j % HOST_BITS_PER_WIDE_INT);
617     }
618   return immed_double_const (c[0], c[1], mode);
619 }
620
621 /* Cast a target constant CST to target CHAR and if that value fits into
622    host char type, return zero and put that value into variable pointed to by
623    P.  */
624
625 static int
626 target_char_cast (tree cst, char *p)
627 {
628   unsigned HOST_WIDE_INT val, hostval;
629
630   if (TREE_CODE (cst) != INTEGER_CST
631       || CHAR_TYPE_SIZE > HOST_BITS_PER_WIDE_INT)
632     return 1;
633
634   val = TREE_INT_CST_LOW (cst);
635   if (CHAR_TYPE_SIZE < HOST_BITS_PER_WIDE_INT)
636     val &= (((unsigned HOST_WIDE_INT) 1) << CHAR_TYPE_SIZE) - 1;
637
638   hostval = val;
639   if (HOST_BITS_PER_CHAR < HOST_BITS_PER_WIDE_INT)
640     hostval &= (((unsigned HOST_WIDE_INT) 1) << HOST_BITS_PER_CHAR) - 1;
641
642   if (val != hostval)
643     return 1;
644
645   *p = hostval;
646   return 0;
647 }
648
649 /* Similar to save_expr, but assumes that arbitrary code is not executed
650    in between the multiple evaluations.  In particular, we assume that a
651    non-addressable local variable will not be modified.  */
652
653 static tree
654 builtin_save_expr (tree exp)
655 {
656   if (TREE_CODE (exp) == SSA_NAME
657       || (TREE_ADDRESSABLE (exp) == 0
658           && (TREE_CODE (exp) == PARM_DECL
659               || (TREE_CODE (exp) == VAR_DECL && !TREE_STATIC (exp)))))
660     return exp;
661
662   return save_expr (exp);
663 }
664
665 /* Given TEM, a pointer to a stack frame, follow the dynamic chain COUNT
666    times to get the address of either a higher stack frame, or a return
667    address located within it (depending on FNDECL_CODE).  */
668
669 static rtx
670 expand_builtin_return_addr (enum built_in_function fndecl_code, int count)
671 {
672   int i;
673
674 #ifdef INITIAL_FRAME_ADDRESS_RTX
675   rtx tem = INITIAL_FRAME_ADDRESS_RTX;
676 #else
677   rtx tem;
678
679   /* For a zero count with __builtin_return_address, we don't care what
680      frame address we return, because target-specific definitions will
681      override us.  Therefore frame pointer elimination is OK, and using
682      the soft frame pointer is OK.
683
684      For a nonzero count, or a zero count with __builtin_frame_address,
685      we require a stable offset from the current frame pointer to the
686      previous one, so we must use the hard frame pointer, and
687      we must disable frame pointer elimination.  */
688   if (count == 0 && fndecl_code == BUILT_IN_RETURN_ADDRESS)
689     tem = frame_pointer_rtx;
690   else
691     {
692       tem = hard_frame_pointer_rtx;
693
694       /* Tell reload not to eliminate the frame pointer.  */
695       crtl->accesses_prior_frames = 1;
696     }
697 #endif
698
699   /* Some machines need special handling before we can access
700      arbitrary frames.  For example, on the SPARC, we must first flush
701      all register windows to the stack.  */
702 #ifdef SETUP_FRAME_ADDRESSES
703   if (count > 0)
704     SETUP_FRAME_ADDRESSES ();
705 #endif
706
707   /* On the SPARC, the return address is not in the frame, it is in a
708      register.  There is no way to access it off of the current frame
709      pointer, but it can be accessed off the previous frame pointer by
710      reading the value from the register window save area.  */
711 #ifdef RETURN_ADDR_IN_PREVIOUS_FRAME
712   if (fndecl_code == BUILT_IN_RETURN_ADDRESS)
713     count--;
714 #endif
715
716   /* Scan back COUNT frames to the specified frame.  */
717   for (i = 0; i < count; i++)
718     {
719       /* Assume the dynamic chain pointer is in the word that the
720          frame address points to, unless otherwise specified.  */
721 #ifdef DYNAMIC_CHAIN_ADDRESS
722       tem = DYNAMIC_CHAIN_ADDRESS (tem);
723 #endif
724       tem = memory_address (Pmode, tem);
725       tem = gen_frame_mem (Pmode, tem);
726       tem = copy_to_reg (tem);
727     }
728
729   /* For __builtin_frame_address, return what we've got.  But, on
730      the SPARC for example, we may have to add a bias.  */
731   if (fndecl_code == BUILT_IN_FRAME_ADDRESS)
732 #ifdef FRAME_ADDR_RTX
733     return FRAME_ADDR_RTX (tem);
734 #else
735     return tem;
736 #endif
737
738   /* For __builtin_return_address, get the return address from that frame.  */
739 #ifdef RETURN_ADDR_RTX
740   tem = RETURN_ADDR_RTX (count, tem);
741 #else
742   tem = memory_address (Pmode,
743                         plus_constant (tem, GET_MODE_SIZE (Pmode)));
744   tem = gen_frame_mem (Pmode, tem);
745 #endif
746   return tem;
747 }
748
749 /* Alias set used for setjmp buffer.  */
750 static alias_set_type setjmp_alias_set = -1;
751
752 /* Construct the leading half of a __builtin_setjmp call.  Control will
753    return to RECEIVER_LABEL.  This is also called directly by the SJLJ
754    exception handling code.  */
755
756 void
757 expand_builtin_setjmp_setup (rtx buf_addr, rtx receiver_label)
758 {
759   enum machine_mode sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL);
760   rtx stack_save;
761   rtx mem;
762
763   if (setjmp_alias_set == -1)
764     setjmp_alias_set = new_alias_set ();
765
766   buf_addr = convert_memory_address (Pmode, buf_addr);
767
768   buf_addr = force_reg (Pmode, force_operand (buf_addr, NULL_RTX));
769
770   /* We store the frame pointer and the address of receiver_label in
771      the buffer and use the rest of it for the stack save area, which
772      is machine-dependent.  */
773
774   mem = gen_rtx_MEM (Pmode, buf_addr);
775   set_mem_alias_set (mem, setjmp_alias_set);
776   emit_move_insn (mem, targetm.builtin_setjmp_frame_value ());
777
778   mem = gen_rtx_MEM (Pmode, plus_constant (buf_addr, GET_MODE_SIZE (Pmode))),
779   set_mem_alias_set (mem, setjmp_alias_set);
780
781   emit_move_insn (validize_mem (mem),
782                   force_reg (Pmode, gen_rtx_LABEL_REF (Pmode, receiver_label)));
783
784   stack_save = gen_rtx_MEM (sa_mode,
785                             plus_constant (buf_addr,
786                                            2 * GET_MODE_SIZE (Pmode)));
787   set_mem_alias_set (stack_save, setjmp_alias_set);
788   emit_stack_save (SAVE_NONLOCAL, &stack_save);
789
790   /* If there is further processing to do, do it.  */
791 #ifdef HAVE_builtin_setjmp_setup
792   if (HAVE_builtin_setjmp_setup)
793     emit_insn (gen_builtin_setjmp_setup (buf_addr));
794 #endif
795
796   /* Tell optimize_save_area_alloca that extra work is going to
797      need to go on during alloca.  */
798   cfun->calls_setjmp = 1;
799
800   /* We have a nonlocal label.   */
801   cfun->has_nonlocal_label = 1;
802 }
803
804 /* Construct the trailing part of a __builtin_setjmp call.  This is
805    also called directly by the SJLJ exception handling code.  */
806
807 void
808 expand_builtin_setjmp_receiver (rtx receiver_label ATTRIBUTE_UNUSED)
809 {
810   rtx chain;
811
812   /* Clobber the FP when we get here, so we have to make sure it's
813      marked as used by this function.  */
814   emit_use (hard_frame_pointer_rtx);
815
816   /* Mark the static chain as clobbered here so life information
817      doesn't get messed up for it.  */
818   chain = targetm.calls.static_chain (current_function_decl, true);
819   if (chain && REG_P (chain))
820     emit_clobber (chain);
821
822   /* Now put in the code to restore the frame pointer, and argument
823      pointer, if needed.  */
824 #ifdef HAVE_nonlocal_goto
825   if (! HAVE_nonlocal_goto)
826 #endif
827     {
828       emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx);
829       /* This might change the hard frame pointer in ways that aren't
830          apparent to early optimization passes, so force a clobber.  */
831       emit_clobber (hard_frame_pointer_rtx);
832     }
833
834 #if !HARD_FRAME_POINTER_IS_ARG_POINTER
835   if (fixed_regs[ARG_POINTER_REGNUM])
836     {
837 #ifdef ELIMINABLE_REGS
838       size_t i;
839       static const struct elims {const int from, to;} elim_regs[] = ELIMINABLE_REGS;
840
841       for (i = 0; i < ARRAY_SIZE (elim_regs); i++)
842         if (elim_regs[i].from == ARG_POINTER_REGNUM
843             && elim_regs[i].to == HARD_FRAME_POINTER_REGNUM)
844           break;
845
846       if (i == ARRAY_SIZE (elim_regs))
847 #endif
848         {
849           /* Now restore our arg pointer from the address at which it
850              was saved in our stack frame.  */
851           emit_move_insn (crtl->args.internal_arg_pointer,
852                           copy_to_reg (get_arg_pointer_save_area ()));
853         }
854     }
855 #endif
856
857 #ifdef HAVE_builtin_setjmp_receiver
858   if (HAVE_builtin_setjmp_receiver)
859     emit_insn (gen_builtin_setjmp_receiver (receiver_label));
860   else
861 #endif
862 #ifdef HAVE_nonlocal_goto_receiver
863     if (HAVE_nonlocal_goto_receiver)
864       emit_insn (gen_nonlocal_goto_receiver ());
865     else
866 #endif
867       { /* Nothing */ }
868
869   /* We must not allow the code we just generated to be reordered by
870      scheduling.  Specifically, the update of the frame pointer must
871      happen immediately, not later.  */
872   emit_insn (gen_blockage ());
873 }
874
875 /* __builtin_longjmp is passed a pointer to an array of five words (not
876    all will be used on all machines).  It operates similarly to the C
877    library function of the same name, but is more efficient.  Much of
878    the code below is copied from the handling of non-local gotos.  */
879
880 static void
881 expand_builtin_longjmp (rtx buf_addr, rtx value)
882 {
883   rtx fp, lab, stack, insn, last;
884   enum machine_mode sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL);
885
886   /* DRAP is needed for stack realign if longjmp is expanded to current
887      function  */
888   if (SUPPORTS_STACK_ALIGNMENT)
889     crtl->need_drap = true;
890
891   if (setjmp_alias_set == -1)
892     setjmp_alias_set = new_alias_set ();
893
894   buf_addr = convert_memory_address (Pmode, buf_addr);
895
896   buf_addr = force_reg (Pmode, buf_addr);
897
898   /* We require that the user must pass a second argument of 1, because
899      that is what builtin_setjmp will return.  */
900   gcc_assert (value == const1_rtx);
901
902   last = get_last_insn ();
903 #ifdef HAVE_builtin_longjmp
904   if (HAVE_builtin_longjmp)
905     emit_insn (gen_builtin_longjmp (buf_addr));
906   else
907 #endif
908     {
909       fp = gen_rtx_MEM (Pmode, buf_addr);
910       lab = gen_rtx_MEM (Pmode, plus_constant (buf_addr,
911                                                GET_MODE_SIZE (Pmode)));
912
913       stack = gen_rtx_MEM (sa_mode, plus_constant (buf_addr,
914                                                    2 * GET_MODE_SIZE (Pmode)));
915       set_mem_alias_set (fp, setjmp_alias_set);
916       set_mem_alias_set (lab, setjmp_alias_set);
917       set_mem_alias_set (stack, setjmp_alias_set);
918
919       /* Pick up FP, label, and SP from the block and jump.  This code is
920          from expand_goto in stmt.c; see there for detailed comments.  */
921 #ifdef HAVE_nonlocal_goto
922       if (HAVE_nonlocal_goto)
923         /* We have to pass a value to the nonlocal_goto pattern that will
924            get copied into the static_chain pointer, but it does not matter
925            what that value is, because builtin_setjmp does not use it.  */
926         emit_insn (gen_nonlocal_goto (value, lab, stack, fp));
927       else
928 #endif
929         {
930           lab = copy_to_reg (lab);
931
932           emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
933           emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
934
935           emit_move_insn (hard_frame_pointer_rtx, fp);
936           emit_stack_restore (SAVE_NONLOCAL, stack);
937
938           emit_use (hard_frame_pointer_rtx);
939           emit_use (stack_pointer_rtx);
940           emit_indirect_jump (lab);
941         }
942     }
943
944   /* Search backwards and mark the jump insn as a non-local goto.
945      Note that this precludes the use of __builtin_longjmp to a
946      __builtin_setjmp target in the same function.  However, we've
947      already cautioned the user that these functions are for
948      internal exception handling use only.  */
949   for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
950     {
951       gcc_assert (insn != last);
952
953       if (JUMP_P (insn))
954         {
955           add_reg_note (insn, REG_NON_LOCAL_GOTO, const0_rtx);
956           break;
957         }
958       else if (CALL_P (insn))
959         break;
960     }
961 }
962
963 /* Expand a call to __builtin_nonlocal_goto.  We're passed the target label
964    and the address of the save area.  */
965
966 static rtx
967 expand_builtin_nonlocal_goto (tree exp)
968 {
969   tree t_label, t_save_area;
970   rtx r_label, r_save_area, r_fp, r_sp, insn;
971
972   if (!validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
973     return NULL_RTX;
974
975   t_label = CALL_EXPR_ARG (exp, 0);
976   t_save_area = CALL_EXPR_ARG (exp, 1);
977
978   r_label = expand_normal (t_label);
979   r_label = convert_memory_address (Pmode, r_label);
980   r_save_area = expand_normal (t_save_area);
981   r_save_area = convert_memory_address (Pmode, r_save_area);
982   /* Copy the address of the save location to a register just in case it was based
983     on the frame pointer.   */
984   r_save_area = copy_to_reg (r_save_area);
985   r_fp = gen_rtx_MEM (Pmode, r_save_area);
986   r_sp = gen_rtx_MEM (STACK_SAVEAREA_MODE (SAVE_NONLOCAL),
987                       plus_constant (r_save_area, GET_MODE_SIZE (Pmode)));
988
989   crtl->has_nonlocal_goto = 1;
990
991 #ifdef HAVE_nonlocal_goto
992   /* ??? We no longer need to pass the static chain value, afaik.  */
993   if (HAVE_nonlocal_goto)
994     emit_insn (gen_nonlocal_goto (const0_rtx, r_label, r_sp, r_fp));
995   else
996 #endif
997     {
998       r_label = copy_to_reg (r_label);
999
1000       emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
1001       emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
1002
1003       /* Restore frame pointer for containing function.
1004          This sets the actual hard register used for the frame pointer
1005          to the location of the function's incoming static chain info.
1006          The non-local goto handler will then adjust it to contain the
1007          proper value and reload the argument pointer, if needed.  */
1008       emit_move_insn (hard_frame_pointer_rtx, r_fp);
1009       emit_stack_restore (SAVE_NONLOCAL, r_sp);
1010
1011       /* USE of hard_frame_pointer_rtx added for consistency;
1012          not clear if really needed.  */
1013       emit_use (hard_frame_pointer_rtx);
1014       emit_use (stack_pointer_rtx);
1015
1016       /* If the architecture is using a GP register, we must
1017          conservatively assume that the target function makes use of it.
1018          The prologue of functions with nonlocal gotos must therefore
1019          initialize the GP register to the appropriate value, and we
1020          must then make sure that this value is live at the point
1021          of the jump.  (Note that this doesn't necessarily apply
1022          to targets with a nonlocal_goto pattern; they are free
1023          to implement it in their own way.  Note also that this is
1024          a no-op if the GP register is a global invariant.)  */
1025       if ((unsigned) PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
1026           && fixed_regs[PIC_OFFSET_TABLE_REGNUM])
1027         emit_use (pic_offset_table_rtx);
1028
1029       emit_indirect_jump (r_label);
1030     }
1031
1032   /* Search backwards to the jump insn and mark it as a
1033      non-local goto.  */
1034   for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
1035     {
1036       if (JUMP_P (insn))
1037         {
1038           add_reg_note (insn, REG_NON_LOCAL_GOTO, const0_rtx);
1039           break;
1040         }
1041       else if (CALL_P (insn))
1042         break;
1043     }
1044
1045   return const0_rtx;
1046 }
1047
1048 /* __builtin_update_setjmp_buf is passed a pointer to an array of five words
1049    (not all will be used on all machines) that was passed to __builtin_setjmp.
1050    It updates the stack pointer in that block to correspond to the current
1051    stack pointer.  */
1052
1053 static void
1054 expand_builtin_update_setjmp_buf (rtx buf_addr)
1055 {
1056   enum machine_mode sa_mode = Pmode;
1057   rtx stack_save;
1058
1059
1060 #ifdef HAVE_save_stack_nonlocal
1061   if (HAVE_save_stack_nonlocal)
1062     sa_mode = insn_data[(int) CODE_FOR_save_stack_nonlocal].operand[0].mode;
1063 #endif
1064 #ifdef STACK_SAVEAREA_MODE
1065   sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL);
1066 #endif
1067
1068   stack_save
1069     = gen_rtx_MEM (sa_mode,
1070                    memory_address
1071                    (sa_mode,
1072                     plus_constant (buf_addr, 2 * GET_MODE_SIZE (Pmode))));
1073
1074 #ifdef HAVE_setjmp
1075   if (HAVE_setjmp)
1076     emit_insn (gen_setjmp ());
1077 #endif
1078
1079   emit_stack_save (SAVE_NONLOCAL, &stack_save);
1080 }
1081
1082 /* Expand a call to __builtin_prefetch.  For a target that does not support
1083    data prefetch, evaluate the memory address argument in case it has side
1084    effects.  */
1085
1086 static void
1087 expand_builtin_prefetch (tree exp)
1088 {
1089   tree arg0, arg1, arg2;
1090   int nargs;
1091   rtx op0, op1, op2;
1092
1093   if (!validate_arglist (exp, POINTER_TYPE, 0))
1094     return;
1095
1096   arg0 = CALL_EXPR_ARG (exp, 0);
1097
1098   /* Arguments 1 and 2 are optional; argument 1 (read/write) defaults to
1099      zero (read) and argument 2 (locality) defaults to 3 (high degree of
1100      locality).  */
1101   nargs = call_expr_nargs (exp);
1102   if (nargs > 1)
1103     arg1 = CALL_EXPR_ARG (exp, 1);
1104   else
1105     arg1 = integer_zero_node;
1106   if (nargs > 2)
1107     arg2 = CALL_EXPR_ARG (exp, 2);
1108   else
1109     arg2 = integer_three_node;
1110
1111   /* Argument 0 is an address.  */
1112   op0 = expand_expr (arg0, NULL_RTX, Pmode, EXPAND_NORMAL);
1113
1114   /* Argument 1 (read/write flag) must be a compile-time constant int.  */
1115   if (TREE_CODE (arg1) != INTEGER_CST)
1116     {
1117       error ("second argument to %<__builtin_prefetch%> must be a constant");
1118       arg1 = integer_zero_node;
1119     }
1120   op1 = expand_normal (arg1);
1121   /* Argument 1 must be either zero or one.  */
1122   if (INTVAL (op1) != 0 && INTVAL (op1) != 1)
1123     {
1124       warning (0, "invalid second argument to %<__builtin_prefetch%>;"
1125                " using zero");
1126       op1 = const0_rtx;
1127     }
1128
1129   /* Argument 2 (locality) must be a compile-time constant int.  */
1130   if (TREE_CODE (arg2) != INTEGER_CST)
1131     {
1132       error ("third argument to %<__builtin_prefetch%> must be a constant");
1133       arg2 = integer_zero_node;
1134     }
1135   op2 = expand_normal (arg2);
1136   /* Argument 2 must be 0, 1, 2, or 3.  */
1137   if (INTVAL (op2) < 0 || INTVAL (op2) > 3)
1138     {
1139       warning (0, "invalid third argument to %<__builtin_prefetch%>; using zero");
1140       op2 = const0_rtx;
1141     }
1142
1143 #ifdef HAVE_prefetch
1144   if (HAVE_prefetch)
1145     {
1146       struct expand_operand ops[3];
1147
1148       create_address_operand (&ops[0], op0);
1149       create_integer_operand (&ops[1], INTVAL (op1));
1150       create_integer_operand (&ops[2], INTVAL (op2));
1151       if (maybe_expand_insn (CODE_FOR_prefetch, 3, ops))
1152         return;
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);
1561   else
1562 #endif
1563     emit_stack_save (SAVE_BLOCK, &old_stack_level);
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);
1680   else
1681 #endif
1682     emit_stack_restore (SAVE_BLOCK, old_stack_level);
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       struct expand_operand ops[1];
2433       rtx last = get_last_insn ();
2434       tree orig_arg = arg;
2435
2436       /* Wrap the computation of the argument in a SAVE_EXPR, as we may
2437          need to expand the argument again.  This way, we will not perform
2438          side-effects more the once.  */
2439       CALL_EXPR_ARG (exp, 0) = arg = builtin_save_expr (arg);
2440
2441       op0 = expand_expr (arg, NULL_RTX, VOIDmode, EXPAND_NORMAL);
2442
2443       if (mode != GET_MODE (op0))
2444         op0 = convert_to_mode (mode, op0, 0);
2445
2446       create_output_operand (&ops[0], target, TYPE_MODE (TREE_TYPE (exp)));
2447       if (maybe_legitimize_operands (icode, 0, 1, ops)
2448           && maybe_emit_unop_insn (icode, ops[0].value, op0, UNKNOWN))
2449         return ops[0].value;
2450
2451       delete_insns_since (last);
2452       CALL_EXPR_ARG (exp, 0) = orig_arg;
2453     }
2454
2455   return NULL_RTX;
2456 }
2457
2458 /* Expand a call to the builtin sincos math function.
2459    Return NULL_RTX if a normal call should be emitted rather than expanding the
2460    function in-line.  EXP is the expression that is a call to the builtin
2461    function.  */
2462
2463 static rtx
2464 expand_builtin_sincos (tree exp)
2465 {
2466   rtx op0, op1, op2, target1, target2;
2467   enum machine_mode mode;
2468   tree arg, sinp, cosp;
2469   int result;
2470   location_t loc = EXPR_LOCATION (exp);
2471   tree alias_type, alias_off;
2472
2473   if (!validate_arglist (exp, REAL_TYPE,
2474                          POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
2475     return NULL_RTX;
2476
2477   arg = CALL_EXPR_ARG (exp, 0);
2478   sinp = CALL_EXPR_ARG (exp, 1);
2479   cosp = CALL_EXPR_ARG (exp, 2);
2480
2481   /* Make a suitable register to place result in.  */
2482   mode = TYPE_MODE (TREE_TYPE (arg));
2483
2484   /* Check if sincos insn is available, otherwise emit the call.  */
2485   if (optab_handler (sincos_optab, mode) == CODE_FOR_nothing)
2486     return NULL_RTX;
2487
2488   target1 = gen_reg_rtx (mode);
2489   target2 = gen_reg_rtx (mode);
2490
2491   op0 = expand_normal (arg);
2492   alias_type = build_pointer_type_for_mode (TREE_TYPE (arg), ptr_mode, true);
2493   alias_off = build_int_cst (alias_type, 0);
2494   op1 = expand_normal (fold_build2_loc (loc, MEM_REF, TREE_TYPE (arg),
2495                                         sinp, alias_off));
2496   op2 = expand_normal (fold_build2_loc (loc, MEM_REF, TREE_TYPE (arg),
2497                                         cosp, alias_off));
2498
2499   /* Compute into target1 and target2.
2500      Set TARGET to wherever the result comes back.  */
2501   result = expand_twoval_unop (sincos_optab, op0, target2, target1, 0);
2502   gcc_assert (result);
2503
2504   /* Move target1 and target2 to the memory locations indicated
2505      by op1 and op2.  */
2506   emit_move_insn (op1, target1);
2507   emit_move_insn (op2, target2);
2508
2509   return const0_rtx;
2510 }
2511
2512 /* Expand a call to the internal cexpi builtin to the sincos math function.
2513    EXP is the expression that is a call to the builtin function; if convenient,
2514    the result should be placed in TARGET.  */
2515
2516 static rtx
2517 expand_builtin_cexpi (tree exp, rtx target)
2518 {
2519   tree fndecl = get_callee_fndecl (exp);
2520   tree arg, type;
2521   enum machine_mode mode;
2522   rtx op0, op1, op2;
2523   location_t loc = EXPR_LOCATION (exp);
2524
2525   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
2526     return NULL_RTX;
2527
2528   arg = CALL_EXPR_ARG (exp, 0);
2529   type = TREE_TYPE (arg);
2530   mode = TYPE_MODE (TREE_TYPE (arg));
2531
2532   /* Try expanding via a sincos optab, fall back to emitting a libcall
2533      to sincos or cexp.  We are sure we have sincos or cexp because cexpi
2534      is only generated from sincos, cexp or if we have either of them.  */
2535   if (optab_handler (sincos_optab, mode) != CODE_FOR_nothing)
2536     {
2537       op1 = gen_reg_rtx (mode);
2538       op2 = gen_reg_rtx (mode);
2539
2540       op0 = expand_expr (arg, NULL_RTX, VOIDmode, EXPAND_NORMAL);
2541
2542       /* Compute into op1 and op2.  */
2543       expand_twoval_unop (sincos_optab, op0, op2, op1, 0);
2544     }
2545   else if (TARGET_HAS_SINCOS)
2546     {
2547       tree call, fn = NULL_TREE;
2548       tree top1, top2;
2549       rtx op1a, op2a;
2550
2551       if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIF)
2552         fn = built_in_decls[BUILT_IN_SINCOSF];
2553       else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPI)
2554         fn = built_in_decls[BUILT_IN_SINCOS];
2555       else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIL)
2556         fn = built_in_decls[BUILT_IN_SINCOSL];
2557       else
2558         gcc_unreachable ();
2559
2560       op1 = assign_temp (TREE_TYPE (arg), 0, 1, 1);
2561       op2 = assign_temp (TREE_TYPE (arg), 0, 1, 1);
2562       op1a = copy_to_mode_reg (Pmode, XEXP (op1, 0));
2563       op2a = copy_to_mode_reg (Pmode, XEXP (op2, 0));
2564       top1 = make_tree (build_pointer_type (TREE_TYPE (arg)), op1a);
2565       top2 = make_tree (build_pointer_type (TREE_TYPE (arg)), op2a);
2566
2567       /* Make sure not to fold the sincos call again.  */
2568       call = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn);
2569       expand_normal (build_call_nary (TREE_TYPE (TREE_TYPE (fn)),
2570                                       call, 3, arg, top1, top2));
2571     }
2572   else
2573     {
2574       tree call, fn = NULL_TREE, narg;
2575       tree ctype = build_complex_type (type);
2576
2577       if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIF)
2578         fn = built_in_decls[BUILT_IN_CEXPF];
2579       else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPI)
2580         fn = built_in_decls[BUILT_IN_CEXP];
2581       else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIL)
2582         fn = built_in_decls[BUILT_IN_CEXPL];
2583       else
2584         gcc_unreachable ();
2585
2586       /* If we don't have a decl for cexp create one.  This is the
2587          friendliest fallback if the user calls __builtin_cexpi
2588          without full target C99 function support.  */
2589       if (fn == NULL_TREE)
2590         {
2591           tree fntype;
2592           const char *name = NULL;
2593
2594           if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIF)
2595             name = "cexpf";
2596           else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPI)
2597             name = "cexp";
2598           else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIL)
2599             name = "cexpl";
2600
2601           fntype = build_function_type_list (ctype, ctype, NULL_TREE);
2602           fn = build_fn_decl (name, fntype);
2603         }
2604
2605       narg = fold_build2_loc (loc, COMPLEX_EXPR, ctype,
2606                           build_real (type, dconst0), arg);
2607
2608       /* Make sure not to fold the cexp call again.  */
2609       call = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn);
2610       return expand_expr (build_call_nary (ctype, call, 1, narg),
2611                           target, VOIDmode, EXPAND_NORMAL);
2612     }
2613
2614   /* Now build the proper return type.  */
2615   return expand_expr (build2 (COMPLEX_EXPR, build_complex_type (type),
2616                               make_tree (TREE_TYPE (arg), op2),
2617                               make_tree (TREE_TYPE (arg), op1)),
2618                       target, VOIDmode, EXPAND_NORMAL);
2619 }
2620
2621 /* Conveniently construct a function call expression.  FNDECL names the
2622    function to be called, N is the number of arguments, and the "..."
2623    parameters are the argument expressions.  Unlike build_call_exr
2624    this doesn't fold the call, hence it will always return a CALL_EXPR.  */
2625
2626 static tree
2627 build_call_nofold_loc (location_t loc, tree fndecl, int n, ...)
2628 {
2629   va_list ap;
2630   tree fntype = TREE_TYPE (fndecl);
2631   tree fn = build1 (ADDR_EXPR, build_pointer_type (fntype), fndecl);
2632
2633   va_start (ap, n);
2634   fn = build_call_valist (TREE_TYPE (fntype), fn, n, ap);
2635   va_end (ap);
2636   SET_EXPR_LOCATION (fn, loc);
2637   return fn;
2638 }
2639
2640 /* Expand a call to one of the builtin rounding functions gcc defines
2641    as an extension (lfloor and lceil).  As these are gcc extensions we
2642    do not need to worry about setting errno to EDOM.
2643    If expanding via optab fails, lower expression to (int)(floor(x)).
2644    EXP is the expression that is a call to the builtin function;
2645    if convenient, the result should be placed in TARGET.  */
2646
2647 static rtx
2648 expand_builtin_int_roundingfn (tree exp, rtx target)
2649 {
2650   convert_optab builtin_optab;
2651   rtx op0, insns, tmp;
2652   tree fndecl = get_callee_fndecl (exp);
2653   enum built_in_function fallback_fn;
2654   tree fallback_fndecl;
2655   enum machine_mode mode;
2656   tree arg;
2657
2658   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
2659     gcc_unreachable ();
2660
2661   arg = CALL_EXPR_ARG (exp, 0);
2662
2663   switch (DECL_FUNCTION_CODE (fndecl))
2664     {
2665     CASE_FLT_FN (BUILT_IN_LCEIL):
2666     CASE_FLT_FN (BUILT_IN_LLCEIL):
2667       builtin_optab = lceil_optab;
2668       fallback_fn = BUILT_IN_CEIL;
2669       break;
2670
2671     CASE_FLT_FN (BUILT_IN_LFLOOR):
2672     CASE_FLT_FN (BUILT_IN_LLFLOOR):
2673       builtin_optab = lfloor_optab;
2674       fallback_fn = BUILT_IN_FLOOR;
2675       break;
2676
2677     default:
2678       gcc_unreachable ();
2679     }
2680
2681   /* Make a suitable register to place result in.  */
2682   mode = TYPE_MODE (TREE_TYPE (exp));
2683
2684   target = gen_reg_rtx (mode);
2685
2686   /* Wrap the computation of the argument in a SAVE_EXPR, as we may
2687      need to expand the argument again.  This way, we will not perform
2688      side-effects more the once.  */
2689   CALL_EXPR_ARG (exp, 0) = arg = builtin_save_expr (arg);
2690
2691   op0 = expand_expr (arg, NULL, VOIDmode, EXPAND_NORMAL);
2692
2693   start_sequence ();
2694
2695   /* Compute into TARGET.  */
2696   if (expand_sfix_optab (target, op0, builtin_optab))
2697     {
2698       /* Output the entire sequence.  */
2699       insns = get_insns ();
2700       end_sequence ();
2701       emit_insn (insns);
2702       return target;
2703     }
2704
2705   /* If we were unable to expand via the builtin, stop the sequence
2706      (without outputting the insns).  */
2707   end_sequence ();
2708
2709   /* Fall back to floating point rounding optab.  */
2710   fallback_fndecl = mathfn_built_in (TREE_TYPE (arg), fallback_fn);
2711
2712   /* For non-C99 targets we may end up without a fallback fndecl here
2713      if the user called __builtin_lfloor directly.  In this case emit
2714      a call to the floor/ceil variants nevertheless.  This should result
2715      in the best user experience for not full C99 targets.  */
2716   if (fallback_fndecl == NULL_TREE)
2717     {
2718       tree fntype;
2719       const char *name = NULL;
2720
2721       switch (DECL_FUNCTION_CODE (fndecl))
2722         {
2723         case BUILT_IN_LCEIL:
2724         case BUILT_IN_LLCEIL:
2725           name = "ceil";
2726           break;
2727         case BUILT_IN_LCEILF:
2728         case BUILT_IN_LLCEILF:
2729           name = "ceilf";
2730           break;
2731         case BUILT_IN_LCEILL:
2732         case BUILT_IN_LLCEILL:
2733           name = "ceill";
2734           break;
2735         case BUILT_IN_LFLOOR:
2736         case BUILT_IN_LLFLOOR:
2737           name = "floor";
2738           break;
2739         case BUILT_IN_LFLOORF:
2740         case BUILT_IN_LLFLOORF:
2741           name = "floorf";
2742           break;
2743         case BUILT_IN_LFLOORL:
2744         case BUILT_IN_LLFLOORL:
2745           name = "floorl";
2746           break;
2747         default:
2748           gcc_unreachable ();
2749         }
2750
2751       fntype = build_function_type_list (TREE_TYPE (arg),
2752                                          TREE_TYPE (arg), NULL_TREE);
2753       fallback_fndecl = build_fn_decl (name, fntype);
2754     }
2755
2756   exp = build_call_nofold_loc (EXPR_LOCATION (exp), fallback_fndecl, 1, arg);
2757
2758   tmp = expand_normal (exp);
2759
2760   /* Truncate the result of floating point optab to integer
2761      via expand_fix ().  */
2762   target = gen_reg_rtx (mode);
2763   expand_fix (target, tmp, 0);
2764
2765   return target;
2766 }
2767
2768 /* Expand a call to one of the builtin math functions doing integer
2769    conversion (lrint).
2770    Return 0 if a normal call should be emitted rather than expanding the
2771    function in-line.  EXP is the expression that is a call to the builtin
2772    function; if convenient, the result should be placed in TARGET.  */
2773
2774 static rtx
2775 expand_builtin_int_roundingfn_2 (tree exp, rtx target)
2776 {
2777   convert_optab builtin_optab;
2778   rtx op0, insns;
2779   tree fndecl = get_callee_fndecl (exp);
2780   tree arg;
2781   enum machine_mode mode;
2782
2783   /* There's no easy way to detect the case we need to set EDOM.  */
2784   if (flag_errno_math)
2785     return NULL_RTX;
2786
2787   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
2788      gcc_unreachable ();
2789
2790   arg = CALL_EXPR_ARG (exp, 0);
2791
2792   switch (DECL_FUNCTION_CODE (fndecl))
2793     {
2794     CASE_FLT_FN (BUILT_IN_LRINT):
2795     CASE_FLT_FN (BUILT_IN_LLRINT):
2796       builtin_optab = lrint_optab; break;
2797     CASE_FLT_FN (BUILT_IN_LROUND):
2798     CASE_FLT_FN (BUILT_IN_LLROUND):
2799       builtin_optab = lround_optab; break;
2800     default:
2801       gcc_unreachable ();
2802     }
2803
2804   /* Make a suitable register to place result in.  */
2805   mode = TYPE_MODE (TREE_TYPE (exp));
2806
2807   target = gen_reg_rtx (mode);
2808
2809   /* Wrap the computation of the argument in a SAVE_EXPR, as we may
2810      need to expand the argument again.  This way, we will not perform
2811      side-effects more the once.  */
2812   CALL_EXPR_ARG (exp, 0) = arg = builtin_save_expr (arg);
2813
2814   op0 = expand_expr (arg, NULL, VOIDmode, EXPAND_NORMAL);
2815
2816   start_sequence ();
2817
2818   if (expand_sfix_optab (target, op0, builtin_optab))
2819     {
2820       /* Output the entire sequence.  */
2821       insns = get_insns ();
2822       end_sequence ();
2823       emit_insn (insns);
2824       return target;
2825     }
2826
2827   /* If we were unable to expand via the builtin, stop the sequence
2828      (without outputting the insns) and call to the library function
2829      with the stabilized argument list.  */
2830   end_sequence ();
2831
2832   target = expand_call (exp, target, target == const0_rtx);
2833
2834   return target;
2835 }
2836
2837 /* To evaluate powi(x,n), the floating point value x raised to the
2838    constant integer exponent n, we use a hybrid algorithm that
2839    combines the "window method" with look-up tables.  For an
2840    introduction to exponentiation algorithms and "addition chains",
2841    see section 4.6.3, "Evaluation of Powers" of Donald E. Knuth,
2842    "Seminumerical Algorithms", Vol. 2, "The Art of Computer Programming",
2843    3rd Edition, 1998, and Daniel M. Gordon, "A Survey of Fast Exponentiation
2844    Methods", Journal of Algorithms, Vol. 27, pp. 129-146, 1998.  */
2845
2846 /* Provide a default value for POWI_MAX_MULTS, the maximum number of
2847    multiplications to inline before calling the system library's pow
2848    function.  powi(x,n) requires at worst 2*bits(n)-2 multiplications,
2849    so this default never requires calling pow, powf or powl.  */
2850
2851 #ifndef POWI_MAX_MULTS
2852 #define POWI_MAX_MULTS  (2*HOST_BITS_PER_WIDE_INT-2)
2853 #endif
2854
2855 /* The size of the "optimal power tree" lookup table.  All
2856    exponents less than this value are simply looked up in the
2857    powi_table below.  This threshold is also used to size the
2858    cache of pseudo registers that hold intermediate results.  */
2859 #define POWI_TABLE_SIZE 256
2860
2861 /* The size, in bits of the window, used in the "window method"
2862    exponentiation algorithm.  This is equivalent to a radix of
2863    (1<<POWI_WINDOW_SIZE) in the corresponding "m-ary method".  */
2864 #define POWI_WINDOW_SIZE 3
2865
2866 /* The following table is an efficient representation of an
2867    "optimal power tree".  For each value, i, the corresponding
2868    value, j, in the table states than an optimal evaluation
2869    sequence for calculating pow(x,i) can be found by evaluating
2870    pow(x,j)*pow(x,i-j).  An optimal power tree for the first
2871    100 integers is given in Knuth's "Seminumerical algorithms".  */
2872
2873 static const unsigned char powi_table[POWI_TABLE_SIZE] =
2874   {
2875       0,   1,   1,   2,   2,   3,   3,   4,  /*   0 -   7 */
2876       4,   6,   5,   6,   6,  10,   7,   9,  /*   8 -  15 */
2877       8,  16,   9,  16,  10,  12,  11,  13,  /*  16 -  23 */
2878      12,  17,  13,  18,  14,  24,  15,  26,  /*  24 -  31 */
2879      16,  17,  17,  19,  18,  33,  19,  26,  /*  32 -  39 */
2880      20,  25,  21,  40,  22,  27,  23,  44,  /*  40 -  47 */
2881      24,  32,  25,  34,  26,  29,  27,  44,  /*  48 -  55 */
2882      28,  31,  29,  34,  30,  60,  31,  36,  /*  56 -  63 */
2883      32,  64,  33,  34,  34,  46,  35,  37,  /*  64 -  71 */
2884      36,  65,  37,  50,  38,  48,  39,  69,  /*  72 -  79 */
2885      40,  49,  41,  43,  42,  51,  43,  58,  /*  80 -  87 */
2886      44,  64,  45,  47,  46,  59,  47,  76,  /*  88 -  95 */
2887      48,  65,  49,  66,  50,  67,  51,  66,  /*  96 - 103 */
2888      52,  70,  53,  74,  54, 104,  55,  74,  /* 104 - 111 */
2889      56,  64,  57,  69,  58,  78,  59,  68,  /* 112 - 119 */
2890      60,  61,  61,  80,  62,  75,  63,  68,  /* 120 - 127 */
2891      64,  65,  65, 128,  66, 129,  67,  90,  /* 128 - 135 */
2892      68,  73,  69, 131,  70,  94,  71,  88,  /* 136 - 143 */
2893      72, 128,  73,  98,  74, 132,  75, 121,  /* 144 - 151 */
2894      76, 102,  77, 124,  78, 132,  79, 106,  /* 152 - 159 */
2895      80,  97,  81, 160,  82,  99,  83, 134,  /* 160 - 167 */
2896      84,  86,  85,  95,  86, 160,  87, 100,  /* 168 - 175 */
2897      88, 113,  89,  98,  90, 107,  91, 122,  /* 176 - 183 */
2898      92, 111,  93, 102,  94, 126,  95, 150,  /* 184 - 191 */
2899      96, 128,  97, 130,  98, 133,  99, 195,  /* 192 - 199 */
2900     100, 128, 101, 123, 102, 164, 103, 138,  /* 200 - 207 */
2901     104, 145, 105, 146, 106, 109, 107, 149,  /* 208 - 215 */
2902     108, 200, 109, 146, 110, 170, 111, 157,  /* 216 - 223 */
2903     112, 128, 113, 130, 114, 182, 115, 132,  /* 224 - 231 */
2904     116, 200, 117, 132, 118, 158, 119, 206,  /* 232 - 239 */
2905     120, 240, 121, 162, 122, 147, 123, 152,  /* 240 - 247 */
2906     124, 166, 125, 214, 126, 138, 127, 153,  /* 248 - 255 */
2907   };
2908
2909
2910 /* Return the number of multiplications required to calculate
2911    powi(x,n) where n is less than POWI_TABLE_SIZE.  This is a
2912    subroutine of powi_cost.  CACHE is an array indicating
2913    which exponents have already been calculated.  */
2914
2915 static int
2916 powi_lookup_cost (unsigned HOST_WIDE_INT n, bool *cache)
2917 {
2918   /* If we've already calculated this exponent, then this evaluation
2919      doesn't require any additional multiplications.  */
2920   if (cache[n])
2921     return 0;
2922
2923   cache[n] = true;
2924   return powi_lookup_cost (n - powi_table[n], cache)
2925          + powi_lookup_cost (powi_table[n], cache) + 1;
2926 }
2927
2928 /* Return the number of multiplications required to calculate
2929    powi(x,n) for an arbitrary x, given the exponent N.  This
2930    function needs to be kept in sync with expand_powi below.  */
2931
2932 static int
2933 powi_cost (HOST_WIDE_INT n)
2934 {
2935   bool cache[POWI_TABLE_SIZE];
2936   unsigned HOST_WIDE_INT digit;
2937   unsigned HOST_WIDE_INT val;
2938   int result;
2939
2940   if (n == 0)
2941     return 0;
2942
2943   /* Ignore the reciprocal when calculating the cost.  */
2944   val = (n < 0) ? -n : n;
2945
2946   /* Initialize the exponent cache.  */
2947   memset (cache, 0, POWI_TABLE_SIZE * sizeof (bool));
2948   cache[1] = true;
2949
2950   result = 0;
2951
2952   while (val >= POWI_TABLE_SIZE)
2953     {
2954       if (val & 1)
2955         {
2956           digit = val & ((1 << POWI_WINDOW_SIZE) - 1);
2957           result += powi_lookup_cost (digit, cache)
2958                     + POWI_WINDOW_SIZE + 1;
2959           val >>= POWI_WINDOW_SIZE;
2960         }
2961       else
2962         {
2963           val >>= 1;
2964           result++;
2965         }
2966     }
2967
2968   return result + powi_lookup_cost (val, cache);
2969 }
2970
2971 /* Recursive subroutine of expand_powi.  This function takes the array,
2972    CACHE, of already calculated exponents and an exponent N and returns
2973    an RTX that corresponds to CACHE[1]**N, as calculated in mode MODE.  */
2974
2975 static rtx
2976 expand_powi_1 (enum machine_mode mode, unsigned HOST_WIDE_INT n, rtx *cache)
2977 {
2978   unsigned HOST_WIDE_INT digit;
2979   rtx target, result;
2980   rtx op0, op1;
2981
2982   if (n < POWI_TABLE_SIZE)
2983     {
2984       if (cache[n])
2985         return cache[n];
2986
2987       target = gen_reg_rtx (mode);
2988       cache[n] = target;
2989
2990       op0 = expand_powi_1 (mode, n - powi_table[n], cache);
2991       op1 = expand_powi_1 (mode, powi_table[n], cache);
2992     }
2993   else if (n & 1)
2994     {
2995       target = gen_reg_rtx (mode);
2996       digit = n & ((1 << POWI_WINDOW_SIZE) - 1);
2997       op0 = expand_powi_1 (mode, n - digit, cache);
2998       op1 = expand_powi_1 (mode, digit, cache);
2999     }
3000   else
3001     {
3002       target = gen_reg_rtx (mode);
3003       op0 = expand_powi_1 (mode, n >> 1, cache);
3004       op1 = op0;
3005     }
3006
3007   result = expand_mult (mode, op0, op1, target, 0);
3008   if (result != target)
3009     emit_move_insn (target, result);
3010   return target;
3011 }
3012
3013 /* Expand the RTL to evaluate powi(x,n) in mode MODE.  X is the
3014    floating point operand in mode MODE, and N is the exponent.  This
3015    function needs to be kept in sync with powi_cost above.  */
3016
3017 static rtx
3018 expand_powi (rtx x, enum machine_mode mode, HOST_WIDE_INT n)
3019 {
3020   rtx cache[POWI_TABLE_SIZE];
3021   rtx result;
3022
3023   if (n == 0)
3024     return CONST1_RTX (mode);
3025
3026   memset (cache, 0, sizeof (cache));
3027   cache[1] = x;
3028
3029   result = expand_powi_1 (mode, (n < 0) ? -n : n, cache);
3030
3031   /* If the original exponent was negative, reciprocate the result.  */
3032   if (n < 0)
3033     result = expand_binop (mode, sdiv_optab, CONST1_RTX (mode),
3034                            result, NULL_RTX, 0, OPTAB_LIB_WIDEN);
3035
3036   return result;
3037 }
3038
3039 /* Fold a builtin function call to pow, powf, or powl into a series of sqrts or
3040    cbrts.  Return NULL_RTX if no simplification can be made or expand the tree
3041    if we can simplify it.  */
3042 static rtx
3043 expand_builtin_pow_root (location_t loc, tree arg0, tree arg1, tree type,
3044                          rtx subtarget)
3045 {
3046   if (TREE_CODE (arg1) == REAL_CST
3047       && !TREE_OVERFLOW (arg1)
3048       && flag_unsafe_math_optimizations)
3049     {
3050       enum machine_mode mode = TYPE_MODE (type);
3051       tree sqrtfn = mathfn_built_in (type, BUILT_IN_SQRT);
3052       tree cbrtfn = mathfn_built_in (type, BUILT_IN_CBRT);
3053       REAL_VALUE_TYPE c = TREE_REAL_CST (arg1);
3054       tree op = NULL_TREE;
3055
3056       if (sqrtfn)
3057         {
3058           /* Optimize pow (x, 0.5) into sqrt.  */
3059           if (REAL_VALUES_EQUAL (c, dconsthalf))
3060             op = build_call_nofold_loc (loc, sqrtfn, 1, arg0);
3061
3062           /* Don't do this optimization if we don't have a sqrt insn.  */
3063           else if (optab_handler (sqrt_optab, mode) != CODE_FOR_nothing)
3064             {
3065               REAL_VALUE_TYPE dconst1_4 = dconst1;
3066               REAL_VALUE_TYPE dconst3_4;
3067               SET_REAL_EXP (&dconst1_4, REAL_EXP (&dconst1_4) - 2);
3068
3069               real_from_integer (&dconst3_4, VOIDmode, 3, 0, 0);
3070               SET_REAL_EXP (&dconst3_4, REAL_EXP (&dconst3_4) - 2);
3071
3072               /* Optimize pow (x, 0.25) into sqrt (sqrt (x)).  Assume on most
3073                  machines that a builtin sqrt instruction is smaller than a
3074                  call to pow with 0.25, so do this optimization even if
3075                  -Os.  */
3076               if (REAL_VALUES_EQUAL (c, dconst1_4))
3077                 {
3078                   op = build_call_nofold_loc (loc, sqrtfn, 1, arg0);
3079                   op = build_call_nofold_loc (loc, sqrtfn, 1, op);
3080                 }
3081
3082               /* Optimize pow (x, 0.75) = sqrt (x) * sqrt (sqrt (x)) unless we
3083                  are optimizing for space.  */
3084               else if (optimize_insn_for_speed_p ()
3085                        && !TREE_SIDE_EFFECTS (arg0)
3086                        && REAL_VALUES_EQUAL (c, dconst3_4))
3087                 {
3088                   tree sqrt1 = build_call_expr_loc (loc, sqrtfn, 1, arg0);
3089                   tree sqrt2 = builtin_save_expr (sqrt1);
3090                   tree sqrt3 = build_call_expr_loc (loc, sqrtfn, 1, sqrt1);
3091                   op = fold_build2_loc (loc, MULT_EXPR, type, sqrt2, sqrt3);
3092                 }
3093             }
3094         }
3095
3096       /* Check whether we can do cbrt insstead of pow (x, 1./3.) and
3097          cbrt/sqrts instead of pow (x, 1./6.).  */
3098       if (cbrtfn && ! op
3099           && (tree_expr_nonnegative_p (arg0) || !HONOR_NANS (mode)))
3100         {
3101           /* First try 1/3.  */
3102           REAL_VALUE_TYPE dconst1_3
3103             = real_value_truncate (mode, dconst_third ());
3104
3105           if (REAL_VALUES_EQUAL (c, dconst1_3))
3106             op = build_call_nofold_loc (loc, cbrtfn, 1, arg0);
3107
3108               /* Now try 1/6.  */
3109           else if (optimize_insn_for_speed_p ()
3110                    && optab_handler (sqrt_optab, mode) != CODE_FOR_nothing)
3111             {
3112               REAL_VALUE_TYPE dconst1_6 = dconst1_3;
3113               SET_REAL_EXP (&dconst1_6, REAL_EXP (&dconst1_6) - 1);
3114
3115               if (REAL_VALUES_EQUAL (c, dconst1_6))
3116                 {
3117                   op = build_call_nofold_loc (loc, sqrtfn, 1, arg0);
3118                   op = build_call_nofold_loc (loc, cbrtfn, 1, op);
3119                 }
3120             }
3121         }
3122
3123       if (op)
3124         return expand_expr (op, subtarget, mode, EXPAND_NORMAL);
3125     }
3126
3127   return NULL_RTX;
3128 }
3129
3130 /* Expand a call to the pow built-in mathematical function.  Return NULL_RTX if
3131    a normal call should be emitted rather than expanding the function
3132    in-line.  EXP is the expression that is a call to the builtin
3133    function; if convenient, the result should be placed in TARGET.  */
3134
3135 static rtx
3136 expand_builtin_pow (tree exp, rtx target, rtx subtarget)
3137 {
3138   tree arg0, arg1;
3139   tree fn, narg0;
3140   tree type = TREE_TYPE (exp);
3141   REAL_VALUE_TYPE cint, c, c2;
3142   HOST_WIDE_INT n;
3143   rtx op, op2;
3144   enum machine_mode mode = TYPE_MODE (type);
3145
3146   if (! validate_arglist (exp, REAL_TYPE, REAL_TYPE, VOID_TYPE))
3147     return NULL_RTX;
3148
3149   arg0 = CALL_EXPR_ARG (exp, 0);
3150   arg1 = CALL_EXPR_ARG (exp, 1);
3151
3152   if (TREE_CODE (arg1) != REAL_CST
3153       || TREE_OVERFLOW (arg1))
3154     return expand_builtin_mathfn_2 (exp, target, subtarget);
3155
3156   /* Handle constant exponents.  */
3157
3158   /* For integer valued exponents we can expand to an optimal multiplication
3159      sequence using expand_powi.  */
3160   c = TREE_REAL_CST (arg1);
3161   n = real_to_integer (&c);
3162   real_from_integer (&cint, VOIDmode, n, n < 0 ? -1 : 0, 0);
3163   if (real_identical (&c, &cint)
3164       && ((n >= -1 && n <= 2)
3165           || (flag_unsafe_math_optimizations
3166               && optimize_insn_for_speed_p ()
3167               && powi_cost (n) <= POWI_MAX_MULTS)))
3168     {
3169       op = expand_expr (arg0, subtarget, VOIDmode, EXPAND_NORMAL);
3170       if (n != 1)
3171         {
3172           op = force_reg (mode, op);
3173           op = expand_powi (op, mode, n);
3174         }
3175       return op;
3176     }
3177
3178   narg0 = builtin_save_expr (arg0);
3179
3180   /* If the exponent is not integer valued, check if it is half of an integer.
3181      In this case we can expand to sqrt (x) * x**(n/2).  */
3182   fn = mathfn_built_in (type, BUILT_IN_SQRT);
3183   if (fn != NULL_TREE)
3184     {
3185       real_arithmetic (&c2, MULT_EXPR, &c, &dconst2);
3186       n = real_to_integer (&c2);
3187       real_from_integer (&cint, VOIDmode, n, n < 0 ? -1 : 0, 0);
3188       if (real_identical (&c2, &cint)
3189           && ((flag_unsafe_math_optimizations
3190                && optimize_insn_for_speed_p ()
3191                && powi_cost (n/2) <= POWI_MAX_MULTS)
3192               /* Even the c == 0.5 case cannot be done unconditionally
3193                  when we need to preserve signed zeros, as
3194                  pow (-0, 0.5) is +0, while sqrt(-0) is -0.  */
3195               || (!HONOR_SIGNED_ZEROS (mode) && n == 1)
3196               /* For c == 1.5 we can assume that x * sqrt (x) is always
3197                  smaller than pow (x, 1.5) if sqrt will not be expanded
3198                  as a call.  */
3199               || (n == 3
3200                   && optab_handler (sqrt_optab, mode) != CODE_FOR_nothing)))
3201         {
3202           tree call_expr = build_call_nofold_loc (EXPR_LOCATION (exp), fn, 1,
3203                                                   narg0);
3204           /* Use expand_expr in case the newly built call expression
3205              was folded to a non-call.  */
3206           op = expand_expr (call_expr, subtarget, mode, EXPAND_NORMAL);
3207           if (n != 1)
3208             {
3209               op2 = expand_expr (narg0, subtarget, VOIDmode, EXPAND_NORMAL);
3210               op2 = force_reg (mode, op2);
3211               op2 = expand_powi (op2, mode, abs (n / 2));
3212               op = expand_simple_binop (mode, MULT, op, op2, NULL_RTX,
3213                                         0, OPTAB_LIB_WIDEN);
3214               /* If the original exponent was negative, reciprocate the
3215                  result.  */
3216               if (n < 0)
3217                 op = expand_binop (mode, sdiv_optab, CONST1_RTX (mode),
3218                                    op, NULL_RTX, 0, OPTAB_LIB_WIDEN);
3219             }
3220           return op;
3221         }
3222     }
3223
3224   /* Check whether we can do a series of sqrt or cbrt's instead of the pow
3225      call.  */
3226   op = expand_builtin_pow_root (EXPR_LOCATION (exp), arg0, arg1, type,
3227                                 subtarget);
3228   if (op)
3229     return op;
3230
3231   /* Try if the exponent is a third of an integer.  In this case
3232      we can expand to x**(n/3) * cbrt(x)**(n%3).  As cbrt (x) is
3233      different from pow (x, 1./3.) due to rounding and behavior
3234      with negative x we need to constrain this transformation to
3235      unsafe math and positive x or finite math.  */
3236   fn = mathfn_built_in (type, BUILT_IN_CBRT);
3237   if (fn != NULL_TREE
3238       && flag_unsafe_math_optimizations
3239       && (tree_expr_nonnegative_p (arg0)
3240           || !HONOR_NANS (mode)))
3241     {
3242       REAL_VALUE_TYPE dconst3;
3243       real_from_integer (&dconst3, VOIDmode, 3, 0, 0);
3244       real_arithmetic (&c2, MULT_EXPR, &c, &dconst3);
3245       real_round (&c2, mode, &c2);
3246       n = real_to_integer (&c2);
3247       real_from_integer (&cint, VOIDmode, n, n < 0 ? -1 : 0, 0);
3248       real_arithmetic (&c2, RDIV_EXPR, &cint, &dconst3);
3249       real_convert (&c2, mode, &c2);
3250       if (real_identical (&c2, &c)
3251           && ((optimize_insn_for_speed_p ()
3252                && powi_cost (n/3) <= POWI_MAX_MULTS)
3253               || n == 1))
3254         {
3255           tree call_expr = build_call_nofold_loc (EXPR_LOCATION (exp), fn, 1,
3256                                                   narg0);
3257           op = expand_builtin (call_expr, NULL_RTX, subtarget, mode, 0);
3258           if (abs (n) % 3 == 2)
3259             op = expand_simple_binop (mode, MULT, op, op, op,
3260                                       0, OPTAB_LIB_WIDEN);
3261           if (n != 1)
3262             {
3263               op2 = expand_expr (narg0, subtarget, VOIDmode, EXPAND_NORMAL);
3264               op2 = force_reg (mode, op2);
3265               op2 = expand_powi (op2, mode, abs (n / 3));
3266               op = expand_simple_binop (mode, MULT, op, op2, NULL_RTX,
3267                                         0, OPTAB_LIB_WIDEN);
3268               /* If the original exponent was negative, reciprocate the
3269                  result.  */
3270               if (n < 0)
3271                 op = expand_binop (mode, sdiv_optab, CONST1_RTX (mode),
3272                                    op, NULL_RTX, 0, OPTAB_LIB_WIDEN);
3273             }
3274           return op;
3275         }
3276     }
3277
3278   /* Fall back to optab expansion.  */
3279   return expand_builtin_mathfn_2 (exp, target, subtarget);
3280 }
3281
3282 /* Expand a call to the powi built-in mathematical function.  Return NULL_RTX if
3283    a normal call should be emitted rather than expanding the function
3284    in-line.  EXP is the expression that is a call to the builtin
3285    function; if convenient, the result should be placed in TARGET.  */
3286
3287 static rtx
3288 expand_builtin_powi (tree exp, rtx target)
3289 {
3290   tree arg0, arg1;
3291   rtx op0, op1;
3292   enum machine_mode mode;
3293   enum machine_mode mode2;
3294
3295   if (! validate_arglist (exp, REAL_TYPE, INTEGER_TYPE, VOID_TYPE))
3296     return NULL_RTX;
3297
3298   arg0 = CALL_EXPR_ARG (exp, 0);
3299   arg1 = CALL_EXPR_ARG (exp, 1);
3300   mode = TYPE_MODE (TREE_TYPE (exp));
3301
3302   /* Handle constant power.  */
3303
3304   if (TREE_CODE (arg1) == INTEGER_CST
3305       && !TREE_OVERFLOW (arg1))
3306     {
3307       HOST_WIDE_INT n = TREE_INT_CST_LOW (arg1);
3308
3309       /* If the exponent is -1, 0, 1 or 2, then expand_powi is exact.
3310          Otherwise, check the number of multiplications required.  */
3311       if ((TREE_INT_CST_HIGH (arg1) == 0
3312            || TREE_INT_CST_HIGH (arg1) == -1)
3313           && ((n >= -1 && n <= 2)
3314               || (optimize_insn_for_speed_p ()
3315                   && powi_cost (n) <= POWI_MAX_MULTS)))
3316         {
3317           op0 = expand_expr (arg0, NULL_RTX, VOIDmode, EXPAND_NORMAL);
3318           op0 = force_reg (mode, op0);
3319           return expand_powi (op0, mode, n);
3320         }
3321     }
3322
3323   /* Emit a libcall to libgcc.  */
3324
3325   /* Mode of the 2nd argument must match that of an int.  */
3326   mode2 = mode_for_size (INT_TYPE_SIZE, MODE_INT, 0);
3327
3328   if (target == NULL_RTX)
3329     target = gen_reg_rtx (mode);
3330
3331   op0 = expand_expr (arg0, NULL_RTX, mode, EXPAND_NORMAL);
3332   if (GET_MODE (op0) != mode)
3333     op0 = convert_to_mode (mode, op0, 0);
3334   op1 = expand_expr (arg1, NULL_RTX, mode2, EXPAND_NORMAL);
3335   if (GET_MODE (op1) != mode2)
3336     op1 = convert_to_mode (mode2, op1, 0);
3337
3338   target = emit_library_call_value (optab_libfunc (powi_optab, mode),
3339                                     target, LCT_CONST, mode, 2,
3340                                     op0, mode, op1, mode2);
3341
3342   return target;
3343 }
3344
3345 /* Expand expression EXP which is a call to the strlen builtin.  Return
3346    NULL_RTX if we failed the caller should emit a normal call, otherwise
3347    try to get the result in TARGET, if convenient.  */
3348
3349 static rtx
3350 expand_builtin_strlen (tree exp, rtx target,
3351                        enum machine_mode target_mode)
3352 {
3353   if (!validate_arglist (exp, POINTER_TYPE, VOID_TYPE))
3354     return NULL_RTX;
3355   else
3356     {
3357       struct expand_operand ops[4];
3358       rtx pat;
3359       tree len;
3360       tree src = CALL_EXPR_ARG (exp, 0);
3361       rtx src_reg, before_strlen;
3362       enum machine_mode insn_mode = target_mode;
3363       enum insn_code icode = CODE_FOR_nothing;
3364       unsigned int align;
3365
3366       /* If the length can be computed at compile-time, return it.  */
3367       len = c_strlen (src, 0);
3368       if (len)
3369         return expand_expr (len, target, target_mode, EXPAND_NORMAL);
3370
3371       /* If the length can be computed at compile-time and is constant
3372          integer, but there are side-effects in src, evaluate
3373          src for side-effects, then return len.
3374          E.g. x = strlen (i++ ? "xfoo" + 1 : "bar");
3375          can be optimized into: i++; x = 3;  */
3376       len = c_strlen (src, 1);
3377       if (len && TREE_CODE (len) == INTEGER_CST)
3378         {
3379           expand_expr (src, const0_rtx, VOIDmode, EXPAND_NORMAL);
3380           return expand_expr (len, target, target_mode, EXPAND_NORMAL);
3381         }
3382
3383       align = get_pointer_alignment (src, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
3384
3385       /* If SRC is not a pointer type, don't do this operation inline.  */
3386       if (align == 0)
3387         return NULL_RTX;
3388
3389       /* Bail out if we can't compute strlen in the right mode.  */
3390       while (insn_mode != VOIDmode)
3391         {
3392           icode = optab_handler (strlen_optab, insn_mode);
3393           if (icode != CODE_FOR_nothing)
3394             break;
3395
3396           insn_mode = GET_MODE_WIDER_MODE (insn_mode);
3397         }
3398       if (insn_mode == VOIDmode)
3399         return NULL_RTX;
3400
3401       /* Make a place to hold the source address.  We will not expand
3402          the actual source until we are sure that the expansion will
3403          not fail -- there are trees that cannot be expanded twice.  */
3404       src_reg = gen_reg_rtx (Pmode);
3405
3406       /* Mark the beginning of the strlen sequence so we can emit the
3407          source operand later.  */
3408       before_strlen = get_last_insn ();
3409
3410       create_output_operand (&ops[0], target, insn_mode);
3411       create_fixed_operand (&ops[1], gen_rtx_MEM (BLKmode, src_reg));
3412       create_integer_operand (&ops[2], 0);
3413       create_integer_operand (&ops[3], align);
3414       if (!maybe_expand_insn (icode, 4, ops))
3415         return NULL_RTX;
3416
3417       /* Now that we are assured of success, expand the source.  */
3418       start_sequence ();
3419       pat = expand_expr (src, src_reg, ptr_mode, EXPAND_NORMAL);
3420       if (pat != src_reg)
3421         emit_move_insn (src_reg, pat);
3422       pat = get_insns ();
3423       end_sequence ();
3424
3425       if (before_strlen)
3426         emit_insn_after (pat, before_strlen);
3427       else
3428         emit_insn_before (pat, get_insns ());
3429
3430       /* Return the value in the proper mode for this function.  */
3431       if (GET_MODE (ops[0].value) == target_mode)
3432         target = ops[0].value;
3433       else if (target != 0)
3434         convert_move (target, ops[0].value, 0);
3435       else
3436         target = convert_to_mode (target_mode, ops[0].value, 0);
3437
3438       return target;
3439     }
3440 }
3441
3442 /* Callback routine for store_by_pieces.  Read GET_MODE_BITSIZE (MODE)
3443    bytes from constant string DATA + OFFSET and return it as target
3444    constant.  */
3445
3446 static rtx
3447 builtin_memcpy_read_str (void *data, HOST_WIDE_INT offset,
3448                          enum machine_mode mode)
3449 {
3450   const char *str = (const char *) data;
3451
3452   gcc_assert (offset >= 0
3453               && ((unsigned HOST_WIDE_INT) offset + GET_MODE_SIZE (mode)
3454                   <= strlen (str) + 1));
3455
3456   return c_readstr (str + offset, mode);
3457 }
3458
3459 /* Expand a call EXP to the memcpy builtin.
3460    Return NULL_RTX if we failed, the caller should emit a normal call,
3461    otherwise try to get the result in TARGET, if convenient (and in
3462    mode MODE if that's convenient).  */
3463
3464 static rtx
3465 expand_builtin_memcpy (tree exp, rtx target)
3466 {
3467   if (!validate_arglist (exp,
3468                          POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
3469     return NULL_RTX;
3470   else
3471     {
3472       tree dest = CALL_EXPR_ARG (exp, 0);
3473       tree src = CALL_EXPR_ARG (exp, 1);
3474       tree len = CALL_EXPR_ARG (exp, 2);
3475       const char *src_str;
3476       unsigned int src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
3477       unsigned int dest_align
3478         = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
3479       rtx dest_mem, src_mem, dest_addr, len_rtx;
3480       HOST_WIDE_INT expected_size = -1;
3481       unsigned int expected_align = 0;
3482
3483       /* If DEST is not a pointer type, call the normal function.  */
3484       if (dest_align == 0)
3485         return NULL_RTX;
3486
3487       /* If either SRC is not a pointer type, don't do this
3488          operation in-line.  */
3489       if (src_align == 0)
3490         return NULL_RTX;
3491
3492       if (currently_expanding_gimple_stmt)
3493         stringop_block_profile (currently_expanding_gimple_stmt,
3494                                 &expected_align, &expected_size);
3495
3496       if (expected_align < dest_align)
3497         expected_align = dest_align;
3498       dest_mem = get_memory_rtx (dest, len);
3499       set_mem_align (dest_mem, dest_align);
3500       len_rtx = expand_normal (len);
3501       src_str = c_getstr (src);
3502
3503       /* If SRC is a string constant and block move would be done
3504          by pieces, we can avoid loading the string from memory
3505          and only stored the computed constants.  */
3506       if (src_str
3507           && CONST_INT_P (len_rtx)
3508           && (unsigned HOST_WIDE_INT) INTVAL (len_rtx) <= strlen (src_str) + 1
3509           && can_store_by_pieces (INTVAL (len_rtx), builtin_memcpy_read_str,
3510                                   CONST_CAST (char *, src_str),
3511                                   dest_align, false))
3512         {
3513           dest_mem = store_by_pieces (dest_mem, INTVAL (len_rtx),
3514                                       builtin_memcpy_read_str,
3515                                       CONST_CAST (char *, src_str),
3516                                       dest_align, false, 0);
3517           dest_mem = force_operand (XEXP (dest_mem, 0), target);
3518           dest_mem = convert_memory_address (ptr_mode, dest_mem);
3519           return dest_mem;
3520         }
3521
3522       src_mem = get_memory_rtx (src, len);
3523       set_mem_align (src_mem, src_align);
3524
3525       /* Copy word part most expediently.  */
3526       dest_addr = emit_block_move_hints (dest_mem, src_mem, len_rtx,
3527                                          CALL_EXPR_TAILCALL (exp)
3528                                          ? BLOCK_OP_TAILCALL : BLOCK_OP_NORMAL,
3529                                          expected_align, expected_size);
3530
3531       if (dest_addr == 0)
3532         {
3533           dest_addr = force_operand (XEXP (dest_mem, 0), target);
3534           dest_addr = convert_memory_address (ptr_mode, dest_addr);
3535         }
3536       return dest_addr;
3537     }
3538 }
3539
3540 /* Expand a call EXP to the mempcpy builtin.
3541    Return NULL_RTX if we failed; the caller should emit a normal call,
3542    otherwise try to get the result in TARGET, if convenient (and in
3543    mode MODE if that's convenient).  If ENDP is 0 return the
3544    destination pointer, if ENDP is 1 return the end pointer ala
3545    mempcpy, and if ENDP is 2 return the end pointer minus one ala
3546    stpcpy.  */
3547
3548 static rtx
3549 expand_builtin_mempcpy (tree exp, rtx target, enum machine_mode mode)
3550 {
3551   if (!validate_arglist (exp,
3552                          POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
3553     return NULL_RTX;
3554   else
3555     {
3556       tree dest = CALL_EXPR_ARG (exp, 0);
3557       tree src = CALL_EXPR_ARG (exp, 1);
3558       tree len = CALL_EXPR_ARG (exp, 2);
3559       return expand_builtin_mempcpy_args (dest, src, len,
3560                                           target, mode, /*endp=*/ 1);
3561     }
3562 }
3563
3564 /* Helper function to do the actual work for expand_builtin_mempcpy.  The
3565    arguments to the builtin_mempcpy call DEST, SRC, and LEN are broken out
3566    so that this can also be called without constructing an actual CALL_EXPR.
3567    The other arguments and return value are the same as for
3568    expand_builtin_mempcpy.  */
3569
3570 static rtx
3571 expand_builtin_mempcpy_args (tree dest, tree src, tree len,
3572                              rtx target, enum machine_mode mode, int endp)
3573 {
3574     /* If return value is ignored, transform mempcpy into memcpy.  */
3575   if (target == const0_rtx && implicit_built_in_decls[BUILT_IN_MEMCPY])
3576     {
3577       tree fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
3578       tree result = build_call_nofold_loc (UNKNOWN_LOCATION, fn, 3,
3579                                            dest, src, len);
3580       return expand_expr (result, target, mode, EXPAND_NORMAL);
3581     }
3582   else
3583     {
3584       const char *src_str;
3585       unsigned int src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
3586       unsigned int dest_align
3587         = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
3588       rtx dest_mem, src_mem, len_rtx;
3589
3590       /* If either SRC or DEST is not a pointer type, don't do this
3591          operation in-line.  */
3592       if (dest_align == 0 || src_align == 0)
3593         return NULL_RTX;
3594
3595       /* If LEN is not constant, call the normal function.  */
3596       if (! host_integerp (len, 1))
3597         return NULL_RTX;
3598
3599       len_rtx = expand_normal (len);
3600       src_str = c_getstr (src);
3601
3602       /* If SRC is a string constant and block move would be done
3603          by pieces, we can avoid loading the string from memory
3604          and only stored the computed constants.  */
3605       if (src_str
3606           && CONST_INT_P (len_rtx)
3607           && (unsigned HOST_WIDE_INT) INTVAL (len_rtx) <= strlen (src_str) + 1
3608           && can_store_by_pieces (INTVAL (len_rtx), builtin_memcpy_read_str,
3609                                   CONST_CAST (char *, src_str),
3610                                   dest_align, false))
3611         {
3612           dest_mem = get_memory_rtx (dest, len);
3613           set_mem_align (dest_mem, dest_align);
3614           dest_mem = store_by_pieces (dest_mem, INTVAL (len_rtx),
3615                                       builtin_memcpy_read_str,
3616                                       CONST_CAST (char *, src_str),
3617                                       dest_align, false, endp);
3618           dest_mem = force_operand (XEXP (dest_mem, 0), NULL_RTX);
3619           dest_mem = convert_memory_address (ptr_mode, dest_mem);
3620           return dest_mem;
3621         }
3622
3623       if (CONST_INT_P (len_rtx)
3624           && can_move_by_pieces (INTVAL (len_rtx),
3625                                  MIN (dest_align, src_align)))
3626         {
3627           dest_mem = get_memory_rtx (dest, len);
3628           set_mem_align (dest_mem, dest_align);
3629           src_mem = get_memory_rtx (src, len);
3630           set_mem_align (src_mem, src_align);
3631           dest_mem = move_by_pieces (dest_mem, src_mem, INTVAL (len_rtx),
3632                                      MIN (dest_align, src_align), endp);
3633           dest_mem = force_operand (XEXP (dest_mem, 0), NULL_RTX);
3634           dest_mem = convert_memory_address (ptr_mode, dest_mem);
3635           return dest_mem;
3636         }
3637
3638       return NULL_RTX;
3639     }
3640 }
3641
3642 #ifndef HAVE_movstr
3643 # define HAVE_movstr 0
3644 # define CODE_FOR_movstr CODE_FOR_nothing
3645 #endif
3646
3647 /* Expand into a movstr instruction, if one is available.  Return NULL_RTX if
3648    we failed, the caller should emit a normal call, otherwise try to
3649    get the result in TARGET, if convenient.  If ENDP is 0 return the
3650    destination pointer, if ENDP is 1 return the end pointer ala
3651    mempcpy, and if ENDP is 2 return the end pointer minus one ala
3652    stpcpy.  */
3653
3654 static rtx
3655 expand_movstr (tree dest, tree src, rtx target, int endp)
3656 {
3657   struct expand_operand ops[3];
3658   rtx dest_mem;
3659   rtx src_mem;
3660
3661   if (!HAVE_movstr)
3662     return NULL_RTX;
3663
3664   dest_mem = get_memory_rtx (dest, NULL);
3665   src_mem = get_memory_rtx (src, NULL);
3666   if (!endp)
3667     {
3668       target = force_reg (Pmode, XEXP (dest_mem, 0));
3669       dest_mem = replace_equiv_address (dest_mem, target);
3670     }
3671
3672   create_output_operand (&ops[0], endp ? target : NULL_RTX, Pmode);
3673   create_fixed_operand (&ops[1], dest_mem);
3674   create_fixed_operand (&ops[2], src_mem);
3675   expand_insn (CODE_FOR_movstr, 3, ops);
3676
3677   if (endp && target != const0_rtx)
3678     {
3679       target = ops[0].value;
3680       /* movstr is supposed to set end to the address of the NUL
3681          terminator.  If the caller requested a mempcpy-like return value,
3682          adjust it.  */
3683       if (endp == 1)
3684         {
3685           rtx tem = plus_constant (gen_lowpart (GET_MODE (target), target), 1);
3686           emit_move_insn (target, force_operand (tem, NULL_RTX));
3687         }
3688     }
3689   return target;
3690 }
3691
3692 /* Expand expression EXP, which is a call to the strcpy builtin.  Return
3693    NULL_RTX if we failed the caller should emit a normal call, otherwise
3694    try to get the result in TARGET, if convenient (and in mode MODE if that's
3695    convenient).  */
3696
3697 static rtx
3698 expand_builtin_strcpy (tree exp, rtx target)
3699 {
3700   if (validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
3701    {
3702      tree dest = CALL_EXPR_ARG (exp, 0);
3703      tree src = CALL_EXPR_ARG (exp, 1);
3704      return expand_builtin_strcpy_args (dest, src, target);
3705    }
3706    return NULL_RTX;
3707 }
3708
3709 /* Helper function to do the actual work for expand_builtin_strcpy.  The
3710    arguments to the builtin_strcpy call DEST and SRC are broken out
3711    so that this can also be called without constructing an actual CALL_EXPR.
3712    The other arguments and return value are the same as for
3713    expand_builtin_strcpy.  */
3714
3715 static rtx
3716 expand_builtin_strcpy_args (tree dest, tree src, rtx target)
3717 {
3718   return expand_movstr (dest, src, target, /*endp=*/0);
3719 }
3720
3721 /* Expand a call EXP to the stpcpy builtin.
3722    Return NULL_RTX if we failed the caller should emit a normal call,
3723    otherwise try to get the result in TARGET, if convenient (and in
3724    mode MODE if that's convenient).  */
3725
3726 static rtx
3727 expand_builtin_stpcpy (tree exp, rtx target, enum machine_mode mode)
3728 {
3729   tree dst, src;
3730   location_t loc = EXPR_LOCATION (exp);
3731
3732   if (!validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
3733     return NULL_RTX;
3734
3735   dst = CALL_EXPR_ARG (exp, 0);
3736   src = CALL_EXPR_ARG (exp, 1);
3737
3738   /* If return value is ignored, transform stpcpy into strcpy.  */
3739   if (target == const0_rtx && implicit_built_in_decls[BUILT_IN_STRCPY])
3740     {
3741       tree fn = implicit_built_in_decls[BUILT_IN_STRCPY];
3742       tree result = build_call_nofold_loc (loc, fn, 2, dst, src);
3743       return expand_expr (result, target, mode, EXPAND_NORMAL);
3744     }
3745   else
3746     {
3747       tree len, lenp1;
3748       rtx ret;
3749
3750       /* Ensure we get an actual string whose length can be evaluated at
3751          compile-time, not an expression containing a string.  This is
3752          because the latter will potentially produce pessimized code
3753          when used to produce the return value.  */
3754       if (! c_getstr (src) || ! (len = c_strlen (src, 0)))
3755         return expand_movstr (dst, src, target, /*endp=*/2);
3756
3757       lenp1 = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
3758       ret = expand_builtin_mempcpy_args (dst, src, lenp1,
3759                                          target, mode, /*endp=*/2);
3760
3761       if (ret)
3762         return ret;
3763
3764       if (TREE_CODE (len) == INTEGER_CST)
3765         {
3766           rtx len_rtx = expand_normal (len);
3767
3768           if (CONST_INT_P (len_rtx))
3769             {
3770               ret = expand_builtin_strcpy_args (dst, src, target);
3771
3772               if (ret)
3773                 {
3774                   if (! target)
3775                     {
3776                       if (mode != VOIDmode)
3777                         target = gen_reg_rtx (mode);
3778                       else
3779                         target = gen_reg_rtx (GET_MODE (ret));
3780                     }
3781                   if (GET_MODE (target) != GET_MODE (ret))
3782                     ret = gen_lowpart (GET_MODE (target), ret);
3783
3784                   ret = plus_constant (ret, INTVAL (len_rtx));
3785                   ret = emit_move_insn (target, force_operand (ret, NULL_RTX));
3786                   gcc_assert (ret);
3787
3788                   return target;
3789                 }
3790             }
3791         }
3792
3793       return expand_movstr (dst, src, target, /*endp=*/2);
3794     }
3795 }
3796
3797 /* Callback routine for store_by_pieces.  Read GET_MODE_BITSIZE (MODE)
3798    bytes from constant string DATA + OFFSET and return it as target
3799    constant.  */
3800
3801 rtx
3802 builtin_strncpy_read_str (void *data, HOST_WIDE_INT offset,
3803                           enum machine_mode mode)
3804 {
3805   const char *str = (const char *) data;
3806
3807   if ((unsigned HOST_WIDE_INT) offset > strlen (str))
3808     return const0_rtx;
3809
3810   return c_readstr (str + offset, mode);
3811 }
3812
3813 /* Expand expression EXP, which is a call to the strncpy builtin.  Return
3814    NULL_RTX if we failed the caller should emit a normal call.  */
3815
3816 static rtx
3817 expand_builtin_strncpy (tree exp, rtx target)
3818 {
3819   location_t loc = EXPR_LOCATION (exp);
3820
3821   if (validate_arglist (exp,
3822                         POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
3823     {
3824       tree dest = CALL_EXPR_ARG (exp, 0);
3825       tree src = CALL_EXPR_ARG (exp, 1);
3826       tree len = CALL_EXPR_ARG (exp, 2);
3827       tree slen = c_strlen (src, 1);
3828
3829       /* We must be passed a constant len and src parameter.  */
3830       if (!host_integerp (len, 1) || !slen || !host_integerp (slen, 1))
3831         return NULL_RTX;
3832
3833       slen = size_binop_loc (loc, PLUS_EXPR, slen, ssize_int (1));
3834
3835       /* We're required to pad with trailing zeros if the requested
3836          len is greater than strlen(s2)+1.  In that case try to
3837          use store_by_pieces, if it fails, punt.  */
3838       if (tree_int_cst_lt (slen, len))
3839         {
3840           unsigned int dest_align
3841             = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
3842           const char *p = c_getstr (src);
3843           rtx dest_mem;
3844
3845           if (!p || dest_align == 0 || !host_integerp (len, 1)
3846               || !can_store_by_pieces (tree_low_cst (len, 1),
3847                                        builtin_strncpy_read_str,
3848                                        CONST_CAST (char *, p),
3849                                        dest_align, false))
3850             return NULL_RTX;
3851
3852           dest_mem = get_memory_rtx (dest, len);
3853           store_by_pieces (dest_mem, tree_low_cst (len, 1),
3854                            builtin_strncpy_read_str,
3855                            CONST_CAST (char *, p), dest_align, false, 0);
3856           dest_mem = force_operand (XEXP (dest_mem, 0), target);
3857           dest_mem = convert_memory_address (ptr_mode, dest_mem);
3858           return dest_mem;
3859         }
3860     }
3861   return NULL_RTX;
3862 }
3863
3864 /* Callback routine for store_by_pieces.  Read GET_MODE_BITSIZE (MODE)
3865    bytes from constant string DATA + OFFSET and return it as target
3866    constant.  */
3867
3868 rtx
3869 builtin_memset_read_str (void *data, HOST_WIDE_INT offset ATTRIBUTE_UNUSED,
3870                          enum machine_mode mode)
3871 {
3872   const char *c = (const char *) data;
3873   char *p = XALLOCAVEC (char, GET_MODE_SIZE (mode));
3874
3875   memset (p, *c, GET_MODE_SIZE (mode));
3876
3877   return c_readstr (p, mode);
3878 }
3879
3880 /* Callback routine for store_by_pieces.  Return the RTL of a register
3881    containing GET_MODE_SIZE (MODE) consecutive copies of the unsigned
3882    char value given in the RTL register data.  For example, if mode is
3883    4 bytes wide, return the RTL for 0x01010101*data.  */
3884
3885 static rtx
3886 builtin_memset_gen_str (void *data, HOST_WIDE_INT offset ATTRIBUTE_UNUSED,
3887                         enum machine_mode mode)
3888 {
3889   rtx target, coeff;
3890   size_t size;
3891   char *p;
3892
3893   size = GET_MODE_SIZE (mode);
3894   if (size == 1)
3895     return (rtx) data;
3896
3897   p = XALLOCAVEC (char, size);
3898   memset (p, 1, size);
3899   coeff = c_readstr (p, mode);
3900
3901   target = convert_to_mode (mode, (rtx) data, 1);
3902   target = expand_mult (mode, target, coeff, NULL_RTX, 1);
3903   return force_reg (mode, target);
3904 }
3905
3906 /* Expand expression EXP, which is a call to the memset builtin.  Return
3907    NULL_RTX if we failed the caller should emit a normal call, otherwise
3908    try to get the result in TARGET, if convenient (and in mode MODE if that's
3909    convenient).  */
3910
3911 static rtx
3912 expand_builtin_memset (tree exp, rtx target, enum machine_mode mode)
3913 {
3914   if (!validate_arglist (exp,
3915                          POINTER_TYPE, INTEGER_TYPE, INTEGER_TYPE, VOID_TYPE))
3916     return NULL_RTX;
3917   else
3918     {
3919       tree dest = CALL_EXPR_ARG (exp, 0);
3920       tree val = CALL_EXPR_ARG (exp, 1);
3921       tree len = CALL_EXPR_ARG (exp, 2);
3922       return expand_builtin_memset_args (dest, val, len, target, mode, exp);
3923     }
3924 }
3925
3926 /* Helper function to do the actual work for expand_builtin_memset.  The
3927    arguments to the builtin_memset call DEST, VAL, and LEN are broken out
3928    so that this can also be called without constructing an actual CALL_EXPR.
3929    The other arguments and return value are the same as for
3930    expand_builtin_memset.  */
3931
3932 static rtx
3933 expand_builtin_memset_args (tree dest, tree val, tree len,
3934                             rtx target, enum machine_mode mode, tree orig_exp)
3935 {
3936   tree fndecl, fn;
3937   enum built_in_function fcode;
3938   enum machine_mode val_mode;
3939   char c;
3940   unsigned int dest_align;
3941   rtx dest_mem, dest_addr, len_rtx;
3942   HOST_WIDE_INT expected_size = -1;
3943   unsigned int expected_align = 0;
3944
3945   dest_align = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
3946
3947   /* If DEST is not a pointer type, don't do this operation in-line.  */
3948   if (dest_align == 0)
3949     return NULL_RTX;
3950
3951   if (currently_expanding_gimple_stmt)
3952     stringop_block_profile (currently_expanding_gimple_stmt,
3953                             &expected_align, &expected_size);
3954
3955   if (expected_align < dest_align)
3956     expected_align = dest_align;
3957
3958   /* If the LEN parameter is zero, return DEST.  */
3959   if (integer_zerop (len))
3960     {
3961       /* Evaluate and ignore VAL in case it has side-effects.  */
3962       expand_expr (val, const0_rtx, VOIDmode, EXPAND_NORMAL);
3963       return expand_expr (dest, target, mode, EXPAND_NORMAL);
3964     }
3965
3966   /* Stabilize the arguments in case we fail.  */
3967   dest = builtin_save_expr (dest);
3968   val = builtin_save_expr (val);
3969   len = builtin_save_expr (len);
3970
3971   len_rtx = expand_normal (len);
3972   dest_mem = get_memory_rtx (dest, len);
3973   val_mode = TYPE_MODE (unsigned_char_type_node);
3974
3975   if (TREE_CODE (val) != INTEGER_CST)
3976     {
3977       rtx val_rtx;
3978
3979       val_rtx = expand_normal (val);
3980       val_rtx = convert_to_mode (val_mode, val_rtx, 0);
3981
3982       /* Assume that we can memset by pieces if we can store
3983        * the coefficients by pieces (in the required modes).
3984        * We can't pass builtin_memset_gen_str as that emits RTL.  */
3985       c = 1;
3986       if (host_integerp (len, 1)
3987           && can_store_by_pieces (tree_low_cst (len, 1),
3988                                   builtin_memset_read_str, &c, dest_align,
3989                                   true))
3990         {
3991           val_rtx = force_reg (val_mode, val_rtx);
3992           store_by_pieces (dest_mem, tree_low_cst (len, 1),
3993                            builtin_memset_gen_str, val_rtx, dest_align,
3994                            true, 0);
3995         }
3996       else if (!set_storage_via_setmem (dest_mem, len_rtx, val_rtx,
3997                                         dest_align, expected_align,
3998                                         expected_size))
3999         goto do_libcall;
4000
4001       dest_mem = force_operand (XEXP (dest_mem, 0), NULL_RTX);
4002       dest_mem = convert_memory_address (ptr_mode, dest_mem);
4003       return dest_mem;
4004     }
4005
4006   if (target_char_cast (val, &c))
4007     goto do_libcall;
4008
4009   if (c)
4010     {
4011       if (host_integerp (len, 1)
4012           && can_store_by_pieces (tree_low_cst (len, 1),
4013                                   builtin_memset_read_str, &c, dest_align,
4014                                   true))
4015         store_by_pieces (dest_mem, tree_low_cst (len, 1),
4016                          builtin_memset_read_str, &c, dest_align, true, 0);
4017       else if (!set_storage_via_setmem (dest_mem, len_rtx,
4018                                         gen_int_mode (c, val_mode),
4019                                         dest_align, expected_align,
4020                                         expected_size))
4021         goto do_libcall;
4022
4023       dest_mem = force_operand (XEXP (dest_mem, 0), NULL_RTX);
4024       dest_mem = convert_memory_address (ptr_mode, dest_mem);
4025       return dest_mem;
4026     }
4027
4028   set_mem_align (dest_mem, dest_align);
4029   dest_addr = clear_storage_hints (dest_mem, len_rtx,
4030                                    CALL_EXPR_TAILCALL (orig_exp)
4031                                    ? BLOCK_OP_TAILCALL : BLOCK_OP_NORMAL,
4032                                    expected_align, expected_size);
4033
4034   if (dest_addr == 0)
4035     {
4036       dest_addr = force_operand (XEXP (dest_mem, 0), NULL_RTX);
4037       dest_addr = convert_memory_address (ptr_mode, dest_addr);
4038     }
4039
4040   return dest_addr;
4041
4042  do_libcall:
4043   fndecl = get_callee_fndecl (orig_exp);
4044   fcode = DECL_FUNCTION_CODE (fndecl);
4045   if (fcode == BUILT_IN_MEMSET)
4046     fn = build_call_nofold_loc (EXPR_LOCATION (orig_exp), fndecl, 3,
4047                                 dest, val, len);
4048   else if (fcode == BUILT_IN_BZERO)
4049     fn = build_call_nofold_loc (EXPR_LOCATION (orig_exp), fndecl, 2,
4050                                 dest, len);
4051   else
4052     gcc_unreachable ();
4053   gcc_assert (TREE_CODE (fn) == CALL_EXPR);
4054   CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (orig_exp);
4055   return expand_call (fn, target, target == const0_rtx);
4056 }
4057
4058 /* Expand expression EXP, which is a call to the bzero builtin.  Return
4059    NULL_RTX if we failed the caller should emit a normal call.  */
4060
4061 static rtx
4062 expand_builtin_bzero (tree exp)
4063 {
4064   tree dest, size;
4065   location_t loc = EXPR_LOCATION (exp);
4066
4067   if (!validate_arglist (exp, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
4068     return NULL_RTX;
4069
4070   dest = CALL_EXPR_ARG (exp, 0);
4071   size = CALL_EXPR_ARG (exp, 1);
4072
4073   /* New argument list transforming bzero(ptr x, int y) to
4074      memset(ptr x, int 0, size_t y).   This is done this way
4075      so that if it isn't expanded inline, we fallback to
4076      calling bzero instead of memset.  */
4077
4078   return expand_builtin_memset_args (dest, integer_zero_node,
4079                                      fold_convert_loc (loc, sizetype, size),
4080                                      const0_rtx, VOIDmode, exp);
4081 }
4082
4083 /* Expand expression EXP, which is a call to the memcmp built-in function.
4084    Return NULL_RTX if we failed and the
4085    caller should emit a normal call, otherwise try to get the result in
4086    TARGET, if convenient (and in mode MODE, if that's convenient).  */
4087
4088 static rtx
4089 expand_builtin_memcmp (tree exp, ATTRIBUTE_UNUSED rtx target,
4090                        ATTRIBUTE_UNUSED enum machine_mode mode)
4091 {
4092   location_t loc ATTRIBUTE_UNUSED = EXPR_LOCATION (exp);
4093
4094   if (!validate_arglist (exp,
4095                          POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
4096     return NULL_RTX;
4097
4098 #if defined HAVE_cmpmemsi || defined HAVE_cmpstrnsi
4099   {
4100     rtx arg1_rtx, arg2_rtx, arg3_rtx;
4101     rtx result;
4102     rtx insn;
4103     tree arg1 = CALL_EXPR_ARG (exp, 0);
4104     tree arg2 = CALL_EXPR_ARG (exp, 1);
4105     tree len = CALL_EXPR_ARG (exp, 2);
4106
4107     unsigned int arg1_align
4108       = get_pointer_alignment (arg1, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
4109     unsigned int arg2_align
4110       = get_pointer_alignment (arg2, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
4111     enum machine_mode insn_mode;
4112
4113 #ifdef HAVE_cmpmemsi
4114     if (HAVE_cmpmemsi)
4115       insn_mode = insn_data[(int) CODE_FOR_cmpmemsi].operand[0].mode;
4116     else
4117 #endif
4118 #ifdef HAVE_cmpstrnsi
4119     if (HAVE_cmpstrnsi)
4120       insn_mode = insn_data[(int) CODE_FOR_cmpstrnsi].operand[0].mode;
4121     else
4122 #endif
4123       return NULL_RTX;
4124
4125     /* If we don't have POINTER_TYPE, call the function.  */
4126     if (arg1_align == 0 || arg2_align == 0)
4127       return NULL_RTX;
4128
4129     /* Make a place to write the result of the instruction.  */
4130     result = target;
4131     if (! (result != 0
4132            && REG_P (result) && GET_MODE (result) == insn_mode
4133            && REGNO (result) >= FIRST_PSEUDO_REGISTER))
4134       result = gen_reg_rtx (insn_mode);
4135
4136     arg1_rtx = get_memory_rtx (arg1, len);
4137     arg2_rtx = get_memory_rtx (arg2, len);
4138     arg3_rtx = expand_normal (fold_convert_loc (loc, sizetype, len));
4139
4140     /* Set MEM_SIZE as appropriate.  */
4141     if (CONST_INT_P (arg3_rtx))
4142       {
4143         set_mem_size (arg1_rtx, arg3_rtx);
4144         set_mem_size (arg2_rtx, arg3_rtx);
4145       }
4146
4147 #ifdef HAVE_cmpmemsi
4148     if (HAVE_cmpmemsi)
4149       insn = gen_cmpmemsi (result, arg1_rtx, arg2_rtx, arg3_rtx,
4150                            GEN_INT (MIN (arg1_align, arg2_align)));
4151     else
4152 #endif
4153 #ifdef HAVE_cmpstrnsi
4154     if (HAVE_cmpstrnsi)
4155       insn = gen_cmpstrnsi (result, arg1_rtx, arg2_rtx, arg3_rtx,
4156                             GEN_INT (MIN (arg1_align, arg2_align)));
4157     else
4158 #endif
4159       gcc_unreachable ();
4160
4161     if (insn)
4162       emit_insn (insn);
4163     else
4164       emit_library_call_value (memcmp_libfunc, result, LCT_PURE,
4165                                TYPE_MODE (integer_type_node), 3,
4166                                XEXP (arg1_rtx, 0), Pmode,
4167                                XEXP (arg2_rtx, 0), Pmode,
4168                                convert_to_mode (TYPE_MODE (sizetype), arg3_rtx,
4169                                                 TYPE_UNSIGNED (sizetype)),
4170                                TYPE_MODE (sizetype));
4171
4172     /* Return the value in the proper mode for this function.  */
4173     mode = TYPE_MODE (TREE_TYPE (exp));
4174     if (GET_MODE (result) == mode)
4175       return result;
4176     else if (target != 0)
4177       {
4178         convert_move (target, result, 0);
4179         return target;
4180       }
4181     else
4182       return convert_to_mode (mode, result, 0);
4183   }
4184 #endif
4185
4186   return NULL_RTX;
4187 }
4188
4189 /* Expand expression EXP, which is a call to the strcmp builtin.  Return NULL_RTX
4190    if we failed the caller should emit a normal call, otherwise try to get
4191    the result in TARGET, if convenient.  */
4192
4193 static rtx
4194 expand_builtin_strcmp (tree exp, ATTRIBUTE_UNUSED rtx target)
4195 {
4196   if (!validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
4197     return NULL_RTX;
4198
4199 #if defined HAVE_cmpstrsi || defined HAVE_cmpstrnsi
4200   if (direct_optab_handler (cmpstr_optab, SImode) != CODE_FOR_nothing
4201       || direct_optab_handler (cmpstrn_optab, SImode) != CODE_FOR_nothing)
4202     {
4203       rtx arg1_rtx, arg2_rtx;
4204       rtx result, insn = NULL_RTX;
4205       tree fndecl, fn;
4206       tree arg1 = CALL_EXPR_ARG (exp, 0);
4207       tree arg2 = CALL_EXPR_ARG (exp, 1);
4208
4209       unsigned int arg1_align
4210         = get_pointer_alignment (arg1, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
4211       unsigned int arg2_align
4212         = get_pointer_alignment (arg2, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
4213
4214       /* If we don't have POINTER_TYPE, call the function.  */
4215       if (arg1_align == 0 || arg2_align == 0)
4216         return NULL_RTX;
4217
4218       /* Stabilize the arguments in case gen_cmpstr(n)si fail.  */
4219       arg1 = builtin_save_expr (arg1);
4220       arg2 = builtin_save_expr (arg2);
4221
4222       arg1_rtx = get_memory_rtx (arg1, NULL);
4223       arg2_rtx = get_memory_rtx (arg2, NULL);
4224
4225 #ifdef HAVE_cmpstrsi
4226       /* Try to call cmpstrsi.  */
4227       if (HAVE_cmpstrsi)
4228         {
4229           enum machine_mode insn_mode
4230             = insn_data[(int) CODE_FOR_cmpstrsi].operand[0].mode;
4231
4232           /* Make a place to write the result of the instruction.  */
4233           result = target;
4234           if (! (result != 0
4235                  && REG_P (result) && GET_MODE (result) == insn_mode
4236                  && REGNO (result) >= FIRST_PSEUDO_REGISTER))
4237             result = gen_reg_rtx (insn_mode);
4238
4239           insn = gen_cmpstrsi (result, arg1_rtx, arg2_rtx,
4240                                GEN_INT (MIN (arg1_align, arg2_align)));
4241         }
4242 #endif
4243 #ifdef HAVE_cmpstrnsi
4244       /* Try to determine at least one length and call cmpstrnsi.  */
4245       if (!insn && HAVE_cmpstrnsi)
4246         {
4247           tree len;
4248           rtx arg3_rtx;
4249
4250           enum machine_mode insn_mode
4251             = insn_data[(int) CODE_FOR_cmpstrnsi].operand[0].mode;
4252           tree len1 = c_strlen (arg1, 1);
4253           tree len2 = c_strlen (arg2, 1);
4254
4255           if (len1)
4256             len1 = size_binop (PLUS_EXPR, ssize_int (1), len1);
4257           if (len2)
4258             len2 = size_binop (PLUS_EXPR, ssize_int (1), len2);
4259
4260           /* If we don't have a constant length for the first, use the length
4261              of the second, if we know it.  We don't require a constant for
4262              this case; some cost analysis could be done if both are available
4263              but neither is constant.  For now, assume they're equally cheap,
4264              unless one has side effects.  If both strings have constant lengths,
4265              use the smaller.  */
4266
4267           if (!len1)
4268             len = len2;
4269           else if (!len2)
4270             len = len1;
4271           else if (TREE_SIDE_EFFECTS (len1))
4272             len = len2;
4273           else if (TREE_SIDE_EFFECTS (len2))
4274             len = len1;
4275           else if (TREE_CODE (len1) != INTEGER_CST)
4276             len = len2;
4277           else if (TREE_CODE (len2) != INTEGER_CST)
4278             len = len1;
4279           else if (tree_int_cst_lt (len1, len2))
4280             len = len1;
4281           else
4282             len = len2;
4283
4284           /* If both arguments have side effects, we cannot optimize.  */
4285           if (!len || TREE_SIDE_EFFECTS (len))
4286             goto do_libcall;
4287
4288           arg3_rtx = expand_normal (len);
4289
4290           /* Make a place to write the result of the instruction.  */
4291           result = target;
4292           if (! (result != 0
4293                  && REG_P (result) && GET_MODE (result) == insn_mode
4294                  && REGNO (result) >= FIRST_PSEUDO_REGISTER))
4295             result = gen_reg_rtx (insn_mode);
4296
4297           insn = gen_cmpstrnsi (result, arg1_rtx, arg2_rtx, arg3_rtx,
4298                                 GEN_INT (MIN (arg1_align, arg2_align)));
4299         }
4300 #endif
4301
4302       if (insn)
4303         {
4304           enum machine_mode mode;
4305           emit_insn (insn);
4306
4307           /* Return the value in the proper mode for this function.  */
4308           mode = TYPE_MODE (TREE_TYPE (exp));
4309           if (GET_MODE (result) == mode)
4310             return result;
4311           if (target == 0)
4312             return convert_to_mode (mode, result, 0);
4313           convert_move (target, result, 0);
4314           return target;
4315         }
4316
4317       /* Expand the library call ourselves using a stabilized argument
4318          list to avoid re-evaluating the function's arguments twice.  */
4319 #ifdef HAVE_cmpstrnsi
4320     do_libcall:
4321 #endif
4322       fndecl = get_callee_fndecl (exp);
4323       fn = build_call_nofold_loc (EXPR_LOCATION (exp), fndecl, 2, arg1, arg2);
4324       gcc_assert (TREE_CODE (fn) == CALL_EXPR);
4325       CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (exp);
4326       return expand_call (fn, target, target == const0_rtx);
4327     }
4328 #endif
4329   return NULL_RTX;
4330 }
4331
4332 /* Expand expression EXP, which is a call to the strncmp builtin. Return
4333    NULL_RTX if we failed the caller should emit a normal call, otherwise try to get
4334    the result in TARGET, if convenient.  */
4335
4336 static rtx
4337 expand_builtin_strncmp (tree exp, ATTRIBUTE_UNUSED rtx target,
4338                         ATTRIBUTE_UNUSED enum machine_mode mode)
4339 {
4340   location_t loc ATTRIBUTE_UNUSED = EXPR_LOCATION (exp);
4341
4342   if (!validate_arglist (exp,
4343                          POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
4344     return NULL_RTX;
4345
4346   /* If c_strlen can determine an expression for one of the string
4347      lengths, and it doesn't have side effects, then emit cmpstrnsi
4348      using length MIN(strlen(string)+1, arg3).  */
4349 #ifdef HAVE_cmpstrnsi
4350   if (HAVE_cmpstrnsi)
4351   {
4352     tree len, len1, len2;
4353     rtx arg1_rtx, arg2_rtx, arg3_rtx;
4354     rtx result, insn;
4355     tree fndecl, fn;
4356     tree arg1 = CALL_EXPR_ARG (exp, 0);
4357     tree arg2 = CALL_EXPR_ARG (exp, 1);
4358     tree arg3 = CALL_EXPR_ARG (exp, 2);
4359
4360     unsigned int arg1_align
4361       = get_pointer_alignment (arg1, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
4362     unsigned int arg2_align
4363       = get_pointer_alignment (arg2, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
4364     enum machine_mode insn_mode
4365       = insn_data[(int) CODE_FOR_cmpstrnsi].operand[0].mode;
4366
4367     len1 = c_strlen (arg1, 1);
4368     len2 = c_strlen (arg2, 1);
4369
4370     if (len1)
4371       len1 = size_binop_loc (loc, PLUS_EXPR, ssize_int (1), len1);
4372     if (len2)
4373       len2 = size_binop_loc (loc, PLUS_EXPR, ssize_int (1), len2);
4374
4375     /* If we don't have a constant length for the first, use the length
4376        of the second, if we know it.  We don't require a constant for
4377        this case; some cost analysis could be done if both are available
4378        but neither is constant.  For now, assume they're equally cheap,
4379        unless one has side effects.  If both strings have constant lengths,
4380        use the smaller.  */
4381
4382     if (!len1)
4383       len = len2;
4384     else if (!len2)
4385       len = len1;
4386     else if (TREE_SIDE_EFFECTS (len1))
4387       len = len2;
4388     else if (TREE_SIDE_EFFECTS (len2))
4389       len = len1;
4390     else if (TREE_CODE (len1) != INTEGER_CST)
4391       len = len2;
4392     else if (TREE_CODE (len2) != INTEGER_CST)
4393       len = len1;
4394     else if (tree_int_cst_lt (len1, len2))
4395       len = len1;
4396     else
4397       len = len2;
4398
4399     /* If both arguments have side effects, we cannot optimize.  */
4400     if (!len || TREE_SIDE_EFFECTS (len))
4401       return NULL_RTX;
4402
4403     /* The actual new length parameter is MIN(len,arg3).  */
4404     len = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (len), len,
4405                        fold_convert_loc (loc, TREE_TYPE (len), arg3));
4406
4407     /* If we don't have POINTER_TYPE, call the function.  */
4408     if (arg1_align == 0 || arg2_align == 0)
4409       return NULL_RTX;
4410
4411     /* Make a place to write the result of the instruction.  */
4412     result = target;
4413     if (! (result != 0
4414            && REG_P (result) && GET_MODE (result) == insn_mode
4415            && REGNO (result) >= FIRST_PSEUDO_REGISTER))
4416       result = gen_reg_rtx (insn_mode);
4417
4418     /* Stabilize the arguments in case gen_cmpstrnsi fails.  */
4419     arg1 = builtin_save_expr (arg1);
4420     arg2 = builtin_save_expr (arg2);
4421     len = builtin_save_expr (len);
4422
4423     arg1_rtx = get_memory_rtx (arg1, len);
4424     arg2_rtx = get_memory_rtx (arg2, len);
4425     arg3_rtx = expand_normal (len);
4426     insn = gen_cmpstrnsi (result, arg1_rtx, arg2_rtx, arg3_rtx,
4427                           GEN_INT (MIN (arg1_align, arg2_align)));
4428     if (insn)
4429       {
4430         emit_insn (insn);
4431
4432         /* Return the value in the proper mode for this function.  */
4433         mode = TYPE_MODE (TREE_TYPE (exp));
4434         if (GET_MODE (result) == mode)
4435           return result;
4436         if (target == 0)
4437           return convert_to_mode (mode, result, 0);
4438         convert_move (target, result, 0);
4439         return target;
4440       }
4441
4442     /* Expand the library call ourselves using a stabilized argument
4443        list to avoid re-evaluating the function's arguments twice.  */
4444     fndecl = get_callee_fndecl (exp);
4445     fn = build_call_nofold_loc (EXPR_LOCATION (exp), fndecl, 3,
4446                                 arg1, arg2, len);
4447     gcc_assert (TREE_CODE (fn) == CALL_EXPR);
4448     CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (exp);
4449     return expand_call (fn, target, target == const0_rtx);
4450   }
4451 #endif
4452   return NULL_RTX;
4453 }
4454
4455 /* Expand a call to __builtin_saveregs, generating the result in TARGET,
4456    if that's convenient.  */
4457
4458 rtx
4459 expand_builtin_saveregs (void)
4460 {
4461   rtx val, seq;
4462
4463   /* Don't do __builtin_saveregs more than once in a function.
4464      Save the result of the first call and reuse it.  */
4465   if (saveregs_value != 0)
4466     return saveregs_value;
4467
4468   /* When this function is called, it means that registers must be
4469      saved on entry to this function.  So we migrate the call to the
4470      first insn of this function.  */
4471
4472   start_sequence ();
4473
4474   /* Do whatever the machine needs done in this case.  */
4475   val = targetm.calls.expand_builtin_saveregs ();
4476
4477   seq = get_insns ();
4478   end_sequence ();
4479
4480   saveregs_value = val;
4481
4482   /* Put the insns after the NOTE that starts the function.  If this
4483      is inside a start_sequence, make the outer-level insn chain current, so
4484      the code is placed at the start of the function.  */
4485   push_topmost_sequence ();
4486   emit_insn_after (seq, entry_of_function ());
4487   pop_topmost_sequence ();
4488
4489   return val;
4490 }
4491
4492 /* Expand a call to __builtin_next_arg.  */
4493
4494 static rtx
4495 expand_builtin_next_arg (void)
4496 {
4497   /* Checking arguments is already done in fold_builtin_next_arg
4498      that must be called before this function.  */
4499   return expand_binop (ptr_mode, add_optab,
4500                        crtl->args.internal_arg_pointer,
4501                        crtl->args.arg_offset_rtx,
4502                        NULL_RTX, 0, OPTAB_LIB_WIDEN);
4503 }
4504
4505 /* Make it easier for the backends by protecting the valist argument
4506    from multiple evaluations.  */
4507
4508 static tree
4509 stabilize_va_list_loc (location_t loc, tree valist, int needs_lvalue)
4510 {
4511   tree vatype = targetm.canonical_va_list_type (TREE_TYPE (valist));
4512
4513   /* The current way of determining the type of valist is completely
4514      bogus.  We should have the information on the va builtin instead.  */
4515   if (!vatype)
4516     vatype = targetm.fn_abi_va_list (cfun->decl);
4517
4518   if (TREE_CODE (vatype) == ARRAY_TYPE)
4519     {
4520       if (TREE_SIDE_EFFECTS (valist))
4521         valist = save_expr (valist);
4522
4523       /* For this case, the backends will be expecting a pointer to
4524          vatype, but it's possible we've actually been given an array
4525          (an actual TARGET_CANONICAL_VA_LIST_TYPE (valist)).
4526          So fix it.  */
4527       if (TREE_CODE (TREE_TYPE (valist)) == ARRAY_TYPE)
4528         {
4529           tree p1 = build_pointer_type (TREE_TYPE (vatype));
4530           valist = build_fold_addr_expr_with_type_loc (loc, valist, p1);
4531         }
4532     }
4533   else
4534     {
4535       tree pt = build_pointer_type (vatype);
4536
4537       if (! needs_lvalue)
4538         {
4539           if (! TREE_SIDE_EFFECTS (valist))
4540             return valist;
4541
4542           valist = fold_build1_loc (loc, ADDR_EXPR, pt, valist);
4543           TREE_SIDE_EFFECTS (valist) = 1;
4544         }
4545
4546       if (TREE_SIDE_EFFECTS (valist))
4547         valist = save_expr (valist);
4548       valist = fold_build2_loc (loc, MEM_REF,
4549                                 vatype, valist, build_int_cst (pt, 0));
4550     }
4551
4552   return valist;
4553 }
4554
4555 /* The "standard" definition of va_list is void*.  */
4556
4557 tree
4558 std_build_builtin_va_list (void)
4559 {
4560   return ptr_type_node;
4561 }
4562
4563 /* The "standard" abi va_list is va_list_type_node.  */
4564
4565 tree
4566 std_fn_abi_va_list (tree fndecl ATTRIBUTE_UNUSED)
4567 {
4568   return va_list_type_node;
4569 }
4570
4571 /* The "standard" type of va_list is va_list_type_node.  */
4572
4573 tree
4574 std_canonical_va_list_type (tree type)
4575 {
4576   tree wtype, htype;
4577
4578   if (INDIRECT_REF_P (type))
4579     type = TREE_TYPE (type);
4580   else if (POINTER_TYPE_P (type) && POINTER_TYPE_P (TREE_TYPE(type)))
4581     type = TREE_TYPE (type);
4582   wtype = va_list_type_node;
4583   htype = type;
4584   /* Treat structure va_list types.  */
4585   if (TREE_CODE (wtype) == RECORD_TYPE && POINTER_TYPE_P (htype))
4586     htype = TREE_TYPE (htype);
4587   else if (TREE_CODE (wtype) == ARRAY_TYPE)
4588     {
4589       /* If va_list is an array type, the argument may have decayed
4590          to a pointer type, e.g. by being passed to another function.
4591          In that case, unwrap both types so that we can compare the
4592          underlying records.  */
4593       if (TREE_CODE (htype) == ARRAY_TYPE
4594           || POINTER_TYPE_P (htype))
4595         {
4596           wtype = TREE_TYPE (wtype);
4597           htype = TREE_TYPE (htype);
4598         }
4599     }
4600   if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
4601     return va_list_type_node;
4602
4603   return NULL_TREE;
4604 }
4605
4606 /* The "standard" implementation of va_start: just assign `nextarg' to
4607    the variable.  */
4608
4609 void
4610 std_expand_builtin_va_start (tree valist, rtx nextarg)
4611 {
4612   rtx va_r = expand_expr (valist, NULL_RTX, VOIDmode, EXPAND_WRITE);
4613   convert_move (va_r, nextarg, 0);
4614 }
4615
4616 /* Expand EXP, a call to __builtin_va_start.  */
4617
4618 static rtx
4619 expand_builtin_va_start (tree exp)
4620 {
4621   rtx nextarg;
4622   tree valist;
4623   location_t loc = EXPR_LOCATION (exp);
4624
4625   if (call_expr_nargs (exp) < 2)
4626     {
4627       error_at (loc, "too few arguments to function %<va_start%>");
4628       return const0_rtx;
4629     }
4630
4631   if (fold_builtin_next_arg (exp, true))
4632     return const0_rtx;
4633
4634   nextarg = expand_builtin_next_arg ();
4635   valist = stabilize_va_list_loc (loc, CALL_EXPR_ARG (exp, 0), 1);
4636
4637   if (targetm.expand_builtin_va_start)
4638     targetm.expand_builtin_va_start (valist, nextarg);
4639   else
4640     std_expand_builtin_va_start (valist, nextarg);
4641
4642   return const0_rtx;
4643 }
4644
4645 /* The "standard" implementation of va_arg: read the value from the
4646    current (padded) address and increment by the (padded) size.  */
4647
4648 tree
4649 std_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
4650                           gimple_seq *post_p)
4651 {
4652   tree addr, t, type_size, rounded_size, valist_tmp;
4653   unsigned HOST_WIDE_INT align, boundary;
4654   bool indirect;
4655
4656 #ifdef ARGS_GROW_DOWNWARD
4657   /* All of the alignment and movement below is for args-grow-up machines.
4658      As of 2004, there are only 3 ARGS_GROW_DOWNWARD targets, and they all
4659      implement their own specialized gimplify_va_arg_expr routines.  */
4660   gcc_unreachable ();
4661 #endif
4662
4663   indirect = pass_by_reference (NULL, TYPE_MODE (type), type, false);
4664   if (indirect)
4665     type = build_pointer_type (type);
4666
4667   align = PARM_BOUNDARY / BITS_PER_UNIT;
4668   boundary = targetm.calls.function_arg_boundary (TYPE_MODE (type), type);
4669
4670   /* When we align parameter on stack for caller, if the parameter
4671      alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
4672      aligned at MAX_SUPPORTED_STACK_ALIGNMENT.  We will match callee
4673      here with caller.  */
4674   if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
4675     boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
4676
4677   boundary /= BITS_PER_UNIT;
4678
4679   /* Hoist the valist value into a temporary for the moment.  */
4680   valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
4681
4682   /* va_list pointer is aligned to PARM_BOUNDARY.  If argument actually
4683      requires greater alignment, we must perform dynamic alignment.  */
4684   if (boundary > align
4685       && !integer_zerop (TYPE_SIZE (type)))
4686     {
4687       t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
4688                   fold_build2 (POINTER_PLUS_EXPR,
4689                                TREE_TYPE (valist),
4690                                valist_tmp, size_int (boundary - 1)));
4691       gimplify_and_add (t, pre_p);
4692
4693       t = fold_convert (sizetype, valist_tmp);
4694       t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
4695                   fold_convert (TREE_TYPE (valist),
4696                                 fold_build2 (BIT_AND_EXPR, sizetype, t,
4697                                              size_int (-boundary))));
4698       gimplify_and_add (t, pre_p);
4699     }
4700   else
4701     boundary = align;
4702
4703   /* If the actual alignment is less than the alignment of the type,
4704      adjust the type accordingly so that we don't assume strict alignment
4705      when dereferencing the pointer.  */
4706   boundary *= BITS_PER_UNIT;
4707   if (boundary < TYPE_ALIGN (type))
4708     {
4709       type = build_variant_type_copy (type);
4710       TYPE_ALIGN (type) = boundary;
4711     }
4712
4713   /* Compute the rounded size of the type.  */
4714   type_size = size_in_bytes (type);
4715   rounded_size = round_up (type_size, align);
4716
4717   /* Reduce rounded_size so it's sharable with the postqueue.  */
4718   gimplify_expr (&rounded_size, pre_p, post_p, is_gimple_val, fb_rvalue);
4719
4720   /* Get AP.  */
4721   addr = valist_tmp;
4722   if (PAD_VARARGS_DOWN && !integer_zerop (rounded_size))
4723     {
4724       /* Small args are padded downward.  */
4725       t = fold_build2_loc (input_location, GT_EXPR, sizetype,
4726                        rounded_size, size_int (align));
4727       t = fold_build3 (COND_EXPR, sizetype, t, size_zero_node,
4728                        size_binop (MINUS_EXPR, rounded_size, type_size));
4729       addr = fold_build2 (POINTER_PLUS_EXPR,
4730                           TREE_TYPE (addr), addr, t);
4731     }
4732
4733   /* Compute new value for AP.  */
4734   t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (valist), valist_tmp, rounded_size);
4735   t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
4736   gimplify_and_add (t, pre_p);
4737
4738   addr = fold_convert (build_pointer_type (type), addr);
4739
4740   if (indirect)
4741     addr = build_va_arg_indirect_ref (addr);
4742
4743   return build_va_arg_indirect_ref (addr);
4744 }
4745
4746 /* Build an indirect-ref expression over the given TREE, which represents a
4747    piece of a va_arg() expansion.  */
4748 tree
4749 build_va_arg_indirect_ref (tree addr)
4750 {
4751   addr = build_simple_mem_ref_loc (EXPR_LOCATION (addr), addr);
4752
4753   if (flag_mudflap) /* Don't instrument va_arg INDIRECT_REF.  */
4754     mf_mark (addr);
4755
4756   return addr;
4757 }
4758
4759 /* Return a dummy expression of type TYPE in order to keep going after an
4760    error.  */
4761
4762 static tree
4763 dummy_object (tree type)
4764 {
4765   tree t = build_int_cst (build_pointer_type (type), 0);
4766   return build2 (MEM_REF, type, t, t);
4767 }
4768
4769 /* Gimplify __builtin_va_arg, aka VA_ARG_EXPR, which is not really a
4770    builtin function, but a very special sort of operator.  */
4771
4772 enum gimplify_status
4773 gimplify_va_arg_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4774 {
4775   tree promoted_type, have_va_type;
4776   tree valist = TREE_OPERAND (*expr_p, 0);
4777   tree type = TREE_TYPE (*expr_p);
4778   tree t;
4779   location_t loc = EXPR_LOCATION (*expr_p);
4780
4781   /* Verify that valist is of the proper type.  */
4782   have_va_type = TREE_TYPE (valist);
4783   if (have_va_type == error_mark_node)
4784     return GS_ERROR;
4785   have_va_type = targetm.canonical_va_list_type (have_va_type);
4786
4787   if (have_va_type == NULL_TREE)
4788     {
4789       error_at (loc, "first argument to %<va_arg%> not of type %<va_list%>");
4790       return GS_ERROR;
4791     }
4792
4793   /* Generate a diagnostic for requesting data of a type that cannot
4794      be passed through `...' due to type promotion at the call site.  */
4795   if ((promoted_type = lang_hooks.types.type_promotes_to (type))
4796            != type)
4797     {
4798       static bool gave_help;
4799       bool warned;
4800
4801       /* Unfortunately, this is merely undefined, rather than a constraint
4802          violation, so we cannot make this an error.  If this call is never
4803          executed, the program is still strictly conforming.  */
4804       warned = warning_at (loc, 0,
4805                            "%qT is promoted to %qT when passed through %<...%>",
4806                            type, promoted_type);
4807       if (!gave_help && warned)
4808         {
4809           gave_help = true;
4810           inform (loc, "(so you should pass %qT not %qT to %<va_arg%>)",
4811                   promoted_type, type);
4812         }
4813
4814       /* We can, however, treat "undefined" any way we please.
4815          Call abort to encourage the user to fix the program.  */
4816       if (warned)
4817         inform (loc, "if this code is reached, the program will abort");
4818       /* Before the abort, allow the evaluation of the va_list
4819          expression to exit or longjmp.  */
4820       gimplify_and_add (valist, pre_p);
4821       t = build_call_expr_loc (loc,
4822                                implicit_built_in_decls[BUILT_IN_TRAP], 0);
4823       gimplify_and_add (t, pre_p);
4824
4825       /* This is dead code, but go ahead and finish so that the
4826          mode of the result comes out right.  */
4827       *expr_p = dummy_object (type);
4828       return GS_ALL_DONE;
4829     }
4830   else
4831     {
4832       /* Make it easier for the backends by protecting the valist argument
4833          from multiple evaluations.  */
4834       if (TREE_CODE (have_va_type) == ARRAY_TYPE)
4835         {
4836           /* For this case, the backends will be expecting a pointer to
4837              TREE_TYPE (abi), but it's possible we've
4838              actually been given an array (an actual TARGET_FN_ABI_VA_LIST).
4839              So fix it.  */
4840           if (TREE_CODE (TREE_TYPE (valist)) == ARRAY_TYPE)
4841             {
4842               tree p1 = build_pointer_type (TREE_TYPE (have_va_type));
4843               valist = fold_convert_loc (loc, p1,
4844                                          build_fold_addr_expr_loc (loc, valist));
4845             }
4846
4847           gimplify_expr (&valist, pre_p, post_p, is_gimple_val, fb_rvalue);
4848         }
4849       else
4850         gimplify_expr (&valist, pre_p, post_p, is_gimple_min_lval, fb_lvalue);
4851
4852       if (!targetm.gimplify_va_arg_expr)
4853         /* FIXME: Once most targets are converted we should merely
4854            assert this is non-null.  */
4855         return GS_ALL_DONE;
4856
4857       *expr_p = targetm.gimplify_va_arg_expr (valist, type, pre_p, post_p);
4858       return GS_OK;
4859     }
4860 }
4861
4862 /* Expand EXP, a call to __builtin_va_end.  */
4863
4864 static rtx
4865 expand_builtin_va_end (tree exp)
4866 {
4867   tree valist = CALL_EXPR_ARG (exp, 0);
4868
4869   /* Evaluate for side effects, if needed.  I hate macros that don't
4870      do that.  */
4871   if (TREE_SIDE_EFFECTS (valist))
4872     expand_expr (valist, const0_rtx, VOIDmode, EXPAND_NORMAL);
4873
4874   return const0_rtx;
4875 }
4876
4877 /* Expand EXP, a call to __builtin_va_copy.  We do this as a
4878    builtin rather than just as an assignment in stdarg.h because of the
4879    nastiness of array-type va_list types.  */
4880
4881 static rtx
4882 expand_builtin_va_copy (tree exp)
4883 {
4884   tree dst, src, t;
4885   location_t loc = EXPR_LOCATION (exp);
4886
4887   dst = CALL_EXPR_ARG (exp, 0);
4888   src = CALL_EXPR_ARG (exp, 1);
4889
4890   dst = stabilize_va_list_loc (loc, dst, 1);
4891   src = stabilize_va_list_loc (loc, src, 0);
4892
4893   gcc_assert (cfun != NULL && cfun->decl != NULL_TREE);
4894
4895   if (TREE_CODE (targetm.fn_abi_va_list (cfun->decl)) != ARRAY_TYPE)
4896     {
4897       t = build2 (MODIFY_EXPR, targetm.fn_abi_va_list (cfun->decl), dst, src);
4898       TREE_SIDE_EFFECTS (t) = 1;
4899       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4900     }
4901   else
4902     {
4903       rtx dstb, srcb, size;
4904
4905       /* Evaluate to pointers.  */
4906       dstb = expand_expr (dst, NULL_RTX, Pmode, EXPAND_NORMAL);
4907       srcb = expand_expr (src, NULL_RTX, Pmode, EXPAND_NORMAL);
4908       size = expand_expr (TYPE_SIZE_UNIT (targetm.fn_abi_va_list (cfun->decl)),
4909                   NULL_RTX, VOIDmode, EXPAND_NORMAL);
4910
4911       dstb = convert_memory_address (Pmode, dstb);
4912       srcb = convert_memory_address (Pmode, srcb);
4913
4914       /* "Dereference" to BLKmode memories.  */
4915       dstb = gen_rtx_MEM (BLKmode, dstb);
4916       set_mem_alias_set (dstb, get_alias_set (TREE_TYPE (TREE_TYPE (dst))));
4917       set_mem_align (dstb, TYPE_ALIGN (targetm.fn_abi_va_list (cfun->decl)));
4918       srcb = gen_rtx_MEM (BLKmode, srcb);
4919       set_mem_alias_set (srcb, get_alias_set (TREE_TYPE (TREE_TYPE (src))));
4920       set_mem_align (srcb, TYPE_ALIGN (targetm.fn_abi_va_list (cfun->decl)));
4921
4922       /* Copy.  */
4923       emit_block_move (dstb, srcb, size, BLOCK_OP_NORMAL);
4924     }
4925
4926   return const0_rtx;
4927 }
4928
4929 /* Expand a call to one of the builtin functions __builtin_frame_address or
4930    __builtin_return_address.  */
4931
4932 static rtx
4933 expand_builtin_frame_address (tree fndecl, tree exp)
4934 {
4935   /* The argument must be a nonnegative integer constant.
4936      It counts the number of frames to scan up the stack.
4937      The value is the return address saved in that frame.  */
4938   if (call_expr_nargs (exp) == 0)
4939     /* Warning about missing arg was already issued.  */
4940     return const0_rtx;
4941   else if (! host_integerp (CALL_EXPR_ARG (exp, 0), 1))
4942     {
4943       if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FRAME_ADDRESS)
4944         error ("invalid argument to %<__builtin_frame_address%>");
4945       else
4946         error ("invalid argument to %<__builtin_return_address%>");
4947       return const0_rtx;
4948     }
4949   else
4950     {
4951       rtx tem
4952         = expand_builtin_return_addr (DECL_FUNCTION_CODE (fndecl),
4953                                       tree_low_cst (CALL_EXPR_ARG (exp, 0), 1));
4954
4955       /* Some ports cannot access arbitrary stack frames.  */
4956       if (tem == NULL)
4957         {
4958           if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FRAME_ADDRESS)
4959             warning (0, "unsupported argument to %<__builtin_frame_address%>");
4960           else
4961             warning (0, "unsupported argument to %<__builtin_return_address%>");
4962           return const0_rtx;
4963         }
4964
4965       /* For __builtin_frame_address, return what we've got.  */
4966       if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FRAME_ADDRESS)
4967         return tem;
4968
4969       if (!REG_P (tem)
4970           && ! CONSTANT_P (tem))
4971         tem = copy_to_mode_reg (Pmode, tem);
4972       return tem;
4973     }
4974 }
4975
4976 /* Expand EXP, a call to the alloca builtin.  Return NULL_RTX if we
4977    failed and the caller should emit a normal call.  CANNOT_ACCUMULATE
4978    is the same as for allocate_dynamic_stack_space.  */
4979
4980 static rtx
4981 expand_builtin_alloca (tree exp, bool cannot_accumulate)
4982 {
4983   rtx op0;
4984   rtx result;
4985
4986   /* Emit normal call if marked not-inlineable.  */
4987   if (CALL_CANNOT_INLINE_P (exp))
4988     return NULL_RTX;
4989
4990   if (!validate_arglist (exp, INTEGER_TYPE, VOID_TYPE))
4991     return NULL_RTX;
4992
4993   /* Compute the argument.  */
4994   op0 = expand_normal (CALL_EXPR_ARG (exp, 0));
4995
4996   /* Allocate the desired space.  */
4997   result = allocate_dynamic_stack_space (op0, 0, BIGGEST_ALIGNMENT,
4998                                          cannot_accumulate);
4999   result = convert_memory_address (ptr_mode, result);
5000
5001   return result;
5002 }
5003
5004 /* Expand a call to a bswap builtin with argument ARG0.  MODE
5005    is the mode to expand with.  */
5006
5007 static rtx
5008 expand_builtin_bswap (tree exp, rtx target, rtx subtarget)
5009 {
5010   enum machine_mode mode;
5011   tree arg;
5012   rtx op0;
5013
5014   if (!validate_arglist (exp, INTEGER_TYPE, VOID_TYPE))
5015     return NULL_RTX;
5016
5017   arg = CALL_EXPR_ARG (exp, 0);
5018   mode = TYPE_MODE (TREE_TYPE (arg));
5019   op0 = expand_expr (arg, subtarget, VOIDmode, EXPAND_NORMAL);
5020
5021   target = expand_unop (mode, bswap_optab, op0, target, 1);
5022
5023   gcc_assert (target);
5024
5025   return convert_to_mode (mode, target, 0);
5026 }
5027
5028 /* Expand a call to a unary builtin in EXP.
5029    Return NULL_RTX if a normal call should be emitted rather than expanding the
5030    function in-line.  If convenient, the result should be placed in TARGET.
5031    SUBTARGET may be used as the target for computing one of EXP's operands.  */
5032
5033 static rtx
5034 expand_builtin_unop (enum machine_mode target_mode, tree exp, rtx target,
5035                      rtx subtarget, optab op_optab)
5036 {
5037   rtx op0;
5038
5039   if (!validate_arglist (exp, INTEGER_TYPE, VOID_TYPE))
5040     return NULL_RTX;
5041
5042   /* Compute the argument.  */
5043   op0 = expand_expr (CALL_EXPR_ARG (exp, 0),
5044                      (subtarget
5045                       && (TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 0)))
5046                           == GET_MODE (subtarget))) ? subtarget : NULL_RTX,
5047                      VOIDmode, EXPAND_NORMAL);
5048   /* Compute op, into TARGET if possible.
5049      Set TARGET to wherever the result comes back.  */
5050   target = expand_unop (TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 0))),
5051                         op_optab, op0, target, 1);
5052   gcc_assert (target);
5053
5054   return convert_to_mode (target_mode, target, 0);
5055 }
5056
5057 /* Expand a call to __builtin_expect.  We just return our argument
5058    as the builtin_expect semantic should've been already executed by
5059    tree branch prediction pass. */
5060
5061 static rtx
5062 expand_builtin_expect (tree exp, rtx target)
5063 {
5064   tree arg;
5065
5066   if (call_expr_nargs (exp) < 2)
5067     return const0_rtx;
5068   arg = CALL_EXPR_ARG (exp, 0);
5069
5070   target = expand_expr (arg, target, VOIDmode, EXPAND_NORMAL);
5071   /* When guessing was done, the hints should be already stripped away.  */
5072   gcc_assert (!flag_guess_branch_prob
5073               || optimize == 0 || seen_error ());
5074   return target;
5075 }
5076
5077 void
5078 expand_builtin_trap (void)
5079 {
5080 #ifdef HAVE_trap
5081   if (HAVE_trap)
5082     emit_insn (gen_trap ());
5083   else
5084 #endif
5085     emit_library_call (abort_libfunc, LCT_NORETURN, VOIDmode, 0);
5086   emit_barrier ();
5087 }
5088
5089 /* Expand a call to __builtin_unreachable.  We do nothing except emit
5090    a barrier saying that control flow will not pass here.
5091
5092    It is the responsibility of the program being compiled to ensure
5093    that control flow does never reach __builtin_unreachable.  */
5094 static void
5095 expand_builtin_unreachable (void)
5096 {
5097   emit_barrier ();
5098 }
5099
5100 /* Expand EXP, a call to fabs, fabsf or fabsl.
5101    Return NULL_RTX if a normal call should be emitted rather than expanding
5102    the function inline.  If convenient, the result should be placed
5103    in TARGET.  SUBTARGET may be used as the target for computing
5104    the operand.  */
5105
5106 static rtx
5107 expand_builtin_fabs (tree exp, rtx target, rtx subtarget)
5108 {
5109   enum machine_mode mode;
5110   tree arg;
5111   rtx op0;
5112
5113   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
5114     return NULL_RTX;
5115
5116   arg = CALL_EXPR_ARG (exp, 0);
5117   CALL_EXPR_ARG (exp, 0) = arg = builtin_save_expr (arg);
5118   mode = TYPE_MODE (TREE_TYPE (arg));
5119   op0 = expand_expr (arg, subtarget, VOIDmode, EXPAND_NORMAL);
5120   return expand_abs (mode, op0, target, 0, safe_from_p (target, arg, 1));
5121 }
5122
5123 /* Expand EXP, a call to copysign, copysignf, or copysignl.
5124    Return NULL is a normal call should be emitted rather than expanding the
5125    function inline.  If convenient, the result should be placed in TARGET.
5126    SUBTARGET may be used as the target for computing the operand.  */
5127
5128 static rtx
5129 expand_builtin_copysign (tree exp, rtx target, rtx subtarget)
5130 {
5131   rtx op0, op1;
5132   tree arg;
5133
5134   if (!validate_arglist (exp, REAL_TYPE, REAL_TYPE, VOID_TYPE))
5135     return NULL_RTX;
5136
5137   arg = CALL_EXPR_ARG (exp, 0);
5138   op0 = expand_expr (arg, subtarget, VOIDmode, EXPAND_NORMAL);
5139
5140   arg = CALL_EXPR_ARG (exp, 1);
5141   op1 = expand_normal (arg);
5142
5143   return expand_copysign (op0, op1, target);
5144 }
5145
5146 /* Create a new constant string literal and return a char* pointer to it.
5147    The STRING_CST value is the LEN characters at STR.  */
5148 tree
5149 build_string_literal (int len, const char *str)
5150 {
5151   tree t, elem, index, type;
5152
5153   t = build_string (len, str);
5154   elem = build_type_variant (char_type_node, 1, 0);
5155   index = build_index_type (size_int (len - 1));
5156   type = build_array_type (elem, index);
5157   TREE_TYPE (t) = type;
5158   TREE_CONSTANT (t) = 1;
5159   TREE_READONLY (t) = 1;
5160   TREE_STATIC (t) = 1;
5161
5162   type = build_pointer_type (elem);
5163   t = build1 (ADDR_EXPR, type,
5164               build4 (ARRAY_REF, elem,
5165                       t, integer_zero_node, NULL_TREE, NULL_TREE));
5166   return t;
5167 }
5168
5169 /* Expand a call to __builtin___clear_cache.  */
5170
5171 static rtx
5172 expand_builtin___clear_cache (tree exp ATTRIBUTE_UNUSED)
5173 {
5174 #ifndef HAVE_clear_cache
5175 #ifdef CLEAR_INSN_CACHE
5176   /* There is no "clear_cache" insn, and __clear_cache() in libgcc
5177      does something.  Just do the default expansion to a call to
5178      __clear_cache().  */
5179   return NULL_RTX;
5180 #else
5181   /* There is no "clear_cache" insn, and __clear_cache() in libgcc
5182      does nothing.  There is no need to call it.  Do nothing.  */
5183   return const0_rtx;
5184 #endif /* CLEAR_INSN_CACHE */
5185 #else
5186   /* We have a "clear_cache" insn, and it will handle everything.  */
5187   tree begin, end;
5188   rtx begin_rtx, end_rtx;
5189
5190   /* We must not expand to a library call.  If we did, any
5191      fallback library function in libgcc that might contain a call to
5192      __builtin___clear_cache() would recurse infinitely.  */
5193   if (!validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
5194     {
5195       error ("both arguments to %<__builtin___clear_cache%> must be pointers");
5196       return const0_rtx;
5197     }
5198
5199   if (HAVE_clear_cache)
5200     {
5201       struct expand_operand ops[2];
5202
5203       begin = CALL_EXPR_ARG (exp, 0);
5204       begin_rtx = expand_expr (begin, NULL_RTX, Pmode, EXPAND_NORMAL);
5205
5206       end = CALL_EXPR_ARG (exp, 1);
5207       end_rtx = expand_expr (end, NULL_RTX, Pmode, EXPAND_NORMAL);
5208
5209       create_address_operand (&ops[0], begin_rtx);
5210       create_address_operand (&ops[1], end_rtx);
5211       if (maybe_expand_insn (CODE_FOR_clear_cache, 2, ops))
5212         return const0_rtx;
5213     }
5214   return const0_rtx;
5215 #endif /* HAVE_clear_cache */
5216 }
5217
5218 /* Given a trampoline address, make sure it satisfies TRAMPOLINE_ALIGNMENT.  */
5219
5220 static rtx
5221 round_trampoline_addr (rtx tramp)
5222 {
5223   rtx temp, addend, mask;
5224
5225   /* If we don't need too much alignment, we'll have been guaranteed
5226      proper alignment by get_trampoline_type.  */
5227   if (TRAMPOLINE_ALIGNMENT <= STACK_BOUNDARY)
5228     return tramp;
5229
5230   /* Round address up to desired boundary.  */
5231   temp = gen_reg_rtx (Pmode);
5232   addend = GEN_INT (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT - 1);
5233   mask = GEN_INT (-TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT);
5234
5235   temp  = expand_simple_binop (Pmode, PLUS, tramp, addend,
5236                                temp, 0, OPTAB_LIB_WIDEN);
5237   tramp = expand_simple_binop (Pmode, AND, temp, mask,
5238                                temp, 0, OPTAB_LIB_WIDEN);
5239
5240   return tramp;
5241 }
5242
5243 static rtx
5244 expand_builtin_init_trampoline (tree exp)
5245 {
5246   tree t_tramp, t_func, t_chain;
5247   rtx m_tramp, r_tramp, r_chain, tmp;
5248
5249   if (!validate_arglist (exp, POINTER_TYPE, POINTER_TYPE,
5250                          POINTER_TYPE, VOID_TYPE))
5251     return NULL_RTX;
5252
5253   t_tramp = CALL_EXPR_ARG (exp, 0);
5254   t_func = CALL_EXPR_ARG (exp, 1);
5255   t_chain = CALL_EXPR_ARG (exp, 2);
5256
5257   r_tramp = expand_normal (t_tramp);
5258   m_tramp = gen_rtx_MEM (BLKmode, r_tramp);
5259   MEM_NOTRAP_P (m_tramp) = 1;
5260
5261   /* The TRAMP argument should be the address of a field within the
5262      local function's FRAME decl.  Let's see if we can fill in the
5263      to fill in the MEM_ATTRs for this memory.  */
5264   if (TREE_CODE (t_tramp) == ADDR_EXPR)
5265     set_mem_attributes_minus_bitpos (m_tramp, TREE_OPERAND (t_tramp, 0),
5266                                      true, 0);
5267
5268   tmp = round_trampoline_addr (r_tramp);
5269   if (tmp != r_tramp)
5270     {
5271       m_tramp = change_address (m_tramp, BLKmode, tmp);
5272       set_mem_align (m_tramp, TRAMPOLINE_ALIGNMENT);
5273       set_mem_size (m_tramp, GEN_INT (TRAMPOLINE_SIZE));
5274     }
5275
5276   /* The FUNC argument should be the address of the nested function.
5277      Extract the actual function decl to pass to the hook.  */
5278   gcc_assert (TREE_CODE (t_func) == ADDR_EXPR);
5279   t_func = TREE_OPERAND (t_func, 0);
5280   gcc_assert (TREE_CODE (t_func) == FUNCTION_DECL);
5281
5282   r_chain = expand_normal (t_chain);
5283
5284   /* Generate insns to initialize the trampoline.  */
5285   targetm.calls.trampoline_init (m_tramp, t_func, r_chain);
5286
5287   trampolines_created = 1;
5288
5289   warning_at (DECL_SOURCE_LOCATION (t_func), OPT_Wtrampolines,
5290               "trampoline generated for nested function %qD", t_func);
5291
5292   return const0_rtx;
5293 }
5294
5295 static rtx
5296 expand_builtin_adjust_trampoline (tree exp)
5297 {
5298   rtx tramp;
5299
5300   if (!validate_arglist (exp, POINTER_TYPE, VOID_TYPE))
5301     return NULL_RTX;
5302
5303   tramp = expand_normal (CALL_EXPR_ARG (exp, 0));
5304   tramp = round_trampoline_addr (tramp);
5305   if (targetm.calls.trampoline_adjust_address)
5306     tramp = targetm.calls.trampoline_adjust_address (tramp);
5307
5308   return tramp;
5309 }
5310
5311 /* Expand the call EXP to the built-in signbit, signbitf or signbitl
5312    function.  The function first checks whether the back end provides
5313    an insn to implement signbit for the respective mode.  If not, it
5314    checks whether the floating point format of the value is such that
5315    the sign bit can be extracted.  If that is not the case, the
5316    function returns NULL_RTX to indicate that a normal call should be
5317    emitted rather than expanding the function in-line.  EXP is the
5318    expression that is a call to the builtin function; if convenient,
5319    the result should be placed in TARGET.  */
5320 static rtx
5321 expand_builtin_signbit (tree exp, rtx target)
5322 {
5323   const struct real_format *fmt;
5324   enum machine_mode fmode, imode, rmode;
5325   tree arg;
5326   int word, bitpos;
5327   enum insn_code icode;
5328   rtx temp;
5329   location_t loc = EXPR_LOCATION (exp);
5330
5331   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
5332     return NULL_RTX;
5333
5334   arg = CALL_EXPR_ARG (exp, 0);
5335   fmode = TYPE_MODE (TREE_TYPE (arg));
5336   rmode = TYPE_MODE (TREE_TYPE (exp));
5337   fmt = REAL_MODE_FORMAT (fmode);
5338
5339   arg = builtin_save_expr (arg);
5340
5341   /* Expand the argument yielding a RTX expression. */
5342   temp = expand_normal (arg);
5343
5344   /* Check if the back end provides an insn that handles signbit for the
5345      argument's mode. */
5346   icode = optab_handler (signbit_optab, fmode);
5347   if (icode != CODE_FOR_nothing)
5348     {
5349       rtx last = get_last_insn ();
5350       target = gen_reg_rtx (TYPE_MODE (TREE_TYPE (exp)));
5351       if (maybe_emit_unop_insn (icode, target, temp, UNKNOWN))
5352         return target;
5353       delete_insns_since (last);
5354     }
5355
5356   /* For floating point formats without a sign bit, implement signbit
5357      as "ARG < 0.0".  */
5358   bitpos = fmt->signbit_ro;
5359   if (bitpos < 0)
5360   {
5361     /* But we can't do this if the format supports signed zero.  */
5362     if (fmt->has_signed_zero && HONOR_SIGNED_ZEROS (fmode))
5363       return NULL_RTX;
5364
5365     arg = fold_build2_loc (loc, LT_EXPR, TREE_TYPE (exp), arg,
5366                        build_real (TREE_TYPE (arg), dconst0));
5367     return expand_expr (arg, target, VOIDmode, EXPAND_NORMAL);
5368   }
5369
5370   if (GET_MODE_SIZE (fmode) <= UNITS_PER_WORD)
5371     {
5372       imode = int_mode_for_mode (fmode);
5373       if (imode == BLKmode)
5374         return NULL_RTX;
5375       temp = gen_lowpart (imode, temp);
5376     }
5377   else
5378     {
5379       imode = word_mode;
5380       /* Handle targets with different FP word orders.  */
5381       if (FLOAT_WORDS_BIG_ENDIAN)
5382         word = (GET_MODE_BITSIZE (fmode) - bitpos) / BITS_PER_WORD;
5383       else
5384         word = bitpos / BITS_PER_WORD;
5385       temp = operand_subword_force (temp, word, fmode);
5386       bitpos = bitpos % BITS_PER_WORD;
5387     }
5388
5389   /* Force the intermediate word_mode (or narrower) result into a
5390      register.  This avoids attempting to create paradoxical SUBREGs
5391      of floating point modes below.  */
5392   temp = force_reg (imode, temp);
5393
5394   /* If the bitpos is within the "result mode" lowpart, the operation
5395      can be implement with a single bitwise AND.  Otherwise, we need
5396      a right shift and an AND.  */
5397
5398   if (bitpos < GET_MODE_BITSIZE (rmode))
5399     {
5400       double_int mask = double_int_setbit (double_int_zero, bitpos);
5401
5402       if (GET_MODE_SIZE (imode) > GET_MODE_SIZE (rmode))
5403         temp = gen_lowpart (rmode, temp);
5404       temp = expand_binop (rmode, and_optab, temp,
5405                            immed_double_int_const (mask, rmode),
5406                            NULL_RTX, 1, OPTAB_LIB_WIDEN);
5407     }
5408   else
5409     {
5410       /* Perform a logical right shift to place the signbit in the least
5411          significant bit, then truncate the result to the desired mode
5412          and mask just this bit.  */
5413       temp = expand_shift (RSHIFT_EXPR, imode, temp,
5414                            build_int_cst (NULL_TREE, bitpos), NULL_RTX, 1);
5415       temp = gen_lowpart (rmode, temp);
5416       temp = expand_binop (rmode, and_optab, temp, const1_rtx,
5417                            NULL_RTX, 1, OPTAB_LIB_WIDEN);
5418     }
5419
5420   return temp;
5421 }
5422
5423 /* Expand fork or exec calls.  TARGET is the desired target of the
5424    call.  EXP is the call. FN is the
5425    identificator of the actual function.  IGNORE is nonzero if the
5426    value is to be ignored.  */
5427
5428 static rtx
5429 expand_builtin_fork_or_exec (tree fn, tree exp, rtx target, int ignore)
5430 {
5431   tree id, decl;
5432   tree call;
5433
5434   /* If we are not profiling, just call the function.  */
5435   if (!profile_arc_flag)
5436     return NULL_RTX;
5437
5438   /* Otherwise call the wrapper.  This should be equivalent for the rest of
5439      compiler, so the code does not diverge, and the wrapper may run the
5440      code necessary for keeping the profiling sane.  */
5441
5442   switch (DECL_FUNCTION_CODE (fn))
5443     {
5444     case BUILT_IN_FORK:
5445       id = get_identifier ("__gcov_fork");
5446       break;
5447
5448     case BUILT_IN_EXECL:
5449       id = get_identifier ("__gcov_execl");
5450       break;
5451
5452     case BUILT_IN_EXECV:
5453       id = get_identifier ("__gcov_execv");
5454       break;
5455
5456     case BUILT_IN_EXECLP:
5457       id = get_identifier ("__gcov_execlp");
5458       break;
5459
5460     case BUILT_IN_EXECLE:
5461       id = get_identifier ("__gcov_execle");
5462       break;
5463
5464     case BUILT_IN_EXECVP:
5465       id = get_identifier ("__gcov_execvp");
5466       break;
5467
5468     case BUILT_IN_EXECVE:
5469       id = get_identifier ("__gcov_execve");
5470       break;
5471
5472     default:
5473       gcc_unreachable ();
5474     }
5475
5476   decl = build_decl (DECL_SOURCE_LOCATION (fn),
5477                      FUNCTION_DECL, id, TREE_TYPE (fn));
5478   DECL_EXTERNAL (decl) = 1;
5479   TREE_PUBLIC (decl) = 1;
5480   DECL_ARTIFICIAL (decl) = 1;
5481   TREE_NOTHROW (decl) = 1;
5482   DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
5483   DECL_VISIBILITY_SPECIFIED (decl) = 1;
5484   call = rewrite_call_expr (EXPR_LOCATION (exp), exp, 0, decl, 0);
5485   return expand_call (call, target, ignore);
5486  }
5487
5488
5489 \f
5490 /* Reconstitute a mode for a __sync intrinsic operation.  Since the type of
5491    the pointer in these functions is void*, the tree optimizers may remove
5492    casts.  The mode computed in expand_builtin isn't reliable either, due
5493    to __sync_bool_compare_and_swap.
5494
5495    FCODE_DIFF should be fcode - base, where base is the FOO_1 code for the
5496    group of builtins.  This gives us log2 of the mode size.  */
5497
5498 static inline enum machine_mode
5499 get_builtin_sync_mode (int fcode_diff)
5500 {
5501   /* The size is not negotiable, so ask not to get BLKmode in return
5502      if the target indicates that a smaller size would be better.  */
5503   return mode_for_size (BITS_PER_UNIT << fcode_diff, MODE_INT, 0);
5504 }
5505
5506 /* Expand the memory expression LOC and return the appropriate memory operand
5507    for the builtin_sync operations.  */
5508
5509 static rtx
5510 get_builtin_sync_mem (tree loc, enum machine_mode mode)
5511 {
5512   rtx addr, mem;
5513
5514   addr = expand_expr (loc, NULL_RTX, ptr_mode, EXPAND_SUM);
5515   addr = convert_memory_address (Pmode, addr);
5516
5517   /* Note that we explicitly do not want any alias information for this
5518      memory, so that we kill all other live memories.  Otherwise we don't
5519      satisfy the full barrier semantics of the intrinsic.  */
5520   mem = validize_mem (gen_rtx_MEM (mode, addr));
5521
5522   /* The alignment needs to be at least according to that of the mode.  */
5523   set_mem_align (mem, MAX (GET_MODE_ALIGNMENT (mode),
5524                            get_pointer_alignment (loc, BIGGEST_ALIGNMENT)));
5525   set_mem_alias_set (mem, ALIAS_SET_MEMORY_BARRIER);
5526   MEM_VOLATILE_P (mem) = 1;
5527
5528   return mem;
5529 }
5530
5531 /* Expand the __sync_xxx_and_fetch and __sync_fetch_and_xxx intrinsics.
5532    EXP is the CALL_EXPR.  CODE is the rtx code
5533    that corresponds to the arithmetic or logical operation from the name;
5534    an exception here is that NOT actually means NAND.  TARGET is an optional
5535    place for us to store the results; AFTER is true if this is the
5536    fetch_and_xxx form.  IGNORE is true if we don't actually care about
5537    the result of the operation at all.  */
5538
5539 static rtx
5540 expand_builtin_sync_operation (enum machine_mode mode, tree exp,
5541                                enum rtx_code code, bool after,
5542                                rtx target, bool ignore)
5543 {
5544   rtx val, mem;
5545   enum machine_mode old_mode;
5546   location_t loc = EXPR_LOCATION (exp);
5547
5548   if (code == NOT && warn_sync_nand)
5549     {
5550       tree fndecl = get_callee_fndecl (exp);
5551       enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
5552
5553       static bool warned_f_a_n, warned_n_a_f;
5554
5555       switch (fcode)
5556         {
5557         case BUILT_IN_FETCH_AND_NAND_1:
5558         case BUILT_IN_FETCH_AND_NAND_2:
5559         case BUILT_IN_FETCH_AND_NAND_4:
5560         case BUILT_IN_FETCH_AND_NAND_8:
5561         case BUILT_IN_FETCH_AND_NAND_16:
5562
5563           if (warned_f_a_n)
5564             break;
5565
5566           fndecl = implicit_built_in_decls[BUILT_IN_FETCH_AND_NAND_N];
5567           inform (loc, "%qD changed semantics in GCC 4.4", fndecl);
5568           warned_f_a_n = true;
5569           break;
5570
5571         case BUILT_IN_NAND_AND_FETCH_1:
5572         case BUILT_IN_NAND_AND_FETCH_2:
5573         case BUILT_IN_NAND_AND_FETCH_4:
5574         case BUILT_IN_NAND_AND_FETCH_8:
5575         case BUILT_IN_NAND_AND_FETCH_16:
5576
5577           if (warned_n_a_f)
5578             break;
5579
5580           fndecl = implicit_built_in_decls[BUILT_IN_NAND_AND_FETCH_N];
5581           inform (loc, "%qD changed semantics in GCC 4.4", fndecl);
5582           warned_n_a_f = true;
5583           break;
5584
5585         default:
5586           gcc_unreachable ();
5587         }
5588     }
5589
5590   /* Expand the operands.  */
5591   mem = get_builtin_sync_mem (CALL_EXPR_ARG (exp, 0), mode);
5592
5593   val = expand_expr (CALL_EXPR_ARG (exp, 1), NULL_RTX, mode, EXPAND_NORMAL);
5594   /* If VAL is promoted to a wider mode, convert it back to MODE.  Take care
5595      of CONST_INTs, where we know the old_mode only from the call argument.  */
5596   old_mode = GET_MODE (val);
5597   if (old_mode == VOIDmode)
5598     old_mode = TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 1)));
5599   val = convert_modes (mode, old_mode, val, 1);
5600
5601   if (ignore)
5602     return expand_sync_operation (mem, val, code);
5603   else
5604     return expand_sync_fetch_operation (mem, val, code, after, target);
5605 }
5606
5607 /* Expand the __sync_val_compare_and_swap and __sync_bool_compare_and_swap
5608    intrinsics. EXP is the CALL_EXPR.  IS_BOOL is
5609    true if this is the boolean form.  TARGET is a place for us to store the
5610    results; this is NOT optional if IS_BOOL is true.  */
5611
5612 static rtx
5613 expand_builtin_compare_and_swap (enum machine_mode mode, tree exp,
5614                                  bool is_bool, rtx target)
5615 {
5616   rtx old_val, new_val, mem;
5617   enum machine_mode old_mode;
5618
5619   /* Expand the operands.  */
5620   mem = get_builtin_sync_mem (CALL_EXPR_ARG (exp, 0), mode);
5621
5622
5623   old_val = expand_expr (CALL_EXPR_ARG (exp, 1), NULL_RTX,
5624                          mode, EXPAND_NORMAL);
5625   /* If VAL is promoted to a wider mode, convert it back to MODE.  Take care
5626      of CONST_INTs, where we know the old_mode only from the call argument.  */
5627   old_mode = GET_MODE (old_val);
5628   if (old_mode == VOIDmode)
5629     old_mode = TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 1)));
5630   old_val = convert_modes (mode, old_mode, old_val, 1);
5631
5632   new_val = expand_expr (CALL_EXPR_ARG (exp, 2), NULL_RTX,
5633                          mode, EXPAND_NORMAL);
5634   /* If VAL is promoted to a wider mode, convert it back to MODE.  Take care
5635      of CONST_INTs, where we know the old_mode only from the call argument.  */
5636   old_mode = GET_MODE (new_val);
5637   if (old_mode == VOIDmode)
5638     old_mode = TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 2)));
5639   new_val = convert_modes (mode, old_mode, new_val, 1);
5640
5641   if (is_bool)
5642     return expand_bool_compare_and_swap (mem, old_val, new_val, target);
5643   else
5644     return expand_val_compare_and_swap (mem, old_val, new_val, target);
5645 }
5646
5647 /* Expand the __sync_lock_test_and_set intrinsic.  Note that the most
5648    general form is actually an atomic exchange, and some targets only
5649    support a reduced form with the second argument being a constant 1.
5650    EXP is the CALL_EXPR; TARGET is an optional place for us to store
5651    the results.  */
5652
5653 static rtx
5654 expand_builtin_lock_test_and_set (enum machine_mode mode, tree exp,
5655                                   rtx target)
5656 {
5657   rtx val, mem;
5658   enum machine_mode old_mode;
5659
5660   /* Expand the operands.  */
5661   mem = get_builtin_sync_mem (CALL_EXPR_ARG (exp, 0), mode);
5662   val = expand_expr (CALL_EXPR_ARG (exp, 1), NULL_RTX, mode, EXPAND_NORMAL);
5663   /* If VAL is promoted to a wider mode, convert it back to MODE.  Take care
5664      of CONST_INTs, where we know the old_mode only from the call argument.  */
5665   old_mode = GET_MODE (val);
5666   if (old_mode == VOIDmode)
5667     old_mode = TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 1)));
5668   val = convert_modes (mode, old_mode, val, 1);
5669
5670   return expand_sync_lock_test_and_set (mem, val, target);
5671 }
5672
5673 /* Expand the __sync_synchronize intrinsic.  */
5674
5675 static void
5676 expand_builtin_synchronize (void)
5677 {
5678   gimple x;
5679   VEC (tree, gc) *v_clobbers;
5680
5681 #ifdef HAVE_memory_barrier
5682   if (HAVE_memory_barrier)
5683     {
5684       emit_insn (gen_memory_barrier ());
5685       return;
5686     }
5687 #endif
5688
5689   if (synchronize_libfunc != NULL_RTX)
5690     {
5691       emit_library_call (synchronize_libfunc, LCT_NORMAL, VOIDmode, 0);
5692       return;
5693     }
5694
5695   /* If no explicit memory barrier instruction is available, create an
5696      empty asm stmt with a memory clobber.  */
5697   v_clobbers = VEC_alloc (tree, gc, 1);
5698   VEC_quick_push (tree, v_clobbers,
5699                   tree_cons (NULL, build_string (6, "memory"), NULL));
5700   x = gimple_build_asm_vec ("", NULL, NULL, v_clobbers, NULL);
5701   gimple_asm_set_volatile (x, true);
5702   expand_asm_stmt (x);
5703 }
5704
5705 /* Expand the __sync_lock_release intrinsic.  EXP is the CALL_EXPR.  */
5706
5707 static void
5708 expand_builtin_lock_release (enum machine_mode mode, tree exp)
5709 {
5710   struct expand_operand ops[2];
5711   enum insn_code icode;
5712   rtx mem;
5713
5714   /* Expand the operands.  */
5715   mem = get_builtin_sync_mem (CALL_EXPR_ARG (exp, 0), mode);
5716
5717   /* If there is an explicit operation in the md file, use it.  */
5718   icode = direct_optab_handler (sync_lock_release_optab, mode);
5719   if (icode != CODE_FOR_nothing)
5720     {
5721       create_fixed_operand (&ops[0], mem);
5722       create_input_operand (&ops[1], const0_rtx, mode);
5723       if (maybe_expand_insn (icode, 2, ops))
5724         return;
5725     }
5726
5727   /* Otherwise we can implement this operation by emitting a barrier
5728      followed by a store of zero.  */
5729   expand_builtin_synchronize ();
5730   emit_move_insn (mem, const0_rtx);
5731 }
5732 \f
5733 /* Expand an expression EXP that calls a built-in function,
5734    with result going to TARGET if that's convenient
5735    (and in mode MODE if that's convenient).
5736    SUBTARGET may be used as the target for computing one of EXP's operands.
5737    IGNORE is nonzero if the value is to be ignored.  */
5738
5739 rtx
5740 expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode,
5741                 int ignore)
5742 {
5743   tree fndecl = get_callee_fndecl (exp);
5744   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
5745   enum machine_mode target_mode = TYPE_MODE (TREE_TYPE (exp));
5746   int flags;
5747
5748   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
5749     return targetm.expand_builtin (exp, target, subtarget, mode, ignore);
5750
5751   /* When not optimizing, generate calls to library functions for a certain
5752      set of builtins.  */
5753   if (!optimize
5754       && !called_as_built_in (fndecl)
5755       && DECL_ASSEMBLER_NAME_SET_P (fndecl)
5756       && fcode != BUILT_IN_ALLOCA
5757       && fcode != BUILT_IN_FREE)
5758     return expand_call (exp, target, ignore);
5759
5760   /* The built-in function expanders test for target == const0_rtx
5761      to determine whether the function's result will be ignored.  */
5762   if (ignore)
5763     target = const0_rtx;
5764
5765   /* If the result of a pure or const built-in function is ignored, and
5766      none of its arguments are volatile, we can avoid expanding the
5767      built-in call and just evaluate the arguments for side-effects.  */
5768   if (target == const0_rtx
5769       && ((flags = flags_from_decl_or_type (fndecl)) & (ECF_CONST | ECF_PURE))
5770       && !(flags & ECF_LOOPING_CONST_OR_PURE))
5771     {
5772       bool volatilep = false;
5773       tree arg;
5774       call_expr_arg_iterator iter;
5775
5776       FOR_EACH_CALL_EXPR_ARG (arg, iter, exp)
5777         if (TREE_THIS_VOLATILE (arg))
5778           {
5779             volatilep = true;
5780             break;
5781           }
5782
5783       if (! volatilep)
5784         {
5785           FOR_EACH_CALL_EXPR_ARG (arg, iter, exp)
5786             expand_expr (arg, const0_rtx, VOIDmode, EXPAND_NORMAL);
5787           return const0_rtx;
5788         }
5789     }
5790
5791   switch (fcode)
5792     {
5793     CASE_FLT_FN (BUILT_IN_FABS):
5794       target = expand_builtin_fabs (exp, target, subtarget);
5795       if (target)
5796         return target;
5797       break;
5798
5799     CASE_FLT_FN (BUILT_IN_COPYSIGN):
5800       target = expand_builtin_copysign (exp, target, subtarget);
5801       if (target)
5802         return target;
5803       break;
5804
5805       /* Just do a normal library call if we were unable to fold
5806          the values.  */
5807     CASE_FLT_FN (BUILT_IN_CABS):
5808       break;
5809
5810     CASE_FLT_FN (BUILT_IN_EXP):
5811     CASE_FLT_FN (BUILT_IN_EXP10):
5812     CASE_FLT_FN (BUILT_IN_POW10):
5813     CASE_FLT_FN (BUILT_IN_EXP2):
5814     CASE_FLT_FN (BUILT_IN_EXPM1):
5815     CASE_FLT_FN (BUILT_IN_LOGB):
5816     CASE_FLT_FN (BUILT_IN_LOG):
5817     CASE_FLT_FN (BUILT_IN_LOG10):
5818     CASE_FLT_FN (BUILT_IN_LOG2):
5819     CASE_FLT_FN (BUILT_IN_LOG1P):
5820     CASE_FLT_FN (BUILT_IN_TAN):
5821     CASE_FLT_FN (BUILT_IN_ASIN):
5822     CASE_FLT_FN (BUILT_IN_ACOS):
5823     CASE_FLT_FN (BUILT_IN_ATAN):
5824     CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
5825       /* Treat these like sqrt only if unsafe math optimizations are allowed,
5826          because of possible accuracy problems.  */
5827       if (! flag_unsafe_math_optimizations)
5828         break;
5829     CASE_FLT_FN (BUILT_IN_SQRT):
5830     CASE_FLT_FN (BUILT_IN_FLOOR):
5831     CASE_FLT_FN (BUILT_IN_CEIL):
5832     CASE_FLT_FN (BUILT_IN_TRUNC):
5833     CASE_FLT_FN (BUILT_IN_ROUND):
5834     CASE_FLT_FN (BUILT_IN_NEARBYINT):
5835     CASE_FLT_FN (BUILT_IN_RINT):
5836       target = expand_builtin_mathfn (exp, target, subtarget);
5837       if (target)
5838         return target;
5839       break;
5840
5841     CASE_FLT_FN (BUILT_IN_FMA):
5842       target = expand_builtin_mathfn_ternary (exp, target, subtarget);
5843       if (target)
5844         return target;
5845       break;
5846
5847     CASE_FLT_FN (BUILT_IN_ILOGB):
5848       if (! flag_unsafe_math_optimizations)
5849         break;
5850     CASE_FLT_FN (BUILT_IN_ISINF):
5851     CASE_FLT_FN (BUILT_IN_FINITE):
5852     case BUILT_IN_ISFINITE:
5853     case BUILT_IN_ISNORMAL:
5854       target = expand_builtin_interclass_mathfn (exp, target);
5855       if (target)
5856         return target;
5857       break;
5858
5859     CASE_FLT_FN (BUILT_IN_LCEIL):
5860     CASE_FLT_FN (BUILT_IN_LLCEIL):
5861     CASE_FLT_FN (BUILT_IN_LFLOOR):
5862     CASE_FLT_FN (BUILT_IN_LLFLOOR):
5863       target = expand_builtin_int_roundingfn (exp, target);
5864       if (target)
5865         return target;
5866       break;
5867
5868     CASE_FLT_FN (BUILT_IN_LRINT):
5869     CASE_FLT_FN (BUILT_IN_LLRINT):
5870     CASE_FLT_FN (BUILT_IN_LROUND):
5871     CASE_FLT_FN (BUILT_IN_LLROUND):
5872       target = expand_builtin_int_roundingfn_2 (exp, target);
5873       if (target)
5874         return target;
5875       break;
5876
5877     CASE_FLT_FN (BUILT_IN_POW):
5878       target = expand_builtin_pow (exp, target, subtarget);
5879       if (target)
5880         return target;
5881       break;
5882
5883     CASE_FLT_FN (BUILT_IN_POWI):
5884       target = expand_builtin_powi (exp, target);
5885       if (target)
5886         return target;
5887       break;
5888
5889     CASE_FLT_FN (BUILT_IN_ATAN2):
5890     CASE_FLT_FN (BUILT_IN_LDEXP):
5891     CASE_FLT_FN (BUILT_IN_SCALB):
5892     CASE_FLT_FN (BUILT_IN_SCALBN):
5893     CASE_FLT_FN (BUILT_IN_SCALBLN):
5894       if (! flag_unsafe_math_optimizations)
5895         break;
5896
5897     CASE_FLT_FN (BUILT_IN_FMOD):
5898     CASE_FLT_FN (BUILT_IN_REMAINDER):
5899     CASE_FLT_FN (BUILT_IN_DREM):
5900       target = expand_builtin_mathfn_2 (exp, target, subtarget);
5901       if (target)
5902         return target;
5903       break;
5904
5905     CASE_FLT_FN (BUILT_IN_CEXPI):
5906       target = expand_builtin_cexpi (exp, target);
5907       gcc_assert (target);
5908       return target;
5909
5910     CASE_FLT_FN (BUILT_IN_SIN):
5911     CASE_FLT_FN (BUILT_IN_COS):
5912       if (! flag_unsafe_math_optimizations)
5913         break;
5914       target = expand_builtin_mathfn_3 (exp, target, subtarget);
5915       if (target)
5916         return target;
5917       break;
5918
5919     CASE_FLT_FN (BUILT_IN_SINCOS):
5920       if (! flag_unsafe_math_optimizations)
5921         break;
5922       target = expand_builtin_sincos (exp);
5923       if (target)
5924         return target;
5925       break;
5926
5927     case BUILT_IN_APPLY_ARGS:
5928       return expand_builtin_apply_args ();
5929
5930       /* __builtin_apply (FUNCTION, ARGUMENTS, ARGSIZE) invokes
5931          FUNCTION with a copy of the parameters described by
5932          ARGUMENTS, and ARGSIZE.  It returns a block of memory
5933          allocated on the stack into which is stored all the registers
5934          that might possibly be used for returning the result of a
5935          function.  ARGUMENTS is the value returned by
5936          __builtin_apply_args.  ARGSIZE is the number of bytes of
5937          arguments that must be copied.  ??? How should this value be
5938          computed?  We'll also need a safe worst case value for varargs
5939          functions.  */
5940     case BUILT_IN_APPLY:
5941       if (!validate_arglist (exp, POINTER_TYPE,
5942                              POINTER_TYPE, INTEGER_TYPE, VOID_TYPE)
5943           && !validate_arglist (exp, REFERENCE_TYPE,
5944                                 POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
5945         return const0_rtx;
5946       else
5947         {
5948           rtx ops[3];
5949
5950           ops[0] = expand_normal (CALL_EXPR_ARG (exp, 0));
5951           ops[1] = expand_normal (CALL_EXPR_ARG (exp, 1));
5952           ops[2] = expand_normal (CALL_EXPR_ARG (exp, 2));
5953
5954           return expand_builtin_apply (ops[0], ops[1], ops[2]);
5955         }
5956
5957       /* __builtin_return (RESULT) causes the function to return the
5958          value described by RESULT.  RESULT is address of the block of
5959          memory returned by __builtin_apply.  */
5960     case BUILT_IN_RETURN:
5961       if (validate_arglist (exp, POINTER_TYPE, VOID_TYPE))
5962         expand_builtin_return (expand_normal (CALL_EXPR_ARG (exp, 0)));
5963       return const0_rtx;
5964
5965     case BUILT_IN_SAVEREGS:
5966       return expand_builtin_saveregs ();
5967
5968     case BUILT_IN_VA_ARG_PACK:
5969       /* All valid uses of __builtin_va_arg_pack () are removed during
5970          inlining.  */
5971       error ("%Kinvalid use of %<__builtin_va_arg_pack ()%>", exp);
5972       return const0_rtx;
5973
5974     case BUILT_IN_VA_ARG_PACK_LEN:
5975       /* All valid uses of __builtin_va_arg_pack_len () are removed during
5976          inlining.  */
5977       error ("%Kinvalid use of %<__builtin_va_arg_pack_len ()%>", exp);
5978       return const0_rtx;
5979
5980       /* Return the address of the first anonymous stack arg.  */
5981     case BUILT_IN_NEXT_ARG:
5982       if (fold_builtin_next_arg (exp, false))
5983         return const0_rtx;
5984       return expand_builtin_next_arg ();
5985
5986     case BUILT_IN_CLEAR_CACHE:
5987       target = expand_builtin___clear_cache (exp);
5988       if (target)
5989         return target;
5990       break;
5991
5992     case BUILT_IN_CLASSIFY_TYPE:
5993       return expand_builtin_classify_type (exp);
5994
5995     case BUILT_IN_CONSTANT_P:
5996       return const0_rtx;
5997
5998     case BUILT_IN_FRAME_ADDRESS:
5999     case BUILT_IN_RETURN_ADDRESS:
6000       return expand_builtin_frame_address (fndecl, exp);
6001
6002     /* Returns the address of the area where the structure is returned.
6003        0 otherwise.  */
6004     case BUILT_IN_AGGREGATE_INCOMING_ADDRESS:
6005       if (call_expr_nargs (exp) != 0
6006           || ! AGGREGATE_TYPE_P (TREE_TYPE (TREE_TYPE (current_function_decl)))
6007           || !MEM_P (DECL_RTL (DECL_RESULT (current_function_decl))))
6008         return const0_rtx;
6009       else
6010         return XEXP (DECL_RTL (DECL_RESULT (current_function_decl)), 0);
6011
6012     case BUILT_IN_ALLOCA:
6013       /* If the allocation stems from the declaration of a variable-sized
6014          object, it cannot accumulate.  */
6015       target = expand_builtin_alloca (exp, ALLOCA_FOR_VAR_P (exp));
6016       if (target)
6017         return target;
6018       break;
6019
6020     case BUILT_IN_STACK_SAVE:
6021       return expand_stack_save ();
6022
6023     case BUILT_IN_STACK_RESTORE:
6024       expand_stack_restore (CALL_EXPR_ARG (exp, 0));
6025       return const0_rtx;
6026
6027     case BUILT_IN_BSWAP32:
6028     case BUILT_IN_BSWAP64:
6029       target = expand_builtin_bswap (exp, target, subtarget);
6030
6031       if (target)
6032         return target;
6033       break;
6034
6035     CASE_INT_FN (BUILT_IN_FFS):
6036     case BUILT_IN_FFSIMAX:
6037       target = expand_builtin_unop (target_mode, exp, target,
6038                                     subtarget, ffs_optab);
6039       if (target)
6040         return target;
6041       break;
6042
6043     CASE_INT_FN (BUILT_IN_CLZ):
6044     case BUILT_IN_CLZIMAX:
6045       target = expand_builtin_unop (target_mode, exp, target,
6046                                     subtarget, clz_optab);
6047       if (target)
6048         return target;
6049       break;
6050
6051     CASE_INT_FN (BUILT_IN_CTZ):
6052     case BUILT_IN_CTZIMAX:
6053       target = expand_builtin_unop (target_mode, exp, target,
6054                                     subtarget, ctz_optab);
6055       if (target)
6056         return target;
6057       break;
6058
6059     CASE_INT_FN (BUILT_IN_POPCOUNT):
6060     case BUILT_IN_POPCOUNTIMAX:
6061       target = expand_builtin_unop (target_mode, exp, target,
6062                                     subtarget, popcount_optab);
6063       if (target)
6064         return target;
6065       break;
6066
6067     CASE_INT_FN (BUILT_IN_PARITY):
6068     case BUILT_IN_PARITYIMAX:
6069       target = expand_builtin_unop (target_mode, exp, target,
6070                                     subtarget, parity_optab);
6071       if (target)
6072         return target;
6073       break;
6074
6075     case BUILT_IN_STRLEN:
6076       target = expand_builtin_strlen (exp, target, target_mode);
6077       if (target)
6078         return target;
6079       break;
6080
6081     case BUILT_IN_STRCPY:
6082       target = expand_builtin_strcpy (exp, target);
6083       if (target)
6084         return target;
6085       break;
6086
6087     case BUILT_IN_STRNCPY:
6088       target = expand_builtin_strncpy (exp, target);
6089       if (target)
6090         return target;
6091       break;
6092
6093     case BUILT_IN_STPCPY:
6094       target = expand_builtin_stpcpy (exp, target, mode);
6095       if (target)
6096         return target;
6097       break;
6098
6099     case BUILT_IN_MEMCPY:
6100       target = expand_builtin_memcpy (exp, target);
6101       if (target)
6102         return target;
6103       break;
6104
6105     case BUILT_IN_MEMPCPY:
6106       target = expand_builtin_mempcpy (exp, target, mode);
6107       if (target)
6108         return target;
6109       break;
6110
6111     case BUILT_IN_MEMSET:
6112       target = expand_builtin_memset (exp, target, mode);
6113       if (target)
6114         return target;
6115       break;
6116
6117     case BUILT_IN_BZERO:
6118       target = expand_builtin_bzero (exp);
6119       if (target)
6120         return target;
6121       break;
6122
6123     case BUILT_IN_STRCMP:
6124       target = expand_builtin_strcmp (exp, target);
6125       if (target)
6126         return target;
6127       break;
6128
6129     case BUILT_IN_STRNCMP:
6130       target = expand_builtin_strncmp (exp, target, mode);
6131       if (target)
6132         return target;
6133       break;
6134
6135     case BUILT_IN_BCMP:
6136     case BUILT_IN_MEMCMP:
6137       target = expand_builtin_memcmp (exp, target, mode);
6138       if (target)
6139         return target;
6140       break;
6141
6142     case BUILT_IN_SETJMP:
6143       /* This should have been lowered to the builtins below.  */
6144       gcc_unreachable ();
6145
6146     case BUILT_IN_SETJMP_SETUP:
6147       /* __builtin_setjmp_setup is passed a pointer to an array of five words
6148           and the receiver label.  */
6149       if (validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
6150         {
6151           rtx buf_addr = expand_expr (CALL_EXPR_ARG (exp, 0), subtarget,
6152                                       VOIDmode, EXPAND_NORMAL);
6153           tree label = TREE_OPERAND (CALL_EXPR_ARG (exp, 1), 0);
6154           rtx label_r = label_rtx (label);
6155
6156           /* This is copied from the handling of non-local gotos.  */
6157           expand_builtin_setjmp_setup (buf_addr, label_r);
6158           nonlocal_goto_handler_labels
6159             = gen_rtx_EXPR_LIST (VOIDmode, label_r,
6160                                  nonlocal_goto_handler_labels);
6161           /* ??? Do not let expand_label treat us as such since we would
6162              not want to be both on the list of non-local labels and on
6163              the list of forced labels.  */
6164           FORCED_LABEL (label) = 0;
6165           return const0_rtx;
6166         }
6167       break;
6168
6169     case BUILT_IN_SETJMP_DISPATCHER:
6170        /* __builtin_setjmp_dispatcher is passed the dispatcher label.  */
6171       if (validate_arglist (exp, POINTER_TYPE, VOID_TYPE))
6172         {
6173           tree label = TREE_OPERAND (CALL_EXPR_ARG (exp, 0), 0);
6174           rtx label_r = label_rtx (label);
6175
6176           /* Remove the dispatcher label from the list of non-local labels
6177              since the receiver labels have been added to it above.  */
6178           remove_node_from_expr_list (label_r, &nonlocal_goto_handler_labels);
6179           return const0_rtx;
6180         }
6181       break;
6182
6183     case BUILT_IN_SETJMP_RECEIVER:
6184        /* __builtin_setjmp_receiver is passed the receiver label.  */
6185       if (validate_arglist (exp, POINTER_TYPE, VOID_TYPE))
6186         {
6187           tree label = TREE_OPERAND (CALL_EXPR_ARG (exp, 0), 0);
6188           rtx label_r = label_rtx (label);
6189
6190           expand_builtin_setjmp_receiver (label_r);
6191           return const0_rtx;
6192         }
6193       break;
6194
6195       /* __builtin_longjmp is passed a pointer to an array of five words.
6196          It's similar to the C library longjmp function but works with
6197          __builtin_setjmp above.  */
6198     case BUILT_IN_LONGJMP:
6199       if (validate_arglist (exp, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
6200         {
6201           rtx buf_addr = expand_expr (CALL_EXPR_ARG (exp, 0), subtarget,
6202                                       VOIDmode, EXPAND_NORMAL);
6203           rtx value = expand_normal (CALL_EXPR_ARG (exp, 1));
6204
6205           if (value != const1_rtx)
6206             {
6207               error ("%<__builtin_longjmp%> second argument must be 1");
6208               return const0_rtx;
6209             }
6210
6211           expand_builtin_longjmp (buf_addr, value);
6212           return const0_rtx;
6213         }
6214       break;
6215
6216     case BUILT_IN_NONLOCAL_GOTO:
6217       target = expand_builtin_nonlocal_goto (exp);
6218       if (target)
6219         return target;
6220       break;
6221
6222       /* This updates the setjmp buffer that is its argument with the value
6223          of the current stack pointer.  */
6224     case BUILT_IN_UPDATE_SETJMP_BUF:
6225       if (validate_arglist (exp, POINTER_TYPE, VOID_TYPE))
6226         {
6227           rtx buf_addr
6228             = expand_normal (CALL_EXPR_ARG (exp, 0));
6229
6230           expand_builtin_update_setjmp_buf (buf_addr);
6231           return const0_rtx;
6232         }
6233       break;
6234
6235     case BUILT_IN_TRAP:
6236       expand_builtin_trap ();
6237       return const0_rtx;
6238
6239     case BUILT_IN_UNREACHABLE:
6240       expand_builtin_unreachable ();
6241       return const0_rtx;
6242
6243     CASE_FLT_FN (BUILT_IN_SIGNBIT):
6244     case BUILT_IN_SIGNBITD32:
6245     case BUILT_IN_SIGNBITD64:
6246     case BUILT_IN_SIGNBITD128:
6247       target = expand_builtin_signbit (exp, target);
6248       if (target)
6249         return target;
6250       break;
6251
6252       /* Various hooks for the DWARF 2 __throw routine.  */
6253     case BUILT_IN_UNWIND_INIT:
6254       expand_builtin_unwind_init ();
6255       return const0_rtx;
6256     case BUILT_IN_DWARF_CFA:
6257       return virtual_cfa_rtx;
6258 #ifdef DWARF2_UNWIND_INFO
6259     case BUILT_IN_DWARF_SP_COLUMN:
6260       return expand_builtin_dwarf_sp_column ();
6261     case BUILT_IN_INIT_DWARF_REG_SIZES:
6262       expand_builtin_init_dwarf_reg_sizes (CALL_EXPR_ARG (exp, 0));
6263       return const0_rtx;
6264 #endif
6265     case BUILT_IN_FROB_RETURN_ADDR:
6266       return expand_builtin_frob_return_addr (CALL_EXPR_ARG (exp, 0));
6267     case BUILT_IN_EXTRACT_RETURN_ADDR:
6268       return expand_builtin_extract_return_addr (CALL_EXPR_ARG (exp, 0));
6269     case BUILT_IN_EH_RETURN:
6270       expand_builtin_eh_return (CALL_EXPR_ARG (exp, 0),
6271                                 CALL_EXPR_ARG (exp, 1));
6272       return const0_rtx;
6273 #ifdef EH_RETURN_DATA_REGNO
6274     case BUILT_IN_EH_RETURN_DATA_REGNO:
6275       return expand_builtin_eh_return_data_regno (exp);
6276 #endif
6277     case BUILT_IN_EXTEND_POINTER:
6278       return expand_builtin_extend_pointer (CALL_EXPR_ARG (exp, 0));
6279     case BUILT_IN_EH_POINTER:
6280       return expand_builtin_eh_pointer (exp);
6281     case BUILT_IN_EH_FILTER:
6282       return expand_builtin_eh_filter (exp);
6283     case BUILT_IN_EH_COPY_VALUES:
6284       return expand_builtin_eh_copy_values (exp);
6285
6286     case BUILT_IN_VA_START:
6287       return expand_builtin_va_start (exp);
6288     case BUILT_IN_VA_END:
6289       return expand_builtin_va_end (exp);
6290     case BUILT_IN_VA_COPY:
6291       return expand_builtin_va_copy (exp);
6292     case BUILT_IN_EXPECT:
6293       return expand_builtin_expect (exp, target);
6294     case BUILT_IN_PREFETCH:
6295       expand_builtin_prefetch (exp);
6296       return const0_rtx;
6297
6298     case BUILT_IN_INIT_TRAMPOLINE:
6299       return expand_builtin_init_trampoline (exp);
6300     case BUILT_IN_ADJUST_TRAMPOLINE:
6301       return expand_builtin_adjust_trampoline (exp);
6302
6303     case BUILT_IN_FORK:
6304     case BUILT_IN_EXECL:
6305     case BUILT_IN_EXECV:
6306     case BUILT_IN_EXECLP:
6307     case BUILT_IN_EXECLE:
6308     case BUILT_IN_EXECVP:
6309     case BUILT_IN_EXECVE:
6310       target = expand_builtin_fork_or_exec (fndecl, exp, target, ignore);
6311       if (target)
6312         return target;
6313       break;
6314
6315     case BUILT_IN_FETCH_AND_ADD_1:
6316     case BUILT_IN_FETCH_AND_ADD_2:
6317     case BUILT_IN_FETCH_AND_ADD_4:
6318     case BUILT_IN_FETCH_AND_ADD_8:
6319     case BUILT_IN_FETCH_AND_ADD_16:
6320       mode = get_builtin_sync_mode (fcode - BUILT_IN_FETCH_AND_ADD_1);
6321       target = expand_builtin_sync_operation (mode, exp, PLUS,
6322                                               false, target, ignore);
6323       if (target)
6324         return target;
6325       break;
6326
6327     case BUILT_IN_FETCH_AND_SUB_1:
6328     case BUILT_IN_FETCH_AND_SUB_2:
6329     case BUILT_IN_FETCH_AND_SUB_4:
6330     case BUILT_IN_FETCH_AND_SUB_8:
6331     case BUILT_IN_FETCH_AND_SUB_16:
6332       mode = get_builtin_sync_mode (fcode - BUILT_IN_FETCH_AND_SUB_1);
6333       target = expand_builtin_sync_operation (mode, exp, MINUS,
6334                                               false, target, ignore);
6335       if (target)
6336         return target;
6337       break;
6338
6339     case BUILT_IN_FETCH_AND_OR_1:
6340     case BUILT_IN_FETCH_AND_OR_2:
6341     case BUILT_IN_FETCH_AND_OR_4:
6342     case BUILT_IN_FETCH_AND_OR_8:
6343     case BUILT_IN_FETCH_AND_OR_16:
6344       mode = get_builtin_sync_mode (fcode - BUILT_IN_FETCH_AND_OR_1);
6345       target = expand_builtin_sync_operation (mode, exp, IOR,
6346                                               false, target, ignore);
6347       if (target)
6348         return target;
6349       break;
6350
6351     case BUILT_IN_FETCH_AND_AND_1:
6352     case BUILT_IN_FETCH_AND_AND_2:
6353     case BUILT_IN_FETCH_AND_AND_4:
6354     case BUILT_IN_FETCH_AND_AND_8:
6355     case BUILT_IN_FETCH_AND_AND_16:
6356       mode = get_builtin_sync_mode (fcode - BUILT_IN_FETCH_AND_AND_1);
6357       target = expand_builtin_sync_operation (mode, exp, AND,
6358                                               false, target, ignore);
6359       if (target)
6360         return target;
6361       break;
6362
6363     case BUILT_IN_FETCH_AND_XOR_1:
6364     case BUILT_IN_FETCH_AND_XOR_2:
6365     case BUILT_IN_FETCH_AND_XOR_4:
6366     case BUILT_IN_FETCH_AND_XOR_8:
6367     case BUILT_IN_FETCH_AND_XOR_16:
6368       mode = get_builtin_sync_mode (fcode - BUILT_IN_FETCH_AND_XOR_1);
6369       target = expand_builtin_sync_operation (mode, exp, XOR,
6370                                               false, target, ignore);
6371       if (target)
6372         return target;
6373       break;
6374
6375     case BUILT_IN_FETCH_AND_NAND_1:
6376     case BUILT_IN_FETCH_AND_NAND_2:
6377     case BUILT_IN_FETCH_AND_NAND_4:
6378     case BUILT_IN_FETCH_AND_NAND_8:
6379     case BUILT_IN_FETCH_AND_NAND_16:
6380       mode = get_builtin_sync_mode (fcode - BUILT_IN_FETCH_AND_NAND_1);
6381       target = expand_builtin_sync_operation (mode, exp, NOT,
6382                                               false, target, ignore);
6383       if (target)
6384         return target;
6385       break;
6386
6387     case BUILT_IN_ADD_AND_FETCH_1:
6388     case BUILT_IN_ADD_AND_FETCH_2:
6389     case BUILT_IN_ADD_AND_FETCH_4:
6390     case BUILT_IN_ADD_AND_FETCH_8:
6391     case BUILT_IN_ADD_AND_FETCH_16:
6392       mode = get_builtin_sync_mode (fcode - BUILT_IN_ADD_AND_FETCH_1);
6393       target = expand_builtin_sync_operation (mode, exp, PLUS,
6394                                               true, target, ignore);
6395       if (target)
6396         return target;
6397       break;
6398
6399     case BUILT_IN_SUB_AND_FETCH_1:
6400     case BUILT_IN_SUB_AND_FETCH_2:
6401     case BUILT_IN_SUB_AND_FETCH_4:
6402     case BUILT_IN_SUB_AND_FETCH_8:
6403     case BUILT_IN_SUB_AND_FETCH_16:
6404       mode = get_builtin_sync_mode (fcode - BUILT_IN_SUB_AND_FETCH_1);
6405       target = expand_builtin_sync_operation (mode, exp, MINUS,
6406                                               true, target, ignore);
6407       if (target)
6408         return target;
6409       break;
6410
6411     case BUILT_IN_OR_AND_FETCH_1:
6412     case BUILT_IN_OR_AND_FETCH_2:
6413     case BUILT_IN_OR_AND_FETCH_4:
6414     case BUILT_IN_OR_AND_FETCH_8:
6415     case BUILT_IN_OR_AND_FETCH_16:
6416       mode = get_builtin_sync_mode (fcode - BUILT_IN_OR_AND_FETCH_1);
6417       target = expand_builtin_sync_operation (mode, exp, IOR,
6418                                               true, target, ignore);
6419       if (target)
6420         return target;
6421       break;
6422
6423     case BUILT_IN_AND_AND_FETCH_1:
6424     case BUILT_IN_AND_AND_FETCH_2:
6425     case BUILT_IN_AND_AND_FETCH_4:
6426     case BUILT_IN_AND_AND_FETCH_8:
6427     case BUILT_IN_AND_AND_FETCH_16:
6428       mode = get_builtin_sync_mode (fcode - BUILT_IN_AND_AND_FETCH_1);
6429       target = expand_builtin_sync_operation (mode, exp, AND,
6430                                               true, target, ignore);
6431       if (target)
6432         return target;
6433       break;
6434
6435     case BUILT_IN_XOR_AND_FETCH_1:
6436     case BUILT_IN_XOR_AND_FETCH_2:
6437     case BUILT_IN_XOR_AND_FETCH_4:
6438     case BUILT_IN_XOR_AND_FETCH_8:
6439     case BUILT_IN_XOR_AND_FETCH_16:
6440       mode = get_builtin_sync_mode (fcode - BUILT_IN_XOR_AND_FETCH_1);
6441       target = expand_builtin_sync_operation (mode, exp, XOR,
6442                                               true, target, ignore);
6443       if (target)
6444         return target;
6445       break;
6446
6447     case BUILT_IN_NAND_AND_FETCH_1:
6448     case BUILT_IN_NAND_AND_FETCH_2:
6449     case BUILT_IN_NAND_AND_FETCH_4:
6450     case BUILT_IN_NAND_AND_FETCH_8:
6451     case BUILT_IN_NAND_AND_FETCH_16:
6452       mode = get_builtin_sync_mode (fcode - BUILT_IN_NAND_AND_FETCH_1);
6453       target = expand_builtin_sync_operation (mode, exp, NOT,
6454                                               true, target, ignore);
6455       if (target)
6456         return target;
6457       break;
6458
6459     case BUILT_IN_BOOL_COMPARE_AND_SWAP_1:
6460     case BUILT_IN_BOOL_COMPARE_AND_SWAP_2:
6461     case BUILT_IN_BOOL_COMPARE_AND_SWAP_4:
6462     case BUILT_IN_BOOL_COMPARE_AND_SWAP_8:
6463     case BUILT_IN_BOOL_COMPARE_AND_SWAP_16:
6464       if (mode == VOIDmode)
6465         mode = TYPE_MODE (boolean_type_node);
6466       if (!target || !register_operand (target, mode))
6467         target = gen_reg_rtx (mode);
6468
6469       mode = get_builtin_sync_mode (fcode - BUILT_IN_BOOL_COMPARE_AND_SWAP_1);
6470       target = expand_builtin_compare_and_swap (mode, exp, true, target);
6471       if (target)
6472         return target;
6473       break;
6474
6475     case BUILT_IN_VAL_COMPARE_AND_SWAP_1:
6476     case BUILT_IN_VAL_COMPARE_AND_SWAP_2:
6477     case BUILT_IN_VAL_COMPARE_AND_SWAP_4:
6478     case BUILT_IN_VAL_COMPARE_AND_SWAP_8:
6479     case BUILT_IN_VAL_COMPARE_AND_SWAP_16:
6480       mode = get_builtin_sync_mode (fcode - BUILT_IN_VAL_COMPARE_AND_SWAP_1);
6481       target = expand_builtin_compare_and_swap (mode, exp, false, target);
6482       if (target)
6483         return target;
6484       break;
6485
6486     case BUILT_IN_LOCK_TEST_AND_SET_1:
6487     case BUILT_IN_LOCK_TEST_AND_SET_2:
6488     case BUILT_IN_LOCK_TEST_AND_SET_4:
6489     case BUILT_IN_LOCK_TEST_AND_SET_8:
6490     case BUILT_IN_LOCK_TEST_AND_SET_16:
6491       mode = get_builtin_sync_mode (fcode - BUILT_IN_LOCK_TEST_AND_SET_1);
6492       target = expand_builtin_lock_test_and_set (mode, exp, target);
6493       if (target)
6494         return target;
6495       break;
6496
6497     case BUILT_IN_LOCK_RELEASE_1:
6498     case BUILT_IN_LOCK_RELEASE_2:
6499     case BUILT_IN_LOCK_RELEASE_4:
6500     case BUILT_IN_LOCK_RELEASE_8:
6501     case BUILT_IN_LOCK_RELEASE_16:
6502       mode = get_builtin_sync_mode (fcode - BUILT_IN_LOCK_RELEASE_1);
6503       expand_builtin_lock_release (mode, exp);
6504       return const0_rtx;
6505
6506     case BUILT_IN_SYNCHRONIZE:
6507       expand_builtin_synchronize ();
6508       return const0_rtx;
6509
6510     case BUILT_IN_OBJECT_SIZE:
6511       return expand_builtin_object_size (exp);
6512
6513     case BUILT_IN_MEMCPY_CHK:
6514     case BUILT_IN_MEMPCPY_CHK:
6515     case BUILT_IN_MEMMOVE_CHK:
6516     case BUILT_IN_MEMSET_CHK:
6517       target = expand_builtin_memory_chk (exp, target, mode, fcode);
6518       if (target)
6519         return target;
6520       break;
6521
6522     case BUILT_IN_STRCPY_CHK:
6523     case BUILT_IN_STPCPY_CHK:
6524     case BUILT_IN_STRNCPY_CHK:
6525     case BUILT_IN_STRCAT_CHK:
6526     case BUILT_IN_STRNCAT_CHK:
6527     case BUILT_IN_SNPRINTF_CHK:
6528     case BUILT_IN_VSNPRINTF_CHK:
6529       maybe_emit_chk_warning (exp, fcode);
6530       break;
6531
6532     case BUILT_IN_SPRINTF_CHK:
6533     case BUILT_IN_VSPRINTF_CHK:
6534       maybe_emit_sprintf_chk_warning (exp, fcode);
6535       break;
6536
6537     case BUILT_IN_FREE:
6538       maybe_emit_free_warning (exp);
6539       break;
6540
6541     default:    /* just do library call, if unknown builtin */
6542       break;
6543     }
6544
6545   /* The switch statement above can drop through to cause the function
6546      to be called normally.  */
6547   return expand_call (exp, target, ignore);
6548 }
6549
6550 /* Determine whether a tree node represents a call to a built-in
6551    function.  If the tree T is a call to a built-in function with
6552    the right number of arguments of the appropriate types, return
6553    the DECL_FUNCTION_CODE of the call, e.g. BUILT_IN_SQRT.
6554    Otherwise the return value is END_BUILTINS.  */
6555
6556 enum built_in_function
6557 builtin_mathfn_code (const_tree t)
6558 {
6559   const_tree fndecl, arg, parmlist;
6560   const_tree argtype, parmtype;
6561   const_call_expr_arg_iterator iter;
6562
6563   if (TREE_CODE (t) != CALL_EXPR
6564       || TREE_CODE (CALL_EXPR_FN (t)) != ADDR_EXPR)
6565     return END_BUILTINS;
6566
6567   fndecl = get_callee_fndecl (t);
6568   if (fndecl == NULL_TREE
6569       || TREE_CODE (fndecl) != FUNCTION_DECL
6570       || ! DECL_BUILT_IN (fndecl)
6571       || DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
6572     return END_BUILTINS;
6573
6574   parmlist = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
6575   init_const_call_expr_arg_iterator (t, &iter);
6576   for (; parmlist; parmlist = TREE_CHAIN (parmlist))
6577     {
6578       /* If a function doesn't take a variable number of arguments,
6579          the last element in the list will have type `void'.  */
6580       parmtype = TREE_VALUE (parmlist);
6581       if (VOID_TYPE_P (parmtype))
6582         {
6583           if (more_const_call_expr_args_p (&iter))
6584             return END_BUILTINS;
6585           return DECL_FUNCTION_CODE (fndecl);
6586         }
6587
6588       if (! more_const_call_expr_args_p (&iter))
6589         return END_BUILTINS;
6590
6591       arg = next_const_call_expr_arg (&iter);
6592       argtype = TREE_TYPE (arg);
6593
6594       if (SCALAR_FLOAT_TYPE_P (parmtype))
6595         {
6596           if (! SCALAR_FLOAT_TYPE_P (argtype))
6597             return END_BUILTINS;
6598         }
6599       else if (COMPLEX_FLOAT_TYPE_P (parmtype))
6600         {
6601           if (! COMPLEX_FLOAT_TYPE_P (argtype))
6602             return END_BUILTINS;
6603         }
6604       else if (POINTER_TYPE_P (parmtype))
6605         {
6606           if (! POINTER_TYPE_P (argtype))
6607             return END_BUILTINS;
6608         }
6609       else if (INTEGRAL_TYPE_P (parmtype))
6610         {
6611           if (! INTEGRAL_TYPE_P (argtype))
6612             return END_BUILTINS;
6613         }
6614       else
6615         return END_BUILTINS;
6616     }
6617
6618   /* Variable-length argument list.  */
6619   return DECL_FUNCTION_CODE (fndecl);
6620 }
6621
6622 /* Fold a call to __builtin_constant_p, if we know its argument ARG will
6623    evaluate to a constant.  */
6624
6625 static tree
6626 fold_builtin_constant_p (tree arg)
6627 {
6628   /* We return 1 for a numeric type that's known to be a constant
6629      value at compile-time or for an aggregate type that's a
6630      literal constant.  */
6631   STRIP_NOPS (arg);
6632
6633   /* If we know this is a constant, emit the constant of one.  */
6634   if (CONSTANT_CLASS_P (arg)
6635       || (TREE_CODE (arg) == CONSTRUCTOR
6636           && TREE_CONSTANT (arg)))
6637     return integer_one_node;
6638   if (TREE_CODE (arg) == ADDR_EXPR)
6639     {
6640        tree op = TREE_OPERAND (arg, 0);
6641        if (TREE_CODE (op) == STRING_CST
6642            || (TREE_CODE (op) == ARRAY_REF
6643                && integer_zerop (TREE_OPERAND (op, 1))
6644                && TREE_CODE (TREE_OPERAND (op, 0)) == STRING_CST))
6645          return integer_one_node;
6646     }
6647
6648   /* If this expression has side effects, show we don't know it to be a
6649      constant.  Likewise if it's a pointer or aggregate type since in
6650      those case we only want literals, since those are only optimized
6651      when generating RTL, not later.
6652      And finally, if we are compiling an initializer, not code, we
6653      need to return a definite result now; there's not going to be any
6654      more optimization done.  */
6655   if (TREE_SIDE_EFFECTS (arg)
6656       || AGGREGATE_TYPE_P (TREE_TYPE (arg))
6657       || POINTER_TYPE_P (TREE_TYPE (arg))
6658       || cfun == 0
6659       || folding_initializer)
6660     return integer_zero_node;
6661
6662   return NULL_TREE;
6663 }
6664
6665 /* Create builtin_expect with PRED and EXPECTED as its arguments and
6666    return it as a truthvalue.  */
6667
6668 static tree
6669 build_builtin_expect_predicate (location_t loc, tree pred, tree expected)
6670 {
6671   tree fn, arg_types, pred_type, expected_type, call_expr, ret_type;
6672
6673   fn = built_in_decls[BUILT_IN_EXPECT];
6674   arg_types = TYPE_ARG_TYPES (TREE_TYPE (fn));
6675   ret_type = TREE_TYPE (TREE_TYPE (fn));
6676   pred_type = TREE_VALUE (arg_types);
6677   expected_type = TREE_VALUE (TREE_CHAIN (arg_types));
6678
6679   pred = fold_convert_loc (loc, pred_type, pred);
6680   expected = fold_convert_loc (loc, expected_type, expected);
6681   call_expr = build_call_expr_loc (loc, fn, 2, pred, expected);
6682
6683   return build2 (NE_EXPR, TREE_TYPE (pred), call_expr,
6684                  build_int_cst (ret_type, 0));
6685 }
6686
6687 /* Fold a call to builtin_expect with arguments ARG0 and ARG1.  Return
6688    NULL_TREE if no simplification is possible.  */
6689
6690 static tree
6691 fold_builtin_expect (location_t loc, tree arg0, tree arg1)
6692 {
6693   tree inner, fndecl;
6694   enum tree_code code;
6695
6696   /* If this is a builtin_expect within a builtin_expect keep the
6697      inner one.  See through a comparison against a constant.  It
6698      might have been added to create a thruthvalue.  */
6699   inner = arg0;
6700   if (COMPARISON_CLASS_P (inner)
6701       && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST)
6702     inner = TREE_OPERAND (inner, 0);
6703
6704   if (TREE_CODE (inner) == CALL_EXPR
6705       && (fndecl = get_callee_fndecl (inner))
6706       && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
6707       && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_EXPECT)
6708     return arg0;
6709
6710   /* Distribute the expected value over short-circuiting operators.
6711      See through the cast from truthvalue_type_node to long.  */
6712   inner = arg0;
6713   while (TREE_CODE (inner) == NOP_EXPR
6714          && INTEGRAL_TYPE_P (TREE_TYPE (inner))
6715          && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (inner, 0))))
6716     inner = TREE_OPERAND (inner, 0);
6717
6718   code = TREE_CODE (inner);
6719   if (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR)
6720     {
6721       tree op0 = TREE_OPERAND (inner, 0);
6722       tree op1 = TREE_OPERAND (inner, 1);
6723
6724       op0 = build_builtin_expect_predicate (loc, op0, arg1);
6725       op1 = build_builtin_expect_predicate (loc, op1, arg1);
6726       inner = build2 (code, TREE_TYPE (inner), op0, op1);
6727
6728       return fold_convert_loc (loc, TREE_TYPE (arg0), inner);
6729     }
6730
6731   /* If the argument isn't invariant then there's nothing else we can do.  */
6732   if (!TREE_CONSTANT (arg0))
6733     return NULL_TREE;
6734
6735   /* If we expect that a comparison against the argument will fold to
6736      a constant return the constant.  In practice, this means a true
6737      constant or the address of a non-weak symbol.  */
6738   inner = arg0;
6739   STRIP_NOPS (inner);
6740   if (TREE_CODE (inner) == ADDR_EXPR)
6741     {
6742       do
6743         {
6744           inner = TREE_OPERAND (inner, 0);
6745         }
6746       while (TREE_CODE (inner) == COMPONENT_REF
6747              || TREE_CODE (inner) == ARRAY_REF);
6748       if ((TREE_CODE (inner) == VAR_DECL
6749            || TREE_CODE (inner) == FUNCTION_DECL)
6750           && DECL_WEAK (inner))
6751         return NULL_TREE;
6752     }
6753
6754   /* Otherwise, ARG0 already has the proper type for the return value.  */
6755   return arg0;
6756 }
6757
6758 /* Fold a call to __builtin_classify_type with argument ARG.  */
6759
6760 static tree
6761 fold_builtin_classify_type (tree arg)
6762 {
6763   if (arg == 0)
6764     return build_int_cst (NULL_TREE, no_type_class);
6765
6766   return build_int_cst (NULL_TREE, type_to_class (TREE_TYPE (arg)));
6767 }
6768
6769 /* Fold a call to __builtin_strlen with argument ARG.  */
6770
6771 static tree
6772 fold_builtin_strlen (location_t loc, tree type, tree arg)
6773 {
6774   if (!validate_arg (arg, POINTER_TYPE))
6775     return NULL_TREE;
6776   else
6777     {
6778       tree len = c_strlen (arg, 0);
6779
6780       if (len)
6781         return fold_convert_loc (loc, type, len);
6782
6783       return NULL_TREE;
6784     }
6785 }
6786
6787 /* Fold a call to __builtin_inf or __builtin_huge_val.  */
6788
6789 static tree
6790 fold_builtin_inf (location_t loc, tree type, int warn)
6791 {
6792   REAL_VALUE_TYPE real;
6793
6794   /* __builtin_inff is intended to be usable to define INFINITY on all
6795      targets.  If an infinity is not available, INFINITY expands "to a
6796      positive constant of type float that overflows at translation
6797      time", footnote "In this case, using INFINITY will violate the
6798      constraint in 6.4.4 and thus require a diagnostic." (C99 7.12#4).
6799      Thus we pedwarn to ensure this constraint violation is
6800      diagnosed.  */
6801   if (!MODE_HAS_INFINITIES (TYPE_MODE (type)) && warn)
6802     pedwarn (loc, 0, "target format does not support infinity");
6803
6804   real_inf (&real);
6805   return build_real (type, real);
6806 }
6807
6808 /* Fold a call to __builtin_nan or __builtin_nans with argument ARG.  */
6809
6810 static tree
6811 fold_builtin_nan (tree arg, tree type, int quiet)
6812 {
6813   REAL_VALUE_TYPE real;
6814   const char *str;
6815
6816   if (!validate_arg (arg, POINTER_TYPE))
6817     return NULL_TREE;
6818   str = c_getstr (arg);
6819   if (!str)
6820     return NULL_TREE;
6821
6822   if (!real_nan (&real, str, quiet, TYPE_MODE (type)))
6823     return NULL_TREE;
6824
6825   return build_real (type, real);
6826 }
6827
6828 /* Return true if the floating point expression T has an integer value.
6829    We also allow +Inf, -Inf and NaN to be considered integer values.  */
6830
6831 static bool
6832 integer_valued_real_p (tree t)
6833 {
6834   switch (TREE_CODE (t))
6835     {
6836     case FLOAT_EXPR:
6837       return true;
6838
6839     case ABS_EXPR:
6840     case SAVE_EXPR:
6841       return integer_valued_real_p (TREE_OPERAND (t, 0));
6842
6843     case COMPOUND_EXPR:
6844     case MODIFY_EXPR:
6845     case BIND_EXPR:
6846       return integer_valued_real_p (TREE_OPERAND (t, 1));
6847
6848     case PLUS_EXPR:
6849     case MINUS_EXPR:
6850     case MULT_EXPR:
6851     case MIN_EXPR:
6852     case MAX_EXPR:
6853       return integer_valued_real_p (TREE_OPERAND (t, 0))
6854              && integer_valued_real_p (TREE_OPERAND (t, 1));
6855
6856     case COND_EXPR:
6857       return integer_valued_real_p (TREE_OPERAND (t, 1))
6858              && integer_valued_real_p (TREE_OPERAND (t, 2));
6859
6860     case REAL_CST:
6861       return real_isinteger (TREE_REAL_CST_PTR (t), TYPE_MODE (TREE_TYPE (t)));
6862
6863     case NOP_EXPR:
6864       {
6865         tree type = TREE_TYPE (TREE_OPERAND (t, 0));
6866         if (TREE_CODE (type) == INTEGER_TYPE)
6867           return true;
6868         if (TREE_CODE (type) == REAL_TYPE)
6869           return integer_valued_real_p (TREE_OPERAND (t, 0));
6870         break;
6871       }
6872
6873     case CALL_EXPR:
6874       switch (builtin_mathfn_code (t))
6875         {
6876         CASE_FLT_FN (BUILT_IN_CEIL):
6877         CASE_FLT_FN (BUILT_IN_FLOOR):
6878         CASE_FLT_FN (BUILT_IN_NEARBYINT):
6879         CASE_FLT_FN (BUILT_IN_RINT):
6880         CASE_FLT_FN (BUILT_IN_ROUND):
6881         CASE_FLT_FN (BUILT_IN_TRUNC):
6882           return true;
6883
6884         CASE_FLT_FN (BUILT_IN_FMIN):
6885         CASE_FLT_FN (BUILT_IN_FMAX):
6886           return integer_valued_real_p (CALL_EXPR_ARG (t, 0))
6887             && integer_valued_real_p (CALL_EXPR_ARG (t, 1));
6888
6889         default:
6890           break;
6891         }
6892       break;
6893
6894     default:
6895       break;
6896     }
6897   return false;
6898 }
6899
6900 /* FNDECL is assumed to be a builtin where truncation can be propagated
6901    across (for instance floor((double)f) == (double)floorf (f).
6902    Do the transformation for a call with argument ARG.  */
6903
6904 static tree
6905 fold_trunc_transparent_mathfn (location_t loc, tree fndecl, tree arg)
6906 {
6907   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
6908
6909   if (!validate_arg (arg, REAL_TYPE))
6910     return NULL_TREE;
6911
6912   /* Integer rounding functions are idempotent.  */
6913   if (fcode == builtin_mathfn_code (arg))
6914     return arg;
6915
6916   /* If argument is already integer valued, and we don't need to worry
6917      about setting errno, there's no need to perform rounding.  */
6918   if (! flag_errno_math && integer_valued_real_p (arg))
6919     return arg;
6920
6921   if (optimize)
6922     {
6923       tree arg0 = strip_float_extensions (arg);
6924       tree ftype = TREE_TYPE (TREE_TYPE (fndecl));
6925       tree newtype = TREE_TYPE (arg0);
6926       tree decl;
6927
6928       if (TYPE_PRECISION (newtype) < TYPE_PRECISION (ftype)
6929           && (decl = mathfn_built_in (newtype, fcode)))
6930         return fold_convert_loc (loc, ftype,
6931                                  build_call_expr_loc (loc, decl, 1,
6932                                                   fold_convert_loc (loc,
6933                                                                     newtype,
6934                                                                     arg0)));
6935     }
6936   return NULL_TREE;
6937 }
6938
6939 /* FNDECL is assumed to be builtin which can narrow the FP type of
6940    the argument, for instance lround((double)f) -> lroundf (f).
6941    Do the transformation for a call with argument ARG.  */
6942
6943 static tree
6944 fold_fixed_mathfn (location_t loc, tree fndecl, tree arg)
6945 {
6946   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
6947
6948   if (!validate_arg (arg, REAL_TYPE))
6949     return NULL_TREE;
6950
6951   /* If argument is already integer valued, and we don't need to worry
6952      about setting errno, there's no need to perform rounding.  */
6953   if (! flag_errno_math && integer_valued_real_p (arg))
6954     return fold_build1_loc (loc, FIX_TRUNC_EXPR,
6955                         TREE_TYPE (TREE_TYPE (fndecl)), arg);
6956
6957   if (optimize)
6958     {
6959       tree ftype = TREE_TYPE (arg);
6960       tree arg0 = strip_float_extensions (arg);
6961       tree newtype = TREE_TYPE (arg0);
6962       tree decl;
6963
6964       if (TYPE_PRECISION (newtype) < TYPE_PRECISION (ftype)
6965           && (decl = mathfn_built_in (newtype, fcode)))
6966         return build_call_expr_loc (loc, decl, 1,
6967                                 fold_convert_loc (loc, newtype, arg0));
6968     }
6969
6970   /* Canonicalize llround (x) to lround (x) on LP64 targets where
6971      sizeof (long long) == sizeof (long).  */
6972   if (TYPE_PRECISION (long_long_integer_type_node)
6973       == TYPE_PRECISION (long_integer_type_node))
6974     {
6975       tree newfn = NULL_TREE;
6976       switch (fcode)
6977         {
6978         CASE_FLT_FN (BUILT_IN_LLCEIL):
6979           newfn = mathfn_built_in (TREE_TYPE (arg), BUILT_IN_LCEIL);
6980           break;
6981
6982         CASE_FLT_FN (BUILT_IN_LLFLOOR):
6983           newfn = mathfn_built_in (TREE_TYPE (arg), BUILT_IN_LFLOOR);
6984           break;
6985
6986         CASE_FLT_FN (BUILT_IN_LLROUND):
6987           newfn = mathfn_built_in (TREE_TYPE (arg), BUILT_IN_LROUND);
6988           break;
6989
6990         CASE_FLT_FN (BUILT_IN_LLRINT):
6991           newfn = mathfn_built_in (TREE_TYPE (arg), BUILT_IN_LRINT);
6992           break;
6993
6994         default:
6995           break;
6996         }
6997
6998       if (newfn)
6999         {
7000           tree newcall = build_call_expr_loc (loc, newfn, 1, arg);
7001           return fold_convert_loc (loc,
7002                                    TREE_TYPE (TREE_TYPE (fndecl)), newcall);
7003         }
7004     }
7005
7006   return NULL_TREE;
7007 }
7008
7009 /* Fold call to builtin cabs, cabsf or cabsl with argument ARG.  TYPE is the
7010    return type.  Return NULL_TREE if no simplification can be made.  */
7011
7012 static tree
7013 fold_builtin_cabs (location_t loc, tree arg, tree type, tree fndecl)
7014 {
7015   tree res;
7016
7017   if (!validate_arg (arg, COMPLEX_TYPE)
7018       || TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) != REAL_TYPE)
7019     return NULL_TREE;
7020
7021   /* Calculate the result when the argument is a constant.  */
7022   if (TREE_CODE (arg) == COMPLEX_CST
7023       && (res = do_mpfr_arg2 (TREE_REALPART (arg), TREE_IMAGPART (arg),
7024                               type, mpfr_hypot)))
7025     return res;
7026
7027   if (TREE_CODE (arg) == COMPLEX_EXPR)
7028     {
7029       tree real = TREE_OPERAND (arg, 0);
7030       tree imag = TREE_OPERAND (arg, 1);
7031
7032       /* If either part is zero, cabs is fabs of the other.  */
7033       if (real_zerop (real))
7034         return fold_build1_loc (loc, ABS_EXPR, type, imag);
7035       if (real_zerop (imag))
7036         return fold_build1_loc (loc, ABS_EXPR, type, real);
7037
7038       /* cabs(x+xi) -> fabs(x)*sqrt(2).  */
7039       if (flag_unsafe_math_optimizations
7040           && operand_equal_p (real, imag, OEP_PURE_SAME))
7041         {
7042           const REAL_VALUE_TYPE sqrt2_trunc
7043             = real_value_truncate (TYPE_MODE (type), dconst_sqrt2 ());
7044           STRIP_NOPS (real);
7045           return fold_build2_loc (loc, MULT_EXPR, type,
7046                               fold_build1_loc (loc, ABS_EXPR, type, real),
7047                               build_real (type, sqrt2_trunc));
7048         }
7049     }
7050
7051   /* Optimize cabs(-z) and cabs(conj(z)) as cabs(z).  */
7052   if (TREE_CODE (arg) == NEGATE_EXPR
7053       || TREE_CODE (arg) == CONJ_EXPR)
7054     return build_call_expr_loc (loc, fndecl, 1, TREE_OPERAND (arg, 0));
7055
7056   /* Don't do this when optimizing for size.  */
7057   if (flag_unsafe_math_optimizations
7058       && optimize && optimize_function_for_speed_p (cfun))
7059     {
7060       tree sqrtfn = mathfn_built_in (type, BUILT_IN_SQRT);
7061
7062       if (sqrtfn != NULL_TREE)
7063         {
7064           tree rpart, ipart, result;
7065
7066           arg = builtin_save_expr (arg);
7067
7068           rpart = fold_build1_loc (loc, REALPART_EXPR, type, arg);
7069           ipart = fold_build1_loc (loc, IMAGPART_EXPR, type, arg);
7070
7071           rpart = builtin_save_expr (rpart);
7072           ipart = builtin_save_expr (ipart);
7073
7074           result = fold_build2_loc (loc, PLUS_EXPR, type,
7075                                 fold_build2_loc (loc, MULT_EXPR, type,
7076                                              rpart, rpart),
7077                                 fold_build2_loc (loc, MULT_EXPR, type,
7078                                              ipart, ipart));
7079
7080           return build_call_expr_loc (loc, sqrtfn, 1, result);
7081         }
7082     }
7083
7084   return NULL_TREE;
7085 }
7086
7087 /* Build a complex (inf +- 0i) for the result of cproj.  TYPE is the
7088    complex tree type of the result.  If NEG is true, the imaginary
7089    zero is negative.  */
7090
7091 static tree
7092 build_complex_cproj (tree type, bool neg)
7093 {
7094   REAL_VALUE_TYPE rinf, rzero = dconst0;
7095   
7096   real_inf (&rinf);
7097   rzero.sign = neg;
7098   return build_complex (type, build_real (TREE_TYPE (type), rinf),
7099                         build_real (TREE_TYPE (type), rzero));
7100 }
7101
7102 /* Fold call to builtin cproj, cprojf or cprojl with argument ARG.  TYPE is the
7103    return type.  Return NULL_TREE if no simplification can be made.  */
7104
7105 static tree
7106 fold_builtin_cproj (location_t loc, tree arg, tree type)
7107 {
7108   if (!validate_arg (arg, COMPLEX_TYPE)
7109       || TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) != REAL_TYPE)
7110     return NULL_TREE;
7111
7112   /* If there are no infinities, return arg.  */
7113   if (! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (type))))
7114     return non_lvalue_loc (loc, arg);
7115
7116   /* Calculate the result when the argument is a constant.  */
7117   if (TREE_CODE (arg) == COMPLEX_CST)
7118     {
7119       const REAL_VALUE_TYPE *real = TREE_REAL_CST_PTR (TREE_REALPART (arg));
7120       const REAL_VALUE_TYPE *imag = TREE_REAL_CST_PTR (TREE_IMAGPART (arg));
7121       
7122       if (real_isinf (real) || real_isinf (imag))
7123         return build_complex_cproj (type, imag->sign);
7124       else
7125         return arg;
7126     }
7127   else if (TREE_CODE (arg) == COMPLEX_EXPR)
7128     {
7129       tree real = TREE_OPERAND (arg, 0);
7130       tree imag = TREE_OPERAND (arg, 1);
7131
7132       STRIP_NOPS (real);
7133       STRIP_NOPS (imag);
7134       
7135       /* If the real part is inf and the imag part is known to be
7136          nonnegative, return (inf + 0i).  Remember side-effects are
7137          possible in the imag part.  */
7138       if (TREE_CODE (real) == REAL_CST
7139           && real_isinf (TREE_REAL_CST_PTR (real))
7140           && tree_expr_nonnegative_p (imag))
7141         return omit_one_operand_loc (loc, type,
7142                                      build_complex_cproj (type, false),
7143                                      arg);
7144       
7145       /* If the imag part is inf, return (inf+I*copysign(0,imag)).
7146          Remember side-effects are possible in the real part.  */
7147       if (TREE_CODE (imag) == REAL_CST
7148           && real_isinf (TREE_REAL_CST_PTR (imag)))
7149         return
7150           omit_one_operand_loc (loc, type,
7151                                 build_complex_cproj (type, TREE_REAL_CST_PTR
7152                                                      (imag)->sign), arg);
7153     }
7154
7155   return NULL_TREE;
7156 }
7157
7158 /* Fold a builtin function call to sqrt, sqrtf, or sqrtl with argument ARG.
7159    Return NULL_TREE if no simplification can be made.  */
7160
7161 static tree
7162 fold_builtin_sqrt (location_t loc, tree arg, tree type)
7163 {
7164
7165   enum built_in_function fcode;
7166   tree res;
7167
7168   if (!validate_arg (arg, REAL_TYPE))
7169     return NULL_TREE;
7170
7171   /* Calculate the result when the argument is a constant.  */
7172   if ((res = do_mpfr_arg1 (arg, type, mpfr_sqrt, &dconst0, NULL, true)))
7173     return res;
7174
7175   /* Optimize sqrt(expN(x)) = expN(x*0.5).  */
7176   fcode = builtin_mathfn_code (arg);
7177   if (flag_unsafe_math_optimizations && BUILTIN_EXPONENT_P (fcode))
7178     {
7179       tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg), 0);
7180       arg = fold_build2_loc (loc, MULT_EXPR, type,
7181                          CALL_EXPR_ARG (arg, 0),
7182                          build_real (type, dconsthalf));
7183       return build_call_expr_loc (loc, expfn, 1, arg);
7184     }
7185
7186   /* Optimize sqrt(Nroot(x)) -> pow(x,1/(2*N)).  */
7187   if (flag_unsafe_math_optimizations && BUILTIN_ROOT_P (fcode))
7188     {
7189       tree powfn = mathfn_built_in (type, BUILT_IN_POW);
7190
7191       if (powfn)
7192         {
7193           tree arg0 = CALL_EXPR_ARG (arg, 0);
7194           tree tree_root;
7195           /* The inner root was either sqrt or cbrt.  */
7196           /* This was a conditional expression but it triggered a bug
7197              in Sun C 5.5.  */
7198           REAL_VALUE_TYPE dconstroot;
7199           if (BUILTIN_SQRT_P (fcode))
7200             dconstroot = dconsthalf;
7201           else
7202             dconstroot = dconst_third ();
7203
7204           /* Adjust for the outer root.  */
7205           SET_REAL_EXP (&dconstroot, REAL_EXP (&dconstroot) - 1);
7206           dconstroot = real_value_truncate (TYPE_MODE (type), dconstroot);
7207           tree_root = build_real (type, dconstroot);
7208           return build_call_expr_loc (loc, powfn, 2, arg0, tree_root);
7209         }
7210     }
7211
7212   /* Optimize sqrt(pow(x,y)) = pow(|x|,y*0.5).  */
7213   if (flag_unsafe_math_optimizations
7214       && (fcode == BUILT_IN_POW
7215           || fcode == BUILT_IN_POWF
7216           || fcode == BUILT_IN_POWL))
7217     {
7218       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg), 0);
7219       tree arg0 = CALL_EXPR_ARG (arg, 0);
7220       tree arg1 = CALL_EXPR_ARG (arg, 1);
7221       tree narg1;
7222       if (!tree_expr_nonnegative_p (arg0))
7223         arg0 = build1 (ABS_EXPR, type, arg0);
7224       narg1 = fold_build2_loc (loc, MULT_EXPR, type, arg1,
7225                            build_real (type, dconsthalf));
7226       return build_call_expr_loc (loc, powfn, 2, arg0, narg1);
7227     }
7228
7229   return NULL_TREE;
7230 }
7231
7232 /* Fold a builtin function call to cbrt, cbrtf, or cbrtl with argument ARG.
7233    Return NULL_TREE if no simplification can be made.  */
7234
7235 static tree
7236 fold_builtin_cbrt (location_t loc, tree arg, tree type)
7237 {
7238   const enum built_in_function fcode = builtin_mathfn_code (arg);
7239   tree res;
7240
7241   if (!validate_arg (arg, REAL_TYPE))
7242     return NULL_TREE;
7243
7244   /* Calculate the result when the argument is a constant.  */
7245   if ((res = do_mpfr_arg1 (arg, type, mpfr_cbrt, NULL, NULL, 0)))
7246     return res;
7247
7248   if (flag_unsafe_math_optimizations)
7249     {
7250       /* Optimize cbrt(expN(x)) -> expN(x/3).  */
7251       if (BUILTIN_EXPONENT_P (fcode))
7252         {
7253           tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg), 0);
7254           const REAL_VALUE_TYPE third_trunc =
7255             real_value_truncate (TYPE_MODE (type), dconst_third ());
7256           arg = fold_build2_loc (loc, MULT_EXPR, type,
7257                              CALL_EXPR_ARG (arg, 0),
7258                              build_real (type, third_trunc));
7259           return build_call_expr_loc (loc, expfn, 1, arg);
7260         }
7261
7262       /* Optimize cbrt(sqrt(x)) -> pow(x,1/6).  */
7263       if (BUILTIN_SQRT_P (fcode))
7264         {
7265           tree powfn = mathfn_built_in (type, BUILT_IN_POW);
7266
7267           if (powfn)
7268             {
7269               tree arg0 = CALL_EXPR_ARG (arg, 0);
7270               tree tree_root;
7271               REAL_VALUE_TYPE dconstroot = dconst_third ();
7272
7273               SET_REAL_EXP (&dconstroot, REAL_EXP (&dconstroot) - 1);
7274               dconstroot = real_value_truncate (TYPE_MODE (type), dconstroot);
7275               tree_root = build_real (type, dconstroot);
7276               return build_call_expr_loc (loc, powfn, 2, arg0, tree_root);
7277             }
7278         }
7279
7280       /* Optimize cbrt(cbrt(x)) -> pow(x,1/9) iff x is nonnegative.  */
7281       if (BUILTIN_CBRT_P (fcode))
7282         {
7283           tree arg0 = CALL_EXPR_ARG (arg, 0);
7284           if (tree_expr_nonnegative_p (arg0))
7285             {
7286               tree powfn = mathfn_built_in (type, BUILT_IN_POW);
7287
7288               if (powfn)
7289                 {
7290                   tree tree_root;
7291                   REAL_VALUE_TYPE dconstroot;
7292
7293                   real_arithmetic (&dconstroot, MULT_EXPR,
7294                                    dconst_third_ptr (), dconst_third_ptr ());
7295                   dconstroot = real_value_truncate (TYPE_MODE (type), dconstroot);
7296                   tree_root = build_real (type, dconstroot);
7297                   return build_call_expr_loc (loc, powfn, 2, arg0, tree_root);
7298                 }
7299             }
7300         }
7301
7302       /* Optimize cbrt(pow(x,y)) -> pow(x,y/3) iff x is nonnegative.  */
7303       if (fcode == BUILT_IN_POW
7304           || fcode == BUILT_IN_POWF
7305           || fcode == BUILT_IN_POWL)
7306         {
7307           tree arg00 = CALL_EXPR_ARG (arg, 0);
7308           tree arg01 = CALL_EXPR_ARG (arg, 1);
7309           if (tree_expr_nonnegative_p (arg00))
7310             {
7311               tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg), 0);
7312               const REAL_VALUE_TYPE dconstroot
7313                 = real_value_truncate (TYPE_MODE (type), dconst_third ());
7314               tree narg01 = fold_build2_loc (loc, MULT_EXPR, type, arg01,
7315                                          build_real (type, dconstroot));
7316               return build_call_expr_loc (loc, powfn, 2, arg00, narg01);
7317             }
7318         }
7319     }
7320   return NULL_TREE;
7321 }
7322
7323 /* Fold function call to builtin cos, cosf, or cosl with argument ARG.
7324    TYPE is the type of the return value.  Return NULL_TREE if no
7325    simplification can be made.  */
7326
7327 static tree
7328 fold_builtin_cos (location_t loc,
7329                   tree arg, tree type, tree fndecl)
7330 {
7331   tree res, narg;
7332
7333   if (!validate_arg (arg, REAL_TYPE))
7334     return NULL_TREE;
7335
7336   /* Calculate the result when the argument is a constant.  */
7337   if ((res = do_mpfr_arg1 (arg, type, mpfr_cos, NULL, NULL, 0)))
7338     return res;
7339
7340   /* Optimize cos(-x) into cos (x).  */
7341   if ((narg = fold_strip_sign_ops (arg)))
7342     return build_call_expr_loc (loc, fndecl, 1, narg);
7343
7344   return NULL_TREE;
7345 }
7346
7347 /* Fold function call to builtin cosh, coshf, or coshl with argument ARG.
7348    Return NULL_TREE if no simplification can be made.  */
7349
7350 static tree
7351 fold_builtin_cosh (location_t loc, tree arg, tree type, tree fndecl)
7352 {
7353   if (validate_arg (arg, REAL_TYPE))
7354     {
7355       tree res, narg;
7356
7357       /* Calculate the result when the argument is a constant.  */
7358       if ((res = do_mpfr_arg1 (arg, type, mpfr_cosh, NULL, NULL, 0)))
7359         return res;
7360
7361       /* Optimize cosh(-x) into cosh (x).  */
7362       if ((narg = fold_strip_sign_ops (arg)))
7363         return build_call_expr_loc (loc, fndecl, 1, narg);
7364     }
7365
7366   return NULL_TREE;
7367 }
7368
7369 /* Fold function call to builtin ccos (or ccosh if HYPER is TRUE) with
7370    argument ARG.  TYPE is the type of the return value.  Return
7371    NULL_TREE if no simplification can be made.  */
7372
7373 static tree
7374 fold_builtin_ccos (location_t loc, tree arg, tree type, tree fndecl,
7375                    bool hyper)
7376 {
7377   if (validate_arg (arg, COMPLEX_TYPE)
7378       && TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) == REAL_TYPE)
7379     {
7380       tree tmp;
7381
7382       /* Calculate the result when the argument is a constant.  */
7383       if ((tmp = do_mpc_arg1 (arg, type, (hyper ? mpc_cosh : mpc_cos))))
7384         return tmp;
7385
7386       /* Optimize fn(-x) into fn(x).  */
7387       if ((tmp = fold_strip_sign_ops (arg)))
7388         return build_call_expr_loc (loc, fndecl, 1, tmp);
7389     }
7390
7391   return NULL_TREE;
7392 }
7393
7394 /* Fold function call to builtin tan, tanf, or tanl with argument ARG.
7395    Return NULL_TREE if no simplification can be made.  */
7396
7397 static tree
7398 fold_builtin_tan (tree arg, tree type)
7399 {
7400   enum built_in_function fcode;
7401   tree res;
7402
7403   if (!validate_arg (arg, REAL_TYPE))
7404     return NULL_TREE;
7405
7406   /* Calculate the result when the argument is a constant.  */
7407   if ((res = do_mpfr_arg1 (arg, type, mpfr_tan, NULL, NULL, 0)))
7408     return res;
7409
7410   /* Optimize tan(atan(x)) = x.  */
7411   fcode = builtin_mathfn_code (arg);
7412   if (flag_unsafe_math_optimizations
7413       && (fcode == BUILT_IN_ATAN
7414           || fcode == BUILT_IN_ATANF
7415           || fcode == BUILT_IN_ATANL))
7416     return CALL_EXPR_ARG (arg, 0);
7417
7418   return NULL_TREE;
7419 }
7420
7421 /* Fold function call to builtin sincos, sincosf, or sincosl.  Return
7422    NULL_TREE if no simplification can be made.  */
7423
7424 static tree
7425 fold_builtin_sincos (location_t loc,
7426                      tree arg0, tree arg1, tree arg2)
7427 {
7428   tree type;
7429   tree res, fn, call;
7430
7431   if (!validate_arg (arg0, REAL_TYPE)
7432       || !validate_arg (arg1, POINTER_TYPE)
7433       || !validate_arg (arg2, POINTER_TYPE))
7434     return NULL_TREE;
7435
7436   type = TREE_TYPE (arg0);
7437
7438   /* Calculate the result when the argument is a constant.  */
7439   if ((res = do_mpfr_sincos (arg0, arg1, arg2)))
7440     return res;
7441
7442   /* Canonicalize sincos to cexpi.  */
7443   if (!TARGET_C99_FUNCTIONS)
7444     return NULL_TREE;
7445   fn = mathfn_built_in (type, BUILT_IN_CEXPI);
7446   if (!fn)
7447     return NULL_TREE;
7448
7449   call = build_call_expr_loc (loc, fn, 1, arg0);
7450   call = builtin_save_expr (call);
7451
7452   return build2 (COMPOUND_EXPR, void_type_node,
7453                  build2 (MODIFY_EXPR, void_type_node,
7454                          build_fold_indirect_ref_loc (loc, arg1),
7455                          build1 (IMAGPART_EXPR, type, call)),
7456                  build2 (MODIFY_EXPR, void_type_node,
7457                          build_fold_indirect_ref_loc (loc, arg2),
7458                          build1 (REALPART_EXPR, type, call)));
7459 }
7460
7461 /* Fold function call to builtin cexp, cexpf, or cexpl.  Return
7462    NULL_TREE if no simplification can be made.  */
7463
7464 static tree
7465 fold_builtin_cexp (location_t loc, tree arg0, tree type)
7466 {
7467   tree rtype;
7468   tree realp, imagp, ifn;
7469   tree res;
7470
7471   if (!validate_arg (arg0, COMPLEX_TYPE)
7472       || TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) != REAL_TYPE)
7473     return NULL_TREE;
7474
7475   /* Calculate the result when the argument is a constant.  */
7476   if ((res = do_mpc_arg1 (arg0, type, mpc_exp)))
7477     return res;
7478
7479   rtype = TREE_TYPE (TREE_TYPE (arg0));
7480
7481   /* In case we can figure out the real part of arg0 and it is constant zero
7482      fold to cexpi.  */
7483   if (!TARGET_C99_FUNCTIONS)
7484     return NULL_TREE;
7485   ifn = mathfn_built_in (rtype, BUILT_IN_CEXPI);
7486   if (!ifn)
7487     return NULL_TREE;
7488
7489   if ((realp = fold_unary_loc (loc, REALPART_EXPR, rtype, arg0))
7490       && real_zerop (realp))
7491     {
7492       tree narg = fold_build1_loc (loc, IMAGPART_EXPR, rtype, arg0);
7493       return build_call_expr_loc (loc, ifn, 1, narg);
7494     }
7495
7496   /* In case we can easily decompose real and imaginary parts split cexp
7497      to exp (r) * cexpi (i).  */
7498   if (flag_unsafe_math_optimizations
7499       && realp)
7500     {
7501       tree rfn, rcall, icall;
7502
7503       rfn = mathfn_built_in (rtype, BUILT_IN_EXP);
7504       if (!rfn)
7505         return NULL_TREE;
7506
7507       imagp = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg0);
7508       if (!imagp)
7509         return NULL_TREE;
7510
7511       icall = build_call_expr_loc (loc, ifn, 1, imagp);
7512       icall = builtin_save_expr (icall);
7513       rcall = build_call_expr_loc (loc, rfn, 1, realp);
7514       rcall = builtin_save_expr (rcall);
7515       return fold_build2_loc (loc, COMPLEX_EXPR, type,
7516                           fold_build2_loc (loc, MULT_EXPR, rtype,
7517                                        rcall,
7518                                        fold_build1_loc (loc, REALPART_EXPR,
7519                                                     rtype, icall)),
7520                           fold_build2_loc (loc, MULT_EXPR, rtype,
7521                                        rcall,
7522                                        fold_build1_loc (loc, IMAGPART_EXPR,
7523                                                     rtype, icall)));
7524     }
7525
7526   return NULL_TREE;
7527 }
7528
7529 /* Fold function call to builtin trunc, truncf or truncl with argument ARG.
7530    Return NULL_TREE if no simplification can be made.  */
7531
7532 static tree
7533 fold_builtin_trunc (location_t loc, tree fndecl, tree arg)
7534 {
7535   if (!validate_arg (arg, REAL_TYPE))
7536     return NULL_TREE;
7537
7538   /* Optimize trunc of constant value.  */
7539   if (TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg))
7540     {
7541       REAL_VALUE_TYPE r, x;
7542       tree type = TREE_TYPE (TREE_TYPE (fndecl));
7543
7544       x = TREE_REAL_CST (arg);
7545       real_trunc (&r, TYPE_MODE (type), &x);
7546       return build_real (type, r);
7547     }
7548
7549   return fold_trunc_transparent_mathfn (loc, fndecl, arg);
7550 }
7551
7552 /* Fold function call to builtin floor, floorf or floorl with argument ARG.
7553    Return NULL_TREE if no simplification can be made.  */
7554
7555 static tree
7556 fold_builtin_floor (location_t loc, tree fndecl, tree arg)
7557 {
7558   if (!validate_arg (arg, REAL_TYPE))
7559     return NULL_TREE;
7560
7561   /* Optimize floor of constant value.  */
7562   if (TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg))
7563     {
7564       REAL_VALUE_TYPE x;
7565
7566       x = TREE_REAL_CST (arg);
7567       if (! REAL_VALUE_ISNAN (x) || ! flag_errno_math)
7568         {
7569           tree type = TREE_TYPE (TREE_TYPE (fndecl));
7570           REAL_VALUE_TYPE r;
7571
7572           real_floor (&r, TYPE_MODE (type), &x);
7573           return build_real (type, r);
7574         }
7575     }
7576
7577   /* Fold floor (x) where x is nonnegative to trunc (x).  */
7578   if (tree_expr_nonnegative_p (arg))
7579     {
7580       tree truncfn = mathfn_built_in (TREE_TYPE (arg), BUILT_IN_TRUNC);
7581       if (truncfn)
7582         return build_call_expr_loc (loc, truncfn, 1, arg);
7583     }
7584
7585   return fold_trunc_transparent_mathfn (loc, fndecl, arg);
7586 }
7587
7588 /* Fold function call to builtin ceil, ceilf or ceill with argument ARG.
7589    Return NULL_TREE if no simplification can be made.  */
7590
7591 static tree
7592 fold_builtin_ceil (location_t loc, tree fndecl, tree arg)
7593 {
7594   if (!validate_arg (arg, REAL_TYPE))
7595     return NULL_TREE;
7596
7597   /* Optimize ceil of constant value.  */
7598   if (TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg))
7599     {
7600       REAL_VALUE_TYPE x;
7601
7602       x = TREE_REAL_CST (arg);
7603       if (! REAL_VALUE_ISNAN (x) || ! flag_errno_math)
7604         {
7605           tree type = TREE_TYPE (TREE_TYPE (fndecl));
7606           REAL_VALUE_TYPE r;
7607
7608           real_ceil (&r, TYPE_MODE (type), &x);
7609           return build_real (type, r);
7610         }
7611     }
7612
7613   return fold_trunc_transparent_mathfn (loc, fndecl, arg);
7614 }
7615
7616 /* Fold function call to builtin round, roundf or roundl with argument ARG.
7617    Return NULL_TREE if no simplification can be made.  */
7618
7619 static tree
7620 fold_builtin_round (location_t loc, tree fndecl, tree arg)
7621 {
7622   if (!validate_arg (arg, REAL_TYPE))
7623     return NULL_TREE;
7624
7625   /* Optimize round of constant value.  */
7626   if (TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg))
7627     {
7628       REAL_VALUE_TYPE x;
7629
7630       x = TREE_REAL_CST (arg);
7631       if (! REAL_VALUE_ISNAN (x) || ! flag_errno_math)
7632         {
7633           tree type = TREE_TYPE (TREE_TYPE (fndecl));
7634           REAL_VALUE_TYPE r;
7635
7636           real_round (&r, TYPE_MODE (type), &x);
7637           return build_real (type, r);
7638         }
7639     }
7640
7641   return fold_trunc_transparent_mathfn (loc, fndecl, arg);
7642 }
7643
7644 /* Fold function call to builtin lround, lroundf or lroundl (or the
7645    corresponding long long versions) and other rounding functions.  ARG
7646    is the argument to the call.  Return NULL_TREE if no simplification
7647    can be made.  */
7648
7649 static tree
7650 fold_builtin_int_roundingfn (location_t loc, tree fndecl, tree arg)
7651 {
7652   if (!validate_arg (arg, REAL_TYPE))
7653     return NULL_TREE;
7654
7655   /* Optimize lround of constant value.  */
7656   if (TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg))
7657     {
7658       const REAL_VALUE_TYPE x = TREE_REAL_CST (arg);
7659
7660       if (real_isfinite (&x))
7661         {
7662           tree itype = TREE_TYPE (TREE_TYPE (fndecl));
7663           tree ftype = TREE_TYPE (arg);
7664           double_int val;
7665           REAL_VALUE_TYPE r;
7666
7667           switch (DECL_FUNCTION_CODE (fndecl))
7668             {
7669             CASE_FLT_FN (BUILT_IN_LFLOOR):
7670             CASE_FLT_FN (BUILT_IN_LLFLOOR):
7671               real_floor (&r, TYPE_MODE (ftype), &x);
7672               break;
7673
7674             CASE_FLT_FN (BUILT_IN_LCEIL):
7675             CASE_FLT_FN (BUILT_IN_LLCEIL):
7676               real_ceil (&r, TYPE_MODE (ftype), &x);
7677               break;
7678
7679             CASE_FLT_FN (BUILT_IN_LROUND):
7680             CASE_FLT_FN (BUILT_IN_LLROUND):
7681               real_round (&r, TYPE_MODE (ftype), &x);
7682               break;
7683
7684             default:
7685               gcc_unreachable ();
7686             }
7687
7688           real_to_integer2 ((HOST_WIDE_INT *)&val.low, &val.high, &r);
7689           if (double_int_fits_to_tree_p (itype, val))
7690             return double_int_to_tree (itype, val);
7691         }
7692     }
7693
7694   switch (DECL_FUNCTION_CODE (fndecl))
7695     {
7696     CASE_FLT_FN (BUILT_IN_LFLOOR):
7697     CASE_FLT_FN (BUILT_IN_LLFLOOR):
7698       /* Fold lfloor (x) where x is nonnegative to FIX_TRUNC (x).  */
7699       if (tree_expr_nonnegative_p (arg))
7700         return fold_build1_loc (loc, FIX_TRUNC_EXPR,
7701                             TREE_TYPE (TREE_TYPE (fndecl)), arg);
7702       break;
7703     default:;
7704     }
7705
7706   return fold_fixed_mathfn (loc, fndecl, arg);
7707 }
7708
7709 /* Fold function call to builtin ffs, clz, ctz, popcount and parity
7710    and their long and long long variants (i.e. ffsl and ffsll).  ARG is
7711    the argument to the call.  Return NULL_TREE if no simplification can
7712    be made.  */
7713
7714 static tree
7715 fold_builtin_bitop (tree fndecl, tree arg)
7716 {
7717   if (!validate_arg (arg, INTEGER_TYPE))
7718     return NULL_TREE;
7719
7720   /* Optimize for constant argument.  */
7721   if (TREE_CODE (arg) == INTEGER_CST && !TREE_OVERFLOW (arg))
7722     {
7723       HOST_WIDE_INT hi, width, result;
7724       unsigned HOST_WIDE_INT lo;
7725       tree type;
7726
7727       type = TREE_TYPE (arg);
7728       width = TYPE_PRECISION (type);
7729       lo = TREE_INT_CST_LOW (arg);
7730
7731       /* Clear all the bits that are beyond the type's precision.  */
7732       if (width > HOST_BITS_PER_WIDE_INT)
7733         {
7734           hi = TREE_INT_CST_HIGH (arg);
7735           if (width < 2 * HOST_BITS_PER_WIDE_INT)
7736             hi &= ~((HOST_WIDE_INT) (-1) >> (width - HOST_BITS_PER_WIDE_INT));
7737         }
7738       else
7739         {
7740           hi = 0;
7741           if (width < HOST_BITS_PER_WIDE_INT)
7742             lo &= ~((unsigned HOST_WIDE_INT) (-1) << width);
7743         }
7744
7745       switch (DECL_FUNCTION_CODE (fndecl))
7746         {
7747         CASE_INT_FN (BUILT_IN_FFS):
7748           if (lo != 0)
7749             result = ffs_hwi (lo);
7750           else if (hi != 0)
7751             result = HOST_BITS_PER_WIDE_INT + ffs_hwi (hi);
7752           else
7753             result = 0;
7754           break;
7755
7756         CASE_INT_FN (BUILT_IN_CLZ):
7757           if (hi != 0)
7758             result = width - floor_log2 (hi) - 1 - HOST_BITS_PER_WIDE_INT;
7759           else if (lo != 0)
7760             result = width - floor_log2 (lo) - 1;
7761           else if (! CLZ_DEFINED_VALUE_AT_ZERO (TYPE_MODE (type), result))
7762             result = width;
7763           break;
7764
7765         CASE_INT_FN (BUILT_IN_CTZ):
7766           if (lo != 0)
7767             result = ctz_hwi (lo);
7768           else if (hi != 0)
7769             result = HOST_BITS_PER_WIDE_INT + ctz_hwi (hi);
7770           else if (! CTZ_DEFINED_VALUE_AT_ZERO (TYPE_MODE (type), result))
7771             result = width;
7772           break;
7773
7774         CASE_INT_FN (BUILT_IN_POPCOUNT):
7775           result = 0;
7776           while (lo)
7777             result++, lo &= lo - 1;
7778           while (hi)
7779             result++, hi &= (unsigned HOST_WIDE_INT) hi - 1;
7780           break;
7781
7782         CASE_INT_FN (BUILT_IN_PARITY):
7783           result = 0;
7784           while (lo)
7785             result++, lo &= lo - 1;
7786           while (hi)
7787             result++, hi &= (unsigned HOST_WIDE_INT) hi - 1;
7788           result &= 1;
7789           break;
7790
7791         default:
7792           gcc_unreachable ();
7793         }
7794
7795       return build_int_cst (TREE_TYPE (TREE_TYPE (fndecl)), result);
7796     }
7797
7798   return NULL_TREE;
7799 }
7800
7801 /* Fold function call to builtin_bswap and the long and long long
7802    variants.  Return NULL_TREE if no simplification can be made.  */
7803 static tree
7804 fold_builtin_bswap (tree fndecl, tree arg)
7805 {
7806   if (! validate_arg (arg, INTEGER_TYPE))
7807     return NULL_TREE;
7808
7809   /* Optimize constant value.  */
7810   if (TREE_CODE (arg) == INTEGER_CST && !TREE_OVERFLOW (arg))
7811     {
7812       HOST_WIDE_INT hi, width, r_hi = 0;
7813       unsigned HOST_WIDE_INT lo, r_lo = 0;
7814       tree type;
7815
7816       type = TREE_TYPE (arg);
7817       width = TYPE_PRECISION (type);
7818       lo = TREE_INT_CST_LOW (arg);
7819       hi = TREE_INT_CST_HIGH (arg);
7820
7821       switch (DECL_FUNCTION_CODE (fndecl))
7822         {
7823           case BUILT_IN_BSWAP32:
7824           case BUILT_IN_BSWAP64:
7825             {
7826               int s;
7827
7828               for (s = 0; s < width; s += 8)
7829                 {
7830                   int d = width - s - 8;
7831                   unsigned HOST_WIDE_INT byte;
7832
7833                   if (s < HOST_BITS_PER_WIDE_INT)
7834                     byte = (lo >> s) & 0xff;
7835                   else
7836                     byte = (hi >> (s - HOST_BITS_PER_WIDE_INT)) & 0xff;
7837
7838                   if (d < HOST_BITS_PER_WIDE_INT)
7839                     r_lo |= byte << d;
7840                   else
7841                     r_hi |= byte << (d - HOST_BITS_PER_WIDE_INT);
7842                 }
7843             }
7844
7845             break;
7846
7847         default:
7848           gcc_unreachable ();
7849         }
7850
7851       if (width < HOST_BITS_PER_WIDE_INT)
7852         return build_int_cst (TREE_TYPE (TREE_TYPE (fndecl)), r_lo);
7853       else
7854         return build_int_cst_wide (TREE_TYPE (TREE_TYPE (fndecl)), r_lo, r_hi);
7855     }
7856
7857   return NULL_TREE;
7858 }
7859
7860 /* A subroutine of fold_builtin to fold the various logarithmic
7861    functions.  Return NULL_TREE if no simplification can me made.
7862    FUNC is the corresponding MPFR logarithm function.  */
7863
7864 static tree
7865 fold_builtin_logarithm (location_t loc, tree fndecl, tree arg,
7866                         int (*func)(mpfr_ptr, mpfr_srcptr, mp_rnd_t))
7867 {
7868   if (validate_arg (arg, REAL_TYPE))
7869     {
7870       tree type = TREE_TYPE (TREE_TYPE (fndecl));
7871       tree res;
7872       const enum built_in_function fcode = builtin_mathfn_code (arg);
7873
7874       /* Calculate the result when the argument is a constant.  */
7875       if ((res = do_mpfr_arg1 (arg, type, func, &dconst0, NULL, false)))
7876         return res;
7877
7878       /* Special case, optimize logN(expN(x)) = x.  */
7879       if (flag_unsafe_math_optimizations
7880           && ((func == mpfr_log
7881                && (fcode == BUILT_IN_EXP
7882                    || fcode == BUILT_IN_EXPF
7883                    || fcode == BUILT_IN_EXPL))
7884               || (func == mpfr_log2
7885                   && (fcode == BUILT_IN_EXP2
7886                       || fcode == BUILT_IN_EXP2F
7887                       || fcode == BUILT_IN_EXP2L))
7888               || (func == mpfr_log10 && (BUILTIN_EXP10_P (fcode)))))
7889         return fold_convert_loc (loc, type, CALL_EXPR_ARG (arg, 0));
7890
7891       /* Optimize logN(func()) for various exponential functions.  We
7892          want to determine the value "x" and the power "exponent" in
7893          order to transform logN(x**exponent) into exponent*logN(x).  */
7894       if (flag_unsafe_math_optimizations)
7895         {
7896           tree exponent = 0, x = 0;
7897
7898           switch (fcode)
7899           {
7900           CASE_FLT_FN (BUILT_IN_EXP):
7901             /* Prepare to do logN(exp(exponent) -> exponent*logN(e).  */
7902             x = build_real (type, real_value_truncate (TYPE_MODE (type),
7903                                                        dconst_e ()));
7904             exponent = CALL_EXPR_ARG (arg, 0);
7905             break;
7906           CASE_FLT_FN (BUILT_IN_EXP2):
7907             /* Prepare to do logN(exp2(exponent) -> exponent*logN(2).  */
7908             x = build_real (type, dconst2);
7909             exponent = CALL_EXPR_ARG (arg, 0);
7910             break;
7911           CASE_FLT_FN (BUILT_IN_EXP10):
7912           CASE_FLT_FN (BUILT_IN_POW10):
7913             /* Prepare to do logN(exp10(exponent) -> exponent*logN(10).  */
7914             {
7915               REAL_VALUE_TYPE dconst10;
7916               real_from_integer (&dconst10, VOIDmode, 10, 0, 0);
7917               x = build_real (type, dconst10);
7918             }
7919             exponent = CALL_EXPR_ARG (arg, 0);
7920             break;
7921           CASE_FLT_FN (BUILT_IN_SQRT):
7922             /* Prepare to do logN(sqrt(x) -> 0.5*logN(x).  */
7923             x = CALL_EXPR_ARG (arg, 0);
7924             exponent = build_real (type, dconsthalf);
7925             break;
7926           CASE_FLT_FN (BUILT_IN_CBRT):
7927             /* Prepare to do logN(cbrt(x) -> (1/3)*logN(x).  */
7928             x = CALL_EXPR_ARG (arg, 0);
7929             exponent = build_real (type, real_value_truncate (TYPE_MODE (type),
7930                                                               dconst_third ()));
7931             break;
7932           CASE_FLT_FN (BUILT_IN_POW):
7933             /* Prepare to do logN(pow(x,exponent) -> exponent*logN(x).  */
7934             x = CALL_EXPR_ARG (arg, 0);
7935             exponent = CALL_EXPR_ARG (arg, 1);
7936             break;
7937           default:
7938             break;
7939           }
7940
7941           /* Now perform the optimization.  */
7942           if (x && exponent)
7943             {
7944               tree logfn = build_call_expr_loc (loc, fndecl, 1, x);
7945               return fold_build2_loc (loc, MULT_EXPR, type, exponent, logfn);
7946             }
7947         }
7948     }
7949
7950   return NULL_TREE;
7951 }
7952
7953 /* Fold a builtin function call to hypot, hypotf, or hypotl.  Return
7954    NULL_TREE if no simplification can be made.  */
7955
7956 static tree
7957 fold_builtin_hypot (location_t loc, tree fndecl,
7958                     tree arg0, tree arg1, tree type)
7959 {
7960   tree res, narg0, narg1;
7961
7962   if (!validate_arg (arg0, REAL_TYPE)
7963       || !validate_arg (arg1, REAL_TYPE))
7964     return NULL_TREE;
7965
7966   /* Calculate the result when the argument is a constant.  */
7967   if ((res = do_mpfr_arg2 (arg0, arg1, type, mpfr_hypot)))
7968     return res;
7969
7970   /* If either argument to hypot has a negate or abs, strip that off.
7971      E.g. hypot(-x,fabs(y)) -> hypot(x,y).  */
7972   narg0 = fold_strip_sign_ops (arg0);
7973   narg1 = fold_strip_sign_ops (arg1);
7974   if (narg0 || narg1)
7975     {
7976       return build_call_expr_loc (loc, fndecl, 2, narg0 ? narg0 : arg0,
7977                               narg1 ? narg1 : arg1);
7978     }
7979
7980   /* If either argument is zero, hypot is fabs of the other.  */
7981   if (real_zerop (arg0))
7982     return fold_build1_loc (loc, ABS_EXPR, type, arg1);
7983   else if (real_zerop (arg1))
7984     return fold_build1_loc (loc, ABS_EXPR, type, arg0);
7985
7986   /* hypot(x,x) -> fabs(x)*sqrt(2).  */
7987   if (flag_unsafe_math_optimizations
7988       && operand_equal_p (arg0, arg1, OEP_PURE_SAME))
7989     {
7990       const REAL_VALUE_TYPE sqrt2_trunc
7991         = real_value_truncate (TYPE_MODE (type), dconst_sqrt2 ());
7992       return fold_build2_loc (loc, MULT_EXPR, type,
7993                           fold_build1_loc (loc, ABS_EXPR, type, arg0),
7994                           build_real (type, sqrt2_trunc));
7995     }
7996
7997   return NULL_TREE;
7998 }
7999
8000
8001 /* Fold a builtin function call to pow, powf, or powl.  Return
8002    NULL_TREE if no simplification can be made.  */
8003 static tree
8004 fold_builtin_pow (location_t loc, tree fndecl, tree arg0, tree arg1, tree type)
8005 {
8006   tree res;
8007
8008   if (!validate_arg (arg0, REAL_TYPE)
8009        || !validate_arg (arg1, REAL_TYPE))
8010     return NULL_TREE;
8011
8012   /* Calculate the result when the argument is a constant.  */
8013   if ((res = do_mpfr_arg2 (arg0, arg1, type, mpfr_pow)))
8014     return res;
8015
8016   /* Optimize pow(1.0,y) = 1.0.  */
8017   if (real_onep (arg0))
8018     return omit_one_operand_loc (loc, type, build_real (type, dconst1), arg1);
8019
8020   if (TREE_CODE (arg1) == REAL_CST
8021       && !TREE_OVERFLOW (arg1))
8022     {
8023       REAL_VALUE_TYPE cint;
8024       REAL_VALUE_TYPE c;
8025       HOST_WIDE_INT n;
8026
8027       c = TREE_REAL_CST (arg1);
8028
8029       /* Optimize pow(x,0.0) = 1.0.  */
8030       if (REAL_VALUES_EQUAL (c, dconst0))
8031         return omit_one_operand_loc (loc, type, build_real (type, dconst1),
8032                                  arg0);
8033
8034       /* Optimize pow(x,1.0) = x.  */
8035       if (REAL_VALUES_EQUAL (c, dconst1))
8036         return arg0;
8037
8038       /* Optimize pow(x,-1.0) = 1.0/x.  */
8039       if (REAL_VALUES_EQUAL (c, dconstm1))
8040         return fold_build2_loc (loc, RDIV_EXPR, type,
8041                             build_real (type, dconst1), arg0);
8042
8043       /* Optimize pow(x,0.5) = sqrt(x).  */
8044       if (flag_unsafe_math_optimizations
8045           && REAL_VALUES_EQUAL (c, dconsthalf))
8046         {
8047           tree sqrtfn = mathfn_built_in (type, BUILT_IN_SQRT);
8048
8049           if (sqrtfn != NULL_TREE)
8050             return build_call_expr_loc (loc, sqrtfn, 1, arg0);
8051         }
8052
8053       /* Optimize pow(x,1.0/3.0) = cbrt(x).  */
8054       if (flag_unsafe_math_optimizations)
8055         {
8056           const REAL_VALUE_TYPE dconstroot
8057             = real_value_truncate (TYPE_MODE (type), dconst_third ());
8058
8059           if (REAL_VALUES_EQUAL (c, dconstroot))
8060             {
8061               tree cbrtfn = mathfn_built_in (type, BUILT_IN_CBRT);
8062               if (cbrtfn != NULL_TREE)
8063                 return build_call_expr_loc (loc, cbrtfn, 1, arg0);
8064             }
8065         }
8066
8067       /* Check for an integer exponent.  */
8068       n = real_to_integer (&c);
8069       real_from_integer (&cint, VOIDmode, n, n < 0 ? -1 : 0, 0);
8070       if (real_identical (&c, &cint))
8071         {
8072           /* Attempt to evaluate pow at compile-time, unless this should
8073              raise an exception.  */
8074           if (TREE_CODE (arg0) == REAL_CST
8075               && !TREE_OVERFLOW (arg0)
8076               && (n > 0
8077                   || (!flag_trapping_math && !flag_errno_math)
8078                   || !REAL_VALUES_EQUAL (TREE_REAL_CST (arg0), dconst0)))
8079             {
8080               REAL_VALUE_TYPE x;
8081               bool inexact;
8082
8083               x = TREE_REAL_CST (arg0);
8084               inexact = real_powi (&x, TYPE_MODE (type), &x, n);
8085               if (flag_unsafe_math_optimizations || !inexact)
8086                 return build_real (type, x);
8087             }
8088
8089           /* Strip sign ops from even integer powers.  */
8090           if ((n & 1) == 0 && flag_unsafe_math_optimizations)
8091             {
8092               tree narg0 = fold_strip_sign_ops (arg0);
8093               if (narg0)
8094                 return build_call_expr_loc (loc, fndecl, 2, narg0, arg1);
8095             }
8096         }
8097     }
8098
8099   if (flag_unsafe_math_optimizations)
8100     {
8101       const enum built_in_function fcode = builtin_mathfn_code (arg0);
8102
8103       /* Optimize pow(expN(x),y) = expN(x*y).  */
8104       if (BUILTIN_EXPONENT_P (fcode))
8105         {
8106           tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
8107           tree arg = CALL_EXPR_ARG (arg0, 0);
8108           arg = fold_build2_loc (loc, MULT_EXPR, type, arg, arg1);
8109           return build_call_expr_loc (loc, expfn, 1, arg);
8110         }
8111
8112       /* Optimize pow(sqrt(x),y) = pow(x,y*0.5).  */
8113       if (BUILTIN_SQRT_P (fcode))
8114         {
8115           tree narg0 = CALL_EXPR_ARG (arg0, 0);
8116           tree narg1 = fold_build2_loc (loc, MULT_EXPR, type, arg1,
8117                                     build_real (type, dconsthalf));
8118           return build_call_expr_loc (loc, fndecl, 2, narg0, narg1);
8119         }
8120
8121       /* Optimize pow(cbrt(x),y) = pow(x,y/3) iff x is nonnegative.  */
8122       if (BUILTIN_CBRT_P (fcode))
8123         {
8124           tree arg = CALL_EXPR_ARG (arg0, 0);
8125           if (tree_expr_nonnegative_p (arg))
8126             {
8127               const REAL_VALUE_TYPE dconstroot
8128                 = real_value_truncate (TYPE_MODE (type), dconst_third ());
8129               tree narg1 = fold_build2_loc (loc, MULT_EXPR, type, arg1,
8130                                         build_real (type, dconstroot));
8131               return build_call_expr_loc (loc, fndecl, 2, arg, narg1);
8132             }
8133         }
8134
8135       /* Optimize pow(pow(x,y),z) = pow(x,y*z) iff x is nonnegative.  */
8136       if (fcode == BUILT_IN_POW
8137           || fcode == BUILT_IN_POWF
8138           || fcode == BUILT_IN_POWL)
8139         {
8140           tree arg00 = CALL_EXPR_ARG (arg0, 0);
8141           if (tree_expr_nonnegative_p (arg00))
8142             {
8143               tree arg01 = CALL_EXPR_ARG (arg0, 1);
8144               tree narg1 = fold_build2_loc (loc, MULT_EXPR, type, arg01, arg1);
8145               return build_call_expr_loc (loc, fndecl, 2, arg00, narg1);
8146             }
8147         }
8148     }
8149
8150   return NULL_TREE;
8151 }
8152
8153 /* Fold a builtin function call to powi, powif, or powil with argument ARG.
8154    Return NULL_TREE if no simplification can be made.  */
8155 static tree
8156 fold_builtin_powi (location_t loc, tree fndecl ATTRIBUTE_UNUSED,
8157                    tree arg0, tree arg1, tree type)
8158 {
8159   if (!validate_arg (arg0, REAL_TYPE)
8160       || !validate_arg (arg1, INTEGER_TYPE))
8161     return NULL_TREE;
8162
8163   /* Optimize pow(1.0,y) = 1.0.  */
8164   if (real_onep (arg0))
8165     return omit_one_operand_loc (loc, type, build_real (type, dconst1), arg1);
8166
8167   if (host_integerp (arg1, 0))
8168     {
8169       HOST_WIDE_INT c = TREE_INT_CST_LOW (arg1);
8170
8171       /* Evaluate powi at compile-time.  */
8172       if (TREE_CODE (arg0) == REAL_CST
8173           && !TREE_OVERFLOW (arg0))
8174         {
8175           REAL_VALUE_TYPE x;
8176           x = TREE_REAL_CST (arg0);
8177           real_powi (&x, TYPE_MODE (type), &x, c);
8178           return build_real (type, x);
8179         }
8180
8181       /* Optimize pow(x,0) = 1.0.  */
8182       if (c == 0)
8183         return omit_one_operand_loc (loc, type, build_real (type, dconst1),
8184                                  arg0);
8185
8186       /* Optimize pow(x,1) = x.  */
8187       if (c == 1)
8188         return arg0;
8189
8190       /* Optimize pow(x,-1) = 1.0/x.  */
8191       if (c == -1)
8192         return fold_build2_loc (loc, RDIV_EXPR, type,
8193                            build_real (type, dconst1), arg0);
8194     }
8195
8196   return NULL_TREE;
8197 }
8198
8199 /* A subroutine of fold_builtin to fold the various exponent
8200    functions.  Return NULL_TREE if no simplification can be made.
8201    FUNC is the corresponding MPFR exponent function.  */
8202
8203 static tree
8204 fold_builtin_exponent (location_t loc, tree fndecl, tree arg,
8205                        int (*func)(mpfr_ptr, mpfr_srcptr, mp_rnd_t))
8206 {
8207   if (validate_arg (arg, REAL_TYPE))
8208     {
8209       tree type = TREE_TYPE (TREE_TYPE (fndecl));
8210       tree res;
8211
8212       /* Calculate the result when the argument is a constant.  */
8213       if ((res = do_mpfr_arg1 (arg, type, func, NULL, NULL, 0)))
8214         return res;
8215
8216       /* Optimize expN(logN(x)) = x.  */
8217       if (flag_unsafe_math_optimizations)
8218         {
8219           const enum built_in_function fcode = builtin_mathfn_code (arg);
8220
8221           if ((func == mpfr_exp
8222                && (fcode == BUILT_IN_LOG
8223                    || fcode == BUILT_IN_LOGF
8224                    || fcode == BUILT_IN_LOGL))
8225               || (func == mpfr_exp2
8226                   && (fcode == BUILT_IN_LOG2
8227                       || fcode == BUILT_IN_LOG2F
8228                       || fcode == BUILT_IN_LOG2L))
8229               || (func == mpfr_exp10
8230                   && (fcode == BUILT_IN_LOG10
8231                       || fcode == BUILT_IN_LOG10F
8232                       || fcode == BUILT_IN_LOG10L)))
8233             return fold_convert_loc (loc, type, CALL_EXPR_ARG (arg, 0));
8234         }
8235     }
8236
8237   return NULL_TREE;
8238 }
8239
8240 /* Return true if VAR is a VAR_DECL or a component thereof.  */
8241
8242 static bool
8243 var_decl_component_p (tree var)
8244 {
8245   tree inner = var;
8246   while (handled_component_p (inner))
8247     inner = TREE_OPERAND (inner, 0);
8248   return SSA_VAR_P (inner);
8249 }
8250
8251 /* Fold function call to builtin memset.  Return
8252    NULL_TREE if no simplification can be made.  */
8253
8254 static tree
8255 fold_builtin_memset (location_t loc, tree dest, tree c, tree len,
8256                      tree type, bool ignore)
8257 {
8258   tree var, ret, etype;
8259   unsigned HOST_WIDE_INT length, cval;
8260
8261   if (! validate_arg (dest, POINTER_TYPE)
8262       || ! validate_arg (c, INTEGER_TYPE)
8263       || ! validate_arg (len, INTEGER_TYPE))
8264     return NULL_TREE;
8265
8266   if (! host_integerp (len, 1))
8267     return NULL_TREE;
8268
8269   /* If the LEN parameter is zero, return DEST.  */
8270   if (integer_zerop (len))
8271     return omit_one_operand_loc (loc, type, dest, c);
8272
8273   if (TREE_CODE (c) != INTEGER_CST || TREE_SIDE_EFFECTS (dest))
8274     return NULL_TREE;
8275
8276   var = dest;
8277   STRIP_NOPS (var);
8278   if (TREE_CODE (var) != ADDR_EXPR)
8279     return NULL_TREE;
8280
8281   var = TREE_OPERAND (var, 0);
8282   if (TREE_THIS_VOLATILE (var))
8283     return NULL_TREE;
8284
8285   etype = TREE_TYPE (var);
8286   if (TREE_CODE (etype) == ARRAY_TYPE)
8287     etype = TREE_TYPE (etype);
8288
8289   if (!INTEGRAL_TYPE_P (etype)
8290       && !POINTER_TYPE_P (etype))
8291     return NULL_TREE;
8292
8293   if (! var_decl_component_p (var))
8294     return NULL_TREE;
8295
8296   length = tree_low_cst (len, 1);
8297   if (GET_MODE_SIZE (TYPE_MODE (etype)) != length
8298       || get_pointer_alignment (dest, BIGGEST_ALIGNMENT) / BITS_PER_UNIT
8299          < length)
8300     return NULL_TREE;
8301
8302   if (length > HOST_BITS_PER_WIDE_INT / BITS_PER_UNIT)
8303     return NULL_TREE;
8304
8305   if (integer_zerop (c))
8306     cval = 0;
8307   else
8308     {
8309       if (CHAR_BIT != 8 || BITS_PER_UNIT != 8 || HOST_BITS_PER_WIDE_INT > 64)
8310         return NULL_TREE;
8311
8312       cval = TREE_INT_CST_LOW (c);
8313       cval &= 0xff;
8314       cval |= cval << 8;
8315       cval |= cval << 16;
8316       cval |= (cval << 31) << 1;
8317     }
8318
8319   ret = build_int_cst_type (etype, cval);
8320   var = build_fold_indirect_ref_loc (loc,
8321                                  fold_convert_loc (loc,
8322                                                    build_pointer_type (etype),
8323                                                    dest));
8324   ret = build2 (MODIFY_EXPR, etype, var, ret);
8325   if (ignore)
8326     return ret;
8327
8328   return omit_one_operand_loc (loc, type, dest, ret);
8329 }
8330
8331 /* Fold function call to builtin memset.  Return
8332    NULL_TREE if no simplification can be made.  */
8333
8334 static tree
8335 fold_builtin_bzero (location_t loc, tree dest, tree size, bool ignore)
8336 {
8337   if (! validate_arg (dest, POINTER_TYPE)
8338       || ! validate_arg (size, INTEGER_TYPE))
8339     return NULL_TREE;
8340
8341   if (!ignore)
8342     return NULL_TREE;
8343
8344   /* New argument list transforming bzero(ptr x, int y) to
8345      memset(ptr x, int 0, size_t y).   This is done this way
8346      so that if it isn't expanded inline, we fallback to
8347      calling bzero instead of memset.  */
8348
8349   return fold_builtin_memset (loc, dest, integer_zero_node,
8350                               fold_convert_loc (loc, sizetype, size),
8351                               void_type_node, ignore);
8352 }
8353
8354 /* Fold function call to builtin mem{{,p}cpy,move}.  Return
8355    NULL_TREE if no simplification can be made.
8356    If ENDP is 0, return DEST (like memcpy).
8357    If ENDP is 1, return DEST+LEN (like mempcpy).
8358    If ENDP is 2, return DEST+LEN-1 (like stpcpy).
8359    If ENDP is 3, return DEST, additionally *SRC and *DEST may overlap
8360    (memmove).   */
8361
8362 static tree
8363 fold_builtin_memory_op (location_t loc, tree dest, tree src,
8364                         tree len, tree type, bool ignore, int endp)
8365 {
8366   tree destvar, srcvar, expr;
8367
8368   if (! validate_arg (dest, POINTER_TYPE)
8369       || ! validate_arg (src, POINTER_TYPE)
8370       || ! validate_arg (len, INTEGER_TYPE))
8371     return NULL_TREE;
8372
8373   /* If the LEN parameter is zero, return DEST.  */
8374   if (integer_zerop (len))
8375     return omit_one_operand_loc (loc, type, dest, src);
8376
8377   /* If SRC and DEST are the same (and not volatile), return
8378      DEST{,+LEN,+LEN-1}.  */
8379   if (operand_equal_p (src, dest, 0))
8380     expr = len;
8381   else
8382     {
8383       tree srctype, desttype;
8384       unsigned int src_align, dest_align;
8385       tree off0;
8386
8387       if (endp == 3)
8388         {
8389           src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
8390           dest_align = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
8391
8392           /* Both DEST and SRC must be pointer types.
8393              ??? This is what old code did.  Is the testing for pointer types
8394              really mandatory?
8395
8396              If either SRC is readonly or length is 1, we can use memcpy.  */
8397           if (!dest_align || !src_align)
8398             return NULL_TREE;
8399           if (readonly_data_expr (src)
8400               || (host_integerp (len, 1)
8401                   && (MIN (src_align, dest_align) / BITS_PER_UNIT
8402                       >= (unsigned HOST_WIDE_INT) tree_low_cst (len, 1))))
8403             {
8404               tree fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
8405               if (!fn)
8406                 return NULL_TREE;
8407               return build_call_expr_loc (loc, fn, 3, dest, src, len);
8408             }
8409
8410           /* If *src and *dest can't overlap, optimize into memcpy as well.  */
8411           if (TREE_CODE (src) == ADDR_EXPR
8412               && TREE_CODE (dest) == ADDR_EXPR)
8413             {
8414               tree src_base, dest_base, fn;
8415               HOST_WIDE_INT src_offset = 0, dest_offset = 0;
8416               HOST_WIDE_INT size = -1;
8417               HOST_WIDE_INT maxsize = -1;
8418
8419               srcvar = TREE_OPERAND (src, 0);
8420               src_base = get_ref_base_and_extent (srcvar, &src_offset,
8421                                                   &size, &maxsize);
8422               destvar = TREE_OPERAND (dest, 0);
8423               dest_base = get_ref_base_and_extent (destvar, &dest_offset,
8424                                                    &size, &maxsize);
8425               if (host_integerp (len, 1))
8426                 maxsize = tree_low_cst (len, 1);
8427               else
8428                 maxsize = -1;
8429               src_offset /= BITS_PER_UNIT;
8430               dest_offset /= BITS_PER_UNIT;
8431               if (SSA_VAR_P (src_base)
8432                   && SSA_VAR_P (dest_base))
8433                 {
8434                   if (operand_equal_p (src_base, dest_base, 0)
8435                       && ranges_overlap_p (src_offset, maxsize,
8436                                            dest_offset, maxsize))
8437                     return NULL_TREE;
8438                 }
8439               else if (TREE_CODE (src_base) == MEM_REF
8440                        && TREE_CODE (dest_base) == MEM_REF)
8441                 {
8442                   double_int off;
8443                   if (! operand_equal_p (TREE_OPERAND (src_base, 0),
8444                                          TREE_OPERAND (dest_base, 0), 0))
8445                     return NULL_TREE;
8446                   off = double_int_add (mem_ref_offset (src_base),
8447                                         shwi_to_double_int (src_offset));
8448                   if (!double_int_fits_in_shwi_p (off))
8449                     return NULL_TREE;
8450                   src_offset = off.low;
8451                   off = double_int_add (mem_ref_offset (dest_base),
8452                                         shwi_to_double_int (dest_offset));
8453                   if (!double_int_fits_in_shwi_p (off))
8454                     return NULL_TREE;
8455                   dest_offset = off.low;
8456                   if (ranges_overlap_p (src_offset, maxsize,
8457                                         dest_offset, maxsize))
8458                     return NULL_TREE;
8459                 }
8460               else
8461                 return NULL_TREE;
8462
8463               fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
8464               if (!fn)
8465                 return NULL_TREE;
8466               return build_call_expr_loc (loc, fn, 3, dest, src, len);
8467             }
8468
8469           /* If the destination and source do not alias optimize into
8470              memcpy as well.  */
8471           if ((is_gimple_min_invariant (dest)
8472                || TREE_CODE (dest) == SSA_NAME)
8473               && (is_gimple_min_invariant (src)
8474                   || TREE_CODE (src) == SSA_NAME))
8475             {
8476               ao_ref destr, srcr;
8477               ao_ref_init_from_ptr_and_size (&destr, dest, len);
8478               ao_ref_init_from_ptr_and_size (&srcr, src, len);
8479               if (!refs_may_alias_p_1 (&destr, &srcr, false))
8480                 {
8481                   tree fn;
8482                   fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
8483                   if (!fn)
8484                     return NULL_TREE;
8485                   return build_call_expr_loc (loc, fn, 3, dest, src, len);
8486                 }
8487             }
8488
8489           return NULL_TREE;
8490         }
8491
8492       if (!host_integerp (len, 0))
8493         return NULL_TREE;
8494       /* FIXME:
8495          This logic lose for arguments like (type *)malloc (sizeof (type)),
8496          since we strip the casts of up to VOID return value from malloc.
8497          Perhaps we ought to inherit type from non-VOID argument here?  */
8498       STRIP_NOPS (src);
8499       STRIP_NOPS (dest);
8500       /* As we fold (void *)(p + CST) to (void *)p + CST undo this here.  */
8501       if (TREE_CODE (src) == POINTER_PLUS_EXPR)
8502         {
8503           tree tem = TREE_OPERAND (src, 0);
8504           STRIP_NOPS (tem);
8505           if (tem != TREE_OPERAND (src, 0))
8506             src = build1 (NOP_EXPR, TREE_TYPE (tem), src);
8507         }
8508       if (TREE_CODE (dest) == POINTER_PLUS_EXPR)
8509         {
8510           tree tem = TREE_OPERAND (dest, 0);
8511           STRIP_NOPS (tem);
8512           if (tem != TREE_OPERAND (dest, 0))
8513             dest = build1 (NOP_EXPR, TREE_TYPE (tem), dest);
8514         }
8515       srctype = TREE_TYPE (TREE_TYPE (src));
8516       if (srctype
8517           && TREE_CODE (srctype) == ARRAY_TYPE
8518           && !tree_int_cst_equal (TYPE_SIZE_UNIT (srctype), len))
8519         {
8520           srctype = TREE_TYPE (srctype);
8521           STRIP_NOPS (src);
8522           src = build1 (NOP_EXPR, build_pointer_type (srctype), src);
8523         }
8524       desttype = TREE_TYPE (TREE_TYPE (dest));
8525       if (desttype
8526           && TREE_CODE (desttype) == ARRAY_TYPE
8527           && !tree_int_cst_equal (TYPE_SIZE_UNIT (desttype), len))
8528         {
8529           desttype = TREE_TYPE (desttype);
8530           STRIP_NOPS (dest);
8531           dest = build1 (NOP_EXPR, build_pointer_type (desttype), dest);
8532         }
8533       if (!srctype || !desttype
8534           || TREE_ADDRESSABLE (srctype)
8535           || TREE_ADDRESSABLE (desttype)
8536           || !TYPE_SIZE_UNIT (srctype)
8537           || !TYPE_SIZE_UNIT (desttype)
8538           || TREE_CODE (TYPE_SIZE_UNIT (srctype)) != INTEGER_CST
8539           || TREE_CODE (TYPE_SIZE_UNIT (desttype)) != INTEGER_CST)
8540         return NULL_TREE;
8541
8542       src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
8543       dest_align = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
8544       if (dest_align < TYPE_ALIGN (desttype)
8545           || src_align < TYPE_ALIGN (srctype))
8546         return NULL_TREE;
8547
8548       if (!ignore)
8549         dest = builtin_save_expr (dest);
8550
8551       /* Build accesses at offset zero with a ref-all character type.  */
8552       off0 = build_int_cst (build_pointer_type_for_mode (char_type_node,
8553                                                          ptr_mode, true), 0);
8554
8555       destvar = dest;
8556       STRIP_NOPS (destvar);
8557       if (TREE_CODE (destvar) == ADDR_EXPR
8558           && var_decl_component_p (TREE_OPERAND (destvar, 0))
8559           && tree_int_cst_equal (TYPE_SIZE_UNIT (desttype), len))
8560         destvar = fold_build2 (MEM_REF, desttype, destvar, off0);
8561       else
8562         destvar = NULL_TREE;
8563
8564       srcvar = src;
8565       STRIP_NOPS (srcvar);
8566       if (TREE_CODE (srcvar) == ADDR_EXPR
8567           && var_decl_component_p (TREE_OPERAND (srcvar, 0))
8568           && tree_int_cst_equal (TYPE_SIZE_UNIT (srctype), len))
8569         {
8570           if (!destvar
8571               || src_align >= TYPE_ALIGN (desttype))
8572             srcvar = fold_build2 (MEM_REF, destvar ? desttype : srctype,
8573                                   srcvar, off0);
8574           else if (!STRICT_ALIGNMENT)
8575             {
8576               srctype = build_aligned_type (TYPE_MAIN_VARIANT (desttype),
8577                                             src_align);
8578               srcvar = fold_build2 (MEM_REF, srctype, srcvar, off0);
8579             }
8580           else
8581             srcvar = NULL_TREE;
8582         }
8583       else
8584         srcvar = NULL_TREE;
8585
8586       if (srcvar == NULL_TREE && destvar == NULL_TREE)
8587         return NULL_TREE;
8588
8589       if (srcvar == NULL_TREE)
8590         {
8591           STRIP_NOPS (src);
8592           if (src_align >= TYPE_ALIGN (desttype))
8593             srcvar = fold_build2 (MEM_REF, desttype, src, off0);
8594           else
8595             {
8596               if (STRICT_ALIGNMENT)
8597                 return NULL_TREE;
8598               srctype = build_aligned_type (TYPE_MAIN_VARIANT (desttype),
8599                                             src_align);
8600               srcvar = fold_build2 (MEM_REF, srctype, src, off0);
8601             }
8602         }
8603       else if (destvar == NULL_TREE)
8604         {
8605           STRIP_NOPS (dest);
8606           if (dest_align >= TYPE_ALIGN (srctype))
8607             destvar = fold_build2 (MEM_REF, srctype, dest, off0);
8608           else
8609             {
8610               if (STRICT_ALIGNMENT)
8611                 return NULL_TREE;
8612               desttype = build_aligned_type (TYPE_MAIN_VARIANT (srctype),
8613                                              dest_align);
8614               destvar = fold_build2 (MEM_REF, desttype, dest, off0);
8615             }
8616         }
8617
8618       expr = build2 (MODIFY_EXPR, TREE_TYPE (destvar), destvar, srcvar);
8619     }
8620
8621   if (ignore)
8622     return expr;
8623
8624   if (endp == 0 || endp == 3)
8625     return omit_one_operand_loc (loc, type, dest, expr);
8626
8627   if (expr == len)
8628     expr = NULL_TREE;
8629
8630   if (endp == 2)
8631     len = fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (len), len,
8632                        ssize_int (1));
8633
8634   len = fold_convert_loc (loc, sizetype, len);
8635   dest = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len);
8636   dest = fold_convert_loc (loc, type, dest);
8637   if (expr)
8638     dest = omit_one_operand_loc (loc, type, dest, expr);
8639   return dest;
8640 }
8641
8642 /* Fold function call to builtin strcpy with arguments DEST and SRC.
8643    If LEN is not NULL, it represents the length of the string to be
8644    copied.  Return NULL_TREE if no simplification can be made.  */
8645
8646 tree
8647 fold_builtin_strcpy (location_t loc, tree fndecl, tree dest, tree src, tree len)
8648 {
8649   tree fn;
8650
8651   if (!validate_arg (dest, POINTER_TYPE)
8652       || !validate_arg (src, POINTER_TYPE))
8653     return NULL_TREE;
8654
8655   /* If SRC and DEST are the same (and not volatile), return DEST.  */
8656   if (operand_equal_p (src, dest, 0))
8657     return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest);
8658
8659   if (optimize_function_for_size_p (cfun))
8660     return NULL_TREE;
8661
8662   fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
8663   if (!fn)
8664     return NULL_TREE;
8665
8666   if (!len)
8667     {
8668       len = c_strlen (src, 1);
8669       if (! len || TREE_SIDE_EFFECTS (len))
8670         return NULL_TREE;
8671     }
8672
8673   len = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
8674   return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)),
8675                            build_call_expr_loc (loc, fn, 3, dest, src, len));
8676 }
8677
8678 /* Fold function call to builtin stpcpy with arguments DEST and SRC.
8679    Return NULL_TREE if no simplification can be made.  */
8680
8681 static tree
8682 fold_builtin_stpcpy (location_t loc, tree fndecl, tree dest, tree src)
8683 {
8684   tree fn, len, lenp1, call, type;
8685
8686   if (!validate_arg (dest, POINTER_TYPE)
8687       || !validate_arg (src, POINTER_TYPE))
8688     return NULL_TREE;
8689
8690   len = c_strlen (src, 1);
8691   if (!len
8692       || TREE_CODE (len) != INTEGER_CST)
8693     return NULL_TREE;
8694
8695   if (optimize_function_for_size_p (cfun)
8696       /* If length is zero it's small enough.  */
8697       && !integer_zerop (len))
8698     return NULL_TREE;
8699
8700   fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
8701   if (!fn)
8702     return NULL_TREE;
8703
8704   lenp1 = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
8705   /* We use dest twice in building our expression.  Save it from
8706      multiple expansions.  */
8707   dest = builtin_save_expr (dest);
8708   call = build_call_expr_loc (loc, fn, 3, dest, src, lenp1);
8709
8710   type = TREE_TYPE (TREE_TYPE (fndecl));
8711   len = fold_convert_loc (loc, sizetype, len);
8712   dest = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len);
8713   dest = fold_convert_loc (loc, type, dest);
8714   dest = omit_one_operand_loc (loc, type, dest, call);
8715   return dest;
8716 }
8717
8718 /* Fold function call to builtin strncpy with arguments DEST, SRC, and LEN.
8719    If SLEN is not NULL, it represents the length of the source string.
8720    Return NULL_TREE if no simplification can be made.  */
8721
8722 tree
8723 fold_builtin_strncpy (location_t loc, tree fndecl, tree dest,
8724                       tree src, tree len, tree slen)
8725 {
8726   tree fn;
8727
8728   if (!validate_arg (dest, POINTER_TYPE)
8729       || !validate_arg (src, POINTER_TYPE)
8730       || !validate_arg (len, INTEGER_TYPE))
8731     return NULL_TREE;
8732
8733   /* If the LEN parameter is zero, return DEST.  */
8734   if (integer_zerop (len))
8735     return omit_one_operand_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest, src);
8736
8737   /* We can't compare slen with len as constants below if len is not a
8738      constant.  */
8739   if (len == 0 || TREE_CODE (len) != INTEGER_CST)
8740     return NULL_TREE;
8741
8742   if (!slen)
8743     slen = c_strlen (src, 1);
8744
8745   /* Now, we must be passed a constant src ptr parameter.  */
8746   if (slen == 0 || TREE_CODE (slen) != INTEGER_CST)
8747     return NULL_TREE;
8748
8749   slen = size_binop_loc (loc, PLUS_EXPR, slen, ssize_int (1));
8750
8751   /* We do not support simplification of this case, though we do
8752      support it when expanding trees into RTL.  */
8753   /* FIXME: generate a call to __builtin_memset.  */
8754   if (tree_int_cst_lt (slen, len))
8755     return NULL_TREE;
8756
8757   /* OK transform into builtin memcpy.  */
8758   fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
8759   if (!fn)
8760     return NULL_TREE;
8761   return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)),
8762                            build_call_expr_loc (loc, fn, 3, dest, src, len));
8763 }
8764
8765 /* Fold function call to builtin memchr.  ARG1, ARG2 and LEN are the
8766    arguments to the call, and TYPE is its return type.
8767    Return NULL_TREE if no simplification can be made.  */
8768
8769 static tree
8770 fold_builtin_memchr (location_t loc, tree arg1, tree arg2, tree len, tree type)
8771 {
8772   if (!validate_arg (arg1, POINTER_TYPE)
8773       || !validate_arg (arg2, INTEGER_TYPE)
8774       || !validate_arg (len, INTEGER_TYPE))
8775     return NULL_TREE;
8776   else
8777     {
8778       const char *p1;
8779
8780       if (TREE_CODE (arg2) != INTEGER_CST
8781           || !host_integerp (len, 1))
8782         return NULL_TREE;
8783
8784       p1 = c_getstr (arg1);
8785       if (p1 && compare_tree_int (len, strlen (p1) + 1) <= 0)
8786         {
8787           char c;
8788           const char *r;
8789           tree tem;
8790
8791           if (target_char_cast (arg2, &c))
8792             return NULL_TREE;
8793
8794           r = (char *) memchr (p1, c, tree_low_cst (len, 1));
8795
8796           if (r == NULL)
8797             return build_int_cst (TREE_TYPE (arg1), 0);
8798
8799           tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (arg1), arg1,
8800                              size_int (r - p1));
8801           return fold_convert_loc (loc, type, tem);
8802         }
8803       return NULL_TREE;
8804     }
8805 }
8806
8807 /* Fold function call to builtin memcmp with arguments ARG1 and ARG2.
8808    Return NULL_TREE if no simplification can be made.  */
8809
8810 static tree
8811 fold_builtin_memcmp (location_t loc, tree arg1, tree arg2, tree len)
8812 {
8813   const char *p1, *p2;
8814
8815   if (!validate_arg (arg1, POINTER_TYPE)
8816       || !validate_arg (arg2, POINTER_TYPE)
8817       || !validate_arg (len, INTEGER_TYPE))
8818     return NULL_TREE;
8819
8820   /* If the LEN parameter is zero, return zero.  */
8821   if (integer_zerop (len))
8822     return omit_two_operands_loc (loc, integer_type_node, integer_zero_node,
8823                               arg1, arg2);
8824
8825   /* If ARG1 and ARG2 are the same (and not volatile), return zero.  */
8826   if (operand_equal_p (arg1, arg2, 0))
8827     return omit_one_operand_loc (loc, integer_type_node, integer_zero_node, len);
8828
8829   p1 = c_getstr (arg1);
8830   p2 = c_getstr (arg2);
8831
8832   /* If all arguments are constant, and the value of len is not greater
8833      than the lengths of arg1 and arg2, evaluate at compile-time.  */
8834   if (host_integerp (len, 1) && p1 && p2
8835       && compare_tree_int (len, strlen (p1) + 1) <= 0
8836       && compare_tree_int (len, strlen (p2) + 1) <= 0)
8837     {
8838       const int r = memcmp (p1, p2, tree_low_cst (len, 1));
8839
8840       if (r > 0)
8841         return integer_one_node;
8842       else if (r < 0)
8843         return integer_minus_one_node;
8844       else
8845         return integer_zero_node;
8846     }
8847
8848   /* If len parameter is one, return an expression corresponding to
8849      (*(const unsigned char*)arg1 - (const unsigned char*)arg2).  */
8850   if (host_integerp (len, 1) && tree_low_cst (len, 1) == 1)
8851     {
8852       tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
8853       tree cst_uchar_ptr_node
8854         = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
8855
8856       tree ind1
8857         = fold_convert_loc (loc, integer_type_node,
8858                             build1 (INDIRECT_REF, cst_uchar_node,
8859                                     fold_convert_loc (loc,
8860                                                       cst_uchar_ptr_node,
8861                                                       arg1)));
8862       tree ind2
8863         = fold_convert_loc (loc, integer_type_node,
8864                             build1 (INDIRECT_REF, cst_uchar_node,
8865                                     fold_convert_loc (loc,
8866                                                       cst_uchar_ptr_node,
8867                                                       arg2)));
8868       return fold_build2_loc (loc, MINUS_EXPR, integer_type_node, ind1, ind2);
8869     }
8870
8871   return NULL_TREE;
8872 }
8873
8874 /* Fold function call to builtin strcmp with arguments ARG1 and ARG2.
8875    Return NULL_TREE if no simplification can be made.  */
8876
8877 static tree
8878 fold_builtin_strcmp (location_t loc, tree arg1, tree arg2)
8879 {
8880   const char *p1, *p2;
8881
8882   if (!validate_arg (arg1, POINTER_TYPE)
8883       || !validate_arg (arg2, POINTER_TYPE))
8884     return NULL_TREE;
8885
8886   /* If ARG1 and ARG2 are the same (and not volatile), return zero.  */
8887   if (operand_equal_p (arg1, arg2, 0))
8888     return integer_zero_node;
8889
8890   p1 = c_getstr (arg1);
8891   p2 = c_getstr (arg2);
8892
8893   if (p1 && p2)
8894     {
8895       const int i = strcmp (p1, p2);
8896       if (i < 0)
8897         return integer_minus_one_node;
8898       else if (i > 0)
8899         return integer_one_node;
8900       else
8901         return integer_zero_node;
8902     }
8903
8904   /* If the second arg is "", return *(const unsigned char*)arg1.  */
8905   if (p2 && *p2 == '\0')
8906     {
8907       tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
8908       tree cst_uchar_ptr_node
8909         = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
8910
8911       return fold_convert_loc (loc, integer_type_node,
8912                                build1 (INDIRECT_REF, cst_uchar_node,
8913                                        fold_convert_loc (loc,
8914                                                          cst_uchar_ptr_node,
8915                                                          arg1)));
8916     }
8917
8918   /* If the first arg is "", return -*(const unsigned char*)arg2.  */
8919   if (p1 && *p1 == '\0')
8920     {
8921       tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
8922       tree cst_uchar_ptr_node
8923         = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
8924
8925       tree temp
8926         = fold_convert_loc (loc, integer_type_node,
8927                             build1 (INDIRECT_REF, cst_uchar_node,
8928                                     fold_convert_loc (loc,
8929                                                       cst_uchar_ptr_node,
8930                                                       arg2)));
8931       return fold_build1_loc (loc, NEGATE_EXPR, integer_type_node, temp);
8932     }
8933
8934   return NULL_TREE;
8935 }
8936
8937 /* Fold function call to builtin strncmp with arguments ARG1, ARG2, and LEN.
8938    Return NULL_TREE if no simplification can be made.  */
8939
8940 static tree
8941 fold_builtin_strncmp (location_t loc, tree arg1, tree arg2, tree len)
8942 {
8943   const char *p1, *p2;
8944
8945   if (!validate_arg (arg1, POINTER_TYPE)
8946       || !validate_arg (arg2, POINTER_TYPE)
8947       || !validate_arg (len, INTEGER_TYPE))
8948     return NULL_TREE;
8949
8950   /* If the LEN parameter is zero, return zero.  */
8951   if (integer_zerop (len))
8952     return omit_two_operands_loc (loc, integer_type_node, integer_zero_node,
8953                               arg1, arg2);
8954
8955   /* If ARG1 and ARG2 are the same (and not volatile), return zero.  */
8956   if (operand_equal_p (arg1, arg2, 0))
8957     return omit_one_operand_loc (loc, integer_type_node, integer_zero_node, len);
8958
8959   p1 = c_getstr (arg1);
8960   p2 = c_getstr (arg2);
8961
8962   if (host_integerp (len, 1) && p1 && p2)
8963     {
8964       const int i = strncmp (p1, p2, tree_low_cst (len, 1));
8965       if (i > 0)
8966         return integer_one_node;
8967       else if (i < 0)
8968         return integer_minus_one_node;
8969       else
8970         return integer_zero_node;
8971     }
8972
8973   /* If the second arg is "", and the length is greater than zero,
8974      return *(const unsigned char*)arg1.  */
8975   if (p2 && *p2 == '\0'
8976       && TREE_CODE (len) == INTEGER_CST
8977       && tree_int_cst_sgn (len) == 1)
8978     {
8979       tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
8980       tree cst_uchar_ptr_node
8981         = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
8982
8983       return fold_convert_loc (loc, integer_type_node,
8984                                build1 (INDIRECT_REF, cst_uchar_node,
8985                                        fold_convert_loc (loc,
8986                                                          cst_uchar_ptr_node,
8987                                                          arg1)));
8988     }
8989
8990   /* If the first arg is "", and the length is greater than zero,
8991      return -*(const unsigned char*)arg2.  */
8992   if (p1 && *p1 == '\0'
8993       && TREE_CODE (len) == INTEGER_CST
8994       && tree_int_cst_sgn (len) == 1)
8995     {
8996       tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
8997       tree cst_uchar_ptr_node
8998         = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
8999
9000       tree temp = fold_convert_loc (loc, integer_type_node,
9001                                     build1 (INDIRECT_REF, cst_uchar_node,
9002                                             fold_convert_loc (loc,
9003                                                               cst_uchar_ptr_node,
9004                                                               arg2)));
9005       return fold_build1_loc (loc, NEGATE_EXPR, integer_type_node, temp);
9006     }
9007
9008   /* If len parameter is one, return an expression corresponding to
9009      (*(const unsigned char*)arg1 - (const unsigned char*)arg2).  */
9010   if (host_integerp (len, 1) && tree_low_cst (len, 1) == 1)
9011     {
9012       tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
9013       tree cst_uchar_ptr_node
9014         = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
9015
9016       tree ind1 = fold_convert_loc (loc, integer_type_node,
9017                                     build1 (INDIRECT_REF, cst_uchar_node,
9018                                             fold_convert_loc (loc,
9019                                                               cst_uchar_ptr_node,
9020                                                               arg1)));
9021       tree ind2 = fold_convert_loc (loc, integer_type_node,
9022                                     build1 (INDIRECT_REF, cst_uchar_node,
9023                                             fold_convert_loc (loc,
9024                                                               cst_uchar_ptr_node,
9025                                                               arg2)));
9026       return fold_build2_loc (loc, MINUS_EXPR, integer_type_node, ind1, ind2);
9027     }
9028
9029   return NULL_TREE;
9030 }
9031
9032 /* Fold function call to builtin signbit, signbitf or signbitl with argument
9033    ARG.  Return NULL_TREE if no simplification can be made.  */
9034
9035 static tree
9036 fold_builtin_signbit (location_t loc, tree arg, tree type)
9037 {
9038   if (!validate_arg (arg, REAL_TYPE))
9039     return NULL_TREE;
9040
9041   /* If ARG is a compile-time constant, determine the result.  */
9042   if (TREE_CODE (arg) == REAL_CST
9043       && !TREE_OVERFLOW (arg))
9044     {
9045       REAL_VALUE_TYPE c;
9046
9047       c = TREE_REAL_CST (arg);
9048       return (REAL_VALUE_NEGATIVE (c)
9049               ? build_one_cst (type)
9050               : build_zero_cst (type));
9051     }
9052
9053   /* If ARG is non-negative, the result is always zero.  */
9054   if (tree_expr_nonnegative_p (arg))
9055     return omit_one_operand_loc (loc, type, integer_zero_node, arg);
9056
9057   /* If ARG's format doesn't have signed zeros, return "arg < 0.0".  */
9058   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg))))
9059     return fold_build2_loc (loc, LT_EXPR, type, arg,
9060                         build_real (TREE_TYPE (arg), dconst0));
9061
9062   return NULL_TREE;
9063 }
9064
9065 /* Fold function call to builtin copysign, copysignf or copysignl with
9066    arguments ARG1 and ARG2.  Return NULL_TREE if no simplification can
9067    be made.  */
9068
9069 static tree
9070 fold_builtin_copysign (location_t loc, tree fndecl,
9071                        tree arg1, tree arg2, tree type)
9072 {
9073   tree tem;
9074
9075   if (!validate_arg (arg1, REAL_TYPE)
9076       || !validate_arg (arg2, REAL_TYPE))
9077     return NULL_TREE;
9078
9079   /* copysign(X,X) is X.  */
9080   if (operand_equal_p (arg1, arg2, 0))
9081     return fold_convert_loc (loc, type, arg1);
9082
9083   /* If ARG1 and ARG2 are compile-time constants, determine the result.  */
9084   if (TREE_CODE (arg1) == REAL_CST
9085       && TREE_CODE (arg2) == REAL_CST
9086       && !TREE_OVERFLOW (arg1)
9087       && !TREE_OVERFLOW (arg2))
9088     {
9089       REAL_VALUE_TYPE c1, c2;
9090
9091       c1 = TREE_REAL_CST (arg1);
9092       c2 = TREE_REAL_CST (arg2);
9093       /* c1.sign := c2.sign.  */
9094       real_copysign (&c1, &c2);
9095       return build_real (type, c1);
9096     }
9097
9098   /* copysign(X, Y) is fabs(X) when Y is always non-negative.
9099      Remember to evaluate Y for side-effects.  */
9100   if (tree_expr_nonnegative_p (arg2))
9101     return omit_one_operand_loc (loc, type,
9102                              fold_build1_loc (loc, ABS_EXPR, type, arg1),
9103                              arg2);
9104
9105   /* Strip sign changing operations for the first argument.  */
9106   tem = fold_strip_sign_ops (arg1);
9107   if (tem)
9108     return build_call_expr_loc (loc, fndecl, 2, tem, arg2);
9109
9110   return NULL_TREE;
9111 }
9112
9113 /* Fold a call to builtin isascii with argument ARG.  */
9114
9115 static tree
9116 fold_builtin_isascii (location_t loc, tree arg)
9117 {
9118   if (!validate_arg (arg, INTEGER_TYPE))
9119     return NULL_TREE;
9120   else
9121     {
9122       /* Transform isascii(c) -> ((c & ~0x7f) == 0).  */
9123       arg = fold_build2 (BIT_AND_EXPR, integer_type_node, arg,
9124                          build_int_cst (NULL_TREE,
9125                                         ~ (unsigned HOST_WIDE_INT) 0x7f));
9126       return fold_build2_loc (loc, EQ_EXPR, integer_type_node,
9127                           arg, integer_zero_node);
9128     }
9129 }
9130
9131 /* Fold a call to builtin toascii with argument ARG.  */
9132
9133 static tree
9134 fold_builtin_toascii (location_t loc, tree arg)
9135 {
9136   if (!validate_arg (arg, INTEGER_TYPE))
9137     return NULL_TREE;
9138
9139   /* Transform toascii(c) -> (c & 0x7f).  */
9140   return fold_build2_loc (loc, BIT_AND_EXPR, integer_type_node, arg,
9141                       build_int_cst (NULL_TREE, 0x7f));
9142 }
9143
9144 /* Fold a call to builtin isdigit with argument ARG.  */
9145
9146 static tree
9147 fold_builtin_isdigit (location_t loc, tree arg)
9148 {
9149   if (!validate_arg (arg, INTEGER_TYPE))
9150     return NULL_TREE;
9151   else
9152     {
9153       /* Transform isdigit(c) -> (unsigned)(c) - '0' <= 9.  */
9154       /* According to the C standard, isdigit is unaffected by locale.
9155          However, it definitely is affected by the target character set.  */
9156       unsigned HOST_WIDE_INT target_digit0
9157         = lang_hooks.to_target_charset ('0');
9158
9159       if (target_digit0 == 0)
9160         return NULL_TREE;
9161
9162       arg = fold_convert_loc (loc, unsigned_type_node, arg);
9163       arg = fold_build2 (MINUS_EXPR, unsigned_type_node, arg,
9164                          build_int_cst (unsigned_type_node, target_digit0));
9165       return fold_build2_loc (loc, LE_EXPR, integer_type_node, arg,
9166                           build_int_cst (unsigned_type_node, 9));
9167     }
9168 }
9169
9170 /* Fold a call to fabs, fabsf or fabsl with argument ARG.  */
9171
9172 static tree
9173 fold_builtin_fabs (location_t loc, tree arg, tree type)
9174 {
9175   if (!validate_arg (arg, REAL_TYPE))
9176     return NULL_TREE;
9177
9178   arg = fold_convert_loc (loc, type, arg);
9179   if (TREE_CODE (arg) == REAL_CST)
9180     return fold_abs_const (arg, type);
9181   return fold_build1_loc (loc, ABS_EXPR, type, arg);
9182 }
9183
9184 /* Fold a call to abs, labs, llabs or imaxabs with argument ARG.  */
9185
9186 static tree
9187 fold_builtin_abs (location_t loc, tree arg, tree type)
9188 {
9189   if (!validate_arg (arg, INTEGER_TYPE))
9190     return NULL_TREE;
9191
9192   arg = fold_convert_loc (loc, type, arg);
9193   if (TREE_CODE (arg) == INTEGER_CST)
9194     return fold_abs_const (arg, type);
9195   return fold_build1_loc (loc, ABS_EXPR, type, arg);
9196 }
9197
9198 /* Fold a fma operation with arguments ARG[012].  */
9199
9200 tree
9201 fold_fma (location_t loc ATTRIBUTE_UNUSED,
9202           tree type, tree arg0, tree arg1, tree arg2)
9203 {
9204   if (TREE_CODE (arg0) == REAL_CST
9205       && TREE_CODE (arg1) == REAL_CST
9206       && TREE_CODE (arg2) == REAL_CST)
9207     return do_mpfr_arg3 (arg0, arg1, arg2, type, mpfr_fma);
9208
9209   return NULL_TREE;
9210 }
9211
9212 /* Fold a call to fma, fmaf, or fmal with arguments ARG[012].  */
9213
9214 static tree
9215 fold_builtin_fma (location_t loc, tree arg0, tree arg1, tree arg2, tree type)
9216 {
9217   if (validate_arg (arg0, REAL_TYPE)
9218       && validate_arg(arg1, REAL_TYPE)
9219       && validate_arg(arg2, REAL_TYPE))
9220     {
9221       tree tem = fold_fma (loc, type, arg0, arg1, arg2);
9222       if (tem)
9223         return tem;
9224
9225       /* ??? Only expand to FMA_EXPR if it's directly supported.  */
9226       if (optab_handler (fma_optab, TYPE_MODE (type)) != CODE_FOR_nothing)
9227         return fold_build3_loc (loc, FMA_EXPR, type, arg0, arg1, arg2);
9228     }
9229   return NULL_TREE;
9230 }
9231
9232 /* Fold a call to builtin fmin or fmax.  */
9233
9234 static tree
9235 fold_builtin_fmin_fmax (location_t loc, tree arg0, tree arg1,
9236                         tree type, bool max)
9237 {
9238   if (validate_arg (arg0, REAL_TYPE) && validate_arg (arg1, REAL_TYPE))
9239     {
9240       /* Calculate the result when the argument is a constant.  */
9241       tree res = do_mpfr_arg2 (arg0, arg1, type, (max ? mpfr_max : mpfr_min));
9242
9243       if (res)
9244         return res;
9245
9246       /* If either argument is NaN, return the other one.  Avoid the
9247          transformation if we get (and honor) a signalling NaN.  Using
9248          omit_one_operand() ensures we create a non-lvalue.  */
9249       if (TREE_CODE (arg0) == REAL_CST
9250           && real_isnan (&TREE_REAL_CST (arg0))
9251           && (! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9252               || ! TREE_REAL_CST (arg0).signalling))
9253         return omit_one_operand_loc (loc, type, arg1, arg0);
9254       if (TREE_CODE (arg1) == REAL_CST
9255           && real_isnan (&TREE_REAL_CST (arg1))
9256           && (! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1)))
9257               || ! TREE_REAL_CST (arg1).signalling))
9258         return omit_one_operand_loc (loc, type, arg0, arg1);
9259
9260       /* Transform fmin/fmax(x,x) -> x.  */
9261       if (operand_equal_p (arg0, arg1, OEP_PURE_SAME))
9262         return omit_one_operand_loc (loc, type, arg0, arg1);
9263
9264       /* Convert fmin/fmax to MIN_EXPR/MAX_EXPR.  C99 requires these
9265          functions to return the numeric arg if the other one is NaN.
9266          These tree codes don't honor that, so only transform if
9267          -ffinite-math-only is set.  C99 doesn't require -0.0 to be
9268          handled, so we don't have to worry about it either.  */
9269       if (flag_finite_math_only)
9270         return fold_build2_loc (loc, (max ? MAX_EXPR : MIN_EXPR), type,
9271                             fold_convert_loc (loc, type, arg0),
9272                             fold_convert_loc (loc, type, arg1));
9273     }
9274   return NULL_TREE;
9275 }
9276
9277 /* Fold a call to builtin carg(a+bi) -> atan2(b,a).  */
9278
9279 static tree
9280 fold_builtin_carg (location_t loc, tree arg, tree type)
9281 {
9282   if (validate_arg (arg, COMPLEX_TYPE)
9283       && TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) == REAL_TYPE)
9284     {
9285       tree atan2_fn = mathfn_built_in (type, BUILT_IN_ATAN2);
9286
9287       if (atan2_fn)
9288         {
9289           tree new_arg = builtin_save_expr (arg);
9290           tree r_arg = fold_build1_loc (loc, REALPART_EXPR, type, new_arg);
9291           tree i_arg = fold_build1_loc (loc, IMAGPART_EXPR, type, new_arg);
9292           return build_call_expr_loc (loc, atan2_fn, 2, i_arg, r_arg);
9293         }
9294     }
9295
9296   return NULL_TREE;
9297 }
9298
9299 /* Fold a call to builtin logb/ilogb.  */
9300
9301 static tree
9302 fold_builtin_logb (location_t loc, tree arg, tree rettype)
9303 {
9304   if (! validate_arg (arg, REAL_TYPE))
9305     return NULL_TREE;
9306
9307   STRIP_NOPS (arg);
9308
9309   if (TREE_CODE (arg) == REAL_CST && ! TREE_OVERFLOW (arg))
9310     {
9311       const REAL_VALUE_TYPE *const value = TREE_REAL_CST_PTR (arg);
9312
9313       switch (value->cl)
9314       {
9315       case rvc_nan:
9316       case rvc_inf:
9317         /* If arg is Inf or NaN and we're logb, return it.  */
9318         if (TREE_CODE (rettype) == REAL_TYPE)
9319           return fold_convert_loc (loc, rettype, arg);
9320         /* Fall through... */
9321       case rvc_zero:
9322         /* Zero may set errno and/or raise an exception for logb, also
9323            for ilogb we don't know FP_ILOGB0.  */
9324         return NULL_TREE;
9325       case rvc_normal:
9326         /* For normal numbers, proceed iff radix == 2.  In GCC,
9327            normalized significands are in the range [0.5, 1.0).  We
9328            want the exponent as if they were [1.0, 2.0) so get the
9329            exponent and subtract 1.  */
9330         if (REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (arg)))->b == 2)
9331           return fold_convert_loc (loc, rettype,
9332                                    build_int_cst (NULL_TREE,
9333                                                   REAL_EXP (value)-1));
9334         break;
9335       }
9336     }
9337
9338   return NULL_TREE;
9339 }
9340
9341 /* Fold a call to builtin significand, if radix == 2.  */
9342
9343 static tree
9344 fold_builtin_significand (location_t loc, tree arg, tree rettype)
9345 {
9346   if (! validate_arg (arg, REAL_TYPE))
9347     return NULL_TREE;
9348
9349   STRIP_NOPS (arg);
9350
9351   if (TREE_CODE (arg) == REAL_CST && ! TREE_OVERFLOW (arg))
9352     {
9353       const REAL_VALUE_TYPE *const value = TREE_REAL_CST_PTR (arg);
9354
9355       switch (value->cl)
9356       {
9357       case rvc_zero:
9358       case rvc_nan:
9359       case rvc_inf:
9360         /* If arg is +-0, +-Inf or +-NaN, then return it.  */
9361         return fold_convert_loc (loc, rettype, arg);
9362       case rvc_normal:
9363         /* For normal numbers, proceed iff radix == 2.  */
9364         if (REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (arg)))->b == 2)
9365           {
9366             REAL_VALUE_TYPE result = *value;
9367             /* In GCC, normalized significands are in the range [0.5,
9368                1.0).  We want them to be [1.0, 2.0) so set the
9369                exponent to 1.  */
9370             SET_REAL_EXP (&result, 1);
9371             return build_real (rettype, result);
9372           }
9373         break;
9374       }
9375     }
9376
9377   return NULL_TREE;
9378 }
9379
9380 /* Fold a call to builtin frexp, we can assume the base is 2.  */
9381
9382 static tree
9383 fold_builtin_frexp (location_t loc, tree arg0, tree arg1, tree rettype)
9384 {
9385   if (! validate_arg (arg0, REAL_TYPE) || ! validate_arg (arg1, POINTER_TYPE))
9386     return NULL_TREE;
9387
9388   STRIP_NOPS (arg0);
9389
9390   if (!(TREE_CODE (arg0) == REAL_CST && ! TREE_OVERFLOW (arg0)))
9391     return NULL_TREE;
9392
9393   arg1 = build_fold_indirect_ref_loc (loc, arg1);
9394
9395   /* Proceed if a valid pointer type was passed in.  */
9396   if (TYPE_MAIN_VARIANT (TREE_TYPE (arg1)) == integer_type_node)
9397     {
9398       const REAL_VALUE_TYPE *const value = TREE_REAL_CST_PTR (arg0);
9399       tree frac, exp;
9400
9401       switch (value->cl)
9402       {
9403       case rvc_zero:
9404         /* For +-0, return (*exp = 0, +-0).  */
9405         exp = integer_zero_node;
9406         frac = arg0;
9407         break;
9408       case rvc_nan:
9409       case rvc_inf:
9410         /* For +-NaN or +-Inf, *exp is unspecified, return arg0.  */
9411         return omit_one_operand_loc (loc, rettype, arg0, arg1);
9412       case rvc_normal:
9413         {
9414           /* Since the frexp function always expects base 2, and in
9415              GCC normalized significands are already in the range
9416              [0.5, 1.0), we have exactly what frexp wants.  */
9417           REAL_VALUE_TYPE frac_rvt = *value;
9418           SET_REAL_EXP (&frac_rvt, 0);
9419           frac = build_real (rettype, frac_rvt);
9420           exp = build_int_cst (NULL_TREE, REAL_EXP (value));
9421         }
9422         break;
9423       default:
9424         gcc_unreachable ();
9425       }
9426
9427       /* Create the COMPOUND_EXPR (*arg1 = trunc, frac). */
9428       arg1 = fold_build2_loc (loc, MODIFY_EXPR, rettype, arg1, exp);
9429       TREE_SIDE_EFFECTS (arg1) = 1;
9430       return fold_build2_loc (loc, COMPOUND_EXPR, rettype, arg1, frac);
9431     }
9432
9433   return NULL_TREE;
9434 }
9435
9436 /* Fold a call to builtin ldexp or scalbn/scalbln.  If LDEXP is true
9437    then we can assume the base is two.  If it's false, then we have to
9438    check the mode of the TYPE parameter in certain cases.  */
9439
9440 static tree
9441 fold_builtin_load_exponent (location_t loc, tree arg0, tree arg1,
9442                             tree type, bool ldexp)
9443 {
9444   if (validate_arg (arg0, REAL_TYPE) && validate_arg (arg1, INTEGER_TYPE))
9445     {
9446       STRIP_NOPS (arg0);
9447       STRIP_NOPS (arg1);
9448
9449       /* If arg0 is 0, Inf or NaN, or if arg1 is 0, then return arg0.  */
9450       if (real_zerop (arg0) || integer_zerop (arg1)
9451           || (TREE_CODE (arg0) == REAL_CST
9452               && !real_isfinite (&TREE_REAL_CST (arg0))))
9453         return omit_one_operand_loc (loc, type, arg0, arg1);
9454
9455       /* If both arguments are constant, then try to evaluate it.  */
9456       if ((ldexp || REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2)
9457           && TREE_CODE (arg0) == REAL_CST && !TREE_OVERFLOW (arg0)
9458           && host_integerp (arg1, 0))
9459         {
9460           /* Bound the maximum adjustment to twice the range of the
9461              mode's valid exponents.  Use abs to ensure the range is
9462              positive as a sanity check.  */
9463           const long max_exp_adj = 2 *
9464             labs (REAL_MODE_FORMAT (TYPE_MODE (type))->emax
9465                  - REAL_MODE_FORMAT (TYPE_MODE (type))->emin);
9466
9467           /* Get the user-requested adjustment.  */
9468           const HOST_WIDE_INT req_exp_adj = tree_low_cst (arg1, 0);
9469
9470           /* The requested adjustment must be inside this range.  This
9471              is a preliminary cap to avoid things like overflow, we
9472              may still fail to compute the result for other reasons.  */
9473           if (-max_exp_adj < req_exp_adj && req_exp_adj < max_exp_adj)
9474             {
9475               REAL_VALUE_TYPE initial_result;
9476
9477               real_ldexp (&initial_result, &TREE_REAL_CST (arg0), req_exp_adj);
9478
9479               /* Ensure we didn't overflow.  */
9480               if (! real_isinf (&initial_result))
9481                 {
9482                   const REAL_VALUE_TYPE trunc_result
9483                     = real_value_truncate (TYPE_MODE (type), initial_result);
9484
9485                   /* Only proceed if the target mode can hold the
9486                      resulting value.  */
9487                   if (REAL_VALUES_EQUAL (initial_result, trunc_result))
9488                     return build_real (type, trunc_result);
9489                 }
9490             }
9491         }
9492     }
9493
9494   return NULL_TREE;
9495 }
9496
9497 /* Fold a call to builtin modf.  */
9498
9499 static tree
9500 fold_builtin_modf (location_t loc, tree arg0, tree arg1, tree rettype)
9501 {
9502   if (! validate_arg (arg0, REAL_TYPE) || ! validate_arg (arg1, POINTER_TYPE))
9503     return NULL_TREE;
9504
9505   STRIP_NOPS (arg0);
9506
9507   if (!(TREE_CODE (arg0) == REAL_CST && ! TREE_OVERFLOW (arg0)))
9508     return NULL_TREE;
9509
9510   arg1 = build_fold_indirect_ref_loc (loc, arg1);
9511
9512   /* Proceed if a valid pointer type was passed in.  */
9513   if (TYPE_MAIN_VARIANT (TREE_TYPE (arg1)) == TYPE_MAIN_VARIANT (rettype))
9514     {
9515       const REAL_VALUE_TYPE *const value = TREE_REAL_CST_PTR (arg0);
9516       REAL_VALUE_TYPE trunc, frac;
9517
9518       switch (value->cl)
9519       {
9520       case rvc_nan:
9521       case rvc_zero:
9522         /* For +-NaN or +-0, return (*arg1 = arg0, arg0).  */
9523         trunc = frac = *value;
9524         break;
9525       case rvc_inf:
9526         /* For +-Inf, return (*arg1 = arg0, +-0).  */
9527         frac = dconst0;
9528         frac.sign = value->sign;
9529         trunc = *value;
9530         break;
9531       case rvc_normal:
9532         /* Return (*arg1 = trunc(arg0), arg0-trunc(arg0)).  */
9533         real_trunc (&trunc, VOIDmode, value);
9534         real_arithmetic (&frac, MINUS_EXPR, value, &trunc);
9535         /* If the original number was negative and already
9536            integral, then the fractional part is -0.0.  */
9537         if (value->sign && frac.cl == rvc_zero)
9538           frac.sign = value->sign;
9539         break;
9540       }
9541
9542       /* Create the COMPOUND_EXPR (*arg1 = trunc, frac). */
9543       arg1 = fold_build2_loc (loc, MODIFY_EXPR, rettype, arg1,
9544                           build_real (rettype, trunc));
9545       TREE_SIDE_EFFECTS (arg1) = 1;
9546       return fold_build2_loc (loc, COMPOUND_EXPR, rettype, arg1,
9547                           build_real (rettype, frac));
9548     }
9549
9550   return NULL_TREE;
9551 }
9552
9553 /* Given a location LOC, an interclass builtin function decl FNDECL
9554    and its single argument ARG, return an folded expression computing
9555    the same, or NULL_TREE if we either couldn't or didn't want to fold
9556    (the latter happen if there's an RTL instruction available).  */
9557
9558 static tree
9559 fold_builtin_interclass_mathfn (location_t loc, tree fndecl, tree arg)
9560 {
9561   enum machine_mode mode;
9562
9563   if (!validate_arg (arg, REAL_TYPE))
9564     return NULL_TREE;
9565
9566   if (interclass_mathfn_icode (arg, fndecl) != CODE_FOR_nothing)
9567     return NULL_TREE;
9568
9569   mode = TYPE_MODE (TREE_TYPE (arg));
9570
9571   /* If there is no optab, try generic code.  */
9572   switch (DECL_FUNCTION_CODE (fndecl))
9573     {
9574       tree result;
9575
9576     CASE_FLT_FN (BUILT_IN_ISINF):
9577       {
9578         /* isinf(x) -> isgreater(fabs(x),DBL_MAX).  */
9579         tree const isgr_fn = built_in_decls[BUILT_IN_ISGREATER];
9580         tree const type = TREE_TYPE (arg);
9581         REAL_VALUE_TYPE r;
9582         char buf[128];
9583
9584         get_max_float (REAL_MODE_FORMAT (mode), buf, sizeof (buf));
9585         real_from_string (&r, buf);
9586         result = build_call_expr (isgr_fn, 2,
9587                                   fold_build1_loc (loc, ABS_EXPR, type, arg),
9588                                   build_real (type, r));
9589         return result;
9590       }
9591     CASE_FLT_FN (BUILT_IN_FINITE):
9592     case BUILT_IN_ISFINITE:
9593       {
9594         /* isfinite(x) -> islessequal(fabs(x),DBL_MAX).  */
9595         tree const isle_fn = built_in_decls[BUILT_IN_ISLESSEQUAL];
9596         tree const type = TREE_TYPE (arg);
9597         REAL_VALUE_TYPE r;
9598         char buf[128];
9599
9600         get_max_float (REAL_MODE_FORMAT (mode), buf, sizeof (buf));
9601         real_from_string (&r, buf);
9602         result = build_call_expr (isle_fn, 2,
9603                                   fold_build1_loc (loc, ABS_EXPR, type, arg),
9604                                   build_real (type, r));
9605         /*result = fold_build2_loc (loc, UNGT_EXPR,
9606                                   TREE_TYPE (TREE_TYPE (fndecl)),
9607                                   fold_build1_loc (loc, ABS_EXPR, type, arg),
9608                                   build_real (type, r));
9609         result = fold_build1_loc (loc, TRUTH_NOT_EXPR,
9610                                   TREE_TYPE (TREE_TYPE (fndecl)),
9611                                   result);*/
9612         return result;
9613       }
9614     case BUILT_IN_ISNORMAL:
9615       {
9616         /* isnormal(x) -> isgreaterequal(fabs(x),DBL_MIN) &
9617            islessequal(fabs(x),DBL_MAX).  */
9618         tree const isle_fn = built_in_decls[BUILT_IN_ISLESSEQUAL];
9619         tree const isge_fn = built_in_decls[BUILT_IN_ISGREATEREQUAL];
9620         tree const type = TREE_TYPE (arg);
9621         REAL_VALUE_TYPE rmax, rmin;
9622         char buf[128];
9623
9624         get_max_float (REAL_MODE_FORMAT (mode), buf, sizeof (buf));
9625         real_from_string (&rmax, buf);
9626         sprintf (buf, "0x1p%d", REAL_MODE_FORMAT (mode)->emin - 1);
9627         real_from_string (&rmin, buf);
9628         arg = builtin_save_expr (fold_build1_loc (loc, ABS_EXPR, type, arg));
9629         result = build_call_expr (isle_fn, 2, arg,
9630                                   build_real (type, rmax));
9631         result = fold_build2 (BIT_AND_EXPR, integer_type_node, result,
9632                               build_call_expr (isge_fn, 2, arg,
9633                                                build_real (type, rmin)));
9634         return result;
9635       }
9636     default:
9637       break;
9638     }
9639
9640   return NULL_TREE;
9641 }
9642
9643 /* Fold a call to __builtin_isnan(), __builtin_isinf, __builtin_finite.
9644    ARG is the argument for the call.  */
9645
9646 static tree
9647 fold_builtin_classify (location_t loc, tree fndecl, tree arg, int builtin_index)
9648 {
9649   tree type = TREE_TYPE (TREE_TYPE (fndecl));
9650   REAL_VALUE_TYPE r;
9651
9652   if (!validate_arg (arg, REAL_TYPE))
9653     return NULL_TREE;
9654
9655   switch (builtin_index)
9656     {
9657     case BUILT_IN_ISINF:
9658       if (!HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg))))
9659         return omit_one_operand_loc (loc, type, integer_zero_node, arg);
9660
9661       if (TREE_CODE (arg) == REAL_CST)
9662         {
9663           r = TREE_REAL_CST (arg);
9664           if (real_isinf (&r))
9665             return real_compare (GT_EXPR, &r, &dconst0)
9666                    ? integer_one_node : integer_minus_one_node;
9667           else
9668             return integer_zero_node;
9669         }
9670
9671       return NULL_TREE;
9672
9673     case BUILT_IN_ISINF_SIGN:
9674       {
9675         /* isinf_sign(x) -> isinf(x) ? (signbit(x) ? -1 : 1) : 0 */
9676         /* In a boolean context, GCC will fold the inner COND_EXPR to
9677            1.  So e.g. "if (isinf_sign(x))" would be folded to just
9678            "if (isinf(x) ? 1 : 0)" which becomes "if (isinf(x))". */
9679         tree signbit_fn = mathfn_built_in_1 (TREE_TYPE (arg), BUILT_IN_SIGNBIT, 0);
9680         tree isinf_fn = built_in_decls[BUILT_IN_ISINF];
9681         tree tmp = NULL_TREE;
9682
9683         arg = builtin_save_expr (arg);
9684
9685         if (signbit_fn && isinf_fn)
9686           {
9687             tree signbit_call = build_call_expr_loc (loc, signbit_fn, 1, arg);
9688             tree isinf_call = build_call_expr_loc (loc, isinf_fn, 1, arg);
9689
9690             signbit_call = fold_build2_loc (loc, NE_EXPR, integer_type_node,
9691                                         signbit_call, integer_zero_node);
9692             isinf_call = fold_build2_loc (loc, NE_EXPR, integer_type_node,
9693                                       isinf_call, integer_zero_node);
9694
9695             tmp = fold_build3_loc (loc, COND_EXPR, integer_type_node, signbit_call,
9696                                integer_minus_one_node, integer_one_node);
9697             tmp = fold_build3_loc (loc, COND_EXPR, integer_type_node,
9698                                isinf_call, tmp,
9699                                integer_zero_node);
9700           }
9701
9702         return tmp;
9703       }
9704
9705     case BUILT_IN_ISFINITE:
9706       if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg)))
9707           && !HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg))))
9708         return omit_one_operand_loc (loc, type, integer_one_node, arg);
9709
9710       if (TREE_CODE (arg) == REAL_CST)
9711         {
9712           r = TREE_REAL_CST (arg);
9713           return real_isfinite (&r) ? integer_one_node : integer_zero_node;
9714         }
9715
9716       return NULL_TREE;
9717
9718     case BUILT_IN_ISNAN:
9719       if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg))))
9720         return omit_one_operand_loc (loc, type, integer_zero_node, arg);
9721
9722       if (TREE_CODE (arg) == REAL_CST)
9723         {
9724           r = TREE_REAL_CST (arg);
9725           return real_isnan (&r) ? integer_one_node : integer_zero_node;
9726         }
9727
9728       arg = builtin_save_expr (arg);
9729       return fold_build2_loc (loc, UNORDERED_EXPR, type, arg, arg);
9730
9731     default:
9732       gcc_unreachable ();
9733     }
9734 }
9735
9736 /* Fold a call to __builtin_fpclassify(int, int, int, int, int, ...).
9737    This builtin will generate code to return the appropriate floating
9738    point classification depending on the value of the floating point
9739    number passed in.  The possible return values must be supplied as
9740    int arguments to the call in the following order: FP_NAN, FP_INFINITE,
9741    FP_NORMAL, FP_SUBNORMAL and FP_ZERO.  The ellipses is for exactly
9742    one floating point argument which is "type generic".  */
9743
9744 static tree
9745 fold_builtin_fpclassify (location_t loc, tree exp)
9746 {
9747   tree fp_nan, fp_infinite, fp_normal, fp_subnormal, fp_zero,
9748     arg, type, res, tmp;
9749   enum machine_mode mode;
9750   REAL_VALUE_TYPE r;
9751   char buf[128];
9752
9753   /* Verify the required arguments in the original call.  */
9754   if (!validate_arglist (exp, INTEGER_TYPE, INTEGER_TYPE,
9755                          INTEGER_TYPE, INTEGER_TYPE,
9756                          INTEGER_TYPE, REAL_TYPE, VOID_TYPE))
9757     return NULL_TREE;
9758
9759   fp_nan = CALL_EXPR_ARG (exp, 0);
9760   fp_infinite = CALL_EXPR_ARG (exp, 1);
9761   fp_normal = CALL_EXPR_ARG (exp, 2);
9762   fp_subnormal = CALL_EXPR_ARG (exp, 3);
9763   fp_zero = CALL_EXPR_ARG (exp, 4);
9764   arg = CALL_EXPR_ARG (exp, 5);
9765   type = TREE_TYPE (arg);
9766   mode = TYPE_MODE (type);
9767   arg = builtin_save_expr (fold_build1_loc (loc, ABS_EXPR, type, arg));
9768
9769   /* fpclassify(x) ->
9770        isnan(x) ? FP_NAN :
9771          (fabs(x) == Inf ? FP_INFINITE :
9772            (fabs(x) >= DBL_MIN ? FP_NORMAL :
9773              (x == 0 ? FP_ZERO : FP_SUBNORMAL))).  */
9774
9775   tmp = fold_build2_loc (loc, EQ_EXPR, integer_type_node, arg,
9776                      build_real (type, dconst0));
9777   res = fold_build3_loc (loc, COND_EXPR, integer_type_node,
9778                      tmp, fp_zero, fp_subnormal);
9779
9780   sprintf (buf, "0x1p%d", REAL_MODE_FORMAT (mode)->emin - 1);
9781   real_from_string (&r, buf);
9782   tmp = fold_build2_loc (loc, GE_EXPR, integer_type_node,
9783                      arg, build_real (type, r));
9784   res = fold_build3_loc (loc, COND_EXPR, integer_type_node, tmp, fp_normal, res);
9785
9786   if (HONOR_INFINITIES (mode))
9787     {
9788       real_inf (&r);
9789       tmp = fold_build2_loc (loc, EQ_EXPR, integer_type_node, arg,
9790                          build_real (type, r));
9791       res = fold_build3_loc (loc, COND_EXPR, integer_type_node, tmp,
9792                          fp_infinite, res);
9793     }
9794
9795   if (HONOR_NANS (mode))
9796     {
9797       tmp = fold_build2_loc (loc, ORDERED_EXPR, integer_type_node, arg, arg);
9798       res = fold_build3_loc (loc, COND_EXPR, integer_type_node, tmp, res, fp_nan);
9799     }
9800
9801   return res;
9802 }
9803
9804 /* Fold a call to an unordered comparison function such as
9805    __builtin_isgreater().  FNDECL is the FUNCTION_DECL for the function
9806    being called and ARG0 and ARG1 are the arguments for the call.
9807    UNORDERED_CODE and ORDERED_CODE are comparison codes that give
9808    the opposite of the desired result.  UNORDERED_CODE is used
9809    for modes that can hold NaNs and ORDERED_CODE is used for
9810    the rest.  */
9811
9812 static tree
9813 fold_builtin_unordered_cmp (location_t loc, tree fndecl, tree arg0, tree arg1,
9814                             enum tree_code unordered_code,
9815                             enum tree_code ordered_code)
9816 {
9817   tree type = TREE_TYPE (TREE_TYPE (fndecl));
9818   enum tree_code code;
9819   tree type0, type1;
9820   enum tree_code code0, code1;
9821   tree cmp_type = NULL_TREE;
9822
9823   type0 = TREE_TYPE (arg0);
9824   type1 = TREE_TYPE (arg1);
9825
9826   code0 = TREE_CODE (type0);
9827   code1 = TREE_CODE (type1);
9828
9829   if (code0 == REAL_TYPE && code1 == REAL_TYPE)
9830     /* Choose the wider of two real types.  */
9831     cmp_type = TYPE_PRECISION (type0) >= TYPE_PRECISION (type1)
9832       ? type0 : type1;
9833   else if (code0 == REAL_TYPE && code1 == INTEGER_TYPE)
9834     cmp_type = type0;
9835   else if (code0 == INTEGER_TYPE && code1 == REAL_TYPE)
9836     cmp_type = type1;
9837
9838   arg0 = fold_convert_loc (loc, cmp_type, arg0);
9839   arg1 = fold_convert_loc (loc, cmp_type, arg1);
9840
9841   if (unordered_code == UNORDERED_EXPR)
9842     {
9843       if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9844         return omit_two_operands_loc (loc, type, integer_zero_node, arg0, arg1);
9845       return fold_build2_loc (loc, UNORDERED_EXPR, type, arg0, arg1);
9846     }
9847
9848   code = HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))) ? unordered_code
9849                                                    : ordered_code;
9850   return fold_build1_loc (loc, TRUTH_NOT_EXPR, type,
9851                       fold_build2_loc (loc, code, type, arg0, arg1));
9852 }
9853
9854 /* Fold a call to built-in function FNDECL with 0 arguments.
9855    IGNORE is true if the result of the function call is ignored.  This
9856    function returns NULL_TREE if no simplification was possible.  */
9857
9858 static tree
9859 fold_builtin_0 (location_t loc, tree fndecl, bool ignore ATTRIBUTE_UNUSED)
9860 {
9861   tree type = TREE_TYPE (TREE_TYPE (fndecl));
9862   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
9863   switch (fcode)
9864     {
9865     CASE_FLT_FN (BUILT_IN_INF):
9866     case BUILT_IN_INFD32:
9867     case BUILT_IN_INFD64:
9868     case BUILT_IN_INFD128:
9869       return fold_builtin_inf (loc, type, true);
9870
9871     CASE_FLT_FN (BUILT_IN_HUGE_VAL):
9872       return fold_builtin_inf (loc, type, false);
9873
9874     case BUILT_IN_CLASSIFY_TYPE:
9875       return fold_builtin_classify_type (NULL_TREE);
9876
9877     default:
9878       break;
9879     }
9880   return NULL_TREE;
9881 }
9882
9883 /* Fold a call to built-in function FNDECL with 1 argument, ARG0.
9884    IGNORE is true if the result of the function call is ignored.  This
9885    function returns NULL_TREE if no simplification was possible.  */
9886
9887 static tree
9888 fold_builtin_1 (location_t loc, tree fndecl, tree arg0, bool ignore)
9889 {
9890   tree type = TREE_TYPE (TREE_TYPE (fndecl));
9891   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
9892   switch (fcode)
9893     {
9894     case BUILT_IN_CONSTANT_P:
9895       {
9896         tree val = fold_builtin_constant_p (arg0);
9897
9898         /* Gimplification will pull the CALL_EXPR for the builtin out of
9899            an if condition.  When not optimizing, we'll not CSE it back.
9900            To avoid link error types of regressions, return false now.  */
9901         if (!val && !optimize)
9902           val = integer_zero_node;
9903
9904         return val;
9905       }
9906
9907     case BUILT_IN_CLASSIFY_TYPE:
9908       return fold_builtin_classify_type (arg0);
9909
9910     case BUILT_IN_STRLEN:
9911       return fold_builtin_strlen (loc, type, arg0);
9912
9913     CASE_FLT_FN (BUILT_IN_FABS):
9914       return fold_builtin_fabs (loc, arg0, type);
9915
9916     case BUILT_IN_ABS:
9917     case BUILT_IN_LABS:
9918     case BUILT_IN_LLABS:
9919     case BUILT_IN_IMAXABS:
9920       return fold_builtin_abs (loc, arg0, type);
9921
9922     CASE_FLT_FN (BUILT_IN_CONJ):
9923       if (validate_arg (arg0, COMPLEX_TYPE)
9924         && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9925         return fold_build1_loc (loc, CONJ_EXPR, type, arg0);
9926     break;
9927
9928     CASE_FLT_FN (BUILT_IN_CREAL):
9929       if (validate_arg (arg0, COMPLEX_TYPE)
9930         && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9931         return non_lvalue_loc (loc, fold_build1_loc (loc, REALPART_EXPR, type, arg0));;
9932     break;
9933
9934     CASE_FLT_FN (BUILT_IN_CIMAG):
9935       if (validate_arg (arg0, COMPLEX_TYPE)
9936           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9937         return non_lvalue_loc (loc, fold_build1_loc (loc, IMAGPART_EXPR, type, arg0));
9938     break;
9939
9940     CASE_FLT_FN (BUILT_IN_CCOS):
9941       return fold_builtin_ccos(loc, arg0, type, fndecl, /*hyper=*/ false);
9942
9943     CASE_FLT_FN (BUILT_IN_CCOSH):
9944       return fold_builtin_ccos(loc, arg0, type, fndecl, /*hyper=*/ true);
9945
9946     CASE_FLT_FN (BUILT_IN_CPROJ):
9947       return fold_builtin_cproj(loc, arg0, type);
9948
9949     CASE_FLT_FN (BUILT_IN_CSIN):
9950       if (validate_arg (arg0, COMPLEX_TYPE)
9951           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9952         return do_mpc_arg1 (arg0, type, mpc_sin);
9953     break;
9954
9955     CASE_FLT_FN (BUILT_IN_CSINH):
9956       if (validate_arg (arg0, COMPLEX_TYPE)
9957           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9958         return do_mpc_arg1 (arg0, type, mpc_sinh);
9959     break;
9960
9961     CASE_FLT_FN (BUILT_IN_CTAN):
9962       if (validate_arg (arg0, COMPLEX_TYPE)
9963           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9964         return do_mpc_arg1 (arg0, type, mpc_tan);
9965     break;
9966
9967     CASE_FLT_FN (BUILT_IN_CTANH):
9968       if (validate_arg (arg0, COMPLEX_TYPE)
9969           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9970         return do_mpc_arg1 (arg0, type, mpc_tanh);
9971     break;
9972
9973     CASE_FLT_FN (BUILT_IN_CLOG):
9974       if (validate_arg (arg0, COMPLEX_TYPE)
9975           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9976         return do_mpc_arg1 (arg0, type, mpc_log);
9977     break;
9978
9979     CASE_FLT_FN (BUILT_IN_CSQRT):
9980       if (validate_arg (arg0, COMPLEX_TYPE)
9981           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9982         return do_mpc_arg1 (arg0, type, mpc_sqrt);
9983     break;
9984
9985     CASE_FLT_FN (BUILT_IN_CASIN):
9986       if (validate_arg (arg0, COMPLEX_TYPE)
9987           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9988         return do_mpc_arg1 (arg0, type, mpc_asin);
9989     break;
9990
9991     CASE_FLT_FN (BUILT_IN_CACOS):
9992       if (validate_arg (arg0, COMPLEX_TYPE)
9993           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9994         return do_mpc_arg1 (arg0, type, mpc_acos);
9995     break;
9996
9997     CASE_FLT_FN (BUILT_IN_CATAN):
9998       if (validate_arg (arg0, COMPLEX_TYPE)
9999           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
10000         return do_mpc_arg1 (arg0, type, mpc_atan);
10001     break;
10002
10003     CASE_FLT_FN (BUILT_IN_CASINH):
10004       if (validate_arg (arg0, COMPLEX_TYPE)
10005           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
10006         return do_mpc_arg1 (arg0, type, mpc_asinh);
10007     break;
10008
10009     CASE_FLT_FN (BUILT_IN_CACOSH):
10010       if (validate_arg (arg0, COMPLEX_TYPE)
10011           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
10012         return do_mpc_arg1 (arg0, type, mpc_acosh);
10013     break;
10014
10015     CASE_FLT_FN (BUILT_IN_CATANH):
10016       if (validate_arg (arg0, COMPLEX_TYPE)
10017           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
10018         return do_mpc_arg1 (arg0, type, mpc_atanh);
10019     break;
10020
10021     CASE_FLT_FN (BUILT_IN_CABS):
10022       return fold_builtin_cabs (loc, arg0, type, fndecl);
10023
10024     CASE_FLT_FN (BUILT_IN_CARG):
10025       return fold_builtin_carg (loc, arg0, type);
10026
10027     CASE_FLT_FN (BUILT_IN_SQRT):
10028       return fold_builtin_sqrt (loc, arg0, type);
10029
10030     CASE_FLT_FN (BUILT_IN_CBRT):
10031       return fold_builtin_cbrt (loc, arg0, type);
10032
10033     CASE_FLT_FN (BUILT_IN_ASIN):
10034       if (validate_arg (arg0, REAL_TYPE))
10035         return do_mpfr_arg1 (arg0, type, mpfr_asin,
10036                              &dconstm1, &dconst1, true);
10037     break;
10038
10039     CASE_FLT_FN (BUILT_IN_ACOS):
10040       if (validate_arg (arg0, REAL_TYPE))
10041         return do_mpfr_arg1 (arg0, type, mpfr_acos,
10042                              &dconstm1, &dconst1, true);
10043     break;
10044
10045     CASE_FLT_FN (BUILT_IN_ATAN):
10046       if (validate_arg (arg0, REAL_TYPE))
10047         return do_mpfr_arg1 (arg0, type, mpfr_atan, NULL, NULL, 0);
10048     break;
10049
10050     CASE_FLT_FN (BUILT_IN_ASINH):
10051       if (validate_arg (arg0, REAL_TYPE))
10052         return do_mpfr_arg1 (arg0, type, mpfr_asinh, NULL, NULL, 0);
10053     break;
10054
10055     CASE_FLT_FN (BUILT_IN_ACOSH):
10056       if (validate_arg (arg0, REAL_TYPE))
10057         return do_mpfr_arg1 (arg0, type, mpfr_acosh,
10058                              &dconst1, NULL, true);
10059     break;
10060
10061     CASE_FLT_FN (BUILT_IN_ATANH):
10062       if (validate_arg (arg0, REAL_TYPE))
10063         return do_mpfr_arg1 (arg0, type, mpfr_atanh,
10064                              &dconstm1, &dconst1, false);
10065     break;
10066
10067     CASE_FLT_FN (BUILT_IN_SIN):
10068       if (validate_arg (arg0, REAL_TYPE))
10069         return do_mpfr_arg1 (arg0, type, mpfr_sin, NULL, NULL, 0);
10070     break;
10071
10072     CASE_FLT_FN (BUILT_IN_COS):
10073       return fold_builtin_cos (loc, arg0, type, fndecl);
10074
10075     CASE_FLT_FN (BUILT_IN_TAN):
10076       return fold_builtin_tan (arg0, type);
10077
10078     CASE_FLT_FN (BUILT_IN_CEXP):
10079       return fold_builtin_cexp (loc, arg0, type);
10080
10081     CASE_FLT_FN (BUILT_IN_CEXPI):
10082       if (validate_arg (arg0, REAL_TYPE))
10083         return do_mpfr_sincos (arg0, NULL_TREE, NULL_TREE);
10084     break;
10085
10086     CASE_FLT_FN (BUILT_IN_SINH):
10087       if (validate_arg (arg0, REAL_TYPE))
10088         return do_mpfr_arg1 (arg0, type, mpfr_sinh, NULL, NULL, 0);
10089     break;
10090
10091     CASE_FLT_FN (BUILT_IN_COSH):
10092       return fold_builtin_cosh (loc, arg0, type, fndecl);
10093
10094     CASE_FLT_FN (BUILT_IN_TANH):
10095       if (validate_arg (arg0, REAL_TYPE))
10096         return do_mpfr_arg1 (arg0, type, mpfr_tanh, NULL, NULL, 0);
10097     break;
10098
10099     CASE_FLT_FN (BUILT_IN_ERF):
10100       if (validate_arg (arg0, REAL_TYPE))
10101         return do_mpfr_arg1 (arg0, type, mpfr_erf, NULL, NULL, 0);
10102     break;
10103
10104     CASE_FLT_FN (BUILT_IN_ERFC):
10105       if (validate_arg (arg0, REAL_TYPE))
10106         return do_mpfr_arg1 (arg0, type, mpfr_erfc, NULL, NULL, 0);
10107     break;
10108
10109     CASE_FLT_FN (BUILT_IN_TGAMMA):
10110       if (validate_arg (arg0, REAL_TYPE))
10111         return do_mpfr_arg1 (arg0, type, mpfr_gamma, NULL, NULL, 0);
10112     break;
10113
10114     CASE_FLT_FN (BUILT_IN_EXP):
10115       return fold_builtin_exponent (loc, fndecl, arg0, mpfr_exp);
10116
10117     CASE_FLT_FN (BUILT_IN_EXP2):
10118       return fold_builtin_exponent (loc, fndecl, arg0, mpfr_exp2);
10119
10120     CASE_FLT_FN (BUILT_IN_EXP10):
10121     CASE_FLT_FN (BUILT_IN_POW10):
10122       return fold_builtin_exponent (loc, fndecl, arg0, mpfr_exp10);
10123
10124     CASE_FLT_FN (BUILT_IN_EXPM1):
10125       if (validate_arg (arg0, REAL_TYPE))
10126         return do_mpfr_arg1 (arg0, type, mpfr_expm1, NULL, NULL, 0);
10127     break;
10128
10129     CASE_FLT_FN (BUILT_IN_LOG):
10130     return fold_builtin_logarithm (loc, fndecl, arg0, mpfr_log);
10131
10132     CASE_FLT_FN (BUILT_IN_LOG2):
10133       return fold_builtin_logarithm (loc, fndecl, arg0, mpfr_log2);
10134
10135     CASE_FLT_FN (BUILT_IN_LOG10):
10136       return fold_builtin_logarithm (loc, fndecl, arg0, mpfr_log10);
10137
10138     CASE_FLT_FN (BUILT_IN_LOG1P):
10139       if (validate_arg (arg0, REAL_TYPE))
10140         return do_mpfr_arg1 (arg0, type, mpfr_log1p,
10141                              &dconstm1, NULL, false);
10142     break;
10143
10144     CASE_FLT_FN (BUILT_IN_J0):
10145       if (validate_arg (arg0, REAL_TYPE))
10146         return do_mpfr_arg1 (arg0, type, mpfr_j0,
10147                              NULL, NULL, 0);
10148     break;
10149
10150     CASE_FLT_FN (BUILT_IN_J1):
10151       if (validate_arg (arg0, REAL_TYPE))
10152         return do_mpfr_arg1 (arg0, type, mpfr_j1,
10153                              NULL, NULL, 0);
10154     break;
10155
10156     CASE_FLT_FN (BUILT_IN_Y0):
10157       if (validate_arg (arg0, REAL_TYPE))
10158         return do_mpfr_arg1 (arg0, type, mpfr_y0,
10159                              &dconst0, NULL, false);
10160     break;
10161
10162     CASE_FLT_FN (BUILT_IN_Y1):
10163       if (validate_arg (arg0, REAL_TYPE))
10164         return do_mpfr_arg1 (arg0, type, mpfr_y1,
10165                              &dconst0, NULL, false);
10166     break;
10167
10168     CASE_FLT_FN (BUILT_IN_NAN):
10169     case BUILT_IN_NAND32:
10170     case BUILT_IN_NAND64:
10171     case BUILT_IN_NAND128:
10172       return fold_builtin_nan (arg0, type, true);
10173
10174     CASE_FLT_FN (BUILT_IN_NANS):
10175       return fold_builtin_nan (arg0, type, false);
10176
10177     CASE_FLT_FN (BUILT_IN_FLOOR):
10178       return fold_builtin_floor (loc, fndecl, arg0);
10179
10180     CASE_FLT_FN (BUILT_IN_CEIL):
10181       return fold_builtin_ceil (loc, fndecl, arg0);
10182
10183     CASE_FLT_FN (BUILT_IN_TRUNC):
10184       return fold_builtin_trunc (loc, fndecl, arg0);
10185
10186     CASE_FLT_FN (BUILT_IN_ROUND):
10187       return fold_builtin_round (loc, fndecl, arg0);
10188
10189     CASE_FLT_FN (BUILT_IN_NEARBYINT):
10190     CASE_FLT_FN (BUILT_IN_RINT):
10191       return fold_trunc_transparent_mathfn (loc, fndecl, arg0);
10192
10193     CASE_FLT_FN (BUILT_IN_LCEIL):
10194     CASE_FLT_FN (BUILT_IN_LLCEIL):
10195     CASE_FLT_FN (BUILT_IN_LFLOOR):
10196     CASE_FLT_FN (BUILT_IN_LLFLOOR):
10197     CASE_FLT_FN (BUILT_IN_LROUND):
10198     CASE_FLT_FN (BUILT_IN_LLROUND):
10199       return fold_builtin_int_roundingfn (loc, fndecl, arg0);
10200
10201     CASE_FLT_FN (BUILT_IN_LRINT):
10202     CASE_FLT_FN (BUILT_IN_LLRINT):
10203       return fold_fixed_mathfn (loc, fndecl, arg0);
10204
10205     case BUILT_IN_BSWAP32:
10206     case BUILT_IN_BSWAP64:
10207       return fold_builtin_bswap (fndecl, arg0);
10208
10209     CASE_INT_FN (BUILT_IN_FFS):
10210     CASE_INT_FN (BUILT_IN_CLZ):
10211     CASE_INT_FN (BUILT_IN_CTZ):
10212     CASE_INT_FN (BUILT_IN_POPCOUNT):
10213     CASE_INT_FN (BUILT_IN_PARITY):
10214       return fold_builtin_bitop (fndecl, arg0);
10215
10216     CASE_FLT_FN (BUILT_IN_SIGNBIT):
10217       return fold_builtin_signbit (loc, arg0, type);
10218
10219     CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
10220       return fold_builtin_significand (loc, arg0, type);
10221
10222     CASE_FLT_FN (BUILT_IN_ILOGB):
10223     CASE_FLT_FN (BUILT_IN_LOGB):
10224       return fold_builtin_logb (loc, arg0, type);
10225
10226     case BUILT_IN_ISASCII:
10227       return fold_builtin_isascii (loc, arg0);
10228
10229     case BUILT_IN_TOASCII:
10230       return fold_builtin_toascii (loc, arg0);
10231
10232     case BUILT_IN_ISDIGIT:
10233       return fold_builtin_isdigit (loc, arg0);
10234
10235     CASE_FLT_FN (BUILT_IN_FINITE):
10236     case BUILT_IN_FINITED32:
10237     case BUILT_IN_FINITED64:
10238     case BUILT_IN_FINITED128:
10239     case BUILT_IN_ISFINITE:
10240       {
10241         tree ret = fold_builtin_classify (loc, fndecl, arg0, BUILT_IN_ISFINITE);
10242         if (ret)
10243           return ret;
10244         return fold_builtin_interclass_mathfn (loc, fndecl, arg0);
10245       }
10246
10247     CASE_FLT_FN (BUILT_IN_ISINF):
10248     case BUILT_IN_ISINFD32:
10249     case BUILT_IN_ISINFD64:
10250     case BUILT_IN_ISINFD128:
10251       {
10252         tree ret = fold_builtin_classify (loc, fndecl, arg0, BUILT_IN_ISINF);
10253         if (ret)
10254           return ret;
10255         return fold_builtin_interclass_mathfn (loc, fndecl, arg0);
10256       }
10257
10258     case BUILT_IN_ISNORMAL:
10259       return fold_builtin_interclass_mathfn (loc, fndecl, arg0);
10260
10261     case BUILT_IN_ISINF_SIGN:
10262       return fold_builtin_classify (loc, fndecl, arg0, BUILT_IN_ISINF_SIGN);
10263
10264     CASE_FLT_FN (BUILT_IN_ISNAN):
10265     case BUILT_IN_ISNAND32:
10266     case BUILT_IN_ISNAND64:
10267     case BUILT_IN_ISNAND128:
10268       return fold_builtin_classify (loc, fndecl, arg0, BUILT_IN_ISNAN);
10269
10270     case BUILT_IN_PRINTF:
10271     case BUILT_IN_PRINTF_UNLOCKED:
10272     case BUILT_IN_VPRINTF:
10273       return fold_builtin_printf (loc, fndecl, arg0, NULL_TREE, ignore, fcode);
10274
10275     case BUILT_IN_FREE:
10276       if (integer_zerop (arg0))
10277         return build_empty_stmt (loc);
10278       break;
10279
10280     default:
10281       break;
10282     }
10283
10284   return NULL_TREE;
10285
10286 }
10287
10288 /* Fold a call to built-in function FNDECL with 2 arguments, ARG0 and ARG1.
10289    IGNORE is true if the result of the function call is ignored.  This
10290    function returns NULL_TREE if no simplification was possible.  */
10291
10292 static tree
10293 fold_builtin_2 (location_t loc, tree fndecl, tree arg0, tree arg1, bool ignore)
10294 {
10295   tree type = TREE_TYPE (TREE_TYPE (fndecl));
10296   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
10297
10298   switch (fcode)
10299     {
10300     CASE_FLT_FN (BUILT_IN_JN):
10301       if (validate_arg (arg0, INTEGER_TYPE)
10302           && validate_arg (arg1, REAL_TYPE))
10303         return do_mpfr_bessel_n (arg0, arg1, type, mpfr_jn, NULL, 0);
10304     break;
10305
10306     CASE_FLT_FN (BUILT_IN_YN):
10307       if (validate_arg (arg0, INTEGER_TYPE)
10308           && validate_arg (arg1, REAL_TYPE))
10309         return do_mpfr_bessel_n (arg0, arg1, type, mpfr_yn,
10310                                  &dconst0, false);
10311     break;
10312
10313     CASE_FLT_FN (BUILT_IN_DREM):
10314     CASE_FLT_FN (BUILT_IN_REMAINDER):
10315       if (validate_arg (arg0, REAL_TYPE)
10316           && validate_arg(arg1, REAL_TYPE))
10317         return do_mpfr_arg2 (arg0, arg1, type, mpfr_remainder);
10318     break;
10319
10320     CASE_FLT_FN_REENT (BUILT_IN_GAMMA): /* GAMMA_R */
10321     CASE_FLT_FN_REENT (BUILT_IN_LGAMMA): /* LGAMMA_R */
10322       if (validate_arg (arg0, REAL_TYPE)
10323           && validate_arg(arg1, POINTER_TYPE))
10324         return do_mpfr_lgamma_r (arg0, arg1, type);
10325     break;
10326
10327     CASE_FLT_FN (BUILT_IN_ATAN2):
10328       if (validate_arg (arg0, REAL_TYPE)
10329           && validate_arg(arg1, REAL_TYPE))
10330         return do_mpfr_arg2 (arg0, arg1, type, mpfr_atan2);
10331     break;
10332
10333     CASE_FLT_FN (BUILT_IN_FDIM):
10334       if (validate_arg (arg0, REAL_TYPE)
10335           && validate_arg(arg1, REAL_TYPE))
10336         return do_mpfr_arg2 (arg0, arg1, type, mpfr_dim);
10337     break;
10338
10339     CASE_FLT_FN (BUILT_IN_HYPOT):
10340       return fold_builtin_hypot (loc, fndecl, arg0, arg1, type);
10341
10342     CASE_FLT_FN (BUILT_IN_CPOW):
10343       if (validate_arg (arg0, COMPLEX_TYPE)
10344           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE
10345           && validate_arg (arg1, COMPLEX_TYPE)
10346           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg1))) == REAL_TYPE)
10347         return do_mpc_arg2 (arg0, arg1, type, /*do_nonfinite=*/ 0, mpc_pow);
10348     break;
10349
10350     CASE_FLT_FN (BUILT_IN_LDEXP):
10351       return fold_builtin_load_exponent (loc, arg0, arg1, type, /*ldexp=*/true);
10352     CASE_FLT_FN (BUILT_IN_SCALBN):
10353     CASE_FLT_FN (BUILT_IN_SCALBLN):
10354       return fold_builtin_load_exponent (loc, arg0, arg1,
10355                                          type, /*ldexp=*/false);
10356
10357     CASE_FLT_FN (BUILT_IN_FREXP):
10358       return fold_builtin_frexp (loc, arg0, arg1, type);
10359
10360     CASE_FLT_FN (BUILT_IN_MODF):
10361       return fold_builtin_modf (loc, arg0, arg1, type);
10362
10363     case BUILT_IN_BZERO:
10364       return fold_builtin_bzero (loc, arg0, arg1, ignore);
10365
10366     case BUILT_IN_FPUTS:
10367       return fold_builtin_fputs (loc, arg0, arg1, ignore, false, NULL_TREE);
10368
10369     case BUILT_IN_FPUTS_UNLOCKED:
10370       return fold_builtin_fputs (loc, arg0, arg1, ignore, true, NULL_TREE);
10371
10372     case BUILT_IN_STRSTR:
10373       return fold_builtin_strstr (loc, arg0, arg1, type);
10374
10375     case BUILT_IN_STRCAT:
10376       return fold_builtin_strcat (loc, arg0, arg1);
10377
10378     case BUILT_IN_STRSPN:
10379       return fold_builtin_strspn (loc, arg0, arg1);
10380
10381     case BUILT_IN_STRCSPN:
10382       return fold_builtin_strcspn (loc, arg0, arg1);
10383
10384     case BUILT_IN_STRCHR:
10385     case BUILT_IN_INDEX:
10386       return fold_builtin_strchr (loc, arg0, arg1, type);
10387
10388     case BUILT_IN_STRRCHR:
10389     case BUILT_IN_RINDEX:
10390       return fold_builtin_strrchr (loc, arg0, arg1, type);
10391
10392     case BUILT_IN_STRCPY:
10393       return fold_builtin_strcpy (loc, fndecl, arg0, arg1, NULL_TREE);
10394
10395     case BUILT_IN_STPCPY:
10396       if (ignore)
10397         {
10398           tree fn = implicit_built_in_decls[BUILT_IN_STRCPY];
10399           if (!fn)
10400             break;
10401
10402           return build_call_expr_loc (loc, fn, 2, arg0, arg1);
10403         }
10404       else
10405         return fold_builtin_stpcpy (loc, fndecl, arg0, arg1);
10406       break;
10407
10408     case BUILT_IN_STRCMP:
10409       return fold_builtin_strcmp (loc, arg0, arg1);
10410
10411     case BUILT_IN_STRPBRK:
10412       return fold_builtin_strpbrk (loc, arg0, arg1, type);
10413
10414     case BUILT_IN_EXPECT:
10415       return fold_builtin_expect (loc, arg0, arg1);
10416
10417     CASE_FLT_FN (BUILT_IN_POW):
10418       return fold_builtin_pow (loc, fndecl, arg0, arg1, type);
10419
10420     CASE_FLT_FN (BUILT_IN_POWI):
10421       return fold_builtin_powi (loc, fndecl, arg0, arg1, type);
10422
10423     CASE_FLT_FN (BUILT_IN_COPYSIGN):
10424       return fold_builtin_copysign (loc, fndecl, arg0, arg1, type);
10425
10426     CASE_FLT_FN (BUILT_IN_FMIN):
10427       return fold_builtin_fmin_fmax (loc, arg0, arg1, type, /*max=*/false);
10428
10429     CASE_FLT_FN (BUILT_IN_FMAX):
10430       return fold_builtin_fmin_fmax (loc, arg0, arg1, type, /*max=*/true);
10431
10432     case BUILT_IN_ISGREATER:
10433       return fold_builtin_unordered_cmp (loc, fndecl,
10434                                          arg0, arg1, UNLE_EXPR, LE_EXPR);
10435     case BUILT_IN_ISGREATEREQUAL:
10436       return fold_builtin_unordered_cmp (loc, fndecl,
10437                                          arg0, arg1, UNLT_EXPR, LT_EXPR);
10438     case BUILT_IN_ISLESS:
10439       return fold_builtin_unordered_cmp (loc, fndecl,
10440                                          arg0, arg1, UNGE_EXPR, GE_EXPR);
10441     case BUILT_IN_ISLESSEQUAL:
10442       return fold_builtin_unordered_cmp (loc, fndecl,
10443                                          arg0, arg1, UNGT_EXPR, GT_EXPR);
10444     case BUILT_IN_ISLESSGREATER:
10445       return fold_builtin_unordered_cmp (loc, fndecl,
10446                                          arg0, arg1, UNEQ_EXPR, EQ_EXPR);
10447     case BUILT_IN_ISUNORDERED:
10448       return fold_builtin_unordered_cmp (loc, fndecl,
10449                                          arg0, arg1, UNORDERED_EXPR,
10450                                          NOP_EXPR);
10451
10452       /* We do the folding for va_start in the expander.  */
10453     case BUILT_IN_VA_START:
10454       break;
10455
10456     case BUILT_IN_SPRINTF:
10457       return fold_builtin_sprintf (loc, arg0, arg1, NULL_TREE, ignore);
10458
10459     case BUILT_IN_OBJECT_SIZE:
10460       return fold_builtin_object_size (arg0, arg1);
10461
10462     case BUILT_IN_PRINTF:
10463     case BUILT_IN_PRINTF_UNLOCKED:
10464     case BUILT_IN_VPRINTF:
10465       return fold_builtin_printf (loc, fndecl, arg0, arg1, ignore, fcode);
10466
10467     case BUILT_IN_PRINTF_CHK:
10468     case BUILT_IN_VPRINTF_CHK:
10469       if (!validate_arg (arg0, INTEGER_TYPE)
10470           || TREE_SIDE_EFFECTS (arg0))
10471         return NULL_TREE;
10472       else
10473         return fold_builtin_printf (loc, fndecl,
10474                                     arg1, NULL_TREE, ignore, fcode);
10475     break;
10476
10477     case BUILT_IN_FPRINTF:
10478     case BUILT_IN_FPRINTF_UNLOCKED:
10479     case BUILT_IN_VFPRINTF:
10480       return fold_builtin_fprintf (loc, fndecl, arg0, arg1, NULL_TREE,
10481                                    ignore, fcode);
10482
10483     default:
10484       break;
10485     }
10486   return NULL_TREE;
10487 }
10488
10489 /* Fold a call to built-in function FNDECL with 3 arguments, ARG0, ARG1,
10490    and ARG2.  IGNORE is true if the result of the function call is ignored.
10491    This function returns NULL_TREE if no simplification was possible.  */
10492
10493 static tree
10494 fold_builtin_3 (location_t loc, tree fndecl,
10495                 tree arg0, tree arg1, tree arg2, bool ignore)
10496 {
10497   tree type = TREE_TYPE (TREE_TYPE (fndecl));
10498   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
10499   switch (fcode)
10500     {
10501
10502     CASE_FLT_FN (BUILT_IN_SINCOS):
10503       return fold_builtin_sincos (loc, arg0, arg1, arg2);
10504
10505     CASE_FLT_FN (BUILT_IN_FMA):
10506       return fold_builtin_fma (loc, arg0, arg1, arg2, type);
10507     break;
10508
10509     CASE_FLT_FN (BUILT_IN_REMQUO):
10510       if (validate_arg (arg0, REAL_TYPE)
10511           && validate_arg(arg1, REAL_TYPE)
10512           && validate_arg(arg2, POINTER_TYPE))
10513         return do_mpfr_remquo (arg0, arg1, arg2);
10514     break;
10515
10516     case BUILT_IN_MEMSET:
10517       return fold_builtin_memset (loc, arg0, arg1, arg2, type, ignore);
10518
10519     case BUILT_IN_BCOPY:
10520       return fold_builtin_memory_op (loc, arg1, arg0, arg2,
10521                                      void_type_node, true, /*endp=*/3);
10522
10523     case BUILT_IN_MEMCPY:
10524       return fold_builtin_memory_op (loc, arg0, arg1, arg2,
10525                                      type, ignore, /*endp=*/0);
10526
10527     case BUILT_IN_MEMPCPY:
10528       return fold_builtin_memory_op (loc, arg0, arg1, arg2,
10529                                      type, ignore, /*endp=*/1);
10530
10531     case BUILT_IN_MEMMOVE:
10532       return fold_builtin_memory_op (loc, arg0, arg1, arg2,
10533                                      type, ignore, /*endp=*/3);
10534
10535     case BUILT_IN_STRNCAT:
10536       return fold_builtin_strncat (loc, arg0, arg1, arg2);
10537
10538     case BUILT_IN_STRNCPY:
10539       return fold_builtin_strncpy (loc, fndecl, arg0, arg1, arg2, NULL_TREE);
10540
10541     case BUILT_IN_STRNCMP:
10542       return fold_builtin_strncmp (loc, arg0, arg1, arg2);
10543
10544     case BUILT_IN_MEMCHR:
10545       return fold_builtin_memchr (loc, arg0, arg1, arg2, type);
10546
10547     case BUILT_IN_BCMP:
10548     case BUILT_IN_MEMCMP:
10549       return fold_builtin_memcmp (loc, arg0, arg1, arg2);;
10550
10551     case BUILT_IN_SPRINTF:
10552       return fold_builtin_sprintf (loc, arg0, arg1, arg2, ignore);
10553
10554     case BUILT_IN_SNPRINTF:
10555       return fold_builtin_snprintf (loc, arg0, arg1, arg2, NULL_TREE, ignore);
10556
10557     case BUILT_IN_STRCPY_CHK:
10558     case BUILT_IN_STPCPY_CHK:
10559       return fold_builtin_stxcpy_chk (loc, fndecl, arg0, arg1, arg2, NULL_TREE,
10560                                       ignore, fcode);
10561
10562     case BUILT_IN_STRCAT_CHK:
10563       return fold_builtin_strcat_chk (loc, fndecl, arg0, arg1, arg2);
10564
10565     case BUILT_IN_PRINTF_CHK:
10566     case BUILT_IN_VPRINTF_CHK:
10567       if (!validate_arg (arg0, INTEGER_TYPE)
10568           || TREE_SIDE_EFFECTS (arg0))
10569         return NULL_TREE;
10570       else
10571         return fold_builtin_printf (loc, fndecl, arg1, arg2, ignore, fcode);
10572     break;
10573
10574     case BUILT_IN_FPRINTF:
10575     case BUILT_IN_FPRINTF_UNLOCKED:
10576     case BUILT_IN_VFPRINTF:
10577       return fold_builtin_fprintf (loc, fndecl, arg0, arg1, arg2,
10578                                    ignore, fcode);
10579
10580     case BUILT_IN_FPRINTF_CHK:
10581     case BUILT_IN_VFPRINTF_CHK:
10582       if (!validate_arg (arg1, INTEGER_TYPE)
10583           || TREE_SIDE_EFFECTS (arg1))
10584         return NULL_TREE;
10585       else
10586         return fold_builtin_fprintf (loc, fndecl, arg0, arg2, NULL_TREE,
10587                                      ignore, fcode);
10588
10589     default:
10590       break;
10591     }
10592   return NULL_TREE;
10593 }
10594
10595 /* Fold a call to built-in function FNDECL with 4 arguments, ARG0, ARG1,
10596    ARG2, and ARG3.  IGNORE is true if the result of the function call is
10597    ignored.  This function returns NULL_TREE if no simplification was
10598    possible.  */
10599
10600 static tree
10601 fold_builtin_4 (location_t loc, tree fndecl,
10602                 tree arg0, tree arg1, tree arg2, tree arg3, bool ignore)
10603 {
10604   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
10605
10606   switch (fcode)
10607     {
10608     case BUILT_IN_MEMCPY_CHK:
10609     case BUILT_IN_MEMPCPY_CHK:
10610     case BUILT_IN_MEMMOVE_CHK:
10611     case BUILT_IN_MEMSET_CHK:
10612       return fold_builtin_memory_chk (loc, fndecl, arg0, arg1, arg2, arg3,
10613                                       NULL_TREE, ignore,
10614                                       DECL_FUNCTION_CODE (fndecl));
10615
10616     case BUILT_IN_STRNCPY_CHK:
10617       return fold_builtin_strncpy_chk (loc, arg0, arg1, arg2, arg3, NULL_TREE);
10618
10619     case BUILT_IN_STRNCAT_CHK:
10620       return fold_builtin_strncat_chk (loc, fndecl, arg0, arg1, arg2, arg3);
10621
10622     case BUILT_IN_SNPRINTF:
10623       return fold_builtin_snprintf (loc, arg0, arg1, arg2, arg3, ignore);
10624
10625     case BUILT_IN_FPRINTF_CHK:
10626     case BUILT_IN_VFPRINTF_CHK:
10627       if (!validate_arg (arg1, INTEGER_TYPE)
10628           || TREE_SIDE_EFFECTS (arg1))
10629         return NULL_TREE;
10630       else
10631         return fold_builtin_fprintf (loc, fndecl, arg0, arg2, arg3,
10632                                      ignore, fcode);
10633     break;
10634
10635     default:
10636       break;
10637     }
10638   return NULL_TREE;
10639 }
10640
10641 /* Fold a call to built-in function FNDECL.  ARGS is an array of NARGS
10642     arguments, where NARGS <= 4.  IGNORE is true if the result of the
10643     function call is ignored.  This function returns NULL_TREE if no
10644     simplification was possible.  Note that this only folds builtins with
10645     fixed argument patterns.  Foldings that do varargs-to-varargs
10646     transformations, or that match calls with more than 4 arguments,
10647     need to be handled with fold_builtin_varargs instead.  */
10648
10649 #define MAX_ARGS_TO_FOLD_BUILTIN 4
10650
10651 static tree
10652 fold_builtin_n (location_t loc, tree fndecl, tree *args, int nargs, bool ignore)
10653 {
10654   tree ret = NULL_TREE;
10655
10656   switch (nargs)
10657     {
10658     case 0:
10659       ret = fold_builtin_0 (loc, fndecl, ignore);
10660       break;
10661     case 1:
10662       ret = fold_builtin_1 (loc, fndecl, args[0], ignore);
10663       break;
10664     case 2:
10665       ret = fold_builtin_2 (loc, fndecl, args[0], args[1], ignore);
10666       break;
10667     case 3:
10668       ret = fold_builtin_3 (loc, fndecl, args[0], args[1], args[2], ignore);
10669       break;
10670     case 4:
10671       ret = fold_builtin_4 (loc, fndecl, args[0], args[1], args[2], args[3],
10672                             ignore);
10673       break;
10674     default:
10675       break;
10676     }
10677   if (ret)
10678     {
10679       ret = build1 (NOP_EXPR, TREE_TYPE (ret), ret);
10680       SET_EXPR_LOCATION (ret, loc);
10681       TREE_NO_WARNING (ret) = 1;
10682       return ret;
10683     }
10684   return NULL_TREE;
10685 }
10686
10687 /* Builtins with folding operations that operate on "..." arguments
10688    need special handling; we need to store the arguments in a convenient
10689    data structure before attempting any folding.  Fortunately there are
10690    only a few builtins that fall into this category.  FNDECL is the
10691    function, EXP is the CALL_EXPR for the call, and IGNORE is true if the
10692    result of the function call is ignored.  */
10693
10694 static tree
10695 fold_builtin_varargs (location_t loc, tree fndecl, tree exp,
10696                       bool ignore ATTRIBUTE_UNUSED)
10697 {
10698   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
10699   tree ret = NULL_TREE;
10700
10701   switch (fcode)
10702     {
10703     case BUILT_IN_SPRINTF_CHK:
10704     case BUILT_IN_VSPRINTF_CHK:
10705       ret = fold_builtin_sprintf_chk (loc, exp, fcode);
10706       break;
10707
10708     case BUILT_IN_SNPRINTF_CHK:
10709     case BUILT_IN_VSNPRINTF_CHK:
10710       ret = fold_builtin_snprintf_chk (loc, exp, NULL_TREE, fcode);
10711       break;
10712
10713     case BUILT_IN_FPCLASSIFY:
10714       ret = fold_builtin_fpclassify (loc, exp);
10715       break;
10716
10717     default:
10718       break;
10719     }
10720   if (ret)
10721     {
10722       ret = build1 (NOP_EXPR, TREE_TYPE (ret), ret);
10723       SET_EXPR_LOCATION (ret, loc);
10724       TREE_NO_WARNING (ret) = 1;
10725       return ret;
10726     }
10727   return NULL_TREE;
10728 }
10729
10730 /* Return true if FNDECL shouldn't be folded right now.
10731    If a built-in function has an inline attribute always_inline
10732    wrapper, defer folding it after always_inline functions have
10733    been inlined, otherwise e.g. -D_FORTIFY_SOURCE checking
10734    might not be performed.  */
10735
10736 static bool
10737 avoid_folding_inline_builtin (tree fndecl)
10738 {
10739   return (DECL_DECLARED_INLINE_P (fndecl)
10740           && DECL_DISREGARD_INLINE_LIMITS (fndecl)
10741           && cfun
10742           && !cfun->always_inline_functions_inlined
10743           && lookup_attribute ("always_inline", DECL_ATTRIBUTES (fndecl)));
10744 }
10745
10746 /* A wrapper function for builtin folding that prevents warnings for
10747    "statement without effect" and the like, caused by removing the
10748    call node earlier than the warning is generated.  */
10749
10750 tree
10751 fold_call_expr (location_t loc, tree exp, bool ignore)
10752 {
10753   tree ret = NULL_TREE;
10754   tree fndecl = get_callee_fndecl (exp);
10755   if (fndecl
10756       && TREE_CODE (fndecl) == FUNCTION_DECL
10757       && DECL_BUILT_IN (fndecl)
10758       /* If CALL_EXPR_VA_ARG_PACK is set, the arguments aren't finalized
10759          yet.  Defer folding until we see all the arguments
10760          (after inlining).  */
10761       && !CALL_EXPR_VA_ARG_PACK (exp))
10762     {
10763       int nargs = call_expr_nargs (exp);
10764
10765       /* Before gimplification CALL_EXPR_VA_ARG_PACK is not set, but
10766          instead last argument is __builtin_va_arg_pack ().  Defer folding
10767          even in that case, until arguments are finalized.  */
10768       if (nargs && TREE_CODE (CALL_EXPR_ARG (exp, nargs - 1)) == CALL_EXPR)
10769         {
10770           tree fndecl2 = get_callee_fndecl (CALL_EXPR_ARG (exp, nargs - 1));
10771           if (fndecl2
10772               && TREE_CODE (fndecl2) == FUNCTION_DECL
10773               && DECL_BUILT_IN_CLASS (fndecl2) == BUILT_IN_NORMAL
10774               && DECL_FUNCTION_CODE (fndecl2) == BUILT_IN_VA_ARG_PACK)
10775             return NULL_TREE;
10776         }
10777
10778       if (avoid_folding_inline_builtin (fndecl))
10779         return NULL_TREE;
10780
10781       if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
10782         return targetm.fold_builtin (fndecl, call_expr_nargs (exp),
10783                                      CALL_EXPR_ARGP (exp), ignore);
10784       else
10785         {
10786           if (nargs <= MAX_ARGS_TO_FOLD_BUILTIN)
10787             {
10788               tree *args = CALL_EXPR_ARGP (exp);
10789               ret = fold_builtin_n (loc, fndecl, args, nargs, ignore);
10790             }
10791           if (!ret)
10792             ret = fold_builtin_varargs (loc, fndecl, exp, ignore);
10793           if (ret)
10794             return ret;
10795         }
10796     }
10797   return NULL_TREE;
10798 }
10799
10800 /* Conveniently construct a function call expression.  FNDECL names the
10801    function to be called and N arguments are passed in the array
10802    ARGARRAY.  */
10803
10804 tree
10805 build_call_expr_loc_array (location_t loc, tree fndecl, int n, tree *argarray)
10806 {
10807   tree fntype = TREE_TYPE (fndecl);
10808   tree fn = build1 (ADDR_EXPR, build_pointer_type (fntype), fndecl);
10809  
10810   return fold_builtin_call_array (loc, TREE_TYPE (fntype), fn, n, argarray);
10811 }
10812
10813 /* Conveniently construct a function call expression.  FNDECL names the
10814    function to be called and the arguments are passed in the vector
10815    VEC.  */
10816
10817 tree
10818 build_call_expr_loc_vec (location_t loc, tree fndecl, VEC(tree,gc) *vec)
10819 {
10820   return build_call_expr_loc_array (loc, fndecl, VEC_length (tree, vec),
10821                                     VEC_address (tree, vec));
10822 }
10823
10824
10825 /* Conveniently construct a function call expression.  FNDECL names the
10826    function to be called, N is the number of arguments, and the "..."
10827    parameters are the argument expressions.  */
10828
10829 tree
10830 build_call_expr_loc (location_t loc, tree fndecl, int n, ...)
10831 {
10832   va_list ap;
10833   tree *argarray = XALLOCAVEC (tree, n);
10834   int i;
10835
10836   va_start (ap, n);
10837   for (i = 0; i < n; i++)
10838     argarray[i] = va_arg (ap, tree);
10839   va_end (ap);
10840   return build_call_expr_loc_array (loc, fndecl, n, argarray);
10841 }
10842
10843 /* Like build_call_expr_loc (UNKNOWN_LOCATION, ...).  Duplicated because
10844    varargs macros aren't supported by all bootstrap compilers.  */
10845
10846 tree
10847 build_call_expr (tree fndecl, int n, ...)
10848 {
10849   va_list ap;
10850   tree *argarray = XALLOCAVEC (tree, n);
10851   int i;
10852
10853   va_start (ap, n);
10854   for (i = 0; i < n; i++)
10855     argarray[i] = va_arg (ap, tree);
10856   va_end (ap);
10857   return build_call_expr_loc_array (UNKNOWN_LOCATION, fndecl, n, argarray);
10858 }
10859
10860 /* Construct a CALL_EXPR with type TYPE with FN as the function expression.
10861    N arguments are passed in the array ARGARRAY.  */
10862
10863 tree
10864 fold_builtin_call_array (location_t loc, tree type,
10865                          tree fn,
10866                          int n,
10867                          tree *argarray)
10868 {
10869   tree ret = NULL_TREE;
10870    tree exp;
10871
10872   if (TREE_CODE (fn) == ADDR_EXPR)
10873   {
10874     tree fndecl = TREE_OPERAND (fn, 0);
10875     if (TREE_CODE (fndecl) == FUNCTION_DECL
10876         && DECL_BUILT_IN (fndecl))
10877       {
10878         /* If last argument is __builtin_va_arg_pack (), arguments to this
10879            function are not finalized yet.  Defer folding until they are.  */
10880         if (n && TREE_CODE (argarray[n - 1]) == CALL_EXPR)
10881           {
10882             tree fndecl2 = get_callee_fndecl (argarray[n - 1]);
10883             if (fndecl2
10884                 && TREE_CODE (fndecl2) == FUNCTION_DECL
10885                 && DECL_BUILT_IN_CLASS (fndecl2) == BUILT_IN_NORMAL
10886                 && DECL_FUNCTION_CODE (fndecl2) == BUILT_IN_VA_ARG_PACK)
10887               return build_call_array_loc (loc, type, fn, n, argarray);
10888           }
10889         if (avoid_folding_inline_builtin (fndecl))
10890           return build_call_array_loc (loc, type, fn, n, argarray);
10891         if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
10892           {
10893             ret = targetm.fold_builtin (fndecl, n, argarray, false);
10894             if (ret)
10895               return ret;
10896
10897             return build_call_array_loc (loc, type, fn, n, argarray);
10898           }
10899         else if (n <= MAX_ARGS_TO_FOLD_BUILTIN)
10900           {
10901             /* First try the transformations that don't require consing up
10902                an exp.  */
10903             ret = fold_builtin_n (loc, fndecl, argarray, n, false);
10904             if (ret)
10905               return ret;
10906           }
10907
10908         /* If we got this far, we need to build an exp.  */
10909         exp = build_call_array_loc (loc, type, fn, n, argarray);
10910         ret = fold_builtin_varargs (loc, fndecl, exp, false);
10911         return ret ? ret : exp;
10912       }
10913   }
10914
10915   return build_call_array_loc (loc, type, fn, n, argarray);
10916 }
10917
10918 /* Construct a new CALL_EXPR to FNDECL using the tail of the argument
10919    list ARGS along with N new arguments in NEWARGS.  SKIP is the number
10920    of arguments in ARGS to be omitted.  OLDNARGS is the number of
10921    elements in ARGS.  */
10922
10923 static tree
10924 rewrite_call_expr_valist (location_t loc, int oldnargs, tree *args,
10925                           int skip, tree fndecl, int n, va_list newargs)
10926 {
10927   int nargs = oldnargs - skip + n;
10928   tree *buffer;
10929
10930   if (n > 0)
10931     {
10932       int i, j;
10933
10934       buffer = XALLOCAVEC (tree, nargs);
10935       for (i = 0; i < n; i++)
10936         buffer[i] = va_arg (newargs, tree);
10937       for (j = skip; j < oldnargs; j++, i++)
10938         buffer[i] = args[j];
10939     }
10940   else
10941     buffer = args + skip;
10942
10943   return build_call_expr_loc_array (loc, fndecl, nargs, buffer);
10944 }
10945
10946 /* Construct a new CALL_EXPR to FNDECL using the tail of the argument
10947    list ARGS along with N new arguments specified as the "..."
10948    parameters.  SKIP is the number of arguments in ARGS to be omitted.
10949    OLDNARGS is the number of elements in ARGS.  */
10950
10951 static tree
10952 rewrite_call_expr_array (location_t loc, int oldnargs, tree *args,
10953                          int skip, tree fndecl, int n, ...)
10954 {
10955   va_list ap;
10956   tree t;
10957
10958   va_start (ap, n);
10959   t = rewrite_call_expr_valist (loc, oldnargs, args, skip, fndecl, n, ap);
10960   va_end (ap);
10961
10962   return t;
10963 }
10964
10965 /* Construct a new CALL_EXPR using the tail of the argument list of EXP
10966    along with N new arguments specified as the "..." parameters.  SKIP
10967    is the number of arguments in EXP to be omitted.  This function is used
10968    to do varargs-to-varargs transformations.  */
10969
10970 static tree
10971 rewrite_call_expr (location_t loc, tree exp, int skip, tree fndecl, int n, ...)
10972 {
10973   va_list ap;
10974   tree t;
10975
10976   va_start (ap, n);
10977   t = rewrite_call_expr_valist (loc, call_expr_nargs (exp),
10978                                 CALL_EXPR_ARGP (exp), skip, fndecl, n, ap);
10979   va_end (ap);
10980
10981   return t;
10982 }
10983
10984 /* Validate a single argument ARG against a tree code CODE representing
10985    a type.  */
10986
10987 static bool
10988 validate_arg (const_tree arg, enum tree_code code)
10989 {
10990   if (!arg)
10991     return false;
10992   else if (code == POINTER_TYPE)
10993     return POINTER_TYPE_P (TREE_TYPE (arg));
10994   else if (code == INTEGER_TYPE)
10995     return INTEGRAL_TYPE_P (TREE_TYPE (arg));
10996   return code == TREE_CODE (TREE_TYPE (arg));
10997 }
10998
10999 /* This function validates the types of a function call argument list
11000    against a specified list of tree_codes.  If the last specifier is a 0,
11001    that represents an ellipses, otherwise the last specifier must be a
11002    VOID_TYPE.
11003
11004    This is the GIMPLE version of validate_arglist.  Eventually we want to
11005    completely convert builtins.c to work from GIMPLEs and the tree based
11006    validate_arglist will then be removed.  */
11007
11008 bool
11009 validate_gimple_arglist (const_gimple call, ...)
11010 {
11011   enum tree_code code;
11012   bool res = 0;
11013   va_list ap;
11014   const_tree arg;
11015   size_t i;
11016
11017   va_start (ap, call);
11018   i = 0;
11019
11020   do
11021     {
11022       code = (enum tree_code) va_arg (ap, int);
11023       switch (code)
11024         {
11025         case 0:
11026           /* This signifies an ellipses, any further arguments are all ok.  */
11027           res = true;
11028           goto end;
11029         case VOID_TYPE:
11030           /* This signifies an endlink, if no arguments remain, return
11031              true, otherwise return false.  */
11032           res = (i == gimple_call_num_args (call));
11033           goto end;
11034         default:
11035           /* If no parameters remain or the parameter's code does not
11036              match the specified code, return false.  Otherwise continue
11037              checking any remaining arguments.  */
11038           arg = gimple_call_arg (call, i++);
11039           if (!validate_arg (arg, code))
11040             goto end;
11041           break;
11042         }
11043     }
11044   while (1);
11045
11046   /* We need gotos here since we can only have one VA_CLOSE in a
11047      function.  */
11048  end: ;
11049   va_end (ap);
11050
11051   return res;
11052 }
11053
11054 /* This function validates the types of a function call argument list
11055    against a specified list of tree_codes.  If the last specifier is a 0,
11056    that represents an ellipses, otherwise the last specifier must be a
11057    VOID_TYPE.  */
11058
11059 bool
11060 validate_arglist (const_tree callexpr, ...)
11061 {
11062   enum tree_code code;
11063   bool res = 0;
11064   va_list ap;
11065   const_call_expr_arg_iterator iter;
11066   const_tree arg;
11067
11068   va_start (ap, callexpr);
11069   init_const_call_expr_arg_iterator (callexpr, &iter);
11070
11071   do
11072     {
11073       code = (enum tree_code) va_arg (ap, int);
11074       switch (code)
11075         {
11076         case 0:
11077           /* This signifies an ellipses, any further arguments are all ok.  */
11078           res = true;
11079           goto end;
11080         case VOID_TYPE:
11081           /* This signifies an endlink, if no arguments remain, return
11082              true, otherwise return false.  */
11083           res = !more_const_call_expr_args_p (&iter);
11084           goto end;
11085         default:
11086           /* If no parameters remain or the parameter's code does not
11087              match the specified code, return false.  Otherwise continue
11088              checking any remaining arguments.  */
11089           arg = next_const_call_expr_arg (&iter);
11090           if (!validate_arg (arg, code))
11091             goto end;
11092           break;
11093         }
11094     }
11095   while (1);
11096
11097   /* We need gotos here since we can only have one VA_CLOSE in a
11098      function.  */
11099  end: ;
11100   va_end (ap);
11101
11102   return res;
11103 }
11104
11105 /* Default target-specific builtin expander that does nothing.  */
11106
11107 rtx
11108 default_expand_builtin (tree exp ATTRIBUTE_UNUSED,
11109                         rtx target ATTRIBUTE_UNUSED,
11110                         rtx subtarget ATTRIBUTE_UNUSED,
11111                         enum machine_mode mode ATTRIBUTE_UNUSED,
11112                         int ignore ATTRIBUTE_UNUSED)
11113 {
11114   return NULL_RTX;
11115 }
11116
11117 /* Returns true is EXP represents data that would potentially reside
11118    in a readonly section.  */
11119
11120 static bool
11121 readonly_data_expr (tree exp)
11122 {
11123   STRIP_NOPS (exp);
11124
11125   if (TREE_CODE (exp) != ADDR_EXPR)
11126     return false;
11127
11128   exp = get_base_address (TREE_OPERAND (exp, 0));
11129   if (!exp)
11130     return false;
11131
11132   /* Make sure we call decl_readonly_section only for trees it
11133      can handle (since it returns true for everything it doesn't
11134      understand).  */
11135   if (TREE_CODE (exp) == STRING_CST
11136       || TREE_CODE (exp) == CONSTRUCTOR
11137       || (TREE_CODE (exp) == VAR_DECL && TREE_STATIC (exp)))
11138     return decl_readonly_section (exp, 0);
11139   else
11140     return false;
11141 }
11142
11143 /* Simplify a call to the strstr builtin.  S1 and S2 are the arguments
11144    to the call, and TYPE is its return type.
11145
11146    Return NULL_TREE if no simplification was possible, otherwise return the
11147    simplified form of the call as a tree.
11148
11149    The simplified form may be a constant or other expression which
11150    computes the same value, but in a more efficient manner (including
11151    calls to other builtin functions).
11152
11153    The call may contain arguments which need to be evaluated, but
11154    which are not useful to determine the result of the call.  In
11155    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11156    COMPOUND_EXPR will be an argument which must be evaluated.
11157    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11158    COMPOUND_EXPR in the chain will contain the tree for the simplified
11159    form of the builtin function call.  */
11160
11161 static tree
11162 fold_builtin_strstr (location_t loc, tree s1, tree s2, tree type)
11163 {
11164   if (!validate_arg (s1, POINTER_TYPE)
11165       || !validate_arg (s2, POINTER_TYPE))
11166     return NULL_TREE;
11167   else
11168     {
11169       tree fn;
11170       const char *p1, *p2;
11171
11172       p2 = c_getstr (s2);
11173       if (p2 == NULL)
11174         return NULL_TREE;
11175
11176       p1 = c_getstr (s1);
11177       if (p1 != NULL)
11178         {
11179           const char *r = strstr (p1, p2);
11180           tree tem;
11181
11182           if (r == NULL)
11183             return build_int_cst (TREE_TYPE (s1), 0);
11184
11185           /* Return an offset into the constant string argument.  */
11186           tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
11187                              s1, size_int (r - p1));
11188           return fold_convert_loc (loc, type, tem);
11189         }
11190
11191       /* The argument is const char *, and the result is char *, so we need
11192          a type conversion here to avoid a warning.  */
11193       if (p2[0] == '\0')
11194         return fold_convert_loc (loc, type, s1);
11195
11196       if (p2[1] != '\0')
11197         return NULL_TREE;
11198
11199       fn = implicit_built_in_decls[BUILT_IN_STRCHR];
11200       if (!fn)
11201         return NULL_TREE;
11202
11203       /* New argument list transforming strstr(s1, s2) to
11204          strchr(s1, s2[0]).  */
11205       return build_call_expr_loc (loc, fn, 2, s1, build_int_cst (NULL_TREE, p2[0]));
11206     }
11207 }
11208
11209 /* Simplify a call to the strchr builtin.  S1 and S2 are the arguments to
11210    the call, and TYPE is its return type.
11211
11212    Return NULL_TREE if no simplification was possible, otherwise return the
11213    simplified form of the call as a tree.
11214
11215    The simplified form may be a constant or other expression which
11216    computes the same value, but in a more efficient manner (including
11217    calls to other builtin functions).
11218
11219    The call may contain arguments which need to be evaluated, but
11220    which are not useful to determine the result of the call.  In
11221    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11222    COMPOUND_EXPR will be an argument which must be evaluated.
11223    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11224    COMPOUND_EXPR in the chain will contain the tree for the simplified
11225    form of the builtin function call.  */
11226
11227 static tree
11228 fold_builtin_strchr (location_t loc, tree s1, tree s2, tree type)
11229 {
11230   if (!validate_arg (s1, POINTER_TYPE)
11231       || !validate_arg (s2, INTEGER_TYPE))
11232     return NULL_TREE;
11233   else
11234     {
11235       const char *p1;
11236
11237       if (TREE_CODE (s2) != INTEGER_CST)
11238         return NULL_TREE;
11239
11240       p1 = c_getstr (s1);
11241       if (p1 != NULL)
11242         {
11243           char c;
11244           const char *r;
11245           tree tem;
11246
11247           if (target_char_cast (s2, &c))
11248             return NULL_TREE;
11249
11250           r = strchr (p1, c);
11251
11252           if (r == NULL)
11253             return build_int_cst (TREE_TYPE (s1), 0);
11254
11255           /* Return an offset into the constant string argument.  */
11256           tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
11257                              s1, size_int (r - p1));
11258           return fold_convert_loc (loc, type, tem);
11259         }
11260       return NULL_TREE;
11261     }
11262 }
11263
11264 /* Simplify a call to the strrchr builtin.  S1 and S2 are the arguments to
11265    the call, and TYPE is its return type.
11266
11267    Return NULL_TREE if no simplification was possible, otherwise return the
11268    simplified form of the call as a tree.
11269
11270    The simplified form may be a constant or other expression which
11271    computes the same value, but in a more efficient manner (including
11272    calls to other builtin functions).
11273
11274    The call may contain arguments which need to be evaluated, but
11275    which are not useful to determine the result of the call.  In
11276    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11277    COMPOUND_EXPR will be an argument which must be evaluated.
11278    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11279    COMPOUND_EXPR in the chain will contain the tree for the simplified
11280    form of the builtin function call.  */
11281
11282 static tree
11283 fold_builtin_strrchr (location_t loc, tree s1, tree s2, tree type)
11284 {
11285   if (!validate_arg (s1, POINTER_TYPE)
11286       || !validate_arg (s2, INTEGER_TYPE))
11287     return NULL_TREE;
11288   else
11289     {
11290       tree fn;
11291       const char *p1;
11292
11293       if (TREE_CODE (s2) != INTEGER_CST)
11294         return NULL_TREE;
11295
11296       p1 = c_getstr (s1);
11297       if (p1 != NULL)
11298         {
11299           char c;
11300           const char *r;
11301           tree tem;
11302
11303           if (target_char_cast (s2, &c))
11304             return NULL_TREE;
11305
11306           r = strrchr (p1, c);
11307
11308           if (r == NULL)
11309             return build_int_cst (TREE_TYPE (s1), 0);
11310
11311           /* Return an offset into the constant string argument.  */
11312           tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
11313                              s1, size_int (r - p1));
11314           return fold_convert_loc (loc, type, tem);
11315         }
11316
11317       if (! integer_zerop (s2))
11318         return NULL_TREE;
11319
11320       fn = implicit_built_in_decls[BUILT_IN_STRCHR];
11321       if (!fn)
11322         return NULL_TREE;
11323
11324       /* Transform strrchr(s1, '\0') to strchr(s1, '\0').  */
11325       return build_call_expr_loc (loc, fn, 2, s1, s2);
11326     }
11327 }
11328
11329 /* Simplify a call to the strpbrk builtin.  S1 and S2 are the arguments
11330    to the call, and TYPE is its return type.
11331
11332    Return NULL_TREE if no simplification was possible, otherwise return the
11333    simplified form of the call as a tree.
11334
11335    The simplified form may be a constant or other expression which
11336    computes the same value, but in a more efficient manner (including
11337    calls to other builtin functions).
11338
11339    The call may contain arguments which need to be evaluated, but
11340    which are not useful to determine the result of the call.  In
11341    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11342    COMPOUND_EXPR will be an argument which must be evaluated.
11343    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11344    COMPOUND_EXPR in the chain will contain the tree for the simplified
11345    form of the builtin function call.  */
11346
11347 static tree
11348 fold_builtin_strpbrk (location_t loc, tree s1, tree s2, tree type)
11349 {
11350   if (!validate_arg (s1, POINTER_TYPE)
11351       || !validate_arg (s2, POINTER_TYPE))
11352     return NULL_TREE;
11353   else
11354     {
11355       tree fn;
11356       const char *p1, *p2;
11357
11358       p2 = c_getstr (s2);
11359       if (p2 == NULL)
11360         return NULL_TREE;
11361
11362       p1 = c_getstr (s1);
11363       if (p1 != NULL)
11364         {
11365           const char *r = strpbrk (p1, p2);
11366           tree tem;
11367
11368           if (r == NULL)
11369             return build_int_cst (TREE_TYPE (s1), 0);
11370
11371           /* Return an offset into the constant string argument.  */
11372           tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
11373                              s1, size_int (r - p1));
11374           return fold_convert_loc (loc, type, tem);
11375         }
11376
11377       if (p2[0] == '\0')
11378         /* strpbrk(x, "") == NULL.
11379            Evaluate and ignore s1 in case it had side-effects.  */
11380         return omit_one_operand_loc (loc, TREE_TYPE (s1), integer_zero_node, s1);
11381
11382       if (p2[1] != '\0')
11383         return NULL_TREE;  /* Really call strpbrk.  */
11384
11385       fn = implicit_built_in_decls[BUILT_IN_STRCHR];
11386       if (!fn)
11387         return NULL_TREE;
11388
11389       /* New argument list transforming strpbrk(s1, s2) to
11390          strchr(s1, s2[0]).  */
11391       return build_call_expr_loc (loc, fn, 2, s1, build_int_cst (NULL_TREE, p2[0]));
11392     }
11393 }
11394
11395 /* Simplify a call to the strcat builtin.  DST and SRC are the arguments
11396    to the call.
11397
11398    Return NULL_TREE if no simplification was possible, otherwise return the
11399    simplified form of the call as a tree.
11400
11401    The simplified form may be a constant or other expression which
11402    computes the same value, but in a more efficient manner (including
11403    calls to other builtin functions).
11404
11405    The call may contain arguments which need to be evaluated, but
11406    which are not useful to determine the result of the call.  In
11407    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11408    COMPOUND_EXPR will be an argument which must be evaluated.
11409    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11410    COMPOUND_EXPR in the chain will contain the tree for the simplified
11411    form of the builtin function call.  */
11412
11413 static tree
11414 fold_builtin_strcat (location_t loc ATTRIBUTE_UNUSED, tree dst, tree src)
11415 {
11416   if (!validate_arg (dst, POINTER_TYPE)
11417       || !validate_arg (src, POINTER_TYPE))
11418     return NULL_TREE;
11419   else
11420     {
11421       const char *p = c_getstr (src);
11422
11423       /* If the string length is zero, return the dst parameter.  */
11424       if (p && *p == '\0')
11425         return dst;
11426
11427       if (optimize_insn_for_speed_p ())
11428         {
11429           /* See if we can store by pieces into (dst + strlen(dst)).  */
11430           tree newdst, call;
11431           tree strlen_fn = implicit_built_in_decls[BUILT_IN_STRLEN];
11432           tree strcpy_fn = implicit_built_in_decls[BUILT_IN_STRCPY];
11433
11434           if (!strlen_fn || !strcpy_fn)
11435             return NULL_TREE;
11436
11437           /* If we don't have a movstr we don't want to emit an strcpy
11438              call.  We have to do that if the length of the source string
11439              isn't computable (in that case we can use memcpy probably
11440              later expanding to a sequence of mov instructions).  If we
11441              have movstr instructions we can emit strcpy calls.  */
11442           if (!HAVE_movstr)
11443             {
11444               tree len = c_strlen (src, 1);
11445               if (! len || TREE_SIDE_EFFECTS (len))
11446                 return NULL_TREE;
11447             }
11448
11449           /* Stabilize the argument list.  */
11450           dst = builtin_save_expr (dst);
11451
11452           /* Create strlen (dst).  */
11453           newdst = build_call_expr_loc (loc, strlen_fn, 1, dst);
11454           /* Create (dst p+ strlen (dst)).  */
11455
11456           newdst = fold_build2_loc (loc, POINTER_PLUS_EXPR,
11457                                 TREE_TYPE (dst), dst, newdst);
11458           newdst = builtin_save_expr (newdst);
11459
11460           call = build_call_expr_loc (loc, strcpy_fn, 2, newdst, src);
11461           return build2 (COMPOUND_EXPR, TREE_TYPE (dst), call, dst);
11462         }
11463       return NULL_TREE;
11464     }
11465 }
11466
11467 /* Simplify a call to the strncat builtin.  DST, SRC, and LEN are the
11468    arguments to the call.
11469
11470    Return NULL_TREE if no simplification was possible, otherwise return the
11471    simplified form of the call as a tree.
11472
11473    The simplified form may be a constant or other expression which
11474    computes the same value, but in a more efficient manner (including
11475    calls to other builtin functions).
11476
11477    The call may contain arguments which need to be evaluated, but
11478    which are not useful to determine the result of the call.  In
11479    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11480    COMPOUND_EXPR will be an argument which must be evaluated.
11481    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11482    COMPOUND_EXPR in the chain will contain the tree for the simplified
11483    form of the builtin function call.  */
11484
11485 static tree
11486 fold_builtin_strncat (location_t loc, tree dst, tree src, tree len)
11487 {
11488   if (!validate_arg (dst, POINTER_TYPE)
11489       || !validate_arg (src, POINTER_TYPE)
11490       || !validate_arg (len, INTEGER_TYPE))
11491     return NULL_TREE;
11492   else
11493     {
11494       const char *p = c_getstr (src);
11495
11496       /* If the requested length is zero, or the src parameter string
11497          length is zero, return the dst parameter.  */
11498       if (integer_zerop (len) || (p && *p == '\0'))
11499         return omit_two_operands_loc (loc, TREE_TYPE (dst), dst, src, len);
11500
11501       /* If the requested len is greater than or equal to the string
11502          length, call strcat.  */
11503       if (TREE_CODE (len) == INTEGER_CST && p
11504           && compare_tree_int (len, strlen (p)) >= 0)
11505         {
11506           tree fn = implicit_built_in_decls[BUILT_IN_STRCAT];
11507
11508           /* If the replacement _DECL isn't initialized, don't do the
11509              transformation.  */
11510           if (!fn)
11511             return NULL_TREE;
11512
11513           return build_call_expr_loc (loc, fn, 2, dst, src);
11514         }
11515       return NULL_TREE;
11516     }
11517 }
11518
11519 /* Simplify a call to the strspn builtin.  S1 and S2 are the arguments
11520    to the call.
11521
11522    Return NULL_TREE if no simplification was possible, otherwise return the
11523    simplified form of the call as a tree.
11524
11525    The simplified form may be a constant or other expression which
11526    computes the same value, but in a more efficient manner (including
11527    calls to other builtin functions).
11528
11529    The call may contain arguments which need to be evaluated, but
11530    which are not useful to determine the result of the call.  In
11531    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11532    COMPOUND_EXPR will be an argument which must be evaluated.
11533    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11534    COMPOUND_EXPR in the chain will contain the tree for the simplified
11535    form of the builtin function call.  */
11536
11537 static tree
11538 fold_builtin_strspn (location_t loc, tree s1, tree s2)
11539 {
11540   if (!validate_arg (s1, POINTER_TYPE)
11541       || !validate_arg (s2, POINTER_TYPE))
11542     return NULL_TREE;
11543   else
11544     {
11545       const char *p1 = c_getstr (s1), *p2 = c_getstr (s2);
11546
11547       /* If both arguments are constants, evaluate at compile-time.  */
11548       if (p1 && p2)
11549         {
11550           const size_t r = strspn (p1, p2);
11551           return size_int (r);
11552         }
11553
11554       /* If either argument is "", return NULL_TREE.  */
11555       if ((p1 && *p1 == '\0') || (p2 && *p2 == '\0'))
11556         /* Evaluate and ignore both arguments in case either one has
11557            side-effects.  */
11558         return omit_two_operands_loc (loc, size_type_node, size_zero_node,
11559                                   s1, s2);
11560       return NULL_TREE;
11561     }
11562 }
11563
11564 /* Simplify a call to the strcspn builtin.  S1 and S2 are the arguments
11565    to the call.
11566
11567    Return NULL_TREE if no simplification was possible, otherwise return the
11568    simplified form of the call as a tree.
11569
11570    The simplified form may be a constant or other expression which
11571    computes the same value, but in a more efficient manner (including
11572    calls to other builtin functions).
11573
11574    The call may contain arguments which need to be evaluated, but
11575    which are not useful to determine the result of the call.  In
11576    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11577    COMPOUND_EXPR will be an argument which must be evaluated.
11578    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11579    COMPOUND_EXPR in the chain will contain the tree for the simplified
11580    form of the builtin function call.  */
11581
11582 static tree
11583 fold_builtin_strcspn (location_t loc, tree s1, tree s2)
11584 {
11585   if (!validate_arg (s1, POINTER_TYPE)
11586       || !validate_arg (s2, POINTER_TYPE))
11587     return NULL_TREE;
11588   else
11589     {
11590       const char *p1 = c_getstr (s1), *p2 = c_getstr (s2);
11591
11592       /* If both arguments are constants, evaluate at compile-time.  */
11593       if (p1 && p2)
11594         {
11595           const size_t r = strcspn (p1, p2);
11596           return size_int (r);
11597         }
11598
11599       /* If the first argument is "", return NULL_TREE.  */
11600       if (p1 && *p1 == '\0')
11601         {
11602           /* Evaluate and ignore argument s2 in case it has
11603              side-effects.  */
11604           return omit_one_operand_loc (loc, size_type_node,
11605                                    size_zero_node, s2);
11606         }
11607
11608       /* If the second argument is "", return __builtin_strlen(s1).  */
11609       if (p2 && *p2 == '\0')
11610         {
11611           tree fn = implicit_built_in_decls[BUILT_IN_STRLEN];
11612
11613           /* If the replacement _DECL isn't initialized, don't do the
11614              transformation.  */
11615           if (!fn)
11616             return NULL_TREE;
11617
11618           return build_call_expr_loc (loc, fn, 1, s1);
11619         }
11620       return NULL_TREE;
11621     }
11622 }
11623
11624 /* Fold a call to the fputs builtin.  ARG0 and ARG1 are the arguments
11625    to the call.  IGNORE is true if the value returned
11626    by the builtin will be ignored.  UNLOCKED is true is true if this
11627    actually a call to fputs_unlocked.  If LEN in non-NULL, it represents
11628    the known length of the string.  Return NULL_TREE if no simplification
11629    was possible.  */
11630
11631 tree
11632 fold_builtin_fputs (location_t loc, tree arg0, tree arg1,
11633                     bool ignore, bool unlocked, tree len)
11634 {
11635   /* If we're using an unlocked function, assume the other unlocked
11636      functions exist explicitly.  */
11637   tree const fn_fputc = unlocked ? built_in_decls[BUILT_IN_FPUTC_UNLOCKED]
11638     : implicit_built_in_decls[BUILT_IN_FPUTC];
11639   tree const fn_fwrite = unlocked ? built_in_decls[BUILT_IN_FWRITE_UNLOCKED]
11640     : implicit_built_in_decls[BUILT_IN_FWRITE];
11641
11642   /* If the return value is used, don't do the transformation.  */
11643   if (!ignore)
11644     return NULL_TREE;
11645
11646   /* Verify the arguments in the original call.  */
11647   if (!validate_arg (arg0, POINTER_TYPE)
11648       || !validate_arg (arg1, POINTER_TYPE))
11649     return NULL_TREE;
11650
11651   if (! len)
11652     len = c_strlen (arg0, 0);
11653
11654   /* Get the length of the string passed to fputs.  If the length
11655      can't be determined, punt.  */
11656   if (!len
11657       || TREE_CODE (len) != INTEGER_CST)
11658     return NULL_TREE;
11659
11660   switch (compare_tree_int (len, 1))
11661     {
11662     case -1: /* length is 0, delete the call entirely .  */
11663       return omit_one_operand_loc (loc, integer_type_node,
11664                                integer_zero_node, arg1);;
11665
11666     case 0: /* length is 1, call fputc.  */
11667       {
11668         const char *p = c_getstr (arg0);
11669
11670         if (p != NULL)
11671           {
11672             if (fn_fputc)
11673               return build_call_expr_loc (loc, fn_fputc, 2,
11674                                       build_int_cst (NULL_TREE, p[0]), arg1);
11675             else
11676               return NULL_TREE;
11677           }
11678       }
11679       /* FALLTHROUGH */
11680     case 1: /* length is greater than 1, call fwrite.  */
11681       {
11682         /* If optimizing for size keep fputs.  */
11683         if (optimize_function_for_size_p (cfun))
11684           return NULL_TREE;
11685         /* New argument list transforming fputs(string, stream) to
11686            fwrite(string, 1, len, stream).  */
11687         if (fn_fwrite)
11688           return build_call_expr_loc (loc, fn_fwrite, 4, arg0,
11689                                   size_one_node, len, arg1);
11690         else
11691           return NULL_TREE;
11692       }
11693     default:
11694       gcc_unreachable ();
11695     }
11696   return NULL_TREE;
11697 }
11698
11699 /* Fold the next_arg or va_start call EXP. Returns true if there was an error
11700    produced.  False otherwise.  This is done so that we don't output the error
11701    or warning twice or three times.  */
11702
11703 bool
11704 fold_builtin_next_arg (tree exp, bool va_start_p)
11705 {
11706   tree fntype = TREE_TYPE (current_function_decl);
11707   int nargs = call_expr_nargs (exp);
11708   tree arg;
11709
11710   if (!stdarg_p (fntype))
11711     {
11712       error ("%<va_start%> used in function with fixed args");
11713       return true;
11714     }
11715
11716   if (va_start_p)
11717     {
11718       if (va_start_p && (nargs != 2))
11719         {
11720           error ("wrong number of arguments to function %<va_start%>");
11721           return true;
11722         }
11723       arg = CALL_EXPR_ARG (exp, 1);
11724     }
11725   /* We use __builtin_va_start (ap, 0, 0) or __builtin_next_arg (0, 0)
11726      when we checked the arguments and if needed issued a warning.  */
11727   else
11728     {
11729       if (nargs == 0)
11730         {
11731           /* Evidently an out of date version of <stdarg.h>; can't validate
11732              va_start's second argument, but can still work as intended.  */
11733           warning (0, "%<__builtin_next_arg%> called without an argument");
11734           return true;
11735         }
11736       else if (nargs > 1)
11737         {
11738           error ("wrong number of arguments to function %<__builtin_next_arg%>");
11739           return true;
11740         }
11741       arg = CALL_EXPR_ARG (exp, 0);
11742     }
11743
11744   if (TREE_CODE (arg) == SSA_NAME)
11745     arg = SSA_NAME_VAR (arg);
11746
11747   /* We destructively modify the call to be __builtin_va_start (ap, 0)
11748      or __builtin_next_arg (0) the first time we see it, after checking
11749      the arguments and if needed issuing a warning.  */
11750   if (!integer_zerop (arg))
11751     {
11752       tree last_parm = tree_last (DECL_ARGUMENTS (current_function_decl));
11753
11754       /* Strip off all nops for the sake of the comparison.  This
11755          is not quite the same as STRIP_NOPS.  It does more.
11756          We must also strip off INDIRECT_EXPR for C++ reference
11757          parameters.  */
11758       while (CONVERT_EXPR_P (arg)
11759              || TREE_CODE (arg) == INDIRECT_REF)
11760         arg = TREE_OPERAND (arg, 0);
11761       if (arg != last_parm)
11762         {
11763           /* FIXME: Sometimes with the tree optimizers we can get the
11764              not the last argument even though the user used the last
11765              argument.  We just warn and set the arg to be the last
11766              argument so that we will get wrong-code because of
11767              it.  */
11768           warning (0, "second parameter of %<va_start%> not last named argument");
11769         }
11770
11771       /* Undefined by C99 7.15.1.4p4 (va_start):
11772          "If the parameter parmN is declared with the register storage
11773          class, with a function or array type, or with a type that is
11774          not compatible with the type that results after application of
11775          the default argument promotions, the behavior is undefined."
11776       */
11777       else if (DECL_REGISTER (arg))
11778         warning (0, "undefined behaviour when second parameter of "
11779                  "%<va_start%> is declared with %<register%> storage");
11780
11781       /* We want to verify the second parameter just once before the tree
11782          optimizers are run and then avoid keeping it in the tree,
11783          as otherwise we could warn even for correct code like:
11784          void foo (int i, ...)
11785          { va_list ap; i++; va_start (ap, i); va_end (ap); }  */
11786       if (va_start_p)
11787         CALL_EXPR_ARG (exp, 1) = integer_zero_node;
11788       else
11789         CALL_EXPR_ARG (exp, 0) = integer_zero_node;
11790     }
11791   return false;
11792 }
11793
11794
11795 /* Simplify a call to the sprintf builtin with arguments DEST, FMT, and ORIG.
11796    ORIG may be null if this is a 2-argument call.  We don't attempt to
11797    simplify calls with more than 3 arguments.
11798
11799    Return NULL_TREE if no simplification was possible, otherwise return the
11800    simplified form of the call as a tree.  If IGNORED is true, it means that
11801    the caller does not use the returned value of the function.  */
11802
11803 static tree
11804 fold_builtin_sprintf (location_t loc, tree dest, tree fmt,
11805                       tree orig, int ignored)
11806 {
11807   tree call, retval;
11808   const char *fmt_str = NULL;
11809
11810   /* Verify the required arguments in the original call.  We deal with two
11811      types of sprintf() calls: 'sprintf (str, fmt)' and
11812      'sprintf (dest, "%s", orig)'.  */
11813   if (!validate_arg (dest, POINTER_TYPE)
11814       || !validate_arg (fmt, POINTER_TYPE))
11815     return NULL_TREE;
11816   if (orig && !validate_arg (orig, POINTER_TYPE))
11817     return NULL_TREE;
11818
11819   /* Check whether the format is a literal string constant.  */
11820   fmt_str = c_getstr (fmt);
11821   if (fmt_str == NULL)
11822     return NULL_TREE;
11823
11824   call = NULL_TREE;
11825   retval = NULL_TREE;
11826
11827   if (!init_target_chars ())
11828     return NULL_TREE;
11829
11830   /* If the format doesn't contain % args or %%, use strcpy.  */
11831   if (strchr (fmt_str, target_percent) == NULL)
11832     {
11833       tree fn = implicit_built_in_decls[BUILT_IN_STRCPY];
11834
11835       if (!fn)
11836         return NULL_TREE;
11837
11838       /* Don't optimize sprintf (buf, "abc", ptr++).  */
11839       if (orig)
11840         return NULL_TREE;
11841
11842       /* Convert sprintf (str, fmt) into strcpy (str, fmt) when
11843          'format' is known to contain no % formats.  */
11844       call = build_call_expr_loc (loc, fn, 2, dest, fmt);
11845       if (!ignored)
11846         retval = build_int_cst (NULL_TREE, strlen (fmt_str));
11847     }
11848
11849   /* If the format is "%s", use strcpy if the result isn't used.  */
11850   else if (fmt_str && strcmp (fmt_str, target_percent_s) == 0)
11851     {
11852       tree fn;
11853       fn = implicit_built_in_decls[BUILT_IN_STRCPY];
11854
11855       if (!fn)
11856         return NULL_TREE;
11857
11858       /* Don't crash on sprintf (str1, "%s").  */
11859       if (!orig)
11860         return NULL_TREE;
11861
11862       /* Convert sprintf (str1, "%s", str2) into strcpy (str1, str2).  */
11863       if (!ignored)
11864         {
11865           retval = c_strlen (orig, 1);
11866           if (!retval || TREE_CODE (retval) != INTEGER_CST)
11867             return NULL_TREE;
11868         }
11869       call = build_call_expr_loc (loc, fn, 2, dest, orig);
11870     }
11871
11872   if (call && retval)
11873     {
11874       retval = fold_convert_loc
11875         (loc, TREE_TYPE (TREE_TYPE (implicit_built_in_decls[BUILT_IN_SPRINTF])),
11876          retval);
11877       return build2 (COMPOUND_EXPR, TREE_TYPE (retval), call, retval);
11878     }
11879   else
11880     return call;
11881 }
11882
11883 /* Simplify a call to the snprintf builtin with arguments DEST, DESTSIZE,
11884    FMT, and ORIG.  ORIG may be null if this is a 3-argument call.  We don't
11885    attempt to simplify calls with more than 4 arguments.
11886
11887    Return NULL_TREE if no simplification was possible, otherwise return the
11888    simplified form of the call as a tree.  If IGNORED is true, it means that
11889    the caller does not use the returned value of the function.  */
11890
11891 static tree
11892 fold_builtin_snprintf (location_t loc, tree dest, tree destsize, tree fmt,
11893                        tree orig, int ignored)
11894 {
11895   tree call, retval;
11896   const char *fmt_str = NULL;
11897   unsigned HOST_WIDE_INT destlen;
11898
11899   /* Verify the required arguments in the original call.  We deal with two
11900      types of snprintf() calls: 'snprintf (str, cst, fmt)' and
11901      'snprintf (dest, cst, "%s", orig)'.  */
11902   if (!validate_arg (dest, POINTER_TYPE)
11903       || !validate_arg (destsize, INTEGER_TYPE)
11904       || !validate_arg (fmt, POINTER_TYPE))
11905     return NULL_TREE;
11906   if (orig && !validate_arg (orig, POINTER_TYPE))
11907     return NULL_TREE;
11908
11909   if (!host_integerp (destsize, 1))
11910     return NULL_TREE;
11911
11912   /* Check whether the format is a literal string constant.  */
11913   fmt_str = c_getstr (fmt);
11914   if (fmt_str == NULL)
11915     return NULL_TREE;
11916
11917   call = NULL_TREE;
11918   retval = NULL_TREE;
11919
11920   if (!init_target_chars ())
11921     return NULL_TREE;
11922
11923   destlen = tree_low_cst (destsize, 1);
11924
11925   /* If the format doesn't contain % args or %%, use strcpy.  */
11926   if (strchr (fmt_str, target_percent) == NULL)
11927     {
11928       tree fn = implicit_built_in_decls[BUILT_IN_STRCPY];
11929       size_t len = strlen (fmt_str);
11930
11931       /* Don't optimize snprintf (buf, 4, "abc", ptr++).  */
11932       if (orig)
11933         return NULL_TREE;
11934
11935       /* We could expand this as
11936          memcpy (str, fmt, cst - 1); str[cst - 1] = '\0';
11937          or to
11938          memcpy (str, fmt_with_nul_at_cstm1, cst);
11939          but in the former case that might increase code size
11940          and in the latter case grow .rodata section too much.
11941          So punt for now.  */
11942       if (len >= destlen)
11943         return NULL_TREE;
11944
11945       if (!fn)
11946         return NULL_TREE;
11947
11948       /* Convert snprintf (str, cst, fmt) into strcpy (str, fmt) when
11949          'format' is known to contain no % formats and
11950          strlen (fmt) < cst.  */
11951       call = build_call_expr_loc (loc, fn, 2, dest, fmt);
11952
11953       if (!ignored)
11954         retval = build_int_cst (NULL_TREE, strlen (fmt_str));
11955     }
11956
11957   /* If the format is "%s", use strcpy if the result isn't used.  */
11958   else if (fmt_str && strcmp (fmt_str, target_percent_s) == 0)
11959     {
11960       tree fn = implicit_built_in_decls[BUILT_IN_STRCPY];
11961       unsigned HOST_WIDE_INT origlen;
11962
11963       /* Don't crash on snprintf (str1, cst, "%s").  */
11964       if (!orig)
11965         return NULL_TREE;
11966
11967       retval = c_strlen (orig, 1);
11968       if (!retval || !host_integerp (retval, 1))  
11969         return NULL_TREE;
11970
11971       origlen = tree_low_cst (retval, 1);
11972       /* We could expand this as
11973          memcpy (str1, str2, cst - 1); str1[cst - 1] = '\0';
11974          or to
11975          memcpy (str1, str2_with_nul_at_cstm1, cst);
11976          but in the former case that might increase code size
11977          and in the latter case grow .rodata section too much.
11978          So punt for now.  */
11979       if (origlen >= destlen)
11980         return NULL_TREE;
11981
11982       /* Convert snprintf (str1, cst, "%s", str2) into
11983          strcpy (str1, str2) if strlen (str2) < cst.  */
11984       if (!fn)
11985         return NULL_TREE;
11986
11987       call = build_call_expr_loc (loc, fn, 2, dest, orig);
11988
11989       if (ignored)
11990         retval = NULL_TREE;
11991     }
11992
11993   if (call && retval)
11994     {
11995       tree fn = built_in_decls[BUILT_IN_SNPRINTF];
11996       retval = fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fn)), retval);
11997       return build2 (COMPOUND_EXPR, TREE_TYPE (retval), call, retval);
11998     }
11999   else
12000     return call;
12001 }
12002
12003 /* Expand a call EXP to __builtin_object_size.  */
12004
12005 rtx
12006 expand_builtin_object_size (tree exp)
12007 {
12008   tree ost;
12009   int object_size_type;
12010   tree fndecl = get_callee_fndecl (exp);
12011
12012   if (!validate_arglist (exp, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
12013     {
12014       error ("%Kfirst argument of %D must be a pointer, second integer constant",
12015              exp, fndecl);
12016       expand_builtin_trap ();
12017       return const0_rtx;
12018     }
12019
12020   ost = CALL_EXPR_ARG (exp, 1);
12021   STRIP_NOPS (ost);
12022
12023   if (TREE_CODE (ost) != INTEGER_CST
12024       || tree_int_cst_sgn (ost) < 0
12025       || compare_tree_int (ost, 3) > 0)
12026     {
12027       error ("%Klast argument of %D is not integer constant between 0 and 3",
12028              exp, fndecl);
12029       expand_builtin_trap ();
12030       return const0_rtx;
12031     }
12032
12033   object_size_type = tree_low_cst (ost, 0);
12034
12035   return object_size_type < 2 ? constm1_rtx : const0_rtx;
12036 }
12037
12038 /* Expand EXP, a call to the __mem{cpy,pcpy,move,set}_chk builtin.
12039    FCODE is the BUILT_IN_* to use.
12040    Return NULL_RTX if we failed; the caller should emit a normal call,
12041    otherwise try to get the result in TARGET, if convenient (and in
12042    mode MODE if that's convenient).  */
12043
12044 static rtx
12045 expand_builtin_memory_chk (tree exp, rtx target, enum machine_mode mode,
12046                            enum built_in_function fcode)
12047 {
12048   tree dest, src, len, size;
12049
12050   if (!validate_arglist (exp,
12051                          POINTER_TYPE,
12052                          fcode == BUILT_IN_MEMSET_CHK
12053                          ? INTEGER_TYPE : POINTER_TYPE,
12054                          INTEGER_TYPE, INTEGER_TYPE, VOID_TYPE))
12055     return NULL_RTX;
12056
12057   dest = CALL_EXPR_ARG (exp, 0);
12058   src = CALL_EXPR_ARG (exp, 1);
12059   len = CALL_EXPR_ARG (exp, 2);
12060   size = CALL_EXPR_ARG (exp, 3);
12061
12062   if (! host_integerp (size, 1))
12063     return NULL_RTX;
12064
12065   if (host_integerp (len, 1) || integer_all_onesp (size))
12066     {
12067       tree fn;
12068
12069       if (! integer_all_onesp (size) && tree_int_cst_lt (size, len))
12070         {
12071           warning_at (tree_nonartificial_location (exp),
12072                       0, "%Kcall to %D will always overflow destination buffer",
12073                       exp, get_callee_fndecl (exp));
12074           return NULL_RTX;
12075         }
12076
12077       fn = NULL_TREE;
12078       /* If __builtin_mem{cpy,pcpy,move,set}_chk is used, assume
12079          mem{cpy,pcpy,move,set} is available.  */
12080       switch (fcode)
12081         {
12082         case BUILT_IN_MEMCPY_CHK:
12083           fn = built_in_decls[BUILT_IN_MEMCPY];
12084           break;
12085         case BUILT_IN_MEMPCPY_CHK:
12086           fn = built_in_decls[BUILT_IN_MEMPCPY];
12087           break;
12088         case BUILT_IN_MEMMOVE_CHK:
12089           fn = built_in_decls[BUILT_IN_MEMMOVE];
12090           break;
12091         case BUILT_IN_MEMSET_CHK:
12092           fn = built_in_decls[BUILT_IN_MEMSET];
12093           break;
12094         default:
12095           break;
12096         }
12097
12098       if (! fn)
12099         return NULL_RTX;
12100
12101       fn = build_call_nofold_loc (EXPR_LOCATION (exp), fn, 3, dest, src, len);
12102       gcc_assert (TREE_CODE (fn) == CALL_EXPR);
12103       CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (exp);
12104       return expand_expr (fn, target, mode, EXPAND_NORMAL);
12105     }
12106   else if (fcode == BUILT_IN_MEMSET_CHK)
12107     return NULL_RTX;
12108   else
12109     {
12110       unsigned int dest_align
12111         = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
12112
12113       /* If DEST is not a pointer type, call the normal function.  */
12114       if (dest_align == 0)
12115         return NULL_RTX;
12116
12117       /* If SRC and DEST are the same (and not volatile), do nothing.  */
12118       if (operand_equal_p (src, dest, 0))
12119         {
12120           tree expr;
12121
12122           if (fcode != BUILT_IN_MEMPCPY_CHK)
12123             {
12124               /* Evaluate and ignore LEN in case it has side-effects.  */
12125               expand_expr (len, const0_rtx, VOIDmode, EXPAND_NORMAL);
12126               return expand_expr (dest, target, mode, EXPAND_NORMAL);
12127             }
12128
12129           expr = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len);
12130           return expand_expr (expr, target, mode, EXPAND_NORMAL);
12131         }
12132
12133       /* __memmove_chk special case.  */
12134       if (fcode == BUILT_IN_MEMMOVE_CHK)
12135         {
12136           unsigned int src_align
12137             = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
12138
12139           if (src_align == 0)
12140             return NULL_RTX;
12141
12142           /* If src is categorized for a readonly section we can use
12143              normal __memcpy_chk.  */
12144           if (readonly_data_expr (src))
12145             {
12146               tree fn = built_in_decls[BUILT_IN_MEMCPY_CHK];
12147               if (!fn)
12148                 return NULL_RTX;
12149               fn = build_call_nofold_loc (EXPR_LOCATION (exp), fn, 4,
12150                                           dest, src, len, size);
12151               gcc_assert (TREE_CODE (fn) == CALL_EXPR);
12152               CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (exp);
12153               return expand_expr (fn, target, mode, EXPAND_NORMAL);
12154             }
12155         }
12156       return NULL_RTX;
12157     }
12158 }
12159
12160 /* Emit warning if a buffer overflow is detected at compile time.  */
12161
12162 static void
12163 maybe_emit_chk_warning (tree exp, enum built_in_function fcode)
12164 {
12165   int is_strlen = 0;
12166   tree len, size;
12167   location_t loc = tree_nonartificial_location (exp);
12168
12169   switch (fcode)
12170     {
12171     case BUILT_IN_STRCPY_CHK:
12172     case BUILT_IN_STPCPY_CHK:
12173     /* For __strcat_chk the warning will be emitted only if overflowing
12174        by at least strlen (dest) + 1 bytes.  */
12175     case BUILT_IN_STRCAT_CHK:
12176       len = CALL_EXPR_ARG (exp, 1);
12177       size = CALL_EXPR_ARG (exp, 2);
12178       is_strlen = 1;
12179       break;
12180     case BUILT_IN_STRNCAT_CHK:
12181     case BUILT_IN_STRNCPY_CHK:
12182       len = CALL_EXPR_ARG (exp, 2);
12183       size = CALL_EXPR_ARG (exp, 3);
12184       break;
12185     case BUILT_IN_SNPRINTF_CHK:
12186     case BUILT_IN_VSNPRINTF_CHK:
12187       len = CALL_EXPR_ARG (exp, 1);
12188       size = CALL_EXPR_ARG (exp, 3);
12189       break;
12190     default:
12191       gcc_unreachable ();
12192     }
12193
12194   if (!len || !size)
12195     return;
12196
12197   if (! host_integerp (size, 1) || integer_all_onesp (size))
12198     return;
12199
12200   if (is_strlen)
12201     {
12202       len = c_strlen (len, 1);
12203       if (! len || ! host_integerp (len, 1) || tree_int_cst_lt (len, size))
12204         return;
12205     }
12206   else if (fcode == BUILT_IN_STRNCAT_CHK)
12207     {
12208       tree src = CALL_EXPR_ARG (exp, 1);
12209       if (! src || ! host_integerp (len, 1) || tree_int_cst_lt (len, size))
12210         return;
12211       src = c_strlen (src, 1);
12212       if (! src || ! host_integerp (src, 1))
12213         {
12214           warning_at (loc, 0, "%Kcall to %D might overflow destination buffer",
12215                       exp, get_callee_fndecl (exp));
12216           return;
12217         }
12218       else if (tree_int_cst_lt (src, size))
12219         return;
12220     }
12221   else if (! host_integerp (len, 1) || ! tree_int_cst_lt (size, len))
12222     return;
12223
12224   warning_at (loc, 0, "%Kcall to %D will always overflow destination buffer",
12225               exp, get_callee_fndecl (exp));
12226 }
12227
12228 /* Emit warning if a buffer overflow is detected at compile time
12229    in __sprintf_chk/__vsprintf_chk calls.  */
12230
12231 static void
12232 maybe_emit_sprintf_chk_warning (tree exp, enum built_in_function fcode)
12233 {
12234   tree size, len, fmt;
12235   const char *fmt_str;
12236   int nargs = call_expr_nargs (exp);
12237
12238   /* Verify the required arguments in the original call.  */
12239
12240   if (nargs < 4)
12241     return;
12242   size = CALL_EXPR_ARG (exp, 2);
12243   fmt = CALL_EXPR_ARG (exp, 3);
12244
12245   if (! host_integerp (size, 1) || integer_all_onesp (size))
12246     return;
12247
12248   /* Check whether the format is a literal string constant.  */
12249   fmt_str = c_getstr (fmt);
12250   if (fmt_str == NULL)
12251     return;
12252
12253   if (!init_target_chars ())
12254     return;
12255
12256   /* If the format doesn't contain % args or %%, we know its size.  */
12257   if (strchr (fmt_str, target_percent) == 0)
12258     len = build_int_cstu (size_type_node, strlen (fmt_str));
12259   /* If the format is "%s" and first ... argument is a string literal,
12260      we know it too.  */
12261   else if (fcode == BUILT_IN_SPRINTF_CHK
12262            && strcmp (fmt_str, target_percent_s) == 0)
12263     {
12264       tree arg;
12265
12266       if (nargs < 5)
12267         return;
12268       arg = CALL_EXPR_ARG (exp, 4);
12269       if (! POINTER_TYPE_P (TREE_TYPE (arg)))
12270         return;
12271
12272       len = c_strlen (arg, 1);
12273       if (!len || ! host_integerp (len, 1))
12274         return;
12275     }
12276   else
12277     return;
12278
12279   if (! tree_int_cst_lt (len, size))
12280     warning_at (tree_nonartificial_location (exp),
12281                 0, "%Kcall to %D will always overflow destination buffer",
12282                 exp, get_callee_fndecl (exp));
12283 }
12284
12285 /* Emit warning if a free is called with address of a variable.  */
12286
12287 static void
12288 maybe_emit_free_warning (tree exp)
12289 {
12290   tree arg = CALL_EXPR_ARG (exp, 0);
12291
12292   STRIP_NOPS (arg);
12293   if (TREE_CODE (arg) != ADDR_EXPR)
12294     return;
12295
12296   arg = get_base_address (TREE_OPERAND (arg, 0));
12297   if (arg == NULL || INDIRECT_REF_P (arg) || TREE_CODE (arg) == MEM_REF)
12298     return;
12299
12300   if (SSA_VAR_P (arg))
12301     warning_at (tree_nonartificial_location (exp),
12302                 0, "%Kattempt to free a non-heap object %qD", exp, arg);
12303   else
12304     warning_at (tree_nonartificial_location (exp),
12305                 0, "%Kattempt to free a non-heap object", exp);
12306 }
12307
12308 /* Fold a call to __builtin_object_size with arguments PTR and OST,
12309    if possible.  */
12310
12311 tree
12312 fold_builtin_object_size (tree ptr, tree ost)
12313 {
12314   unsigned HOST_WIDE_INT bytes;
12315   int object_size_type;
12316
12317   if (!validate_arg (ptr, POINTER_TYPE)
12318       || !validate_arg (ost, INTEGER_TYPE))
12319     return NULL_TREE;
12320
12321   STRIP_NOPS (ost);
12322
12323   if (TREE_CODE (ost) != INTEGER_CST
12324       || tree_int_cst_sgn (ost) < 0
12325       || compare_tree_int (ost, 3) > 0)
12326     return NULL_TREE;
12327
12328   object_size_type = tree_low_cst (ost, 0);
12329
12330   /* __builtin_object_size doesn't evaluate side-effects in its arguments;
12331      if there are any side-effects, it returns (size_t) -1 for types 0 and 1
12332      and (size_t) 0 for types 2 and 3.  */
12333   if (TREE_SIDE_EFFECTS (ptr))
12334     return build_int_cst_type (size_type_node, object_size_type < 2 ? -1 : 0);
12335
12336   if (TREE_CODE (ptr) == ADDR_EXPR)
12337     {
12338       bytes = compute_builtin_object_size (ptr, object_size_type);
12339       if (double_int_fits_to_tree_p (size_type_node,
12340                                      uhwi_to_double_int (bytes)))
12341         return build_int_cstu (size_type_node, bytes);
12342     }
12343   else if (TREE_CODE (ptr) == SSA_NAME)
12344     {
12345       /* If object size is not known yet, delay folding until
12346        later.  Maybe subsequent passes will help determining
12347        it.  */
12348       bytes = compute_builtin_object_size (ptr, object_size_type);
12349       if (bytes != (unsigned HOST_WIDE_INT) (object_size_type < 2 ? -1 : 0)
12350           && double_int_fits_to_tree_p (size_type_node,
12351                                         uhwi_to_double_int (bytes)))
12352         return build_int_cstu (size_type_node, bytes);
12353     }
12354
12355   return NULL_TREE;
12356 }
12357
12358 /* Fold a call to the __mem{cpy,pcpy,move,set}_chk builtin.
12359    DEST, SRC, LEN, and SIZE are the arguments to the call.
12360    IGNORE is true, if return value can be ignored.  FCODE is the BUILT_IN_*
12361    code of the builtin.  If MAXLEN is not NULL, it is maximum length
12362    passed as third argument.  */
12363
12364 tree
12365 fold_builtin_memory_chk (location_t loc, tree fndecl,
12366                          tree dest, tree src, tree len, tree size,
12367                          tree maxlen, bool ignore,
12368                          enum built_in_function fcode)
12369 {
12370   tree fn;
12371
12372   if (!validate_arg (dest, POINTER_TYPE)
12373       || !validate_arg (src,
12374                         (fcode == BUILT_IN_MEMSET_CHK
12375                          ? INTEGER_TYPE : POINTER_TYPE))
12376       || !validate_arg (len, INTEGER_TYPE)
12377       || !validate_arg (size, INTEGER_TYPE))
12378     return NULL_TREE;
12379
12380   /* If SRC and DEST are the same (and not volatile), return DEST
12381      (resp. DEST+LEN for __mempcpy_chk).  */
12382   if (fcode != BUILT_IN_MEMSET_CHK && operand_equal_p (src, dest, 0))
12383     {
12384       if (fcode != BUILT_IN_MEMPCPY_CHK)
12385         return omit_one_operand_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)),
12386                                  dest, len);
12387       else
12388         {
12389           tree temp = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (dest),
12390                                    dest, len);
12391           return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), temp);
12392         }
12393     }
12394
12395   if (! host_integerp (size, 1))
12396     return NULL_TREE;
12397
12398   if (! integer_all_onesp (size))
12399     {
12400       if (! host_integerp (len, 1))
12401         {
12402           /* If LEN is not constant, try MAXLEN too.
12403              For MAXLEN only allow optimizing into non-_ocs function
12404              if SIZE is >= MAXLEN, never convert to __ocs_fail ().  */
12405           if (maxlen == NULL_TREE || ! host_integerp (maxlen, 1))
12406             {
12407               if (fcode == BUILT_IN_MEMPCPY_CHK && ignore)
12408                 {
12409                   /* (void) __mempcpy_chk () can be optimized into
12410                      (void) __memcpy_chk ().  */
12411                   fn = built_in_decls[BUILT_IN_MEMCPY_CHK];
12412                   if (!fn)
12413                     return NULL_TREE;
12414
12415                   return build_call_expr_loc (loc, fn, 4, dest, src, len, size);
12416                 }
12417               return NULL_TREE;
12418             }
12419         }
12420       else
12421         maxlen = len;
12422
12423       if (tree_int_cst_lt (size, maxlen))
12424         return NULL_TREE;
12425     }
12426
12427   fn = NULL_TREE;
12428   /* If __builtin_mem{cpy,pcpy,move,set}_chk is used, assume
12429      mem{cpy,pcpy,move,set} is available.  */
12430   switch (fcode)
12431     {
12432     case BUILT_IN_MEMCPY_CHK:
12433       fn = built_in_decls[BUILT_IN_MEMCPY];
12434       break;
12435     case BUILT_IN_MEMPCPY_CHK:
12436       fn = built_in_decls[BUILT_IN_MEMPCPY];
12437       break;
12438     case BUILT_IN_MEMMOVE_CHK:
12439       fn = built_in_decls[BUILT_IN_MEMMOVE];
12440       break;
12441     case BUILT_IN_MEMSET_CHK:
12442       fn = built_in_decls[BUILT_IN_MEMSET];
12443       break;
12444     default:
12445       break;
12446     }
12447
12448   if (!fn)
12449     return NULL_TREE;
12450
12451   return build_call_expr_loc (loc, fn, 3, dest, src, len);
12452 }
12453
12454 /* Fold a call to the __st[rp]cpy_chk builtin.
12455    DEST, SRC, and SIZE are the arguments to the call.
12456    IGNORE is true if return value can be ignored.  FCODE is the BUILT_IN_*
12457    code of the builtin.  If MAXLEN is not NULL, it is maximum length of
12458    strings passed as second argument.  */
12459
12460 tree
12461 fold_builtin_stxcpy_chk (location_t loc, tree fndecl, tree dest,
12462                          tree src, tree size,
12463                          tree maxlen, bool ignore,
12464                          enum built_in_function fcode)
12465 {
12466   tree len, fn;
12467
12468   if (!validate_arg (dest, POINTER_TYPE)
12469       || !validate_arg (src, POINTER_TYPE)
12470       || !validate_arg (size, INTEGER_TYPE))
12471     return NULL_TREE;
12472
12473   /* If SRC and DEST are the same (and not volatile), return DEST.  */
12474   if (fcode == BUILT_IN_STRCPY_CHK && operand_equal_p (src, dest, 0))
12475     return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest);
12476
12477   if (! host_integerp (size, 1))
12478     return NULL_TREE;
12479
12480   if (! integer_all_onesp (size))
12481     {
12482       len = c_strlen (src, 1);
12483       if (! len || ! host_integerp (len, 1))
12484         {
12485           /* If LEN is not constant, try MAXLEN too.
12486              For MAXLEN only allow optimizing into non-_ocs function
12487              if SIZE is >= MAXLEN, never convert to __ocs_fail ().  */
12488           if (maxlen == NULL_TREE || ! host_integerp (maxlen, 1))
12489             {
12490               if (fcode == BUILT_IN_STPCPY_CHK)
12491                 {
12492                   if (! ignore)
12493                     return NULL_TREE;
12494
12495                   /* If return value of __stpcpy_chk is ignored,
12496                      optimize into __strcpy_chk.  */
12497                   fn = built_in_decls[BUILT_IN_STRCPY_CHK];
12498                   if (!fn)
12499                     return NULL_TREE;
12500
12501                   return build_call_expr_loc (loc, fn, 3, dest, src, size);
12502                 }
12503
12504               if (! len || TREE_SIDE_EFFECTS (len))
12505                 return NULL_TREE;
12506
12507               /* If c_strlen returned something, but not a constant,
12508                  transform __strcpy_chk into __memcpy_chk.  */
12509               fn = built_in_decls[BUILT_IN_MEMCPY_CHK];
12510               if (!fn)
12511                 return NULL_TREE;
12512
12513               len = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
12514               return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)),
12515                                        build_call_expr_loc (loc, fn, 4,
12516                                                         dest, src, len, size));
12517             }
12518         }
12519       else
12520         maxlen = len;
12521
12522       if (! tree_int_cst_lt (maxlen, size))
12523         return NULL_TREE;
12524     }
12525
12526   /* If __builtin_st{r,p}cpy_chk is used, assume st{r,p}cpy is available.  */
12527   fn = built_in_decls[fcode == BUILT_IN_STPCPY_CHK
12528                       ? BUILT_IN_STPCPY : BUILT_IN_STRCPY];
12529   if (!fn)
12530     return NULL_TREE;
12531
12532   return build_call_expr_loc (loc, fn, 2, dest, src);
12533 }
12534
12535 /* Fold a call to the __strncpy_chk builtin.  DEST, SRC, LEN, and SIZE
12536    are the arguments to the call.  If MAXLEN is not NULL, it is maximum
12537    length passed as third argument.  */
12538
12539 tree
12540 fold_builtin_strncpy_chk (location_t loc, tree dest, tree src,
12541                           tree len, tree size, tree maxlen)
12542 {
12543   tree fn;
12544
12545   if (!validate_arg (dest, POINTER_TYPE)
12546       || !validate_arg (src, POINTER_TYPE)
12547       || !validate_arg (len, INTEGER_TYPE)
12548       || !validate_arg (size, INTEGER_TYPE))
12549     return NULL_TREE;
12550
12551   if (! host_integerp (size, 1))
12552     return NULL_TREE;
12553
12554   if (! integer_all_onesp (size))
12555     {
12556       if (! host_integerp (len, 1))
12557         {
12558           /* If LEN is not constant, try MAXLEN too.
12559              For MAXLEN only allow optimizing into non-_ocs function
12560              if SIZE is >= MAXLEN, never convert to __ocs_fail ().  */
12561           if (maxlen == NULL_TREE || ! host_integerp (maxlen, 1))
12562             return NULL_TREE;
12563         }
12564       else
12565         maxlen = len;
12566
12567       if (tree_int_cst_lt (size, maxlen))
12568         return NULL_TREE;
12569     }
12570
12571   /* If __builtin_strncpy_chk is used, assume strncpy is available.  */
12572   fn = built_in_decls[BUILT_IN_STRNCPY];
12573   if (!fn)
12574     return NULL_TREE;
12575
12576   return build_call_expr_loc (loc, fn, 3, dest, src, len);
12577 }
12578
12579 /* Fold a call to the __strcat_chk builtin FNDECL.  DEST, SRC, and SIZE
12580    are the arguments to the call.  */
12581
12582 static tree
12583 fold_builtin_strcat_chk (location_t loc, tree fndecl, tree dest,
12584                          tree src, tree size)
12585 {
12586   tree fn;
12587   const char *p;
12588
12589   if (!validate_arg (dest, POINTER_TYPE)
12590       || !validate_arg (src, POINTER_TYPE)
12591       || !validate_arg (size, INTEGER_TYPE))
12592     return NULL_TREE;
12593
12594   p = c_getstr (src);
12595   /* If the SRC parameter is "", return DEST.  */
12596   if (p && *p == '\0')
12597     return omit_one_operand_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest, src);
12598
12599   if (! host_integerp (size, 1) || ! integer_all_onesp (size))
12600     return NULL_TREE;
12601
12602   /* If __builtin_strcat_chk is used, assume strcat is available.  */
12603   fn = built_in_decls[BUILT_IN_STRCAT];
12604   if (!fn)
12605     return NULL_TREE;
12606
12607   return build_call_expr_loc (loc, fn, 2, dest, src);
12608 }
12609
12610 /* Fold a call to the __strncat_chk builtin with arguments DEST, SRC,
12611    LEN, and SIZE.  */
12612
12613 static tree
12614 fold_builtin_strncat_chk (location_t loc, tree fndecl,
12615                           tree dest, tree src, tree len, tree size)
12616 {
12617   tree fn;
12618   const char *p;
12619
12620   if (!validate_arg (dest, POINTER_TYPE)
12621       || !validate_arg (src, POINTER_TYPE)
12622       || !validate_arg (size, INTEGER_TYPE)
12623       || !validate_arg (size, INTEGER_TYPE))
12624     return NULL_TREE;
12625
12626   p = c_getstr (src);
12627   /* If the SRC parameter is "" or if LEN is 0, return DEST.  */
12628   if (p && *p == '\0')
12629     return omit_one_operand_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest, len);
12630   else if (integer_zerop (len))
12631     return omit_one_operand_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest, src);
12632
12633   if (! host_integerp (size, 1))
12634     return NULL_TREE;
12635
12636   if (! integer_all_onesp (size))
12637     {
12638       tree src_len = c_strlen (src, 1);
12639       if (src_len
12640           && host_integerp (src_len, 1)
12641           && host_integerp (len, 1)
12642           && ! tree_int_cst_lt (len, src_len))
12643         {
12644           /* If LEN >= strlen (SRC), optimize into __strcat_chk.  */
12645           fn = built_in_decls[BUILT_IN_STRCAT_CHK];
12646           if (!fn)
12647             return NULL_TREE;
12648
12649           return build_call_expr_loc (loc, fn, 3, dest, src, size);
12650         }
12651       return NULL_TREE;
12652     }
12653
12654   /* If __builtin_strncat_chk is used, assume strncat is available.  */
12655   fn = built_in_decls[BUILT_IN_STRNCAT];
12656   if (!fn)
12657     return NULL_TREE;
12658
12659   return build_call_expr_loc (loc, fn, 3, dest, src, len);
12660 }
12661
12662 /* Fold a call EXP to __{,v}sprintf_chk having NARGS passed as ARGS.
12663    Return NULL_TREE if a normal call should be emitted rather than
12664    expanding the function inline.  FCODE is either BUILT_IN_SPRINTF_CHK
12665    or BUILT_IN_VSPRINTF_CHK.  */
12666
12667 static tree
12668 fold_builtin_sprintf_chk_1 (location_t loc, int nargs, tree *args,
12669                             enum built_in_function fcode)
12670 {
12671   tree dest, size, len, fn, fmt, flag;
12672   const char *fmt_str;
12673
12674   /* Verify the required arguments in the original call.  */
12675   if (nargs < 4)
12676     return NULL_TREE;
12677   dest = args[0];
12678   if (!validate_arg (dest, POINTER_TYPE))
12679     return NULL_TREE;
12680   flag = args[1];
12681   if (!validate_arg (flag, INTEGER_TYPE))
12682     return NULL_TREE;
12683   size = args[2];
12684   if (!validate_arg (size, INTEGER_TYPE))
12685     return NULL_TREE;
12686   fmt = args[3];
12687   if (!validate_arg (fmt, POINTER_TYPE))
12688     return NULL_TREE;
12689
12690   if (! host_integerp (size, 1))
12691     return NULL_TREE;
12692
12693   len = NULL_TREE;
12694
12695   if (!init_target_chars ())
12696     return NULL_TREE;
12697
12698   /* Check whether the format is a literal string constant.  */
12699   fmt_str = c_getstr (fmt);
12700   if (fmt_str != NULL)
12701     {
12702       /* If the format doesn't contain % args or %%, we know the size.  */
12703       if (strchr (fmt_str, target_percent) == 0)
12704         {
12705           if (fcode != BUILT_IN_SPRINTF_CHK || nargs == 4)
12706             len = build_int_cstu (size_type_node, strlen (fmt_str));
12707         }
12708       /* If the format is "%s" and first ... argument is a string literal,
12709          we know the size too.  */
12710       else if (fcode == BUILT_IN_SPRINTF_CHK
12711                && strcmp (fmt_str, target_percent_s) == 0)
12712         {
12713           tree arg;
12714
12715           if (nargs == 5)
12716             {
12717               arg = args[4];
12718               if (validate_arg (arg, POINTER_TYPE))
12719                 {
12720                   len = c_strlen (arg, 1);
12721                   if (! len || ! host_integerp (len, 1))
12722                     len = NULL_TREE;
12723                 }
12724             }
12725         }
12726     }
12727
12728   if (! integer_all_onesp (size))
12729     {
12730       if (! len || ! tree_int_cst_lt (len, size))
12731         return NULL_TREE;
12732     }
12733
12734   /* Only convert __{,v}sprintf_chk to {,v}sprintf if flag is 0
12735      or if format doesn't contain % chars or is "%s".  */
12736   if (! integer_zerop (flag))
12737     {
12738       if (fmt_str == NULL)
12739         return NULL_TREE;
12740       if (strchr (fmt_str, target_percent) != NULL
12741           && strcmp (fmt_str, target_percent_s))
12742         return NULL_TREE;
12743     }
12744
12745   /* If __builtin_{,v}sprintf_chk is used, assume {,v}sprintf is available.  */
12746   fn = built_in_decls[fcode == BUILT_IN_VSPRINTF_CHK
12747                       ? BUILT_IN_VSPRINTF : BUILT_IN_SPRINTF];
12748   if (!fn)
12749     return NULL_TREE;
12750
12751   return rewrite_call_expr_array (loc, nargs, args, 4, fn, 2, dest, fmt);
12752 }
12753
12754 /* Fold a call EXP to __{,v}sprintf_chk.  Return NULL_TREE if
12755    a normal call should be emitted rather than expanding the function
12756    inline.  FCODE is either BUILT_IN_SPRINTF_CHK or BUILT_IN_VSPRINTF_CHK.  */
12757
12758 static tree
12759 fold_builtin_sprintf_chk (location_t loc, tree exp,
12760                           enum built_in_function fcode)
12761 {
12762   return fold_builtin_sprintf_chk_1 (loc, call_expr_nargs (exp),
12763                                      CALL_EXPR_ARGP (exp), fcode);
12764 }
12765
12766 /* Fold a call EXP to {,v}snprintf having NARGS passed as ARGS.  Return
12767    NULL_TREE if a normal call should be emitted rather than expanding
12768    the function inline.  FCODE is either BUILT_IN_SNPRINTF_CHK or
12769    BUILT_IN_VSNPRINTF_CHK.  If MAXLEN is not NULL, it is maximum length
12770    passed as second argument.  */
12771
12772 static tree
12773 fold_builtin_snprintf_chk_1 (location_t loc, int nargs, tree *args,
12774                              tree maxlen, enum built_in_function fcode)
12775 {
12776   tree dest, size, len, fn, fmt, flag;
12777   const char *fmt_str;
12778
12779   /* Verify the required arguments in the original call.  */
12780   if (nargs < 5)
12781     return NULL_TREE;
12782   dest = args[0];
12783   if (!validate_arg (dest, POINTER_TYPE))
12784     return NULL_TREE;
12785   len = args[1];
12786   if (!validate_arg (len, INTEGER_TYPE))
12787     return NULL_TREE;
12788   flag = args[2];
12789   if (!validate_arg (flag, INTEGER_TYPE))
12790     return NULL_TREE;
12791   size = args[3];
12792   if (!validate_arg (size, INTEGER_TYPE))
12793     return NULL_TREE;
12794   fmt = args[4];
12795   if (!validate_arg (fmt, POINTER_TYPE))
12796     return NULL_TREE;
12797
12798   if (! host_integerp (size, 1))
12799     return NULL_TREE;
12800
12801   if (! integer_all_onesp (size))
12802     {
12803       if (! host_integerp (len, 1))
12804         {
12805           /* If LEN is not constant, try MAXLEN too.
12806              For MAXLEN only allow optimizing into non-_ocs function
12807              if SIZE is >= MAXLEN, never convert to __ocs_fail ().  */
12808           if (maxlen == NULL_TREE || ! host_integerp (maxlen, 1))
12809             return NULL_TREE;
12810         }
12811       else
12812         maxlen = len;
12813
12814       if (tree_int_cst_lt (size, maxlen))
12815         return NULL_TREE;
12816     }
12817
12818   if (!init_target_chars ())
12819     return NULL_TREE;
12820
12821   /* Only convert __{,v}snprintf_chk to {,v}snprintf if flag is 0
12822      or if format doesn't contain % chars or is "%s".  */
12823   if (! integer_zerop (flag))
12824     {
12825       fmt_str = c_getstr (fmt);
12826       if (fmt_str == NULL)
12827         return NULL_TREE;
12828       if (strchr (fmt_str, target_percent) != NULL
12829           && strcmp (fmt_str, target_percent_s))
12830         return NULL_TREE;
12831     }
12832
12833   /* If __builtin_{,v}snprintf_chk is used, assume {,v}snprintf is
12834      available.  */
12835   fn = built_in_decls[fcode == BUILT_IN_VSNPRINTF_CHK
12836                       ? BUILT_IN_VSNPRINTF : BUILT_IN_SNPRINTF];
12837   if (!fn)
12838     return NULL_TREE;
12839
12840   return rewrite_call_expr_array (loc, nargs, args, 5, fn, 3, dest, len, fmt);
12841 }
12842
12843 /* Fold a call EXP to {,v}snprintf.  Return NULL_TREE if
12844    a normal call should be emitted rather than expanding the function
12845    inline.  FCODE is either BUILT_IN_SNPRINTF_CHK or
12846    BUILT_IN_VSNPRINTF_CHK.  If MAXLEN is not NULL, it is maximum length
12847    passed as second argument.  */
12848
12849 tree
12850 fold_builtin_snprintf_chk (location_t loc, tree exp, tree maxlen,
12851                            enum built_in_function fcode)
12852 {
12853   return fold_builtin_snprintf_chk_1 (loc, call_expr_nargs (exp),
12854                                       CALL_EXPR_ARGP (exp), maxlen, fcode);
12855 }
12856
12857 /* Fold a call to the {,v}printf{,_unlocked} and __{,v}printf_chk builtins.
12858    FMT and ARG are the arguments to the call; we don't fold cases with
12859    more than 2 arguments, and ARG may be null if this is a 1-argument case.
12860
12861    Return NULL_TREE if no simplification was possible, otherwise return the
12862    simplified form of the call as a tree.  FCODE is the BUILT_IN_*
12863    code of the function to be simplified.  */
12864
12865 static tree
12866 fold_builtin_printf (location_t loc, tree fndecl, tree fmt,
12867                      tree arg, bool ignore,
12868                      enum built_in_function fcode)
12869 {
12870   tree fn_putchar, fn_puts, newarg, call = NULL_TREE;
12871   const char *fmt_str = NULL;
12872
12873   /* If the return value is used, don't do the transformation.  */
12874   if (! ignore)
12875     return NULL_TREE;
12876
12877   /* Verify the required arguments in the original call.  */
12878   if (!validate_arg (fmt, POINTER_TYPE))
12879     return NULL_TREE;
12880
12881   /* Check whether the format is a literal string constant.  */
12882   fmt_str = c_getstr (fmt);
12883   if (fmt_str == NULL)
12884     return NULL_TREE;
12885
12886   if (fcode == BUILT_IN_PRINTF_UNLOCKED)
12887     {
12888       /* If we're using an unlocked function, assume the other
12889          unlocked functions exist explicitly.  */
12890       fn_putchar = built_in_decls[BUILT_IN_PUTCHAR_UNLOCKED];
12891       fn_puts = built_in_decls[BUILT_IN_PUTS_UNLOCKED];
12892     }
12893   else
12894     {
12895       fn_putchar = implicit_built_in_decls[BUILT_IN_PUTCHAR];
12896       fn_puts = implicit_built_in_decls[BUILT_IN_PUTS];
12897     }
12898
12899   if (!init_target_chars ())
12900     return NULL_TREE;
12901
12902   if (strcmp (fmt_str, target_percent_s) == 0
12903       || strchr (fmt_str, target_percent) == NULL)
12904     {
12905       const char *str;
12906
12907       if (strcmp (fmt_str, target_percent_s) == 0)
12908         {
12909           if (fcode == BUILT_IN_VPRINTF || fcode == BUILT_IN_VPRINTF_CHK)
12910             return NULL_TREE;
12911
12912           if (!arg || !validate_arg (arg, POINTER_TYPE))
12913             return NULL_TREE;
12914
12915           str = c_getstr (arg);
12916           if (str == NULL)
12917             return NULL_TREE;
12918         }
12919       else
12920         {
12921           /* The format specifier doesn't contain any '%' characters.  */
12922           if (fcode != BUILT_IN_VPRINTF && fcode != BUILT_IN_VPRINTF_CHK
12923               && arg)
12924             return NULL_TREE;
12925           str = fmt_str;
12926         }
12927
12928       /* If the string was "", printf does nothing.  */
12929       if (str[0] == '\0')
12930         return build_int_cst (TREE_TYPE (TREE_TYPE (fndecl)), 0);
12931
12932       /* If the string has length of 1, call putchar.  */
12933       if (str[1] == '\0')
12934         {
12935           /* Given printf("c"), (where c is any one character,)
12936              convert "c"[0] to an int and pass that to the replacement
12937              function.  */
12938           newarg = build_int_cst (NULL_TREE, str[0]);
12939           if (fn_putchar)
12940             call = build_call_expr_loc (loc, fn_putchar, 1, newarg);
12941         }
12942       else
12943         {
12944           /* If the string was "string\n", call puts("string").  */
12945           size_t len = strlen (str);
12946           if ((unsigned char)str[len - 1] == target_newline
12947               && (size_t) (int) len == len
12948               && (int) len > 0)
12949             {
12950               char *newstr;
12951               tree offset_node, string_cst;
12952
12953               /* Create a NUL-terminated string that's one char shorter
12954                  than the original, stripping off the trailing '\n'.  */
12955               newarg = build_string_literal (len, str);
12956               string_cst = string_constant (newarg, &offset_node);
12957               gcc_checking_assert (string_cst
12958                                    && (TREE_STRING_LENGTH (string_cst)
12959                                        == (int) len)
12960                                    && integer_zerop (offset_node)
12961                                    && (unsigned char)
12962                                       TREE_STRING_POINTER (string_cst)[len - 1]
12963                                       == target_newline);
12964               /* build_string_literal creates a new STRING_CST,
12965                  modify it in place to avoid double copying.  */
12966               newstr = CONST_CAST (char *, TREE_STRING_POINTER (string_cst));
12967               newstr[len - 1] = '\0';
12968               if (fn_puts)
12969                 call = build_call_expr_loc (loc, fn_puts, 1, newarg);
12970             }
12971           else
12972             /* We'd like to arrange to call fputs(string,stdout) here,
12973                but we need stdout and don't have a way to get it yet.  */
12974             return NULL_TREE;
12975         }
12976     }
12977
12978   /* The other optimizations can be done only on the non-va_list variants.  */
12979   else if (fcode == BUILT_IN_VPRINTF || fcode == BUILT_IN_VPRINTF_CHK)
12980     return NULL_TREE;
12981
12982   /* If the format specifier was "%s\n", call __builtin_puts(arg).  */
12983   else if (strcmp (fmt_str, target_percent_s_newline) == 0)
12984     {
12985       if (!arg || !validate_arg (arg, POINTER_TYPE))
12986         return NULL_TREE;
12987       if (fn_puts)
12988         call = build_call_expr_loc (loc, fn_puts, 1, arg);
12989     }
12990
12991   /* If the format specifier was "%c", call __builtin_putchar(arg).  */
12992   else if (strcmp (fmt_str, target_percent_c) == 0)
12993     {
12994       if (!arg || !validate_arg (arg, INTEGER_TYPE))
12995         return NULL_TREE;
12996       if (fn_putchar)
12997         call = build_call_expr_loc (loc, fn_putchar, 1, arg);
12998     }
12999
13000   if (!call)
13001     return NULL_TREE;
13002
13003   return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), call);
13004 }
13005
13006 /* Fold a call to the {,v}fprintf{,_unlocked} and __{,v}printf_chk builtins.
13007    FP, FMT, and ARG are the arguments to the call.  We don't fold calls with
13008    more than 3 arguments, and ARG may be null in the 2-argument case.
13009
13010    Return NULL_TREE if no simplification was possible, otherwise return the
13011    simplified form of the call as a tree.  FCODE is the BUILT_IN_*
13012    code of the function to be simplified.  */
13013
13014 static tree
13015 fold_builtin_fprintf (location_t loc, tree fndecl, tree fp,
13016                       tree fmt, tree arg, bool ignore,
13017                       enum built_in_function fcode)
13018 {
13019   tree fn_fputc, fn_fputs, call = NULL_TREE;
13020   const char *fmt_str = NULL;
13021
13022   /* If the return value is used, don't do the transformation.  */
13023   if (! ignore)
13024     return NULL_TREE;
13025
13026   /* Verify the required arguments in the original call.  */
13027   if (!validate_arg (fp, POINTER_TYPE))
13028     return NULL_TREE;
13029   if (!validate_arg (fmt, POINTER_TYPE))
13030     return NULL_TREE;
13031
13032   /* Check whether the format is a literal string constant.  */
13033   fmt_str = c_getstr (fmt);
13034   if (fmt_str == NULL)
13035     return NULL_TREE;
13036
13037   if (fcode == BUILT_IN_FPRINTF_UNLOCKED)
13038     {
13039       /* If we're using an unlocked function, assume the other
13040          unlocked functions exist explicitly.  */
13041       fn_fputc = built_in_decls[BUILT_IN_FPUTC_UNLOCKED];
13042       fn_fputs = built_in_decls[BUILT_IN_FPUTS_UNLOCKED];
13043     }
13044   else
13045     {
13046       fn_fputc = implicit_built_in_decls[BUILT_IN_FPUTC];
13047       fn_fputs = implicit_built_in_decls[BUILT_IN_FPUTS];
13048     }
13049
13050   if (!init_target_chars ())
13051     return NULL_TREE;
13052
13053   /* If the format doesn't contain % args or %%, use strcpy.  */
13054   if (strchr (fmt_str, target_percent) == NULL)
13055     {
13056       if (fcode != BUILT_IN_VFPRINTF && fcode != BUILT_IN_VFPRINTF_CHK
13057           && arg)
13058         return NULL_TREE;
13059
13060       /* If the format specifier was "", fprintf does nothing.  */
13061       if (fmt_str[0] == '\0')
13062         {
13063           /* If FP has side-effects, just wait until gimplification is
13064              done.  */
13065           if (TREE_SIDE_EFFECTS (fp))
13066             return NULL_TREE;
13067
13068           return build_int_cst (TREE_TYPE (TREE_TYPE (fndecl)), 0);
13069         }
13070
13071       /* When "string" doesn't contain %, replace all cases of
13072          fprintf (fp, string) with fputs (string, fp).  The fputs
13073          builtin will take care of special cases like length == 1.  */
13074       if (fn_fputs)
13075         call = build_call_expr_loc (loc, fn_fputs, 2, fmt, fp);
13076     }
13077
13078   /* The other optimizations can be done only on the non-va_list variants.  */
13079   else if (fcode == BUILT_IN_VFPRINTF || fcode == BUILT_IN_VFPRINTF_CHK)
13080     return NULL_TREE;
13081
13082   /* If the format specifier was "%s", call __builtin_fputs (arg, fp).  */
13083   else if (strcmp (fmt_str, target_percent_s) == 0)
13084     {
13085       if (!arg || !validate_arg (arg, POINTER_TYPE))
13086         return NULL_TREE;
13087       if (fn_fputs)
13088         call = build_call_expr_loc (loc, fn_fputs, 2, arg, fp);
13089     }
13090
13091   /* If the format specifier was "%c", call __builtin_fputc (arg, fp).  */
13092   else if (strcmp (fmt_str, target_percent_c) == 0)
13093     {
13094       if (!arg || !validate_arg (arg, INTEGER_TYPE))
13095         return NULL_TREE;
13096       if (fn_fputc)
13097         call = build_call_expr_loc (loc, fn_fputc, 2, arg, fp);
13098     }
13099
13100   if (!call)
13101     return NULL_TREE;
13102   return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), call);
13103 }
13104
13105 /* Initialize format string characters in the target charset.  */
13106
13107 static bool
13108 init_target_chars (void)
13109 {
13110   static bool init;
13111   if (!init)
13112     {
13113       target_newline = lang_hooks.to_target_charset ('\n');
13114       target_percent = lang_hooks.to_target_charset ('%');
13115       target_c = lang_hooks.to_target_charset ('c');
13116       target_s = lang_hooks.to_target_charset ('s');
13117       if (target_newline == 0 || target_percent == 0 || target_c == 0
13118           || target_s == 0)
13119         return false;
13120
13121       target_percent_c[0] = target_percent;
13122       target_percent_c[1] = target_c;
13123       target_percent_c[2] = '\0';
13124
13125       target_percent_s[0] = target_percent;
13126       target_percent_s[1] = target_s;
13127       target_percent_s[2] = '\0';
13128
13129       target_percent_s_newline[0] = target_percent;
13130       target_percent_s_newline[1] = target_s;
13131       target_percent_s_newline[2] = target_newline;
13132       target_percent_s_newline[3] = '\0';
13133
13134       init = true;
13135     }
13136   return true;
13137 }
13138
13139 /* Helper function for do_mpfr_arg*().  Ensure M is a normal number
13140    and no overflow/underflow occurred.  INEXACT is true if M was not
13141    exactly calculated.  TYPE is the tree type for the result.  This
13142    function assumes that you cleared the MPFR flags and then
13143    calculated M to see if anything subsequently set a flag prior to
13144    entering this function.  Return NULL_TREE if any checks fail.  */
13145
13146 static tree
13147 do_mpfr_ckconv (mpfr_srcptr m, tree type, int inexact)
13148 {
13149   /* Proceed iff we get a normal number, i.e. not NaN or Inf and no
13150      overflow/underflow occurred.  If -frounding-math, proceed iff the
13151      result of calling FUNC was exact.  */
13152   if (mpfr_number_p (m) && !mpfr_overflow_p () && !mpfr_underflow_p ()
13153       && (!flag_rounding_math || !inexact))
13154     {
13155       REAL_VALUE_TYPE rr;
13156
13157       real_from_mpfr (&rr, m, type, GMP_RNDN);
13158       /* Proceed iff GCC's REAL_VALUE_TYPE can hold the MPFR value,
13159          check for overflow/underflow.  If the REAL_VALUE_TYPE is zero
13160          but the mpft_t is not, then we underflowed in the
13161          conversion.  */
13162       if (real_isfinite (&rr)
13163           && (rr.cl == rvc_zero) == (mpfr_zero_p (m) != 0))
13164         {
13165           REAL_VALUE_TYPE rmode;
13166
13167           real_convert (&rmode, TYPE_MODE (type), &rr);
13168           /* Proceed iff the specified mode can hold the value.  */
13169           if (real_identical (&rmode, &rr))
13170             return build_real (type, rmode);
13171         }
13172     }
13173   return NULL_TREE;
13174 }
13175
13176 /* Helper function for do_mpc_arg*().  Ensure M is a normal complex
13177    number and no overflow/underflow occurred.  INEXACT is true if M
13178    was not exactly calculated.  TYPE is the tree type for the result.
13179    This function assumes that you cleared the MPFR flags and then
13180    calculated M to see if anything subsequently set a flag prior to
13181    entering this function.  Return NULL_TREE if any checks fail, if
13182    FORCE_CONVERT is true, then bypass the checks.  */
13183
13184 static tree
13185 do_mpc_ckconv (mpc_srcptr m, tree type, int inexact, int force_convert)
13186 {
13187   /* Proceed iff we get a normal number, i.e. not NaN or Inf and no
13188      overflow/underflow occurred.  If -frounding-math, proceed iff the
13189      result of calling FUNC was exact.  */
13190   if (force_convert
13191       || (mpfr_number_p (mpc_realref (m)) && mpfr_number_p (mpc_imagref (m))
13192           && !mpfr_overflow_p () && !mpfr_underflow_p ()
13193           && (!flag_rounding_math || !inexact)))
13194     {
13195       REAL_VALUE_TYPE re, im;
13196
13197       real_from_mpfr (&re, mpc_realref (m), TREE_TYPE (type), GMP_RNDN);
13198       real_from_mpfr (&im, mpc_imagref (m), TREE_TYPE (type), GMP_RNDN);
13199       /* Proceed iff GCC's REAL_VALUE_TYPE can hold the MPFR values,
13200          check for overflow/underflow.  If the REAL_VALUE_TYPE is zero
13201          but the mpft_t is not, then we underflowed in the
13202          conversion.  */
13203       if (force_convert
13204           || (real_isfinite (&re) && real_isfinite (&im)
13205               && (re.cl == rvc_zero) == (mpfr_zero_p (mpc_realref (m)) != 0)
13206               && (im.cl == rvc_zero) == (mpfr_zero_p (mpc_imagref (m)) != 0)))
13207         {
13208           REAL_VALUE_TYPE re_mode, im_mode;
13209
13210           real_convert (&re_mode, TYPE_MODE (TREE_TYPE (type)), &re);
13211           real_convert (&im_mode, TYPE_MODE (TREE_TYPE (type)), &im);
13212           /* Proceed iff the specified mode can hold the value.  */
13213           if (force_convert
13214               || (real_identical (&re_mode, &re)
13215                   && real_identical (&im_mode, &im)))
13216             return build_complex (type, build_real (TREE_TYPE (type), re_mode),
13217                                   build_real (TREE_TYPE (type), im_mode));
13218         }
13219     }
13220   return NULL_TREE;
13221 }
13222
13223 /* If argument ARG is a REAL_CST, call the one-argument mpfr function
13224    FUNC on it and return the resulting value as a tree with type TYPE.
13225    If MIN and/or MAX are not NULL, then the supplied ARG must be
13226    within those bounds.  If INCLUSIVE is true, then MIN/MAX are
13227    acceptable values, otherwise they are not.  The mpfr precision is
13228    set to the precision of TYPE.  We assume that function FUNC returns
13229    zero if the result could be calculated exactly within the requested
13230    precision.  */
13231
13232 static tree
13233 do_mpfr_arg1 (tree arg, tree type, int (*func)(mpfr_ptr, mpfr_srcptr, mp_rnd_t),
13234               const REAL_VALUE_TYPE *min, const REAL_VALUE_TYPE *max,
13235               bool inclusive)
13236 {
13237   tree result = NULL_TREE;
13238
13239   STRIP_NOPS (arg);
13240
13241   /* To proceed, MPFR must exactly represent the target floating point
13242      format, which only happens when the target base equals two.  */
13243   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13244       && TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg))
13245     {
13246       const REAL_VALUE_TYPE *const ra = &TREE_REAL_CST (arg);
13247
13248       if (real_isfinite (ra)
13249           && (!min || real_compare (inclusive ? GE_EXPR: GT_EXPR , ra, min))
13250           && (!max || real_compare (inclusive ? LE_EXPR: LT_EXPR , ra, max)))
13251         {
13252           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13253           const int prec = fmt->p;
13254           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13255           int inexact;
13256           mpfr_t m;
13257
13258           mpfr_init2 (m, prec);
13259           mpfr_from_real (m, ra, GMP_RNDN);
13260           mpfr_clear_flags ();
13261           inexact = func (m, m, rnd);
13262           result = do_mpfr_ckconv (m, type, inexact);
13263           mpfr_clear (m);
13264         }
13265     }
13266
13267   return result;
13268 }
13269
13270 /* If argument ARG is a REAL_CST, call the two-argument mpfr function
13271    FUNC on it and return the resulting value as a tree with type TYPE.
13272    The mpfr precision is set to the precision of TYPE.  We assume that
13273    function FUNC returns zero if the result could be calculated
13274    exactly within the requested precision.  */
13275
13276 static tree
13277 do_mpfr_arg2 (tree arg1, tree arg2, tree type,
13278               int (*func)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mp_rnd_t))
13279 {
13280   tree result = NULL_TREE;
13281
13282   STRIP_NOPS (arg1);
13283   STRIP_NOPS (arg2);
13284
13285   /* To proceed, MPFR must exactly represent the target floating point
13286      format, which only happens when the target base equals two.  */
13287   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13288       && TREE_CODE (arg1) == REAL_CST && !TREE_OVERFLOW (arg1)
13289       && TREE_CODE (arg2) == REAL_CST && !TREE_OVERFLOW (arg2))
13290     {
13291       const REAL_VALUE_TYPE *const ra1 = &TREE_REAL_CST (arg1);
13292       const REAL_VALUE_TYPE *const ra2 = &TREE_REAL_CST (arg2);
13293
13294       if (real_isfinite (ra1) && real_isfinite (ra2))
13295         {
13296           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13297           const int prec = fmt->p;
13298           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13299           int inexact;
13300           mpfr_t m1, m2;
13301
13302           mpfr_inits2 (prec, m1, m2, NULL);
13303           mpfr_from_real (m1, ra1, GMP_RNDN);
13304           mpfr_from_real (m2, ra2, GMP_RNDN);
13305           mpfr_clear_flags ();
13306           inexact = func (m1, m1, m2, rnd);
13307           result = do_mpfr_ckconv (m1, type, inexact);
13308           mpfr_clears (m1, m2, NULL);
13309         }
13310     }
13311
13312   return result;
13313 }
13314
13315 /* If argument ARG is a REAL_CST, call the three-argument mpfr function
13316    FUNC on it and return the resulting value as a tree with type TYPE.
13317    The mpfr precision is set to the precision of TYPE.  We assume that
13318    function FUNC returns zero if the result could be calculated
13319    exactly within the requested precision.  */
13320
13321 static tree
13322 do_mpfr_arg3 (tree arg1, tree arg2, tree arg3, tree type,
13323               int (*func)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mpfr_srcptr, mp_rnd_t))
13324 {
13325   tree result = NULL_TREE;
13326
13327   STRIP_NOPS (arg1);
13328   STRIP_NOPS (arg2);
13329   STRIP_NOPS (arg3);
13330
13331   /* To proceed, MPFR must exactly represent the target floating point
13332      format, which only happens when the target base equals two.  */
13333   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13334       && TREE_CODE (arg1) == REAL_CST && !TREE_OVERFLOW (arg1)
13335       && TREE_CODE (arg2) == REAL_CST && !TREE_OVERFLOW (arg2)
13336       && TREE_CODE (arg3) == REAL_CST && !TREE_OVERFLOW (arg3))
13337     {
13338       const REAL_VALUE_TYPE *const ra1 = &TREE_REAL_CST (arg1);
13339       const REAL_VALUE_TYPE *const ra2 = &TREE_REAL_CST (arg2);
13340       const REAL_VALUE_TYPE *const ra3 = &TREE_REAL_CST (arg3);
13341
13342       if (real_isfinite (ra1) && real_isfinite (ra2) && real_isfinite (ra3))
13343         {
13344           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13345           const int prec = fmt->p;
13346           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13347           int inexact;
13348           mpfr_t m1, m2, m3;
13349
13350           mpfr_inits2 (prec, m1, m2, m3, NULL);
13351           mpfr_from_real (m1, ra1, GMP_RNDN);
13352           mpfr_from_real (m2, ra2, GMP_RNDN);
13353           mpfr_from_real (m3, ra3, GMP_RNDN);
13354           mpfr_clear_flags ();
13355           inexact = func (m1, m1, m2, m3, rnd);
13356           result = do_mpfr_ckconv (m1, type, inexact);
13357           mpfr_clears (m1, m2, m3, NULL);
13358         }
13359     }
13360
13361   return result;
13362 }
13363
13364 /* If argument ARG is a REAL_CST, call mpfr_sin_cos() on it and set
13365    the pointers *(ARG_SINP) and *(ARG_COSP) to the resulting values.
13366    If ARG_SINP and ARG_COSP are NULL then the result is returned
13367    as a complex value.
13368    The type is taken from the type of ARG and is used for setting the
13369    precision of the calculation and results.  */
13370
13371 static tree
13372 do_mpfr_sincos (tree arg, tree arg_sinp, tree arg_cosp)
13373 {
13374   tree const type = TREE_TYPE (arg);
13375   tree result = NULL_TREE;
13376
13377   STRIP_NOPS (arg);
13378
13379   /* To proceed, MPFR must exactly represent the target floating point
13380      format, which only happens when the target base equals two.  */
13381   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13382       && TREE_CODE (arg) == REAL_CST
13383       && !TREE_OVERFLOW (arg))
13384     {
13385       const REAL_VALUE_TYPE *const ra = &TREE_REAL_CST (arg);
13386
13387       if (real_isfinite (ra))
13388         {
13389           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13390           const int prec = fmt->p;
13391           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13392           tree result_s, result_c;
13393           int inexact;
13394           mpfr_t m, ms, mc;
13395
13396           mpfr_inits2 (prec, m, ms, mc, NULL);
13397           mpfr_from_real (m, ra, GMP_RNDN);
13398           mpfr_clear_flags ();
13399           inexact = mpfr_sin_cos (ms, mc, m, rnd);
13400           result_s = do_mpfr_ckconv (ms, type, inexact);
13401           result_c = do_mpfr_ckconv (mc, type, inexact);
13402           mpfr_clears (m, ms, mc, NULL);
13403           if (result_s && result_c)
13404             {
13405               /* If we are to return in a complex value do so.  */
13406               if (!arg_sinp && !arg_cosp)
13407                 return build_complex (build_complex_type (type),
13408                                       result_c, result_s);
13409
13410               /* Dereference the sin/cos pointer arguments.  */
13411               arg_sinp = build_fold_indirect_ref (arg_sinp);
13412               arg_cosp = build_fold_indirect_ref (arg_cosp);
13413               /* Proceed if valid pointer type were passed in.  */
13414               if (TYPE_MAIN_VARIANT (TREE_TYPE (arg_sinp)) == TYPE_MAIN_VARIANT (type)
13415                   && TYPE_MAIN_VARIANT (TREE_TYPE (arg_cosp)) == TYPE_MAIN_VARIANT (type))
13416                 {
13417                   /* Set the values. */
13418                   result_s = fold_build2 (MODIFY_EXPR, type, arg_sinp,
13419                                           result_s);
13420                   TREE_SIDE_EFFECTS (result_s) = 1;
13421                   result_c = fold_build2 (MODIFY_EXPR, type, arg_cosp,
13422                                           result_c);
13423                   TREE_SIDE_EFFECTS (result_c) = 1;
13424                   /* Combine the assignments into a compound expr.  */
13425                   result = non_lvalue (fold_build2 (COMPOUND_EXPR, type,
13426                                                     result_s, result_c));
13427                 }
13428             }
13429         }
13430     }
13431   return result;
13432 }
13433
13434 /* If argument ARG1 is an INTEGER_CST and ARG2 is a REAL_CST, call the
13435    two-argument mpfr order N Bessel function FUNC on them and return
13436    the resulting value as a tree with type TYPE.  The mpfr precision
13437    is set to the precision of TYPE.  We assume that function FUNC
13438    returns zero if the result could be calculated exactly within the
13439    requested precision.  */
13440 static tree
13441 do_mpfr_bessel_n (tree arg1, tree arg2, tree type,
13442                   int (*func)(mpfr_ptr, long, mpfr_srcptr, mp_rnd_t),
13443                   const REAL_VALUE_TYPE *min, bool inclusive)
13444 {
13445   tree result = NULL_TREE;
13446
13447   STRIP_NOPS (arg1);
13448   STRIP_NOPS (arg2);
13449
13450   /* To proceed, MPFR must exactly represent the target floating point
13451      format, which only happens when the target base equals two.  */
13452   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13453       && host_integerp (arg1, 0)
13454       && TREE_CODE (arg2) == REAL_CST && !TREE_OVERFLOW (arg2))
13455     {
13456       const HOST_WIDE_INT n = tree_low_cst(arg1, 0);
13457       const REAL_VALUE_TYPE *const ra = &TREE_REAL_CST (arg2);
13458
13459       if (n == (long)n
13460           && real_isfinite (ra)
13461           && (!min || real_compare (inclusive ? GE_EXPR: GT_EXPR , ra, min)))
13462         {
13463           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13464           const int prec = fmt->p;
13465           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13466           int inexact;
13467           mpfr_t m;
13468
13469           mpfr_init2 (m, prec);
13470           mpfr_from_real (m, ra, GMP_RNDN);
13471           mpfr_clear_flags ();
13472           inexact = func (m, n, m, rnd);
13473           result = do_mpfr_ckconv (m, type, inexact);
13474           mpfr_clear (m);
13475         }
13476     }
13477
13478   return result;
13479 }
13480
13481 /* If arguments ARG0 and ARG1 are REAL_CSTs, call mpfr_remquo() to set
13482    the pointer *(ARG_QUO) and return the result.  The type is taken
13483    from the type of ARG0 and is used for setting the precision of the
13484    calculation and results.  */
13485
13486 static tree
13487 do_mpfr_remquo (tree arg0, tree arg1, tree arg_quo)
13488 {
13489   tree const type = TREE_TYPE (arg0);
13490   tree result = NULL_TREE;
13491
13492   STRIP_NOPS (arg0);
13493   STRIP_NOPS (arg1);
13494
13495   /* To proceed, MPFR must exactly represent the target floating point
13496      format, which only happens when the target base equals two.  */
13497   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13498       && TREE_CODE (arg0) == REAL_CST && !TREE_OVERFLOW (arg0)
13499       && TREE_CODE (arg1) == REAL_CST && !TREE_OVERFLOW (arg1))
13500     {
13501       const REAL_VALUE_TYPE *const ra0 = TREE_REAL_CST_PTR (arg0);
13502       const REAL_VALUE_TYPE *const ra1 = TREE_REAL_CST_PTR (arg1);
13503
13504       if (real_isfinite (ra0) && real_isfinite (ra1))
13505         {
13506           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13507           const int prec = fmt->p;
13508           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13509           tree result_rem;
13510           long integer_quo;
13511           mpfr_t m0, m1;
13512
13513           mpfr_inits2 (prec, m0, m1, NULL);
13514           mpfr_from_real (m0, ra0, GMP_RNDN);
13515           mpfr_from_real (m1, ra1, GMP_RNDN);
13516           mpfr_clear_flags ();
13517           mpfr_remquo (m0, &integer_quo, m0, m1, rnd);
13518           /* Remquo is independent of the rounding mode, so pass
13519              inexact=0 to do_mpfr_ckconv().  */
13520           result_rem = do_mpfr_ckconv (m0, type, /*inexact=*/ 0);
13521           mpfr_clears (m0, m1, NULL);
13522           if (result_rem)
13523             {
13524               /* MPFR calculates quo in the host's long so it may
13525                  return more bits in quo than the target int can hold
13526                  if sizeof(host long) > sizeof(target int).  This can
13527                  happen even for native compilers in LP64 mode.  In
13528                  these cases, modulo the quo value with the largest
13529                  number that the target int can hold while leaving one
13530                  bit for the sign.  */
13531               if (sizeof (integer_quo) * CHAR_BIT > INT_TYPE_SIZE)
13532                 integer_quo %= (long)(1UL << (INT_TYPE_SIZE - 1));
13533
13534               /* Dereference the quo pointer argument.  */
13535               arg_quo = build_fold_indirect_ref (arg_quo);
13536               /* Proceed iff a valid pointer type was passed in.  */
13537               if (TYPE_MAIN_VARIANT (TREE_TYPE (arg_quo)) == integer_type_node)
13538                 {
13539                   /* Set the value. */
13540                   tree result_quo = fold_build2 (MODIFY_EXPR,
13541                                                  TREE_TYPE (arg_quo), arg_quo,
13542                                                  build_int_cst (NULL, integer_quo));
13543                   TREE_SIDE_EFFECTS (result_quo) = 1;
13544                   /* Combine the quo assignment with the rem.  */
13545                   result = non_lvalue (fold_build2 (COMPOUND_EXPR, type,
13546                                                     result_quo, result_rem));
13547                 }
13548             }
13549         }
13550     }
13551   return result;
13552 }
13553
13554 /* If ARG is a REAL_CST, call mpfr_lgamma() on it and return the
13555    resulting value as a tree with type TYPE.  The mpfr precision is
13556    set to the precision of TYPE.  We assume that this mpfr function
13557    returns zero if the result could be calculated exactly within the
13558    requested precision.  In addition, the integer pointer represented
13559    by ARG_SG will be dereferenced and set to the appropriate signgam
13560    (-1,1) value.  */
13561
13562 static tree
13563 do_mpfr_lgamma_r (tree arg, tree arg_sg, tree type)
13564 {
13565   tree result = NULL_TREE;
13566
13567   STRIP_NOPS (arg);
13568
13569   /* To proceed, MPFR must exactly represent the target floating point
13570      format, which only happens when the target base equals two.  Also
13571      verify ARG is a constant and that ARG_SG is an int pointer.  */
13572   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13573       && TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg)
13574       && TREE_CODE (TREE_TYPE (arg_sg)) == POINTER_TYPE
13575       && TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (arg_sg))) == integer_type_node)
13576     {
13577       const REAL_VALUE_TYPE *const ra = TREE_REAL_CST_PTR (arg);
13578
13579       /* In addition to NaN and Inf, the argument cannot be zero or a
13580          negative integer.  */
13581       if (real_isfinite (ra)
13582           && ra->cl != rvc_zero
13583           && !(real_isneg(ra) && real_isinteger(ra, TYPE_MODE (type))))
13584         {
13585           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13586           const int prec = fmt->p;
13587           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13588           int inexact, sg;
13589           mpfr_t m;
13590           tree result_lg;
13591
13592           mpfr_init2 (m, prec);
13593           mpfr_from_real (m, ra, GMP_RNDN);
13594           mpfr_clear_flags ();
13595           inexact = mpfr_lgamma (m, &sg, m, rnd);
13596           result_lg = do_mpfr_ckconv (m, type, inexact);
13597           mpfr_clear (m);
13598           if (result_lg)
13599             {
13600               tree result_sg;
13601
13602               /* Dereference the arg_sg pointer argument.  */
13603               arg_sg = build_fold_indirect_ref (arg_sg);
13604               /* Assign the signgam value into *arg_sg. */
13605               result_sg = fold_build2 (MODIFY_EXPR,
13606                                        TREE_TYPE (arg_sg), arg_sg,
13607                                        build_int_cst (NULL, sg));
13608               TREE_SIDE_EFFECTS (result_sg) = 1;
13609               /* Combine the signgam assignment with the lgamma result.  */
13610               result = non_lvalue (fold_build2 (COMPOUND_EXPR, type,
13611                                                 result_sg, result_lg));
13612             }
13613         }
13614     }
13615
13616   return result;
13617 }
13618
13619 /* If argument ARG is a COMPLEX_CST, call the one-argument mpc
13620    function FUNC on it and return the resulting value as a tree with
13621    type TYPE.  The mpfr precision is set to the precision of TYPE.  We
13622    assume that function FUNC returns zero if the result could be
13623    calculated exactly within the requested precision.  */
13624
13625 static tree
13626 do_mpc_arg1 (tree arg, tree type, int (*func)(mpc_ptr, mpc_srcptr, mpc_rnd_t))
13627 {
13628   tree result = NULL_TREE;
13629
13630   STRIP_NOPS (arg);
13631
13632   /* To proceed, MPFR must exactly represent the target floating point
13633      format, which only happens when the target base equals two.  */
13634   if (TREE_CODE (arg) == COMPLEX_CST && !TREE_OVERFLOW (arg)
13635       && TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) == REAL_TYPE
13636       && REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (TREE_TYPE (arg))))->b == 2)
13637     {
13638       const REAL_VALUE_TYPE *const re = TREE_REAL_CST_PTR (TREE_REALPART (arg));
13639       const REAL_VALUE_TYPE *const im = TREE_REAL_CST_PTR (TREE_IMAGPART (arg));
13640
13641       if (real_isfinite (re) && real_isfinite (im))
13642         {
13643           const struct real_format *const fmt =
13644             REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (type)));
13645           const int prec = fmt->p;
13646           const mp_rnd_t rnd = fmt->round_towards_zero ? GMP_RNDZ : GMP_RNDN;
13647           const mpc_rnd_t crnd = fmt->round_towards_zero ? MPC_RNDZZ : MPC_RNDNN;
13648           int inexact;
13649           mpc_t m;
13650
13651           mpc_init2 (m, prec);
13652           mpfr_from_real (mpc_realref(m), re, rnd);
13653           mpfr_from_real (mpc_imagref(m), im, rnd);
13654           mpfr_clear_flags ();
13655           inexact = func (m, m, crnd);
13656           result = do_mpc_ckconv (m, type, inexact, /*force_convert=*/ 0);
13657           mpc_clear (m);
13658         }
13659     }
13660
13661   return result;
13662 }
13663
13664 /* If arguments ARG0 and ARG1 are a COMPLEX_CST, call the two-argument
13665    mpc function FUNC on it and return the resulting value as a tree
13666    with type TYPE.  The mpfr precision is set to the precision of
13667    TYPE.  We assume that function FUNC returns zero if the result
13668    could be calculated exactly within the requested precision.  If
13669    DO_NONFINITE is true, then fold expressions containing Inf or NaN
13670    in the arguments and/or results.  */
13671
13672 tree
13673 do_mpc_arg2 (tree arg0, tree arg1, tree type, int do_nonfinite,
13674              int (*func)(mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t))
13675 {
13676   tree result = NULL_TREE;
13677
13678   STRIP_NOPS (arg0);
13679   STRIP_NOPS (arg1);
13680
13681   /* To proceed, MPFR must exactly represent the target floating point
13682      format, which only happens when the target base equals two.  */
13683   if (TREE_CODE (arg0) == COMPLEX_CST && !TREE_OVERFLOW (arg0)
13684       && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE
13685       && TREE_CODE (arg1) == COMPLEX_CST && !TREE_OVERFLOW (arg1)
13686       && TREE_CODE (TREE_TYPE (TREE_TYPE (arg1))) == REAL_TYPE
13687       && REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0))))->b == 2)
13688     {
13689       const REAL_VALUE_TYPE *const re0 = TREE_REAL_CST_PTR (TREE_REALPART (arg0));
13690       const REAL_VALUE_TYPE *const im0 = TREE_REAL_CST_PTR (TREE_IMAGPART (arg0));
13691       const REAL_VALUE_TYPE *const re1 = TREE_REAL_CST_PTR (TREE_REALPART (arg1));
13692       const REAL_VALUE_TYPE *const im1 = TREE_REAL_CST_PTR (TREE_IMAGPART (arg1));
13693
13694       if (do_nonfinite
13695           || (real_isfinite (re0) && real_isfinite (im0)
13696               && real_isfinite (re1) && real_isfinite (im1)))
13697         {
13698           const struct real_format *const fmt =
13699             REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (type)));
13700           const int prec = fmt->p;
13701           const mp_rnd_t rnd = fmt->round_towards_zero ? GMP_RNDZ : GMP_RNDN;
13702           const mpc_rnd_t crnd = fmt->round_towards_zero ? MPC_RNDZZ : MPC_RNDNN;
13703           int inexact;
13704           mpc_t m0, m1;
13705
13706           mpc_init2 (m0, prec);
13707           mpc_init2 (m1, prec);
13708           mpfr_from_real (mpc_realref(m0), re0, rnd);
13709           mpfr_from_real (mpc_imagref(m0), im0, rnd);
13710           mpfr_from_real (mpc_realref(m1), re1, rnd);
13711           mpfr_from_real (mpc_imagref(m1), im1, rnd);
13712           mpfr_clear_flags ();
13713           inexact = func (m0, m0, m1, crnd);
13714           result = do_mpc_ckconv (m0, type, inexact, do_nonfinite);
13715           mpc_clear (m0);
13716           mpc_clear (m1);
13717         }
13718     }
13719
13720   return result;
13721 }
13722
13723 /* Fold a call STMT to __{,v}sprintf_chk.  Return NULL_TREE if
13724    a normal call should be emitted rather than expanding the function
13725    inline.  FCODE is either BUILT_IN_SPRINTF_CHK or BUILT_IN_VSPRINTF_CHK.  */
13726
13727 static tree
13728 gimple_fold_builtin_sprintf_chk (gimple stmt, enum built_in_function fcode)
13729 {
13730   int nargs = gimple_call_num_args (stmt);
13731
13732   return fold_builtin_sprintf_chk_1 (gimple_location (stmt), nargs,
13733                                      (nargs > 0
13734                                       ? gimple_call_arg_ptr (stmt, 0)
13735                                       : &error_mark_node), fcode);
13736 }
13737
13738 /* Fold a call STMT to {,v}snprintf.  Return NULL_TREE if
13739    a normal call should be emitted rather than expanding the function
13740    inline.  FCODE is either BUILT_IN_SNPRINTF_CHK or
13741    BUILT_IN_VSNPRINTF_CHK.  If MAXLEN is not NULL, it is maximum length
13742    passed as second argument.  */
13743
13744 tree
13745 gimple_fold_builtin_snprintf_chk (gimple stmt, tree maxlen,
13746                                   enum built_in_function fcode)
13747 {
13748   int nargs = gimple_call_num_args (stmt);
13749
13750   return fold_builtin_snprintf_chk_1 (gimple_location (stmt), nargs,
13751                                       (nargs > 0
13752                                        ? gimple_call_arg_ptr (stmt, 0)
13753                                        : &error_mark_node), maxlen, fcode);
13754 }
13755
13756 /* Builtins with folding operations that operate on "..." arguments
13757    need special handling; we need to store the arguments in a convenient
13758    data structure before attempting any folding.  Fortunately there are
13759    only a few builtins that fall into this category.  FNDECL is the
13760    function, EXP is the CALL_EXPR for the call, and IGNORE is true if the
13761    result of the function call is ignored.  */
13762
13763 static tree
13764 gimple_fold_builtin_varargs (tree fndecl, gimple stmt,
13765                              bool ignore ATTRIBUTE_UNUSED)
13766 {
13767   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
13768   tree ret = NULL_TREE;
13769
13770   switch (fcode)
13771     {
13772     case BUILT_IN_SPRINTF_CHK:
13773     case BUILT_IN_VSPRINTF_CHK:
13774       ret = gimple_fold_builtin_sprintf_chk (stmt, fcode);
13775       break;
13776
13777     case BUILT_IN_SNPRINTF_CHK:
13778     case BUILT_IN_VSNPRINTF_CHK:
13779       ret = gimple_fold_builtin_snprintf_chk (stmt, NULL_TREE, fcode);
13780
13781     default:
13782       break;
13783     }
13784   if (ret)
13785     {
13786       ret = build1 (NOP_EXPR, TREE_TYPE (ret), ret);
13787       TREE_NO_WARNING (ret) = 1;
13788       return ret;
13789     }
13790   return NULL_TREE;
13791 }
13792
13793 /* A wrapper function for builtin folding that prevents warnings for
13794    "statement without effect" and the like, caused by removing the
13795    call node earlier than the warning is generated.  */
13796
13797 tree
13798 fold_call_stmt (gimple stmt, bool ignore)
13799 {
13800   tree ret = NULL_TREE;
13801   tree fndecl = gimple_call_fndecl (stmt);
13802   location_t loc = gimple_location (stmt);
13803   if (fndecl
13804       && TREE_CODE (fndecl) == FUNCTION_DECL
13805       && DECL_BUILT_IN (fndecl)
13806       && !gimple_call_va_arg_pack_p (stmt))
13807     {
13808       int nargs = gimple_call_num_args (stmt);
13809       tree *args = (nargs > 0
13810                     ? gimple_call_arg_ptr (stmt, 0)
13811                     : &error_mark_node);
13812
13813       if (avoid_folding_inline_builtin (fndecl))
13814         return NULL_TREE;
13815       if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
13816         {
13817           return targetm.fold_builtin (fndecl, nargs, args, ignore);
13818         }
13819       else
13820         {
13821           if (nargs <= MAX_ARGS_TO_FOLD_BUILTIN)
13822             ret = fold_builtin_n (loc, fndecl, args, nargs, ignore);
13823           if (!ret)
13824             ret = gimple_fold_builtin_varargs (fndecl, stmt, ignore);
13825           if (ret)
13826             {
13827               /* Propagate location information from original call to
13828                  expansion of builtin.  Otherwise things like
13829                  maybe_emit_chk_warning, that operate on the expansion
13830                  of a builtin, will use the wrong location information.  */
13831               if (gimple_has_location (stmt))
13832                 {
13833                   tree realret = ret;
13834                   if (TREE_CODE (ret) == NOP_EXPR)
13835                     realret = TREE_OPERAND (ret, 0);
13836                   if (CAN_HAVE_LOCATION_P (realret)
13837                       && !EXPR_HAS_LOCATION (realret))
13838                     SET_EXPR_LOCATION (realret, loc);
13839                   return realret;
13840                 }
13841               return ret;
13842             }
13843         }
13844     }
13845   return NULL_TREE;
13846 }
13847
13848 /* Look up the function in built_in_decls that corresponds to DECL
13849    and set ASMSPEC as its user assembler name.  DECL must be a
13850    function decl that declares a builtin.  */
13851
13852 void
13853 set_builtin_user_assembler_name (tree decl, const char *asmspec)
13854 {
13855   tree builtin;
13856   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL
13857               && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
13858               && asmspec != 0);
13859
13860   builtin = built_in_decls [DECL_FUNCTION_CODE (decl)];
13861   set_user_assembler_name (builtin, asmspec);
13862   switch (DECL_FUNCTION_CODE (decl))
13863     {
13864     case BUILT_IN_MEMCPY:
13865       init_block_move_fn (asmspec);
13866       memcpy_libfunc = set_user_assembler_libfunc ("memcpy", asmspec);
13867       break;
13868     case BUILT_IN_MEMSET:
13869       init_block_clear_fn (asmspec);
13870       memset_libfunc = set_user_assembler_libfunc ("memset", asmspec);
13871       break;
13872     case BUILT_IN_MEMMOVE:
13873       memmove_libfunc = set_user_assembler_libfunc ("memmove", asmspec);
13874       break;
13875     case BUILT_IN_MEMCMP:
13876       memcmp_libfunc = set_user_assembler_libfunc ("memcmp", asmspec);
13877       break;
13878     case BUILT_IN_ABORT:
13879       abort_libfunc = set_user_assembler_libfunc ("abort", asmspec);
13880       break;
13881     case BUILT_IN_FFS:
13882       if (INT_TYPE_SIZE < BITS_PER_WORD)
13883         {
13884           set_user_assembler_libfunc ("ffs", asmspec);
13885           set_optab_libfunc (ffs_optab, mode_for_size (INT_TYPE_SIZE,
13886                                                        MODE_INT, 0), "ffs");
13887         }
13888       break;
13889     default:
13890       break;
13891     }
13892 }
13893
13894 /* Return true if DECL is a builtin that expands to a constant or similarly
13895    simple code.  */
13896 bool
13897 is_simple_builtin (tree decl)
13898 {
13899   if (decl && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL)
13900     switch (DECL_FUNCTION_CODE (decl))
13901       {
13902         /* Builtins that expand to constants.  */
13903       case BUILT_IN_CONSTANT_P:
13904       case BUILT_IN_EXPECT:
13905       case BUILT_IN_OBJECT_SIZE:
13906       case BUILT_IN_UNREACHABLE:
13907         /* Simple register moves or loads from stack.  */
13908       case BUILT_IN_RETURN_ADDRESS:
13909       case BUILT_IN_EXTRACT_RETURN_ADDR:
13910       case BUILT_IN_FROB_RETURN_ADDR:
13911       case BUILT_IN_RETURN:
13912       case BUILT_IN_AGGREGATE_INCOMING_ADDRESS:
13913       case BUILT_IN_FRAME_ADDRESS:
13914       case BUILT_IN_VA_END:
13915       case BUILT_IN_STACK_SAVE:
13916       case BUILT_IN_STACK_RESTORE:
13917         /* Exception state returns or moves registers around.  */
13918       case BUILT_IN_EH_FILTER:
13919       case BUILT_IN_EH_POINTER:
13920       case BUILT_IN_EH_COPY_VALUES:
13921         return true;
13922
13923       default:
13924         return false;
13925       }
13926
13927   return false;
13928 }
13929
13930 /* Return true if DECL is a builtin that is not expensive, i.e., they are
13931    most probably expanded inline into reasonably simple code.  This is a
13932    superset of is_simple_builtin.  */
13933 bool
13934 is_inexpensive_builtin (tree decl)
13935 {
13936   if (!decl)
13937     return false;
13938   else if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_MD)
13939     return true;
13940   else if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL)
13941     switch (DECL_FUNCTION_CODE (decl))
13942       {
13943       case BUILT_IN_ABS:
13944       case BUILT_IN_ALLOCA:
13945       case BUILT_IN_BSWAP32:
13946       case BUILT_IN_BSWAP64:
13947       case BUILT_IN_CLZ:
13948       case BUILT_IN_CLZIMAX:
13949       case BUILT_IN_CLZL:
13950       case BUILT_IN_CLZLL:
13951       case BUILT_IN_CTZ:
13952       case BUILT_IN_CTZIMAX:
13953       case BUILT_IN_CTZL:
13954       case BUILT_IN_CTZLL:
13955       case BUILT_IN_FFS:
13956       case BUILT_IN_FFSIMAX:
13957       case BUILT_IN_FFSL:
13958       case BUILT_IN_FFSLL:
13959       case BUILT_IN_IMAXABS:
13960       case BUILT_IN_FINITE:
13961       case BUILT_IN_FINITEF:
13962       case BUILT_IN_FINITEL:
13963       case BUILT_IN_FINITED32:
13964       case BUILT_IN_FINITED64:
13965       case BUILT_IN_FINITED128:
13966       case BUILT_IN_FPCLASSIFY:
13967       case BUILT_IN_ISFINITE:
13968       case BUILT_IN_ISINF_SIGN:
13969       case BUILT_IN_ISINF:
13970       case BUILT_IN_ISINFF:
13971       case BUILT_IN_ISINFL:
13972       case BUILT_IN_ISINFD32:
13973       case BUILT_IN_ISINFD64:
13974       case BUILT_IN_ISINFD128:
13975       case BUILT_IN_ISNAN:
13976       case BUILT_IN_ISNANF:
13977       case BUILT_IN_ISNANL:
13978       case BUILT_IN_ISNAND32:
13979       case BUILT_IN_ISNAND64:
13980       case BUILT_IN_ISNAND128:
13981       case BUILT_IN_ISNORMAL:
13982       case BUILT_IN_ISGREATER:
13983       case BUILT_IN_ISGREATEREQUAL:
13984       case BUILT_IN_ISLESS:
13985       case BUILT_IN_ISLESSEQUAL:
13986       case BUILT_IN_ISLESSGREATER:
13987       case BUILT_IN_ISUNORDERED:
13988       case BUILT_IN_VA_ARG_PACK:
13989       case BUILT_IN_VA_ARG_PACK_LEN:
13990       case BUILT_IN_VA_COPY:
13991       case BUILT_IN_TRAP:
13992       case BUILT_IN_SAVEREGS:
13993       case BUILT_IN_POPCOUNTL:
13994       case BUILT_IN_POPCOUNTLL:
13995       case BUILT_IN_POPCOUNTIMAX:
13996       case BUILT_IN_POPCOUNT:
13997       case BUILT_IN_PARITYL:
13998       case BUILT_IN_PARITYLL:
13999       case BUILT_IN_PARITYIMAX:
14000       case BUILT_IN_PARITY:
14001       case BUILT_IN_LABS:
14002       case BUILT_IN_LLABS:
14003       case BUILT_IN_PREFETCH:
14004         return true;
14005
14006       default:
14007         return is_simple_builtin (decl);
14008       }
14009
14010   return false;
14011 }