OSDN Git Service

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