OSDN Git Service

2010-07-05 Richard Guenther <rguenther@suse.de>
[pf3gnuchains/gcc-fork.git] / gcc / builtins.c
1 /* Expand builtin functions.
2    Copyright (C) 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3    2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
4    Free Software Foundation, Inc.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "machmode.h"
27 #include "rtl.h"
28 #include "tree.h"
29 #include "realmpfr.h"
30 #include "gimple.h"
31 #include "flags.h"
32 #include "regs.h"
33 #include "hard-reg-set.h"
34 #include "except.h"
35 #include "function.h"
36 #include "insn-config.h"
37 #include "expr.h"
38 #include "optabs.h"
39 #include "libfuncs.h"
40 #include "recog.h"
41 #include "output.h"
42 #include "typeclass.h"
43 #include "toplev.h"
44 #include "predict.h"
45 #include "tm_p.h"
46 #include "target.h"
47 #include "langhooks.h"
48 #include "basic-block.h"
49 #include "tree-mudflap.h"
50 #include "tree-flow.h"
51 #include "value-prof.h"
52 #include "diagnostic-core.h"
53
54 #ifndef SLOW_UNALIGNED_ACCESS
55 #define SLOW_UNALIGNED_ACCESS(MODE, ALIGN) STRICT_ALIGNMENT
56 #endif
57
58 #ifndef PAD_VARARGS_DOWN
59 #define PAD_VARARGS_DOWN BYTES_BIG_ENDIAN
60 #endif
61 static tree do_mpc_arg1 (tree, tree, int (*)(mpc_ptr, mpc_srcptr, mpc_rnd_t));
62
63 /* Define the names of the builtin function types and codes.  */
64 const char *const built_in_class_names[4]
65   = {"NOT_BUILT_IN", "BUILT_IN_FRONTEND", "BUILT_IN_MD", "BUILT_IN_NORMAL"};
66
67 #define DEF_BUILTIN(X, N, C, T, LT, B, F, NA, AT, IM, COND) #X,
68 const char * built_in_names[(int) END_BUILTINS] =
69 {
70 #include "builtins.def"
71 };
72 #undef DEF_BUILTIN
73
74 /* Setup an array of _DECL trees, make sure each element is
75    initialized to NULL_TREE.  */
76 tree built_in_decls[(int) END_BUILTINS];
77 /* Declarations used when constructing the builtin implicitly in the compiler.
78    It may be NULL_TREE when this is invalid (for instance runtime is not
79    required to implement the function call in all cases).  */
80 tree implicit_built_in_decls[(int) END_BUILTINS];
81
82 static const char *c_getstr (tree);
83 static rtx c_readstr (const char *, enum machine_mode);
84 static int target_char_cast (tree, char *);
85 static rtx get_memory_rtx (tree, tree);
86 static int apply_args_size (void);
87 static int apply_result_size (void);
88 #if defined (HAVE_untyped_call) || defined (HAVE_untyped_return)
89 static rtx result_vector (int, rtx);
90 #endif
91 static void expand_builtin_update_setjmp_buf (rtx);
92 static void expand_builtin_prefetch (tree);
93 static rtx expand_builtin_apply_args (void);
94 static rtx expand_builtin_apply_args_1 (void);
95 static rtx expand_builtin_apply (rtx, rtx, rtx);
96 static void expand_builtin_return (rtx);
97 static enum type_class type_to_class (tree);
98 static rtx expand_builtin_classify_type (tree);
99 static void expand_errno_check (tree, rtx);
100 static rtx expand_builtin_mathfn (tree, rtx, rtx);
101 static rtx expand_builtin_mathfn_2 (tree, rtx, rtx);
102 static rtx expand_builtin_mathfn_3 (tree, rtx, rtx);
103 static rtx expand_builtin_interclass_mathfn (tree, rtx, rtx);
104 static rtx expand_builtin_sincos (tree);
105 static rtx expand_builtin_cexpi (tree, rtx, rtx);
106 static rtx expand_builtin_int_roundingfn (tree, rtx);
107 static rtx expand_builtin_int_roundingfn_2 (tree, rtx);
108 static rtx expand_builtin_args_info (tree);
109 static rtx expand_builtin_next_arg (void);
110 static rtx expand_builtin_va_start (tree);
111 static rtx expand_builtin_va_end (tree);
112 static rtx expand_builtin_va_copy (tree);
113 static rtx expand_builtin_memcmp (tree, rtx, enum machine_mode);
114 static rtx expand_builtin_strcmp (tree, rtx);
115 static rtx expand_builtin_strncmp (tree, rtx, enum machine_mode);
116 static rtx builtin_memcpy_read_str (void *, HOST_WIDE_INT, enum machine_mode);
117 static rtx expand_builtin_memcpy (tree, rtx);
118 static rtx expand_builtin_mempcpy (tree, rtx, enum machine_mode);
119 static rtx expand_builtin_mempcpy_args (tree, tree, tree, rtx,
120                                         enum machine_mode, int);
121 static rtx expand_builtin_strcpy (tree, rtx);
122 static rtx expand_builtin_strcpy_args (tree, tree, rtx);
123 static rtx expand_builtin_stpcpy (tree, rtx, enum machine_mode);
124 static rtx expand_builtin_strncpy (tree, rtx);
125 static rtx builtin_memset_gen_str (void *, HOST_WIDE_INT, enum machine_mode);
126 static rtx expand_builtin_memset (tree, rtx, enum machine_mode);
127 static rtx expand_builtin_memset_args (tree, tree, tree, rtx, enum machine_mode, tree);
128 static rtx expand_builtin_bzero (tree);
129 static rtx expand_builtin_strlen (tree, rtx, enum machine_mode);
130 static rtx expand_builtin_alloca (tree, rtx);
131 static rtx expand_builtin_unop (enum machine_mode, tree, rtx, rtx, optab);
132 static rtx expand_builtin_frame_address (tree, tree);
133 static tree stabilize_va_list_loc (location_t, tree, int);
134 static rtx expand_builtin_expect (tree, rtx);
135 static tree fold_builtin_constant_p (tree);
136 static tree fold_builtin_expect (location_t, tree, tree);
137 static tree fold_builtin_classify_type (tree);
138 static tree fold_builtin_strlen (location_t, tree, tree);
139 static tree fold_builtin_inf (location_t, tree, int);
140 static tree fold_builtin_nan (tree, tree, int);
141 static tree rewrite_call_expr (location_t, tree, int, tree, int, ...);
142 static bool validate_arg (const_tree, enum tree_code code);
143 static bool integer_valued_real_p (tree);
144 static tree fold_trunc_transparent_mathfn (location_t, tree, tree);
145 static bool readonly_data_expr (tree);
146 static rtx expand_builtin_fabs (tree, rtx, rtx);
147 static rtx expand_builtin_signbit (tree, rtx);
148 static tree fold_builtin_sqrt (location_t, tree, tree);
149 static tree fold_builtin_cbrt (location_t, tree, tree);
150 static tree fold_builtin_pow (location_t, tree, tree, tree, tree);
151 static tree fold_builtin_powi (location_t, tree, tree, tree, tree);
152 static tree fold_builtin_cos (location_t, tree, tree, tree);
153 static tree fold_builtin_cosh (location_t, tree, tree, tree);
154 static tree fold_builtin_tan (tree, tree);
155 static tree fold_builtin_trunc (location_t, tree, tree);
156 static tree fold_builtin_floor (location_t, tree, tree);
157 static tree fold_builtin_ceil (location_t, tree, tree);
158 static tree fold_builtin_round (location_t, tree, tree);
159 static tree fold_builtin_int_roundingfn (location_t, tree, tree);
160 static tree fold_builtin_bitop (tree, tree);
161 static tree fold_builtin_memory_op (location_t, tree, tree, tree, tree, bool, int);
162 static tree fold_builtin_strchr (location_t, tree, tree, tree);
163 static tree fold_builtin_memchr (location_t, tree, tree, tree, tree);
164 static tree fold_builtin_memcmp (location_t, tree, tree, tree);
165 static tree fold_builtin_strcmp (location_t, tree, tree);
166 static tree fold_builtin_strncmp (location_t, tree, tree, tree);
167 static tree fold_builtin_signbit (location_t, tree, tree);
168 static tree fold_builtin_copysign (location_t, tree, tree, tree, tree);
169 static tree fold_builtin_isascii (location_t, tree);
170 static tree fold_builtin_toascii (location_t, tree);
171 static tree fold_builtin_isdigit (location_t, tree);
172 static tree fold_builtin_fabs (location_t, tree, tree);
173 static tree fold_builtin_abs (location_t, tree, tree);
174 static tree fold_builtin_unordered_cmp (location_t, tree, tree, tree, enum tree_code,
175                                         enum tree_code);
176 static tree fold_builtin_n (location_t, tree, tree *, int, bool);
177 static tree fold_builtin_0 (location_t, tree, bool);
178 static tree fold_builtin_1 (location_t, tree, tree, bool);
179 static tree fold_builtin_2 (location_t, tree, tree, tree, bool);
180 static tree fold_builtin_3 (location_t, tree, tree, tree, tree, bool);
181 static tree fold_builtin_4 (location_t, tree, tree, tree, tree, tree, bool);
182 static tree fold_builtin_varargs (location_t, tree, tree, bool);
183
184 static tree fold_builtin_strpbrk (location_t, tree, tree, tree);
185 static tree fold_builtin_strstr (location_t, tree, tree, tree);
186 static tree fold_builtin_strrchr (location_t, tree, tree, tree);
187 static tree fold_builtin_strcat (location_t, tree, tree);
188 static tree fold_builtin_strncat (location_t, tree, tree, tree);
189 static tree fold_builtin_strspn (location_t, tree, tree);
190 static tree fold_builtin_strcspn (location_t, tree, tree);
191 static tree fold_builtin_sprintf (location_t, tree, tree, tree, int);
192
193 static rtx expand_builtin_object_size (tree);
194 static rtx expand_builtin_memory_chk (tree, rtx, enum machine_mode,
195                                       enum built_in_function);
196 static void maybe_emit_chk_warning (tree, enum built_in_function);
197 static void maybe_emit_sprintf_chk_warning (tree, enum built_in_function);
198 static void maybe_emit_free_warning (tree);
199 static tree fold_builtin_object_size (tree, tree);
200 static tree fold_builtin_strcat_chk (location_t, tree, tree, tree, tree);
201 static tree fold_builtin_strncat_chk (location_t, tree, tree, tree, tree, tree);
202 static tree fold_builtin_sprintf_chk (location_t, tree, enum built_in_function);
203 static tree fold_builtin_printf (location_t, tree, tree, tree, bool, enum built_in_function);
204 static tree fold_builtin_fprintf (location_t, tree, tree, tree, tree, bool,
205                                   enum built_in_function);
206 static bool init_target_chars (void);
207
208 static unsigned HOST_WIDE_INT target_newline;
209 static unsigned HOST_WIDE_INT target_percent;
210 static unsigned HOST_WIDE_INT target_c;
211 static unsigned HOST_WIDE_INT target_s;
212 static char target_percent_c[3];
213 static char target_percent_s[3];
214 static char target_percent_s_newline[4];
215 static tree do_mpfr_arg1 (tree, tree, int (*)(mpfr_ptr, mpfr_srcptr, mp_rnd_t),
216                           const REAL_VALUE_TYPE *, const REAL_VALUE_TYPE *, bool);
217 static tree do_mpfr_arg2 (tree, tree, tree,
218                           int (*)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mp_rnd_t));
219 static tree do_mpfr_arg3 (tree, tree, tree, tree,
220                           int (*)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mpfr_srcptr, mp_rnd_t));
221 static tree do_mpfr_sincos (tree, tree, tree);
222 static tree do_mpfr_bessel_n (tree, tree, tree,
223                               int (*)(mpfr_ptr, long, mpfr_srcptr, mp_rnd_t),
224                               const REAL_VALUE_TYPE *, bool);
225 static tree do_mpfr_remquo (tree, tree, tree);
226 static tree do_mpfr_lgamma_r (tree, tree, tree);
227
228 /* Return true if NAME starts with __builtin_ or __sync_.  */
229
230 bool
231 is_builtin_name (const char *name)
232 {
233   if (strncmp (name, "__builtin_", 10) == 0)
234     return true;
235   if (strncmp (name, "__sync_", 7) == 0)
236     return true;
237   return false;
238 }
239
240
241 /* Return true if DECL is a function symbol representing a built-in.  */
242
243 bool
244 is_builtin_fn (tree decl)
245 {
246   return TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl);
247 }
248
249
250 /* Return true if NODE should be considered for inline expansion regardless
251    of the optimization level.  This means whenever a function is invoked with
252    its "internal" name, which normally contains the prefix "__builtin".  */
253
254 static bool
255 called_as_built_in (tree node)
256 {
257   /* Note that we must use DECL_NAME, not DECL_ASSEMBLER_NAME_SET_P since
258      we want the name used to call the function, not the name it
259      will have. */
260   const char *name = IDENTIFIER_POINTER (DECL_NAME (node));
261   return is_builtin_name (name);
262 }
263
264 /* Return the alignment in bits of EXP, an object.
265    Don't return more than MAX_ALIGN no matter what, ALIGN is the inital
266    guessed alignment e.g. from type alignment.  */
267
268 int
269 get_object_alignment (tree exp, unsigned int align, unsigned int max_align)
270 {
271   unsigned int inner;
272
273   inner = max_align;
274   if (handled_component_p (exp))
275    {
276       HOST_WIDE_INT bitsize, bitpos;
277       tree offset;
278       enum machine_mode mode;
279       int unsignedp, volatilep;
280
281       exp = get_inner_reference (exp, &bitsize, &bitpos, &offset,
282                                  &mode, &unsignedp, &volatilep, true);
283       if (bitpos)
284         inner = MIN (inner, (unsigned) (bitpos & -bitpos));
285       while (offset)
286         {
287           tree next_offset;
288
289           if (TREE_CODE (offset) == PLUS_EXPR)
290             {
291               next_offset = TREE_OPERAND (offset, 0);
292               offset = TREE_OPERAND (offset, 1);
293             }
294           else
295             next_offset = NULL;
296           if (host_integerp (offset, 1))
297             {
298               /* Any overflow in calculating offset_bits won't change
299                  the alignment.  */
300               unsigned offset_bits
301                 = ((unsigned) tree_low_cst (offset, 1) * BITS_PER_UNIT);
302
303               if (offset_bits)
304                 inner = MIN (inner, (offset_bits & -offset_bits));
305             }
306           else if (TREE_CODE (offset) == MULT_EXPR
307                    && host_integerp (TREE_OPERAND (offset, 1), 1))
308             {
309               /* Any overflow in calculating offset_factor won't change
310                  the alignment.  */
311               unsigned offset_factor
312                 = ((unsigned) tree_low_cst (TREE_OPERAND (offset, 1), 1)
313                    * BITS_PER_UNIT);
314
315               if (offset_factor)
316                 inner = MIN (inner, (offset_factor & -offset_factor));
317             }
318           else
319             {
320               inner = MIN (inner, BITS_PER_UNIT);
321               break;
322             }
323           offset = next_offset;
324         }
325     }
326   if (TREE_CODE (exp) == CONST_DECL)
327     exp = DECL_INITIAL (exp);
328   if (DECL_P (exp)
329       && TREE_CODE (exp) != LABEL_DECL)
330     align = MIN (inner, DECL_ALIGN (exp));
331 #ifdef CONSTANT_ALIGNMENT
332   else if (CONSTANT_CLASS_P (exp))
333     align = MIN (inner, (unsigned)CONSTANT_ALIGNMENT (exp, align));
334 #endif
335   else if (TREE_CODE (exp) == VIEW_CONVERT_EXPR
336            || TREE_CODE (exp) == INDIRECT_REF)
337     align = MIN (TYPE_ALIGN (TREE_TYPE (exp)), inner);
338   else
339     align = MIN (align, inner);
340   return MIN (align, max_align);
341 }
342
343 /* Returns true iff we can trust that alignment information has been
344    calculated properly.  */
345
346 bool
347 can_trust_pointer_alignment (void)
348 {
349   /* We rely on TER to compute accurate alignment information.  */
350   return (optimize && flag_tree_ter);
351 }
352
353 /* Return the alignment in bits of EXP, a pointer valued expression.
354    But don't return more than MAX_ALIGN no matter what.
355    The alignment returned is, by default, the alignment of the thing that
356    EXP points to.  If it is not a POINTER_TYPE, 0 is returned.
357
358    Otherwise, look at the expression to see if we can do better, i.e., if the
359    expression is actually pointing at an object whose alignment is tighter.  */
360
361 int
362 get_pointer_alignment (tree exp, unsigned int max_align)
363 {
364   unsigned int align, inner;
365
366   if (!can_trust_pointer_alignment ())
367     return 0;
368
369   if (!POINTER_TYPE_P (TREE_TYPE (exp)))
370     return 0;
371
372   align = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (exp)));
373   align = MIN (align, max_align);
374
375   while (1)
376     {
377       switch (TREE_CODE (exp))
378         {
379         CASE_CONVERT:
380           exp = TREE_OPERAND (exp, 0);
381           if (! POINTER_TYPE_P (TREE_TYPE (exp)))
382             return align;
383
384           inner = TYPE_ALIGN (TREE_TYPE (TREE_TYPE (exp)));
385           align = MIN (inner, max_align);
386           break;
387
388         case POINTER_PLUS_EXPR:
389           /* If sum of pointer + int, restrict our maximum alignment to that
390              imposed by the integer.  If not, we can't do any better than
391              ALIGN.  */
392           if (! host_integerp (TREE_OPERAND (exp, 1), 1))
393             return align;
394
395           while (((tree_low_cst (TREE_OPERAND (exp, 1), 1))
396                   & (max_align / BITS_PER_UNIT - 1))
397                  != 0)
398             max_align >>= 1;
399
400           exp = TREE_OPERAND (exp, 0);
401           break;
402
403         case ADDR_EXPR:
404           /* See what we are pointing at and look at its alignment.  */
405           return get_object_alignment (TREE_OPERAND (exp, 0), align, max_align);
406
407         default:
408           return align;
409         }
410     }
411 }
412
413 /* Compute the length of a C string.  TREE_STRING_LENGTH is not the right
414    way, because it could contain a zero byte in the middle.
415    TREE_STRING_LENGTH is the size of the character array, not the string.
416
417    ONLY_VALUE should be nonzero if the result is not going to be emitted
418    into the instruction stream and zero if it is going to be expanded.
419    E.g. with i++ ? "foo" : "bar", if ONLY_VALUE is nonzero, constant 3
420    is returned, otherwise NULL, since
421    len = c_strlen (src, 1); if (len) expand_expr (len, ...); would not
422    evaluate the side-effects.
423
424    The value returned is of type `ssizetype'.
425
426    Unfortunately, string_constant can't access the values of const char
427    arrays with initializers, so neither can we do so here.  */
428
429 tree
430 c_strlen (tree src, int only_value)
431 {
432   tree offset_node;
433   HOST_WIDE_INT offset;
434   int max;
435   const char *ptr;
436   location_t loc;
437
438   STRIP_NOPS (src);
439   if (TREE_CODE (src) == COND_EXPR
440       && (only_value || !TREE_SIDE_EFFECTS (TREE_OPERAND (src, 0))))
441     {
442       tree len1, len2;
443
444       len1 = c_strlen (TREE_OPERAND (src, 1), only_value);
445       len2 = c_strlen (TREE_OPERAND (src, 2), only_value);
446       if (tree_int_cst_equal (len1, len2))
447         return len1;
448     }
449
450   if (TREE_CODE (src) == COMPOUND_EXPR
451       && (only_value || !TREE_SIDE_EFFECTS (TREE_OPERAND (src, 0))))
452     return c_strlen (TREE_OPERAND (src, 1), only_value);
453
454   if (EXPR_HAS_LOCATION (src))
455     loc = EXPR_LOCATION (src);
456   else
457     loc = input_location;
458
459   src = string_constant (src, &offset_node);
460   if (src == 0)
461     return NULL_TREE;
462
463   max = TREE_STRING_LENGTH (src) - 1;
464   ptr = TREE_STRING_POINTER (src);
465
466   if (offset_node && TREE_CODE (offset_node) != INTEGER_CST)
467     {
468       /* If the string has an internal zero byte (e.g., "foo\0bar"), we can't
469          compute the offset to the following null if we don't know where to
470          start searching for it.  */
471       int i;
472
473       for (i = 0; i < max; i++)
474         if (ptr[i] == 0)
475           return NULL_TREE;
476
477       /* We don't know the starting offset, but we do know that the string
478          has no internal zero bytes.  We can assume that the offset falls
479          within the bounds of the string; otherwise, the programmer deserves
480          what he gets.  Subtract the offset from the length of the string,
481          and return that.  This would perhaps not be valid if we were dealing
482          with named arrays in addition to literal string constants.  */
483
484       return size_diffop_loc (loc, size_int (max), offset_node);
485     }
486
487   /* We have a known offset into the string.  Start searching there for
488      a null character if we can represent it as a single HOST_WIDE_INT.  */
489   if (offset_node == 0)
490     offset = 0;
491   else if (! host_integerp (offset_node, 0))
492     offset = -1;
493   else
494     offset = tree_low_cst (offset_node, 0);
495
496   /* If the offset is known to be out of bounds, warn, and call strlen at
497      runtime.  */
498   if (offset < 0 || offset > max)
499     {
500      /* Suppress multiple warnings for propagated constant strings.  */
501       if (! TREE_NO_WARNING (src))
502         {
503           warning_at (loc, 0, "offset outside bounds of constant string");
504           TREE_NO_WARNING (src) = 1;
505         }
506       return NULL_TREE;
507     }
508
509   /* Use strlen to search for the first zero byte.  Since any strings
510      constructed with build_string will have nulls appended, we win even
511      if we get handed something like (char[4])"abcd".
512
513      Since OFFSET is our starting index into the string, no further
514      calculation is needed.  */
515   return ssize_int (strlen (ptr + offset));
516 }
517
518 /* Return a char pointer for a C string if it is a string constant
519    or sum of string constant and integer constant.  */
520
521 static const char *
522 c_getstr (tree src)
523 {
524   tree offset_node;
525
526   src = string_constant (src, &offset_node);
527   if (src == 0)
528     return 0;
529
530   if (offset_node == 0)
531     return TREE_STRING_POINTER (src);
532   else if (!host_integerp (offset_node, 1)
533            || compare_tree_int (offset_node, TREE_STRING_LENGTH (src) - 1) > 0)
534     return 0;
535
536   return TREE_STRING_POINTER (src) + tree_low_cst (offset_node, 1);
537 }
538
539 /* Return a CONST_INT or CONST_DOUBLE corresponding to target reading
540    GET_MODE_BITSIZE (MODE) bits from string constant STR.  */
541
542 static rtx
543 c_readstr (const char *str, enum machine_mode mode)
544 {
545   HOST_WIDE_INT c[2];
546   HOST_WIDE_INT ch;
547   unsigned int i, j;
548
549   gcc_assert (GET_MODE_CLASS (mode) == MODE_INT);
550
551   c[0] = 0;
552   c[1] = 0;
553   ch = 1;
554   for (i = 0; i < GET_MODE_SIZE (mode); i++)
555     {
556       j = i;
557       if (WORDS_BIG_ENDIAN)
558         j = GET_MODE_SIZE (mode) - i - 1;
559       if (BYTES_BIG_ENDIAN != WORDS_BIG_ENDIAN
560           && GET_MODE_SIZE (mode) > UNITS_PER_WORD)
561         j = j + UNITS_PER_WORD - 2 * (j % UNITS_PER_WORD) - 1;
562       j *= BITS_PER_UNIT;
563       gcc_assert (j < 2 * HOST_BITS_PER_WIDE_INT);
564
565       if (ch)
566         ch = (unsigned char) str[i];
567       c[j / HOST_BITS_PER_WIDE_INT] |= ch << (j % HOST_BITS_PER_WIDE_INT);
568     }
569   return immed_double_const (c[0], c[1], mode);
570 }
571
572 /* Cast a target constant CST to target CHAR and if that value fits into
573    host char type, return zero and put that value into variable pointed to by
574    P.  */
575
576 static int
577 target_char_cast (tree cst, char *p)
578 {
579   unsigned HOST_WIDE_INT val, hostval;
580
581   if (!host_integerp (cst, 1)
582       || CHAR_TYPE_SIZE > HOST_BITS_PER_WIDE_INT)
583     return 1;
584
585   val = tree_low_cst (cst, 1);
586   if (CHAR_TYPE_SIZE < HOST_BITS_PER_WIDE_INT)
587     val &= (((unsigned HOST_WIDE_INT) 1) << CHAR_TYPE_SIZE) - 1;
588
589   hostval = val;
590   if (HOST_BITS_PER_CHAR < HOST_BITS_PER_WIDE_INT)
591     hostval &= (((unsigned HOST_WIDE_INT) 1) << HOST_BITS_PER_CHAR) - 1;
592
593   if (val != hostval)
594     return 1;
595
596   *p = hostval;
597   return 0;
598 }
599
600 /* Similar to save_expr, but assumes that arbitrary code is not executed
601    in between the multiple evaluations.  In particular, we assume that a
602    non-addressable local variable will not be modified.  */
603
604 static tree
605 builtin_save_expr (tree exp)
606 {
607   if (TREE_ADDRESSABLE (exp) == 0
608       && (TREE_CODE (exp) == PARM_DECL
609           || (TREE_CODE (exp) == VAR_DECL && !TREE_STATIC (exp))))
610     return exp;
611
612   return save_expr (exp);
613 }
614
615 /* Given TEM, a pointer to a stack frame, follow the dynamic chain COUNT
616    times to get the address of either a higher stack frame, or a return
617    address located within it (depending on FNDECL_CODE).  */
618
619 static rtx
620 expand_builtin_return_addr (enum built_in_function fndecl_code, int count)
621 {
622   int i;
623
624 #ifdef INITIAL_FRAME_ADDRESS_RTX
625   rtx tem = INITIAL_FRAME_ADDRESS_RTX;
626 #else
627   rtx tem;
628
629   /* For a zero count with __builtin_return_address, we don't care what
630      frame address we return, because target-specific definitions will
631      override us.  Therefore frame pointer elimination is OK, and using
632      the soft frame pointer is OK.
633
634      For a nonzero count, or a zero count with __builtin_frame_address,
635      we require a stable offset from the current frame pointer to the
636      previous one, so we must use the hard frame pointer, and
637      we must disable frame pointer elimination.  */
638   if (count == 0 && fndecl_code == BUILT_IN_RETURN_ADDRESS)
639     tem = frame_pointer_rtx;
640   else
641     {
642       tem = hard_frame_pointer_rtx;
643
644       /* Tell reload not to eliminate the frame pointer.  */
645       crtl->accesses_prior_frames = 1;
646     }
647 #endif
648
649   /* Some machines need special handling before we can access
650      arbitrary frames.  For example, on the SPARC, we must first flush
651      all register windows to the stack.  */
652 #ifdef SETUP_FRAME_ADDRESSES
653   if (count > 0)
654     SETUP_FRAME_ADDRESSES ();
655 #endif
656
657   /* On the SPARC, the return address is not in the frame, it is in a
658      register.  There is no way to access it off of the current frame
659      pointer, but it can be accessed off the previous frame pointer by
660      reading the value from the register window save area.  */
661 #ifdef RETURN_ADDR_IN_PREVIOUS_FRAME
662   if (fndecl_code == BUILT_IN_RETURN_ADDRESS)
663     count--;
664 #endif
665
666   /* Scan back COUNT frames to the specified frame.  */
667   for (i = 0; i < count; i++)
668     {
669       /* Assume the dynamic chain pointer is in the word that the
670          frame address points to, unless otherwise specified.  */
671 #ifdef DYNAMIC_CHAIN_ADDRESS
672       tem = DYNAMIC_CHAIN_ADDRESS (tem);
673 #endif
674       tem = memory_address (Pmode, tem);
675       tem = gen_frame_mem (Pmode, tem);
676       tem = copy_to_reg (tem);
677     }
678
679   /* For __builtin_frame_address, return what we've got.  But, on
680      the SPARC for example, we may have to add a bias.  */
681   if (fndecl_code == BUILT_IN_FRAME_ADDRESS)
682 #ifdef FRAME_ADDR_RTX
683     return FRAME_ADDR_RTX (tem);
684 #else
685     return tem;
686 #endif
687
688   /* For __builtin_return_address, get the return address from that frame.  */
689 #ifdef RETURN_ADDR_RTX
690   tem = RETURN_ADDR_RTX (count, tem);
691 #else
692   tem = memory_address (Pmode,
693                         plus_constant (tem, GET_MODE_SIZE (Pmode)));
694   tem = gen_frame_mem (Pmode, tem);
695 #endif
696   return tem;
697 }
698
699 /* Alias set used for setjmp buffer.  */
700 static alias_set_type setjmp_alias_set = -1;
701
702 /* Construct the leading half of a __builtin_setjmp call.  Control will
703    return to RECEIVER_LABEL.  This is also called directly by the SJLJ
704    exception handling code.  */
705
706 void
707 expand_builtin_setjmp_setup (rtx buf_addr, rtx receiver_label)
708 {
709   enum machine_mode sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL);
710   rtx stack_save;
711   rtx mem;
712
713   if (setjmp_alias_set == -1)
714     setjmp_alias_set = new_alias_set ();
715
716   buf_addr = convert_memory_address (Pmode, buf_addr);
717
718   buf_addr = force_reg (Pmode, force_operand (buf_addr, NULL_RTX));
719
720   /* We store the frame pointer and the address of receiver_label in
721      the buffer and use the rest of it for the stack save area, which
722      is machine-dependent.  */
723
724   mem = gen_rtx_MEM (Pmode, buf_addr);
725   set_mem_alias_set (mem, setjmp_alias_set);
726   emit_move_insn (mem, targetm.builtin_setjmp_frame_value ());
727
728   mem = gen_rtx_MEM (Pmode, plus_constant (buf_addr, GET_MODE_SIZE (Pmode))),
729   set_mem_alias_set (mem, setjmp_alias_set);
730
731   emit_move_insn (validize_mem (mem),
732                   force_reg (Pmode, gen_rtx_LABEL_REF (Pmode, receiver_label)));
733
734   stack_save = gen_rtx_MEM (sa_mode,
735                             plus_constant (buf_addr,
736                                            2 * GET_MODE_SIZE (Pmode)));
737   set_mem_alias_set (stack_save, setjmp_alias_set);
738   emit_stack_save (SAVE_NONLOCAL, &stack_save, NULL_RTX);
739
740   /* If there is further processing to do, do it.  */
741 #ifdef HAVE_builtin_setjmp_setup
742   if (HAVE_builtin_setjmp_setup)
743     emit_insn (gen_builtin_setjmp_setup (buf_addr));
744 #endif
745
746   /* Tell optimize_save_area_alloca that extra work is going to
747      need to go on during alloca.  */
748   cfun->calls_setjmp = 1;
749
750   /* We have a nonlocal label.   */
751   cfun->has_nonlocal_label = 1;
752 }
753
754 /* Construct the trailing part of a __builtin_setjmp call.  This is
755    also called directly by the SJLJ exception handling code.  */
756
757 void
758 expand_builtin_setjmp_receiver (rtx receiver_label ATTRIBUTE_UNUSED)
759 {
760   rtx chain;
761
762   /* Clobber the FP when we get here, so we have to make sure it's
763      marked as used by this function.  */
764   emit_use (hard_frame_pointer_rtx);
765
766   /* Mark the static chain as clobbered here so life information
767      doesn't get messed up for it.  */
768   chain = targetm.calls.static_chain (current_function_decl, true);
769   if (chain && REG_P (chain))
770     emit_clobber (chain);
771
772   /* Now put in the code to restore the frame pointer, and argument
773      pointer, if needed.  */
774 #ifdef HAVE_nonlocal_goto
775   if (! HAVE_nonlocal_goto)
776 #endif
777     {
778       emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx);
779       /* This might change the hard frame pointer in ways that aren't
780          apparent to early optimization passes, so force a clobber.  */
781       emit_clobber (hard_frame_pointer_rtx);
782     }
783
784 #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
785   if (fixed_regs[ARG_POINTER_REGNUM])
786     {
787 #ifdef ELIMINABLE_REGS
788       size_t i;
789       static const struct elims {const int from, to;} elim_regs[] = ELIMINABLE_REGS;
790
791       for (i = 0; i < ARRAY_SIZE (elim_regs); i++)
792         if (elim_regs[i].from == ARG_POINTER_REGNUM
793             && elim_regs[i].to == HARD_FRAME_POINTER_REGNUM)
794           break;
795
796       if (i == ARRAY_SIZE (elim_regs))
797 #endif
798         {
799           /* Now restore our arg pointer from the address at which it
800              was saved in our stack frame.  */
801           emit_move_insn (crtl->args.internal_arg_pointer,
802                           copy_to_reg (get_arg_pointer_save_area ()));
803         }
804     }
805 #endif
806
807 #ifdef HAVE_builtin_setjmp_receiver
808   if (HAVE_builtin_setjmp_receiver)
809     emit_insn (gen_builtin_setjmp_receiver (receiver_label));
810   else
811 #endif
812 #ifdef HAVE_nonlocal_goto_receiver
813     if (HAVE_nonlocal_goto_receiver)
814       emit_insn (gen_nonlocal_goto_receiver ());
815     else
816 #endif
817       { /* Nothing */ }
818
819   /* We must not allow the code we just generated to be reordered by
820      scheduling.  Specifically, the update of the frame pointer must
821      happen immediately, not later.  */
822   emit_insn (gen_blockage ());
823 }
824
825 /* __builtin_longjmp is passed a pointer to an array of five words (not
826    all will be used on all machines).  It operates similarly to the C
827    library function of the same name, but is more efficient.  Much of
828    the code below is copied from the handling of non-local gotos.  */
829
830 static void
831 expand_builtin_longjmp (rtx buf_addr, rtx value)
832 {
833   rtx fp, lab, stack, insn, last;
834   enum machine_mode sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL);
835
836   /* DRAP is needed for stack realign if longjmp is expanded to current
837      function  */
838   if (SUPPORTS_STACK_ALIGNMENT)
839     crtl->need_drap = true;
840
841   if (setjmp_alias_set == -1)
842     setjmp_alias_set = new_alias_set ();
843
844   buf_addr = convert_memory_address (Pmode, buf_addr);
845
846   buf_addr = force_reg (Pmode, buf_addr);
847
848   /* We require that the user must pass a second argument of 1, because
849      that is what builtin_setjmp will return.  */
850   gcc_assert (value == const1_rtx);
851
852   last = get_last_insn ();
853 #ifdef HAVE_builtin_longjmp
854   if (HAVE_builtin_longjmp)
855     emit_insn (gen_builtin_longjmp (buf_addr));
856   else
857 #endif
858     {
859       fp = gen_rtx_MEM (Pmode, buf_addr);
860       lab = gen_rtx_MEM (Pmode, plus_constant (buf_addr,
861                                                GET_MODE_SIZE (Pmode)));
862
863       stack = gen_rtx_MEM (sa_mode, plus_constant (buf_addr,
864                                                    2 * GET_MODE_SIZE (Pmode)));
865       set_mem_alias_set (fp, setjmp_alias_set);
866       set_mem_alias_set (lab, setjmp_alias_set);
867       set_mem_alias_set (stack, setjmp_alias_set);
868
869       /* Pick up FP, label, and SP from the block and jump.  This code is
870          from expand_goto in stmt.c; see there for detailed comments.  */
871 #ifdef HAVE_nonlocal_goto
872       if (HAVE_nonlocal_goto)
873         /* We have to pass a value to the nonlocal_goto pattern that will
874            get copied into the static_chain pointer, but it does not matter
875            what that value is, because builtin_setjmp does not use it.  */
876         emit_insn (gen_nonlocal_goto (value, lab, stack, fp));
877       else
878 #endif
879         {
880           lab = copy_to_reg (lab);
881
882           emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
883           emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
884
885           emit_move_insn (hard_frame_pointer_rtx, fp);
886           emit_stack_restore (SAVE_NONLOCAL, stack, NULL_RTX);
887
888           emit_use (hard_frame_pointer_rtx);
889           emit_use (stack_pointer_rtx);
890           emit_indirect_jump (lab);
891         }
892     }
893
894   /* Search backwards and mark the jump insn as a non-local goto.
895      Note that this precludes the use of __builtin_longjmp to a
896      __builtin_setjmp target in the same function.  However, we've
897      already cautioned the user that these functions are for
898      internal exception handling use only.  */
899   for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
900     {
901       gcc_assert (insn != last);
902
903       if (JUMP_P (insn))
904         {
905           add_reg_note (insn, REG_NON_LOCAL_GOTO, const0_rtx);
906           break;
907         }
908       else if (CALL_P (insn))
909         break;
910     }
911 }
912
913 /* Expand a call to __builtin_nonlocal_goto.  We're passed the target label
914    and the address of the save area.  */
915
916 static rtx
917 expand_builtin_nonlocal_goto (tree exp)
918 {
919   tree t_label, t_save_area;
920   rtx r_label, r_save_area, r_fp, r_sp, insn;
921
922   if (!validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
923     return NULL_RTX;
924
925   t_label = CALL_EXPR_ARG (exp, 0);
926   t_save_area = CALL_EXPR_ARG (exp, 1);
927
928   r_label = expand_normal (t_label);
929   r_label = convert_memory_address (Pmode, r_label);
930   r_save_area = expand_normal (t_save_area);
931   r_save_area = convert_memory_address (Pmode, r_save_area);
932   /* Copy the address of the save location to a register just in case it was based
933     on the frame pointer.   */
934   r_save_area = copy_to_reg (r_save_area);
935   r_fp = gen_rtx_MEM (Pmode, r_save_area);
936   r_sp = gen_rtx_MEM (STACK_SAVEAREA_MODE (SAVE_NONLOCAL),
937                       plus_constant (r_save_area, GET_MODE_SIZE (Pmode)));
938
939   crtl->has_nonlocal_goto = 1;
940
941 #ifdef HAVE_nonlocal_goto
942   /* ??? We no longer need to pass the static chain value, afaik.  */
943   if (HAVE_nonlocal_goto)
944     emit_insn (gen_nonlocal_goto (const0_rtx, r_label, r_sp, r_fp));
945   else
946 #endif
947     {
948       r_label = copy_to_reg (r_label);
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       /* Restore frame pointer for containing function.
954          This sets the actual hard register used for the frame pointer
955          to the location of the function's incoming static chain info.
956          The non-local goto handler will then adjust it to contain the
957          proper value and reload the argument pointer, if needed.  */
958       emit_move_insn (hard_frame_pointer_rtx, r_fp);
959       emit_stack_restore (SAVE_NONLOCAL, r_sp, NULL_RTX);
960
961       /* USE of hard_frame_pointer_rtx added for consistency;
962          not clear if really needed.  */
963       emit_use (hard_frame_pointer_rtx);
964       emit_use (stack_pointer_rtx);
965
966       /* If the architecture is using a GP register, we must
967          conservatively assume that the target function makes use of it.
968          The prologue of functions with nonlocal gotos must therefore
969          initialize the GP register to the appropriate value, and we
970          must then make sure that this value is live at the point
971          of the jump.  (Note that this doesn't necessarily apply
972          to targets with a nonlocal_goto pattern; they are free
973          to implement it in their own way.  Note also that this is
974          a no-op if the GP register is a global invariant.)  */
975       if ((unsigned) PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
976           && fixed_regs[PIC_OFFSET_TABLE_REGNUM])
977         emit_use (pic_offset_table_rtx);
978
979       emit_indirect_jump (r_label);
980     }
981
982   /* Search backwards to the jump insn and mark it as a
983      non-local goto.  */
984   for (insn = get_last_insn (); insn; insn = PREV_INSN (insn))
985     {
986       if (JUMP_P (insn))
987         {
988           add_reg_note (insn, REG_NON_LOCAL_GOTO, const0_rtx);
989           break;
990         }
991       else if (CALL_P (insn))
992         break;
993     }
994
995   return const0_rtx;
996 }
997
998 /* __builtin_update_setjmp_buf is passed a pointer to an array of five words
999    (not all will be used on all machines) that was passed to __builtin_setjmp.
1000    It updates the stack pointer in that block to correspond to the current
1001    stack pointer.  */
1002
1003 static void
1004 expand_builtin_update_setjmp_buf (rtx buf_addr)
1005 {
1006   enum machine_mode sa_mode = Pmode;
1007   rtx stack_save;
1008
1009
1010 #ifdef HAVE_save_stack_nonlocal
1011   if (HAVE_save_stack_nonlocal)
1012     sa_mode = insn_data[(int) CODE_FOR_save_stack_nonlocal].operand[0].mode;
1013 #endif
1014 #ifdef STACK_SAVEAREA_MODE
1015   sa_mode = STACK_SAVEAREA_MODE (SAVE_NONLOCAL);
1016 #endif
1017
1018   stack_save
1019     = gen_rtx_MEM (sa_mode,
1020                    memory_address
1021                    (sa_mode,
1022                     plus_constant (buf_addr, 2 * GET_MODE_SIZE (Pmode))));
1023
1024 #ifdef HAVE_setjmp
1025   if (HAVE_setjmp)
1026     emit_insn (gen_setjmp ());
1027 #endif
1028
1029   emit_stack_save (SAVE_NONLOCAL, &stack_save, NULL_RTX);
1030 }
1031
1032 /* Expand a call to __builtin_prefetch.  For a target that does not support
1033    data prefetch, evaluate the memory address argument in case it has side
1034    effects.  */
1035
1036 static void
1037 expand_builtin_prefetch (tree exp)
1038 {
1039   tree arg0, arg1, arg2;
1040   int nargs;
1041   rtx op0, op1, op2;
1042
1043   if (!validate_arglist (exp, POINTER_TYPE, 0))
1044     return;
1045
1046   arg0 = CALL_EXPR_ARG (exp, 0);
1047
1048   /* Arguments 1 and 2 are optional; argument 1 (read/write) defaults to
1049      zero (read) and argument 2 (locality) defaults to 3 (high degree of
1050      locality).  */
1051   nargs = call_expr_nargs (exp);
1052   if (nargs > 1)
1053     arg1 = CALL_EXPR_ARG (exp, 1);
1054   else
1055     arg1 = integer_zero_node;
1056   if (nargs > 2)
1057     arg2 = CALL_EXPR_ARG (exp, 2);
1058   else
1059     arg2 = build_int_cst (NULL_TREE, 3);
1060
1061   /* Argument 0 is an address.  */
1062   op0 = expand_expr (arg0, NULL_RTX, Pmode, EXPAND_NORMAL);
1063
1064   /* Argument 1 (read/write flag) must be a compile-time constant int.  */
1065   if (TREE_CODE (arg1) != INTEGER_CST)
1066     {
1067       error ("second argument to %<__builtin_prefetch%> must be a constant");
1068       arg1 = integer_zero_node;
1069     }
1070   op1 = expand_normal (arg1);
1071   /* Argument 1 must be either zero or one.  */
1072   if (INTVAL (op1) != 0 && INTVAL (op1) != 1)
1073     {
1074       warning (0, "invalid second argument to %<__builtin_prefetch%>;"
1075                " using zero");
1076       op1 = const0_rtx;
1077     }
1078
1079   /* Argument 2 (locality) must be a compile-time constant int.  */
1080   if (TREE_CODE (arg2) != INTEGER_CST)
1081     {
1082       error ("third argument to %<__builtin_prefetch%> must be a constant");
1083       arg2 = integer_zero_node;
1084     }
1085   op2 = expand_normal (arg2);
1086   /* Argument 2 must be 0, 1, 2, or 3.  */
1087   if (INTVAL (op2) < 0 || INTVAL (op2) > 3)
1088     {
1089       warning (0, "invalid third argument to %<__builtin_prefetch%>; using zero");
1090       op2 = const0_rtx;
1091     }
1092
1093 #ifdef HAVE_prefetch
1094   if (HAVE_prefetch)
1095     {
1096       if ((! (*insn_data[(int) CODE_FOR_prefetch].operand[0].predicate)
1097              (op0,
1098               insn_data[(int) CODE_FOR_prefetch].operand[0].mode))
1099           || (GET_MODE (op0) != Pmode))
1100         {
1101           op0 = convert_memory_address (Pmode, op0);
1102           op0 = force_reg (Pmode, op0);
1103         }
1104       emit_insn (gen_prefetch (op0, op1, op2));
1105     }
1106 #endif
1107
1108   /* Don't do anything with direct references to volatile memory, but
1109      generate code to handle other side effects.  */
1110   if (!MEM_P (op0) && side_effects_p (op0))
1111     emit_insn (op0);
1112 }
1113
1114 /* Get a MEM rtx for expression EXP which is the address of an operand
1115    to be used in a string instruction (cmpstrsi, movmemsi, ..).  LEN is
1116    the maximum length of the block of memory that might be accessed or
1117    NULL if unknown.  */
1118
1119 static rtx
1120 get_memory_rtx (tree exp, tree len)
1121 {
1122   tree orig_exp = exp;
1123   rtx addr, mem;
1124   HOST_WIDE_INT off;
1125
1126   /* When EXP is not resolved SAVE_EXPR, MEM_ATTRS can be still derived
1127      from its expression, for expr->a.b only <variable>.a.b is recorded.  */
1128   if (TREE_CODE (exp) == SAVE_EXPR && !SAVE_EXPR_RESOLVED_P (exp))
1129     exp = TREE_OPERAND (exp, 0);
1130
1131   addr = expand_expr (orig_exp, NULL_RTX, ptr_mode, EXPAND_NORMAL);
1132   mem = gen_rtx_MEM (BLKmode, memory_address (BLKmode, addr));
1133
1134   /* Get an expression we can use to find the attributes to assign to MEM.
1135      If it is an ADDR_EXPR, use the operand.  Otherwise, dereference it if
1136      we can.  First remove any nops.  */
1137   while (CONVERT_EXPR_P (exp)
1138          && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (exp, 0))))
1139     exp = TREE_OPERAND (exp, 0);
1140
1141   off = 0;
1142   if (TREE_CODE (exp) == POINTER_PLUS_EXPR
1143       && TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
1144       && host_integerp (TREE_OPERAND (exp, 1), 0)
1145       && (off = tree_low_cst (TREE_OPERAND (exp, 1), 0)) > 0)
1146     exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
1147   else if (TREE_CODE (exp) == ADDR_EXPR)
1148     exp = TREE_OPERAND (exp, 0);
1149   else if (POINTER_TYPE_P (TREE_TYPE (exp)))
1150     exp = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (exp)), exp);
1151   else
1152     exp = NULL;
1153
1154   /* Honor attributes derived from exp, except for the alias set
1155      (as builtin stringops may alias with anything) and the size
1156      (as stringops may access multiple array elements).  */
1157   if (exp)
1158     {
1159       set_mem_attributes (mem, exp, 0);
1160
1161       if (off)
1162         mem = adjust_automodify_address_nv (mem, BLKmode, NULL, off);
1163
1164       /* Allow the string and memory builtins to overflow from one
1165          field into another, see http://gcc.gnu.org/PR23561.
1166          Thus avoid COMPONENT_REFs in MEM_EXPR unless we know the whole
1167          memory accessed by the string or memory builtin will fit
1168          within the field.  */
1169       if (MEM_EXPR (mem) && TREE_CODE (MEM_EXPR (mem)) == COMPONENT_REF)
1170         {
1171           tree mem_expr = MEM_EXPR (mem);
1172           HOST_WIDE_INT offset = -1, length = -1;
1173           tree inner = exp;
1174
1175           while (TREE_CODE (inner) == ARRAY_REF
1176                  || CONVERT_EXPR_P (inner)
1177                  || TREE_CODE (inner) == VIEW_CONVERT_EXPR
1178                  || TREE_CODE (inner) == SAVE_EXPR)
1179             inner = TREE_OPERAND (inner, 0);
1180
1181           gcc_assert (TREE_CODE (inner) == COMPONENT_REF);
1182
1183           if (MEM_OFFSET (mem)
1184               && CONST_INT_P (MEM_OFFSET (mem)))
1185             offset = INTVAL (MEM_OFFSET (mem));
1186
1187           if (offset >= 0 && len && host_integerp (len, 0))
1188             length = tree_low_cst (len, 0);
1189
1190           while (TREE_CODE (inner) == COMPONENT_REF)
1191             {
1192               tree field = TREE_OPERAND (inner, 1);
1193               gcc_assert (TREE_CODE (mem_expr) == COMPONENT_REF);
1194               gcc_assert (field == TREE_OPERAND (mem_expr, 1));
1195
1196               /* Bitfields are generally not byte-addressable.  */
1197               gcc_assert (!DECL_BIT_FIELD (field)
1198                           || ((tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 1)
1199                                % BITS_PER_UNIT) == 0
1200                               && host_integerp (DECL_SIZE (field), 0)
1201                               && (TREE_INT_CST_LOW (DECL_SIZE (field))
1202                                   % BITS_PER_UNIT) == 0));
1203
1204               /* If we can prove that the memory starting at XEXP (mem, 0) and
1205                  ending at XEXP (mem, 0) + LENGTH will fit into this field, we
1206                  can keep the COMPONENT_REF in MEM_EXPR.  But be careful with
1207                  fields without DECL_SIZE_UNIT like flexible array members.  */
1208               if (length >= 0
1209                   && DECL_SIZE_UNIT (field)
1210                   && host_integerp (DECL_SIZE_UNIT (field), 0))
1211                 {
1212                   HOST_WIDE_INT size
1213                     = TREE_INT_CST_LOW (DECL_SIZE_UNIT (field));
1214                   if (offset <= size
1215                       && length <= size
1216                       && offset + length <= size)
1217                     break;
1218                 }
1219
1220               if (offset >= 0
1221                   && host_integerp (DECL_FIELD_OFFSET (field), 0))
1222                 offset += TREE_INT_CST_LOW (DECL_FIELD_OFFSET (field))
1223                           + tree_low_cst (DECL_FIELD_BIT_OFFSET (field), 1)
1224                             / BITS_PER_UNIT;
1225               else
1226                 {
1227                   offset = -1;
1228                   length = -1;
1229                 }
1230
1231               mem_expr = TREE_OPERAND (mem_expr, 0);
1232               inner = TREE_OPERAND (inner, 0);
1233             }
1234
1235           if (mem_expr == NULL)
1236             offset = -1;
1237           if (mem_expr != MEM_EXPR (mem))
1238             {
1239               set_mem_expr (mem, mem_expr);
1240               set_mem_offset (mem, offset >= 0 ? GEN_INT (offset) : NULL_RTX);
1241             }
1242         }
1243       set_mem_alias_set (mem, 0);
1244       set_mem_size (mem, NULL_RTX);
1245     }
1246
1247   return mem;
1248 }
1249 \f
1250 /* Built-in functions to perform an untyped call and return.  */
1251
1252 /* For each register that may be used for calling a function, this
1253    gives a mode used to copy the register's value.  VOIDmode indicates
1254    the register is not used for calling a function.  If the machine
1255    has register windows, this gives only the outbound registers.
1256    INCOMING_REGNO gives the corresponding inbound register.  */
1257 static enum machine_mode apply_args_mode[FIRST_PSEUDO_REGISTER];
1258
1259 /* For each register that may be used for returning values, this gives
1260    a mode used to copy the register's value.  VOIDmode indicates the
1261    register is not used for returning values.  If the machine has
1262    register windows, this gives only the outbound registers.
1263    INCOMING_REGNO gives the corresponding inbound register.  */
1264 static enum machine_mode apply_result_mode[FIRST_PSEUDO_REGISTER];
1265
1266 /* Return the size required for the block returned by __builtin_apply_args,
1267    and initialize apply_args_mode.  */
1268
1269 static int
1270 apply_args_size (void)
1271 {
1272   static int size = -1;
1273   int align;
1274   unsigned int regno;
1275   enum machine_mode mode;
1276
1277   /* The values computed by this function never change.  */
1278   if (size < 0)
1279     {
1280       /* The first value is the incoming arg-pointer.  */
1281       size = GET_MODE_SIZE (Pmode);
1282
1283       /* The second value is the structure value address unless this is
1284          passed as an "invisible" first argument.  */
1285       if (targetm.calls.struct_value_rtx (cfun ? TREE_TYPE (cfun->decl) : 0, 0))
1286         size += GET_MODE_SIZE (Pmode);
1287
1288       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1289         if (FUNCTION_ARG_REGNO_P (regno))
1290           {
1291             mode = reg_raw_mode[regno];
1292
1293             gcc_assert (mode != VOIDmode);
1294
1295             align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
1296             if (size % align != 0)
1297               size = CEIL (size, align) * align;
1298             size += GET_MODE_SIZE (mode);
1299             apply_args_mode[regno] = mode;
1300           }
1301         else
1302           {
1303             apply_args_mode[regno] = VOIDmode;
1304           }
1305     }
1306   return size;
1307 }
1308
1309 /* Return the size required for the block returned by __builtin_apply,
1310    and initialize apply_result_mode.  */
1311
1312 static int
1313 apply_result_size (void)
1314 {
1315   static int size = -1;
1316   int align, regno;
1317   enum machine_mode mode;
1318
1319   /* The values computed by this function never change.  */
1320   if (size < 0)
1321     {
1322       size = 0;
1323
1324       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1325         if (targetm.calls.function_value_regno_p (regno))
1326           {
1327             mode = reg_raw_mode[regno];
1328
1329             gcc_assert (mode != VOIDmode);
1330
1331             align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
1332             if (size % align != 0)
1333               size = CEIL (size, align) * align;
1334             size += GET_MODE_SIZE (mode);
1335             apply_result_mode[regno] = mode;
1336           }
1337         else
1338           apply_result_mode[regno] = VOIDmode;
1339
1340       /* Allow targets that use untyped_call and untyped_return to override
1341          the size so that machine-specific information can be stored here.  */
1342 #ifdef APPLY_RESULT_SIZE
1343       size = APPLY_RESULT_SIZE;
1344 #endif
1345     }
1346   return size;
1347 }
1348
1349 #if defined (HAVE_untyped_call) || defined (HAVE_untyped_return)
1350 /* Create a vector describing the result block RESULT.  If SAVEP is true,
1351    the result block is used to save the values; otherwise it is used to
1352    restore the values.  */
1353
1354 static rtx
1355 result_vector (int savep, rtx result)
1356 {
1357   int regno, size, align, nelts;
1358   enum machine_mode mode;
1359   rtx reg, mem;
1360   rtx *savevec = XALLOCAVEC (rtx, FIRST_PSEUDO_REGISTER);
1361
1362   size = nelts = 0;
1363   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1364     if ((mode = apply_result_mode[regno]) != VOIDmode)
1365       {
1366         align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
1367         if (size % align != 0)
1368           size = CEIL (size, align) * align;
1369         reg = gen_rtx_REG (mode, savep ? regno : INCOMING_REGNO (regno));
1370         mem = adjust_address (result, mode, size);
1371         savevec[nelts++] = (savep
1372                             ? gen_rtx_SET (VOIDmode, mem, reg)
1373                             : gen_rtx_SET (VOIDmode, reg, mem));
1374         size += GET_MODE_SIZE (mode);
1375       }
1376   return gen_rtx_PARALLEL (VOIDmode, gen_rtvec_v (nelts, savevec));
1377 }
1378 #endif /* HAVE_untyped_call or HAVE_untyped_return */
1379
1380 /* Save the state required to perform an untyped call with the same
1381    arguments as were passed to the current function.  */
1382
1383 static rtx
1384 expand_builtin_apply_args_1 (void)
1385 {
1386   rtx registers, tem;
1387   int size, align, regno;
1388   enum machine_mode mode;
1389   rtx struct_incoming_value = targetm.calls.struct_value_rtx (cfun ? TREE_TYPE (cfun->decl) : 0, 1);
1390
1391   /* Create a block where the arg-pointer, structure value address,
1392      and argument registers can be saved.  */
1393   registers = assign_stack_local (BLKmode, apply_args_size (), -1);
1394
1395   /* Walk past the arg-pointer and structure value address.  */
1396   size = GET_MODE_SIZE (Pmode);
1397   if (targetm.calls.struct_value_rtx (cfun ? TREE_TYPE (cfun->decl) : 0, 0))
1398     size += GET_MODE_SIZE (Pmode);
1399
1400   /* Save each register used in calling a function to the block.  */
1401   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1402     if ((mode = apply_args_mode[regno]) != VOIDmode)
1403       {
1404         align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
1405         if (size % align != 0)
1406           size = CEIL (size, align) * align;
1407
1408         tem = gen_rtx_REG (mode, INCOMING_REGNO (regno));
1409
1410         emit_move_insn (adjust_address (registers, mode, size), tem);
1411         size += GET_MODE_SIZE (mode);
1412       }
1413
1414   /* Save the arg pointer to the block.  */
1415   tem = copy_to_reg (crtl->args.internal_arg_pointer);
1416 #ifdef STACK_GROWS_DOWNWARD
1417   /* We need the pointer as the caller actually passed them to us, not
1418      as we might have pretended they were passed.  Make sure it's a valid
1419      operand, as emit_move_insn isn't expected to handle a PLUS.  */
1420   tem
1421     = force_operand (plus_constant (tem, crtl->args.pretend_args_size),
1422                      NULL_RTX);
1423 #endif
1424   emit_move_insn (adjust_address (registers, Pmode, 0), tem);
1425
1426   size = GET_MODE_SIZE (Pmode);
1427
1428   /* Save the structure value address unless this is passed as an
1429      "invisible" first argument.  */
1430   if (struct_incoming_value)
1431     {
1432       emit_move_insn (adjust_address (registers, Pmode, size),
1433                       copy_to_reg (struct_incoming_value));
1434       size += GET_MODE_SIZE (Pmode);
1435     }
1436
1437   /* Return the address of the block.  */
1438   return copy_addr_to_reg (XEXP (registers, 0));
1439 }
1440
1441 /* __builtin_apply_args returns block of memory allocated on
1442    the stack into which is stored the arg pointer, structure
1443    value address, static chain, and all the registers that might
1444    possibly be used in performing a function call.  The code is
1445    moved to the start of the function so the incoming values are
1446    saved.  */
1447
1448 static rtx
1449 expand_builtin_apply_args (void)
1450 {
1451   /* Don't do __builtin_apply_args more than once in a function.
1452      Save the result of the first call and reuse it.  */
1453   if (apply_args_value != 0)
1454     return apply_args_value;
1455   {
1456     /* When this function is called, it means that registers must be
1457        saved on entry to this function.  So we migrate the
1458        call to the first insn of this function.  */
1459     rtx temp;
1460     rtx seq;
1461
1462     start_sequence ();
1463     temp = expand_builtin_apply_args_1 ();
1464     seq = get_insns ();
1465     end_sequence ();
1466
1467     apply_args_value = temp;
1468
1469     /* Put the insns after the NOTE that starts the function.
1470        If this is inside a start_sequence, make the outer-level insn
1471        chain current, so the code is placed at the start of the
1472        function.  If internal_arg_pointer is a non-virtual pseudo,
1473        it needs to be placed after the function that initializes
1474        that pseudo.  */
1475     push_topmost_sequence ();
1476     if (REG_P (crtl->args.internal_arg_pointer)
1477         && REGNO (crtl->args.internal_arg_pointer) > LAST_VIRTUAL_REGISTER)
1478       emit_insn_before (seq, parm_birth_insn);
1479     else
1480       emit_insn_before (seq, NEXT_INSN (entry_of_function ()));
1481     pop_topmost_sequence ();
1482     return temp;
1483   }
1484 }
1485
1486 /* Perform an untyped call and save the state required to perform an
1487    untyped return of whatever value was returned by the given function.  */
1488
1489 static rtx
1490 expand_builtin_apply (rtx function, rtx arguments, rtx argsize)
1491 {
1492   int size, align, regno;
1493   enum machine_mode mode;
1494   rtx incoming_args, result, reg, dest, src, call_insn;
1495   rtx old_stack_level = 0;
1496   rtx call_fusage = 0;
1497   rtx struct_value = targetm.calls.struct_value_rtx (cfun ? TREE_TYPE (cfun->decl) : 0, 0);
1498
1499   arguments = convert_memory_address (Pmode, arguments);
1500
1501   /* Create a block where the return registers can be saved.  */
1502   result = assign_stack_local (BLKmode, apply_result_size (), -1);
1503
1504   /* Fetch the arg pointer from the ARGUMENTS block.  */
1505   incoming_args = gen_reg_rtx (Pmode);
1506   emit_move_insn (incoming_args, gen_rtx_MEM (Pmode, arguments));
1507 #ifndef STACK_GROWS_DOWNWARD
1508   incoming_args = expand_simple_binop (Pmode, MINUS, incoming_args, argsize,
1509                                        incoming_args, 0, OPTAB_LIB_WIDEN);
1510 #endif
1511
1512   /* Push a new argument block and copy the arguments.  Do not allow
1513      the (potential) memcpy call below to interfere with our stack
1514      manipulations.  */
1515   do_pending_stack_adjust ();
1516   NO_DEFER_POP;
1517
1518   /* Save the stack with nonlocal if available.  */
1519 #ifdef HAVE_save_stack_nonlocal
1520   if (HAVE_save_stack_nonlocal)
1521     emit_stack_save (SAVE_NONLOCAL, &old_stack_level, NULL_RTX);
1522   else
1523 #endif
1524     emit_stack_save (SAVE_BLOCK, &old_stack_level, NULL_RTX);
1525
1526   /* Allocate a block of memory onto the stack and copy the memory
1527      arguments to the outgoing arguments address.  */
1528   allocate_dynamic_stack_space (argsize, 0, BITS_PER_UNIT);
1529
1530   /* Set DRAP flag to true, even though allocate_dynamic_stack_space
1531      may have already set current_function_calls_alloca to true.
1532      current_function_calls_alloca won't be set if argsize is zero,
1533      so we have to guarantee need_drap is true here.  */
1534   if (SUPPORTS_STACK_ALIGNMENT)
1535     crtl->need_drap = true;
1536
1537   dest = virtual_outgoing_args_rtx;
1538 #ifndef STACK_GROWS_DOWNWARD
1539   if (CONST_INT_P (argsize))
1540     dest = plus_constant (dest, -INTVAL (argsize));
1541   else
1542     dest = gen_rtx_PLUS (Pmode, dest, negate_rtx (Pmode, argsize));
1543 #endif
1544   dest = gen_rtx_MEM (BLKmode, dest);
1545   set_mem_align (dest, PARM_BOUNDARY);
1546   src = gen_rtx_MEM (BLKmode, incoming_args);
1547   set_mem_align (src, PARM_BOUNDARY);
1548   emit_block_move (dest, src, argsize, BLOCK_OP_NORMAL);
1549
1550   /* Refer to the argument block.  */
1551   apply_args_size ();
1552   arguments = gen_rtx_MEM (BLKmode, arguments);
1553   set_mem_align (arguments, PARM_BOUNDARY);
1554
1555   /* Walk past the arg-pointer and structure value address.  */
1556   size = GET_MODE_SIZE (Pmode);
1557   if (struct_value)
1558     size += GET_MODE_SIZE (Pmode);
1559
1560   /* Restore each of the registers previously saved.  Make USE insns
1561      for each of these registers for use in making the call.  */
1562   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1563     if ((mode = apply_args_mode[regno]) != VOIDmode)
1564       {
1565         align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
1566         if (size % align != 0)
1567           size = CEIL (size, align) * align;
1568         reg = gen_rtx_REG (mode, regno);
1569         emit_move_insn (reg, adjust_address (arguments, mode, size));
1570         use_reg (&call_fusage, reg);
1571         size += GET_MODE_SIZE (mode);
1572       }
1573
1574   /* Restore the structure value address unless this is passed as an
1575      "invisible" first argument.  */
1576   size = GET_MODE_SIZE (Pmode);
1577   if (struct_value)
1578     {
1579       rtx value = gen_reg_rtx (Pmode);
1580       emit_move_insn (value, adjust_address (arguments, Pmode, size));
1581       emit_move_insn (struct_value, value);
1582       if (REG_P (struct_value))
1583         use_reg (&call_fusage, struct_value);
1584       size += GET_MODE_SIZE (Pmode);
1585     }
1586
1587   /* All arguments and registers used for the call are set up by now!  */
1588   function = prepare_call_address (NULL, function, NULL, &call_fusage, 0, 0);
1589
1590   /* Ensure address is valid.  SYMBOL_REF is already valid, so no need,
1591      and we don't want to load it into a register as an optimization,
1592      because prepare_call_address already did it if it should be done.  */
1593   if (GET_CODE (function) != SYMBOL_REF)
1594     function = memory_address (FUNCTION_MODE, function);
1595
1596   /* Generate the actual call instruction and save the return value.  */
1597 #ifdef HAVE_untyped_call
1598   if (HAVE_untyped_call)
1599     emit_call_insn (gen_untyped_call (gen_rtx_MEM (FUNCTION_MODE, function),
1600                                       result, result_vector (1, result)));
1601   else
1602 #endif
1603 #ifdef HAVE_call_value
1604   if (HAVE_call_value)
1605     {
1606       rtx valreg = 0;
1607
1608       /* Locate the unique return register.  It is not possible to
1609          express a call that sets more than one return register using
1610          call_value; use untyped_call for that.  In fact, untyped_call
1611          only needs to save the return registers in the given block.  */
1612       for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1613         if ((mode = apply_result_mode[regno]) != VOIDmode)
1614           {
1615             gcc_assert (!valreg); /* HAVE_untyped_call required.  */
1616
1617             valreg = gen_rtx_REG (mode, regno);
1618           }
1619
1620       emit_call_insn (GEN_CALL_VALUE (valreg,
1621                                       gen_rtx_MEM (FUNCTION_MODE, function),
1622                                       const0_rtx, NULL_RTX, const0_rtx));
1623
1624       emit_move_insn (adjust_address (result, GET_MODE (valreg), 0), valreg);
1625     }
1626   else
1627 #endif
1628     gcc_unreachable ();
1629
1630   /* Find the CALL insn we just emitted, and attach the register usage
1631      information.  */
1632   call_insn = last_call_insn ();
1633   add_function_usage_to (call_insn, call_fusage);
1634
1635   /* Restore the stack.  */
1636 #ifdef HAVE_save_stack_nonlocal
1637   if (HAVE_save_stack_nonlocal)
1638     emit_stack_restore (SAVE_NONLOCAL, old_stack_level, NULL_RTX);
1639   else
1640 #endif
1641     emit_stack_restore (SAVE_BLOCK, old_stack_level, NULL_RTX);
1642
1643   OK_DEFER_POP;
1644
1645   /* Return the address of the result block.  */
1646   result = copy_addr_to_reg (XEXP (result, 0));
1647   return convert_memory_address (ptr_mode, result);
1648 }
1649
1650 /* Perform an untyped return.  */
1651
1652 static void
1653 expand_builtin_return (rtx result)
1654 {
1655   int size, align, regno;
1656   enum machine_mode mode;
1657   rtx reg;
1658   rtx call_fusage = 0;
1659
1660   result = convert_memory_address (Pmode, result);
1661
1662   apply_result_size ();
1663   result = gen_rtx_MEM (BLKmode, result);
1664
1665 #ifdef HAVE_untyped_return
1666   if (HAVE_untyped_return)
1667     {
1668       emit_jump_insn (gen_untyped_return (result, result_vector (0, result)));
1669       emit_barrier ();
1670       return;
1671     }
1672 #endif
1673
1674   /* Restore the return value and note that each value is used.  */
1675   size = 0;
1676   for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
1677     if ((mode = apply_result_mode[regno]) != VOIDmode)
1678       {
1679         align = GET_MODE_ALIGNMENT (mode) / BITS_PER_UNIT;
1680         if (size % align != 0)
1681           size = CEIL (size, align) * align;
1682         reg = gen_rtx_REG (mode, INCOMING_REGNO (regno));
1683         emit_move_insn (reg, adjust_address (result, mode, size));
1684
1685         push_to_sequence (call_fusage);
1686         emit_use (reg);
1687         call_fusage = get_insns ();
1688         end_sequence ();
1689         size += GET_MODE_SIZE (mode);
1690       }
1691
1692   /* Put the USE insns before the return.  */
1693   emit_insn (call_fusage);
1694
1695   /* Return whatever values was restored by jumping directly to the end
1696      of the function.  */
1697   expand_naked_return ();
1698 }
1699
1700 /* Used by expand_builtin_classify_type and fold_builtin_classify_type.  */
1701
1702 static enum type_class
1703 type_to_class (tree type)
1704 {
1705   switch (TREE_CODE (type))
1706     {
1707     case VOID_TYPE:        return void_type_class;
1708     case INTEGER_TYPE:     return integer_type_class;
1709     case ENUMERAL_TYPE:    return enumeral_type_class;
1710     case BOOLEAN_TYPE:     return boolean_type_class;
1711     case POINTER_TYPE:     return pointer_type_class;
1712     case REFERENCE_TYPE:   return reference_type_class;
1713     case OFFSET_TYPE:      return offset_type_class;
1714     case REAL_TYPE:        return real_type_class;
1715     case COMPLEX_TYPE:     return complex_type_class;
1716     case FUNCTION_TYPE:    return function_type_class;
1717     case METHOD_TYPE:      return method_type_class;
1718     case RECORD_TYPE:      return record_type_class;
1719     case UNION_TYPE:
1720     case QUAL_UNION_TYPE:  return union_type_class;
1721     case ARRAY_TYPE:       return (TYPE_STRING_FLAG (type)
1722                                    ? string_type_class : array_type_class);
1723     case LANG_TYPE:        return lang_type_class;
1724     default:               return no_type_class;
1725     }
1726 }
1727
1728 /* Expand a call EXP to __builtin_classify_type.  */
1729
1730 static rtx
1731 expand_builtin_classify_type (tree exp)
1732 {
1733   if (call_expr_nargs (exp))
1734     return GEN_INT (type_to_class (TREE_TYPE (CALL_EXPR_ARG (exp, 0))));
1735   return GEN_INT (no_type_class);
1736 }
1737
1738 /* This helper macro, meant to be used in mathfn_built_in below,
1739    determines which among a set of three builtin math functions is
1740    appropriate for a given type mode.  The `F' and `L' cases are
1741    automatically generated from the `double' case.  */
1742 #define CASE_MATHFN(BUILT_IN_MATHFN) \
1743   case BUILT_IN_MATHFN: case BUILT_IN_MATHFN##F: case BUILT_IN_MATHFN##L: \
1744   fcode = BUILT_IN_MATHFN; fcodef = BUILT_IN_MATHFN##F ; \
1745   fcodel = BUILT_IN_MATHFN##L ; break;
1746 /* Similar to above, but appends _R after any F/L suffix.  */
1747 #define CASE_MATHFN_REENT(BUILT_IN_MATHFN) \
1748   case BUILT_IN_MATHFN##_R: case BUILT_IN_MATHFN##F_R: case BUILT_IN_MATHFN##L_R: \
1749   fcode = BUILT_IN_MATHFN##_R; fcodef = BUILT_IN_MATHFN##F_R ; \
1750   fcodel = BUILT_IN_MATHFN##L_R ; break;
1751
1752 /* Return mathematic function equivalent to FN but operating directly
1753    on TYPE, if available.  If IMPLICIT is true find the function in
1754    implicit_built_in_decls[], otherwise use built_in_decls[].  If we
1755    can't do the conversion, return zero.  */
1756
1757 static tree
1758 mathfn_built_in_1 (tree type, enum built_in_function fn, bool implicit)
1759 {
1760   tree const *const fn_arr
1761     = implicit ? implicit_built_in_decls : built_in_decls;
1762   enum built_in_function fcode, fcodef, fcodel;
1763
1764   switch (fn)
1765     {
1766       CASE_MATHFN (BUILT_IN_ACOS)
1767       CASE_MATHFN (BUILT_IN_ACOSH)
1768       CASE_MATHFN (BUILT_IN_ASIN)
1769       CASE_MATHFN (BUILT_IN_ASINH)
1770       CASE_MATHFN (BUILT_IN_ATAN)
1771       CASE_MATHFN (BUILT_IN_ATAN2)
1772       CASE_MATHFN (BUILT_IN_ATANH)
1773       CASE_MATHFN (BUILT_IN_CBRT)
1774       CASE_MATHFN (BUILT_IN_CEIL)
1775       CASE_MATHFN (BUILT_IN_CEXPI)
1776       CASE_MATHFN (BUILT_IN_COPYSIGN)
1777       CASE_MATHFN (BUILT_IN_COS)
1778       CASE_MATHFN (BUILT_IN_COSH)
1779       CASE_MATHFN (BUILT_IN_DREM)
1780       CASE_MATHFN (BUILT_IN_ERF)
1781       CASE_MATHFN (BUILT_IN_ERFC)
1782       CASE_MATHFN (BUILT_IN_EXP)
1783       CASE_MATHFN (BUILT_IN_EXP10)
1784       CASE_MATHFN (BUILT_IN_EXP2)
1785       CASE_MATHFN (BUILT_IN_EXPM1)
1786       CASE_MATHFN (BUILT_IN_FABS)
1787       CASE_MATHFN (BUILT_IN_FDIM)
1788       CASE_MATHFN (BUILT_IN_FLOOR)
1789       CASE_MATHFN (BUILT_IN_FMA)
1790       CASE_MATHFN (BUILT_IN_FMAX)
1791       CASE_MATHFN (BUILT_IN_FMIN)
1792       CASE_MATHFN (BUILT_IN_FMOD)
1793       CASE_MATHFN (BUILT_IN_FREXP)
1794       CASE_MATHFN (BUILT_IN_GAMMA)
1795       CASE_MATHFN_REENT (BUILT_IN_GAMMA) /* GAMMA_R */
1796       CASE_MATHFN (BUILT_IN_HUGE_VAL)
1797       CASE_MATHFN (BUILT_IN_HYPOT)
1798       CASE_MATHFN (BUILT_IN_ILOGB)
1799       CASE_MATHFN (BUILT_IN_INF)
1800       CASE_MATHFN (BUILT_IN_ISINF)
1801       CASE_MATHFN (BUILT_IN_J0)
1802       CASE_MATHFN (BUILT_IN_J1)
1803       CASE_MATHFN (BUILT_IN_JN)
1804       CASE_MATHFN (BUILT_IN_LCEIL)
1805       CASE_MATHFN (BUILT_IN_LDEXP)
1806       CASE_MATHFN (BUILT_IN_LFLOOR)
1807       CASE_MATHFN (BUILT_IN_LGAMMA)
1808       CASE_MATHFN_REENT (BUILT_IN_LGAMMA) /* LGAMMA_R */
1809       CASE_MATHFN (BUILT_IN_LLCEIL)
1810       CASE_MATHFN (BUILT_IN_LLFLOOR)
1811       CASE_MATHFN (BUILT_IN_LLRINT)
1812       CASE_MATHFN (BUILT_IN_LLROUND)
1813       CASE_MATHFN (BUILT_IN_LOG)
1814       CASE_MATHFN (BUILT_IN_LOG10)
1815       CASE_MATHFN (BUILT_IN_LOG1P)
1816       CASE_MATHFN (BUILT_IN_LOG2)
1817       CASE_MATHFN (BUILT_IN_LOGB)
1818       CASE_MATHFN (BUILT_IN_LRINT)
1819       CASE_MATHFN (BUILT_IN_LROUND)
1820       CASE_MATHFN (BUILT_IN_MODF)
1821       CASE_MATHFN (BUILT_IN_NAN)
1822       CASE_MATHFN (BUILT_IN_NANS)
1823       CASE_MATHFN (BUILT_IN_NEARBYINT)
1824       CASE_MATHFN (BUILT_IN_NEXTAFTER)
1825       CASE_MATHFN (BUILT_IN_NEXTTOWARD)
1826       CASE_MATHFN (BUILT_IN_POW)
1827       CASE_MATHFN (BUILT_IN_POWI)
1828       CASE_MATHFN (BUILT_IN_POW10)
1829       CASE_MATHFN (BUILT_IN_REMAINDER)
1830       CASE_MATHFN (BUILT_IN_REMQUO)
1831       CASE_MATHFN (BUILT_IN_RINT)
1832       CASE_MATHFN (BUILT_IN_ROUND)
1833       CASE_MATHFN (BUILT_IN_SCALB)
1834       CASE_MATHFN (BUILT_IN_SCALBLN)
1835       CASE_MATHFN (BUILT_IN_SCALBN)
1836       CASE_MATHFN (BUILT_IN_SIGNBIT)
1837       CASE_MATHFN (BUILT_IN_SIGNIFICAND)
1838       CASE_MATHFN (BUILT_IN_SIN)
1839       CASE_MATHFN (BUILT_IN_SINCOS)
1840       CASE_MATHFN (BUILT_IN_SINH)
1841       CASE_MATHFN (BUILT_IN_SQRT)
1842       CASE_MATHFN (BUILT_IN_TAN)
1843       CASE_MATHFN (BUILT_IN_TANH)
1844       CASE_MATHFN (BUILT_IN_TGAMMA)
1845       CASE_MATHFN (BUILT_IN_TRUNC)
1846       CASE_MATHFN (BUILT_IN_Y0)
1847       CASE_MATHFN (BUILT_IN_Y1)
1848       CASE_MATHFN (BUILT_IN_YN)
1849
1850       default:
1851         return NULL_TREE;
1852       }
1853
1854   if (TYPE_MAIN_VARIANT (type) == double_type_node)
1855     return fn_arr[fcode];
1856   else if (TYPE_MAIN_VARIANT (type) == float_type_node)
1857     return fn_arr[fcodef];
1858   else if (TYPE_MAIN_VARIANT (type) == long_double_type_node)
1859     return fn_arr[fcodel];
1860   else
1861     return NULL_TREE;
1862 }
1863
1864 /* Like mathfn_built_in_1(), but always use the implicit array.  */
1865
1866 tree
1867 mathfn_built_in (tree type, enum built_in_function fn)
1868 {
1869   return mathfn_built_in_1 (type, fn, /*implicit=*/ 1);
1870 }
1871
1872 /* If errno must be maintained, expand the RTL to check if the result,
1873    TARGET, of a built-in function call, EXP, is NaN, and if so set
1874    errno to EDOM.  */
1875
1876 static void
1877 expand_errno_check (tree exp, rtx target)
1878 {
1879   rtx lab = gen_label_rtx ();
1880
1881   /* Test the result; if it is NaN, set errno=EDOM because
1882      the argument was not in the domain.  */
1883   do_compare_rtx_and_jump (target, target, EQ, 0, GET_MODE (target),
1884                            NULL_RTX, NULL_RTX, lab,
1885                            /* The jump is very likely.  */
1886                            REG_BR_PROB_BASE - (REG_BR_PROB_BASE / 2000 - 1));
1887
1888 #ifdef TARGET_EDOM
1889   /* If this built-in doesn't throw an exception, set errno directly.  */
1890   if (TREE_NOTHROW (TREE_OPERAND (CALL_EXPR_FN (exp), 0)))
1891     {
1892 #ifdef GEN_ERRNO_RTX
1893       rtx errno_rtx = GEN_ERRNO_RTX;
1894 #else
1895       rtx errno_rtx
1896           = gen_rtx_MEM (word_mode, gen_rtx_SYMBOL_REF (Pmode, "errno"));
1897 #endif
1898       emit_move_insn (errno_rtx, GEN_INT (TARGET_EDOM));
1899       emit_label (lab);
1900       return;
1901     }
1902 #endif
1903
1904   /* Make sure the library call isn't expanded as a tail call.  */
1905   CALL_EXPR_TAILCALL (exp) = 0;
1906
1907   /* We can't set errno=EDOM directly; let the library call do it.
1908      Pop the arguments right away in case the call gets deleted.  */
1909   NO_DEFER_POP;
1910   expand_call (exp, target, 0);
1911   OK_DEFER_POP;
1912   emit_label (lab);
1913 }
1914
1915 /* Expand a call to one of the builtin math functions (sqrt, exp, or log).
1916    Return NULL_RTX if a normal call should be emitted rather than expanding
1917    the function in-line.  EXP is the expression that is a call to the builtin
1918    function; if convenient, the result should be placed in TARGET.
1919    SUBTARGET may be used as the target for computing one of EXP's operands.  */
1920
1921 static rtx
1922 expand_builtin_mathfn (tree exp, rtx target, rtx subtarget)
1923 {
1924   optab builtin_optab;
1925   rtx op0, insns;
1926   tree fndecl = get_callee_fndecl (exp);
1927   enum machine_mode mode;
1928   bool errno_set = false;
1929   tree arg;
1930
1931   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
1932     return NULL_RTX;
1933
1934   arg = CALL_EXPR_ARG (exp, 0);
1935
1936   switch (DECL_FUNCTION_CODE (fndecl))
1937     {
1938     CASE_FLT_FN (BUILT_IN_SQRT):
1939       errno_set = ! tree_expr_nonnegative_p (arg);
1940       builtin_optab = sqrt_optab;
1941       break;
1942     CASE_FLT_FN (BUILT_IN_EXP):
1943       errno_set = true; builtin_optab = exp_optab; break;
1944     CASE_FLT_FN (BUILT_IN_EXP10):
1945     CASE_FLT_FN (BUILT_IN_POW10):
1946       errno_set = true; builtin_optab = exp10_optab; break;
1947     CASE_FLT_FN (BUILT_IN_EXP2):
1948       errno_set = true; builtin_optab = exp2_optab; break;
1949     CASE_FLT_FN (BUILT_IN_EXPM1):
1950       errno_set = true; builtin_optab = expm1_optab; break;
1951     CASE_FLT_FN (BUILT_IN_LOGB):
1952       errno_set = true; builtin_optab = logb_optab; break;
1953     CASE_FLT_FN (BUILT_IN_LOG):
1954       errno_set = true; builtin_optab = log_optab; break;
1955     CASE_FLT_FN (BUILT_IN_LOG10):
1956       errno_set = true; builtin_optab = log10_optab; break;
1957     CASE_FLT_FN (BUILT_IN_LOG2):
1958       errno_set = true; builtin_optab = log2_optab; break;
1959     CASE_FLT_FN (BUILT_IN_LOG1P):
1960       errno_set = true; builtin_optab = log1p_optab; break;
1961     CASE_FLT_FN (BUILT_IN_ASIN):
1962       builtin_optab = asin_optab; break;
1963     CASE_FLT_FN (BUILT_IN_ACOS):
1964       builtin_optab = acos_optab; break;
1965     CASE_FLT_FN (BUILT_IN_TAN):
1966       builtin_optab = tan_optab; break;
1967     CASE_FLT_FN (BUILT_IN_ATAN):
1968       builtin_optab = atan_optab; break;
1969     CASE_FLT_FN (BUILT_IN_FLOOR):
1970       builtin_optab = floor_optab; break;
1971     CASE_FLT_FN (BUILT_IN_CEIL):
1972       builtin_optab = ceil_optab; break;
1973     CASE_FLT_FN (BUILT_IN_TRUNC):
1974       builtin_optab = btrunc_optab; break;
1975     CASE_FLT_FN (BUILT_IN_ROUND):
1976       builtin_optab = round_optab; break;
1977     CASE_FLT_FN (BUILT_IN_NEARBYINT):
1978       builtin_optab = nearbyint_optab;
1979       if (flag_trapping_math)
1980         break;
1981       /* Else fallthrough and expand as rint.  */
1982     CASE_FLT_FN (BUILT_IN_RINT):
1983       builtin_optab = rint_optab; break;
1984     CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
1985       builtin_optab = significand_optab; break;
1986     default:
1987       gcc_unreachable ();
1988     }
1989
1990   /* Make a suitable register to place result in.  */
1991   mode = TYPE_MODE (TREE_TYPE (exp));
1992
1993   if (! flag_errno_math || ! HONOR_NANS (mode))
1994     errno_set = false;
1995
1996   /* Before working hard, check whether the instruction is available.  */
1997   if (optab_handler (builtin_optab, mode) != CODE_FOR_nothing)
1998     {
1999       target = gen_reg_rtx (mode);
2000
2001       /* Wrap the computation of the argument in a SAVE_EXPR, as we may
2002          need to expand the argument again.  This way, we will not perform
2003          side-effects more the once.  */
2004       CALL_EXPR_ARG (exp, 0) = arg = builtin_save_expr (arg);
2005
2006       op0 = expand_expr (arg, subtarget, VOIDmode, EXPAND_NORMAL);
2007
2008       start_sequence ();
2009
2010       /* Compute into TARGET.
2011          Set TARGET to wherever the result comes back.  */
2012       target = expand_unop (mode, builtin_optab, op0, target, 0);
2013
2014       if (target != 0)
2015         {
2016           if (errno_set)
2017             expand_errno_check (exp, target);
2018
2019           /* Output the entire sequence.  */
2020           insns = get_insns ();
2021           end_sequence ();
2022           emit_insn (insns);
2023           return target;
2024         }
2025
2026       /* If we were unable to expand via the builtin, stop the sequence
2027          (without outputting the insns) and call to the library function
2028          with the stabilized argument list.  */
2029       end_sequence ();
2030     }
2031
2032   return expand_call (exp, target, target == const0_rtx);
2033 }
2034
2035 /* Expand a call to the builtin binary math functions (pow and atan2).
2036    Return NULL_RTX if a normal call should be emitted rather than expanding the
2037    function in-line.  EXP is the expression that is a call to the builtin
2038    function; if convenient, the result should be placed in TARGET.
2039    SUBTARGET may be used as the target for computing one of EXP's
2040    operands.  */
2041
2042 static rtx
2043 expand_builtin_mathfn_2 (tree exp, rtx target, rtx subtarget)
2044 {
2045   optab builtin_optab;
2046   rtx op0, op1, insns;
2047   int op1_type = REAL_TYPE;
2048   tree fndecl = get_callee_fndecl (exp);
2049   tree arg0, arg1;
2050   enum machine_mode mode;
2051   bool errno_set = true;
2052
2053   switch (DECL_FUNCTION_CODE (fndecl))
2054     {
2055     CASE_FLT_FN (BUILT_IN_SCALBN):
2056     CASE_FLT_FN (BUILT_IN_SCALBLN):
2057     CASE_FLT_FN (BUILT_IN_LDEXP):
2058       op1_type = INTEGER_TYPE;
2059     default:
2060       break;
2061     }
2062
2063   if (!validate_arglist (exp, REAL_TYPE, op1_type, VOID_TYPE))
2064     return NULL_RTX;
2065
2066   arg0 = CALL_EXPR_ARG (exp, 0);
2067   arg1 = CALL_EXPR_ARG (exp, 1);
2068
2069   switch (DECL_FUNCTION_CODE (fndecl))
2070     {
2071     CASE_FLT_FN (BUILT_IN_POW):
2072       builtin_optab = pow_optab; break;
2073     CASE_FLT_FN (BUILT_IN_ATAN2):
2074       builtin_optab = atan2_optab; break;
2075     CASE_FLT_FN (BUILT_IN_SCALB):
2076       if (REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (exp)))->b != 2)
2077         return 0;
2078       builtin_optab = scalb_optab; break;
2079     CASE_FLT_FN (BUILT_IN_SCALBN):
2080     CASE_FLT_FN (BUILT_IN_SCALBLN):
2081       if (REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (exp)))->b != 2)
2082         return 0;
2083     /* Fall through... */
2084     CASE_FLT_FN (BUILT_IN_LDEXP):
2085       builtin_optab = ldexp_optab; break;
2086     CASE_FLT_FN (BUILT_IN_FMOD):
2087       builtin_optab = fmod_optab; break;
2088     CASE_FLT_FN (BUILT_IN_REMAINDER):
2089     CASE_FLT_FN (BUILT_IN_DREM):
2090       builtin_optab = remainder_optab; break;
2091     default:
2092       gcc_unreachable ();
2093     }
2094
2095   /* Make a suitable register to place result in.  */
2096   mode = TYPE_MODE (TREE_TYPE (exp));
2097
2098   /* Before working hard, check whether the instruction is available.  */
2099   if (optab_handler (builtin_optab, mode) == CODE_FOR_nothing)
2100     return NULL_RTX;
2101
2102   target = gen_reg_rtx (mode);
2103
2104   if (! flag_errno_math || ! HONOR_NANS (mode))
2105     errno_set = false;
2106
2107   /* Always stabilize the argument list.  */
2108   CALL_EXPR_ARG (exp, 0) = arg0 = builtin_save_expr (arg0);
2109   CALL_EXPR_ARG (exp, 1) = arg1 = builtin_save_expr (arg1);
2110
2111   op0 = expand_expr (arg0, subtarget, VOIDmode, EXPAND_NORMAL);
2112   op1 = expand_normal (arg1);
2113
2114   start_sequence ();
2115
2116   /* Compute into TARGET.
2117      Set TARGET to wherever the result comes back.  */
2118   target = expand_binop (mode, builtin_optab, op0, op1,
2119                          target, 0, OPTAB_DIRECT);
2120
2121   /* If we were unable to expand via the builtin, stop the sequence
2122      (without outputting the insns) and call to the library function
2123      with the stabilized argument list.  */
2124   if (target == 0)
2125     {
2126       end_sequence ();
2127       return expand_call (exp, target, target == const0_rtx);
2128     }
2129
2130   if (errno_set)
2131     expand_errno_check (exp, target);
2132
2133   /* Output the entire sequence.  */
2134   insns = get_insns ();
2135   end_sequence ();
2136   emit_insn (insns);
2137
2138   return target;
2139 }
2140
2141 /* Expand a call to the builtin sin and cos math functions.
2142    Return NULL_RTX if a normal call should be emitted rather than expanding the
2143    function in-line.  EXP is the expression that is a call to the builtin
2144    function; if convenient, the result should be placed in TARGET.
2145    SUBTARGET may be used as the target for computing one of EXP's
2146    operands.  */
2147
2148 static rtx
2149 expand_builtin_mathfn_3 (tree exp, rtx target, rtx subtarget)
2150 {
2151   optab builtin_optab;
2152   rtx op0, insns;
2153   tree fndecl = get_callee_fndecl (exp);
2154   enum machine_mode mode;
2155   tree arg;
2156
2157   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
2158     return NULL_RTX;
2159
2160   arg = CALL_EXPR_ARG (exp, 0);
2161
2162   switch (DECL_FUNCTION_CODE (fndecl))
2163     {
2164     CASE_FLT_FN (BUILT_IN_SIN):
2165     CASE_FLT_FN (BUILT_IN_COS):
2166       builtin_optab = sincos_optab; break;
2167     default:
2168       gcc_unreachable ();
2169     }
2170
2171   /* Make a suitable register to place result in.  */
2172   mode = TYPE_MODE (TREE_TYPE (exp));
2173
2174   /* Check if sincos insn is available, otherwise fallback
2175      to sin or cos insn.  */
2176   if (optab_handler (builtin_optab, mode) == CODE_FOR_nothing)
2177     switch (DECL_FUNCTION_CODE (fndecl))
2178       {
2179       CASE_FLT_FN (BUILT_IN_SIN):
2180         builtin_optab = sin_optab; break;
2181       CASE_FLT_FN (BUILT_IN_COS):
2182         builtin_optab = cos_optab; break;
2183       default:
2184         gcc_unreachable ();
2185       }
2186
2187   /* Before working hard, check whether the instruction is available.  */
2188   if (optab_handler (builtin_optab, mode) != CODE_FOR_nothing)
2189     {
2190       target = gen_reg_rtx (mode);
2191
2192       /* Wrap the computation of the argument in a SAVE_EXPR, as we may
2193          need to expand the argument again.  This way, we will not perform
2194          side-effects more the once.  */
2195       CALL_EXPR_ARG (exp, 0) = arg = builtin_save_expr (arg);
2196
2197       op0 = expand_expr (arg, subtarget, VOIDmode, EXPAND_NORMAL);
2198
2199       start_sequence ();
2200
2201       /* Compute into TARGET.
2202          Set TARGET to wherever the result comes back.  */
2203       if (builtin_optab == sincos_optab)
2204         {
2205           int result;
2206
2207           switch (DECL_FUNCTION_CODE (fndecl))
2208             {
2209             CASE_FLT_FN (BUILT_IN_SIN):
2210               result = expand_twoval_unop (builtin_optab, op0, 0, target, 0);
2211               break;
2212             CASE_FLT_FN (BUILT_IN_COS):
2213               result = expand_twoval_unop (builtin_optab, op0, target, 0, 0);
2214               break;
2215             default:
2216               gcc_unreachable ();
2217             }
2218           gcc_assert (result);
2219         }
2220       else
2221         {
2222           target = expand_unop (mode, builtin_optab, op0, target, 0);
2223         }
2224
2225       if (target != 0)
2226         {
2227           /* Output the entire sequence.  */
2228           insns = get_insns ();
2229           end_sequence ();
2230           emit_insn (insns);
2231           return target;
2232         }
2233
2234       /* If we were unable to expand via the builtin, stop the sequence
2235          (without outputting the insns) and call to the library function
2236          with the stabilized argument list.  */
2237       end_sequence ();
2238     }
2239
2240   target = expand_call (exp, target, target == const0_rtx);
2241
2242   return target;
2243 }
2244
2245 /* Given an interclass math builtin decl FNDECL and it's argument ARG
2246    return an RTL instruction code that implements the functionality.
2247    If that isn't possible or available return CODE_FOR_nothing.  */
2248
2249 static enum insn_code
2250 interclass_mathfn_icode (tree arg, tree fndecl)
2251 {
2252   bool errno_set = false;
2253   optab builtin_optab = 0;
2254   enum machine_mode mode;
2255
2256   switch (DECL_FUNCTION_CODE (fndecl))
2257     {
2258     CASE_FLT_FN (BUILT_IN_ILOGB):
2259       errno_set = true; builtin_optab = ilogb_optab; break;
2260     CASE_FLT_FN (BUILT_IN_ISINF):
2261       builtin_optab = isinf_optab; break;
2262     case BUILT_IN_ISNORMAL:
2263     case BUILT_IN_ISFINITE:
2264     CASE_FLT_FN (BUILT_IN_FINITE):
2265     case BUILT_IN_FINITED32:
2266     case BUILT_IN_FINITED64:
2267     case BUILT_IN_FINITED128:
2268     case BUILT_IN_ISINFD32:
2269     case BUILT_IN_ISINFD64:
2270     case BUILT_IN_ISINFD128:
2271       /* These builtins have no optabs (yet).  */
2272       break;
2273     default:
2274       gcc_unreachable ();
2275     }
2276
2277   /* There's no easy way to detect the case we need to set EDOM.  */
2278   if (flag_errno_math && errno_set)
2279     return CODE_FOR_nothing;
2280
2281   /* Optab mode depends on the mode of the input argument.  */
2282   mode = TYPE_MODE (TREE_TYPE (arg));
2283
2284   if (builtin_optab)
2285     return optab_handler (builtin_optab, mode);
2286   return CODE_FOR_nothing;
2287 }
2288
2289 /* Expand a call to one of the builtin math functions that operate on
2290    floating point argument and output an integer result (ilogb, isinf,
2291    isnan, etc).
2292    Return 0 if a normal call should be emitted rather than expanding the
2293    function in-line.  EXP is the expression that is a call to the builtin
2294    function; if convenient, the result should be placed in TARGET.
2295    SUBTARGET may be used as the target for computing one of EXP's operands.  */
2296
2297 static rtx
2298 expand_builtin_interclass_mathfn (tree exp, rtx target, rtx subtarget)
2299 {
2300   enum insn_code icode = CODE_FOR_nothing;
2301   rtx op0;
2302   tree fndecl = get_callee_fndecl (exp);
2303   enum machine_mode mode;
2304   tree arg;
2305
2306   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
2307     return NULL_RTX;
2308
2309   arg = CALL_EXPR_ARG (exp, 0);
2310   icode = interclass_mathfn_icode (arg, fndecl);
2311   mode = TYPE_MODE (TREE_TYPE (arg));
2312
2313   if (icode != CODE_FOR_nothing)
2314     {
2315       rtx last = get_last_insn ();
2316       tree orig_arg = arg;
2317       /* Make a suitable register to place result in.  */
2318       if (!target
2319           || GET_MODE (target) != TYPE_MODE (TREE_TYPE (exp))
2320           || !insn_data[icode].operand[0].predicate (target, GET_MODE (target)))
2321          target = gen_reg_rtx (TYPE_MODE (TREE_TYPE (exp)));
2322
2323       gcc_assert (insn_data[icode].operand[0].predicate
2324                   (target, GET_MODE (target)));
2325
2326       /* Wrap the computation of the argument in a SAVE_EXPR, as we may
2327          need to expand the argument again.  This way, we will not perform
2328          side-effects more the once.  */
2329       CALL_EXPR_ARG (exp, 0) = arg = builtin_save_expr (arg);
2330
2331       op0 = expand_expr (arg, subtarget, VOIDmode, EXPAND_NORMAL);
2332
2333       if (mode != GET_MODE (op0))
2334         op0 = convert_to_mode (mode, op0, 0);
2335
2336       /* Compute into TARGET.
2337          Set TARGET to wherever the result comes back.  */
2338       if (maybe_emit_unop_insn (icode, target, op0, UNKNOWN))
2339         return target;
2340       delete_insns_since (last);
2341       CALL_EXPR_ARG (exp, 0) = orig_arg;
2342     }
2343
2344   return NULL_RTX;
2345 }
2346
2347 /* Expand a call to the builtin sincos math function.
2348    Return NULL_RTX if a normal call should be emitted rather than expanding the
2349    function in-line.  EXP is the expression that is a call to the builtin
2350    function.  */
2351
2352 static rtx
2353 expand_builtin_sincos (tree exp)
2354 {
2355   rtx op0, op1, op2, target1, target2;
2356   enum machine_mode mode;
2357   tree arg, sinp, cosp;
2358   int result;
2359   location_t loc = EXPR_LOCATION (exp);
2360
2361   if (!validate_arglist (exp, REAL_TYPE,
2362                          POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
2363     return NULL_RTX;
2364
2365   arg = CALL_EXPR_ARG (exp, 0);
2366   sinp = CALL_EXPR_ARG (exp, 1);
2367   cosp = CALL_EXPR_ARG (exp, 2);
2368
2369   /* Make a suitable register to place result in.  */
2370   mode = TYPE_MODE (TREE_TYPE (arg));
2371
2372   /* Check if sincos insn is available, otherwise emit the call.  */
2373   if (optab_handler (sincos_optab, mode) == CODE_FOR_nothing)
2374     return NULL_RTX;
2375
2376   target1 = gen_reg_rtx (mode);
2377   target2 = gen_reg_rtx (mode);
2378
2379   op0 = expand_normal (arg);
2380   op1 = expand_normal (build_fold_indirect_ref_loc (loc, sinp));
2381   op2 = expand_normal (build_fold_indirect_ref_loc (loc, cosp));
2382
2383   /* Compute into target1 and target2.
2384      Set TARGET to wherever the result comes back.  */
2385   result = expand_twoval_unop (sincos_optab, op0, target2, target1, 0);
2386   gcc_assert (result);
2387
2388   /* Move target1 and target2 to the memory locations indicated
2389      by op1 and op2.  */
2390   emit_move_insn (op1, target1);
2391   emit_move_insn (op2, target2);
2392
2393   return const0_rtx;
2394 }
2395
2396 /* Expand a call to the internal cexpi builtin to the sincos math function.
2397    EXP is the expression that is a call to the builtin function; if convenient,
2398    the result should be placed in TARGET.  SUBTARGET may be used as the target
2399    for computing one of EXP's operands.  */
2400
2401 static rtx
2402 expand_builtin_cexpi (tree exp, rtx target, rtx subtarget)
2403 {
2404   tree fndecl = get_callee_fndecl (exp);
2405   tree arg, type;
2406   enum machine_mode mode;
2407   rtx op0, op1, op2;
2408   location_t loc = EXPR_LOCATION (exp);
2409
2410   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
2411     return NULL_RTX;
2412
2413   arg = CALL_EXPR_ARG (exp, 0);
2414   type = TREE_TYPE (arg);
2415   mode = TYPE_MODE (TREE_TYPE (arg));
2416
2417   /* Try expanding via a sincos optab, fall back to emitting a libcall
2418      to sincos or cexp.  We are sure we have sincos or cexp because cexpi
2419      is only generated from sincos, cexp or if we have either of them.  */
2420   if (optab_handler (sincos_optab, mode) != CODE_FOR_nothing)
2421     {
2422       op1 = gen_reg_rtx (mode);
2423       op2 = gen_reg_rtx (mode);
2424
2425       op0 = expand_expr (arg, subtarget, VOIDmode, EXPAND_NORMAL);
2426
2427       /* Compute into op1 and op2.  */
2428       expand_twoval_unop (sincos_optab, op0, op2, op1, 0);
2429     }
2430   else if (TARGET_HAS_SINCOS)
2431     {
2432       tree call, fn = NULL_TREE;
2433       tree top1, top2;
2434       rtx op1a, op2a;
2435
2436       if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIF)
2437         fn = built_in_decls[BUILT_IN_SINCOSF];
2438       else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPI)
2439         fn = built_in_decls[BUILT_IN_SINCOS];
2440       else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIL)
2441         fn = built_in_decls[BUILT_IN_SINCOSL];
2442       else
2443         gcc_unreachable ();
2444
2445       op1 = assign_temp (TREE_TYPE (arg), 0, 1, 1);
2446       op2 = assign_temp (TREE_TYPE (arg), 0, 1, 1);
2447       op1a = copy_to_mode_reg (Pmode, XEXP (op1, 0));
2448       op2a = copy_to_mode_reg (Pmode, XEXP (op2, 0));
2449       top1 = make_tree (build_pointer_type (TREE_TYPE (arg)), op1a);
2450       top2 = make_tree (build_pointer_type (TREE_TYPE (arg)), op2a);
2451
2452       /* Make sure not to fold the sincos call again.  */
2453       call = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn);
2454       expand_normal (build_call_nary (TREE_TYPE (TREE_TYPE (fn)),
2455                                       call, 3, arg, top1, top2));
2456     }
2457   else
2458     {
2459       tree call, fn = NULL_TREE, narg;
2460       tree ctype = build_complex_type (type);
2461
2462       if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIF)
2463         fn = built_in_decls[BUILT_IN_CEXPF];
2464       else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPI)
2465         fn = built_in_decls[BUILT_IN_CEXP];
2466       else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIL)
2467         fn = built_in_decls[BUILT_IN_CEXPL];
2468       else
2469         gcc_unreachable ();
2470
2471       /* If we don't have a decl for cexp create one.  This is the
2472          friendliest fallback if the user calls __builtin_cexpi
2473          without full target C99 function support.  */
2474       if (fn == NULL_TREE)
2475         {
2476           tree fntype;
2477           const char *name = NULL;
2478
2479           if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIF)
2480             name = "cexpf";
2481           else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPI)
2482             name = "cexp";
2483           else if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_CEXPIL)
2484             name = "cexpl";
2485
2486           fntype = build_function_type_list (ctype, ctype, NULL_TREE);
2487           fn = build_fn_decl (name, fntype);
2488         }
2489
2490       narg = fold_build2_loc (loc, COMPLEX_EXPR, ctype,
2491                           build_real (type, dconst0), arg);
2492
2493       /* Make sure not to fold the cexp call again.  */
2494       call = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn);
2495       return expand_expr (build_call_nary (ctype, call, 1, narg),
2496                           target, VOIDmode, EXPAND_NORMAL);
2497     }
2498
2499   /* Now build the proper return type.  */
2500   return expand_expr (build2 (COMPLEX_EXPR, build_complex_type (type),
2501                               make_tree (TREE_TYPE (arg), op2),
2502                               make_tree (TREE_TYPE (arg), op1)),
2503                       target, VOIDmode, EXPAND_NORMAL);
2504 }
2505
2506 /* Conveniently construct a function call expression.  FNDECL names the
2507    function to be called, N is the number of arguments, and the "..."
2508    parameters are the argument expressions.  Unlike build_call_exr
2509    this doesn't fold the call, hence it will always return a CALL_EXPR.  */
2510
2511 static tree
2512 build_call_nofold_loc (location_t loc, tree fndecl, int n, ...)
2513 {
2514   va_list ap;
2515   tree fntype = TREE_TYPE (fndecl);
2516   tree fn = build1 (ADDR_EXPR, build_pointer_type (fntype), fndecl);
2517
2518   va_start (ap, n);
2519   fn = build_call_valist (TREE_TYPE (fntype), fn, n, ap);
2520   va_end (ap);
2521   SET_EXPR_LOCATION (fn, loc);
2522   return fn;
2523 }
2524
2525 /* Expand a call to one of the builtin rounding functions gcc defines
2526    as an extension (lfloor and lceil).  As these are gcc extensions we
2527    do not need to worry about setting errno to EDOM.
2528    If expanding via optab fails, lower expression to (int)(floor(x)).
2529    EXP is the expression that is a call to the builtin function;
2530    if convenient, the result should be placed in TARGET.  */
2531
2532 static rtx
2533 expand_builtin_int_roundingfn (tree exp, rtx target)
2534 {
2535   convert_optab builtin_optab;
2536   rtx op0, insns, tmp;
2537   tree fndecl = get_callee_fndecl (exp);
2538   enum built_in_function fallback_fn;
2539   tree fallback_fndecl;
2540   enum machine_mode mode;
2541   tree arg;
2542
2543   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
2544     gcc_unreachable ();
2545
2546   arg = CALL_EXPR_ARG (exp, 0);
2547
2548   switch (DECL_FUNCTION_CODE (fndecl))
2549     {
2550     CASE_FLT_FN (BUILT_IN_LCEIL):
2551     CASE_FLT_FN (BUILT_IN_LLCEIL):
2552       builtin_optab = lceil_optab;
2553       fallback_fn = BUILT_IN_CEIL;
2554       break;
2555
2556     CASE_FLT_FN (BUILT_IN_LFLOOR):
2557     CASE_FLT_FN (BUILT_IN_LLFLOOR):
2558       builtin_optab = lfloor_optab;
2559       fallback_fn = BUILT_IN_FLOOR;
2560       break;
2561
2562     default:
2563       gcc_unreachable ();
2564     }
2565
2566   /* Make a suitable register to place result in.  */
2567   mode = TYPE_MODE (TREE_TYPE (exp));
2568
2569   target = gen_reg_rtx (mode);
2570
2571   /* Wrap the computation of the argument in a SAVE_EXPR, as we may
2572      need to expand the argument again.  This way, we will not perform
2573      side-effects more the once.  */
2574   CALL_EXPR_ARG (exp, 0) = arg = builtin_save_expr (arg);
2575
2576   op0 = expand_expr (arg, NULL, VOIDmode, EXPAND_NORMAL);
2577
2578   start_sequence ();
2579
2580   /* Compute into TARGET.  */
2581   if (expand_sfix_optab (target, op0, builtin_optab))
2582     {
2583       /* Output the entire sequence.  */
2584       insns = get_insns ();
2585       end_sequence ();
2586       emit_insn (insns);
2587       return target;
2588     }
2589
2590   /* If we were unable to expand via the builtin, stop the sequence
2591      (without outputting the insns).  */
2592   end_sequence ();
2593
2594   /* Fall back to floating point rounding optab.  */
2595   fallback_fndecl = mathfn_built_in (TREE_TYPE (arg), fallback_fn);
2596
2597   /* For non-C99 targets we may end up without a fallback fndecl here
2598      if the user called __builtin_lfloor directly.  In this case emit
2599      a call to the floor/ceil variants nevertheless.  This should result
2600      in the best user experience for not full C99 targets.  */
2601   if (fallback_fndecl == NULL_TREE)
2602     {
2603       tree fntype;
2604       const char *name = NULL;
2605
2606       switch (DECL_FUNCTION_CODE (fndecl))
2607         {
2608         case BUILT_IN_LCEIL:
2609         case BUILT_IN_LLCEIL:
2610           name = "ceil";
2611           break;
2612         case BUILT_IN_LCEILF:
2613         case BUILT_IN_LLCEILF:
2614           name = "ceilf";
2615           break;
2616         case BUILT_IN_LCEILL:
2617         case BUILT_IN_LLCEILL:
2618           name = "ceill";
2619           break;
2620         case BUILT_IN_LFLOOR:
2621         case BUILT_IN_LLFLOOR:
2622           name = "floor";
2623           break;
2624         case BUILT_IN_LFLOORF:
2625         case BUILT_IN_LLFLOORF:
2626           name = "floorf";
2627           break;
2628         case BUILT_IN_LFLOORL:
2629         case BUILT_IN_LLFLOORL:
2630           name = "floorl";
2631           break;
2632         default:
2633           gcc_unreachable ();
2634         }
2635
2636       fntype = build_function_type_list (TREE_TYPE (arg),
2637                                          TREE_TYPE (arg), NULL_TREE);
2638       fallback_fndecl = build_fn_decl (name, fntype);
2639     }
2640
2641   exp = build_call_nofold_loc (EXPR_LOCATION (exp), fallback_fndecl, 1, arg);
2642
2643   tmp = expand_normal (exp);
2644
2645   /* Truncate the result of floating point optab to integer
2646      via expand_fix ().  */
2647   target = gen_reg_rtx (mode);
2648   expand_fix (target, tmp, 0);
2649
2650   return target;
2651 }
2652
2653 /* Expand a call to one of the builtin math functions doing integer
2654    conversion (lrint).
2655    Return 0 if a normal call should be emitted rather than expanding the
2656    function in-line.  EXP is the expression that is a call to the builtin
2657    function; if convenient, the result should be placed in TARGET.  */
2658
2659 static rtx
2660 expand_builtin_int_roundingfn_2 (tree exp, rtx target)
2661 {
2662   convert_optab builtin_optab;
2663   rtx op0, insns;
2664   tree fndecl = get_callee_fndecl (exp);
2665   tree arg;
2666   enum machine_mode mode;
2667
2668   /* There's no easy way to detect the case we need to set EDOM.  */
2669   if (flag_errno_math)
2670     return NULL_RTX;
2671
2672   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
2673      gcc_unreachable ();
2674
2675   arg = CALL_EXPR_ARG (exp, 0);
2676
2677   switch (DECL_FUNCTION_CODE (fndecl))
2678     {
2679     CASE_FLT_FN (BUILT_IN_LRINT):
2680     CASE_FLT_FN (BUILT_IN_LLRINT):
2681       builtin_optab = lrint_optab; break;
2682     CASE_FLT_FN (BUILT_IN_LROUND):
2683     CASE_FLT_FN (BUILT_IN_LLROUND):
2684       builtin_optab = lround_optab; break;
2685     default:
2686       gcc_unreachable ();
2687     }
2688
2689   /* Make a suitable register to place result in.  */
2690   mode = TYPE_MODE (TREE_TYPE (exp));
2691
2692   target = gen_reg_rtx (mode);
2693
2694   /* Wrap the computation of the argument in a SAVE_EXPR, as we may
2695      need to expand the argument again.  This way, we will not perform
2696      side-effects more the once.  */
2697   CALL_EXPR_ARG (exp, 0) = arg = builtin_save_expr (arg);
2698
2699   op0 = expand_expr (arg, NULL, VOIDmode, EXPAND_NORMAL);
2700
2701   start_sequence ();
2702
2703   if (expand_sfix_optab (target, op0, builtin_optab))
2704     {
2705       /* Output the entire sequence.  */
2706       insns = get_insns ();
2707       end_sequence ();
2708       emit_insn (insns);
2709       return target;
2710     }
2711
2712   /* If we were unable to expand via the builtin, stop the sequence
2713      (without outputting the insns) and call to the library function
2714      with the stabilized argument list.  */
2715   end_sequence ();
2716
2717   target = expand_call (exp, target, target == const0_rtx);
2718
2719   return target;
2720 }
2721
2722 /* To evaluate powi(x,n), the floating point value x raised to the
2723    constant integer exponent n, we use a hybrid algorithm that
2724    combines the "window method" with look-up tables.  For an
2725    introduction to exponentiation algorithms and "addition chains",
2726    see section 4.6.3, "Evaluation of Powers" of Donald E. Knuth,
2727    "Seminumerical Algorithms", Vol. 2, "The Art of Computer Programming",
2728    3rd Edition, 1998, and Daniel M. Gordon, "A Survey of Fast Exponentiation
2729    Methods", Journal of Algorithms, Vol. 27, pp. 129-146, 1998.  */
2730
2731 /* Provide a default value for POWI_MAX_MULTS, the maximum number of
2732    multiplications to inline before calling the system library's pow
2733    function.  powi(x,n) requires at worst 2*bits(n)-2 multiplications,
2734    so this default never requires calling pow, powf or powl.  */
2735
2736 #ifndef POWI_MAX_MULTS
2737 #define POWI_MAX_MULTS  (2*HOST_BITS_PER_WIDE_INT-2)
2738 #endif
2739
2740 /* The size of the "optimal power tree" lookup table.  All
2741    exponents less than this value are simply looked up in the
2742    powi_table below.  This threshold is also used to size the
2743    cache of pseudo registers that hold intermediate results.  */
2744 #define POWI_TABLE_SIZE 256
2745
2746 /* The size, in bits of the window, used in the "window method"
2747    exponentiation algorithm.  This is equivalent to a radix of
2748    (1<<POWI_WINDOW_SIZE) in the corresponding "m-ary method".  */
2749 #define POWI_WINDOW_SIZE 3
2750
2751 /* The following table is an efficient representation of an
2752    "optimal power tree".  For each value, i, the corresponding
2753    value, j, in the table states than an optimal evaluation
2754    sequence for calculating pow(x,i) can be found by evaluating
2755    pow(x,j)*pow(x,i-j).  An optimal power tree for the first
2756    100 integers is given in Knuth's "Seminumerical algorithms".  */
2757
2758 static const unsigned char powi_table[POWI_TABLE_SIZE] =
2759   {
2760       0,   1,   1,   2,   2,   3,   3,   4,  /*   0 -   7 */
2761       4,   6,   5,   6,   6,  10,   7,   9,  /*   8 -  15 */
2762       8,  16,   9,  16,  10,  12,  11,  13,  /*  16 -  23 */
2763      12,  17,  13,  18,  14,  24,  15,  26,  /*  24 -  31 */
2764      16,  17,  17,  19,  18,  33,  19,  26,  /*  32 -  39 */
2765      20,  25,  21,  40,  22,  27,  23,  44,  /*  40 -  47 */
2766      24,  32,  25,  34,  26,  29,  27,  44,  /*  48 -  55 */
2767      28,  31,  29,  34,  30,  60,  31,  36,  /*  56 -  63 */
2768      32,  64,  33,  34,  34,  46,  35,  37,  /*  64 -  71 */
2769      36,  65,  37,  50,  38,  48,  39,  69,  /*  72 -  79 */
2770      40,  49,  41,  43,  42,  51,  43,  58,  /*  80 -  87 */
2771      44,  64,  45,  47,  46,  59,  47,  76,  /*  88 -  95 */
2772      48,  65,  49,  66,  50,  67,  51,  66,  /*  96 - 103 */
2773      52,  70,  53,  74,  54, 104,  55,  74,  /* 104 - 111 */
2774      56,  64,  57,  69,  58,  78,  59,  68,  /* 112 - 119 */
2775      60,  61,  61,  80,  62,  75,  63,  68,  /* 120 - 127 */
2776      64,  65,  65, 128,  66, 129,  67,  90,  /* 128 - 135 */
2777      68,  73,  69, 131,  70,  94,  71,  88,  /* 136 - 143 */
2778      72, 128,  73,  98,  74, 132,  75, 121,  /* 144 - 151 */
2779      76, 102,  77, 124,  78, 132,  79, 106,  /* 152 - 159 */
2780      80,  97,  81, 160,  82,  99,  83, 134,  /* 160 - 167 */
2781      84,  86,  85,  95,  86, 160,  87, 100,  /* 168 - 175 */
2782      88, 113,  89,  98,  90, 107,  91, 122,  /* 176 - 183 */
2783      92, 111,  93, 102,  94, 126,  95, 150,  /* 184 - 191 */
2784      96, 128,  97, 130,  98, 133,  99, 195,  /* 192 - 199 */
2785     100, 128, 101, 123, 102, 164, 103, 138,  /* 200 - 207 */
2786     104, 145, 105, 146, 106, 109, 107, 149,  /* 208 - 215 */
2787     108, 200, 109, 146, 110, 170, 111, 157,  /* 216 - 223 */
2788     112, 128, 113, 130, 114, 182, 115, 132,  /* 224 - 231 */
2789     116, 200, 117, 132, 118, 158, 119, 206,  /* 232 - 239 */
2790     120, 240, 121, 162, 122, 147, 123, 152,  /* 240 - 247 */
2791     124, 166, 125, 214, 126, 138, 127, 153,  /* 248 - 255 */
2792   };
2793
2794
2795 /* Return the number of multiplications required to calculate
2796    powi(x,n) where n is less than POWI_TABLE_SIZE.  This is a
2797    subroutine of powi_cost.  CACHE is an array indicating
2798    which exponents have already been calculated.  */
2799
2800 static int
2801 powi_lookup_cost (unsigned HOST_WIDE_INT n, bool *cache)
2802 {
2803   /* If we've already calculated this exponent, then this evaluation
2804      doesn't require any additional multiplications.  */
2805   if (cache[n])
2806     return 0;
2807
2808   cache[n] = true;
2809   return powi_lookup_cost (n - powi_table[n], cache)
2810          + powi_lookup_cost (powi_table[n], cache) + 1;
2811 }
2812
2813 /* Return the number of multiplications required to calculate
2814    powi(x,n) for an arbitrary x, given the exponent N.  This
2815    function needs to be kept in sync with expand_powi below.  */
2816
2817 static int
2818 powi_cost (HOST_WIDE_INT n)
2819 {
2820   bool cache[POWI_TABLE_SIZE];
2821   unsigned HOST_WIDE_INT digit;
2822   unsigned HOST_WIDE_INT val;
2823   int result;
2824
2825   if (n == 0)
2826     return 0;
2827
2828   /* Ignore the reciprocal when calculating the cost.  */
2829   val = (n < 0) ? -n : n;
2830
2831   /* Initialize the exponent cache.  */
2832   memset (cache, 0, POWI_TABLE_SIZE * sizeof (bool));
2833   cache[1] = true;
2834
2835   result = 0;
2836
2837   while (val >= POWI_TABLE_SIZE)
2838     {
2839       if (val & 1)
2840         {
2841           digit = val & ((1 << POWI_WINDOW_SIZE) - 1);
2842           result += powi_lookup_cost (digit, cache)
2843                     + POWI_WINDOW_SIZE + 1;
2844           val >>= POWI_WINDOW_SIZE;
2845         }
2846       else
2847         {
2848           val >>= 1;
2849           result++;
2850         }
2851     }
2852
2853   return result + powi_lookup_cost (val, cache);
2854 }
2855
2856 /* Recursive subroutine of expand_powi.  This function takes the array,
2857    CACHE, of already calculated exponents and an exponent N and returns
2858    an RTX that corresponds to CACHE[1]**N, as calculated in mode MODE.  */
2859
2860 static rtx
2861 expand_powi_1 (enum machine_mode mode, unsigned HOST_WIDE_INT n, rtx *cache)
2862 {
2863   unsigned HOST_WIDE_INT digit;
2864   rtx target, result;
2865   rtx op0, op1;
2866
2867   if (n < POWI_TABLE_SIZE)
2868     {
2869       if (cache[n])
2870         return cache[n];
2871
2872       target = gen_reg_rtx (mode);
2873       cache[n] = target;
2874
2875       op0 = expand_powi_1 (mode, n - powi_table[n], cache);
2876       op1 = expand_powi_1 (mode, powi_table[n], cache);
2877     }
2878   else if (n & 1)
2879     {
2880       target = gen_reg_rtx (mode);
2881       digit = n & ((1 << POWI_WINDOW_SIZE) - 1);
2882       op0 = expand_powi_1 (mode, n - digit, cache);
2883       op1 = expand_powi_1 (mode, digit, cache);
2884     }
2885   else
2886     {
2887       target = gen_reg_rtx (mode);
2888       op0 = expand_powi_1 (mode, n >> 1, cache);
2889       op1 = op0;
2890     }
2891
2892   result = expand_mult (mode, op0, op1, target, 0);
2893   if (result != target)
2894     emit_move_insn (target, result);
2895   return target;
2896 }
2897
2898 /* Expand the RTL to evaluate powi(x,n) in mode MODE.  X is the
2899    floating point operand in mode MODE, and N is the exponent.  This
2900    function needs to be kept in sync with powi_cost above.  */
2901
2902 static rtx
2903 expand_powi (rtx x, enum machine_mode mode, HOST_WIDE_INT n)
2904 {
2905   rtx cache[POWI_TABLE_SIZE];
2906   rtx result;
2907
2908   if (n == 0)
2909     return CONST1_RTX (mode);
2910
2911   memset (cache, 0, sizeof (cache));
2912   cache[1] = x;
2913
2914   result = expand_powi_1 (mode, (n < 0) ? -n : n, cache);
2915
2916   /* If the original exponent was negative, reciprocate the result.  */
2917   if (n < 0)
2918     result = expand_binop (mode, sdiv_optab, CONST1_RTX (mode),
2919                            result, NULL_RTX, 0, OPTAB_LIB_WIDEN);
2920
2921   return result;
2922 }
2923
2924 /* Fold a builtin function call to pow, powf, or powl into a series of sqrts or
2925    cbrts.  Return NULL_RTX if no simplification can be made or expand the tree
2926    if we can simplify it.  */
2927 static rtx
2928 expand_builtin_pow_root (location_t loc, tree arg0, tree arg1, tree type,
2929                          rtx subtarget)
2930 {
2931   if (TREE_CODE (arg1) == REAL_CST
2932       && !TREE_OVERFLOW (arg1)
2933       && flag_unsafe_math_optimizations)
2934     {
2935       enum machine_mode mode = TYPE_MODE (type);
2936       tree sqrtfn = mathfn_built_in (type, BUILT_IN_SQRT);
2937       tree cbrtfn = mathfn_built_in (type, BUILT_IN_CBRT);
2938       REAL_VALUE_TYPE c = TREE_REAL_CST (arg1);
2939       tree op = NULL_TREE;
2940
2941       if (sqrtfn)
2942         {
2943           /* Optimize pow (x, 0.5) into sqrt.  */
2944           if (REAL_VALUES_EQUAL (c, dconsthalf))
2945             op = build_call_nofold_loc (loc, sqrtfn, 1, arg0);
2946
2947           else
2948             {
2949               REAL_VALUE_TYPE dconst1_4 = dconst1;
2950               REAL_VALUE_TYPE dconst3_4;
2951               SET_REAL_EXP (&dconst1_4, REAL_EXP (&dconst1_4) - 2);
2952
2953               real_from_integer (&dconst3_4, VOIDmode, 3, 0, 0);
2954               SET_REAL_EXP (&dconst3_4, REAL_EXP (&dconst3_4) - 2);
2955
2956               /* Optimize pow (x, 0.25) into sqrt (sqrt (x)).  Assume on most
2957                  machines that a builtin sqrt instruction is smaller than a
2958                  call to pow with 0.25, so do this optimization even if
2959                  -Os.  */
2960               if (REAL_VALUES_EQUAL (c, dconst1_4))
2961                 {
2962                   op = build_call_nofold_loc (loc, sqrtfn, 1, arg0);
2963                   op = build_call_nofold_loc (loc, sqrtfn, 1, op);
2964                 }
2965
2966               /* Optimize pow (x, 0.75) = sqrt (x) * sqrt (sqrt (x)) unless we
2967                  are optimizing for space.  */
2968               else if (optimize_insn_for_speed_p ()
2969                        && !TREE_SIDE_EFFECTS (arg0)
2970                        && REAL_VALUES_EQUAL (c, dconst3_4))
2971                 {
2972                   tree sqrt1 = build_call_expr_loc (loc, sqrtfn, 1, arg0);
2973                   tree sqrt2 = builtin_save_expr (sqrt1);
2974                   tree sqrt3 = build_call_expr_loc (loc, sqrtfn, 1, sqrt1);
2975                   op = fold_build2_loc (loc, MULT_EXPR, type, sqrt2, sqrt3);
2976                 }
2977             }
2978         }
2979
2980       /* Check whether we can do cbrt insstead of pow (x, 1./3.) and
2981          cbrt/sqrts instead of pow (x, 1./6.).  */
2982       if (cbrtfn && ! op
2983           && (tree_expr_nonnegative_p (arg0) || !HONOR_NANS (mode)))
2984         {
2985           /* First try 1/3.  */
2986           REAL_VALUE_TYPE dconst1_3
2987             = real_value_truncate (mode, dconst_third ());
2988
2989           if (REAL_VALUES_EQUAL (c, dconst1_3))
2990             op = build_call_nofold_loc (loc, cbrtfn, 1, arg0);
2991
2992               /* Now try 1/6.  */
2993           else if (optimize_insn_for_speed_p ())
2994             {
2995               REAL_VALUE_TYPE dconst1_6 = dconst1_3;
2996               SET_REAL_EXP (&dconst1_6, REAL_EXP (&dconst1_6) - 1);
2997
2998               if (REAL_VALUES_EQUAL (c, dconst1_6))
2999                 {
3000                   op = build_call_nofold_loc (loc, sqrtfn, 1, arg0);
3001                   op = build_call_nofold_loc (loc, cbrtfn, 1, op);
3002                 }
3003             }
3004         }
3005
3006       if (op)
3007         return expand_expr (op, subtarget, mode, EXPAND_NORMAL);
3008     }
3009
3010   return NULL_RTX;
3011 }
3012
3013 /* Expand a call to the pow built-in mathematical function.  Return NULL_RTX if
3014    a normal call should be emitted rather than expanding the function
3015    in-line.  EXP is the expression that is a call to the builtin
3016    function; if convenient, the result should be placed in TARGET.  */
3017
3018 static rtx
3019 expand_builtin_pow (tree exp, rtx target, rtx subtarget)
3020 {
3021   tree arg0, arg1;
3022   tree fn, narg0;
3023   tree type = TREE_TYPE (exp);
3024   REAL_VALUE_TYPE cint, c, c2;
3025   HOST_WIDE_INT n;
3026   rtx op, op2;
3027   enum machine_mode mode = TYPE_MODE (type);
3028
3029   if (! validate_arglist (exp, REAL_TYPE, REAL_TYPE, VOID_TYPE))
3030     return NULL_RTX;
3031
3032   arg0 = CALL_EXPR_ARG (exp, 0);
3033   arg1 = CALL_EXPR_ARG (exp, 1);
3034
3035   if (TREE_CODE (arg1) != REAL_CST
3036       || TREE_OVERFLOW (arg1))
3037     return expand_builtin_mathfn_2 (exp, target, subtarget);
3038
3039   /* Handle constant exponents.  */
3040
3041   /* For integer valued exponents we can expand to an optimal multiplication
3042      sequence using expand_powi.  */
3043   c = TREE_REAL_CST (arg1);
3044   n = real_to_integer (&c);
3045   real_from_integer (&cint, VOIDmode, n, n < 0 ? -1 : 0, 0);
3046   if (real_identical (&c, &cint)
3047       && ((n >= -1 && n <= 2)
3048           || (flag_unsafe_math_optimizations
3049               && optimize_insn_for_speed_p ()
3050               && powi_cost (n) <= POWI_MAX_MULTS)))
3051     {
3052       op = expand_expr (arg0, subtarget, VOIDmode, EXPAND_NORMAL);
3053       if (n != 1)
3054         {
3055           op = force_reg (mode, op);
3056           op = expand_powi (op, mode, n);
3057         }
3058       return op;
3059     }
3060
3061   narg0 = builtin_save_expr (arg0);
3062
3063   /* If the exponent is not integer valued, check if it is half of an integer.
3064      In this case we can expand to sqrt (x) * x**(n/2).  */
3065   fn = mathfn_built_in (type, BUILT_IN_SQRT);
3066   if (fn != NULL_TREE)
3067     {
3068       real_arithmetic (&c2, MULT_EXPR, &c, &dconst2);
3069       n = real_to_integer (&c2);
3070       real_from_integer (&cint, VOIDmode, n, n < 0 ? -1 : 0, 0);
3071       if (real_identical (&c2, &cint)
3072           && ((flag_unsafe_math_optimizations
3073                && optimize_insn_for_speed_p ()
3074                && powi_cost (n/2) <= POWI_MAX_MULTS)
3075               /* Even the c == 0.5 case cannot be done unconditionally
3076                  when we need to preserve signed zeros, as
3077                  pow (-0, 0.5) is +0, while sqrt(-0) is -0.  */
3078               || (!HONOR_SIGNED_ZEROS (mode) && n == 1)
3079               /* For c == 1.5 we can assume that x * sqrt (x) is always
3080                  smaller than pow (x, 1.5) if sqrt will not be expanded
3081                  as a call.  */
3082               || (n == 3
3083                   && optab_handler (sqrt_optab, mode) != CODE_FOR_nothing)))
3084         {
3085           tree call_expr = build_call_nofold_loc (EXPR_LOCATION (exp), fn, 1,
3086                                                   narg0);
3087           /* Use expand_expr in case the newly built call expression
3088              was folded to a non-call.  */
3089           op = expand_expr (call_expr, subtarget, mode, EXPAND_NORMAL);
3090           if (n != 1)
3091             {
3092               op2 = expand_expr (narg0, subtarget, VOIDmode, EXPAND_NORMAL);
3093               op2 = force_reg (mode, op2);
3094               op2 = expand_powi (op2, mode, abs (n / 2));
3095               op = expand_simple_binop (mode, MULT, op, op2, NULL_RTX,
3096                                         0, OPTAB_LIB_WIDEN);
3097               /* If the original exponent was negative, reciprocate the
3098                  result.  */
3099               if (n < 0)
3100                 op = expand_binop (mode, sdiv_optab, CONST1_RTX (mode),
3101                                    op, NULL_RTX, 0, OPTAB_LIB_WIDEN);
3102             }
3103           return op;
3104         }
3105     }
3106
3107   /* Check whether we can do a series of sqrt or cbrt's instead of the pow
3108      call.  */
3109   op = expand_builtin_pow_root (EXPR_LOCATION (exp), arg0, arg1, type,
3110                                 subtarget);
3111   if (op)
3112     return op;
3113
3114   /* Try if the exponent is a third of an integer.  In this case
3115      we can expand to x**(n/3) * cbrt(x)**(n%3).  As cbrt (x) is
3116      different from pow (x, 1./3.) due to rounding and behavior
3117      with negative x we need to constrain this transformation to
3118      unsafe math and positive x or finite math.  */
3119   fn = mathfn_built_in (type, BUILT_IN_CBRT);
3120   if (fn != NULL_TREE
3121       && flag_unsafe_math_optimizations
3122       && (tree_expr_nonnegative_p (arg0)
3123           || !HONOR_NANS (mode)))
3124     {
3125       REAL_VALUE_TYPE dconst3;
3126       real_from_integer (&dconst3, VOIDmode, 3, 0, 0);
3127       real_arithmetic (&c2, MULT_EXPR, &c, &dconst3);
3128       real_round (&c2, mode, &c2);
3129       n = real_to_integer (&c2);
3130       real_from_integer (&cint, VOIDmode, n, n < 0 ? -1 : 0, 0);
3131       real_arithmetic (&c2, RDIV_EXPR, &cint, &dconst3);
3132       real_convert (&c2, mode, &c2);
3133       if (real_identical (&c2, &c)
3134           && ((optimize_insn_for_speed_p ()
3135                && powi_cost (n/3) <= POWI_MAX_MULTS)
3136               || n == 1))
3137         {
3138           tree call_expr = build_call_nofold_loc (EXPR_LOCATION (exp), fn, 1,
3139                                                   narg0);
3140           op = expand_builtin (call_expr, NULL_RTX, subtarget, mode, 0);
3141           if (abs (n) % 3 == 2)
3142             op = expand_simple_binop (mode, MULT, op, op, op,
3143                                       0, OPTAB_LIB_WIDEN);
3144           if (n != 1)
3145             {
3146               op2 = expand_expr (narg0, subtarget, VOIDmode, EXPAND_NORMAL);
3147               op2 = force_reg (mode, op2);
3148               op2 = expand_powi (op2, mode, abs (n / 3));
3149               op = expand_simple_binop (mode, MULT, op, op2, NULL_RTX,
3150                                         0, OPTAB_LIB_WIDEN);
3151               /* If the original exponent was negative, reciprocate the
3152                  result.  */
3153               if (n < 0)
3154                 op = expand_binop (mode, sdiv_optab, CONST1_RTX (mode),
3155                                    op, NULL_RTX, 0, OPTAB_LIB_WIDEN);
3156             }
3157           return op;
3158         }
3159     }
3160
3161   /* Fall back to optab expansion.  */
3162   return expand_builtin_mathfn_2 (exp, target, subtarget);
3163 }
3164
3165 /* Expand a call to the powi built-in mathematical function.  Return NULL_RTX if
3166    a normal call should be emitted rather than expanding the function
3167    in-line.  EXP is the expression that is a call to the builtin
3168    function; if convenient, the result should be placed in TARGET.  */
3169
3170 static rtx
3171 expand_builtin_powi (tree exp, rtx target, rtx subtarget)
3172 {
3173   tree arg0, arg1;
3174   rtx op0, op1;
3175   enum machine_mode mode;
3176   enum machine_mode mode2;
3177
3178   if (! validate_arglist (exp, REAL_TYPE, INTEGER_TYPE, VOID_TYPE))
3179     return NULL_RTX;
3180
3181   arg0 = CALL_EXPR_ARG (exp, 0);
3182   arg1 = CALL_EXPR_ARG (exp, 1);
3183   mode = TYPE_MODE (TREE_TYPE (exp));
3184
3185   /* Handle constant power.  */
3186
3187   if (TREE_CODE (arg1) == INTEGER_CST
3188       && !TREE_OVERFLOW (arg1))
3189     {
3190       HOST_WIDE_INT n = TREE_INT_CST_LOW (arg1);
3191
3192       /* If the exponent is -1, 0, 1 or 2, then expand_powi is exact.
3193          Otherwise, check the number of multiplications required.  */
3194       if ((TREE_INT_CST_HIGH (arg1) == 0
3195            || TREE_INT_CST_HIGH (arg1) == -1)
3196           && ((n >= -1 && n <= 2)
3197               || (optimize_insn_for_speed_p ()
3198                   && powi_cost (n) <= POWI_MAX_MULTS)))
3199         {
3200           op0 = expand_expr (arg0, subtarget, VOIDmode, EXPAND_NORMAL);
3201           op0 = force_reg (mode, op0);
3202           return expand_powi (op0, mode, n);
3203         }
3204     }
3205
3206   /* Emit a libcall to libgcc.  */
3207
3208   /* Mode of the 2nd argument must match that of an int.  */
3209   mode2 = mode_for_size (INT_TYPE_SIZE, MODE_INT, 0);
3210
3211   if (target == NULL_RTX)
3212     target = gen_reg_rtx (mode);
3213
3214   op0 = expand_expr (arg0, subtarget, mode, EXPAND_NORMAL);
3215   if (GET_MODE (op0) != mode)
3216     op0 = convert_to_mode (mode, op0, 0);
3217   op1 = expand_expr (arg1, NULL_RTX, mode2, EXPAND_NORMAL);
3218   if (GET_MODE (op1) != mode2)
3219     op1 = convert_to_mode (mode2, op1, 0);
3220
3221   target = emit_library_call_value (optab_libfunc (powi_optab, mode),
3222                                     target, LCT_CONST, mode, 2,
3223                                     op0, mode, op1, mode2);
3224
3225   return target;
3226 }
3227
3228 /* Expand expression EXP which is a call to the strlen builtin.  Return
3229    NULL_RTX if we failed the caller should emit a normal call, otherwise
3230    try to get the result in TARGET, if convenient.  */
3231
3232 static rtx
3233 expand_builtin_strlen (tree exp, rtx target,
3234                        enum machine_mode target_mode)
3235 {
3236   if (!validate_arglist (exp, POINTER_TYPE, VOID_TYPE))
3237     return NULL_RTX;
3238   else
3239     {
3240       rtx pat;
3241       tree len;
3242       tree src = CALL_EXPR_ARG (exp, 0);
3243       rtx result, src_reg, char_rtx, before_strlen;
3244       enum machine_mode insn_mode = target_mode, char_mode;
3245       enum insn_code icode = CODE_FOR_nothing;
3246       int align;
3247
3248       /* If the length can be computed at compile-time, return it.  */
3249       len = c_strlen (src, 0);
3250       if (len)
3251         return expand_expr (len, target, target_mode, EXPAND_NORMAL);
3252
3253       /* If the length can be computed at compile-time and is constant
3254          integer, but there are side-effects in src, evaluate
3255          src for side-effects, then return len.
3256          E.g. x = strlen (i++ ? "xfoo" + 1 : "bar");
3257          can be optimized into: i++; x = 3;  */
3258       len = c_strlen (src, 1);
3259       if (len && TREE_CODE (len) == INTEGER_CST)
3260         {
3261           expand_expr (src, const0_rtx, VOIDmode, EXPAND_NORMAL);
3262           return expand_expr (len, target, target_mode, EXPAND_NORMAL);
3263         }
3264
3265       align = get_pointer_alignment (src, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
3266
3267       /* If SRC is not a pointer type, don't do this operation inline.  */
3268       if (align == 0)
3269         return NULL_RTX;
3270
3271       /* Bail out if we can't compute strlen in the right mode.  */
3272       while (insn_mode != VOIDmode)
3273         {
3274           icode = optab_handler (strlen_optab, insn_mode);
3275           if (icode != CODE_FOR_nothing)
3276             break;
3277
3278           insn_mode = GET_MODE_WIDER_MODE (insn_mode);
3279         }
3280       if (insn_mode == VOIDmode)
3281         return NULL_RTX;
3282
3283       /* Make a place to write the result of the instruction.  */
3284       result = target;
3285       if (! (result != 0
3286              && REG_P (result)
3287              && GET_MODE (result) == insn_mode
3288              && REGNO (result) >= FIRST_PSEUDO_REGISTER))
3289         result = gen_reg_rtx (insn_mode);
3290
3291       /* Make a place to hold the source address.  We will not expand
3292          the actual source until we are sure that the expansion will
3293          not fail -- there are trees that cannot be expanded twice.  */
3294       src_reg = gen_reg_rtx (Pmode);
3295
3296       /* Mark the beginning of the strlen sequence so we can emit the
3297          source operand later.  */
3298       before_strlen = get_last_insn ();
3299
3300       char_rtx = const0_rtx;
3301       char_mode = insn_data[(int) icode].operand[2].mode;
3302       if (! (*insn_data[(int) icode].operand[2].predicate) (char_rtx,
3303                                                             char_mode))
3304         char_rtx = copy_to_mode_reg (char_mode, char_rtx);
3305
3306       pat = GEN_FCN (icode) (result, gen_rtx_MEM (BLKmode, src_reg),
3307                              char_rtx, GEN_INT (align));
3308       if (! pat)
3309         return NULL_RTX;
3310       emit_insn (pat);
3311
3312       /* Now that we are assured of success, expand the source.  */
3313       start_sequence ();
3314       pat = expand_expr (src, src_reg, ptr_mode, EXPAND_NORMAL);
3315       if (pat != src_reg)
3316         emit_move_insn (src_reg, pat);
3317       pat = get_insns ();
3318       end_sequence ();
3319
3320       if (before_strlen)
3321         emit_insn_after (pat, before_strlen);
3322       else
3323         emit_insn_before (pat, get_insns ());
3324
3325       /* Return the value in the proper mode for this function.  */
3326       if (GET_MODE (result) == target_mode)
3327         target = result;
3328       else if (target != 0)
3329         convert_move (target, result, 0);
3330       else
3331         target = convert_to_mode (target_mode, result, 0);
3332
3333       return target;
3334     }
3335 }
3336
3337 /* Callback routine for store_by_pieces.  Read GET_MODE_BITSIZE (MODE)
3338    bytes from constant string DATA + OFFSET and return it as target
3339    constant.  */
3340
3341 static rtx
3342 builtin_memcpy_read_str (void *data, HOST_WIDE_INT offset,
3343                          enum machine_mode mode)
3344 {
3345   const char *str = (const char *) data;
3346
3347   gcc_assert (offset >= 0
3348               && ((unsigned HOST_WIDE_INT) offset + GET_MODE_SIZE (mode)
3349                   <= strlen (str) + 1));
3350
3351   return c_readstr (str + offset, mode);
3352 }
3353
3354 /* Expand a call EXP to the memcpy builtin.
3355    Return NULL_RTX if we failed, the caller should emit a normal call,
3356    otherwise try to get the result in TARGET, if convenient (and in
3357    mode MODE if that's convenient).  */
3358
3359 static rtx
3360 expand_builtin_memcpy (tree exp, rtx target)
3361 {
3362   if (!validate_arglist (exp,
3363                          POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
3364     return NULL_RTX;
3365   else
3366     {
3367       tree dest = CALL_EXPR_ARG (exp, 0);
3368       tree src = CALL_EXPR_ARG (exp, 1);
3369       tree len = CALL_EXPR_ARG (exp, 2);
3370       const char *src_str;
3371       unsigned int src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
3372       unsigned int dest_align
3373         = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
3374       rtx dest_mem, src_mem, dest_addr, len_rtx;
3375       HOST_WIDE_INT expected_size = -1;
3376       unsigned int expected_align = 0;
3377
3378       /* If DEST is not a pointer type, call the normal function.  */
3379       if (dest_align == 0)
3380         return NULL_RTX;
3381
3382       /* If either SRC is not a pointer type, don't do this
3383          operation in-line.  */
3384       if (src_align == 0)
3385         return NULL_RTX;
3386
3387       if (currently_expanding_gimple_stmt)
3388         stringop_block_profile (currently_expanding_gimple_stmt,
3389                                 &expected_align, &expected_size);
3390
3391       if (expected_align < dest_align)
3392         expected_align = dest_align;
3393       dest_mem = get_memory_rtx (dest, len);
3394       set_mem_align (dest_mem, dest_align);
3395       len_rtx = expand_normal (len);
3396       src_str = c_getstr (src);
3397
3398       /* If SRC is a string constant and block move would be done
3399          by pieces, we can avoid loading the string from memory
3400          and only stored the computed constants.  */
3401       if (src_str
3402           && CONST_INT_P (len_rtx)
3403           && (unsigned HOST_WIDE_INT) INTVAL (len_rtx) <= strlen (src_str) + 1
3404           && can_store_by_pieces (INTVAL (len_rtx), builtin_memcpy_read_str,
3405                                   CONST_CAST (char *, src_str),
3406                                   dest_align, false))
3407         {
3408           dest_mem = store_by_pieces (dest_mem, INTVAL (len_rtx),
3409                                       builtin_memcpy_read_str,
3410                                       CONST_CAST (char *, src_str),
3411                                       dest_align, false, 0);
3412           dest_mem = force_operand (XEXP (dest_mem, 0), target);
3413           dest_mem = convert_memory_address (ptr_mode, dest_mem);
3414           return dest_mem;
3415         }
3416
3417       src_mem = get_memory_rtx (src, len);
3418       set_mem_align (src_mem, src_align);
3419
3420       /* Copy word part most expediently.  */
3421       dest_addr = emit_block_move_hints (dest_mem, src_mem, len_rtx,
3422                                          CALL_EXPR_TAILCALL (exp)
3423                                          ? BLOCK_OP_TAILCALL : BLOCK_OP_NORMAL,
3424                                          expected_align, expected_size);
3425
3426       if (dest_addr == 0)
3427         {
3428           dest_addr = force_operand (XEXP (dest_mem, 0), target);
3429           dest_addr = convert_memory_address (ptr_mode, dest_addr);
3430         }
3431       return dest_addr;
3432     }
3433 }
3434
3435 /* Expand a call EXP to the mempcpy builtin.
3436    Return NULL_RTX if we failed; the caller should emit a normal call,
3437    otherwise try to get the result in TARGET, if convenient (and in
3438    mode MODE if that's convenient).  If ENDP is 0 return the
3439    destination pointer, if ENDP is 1 return the end pointer ala
3440    mempcpy, and if ENDP is 2 return the end pointer minus one ala
3441    stpcpy.  */
3442
3443 static rtx
3444 expand_builtin_mempcpy (tree exp, rtx target, enum machine_mode mode)
3445 {
3446   if (!validate_arglist (exp,
3447                          POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
3448     return NULL_RTX;
3449   else
3450     {
3451       tree dest = CALL_EXPR_ARG (exp, 0);
3452       tree src = CALL_EXPR_ARG (exp, 1);
3453       tree len = CALL_EXPR_ARG (exp, 2);
3454       return expand_builtin_mempcpy_args (dest, src, len,
3455                                           target, mode, /*endp=*/ 1);
3456     }
3457 }
3458
3459 /* Helper function to do the actual work for expand_builtin_mempcpy.  The
3460    arguments to the builtin_mempcpy call DEST, SRC, and LEN are broken out
3461    so that this can also be called without constructing an actual CALL_EXPR.
3462    The other arguments and return value are the same as for
3463    expand_builtin_mempcpy.  */
3464
3465 static rtx
3466 expand_builtin_mempcpy_args (tree dest, tree src, tree len,
3467                              rtx target, enum machine_mode mode, int endp)
3468 {
3469     /* If return value is ignored, transform mempcpy into memcpy.  */
3470   if (target == const0_rtx && implicit_built_in_decls[BUILT_IN_MEMCPY])
3471     {
3472       tree fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
3473       tree result = build_call_nofold_loc (UNKNOWN_LOCATION, fn, 3,
3474                                            dest, src, len);
3475       return expand_expr (result, target, mode, EXPAND_NORMAL);
3476     }
3477   else
3478     {
3479       const char *src_str;
3480       unsigned int src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
3481       unsigned int dest_align
3482         = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
3483       rtx dest_mem, src_mem, len_rtx;
3484
3485       /* If either SRC or DEST is not a pointer type, don't do this
3486          operation in-line.  */
3487       if (dest_align == 0 || src_align == 0)
3488         return NULL_RTX;
3489
3490       /* If LEN is not constant, call the normal function.  */
3491       if (! host_integerp (len, 1))
3492         return NULL_RTX;
3493
3494       len_rtx = expand_normal (len);
3495       src_str = c_getstr (src);
3496
3497       /* If SRC is a string constant and block move would be done
3498          by pieces, we can avoid loading the string from memory
3499          and only stored the computed constants.  */
3500       if (src_str
3501           && CONST_INT_P (len_rtx)
3502           && (unsigned HOST_WIDE_INT) INTVAL (len_rtx) <= strlen (src_str) + 1
3503           && can_store_by_pieces (INTVAL (len_rtx), builtin_memcpy_read_str,
3504                                   CONST_CAST (char *, src_str),
3505                                   dest_align, false))
3506         {
3507           dest_mem = get_memory_rtx (dest, len);
3508           set_mem_align (dest_mem, dest_align);
3509           dest_mem = store_by_pieces (dest_mem, INTVAL (len_rtx),
3510                                       builtin_memcpy_read_str,
3511                                       CONST_CAST (char *, src_str),
3512                                       dest_align, false, endp);
3513           dest_mem = force_operand (XEXP (dest_mem, 0), NULL_RTX);
3514           dest_mem = convert_memory_address (ptr_mode, dest_mem);
3515           return dest_mem;
3516         }
3517
3518       if (CONST_INT_P (len_rtx)
3519           && can_move_by_pieces (INTVAL (len_rtx),
3520                                  MIN (dest_align, src_align)))
3521         {
3522           dest_mem = get_memory_rtx (dest, len);
3523           set_mem_align (dest_mem, dest_align);
3524           src_mem = get_memory_rtx (src, len);
3525           set_mem_align (src_mem, src_align);
3526           dest_mem = move_by_pieces (dest_mem, src_mem, INTVAL (len_rtx),
3527                                      MIN (dest_align, src_align), endp);
3528           dest_mem = force_operand (XEXP (dest_mem, 0), NULL_RTX);
3529           dest_mem = convert_memory_address (ptr_mode, dest_mem);
3530           return dest_mem;
3531         }
3532
3533       return NULL_RTX;
3534     }
3535 }
3536
3537 #ifndef HAVE_movstr
3538 # define HAVE_movstr 0
3539 # define CODE_FOR_movstr CODE_FOR_nothing
3540 #endif
3541
3542 /* Expand into a movstr instruction, if one is available.  Return NULL_RTX if
3543    we failed, the caller should emit a normal call, otherwise try to
3544    get the result in TARGET, if convenient.  If ENDP is 0 return the
3545    destination pointer, if ENDP is 1 return the end pointer ala
3546    mempcpy, and if ENDP is 2 return the end pointer minus one ala
3547    stpcpy.  */
3548
3549 static rtx
3550 expand_movstr (tree dest, tree src, rtx target, int endp)
3551 {
3552   rtx end;
3553   rtx dest_mem;
3554   rtx src_mem;
3555   rtx insn;
3556   const struct insn_data_d * data;
3557
3558   if (!HAVE_movstr)
3559     return NULL_RTX;
3560
3561   dest_mem = get_memory_rtx (dest, NULL);
3562   src_mem = get_memory_rtx (src, NULL);
3563   data = insn_data + CODE_FOR_movstr;
3564   if (!endp)
3565     {
3566       target = force_reg (Pmode, XEXP (dest_mem, 0));
3567       dest_mem = replace_equiv_address (dest_mem, target);
3568       end = gen_reg_rtx (Pmode);
3569     }
3570   else
3571     {
3572       if (target == 0
3573           || target == const0_rtx
3574           || ! (*data->operand[0].predicate) (target, Pmode))
3575         {
3576           end = gen_reg_rtx (Pmode);
3577           if (target != const0_rtx)
3578             target = end;
3579         }
3580       else
3581         end = target;
3582     }
3583
3584   if (data->operand[0].mode != VOIDmode)
3585     end = gen_lowpart (data->operand[0].mode, end);
3586
3587   insn = data->genfun (end, dest_mem, src_mem);
3588
3589   gcc_assert (insn);
3590
3591   emit_insn (insn);
3592
3593   /* movstr is supposed to set end to the address of the NUL
3594      terminator.  If the caller requested a mempcpy-like return value,
3595      adjust it.  */
3596   if (endp == 1 && target != const0_rtx)
3597     {
3598       rtx tem = plus_constant (gen_lowpart (GET_MODE (target), end), 1);
3599       emit_move_insn (target, force_operand (tem, NULL_RTX));
3600     }
3601
3602   return target;
3603 }
3604
3605 /* Expand expression EXP, which is a call to the strcpy builtin.  Return
3606    NULL_RTX if we failed the caller should emit a normal call, otherwise
3607    try to get the result in TARGET, if convenient (and in mode MODE if that's
3608    convenient).  */
3609
3610 static rtx
3611 expand_builtin_strcpy (tree exp, rtx target)
3612 {
3613   if (validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
3614    {
3615      tree dest = CALL_EXPR_ARG (exp, 0);
3616      tree src = CALL_EXPR_ARG (exp, 1);
3617      return expand_builtin_strcpy_args (dest, src, target);
3618    }
3619    return NULL_RTX;
3620 }
3621
3622 /* Helper function to do the actual work for expand_builtin_strcpy.  The
3623    arguments to the builtin_strcpy call DEST and SRC are broken out
3624    so that this can also be called without constructing an actual CALL_EXPR.
3625    The other arguments and return value are the same as for
3626    expand_builtin_strcpy.  */
3627
3628 static rtx
3629 expand_builtin_strcpy_args (tree dest, tree src, rtx target)
3630 {
3631   return expand_movstr (dest, src, target, /*endp=*/0);
3632 }
3633
3634 /* Expand a call EXP to the stpcpy builtin.
3635    Return NULL_RTX if we failed the caller should emit a normal call,
3636    otherwise try to get the result in TARGET, if convenient (and in
3637    mode MODE if that's convenient).  */
3638
3639 static rtx
3640 expand_builtin_stpcpy (tree exp, rtx target, enum machine_mode mode)
3641 {
3642   tree dst, src;
3643   location_t loc = EXPR_LOCATION (exp);
3644
3645   if (!validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
3646     return NULL_RTX;
3647
3648   dst = CALL_EXPR_ARG (exp, 0);
3649   src = CALL_EXPR_ARG (exp, 1);
3650
3651   /* If return value is ignored, transform stpcpy into strcpy.  */
3652   if (target == const0_rtx && implicit_built_in_decls[BUILT_IN_STRCPY])
3653     {
3654       tree fn = implicit_built_in_decls[BUILT_IN_STRCPY];
3655       tree result = build_call_nofold_loc (loc, fn, 2, dst, src);
3656       return expand_expr (result, target, mode, EXPAND_NORMAL);
3657     }
3658   else
3659     {
3660       tree len, lenp1;
3661       rtx ret;
3662
3663       /* Ensure we get an actual string whose length can be evaluated at
3664          compile-time, not an expression containing a string.  This is
3665          because the latter will potentially produce pessimized code
3666          when used to produce the return value.  */
3667       if (! c_getstr (src) || ! (len = c_strlen (src, 0)))
3668         return expand_movstr (dst, src, target, /*endp=*/2);
3669
3670       lenp1 = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
3671       ret = expand_builtin_mempcpy_args (dst, src, lenp1,
3672                                          target, mode, /*endp=*/2);
3673
3674       if (ret)
3675         return ret;
3676
3677       if (TREE_CODE (len) == INTEGER_CST)
3678         {
3679           rtx len_rtx = expand_normal (len);
3680
3681           if (CONST_INT_P (len_rtx))
3682             {
3683               ret = expand_builtin_strcpy_args (dst, src, target);
3684
3685               if (ret)
3686                 {
3687                   if (! target)
3688                     {
3689                       if (mode != VOIDmode)
3690                         target = gen_reg_rtx (mode);
3691                       else
3692                         target = gen_reg_rtx (GET_MODE (ret));
3693                     }
3694                   if (GET_MODE (target) != GET_MODE (ret))
3695                     ret = gen_lowpart (GET_MODE (target), ret);
3696
3697                   ret = plus_constant (ret, INTVAL (len_rtx));
3698                   ret = emit_move_insn (target, force_operand (ret, NULL_RTX));
3699                   gcc_assert (ret);
3700
3701                   return target;
3702                 }
3703             }
3704         }
3705
3706       return expand_movstr (dst, src, target, /*endp=*/2);
3707     }
3708 }
3709
3710 /* Callback routine for store_by_pieces.  Read GET_MODE_BITSIZE (MODE)
3711    bytes from constant string DATA + OFFSET and return it as target
3712    constant.  */
3713
3714 rtx
3715 builtin_strncpy_read_str (void *data, HOST_WIDE_INT offset,
3716                           enum machine_mode mode)
3717 {
3718   const char *str = (const char *) data;
3719
3720   if ((unsigned HOST_WIDE_INT) offset > strlen (str))
3721     return const0_rtx;
3722
3723   return c_readstr (str + offset, mode);
3724 }
3725
3726 /* Expand expression EXP, which is a call to the strncpy builtin.  Return
3727    NULL_RTX if we failed the caller should emit a normal call.  */
3728
3729 static rtx
3730 expand_builtin_strncpy (tree exp, rtx target)
3731 {
3732   location_t loc = EXPR_LOCATION (exp);
3733
3734   if (validate_arglist (exp,
3735                         POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
3736     {
3737       tree dest = CALL_EXPR_ARG (exp, 0);
3738       tree src = CALL_EXPR_ARG (exp, 1);
3739       tree len = CALL_EXPR_ARG (exp, 2);
3740       tree slen = c_strlen (src, 1);
3741
3742       /* We must be passed a constant len and src parameter.  */
3743       if (!host_integerp (len, 1) || !slen || !host_integerp (slen, 1))
3744         return NULL_RTX;
3745
3746       slen = size_binop_loc (loc, PLUS_EXPR, slen, ssize_int (1));
3747
3748       /* We're required to pad with trailing zeros if the requested
3749          len is greater than strlen(s2)+1.  In that case try to
3750          use store_by_pieces, if it fails, punt.  */
3751       if (tree_int_cst_lt (slen, len))
3752         {
3753           unsigned int dest_align
3754             = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
3755           const char *p = c_getstr (src);
3756           rtx dest_mem;
3757
3758           if (!p || dest_align == 0 || !host_integerp (len, 1)
3759               || !can_store_by_pieces (tree_low_cst (len, 1),
3760                                        builtin_strncpy_read_str,
3761                                        CONST_CAST (char *, p),
3762                                        dest_align, false))
3763             return NULL_RTX;
3764
3765           dest_mem = get_memory_rtx (dest, len);
3766           store_by_pieces (dest_mem, tree_low_cst (len, 1),
3767                            builtin_strncpy_read_str,
3768                            CONST_CAST (char *, p), dest_align, false, 0);
3769           dest_mem = force_operand (XEXP (dest_mem, 0), target);
3770           dest_mem = convert_memory_address (ptr_mode, dest_mem);
3771           return dest_mem;
3772         }
3773     }
3774   return NULL_RTX;
3775 }
3776
3777 /* Callback routine for store_by_pieces.  Read GET_MODE_BITSIZE (MODE)
3778    bytes from constant string DATA + OFFSET and return it as target
3779    constant.  */
3780
3781 rtx
3782 builtin_memset_read_str (void *data, HOST_WIDE_INT offset ATTRIBUTE_UNUSED,
3783                          enum machine_mode mode)
3784 {
3785   const char *c = (const char *) data;
3786   char *p = XALLOCAVEC (char, GET_MODE_SIZE (mode));
3787
3788   memset (p, *c, GET_MODE_SIZE (mode));
3789
3790   return c_readstr (p, mode);
3791 }
3792
3793 /* Callback routine for store_by_pieces.  Return the RTL of a register
3794    containing GET_MODE_SIZE (MODE) consecutive copies of the unsigned
3795    char value given in the RTL register data.  For example, if mode is
3796    4 bytes wide, return the RTL for 0x01010101*data.  */
3797
3798 static rtx
3799 builtin_memset_gen_str (void *data, HOST_WIDE_INT offset ATTRIBUTE_UNUSED,
3800                         enum machine_mode mode)
3801 {
3802   rtx target, coeff;
3803   size_t size;
3804   char *p;
3805
3806   size = GET_MODE_SIZE (mode);
3807   if (size == 1)
3808     return (rtx) data;
3809
3810   p = XALLOCAVEC (char, size);
3811   memset (p, 1, size);
3812   coeff = c_readstr (p, mode);
3813
3814   target = convert_to_mode (mode, (rtx) data, 1);
3815   target = expand_mult (mode, target, coeff, NULL_RTX, 1);
3816   return force_reg (mode, target);
3817 }
3818
3819 /* Expand expression EXP, which is a call to the memset builtin.  Return
3820    NULL_RTX if we failed the caller should emit a normal call, otherwise
3821    try to get the result in TARGET, if convenient (and in mode MODE if that's
3822    convenient).  */
3823
3824 static rtx
3825 expand_builtin_memset (tree exp, rtx target, enum machine_mode mode)
3826 {
3827   if (!validate_arglist (exp,
3828                          POINTER_TYPE, INTEGER_TYPE, INTEGER_TYPE, VOID_TYPE))
3829     return NULL_RTX;
3830   else
3831     {
3832       tree dest = CALL_EXPR_ARG (exp, 0);
3833       tree val = CALL_EXPR_ARG (exp, 1);
3834       tree len = CALL_EXPR_ARG (exp, 2);
3835       return expand_builtin_memset_args (dest, val, len, target, mode, exp);
3836     }
3837 }
3838
3839 /* Helper function to do the actual work for expand_builtin_memset.  The
3840    arguments to the builtin_memset call DEST, VAL, and LEN are broken out
3841    so that this can also be called without constructing an actual CALL_EXPR.
3842    The other arguments and return value are the same as for
3843    expand_builtin_memset.  */
3844
3845 static rtx
3846 expand_builtin_memset_args (tree dest, tree val, tree len,
3847                             rtx target, enum machine_mode mode, tree orig_exp)
3848 {
3849   tree fndecl, fn;
3850   enum built_in_function fcode;
3851   char c;
3852   unsigned int dest_align;
3853   rtx dest_mem, dest_addr, len_rtx;
3854   HOST_WIDE_INT expected_size = -1;
3855   unsigned int expected_align = 0;
3856
3857   dest_align = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
3858
3859   /* If DEST is not a pointer type, don't do this operation in-line.  */
3860   if (dest_align == 0)
3861     return NULL_RTX;
3862
3863   if (currently_expanding_gimple_stmt)
3864     stringop_block_profile (currently_expanding_gimple_stmt,
3865                             &expected_align, &expected_size);
3866
3867   if (expected_align < dest_align)
3868     expected_align = dest_align;
3869
3870   /* If the LEN parameter is zero, return DEST.  */
3871   if (integer_zerop (len))
3872     {
3873       /* Evaluate and ignore VAL in case it has side-effects.  */
3874       expand_expr (val, const0_rtx, VOIDmode, EXPAND_NORMAL);
3875       return expand_expr (dest, target, mode, EXPAND_NORMAL);
3876     }
3877
3878   /* Stabilize the arguments in case we fail.  */
3879   dest = builtin_save_expr (dest);
3880   val = builtin_save_expr (val);
3881   len = builtin_save_expr (len);
3882
3883   len_rtx = expand_normal (len);
3884   dest_mem = get_memory_rtx (dest, len);
3885
3886   if (TREE_CODE (val) != INTEGER_CST)
3887     {
3888       rtx val_rtx;
3889
3890       val_rtx = expand_normal (val);
3891       val_rtx = convert_to_mode (TYPE_MODE (unsigned_char_type_node),
3892                                  val_rtx, 0);
3893
3894       /* Assume that we can memset by pieces if we can store
3895        * the coefficients by pieces (in the required modes).
3896        * We can't pass builtin_memset_gen_str as that emits RTL.  */
3897       c = 1;
3898       if (host_integerp (len, 1)
3899           && can_store_by_pieces (tree_low_cst (len, 1),
3900                                   builtin_memset_read_str, &c, dest_align,
3901                                   true))
3902         {
3903           val_rtx = force_reg (TYPE_MODE (unsigned_char_type_node),
3904                                val_rtx);
3905           store_by_pieces (dest_mem, tree_low_cst (len, 1),
3906                            builtin_memset_gen_str, val_rtx, dest_align,
3907                            true, 0);
3908         }
3909       else if (!set_storage_via_setmem (dest_mem, len_rtx, val_rtx,
3910                                         dest_align, expected_align,
3911                                         expected_size))
3912         goto do_libcall;
3913
3914       dest_mem = force_operand (XEXP (dest_mem, 0), NULL_RTX);
3915       dest_mem = convert_memory_address (ptr_mode, dest_mem);
3916       return dest_mem;
3917     }
3918
3919   if (target_char_cast (val, &c))
3920     goto do_libcall;
3921
3922   if (c)
3923     {
3924       if (host_integerp (len, 1)
3925           && can_store_by_pieces (tree_low_cst (len, 1),
3926                                   builtin_memset_read_str, &c, dest_align,
3927                                   true))
3928         store_by_pieces (dest_mem, tree_low_cst (len, 1),
3929                          builtin_memset_read_str, &c, dest_align, true, 0);
3930       else if (!set_storage_via_setmem (dest_mem, len_rtx, GEN_INT (c),
3931                                         dest_align, expected_align,
3932                                         expected_size))
3933         goto do_libcall;
3934
3935       dest_mem = force_operand (XEXP (dest_mem, 0), NULL_RTX);
3936       dest_mem = convert_memory_address (ptr_mode, dest_mem);
3937       return dest_mem;
3938     }
3939
3940   set_mem_align (dest_mem, dest_align);
3941   dest_addr = clear_storage_hints (dest_mem, len_rtx,
3942                                    CALL_EXPR_TAILCALL (orig_exp)
3943                                    ? BLOCK_OP_TAILCALL : BLOCK_OP_NORMAL,
3944                                    expected_align, expected_size);
3945
3946   if (dest_addr == 0)
3947     {
3948       dest_addr = force_operand (XEXP (dest_mem, 0), NULL_RTX);
3949       dest_addr = convert_memory_address (ptr_mode, dest_addr);
3950     }
3951
3952   return dest_addr;
3953
3954  do_libcall:
3955   fndecl = get_callee_fndecl (orig_exp);
3956   fcode = DECL_FUNCTION_CODE (fndecl);
3957   if (fcode == BUILT_IN_MEMSET)
3958     fn = build_call_nofold_loc (EXPR_LOCATION (orig_exp), fndecl, 3,
3959                                 dest, val, len);
3960   else if (fcode == BUILT_IN_BZERO)
3961     fn = build_call_nofold_loc (EXPR_LOCATION (orig_exp), fndecl, 2,
3962                                 dest, len);
3963   else
3964     gcc_unreachable ();
3965   gcc_assert (TREE_CODE (fn) == CALL_EXPR);
3966   CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (orig_exp);
3967   return expand_call (fn, target, target == const0_rtx);
3968 }
3969
3970 /* Expand expression EXP, which is a call to the bzero builtin.  Return
3971    NULL_RTX if we failed the caller should emit a normal call.  */
3972
3973 static rtx
3974 expand_builtin_bzero (tree exp)
3975 {
3976   tree dest, size;
3977   location_t loc = EXPR_LOCATION (exp);
3978
3979   if (!validate_arglist (exp, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
3980     return NULL_RTX;
3981
3982   dest = CALL_EXPR_ARG (exp, 0);
3983   size = CALL_EXPR_ARG (exp, 1);
3984
3985   /* New argument list transforming bzero(ptr x, int y) to
3986      memset(ptr x, int 0, size_t y).   This is done this way
3987      so that if it isn't expanded inline, we fallback to
3988      calling bzero instead of memset.  */
3989
3990   return expand_builtin_memset_args (dest, integer_zero_node,
3991                                      fold_convert_loc (loc, sizetype, size),
3992                                      const0_rtx, VOIDmode, exp);
3993 }
3994
3995 /* Expand expression EXP, which is a call to the memcmp built-in function.
3996    Return NULL_RTX if we failed and the
3997    caller should emit a normal call, otherwise try to get the result in
3998    TARGET, if convenient (and in mode MODE, if that's convenient).  */
3999
4000 static rtx
4001 expand_builtin_memcmp (tree exp, ATTRIBUTE_UNUSED rtx target,
4002                        ATTRIBUTE_UNUSED enum machine_mode mode)
4003 {
4004   location_t loc ATTRIBUTE_UNUSED = EXPR_LOCATION (exp);
4005
4006   if (!validate_arglist (exp,
4007                          POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
4008     return NULL_RTX;
4009
4010 #if defined HAVE_cmpmemsi || defined HAVE_cmpstrnsi
4011   {
4012     rtx arg1_rtx, arg2_rtx, arg3_rtx;
4013     rtx result;
4014     rtx insn;
4015     tree arg1 = CALL_EXPR_ARG (exp, 0);
4016     tree arg2 = CALL_EXPR_ARG (exp, 1);
4017     tree len = CALL_EXPR_ARG (exp, 2);
4018
4019     int arg1_align
4020       = get_pointer_alignment (arg1, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
4021     int arg2_align
4022       = get_pointer_alignment (arg2, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
4023     enum machine_mode insn_mode;
4024
4025 #ifdef HAVE_cmpmemsi
4026     if (HAVE_cmpmemsi)
4027       insn_mode = insn_data[(int) CODE_FOR_cmpmemsi].operand[0].mode;
4028     else
4029 #endif
4030 #ifdef HAVE_cmpstrnsi
4031     if (HAVE_cmpstrnsi)
4032       insn_mode = insn_data[(int) CODE_FOR_cmpstrnsi].operand[0].mode;
4033     else
4034 #endif
4035       return NULL_RTX;
4036
4037     /* If we don't have POINTER_TYPE, call the function.  */
4038     if (arg1_align == 0 || arg2_align == 0)
4039       return NULL_RTX;
4040
4041     /* Make a place to write the result of the instruction.  */
4042     result = target;
4043     if (! (result != 0
4044            && REG_P (result) && GET_MODE (result) == insn_mode
4045            && REGNO (result) >= FIRST_PSEUDO_REGISTER))
4046       result = gen_reg_rtx (insn_mode);
4047
4048     arg1_rtx = get_memory_rtx (arg1, len);
4049     arg2_rtx = get_memory_rtx (arg2, len);
4050     arg3_rtx = expand_normal (fold_convert_loc (loc, sizetype, len));
4051
4052     /* Set MEM_SIZE as appropriate.  */
4053     if (CONST_INT_P (arg3_rtx))
4054       {
4055         set_mem_size (arg1_rtx, arg3_rtx);
4056         set_mem_size (arg2_rtx, arg3_rtx);
4057       }
4058
4059 #ifdef HAVE_cmpmemsi
4060     if (HAVE_cmpmemsi)
4061       insn = gen_cmpmemsi (result, arg1_rtx, arg2_rtx, arg3_rtx,
4062                            GEN_INT (MIN (arg1_align, arg2_align)));
4063     else
4064 #endif
4065 #ifdef HAVE_cmpstrnsi
4066     if (HAVE_cmpstrnsi)
4067       insn = gen_cmpstrnsi (result, arg1_rtx, arg2_rtx, arg3_rtx,
4068                             GEN_INT (MIN (arg1_align, arg2_align)));
4069     else
4070 #endif
4071       gcc_unreachable ();
4072
4073     if (insn)
4074       emit_insn (insn);
4075     else
4076       emit_library_call_value (memcmp_libfunc, result, LCT_PURE,
4077                                TYPE_MODE (integer_type_node), 3,
4078                                XEXP (arg1_rtx, 0), Pmode,
4079                                XEXP (arg2_rtx, 0), Pmode,
4080                                convert_to_mode (TYPE_MODE (sizetype), arg3_rtx,
4081                                                 TYPE_UNSIGNED (sizetype)),
4082                                TYPE_MODE (sizetype));
4083
4084     /* Return the value in the proper mode for this function.  */
4085     mode = TYPE_MODE (TREE_TYPE (exp));
4086     if (GET_MODE (result) == mode)
4087       return result;
4088     else if (target != 0)
4089       {
4090         convert_move (target, result, 0);
4091         return target;
4092       }
4093     else
4094       return convert_to_mode (mode, result, 0);
4095   }
4096 #endif
4097
4098   return NULL_RTX;
4099 }
4100
4101 /* Expand expression EXP, which is a call to the strcmp builtin.  Return NULL_RTX
4102    if we failed the caller should emit a normal call, otherwise try to get
4103    the result in TARGET, if convenient.  */
4104
4105 static rtx
4106 expand_builtin_strcmp (tree exp, ATTRIBUTE_UNUSED rtx target)
4107 {
4108   if (!validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
4109     return NULL_RTX;
4110
4111 #if defined HAVE_cmpstrsi || defined HAVE_cmpstrnsi
4112   if (direct_optab_handler (cmpstr_optab, SImode) != CODE_FOR_nothing
4113       || direct_optab_handler (cmpstrn_optab, SImode) != CODE_FOR_nothing)
4114     {
4115       rtx arg1_rtx, arg2_rtx;
4116       rtx result, insn = NULL_RTX;
4117       tree fndecl, fn;
4118       tree arg1 = CALL_EXPR_ARG (exp, 0);
4119       tree arg2 = CALL_EXPR_ARG (exp, 1);
4120
4121       int arg1_align
4122         = get_pointer_alignment (arg1, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
4123       int arg2_align
4124         = get_pointer_alignment (arg2, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
4125
4126       /* If we don't have POINTER_TYPE, call the function.  */
4127       if (arg1_align == 0 || arg2_align == 0)
4128         return NULL_RTX;
4129
4130       /* Stabilize the arguments in case gen_cmpstr(n)si fail.  */
4131       arg1 = builtin_save_expr (arg1);
4132       arg2 = builtin_save_expr (arg2);
4133
4134       arg1_rtx = get_memory_rtx (arg1, NULL);
4135       arg2_rtx = get_memory_rtx (arg2, NULL);
4136
4137 #ifdef HAVE_cmpstrsi
4138       /* Try to call cmpstrsi.  */
4139       if (HAVE_cmpstrsi)
4140         {
4141           enum machine_mode insn_mode
4142             = insn_data[(int) CODE_FOR_cmpstrsi].operand[0].mode;
4143
4144           /* Make a place to write the result of the instruction.  */
4145           result = target;
4146           if (! (result != 0
4147                  && REG_P (result) && GET_MODE (result) == insn_mode
4148                  && REGNO (result) >= FIRST_PSEUDO_REGISTER))
4149             result = gen_reg_rtx (insn_mode);
4150
4151           insn = gen_cmpstrsi (result, arg1_rtx, arg2_rtx,
4152                                GEN_INT (MIN (arg1_align, arg2_align)));
4153         }
4154 #endif
4155 #ifdef HAVE_cmpstrnsi
4156       /* Try to determine at least one length and call cmpstrnsi.  */
4157       if (!insn && HAVE_cmpstrnsi)
4158         {
4159           tree len;
4160           rtx arg3_rtx;
4161
4162           enum machine_mode insn_mode
4163             = insn_data[(int) CODE_FOR_cmpstrnsi].operand[0].mode;
4164           tree len1 = c_strlen (arg1, 1);
4165           tree len2 = c_strlen (arg2, 1);
4166
4167           if (len1)
4168             len1 = size_binop (PLUS_EXPR, ssize_int (1), len1);
4169           if (len2)
4170             len2 = size_binop (PLUS_EXPR, ssize_int (1), len2);
4171
4172           /* If we don't have a constant length for the first, use the length
4173              of the second, if we know it.  We don't require a constant for
4174              this case; some cost analysis could be done if both are available
4175              but neither is constant.  For now, assume they're equally cheap,
4176              unless one has side effects.  If both strings have constant lengths,
4177              use the smaller.  */
4178
4179           if (!len1)
4180             len = len2;
4181           else if (!len2)
4182             len = len1;
4183           else if (TREE_SIDE_EFFECTS (len1))
4184             len = len2;
4185           else if (TREE_SIDE_EFFECTS (len2))
4186             len = len1;
4187           else if (TREE_CODE (len1) != INTEGER_CST)
4188             len = len2;
4189           else if (TREE_CODE (len2) != INTEGER_CST)
4190             len = len1;
4191           else if (tree_int_cst_lt (len1, len2))
4192             len = len1;
4193           else
4194             len = len2;
4195
4196           /* If both arguments have side effects, we cannot optimize.  */
4197           if (!len || TREE_SIDE_EFFECTS (len))
4198             goto do_libcall;
4199
4200           arg3_rtx = expand_normal (len);
4201
4202           /* Make a place to write the result of the instruction.  */
4203           result = target;
4204           if (! (result != 0
4205                  && REG_P (result) && GET_MODE (result) == insn_mode
4206                  && REGNO (result) >= FIRST_PSEUDO_REGISTER))
4207             result = gen_reg_rtx (insn_mode);
4208
4209           insn = gen_cmpstrnsi (result, arg1_rtx, arg2_rtx, arg3_rtx,
4210                                 GEN_INT (MIN (arg1_align, arg2_align)));
4211         }
4212 #endif
4213
4214       if (insn)
4215         {
4216           enum machine_mode mode;
4217           emit_insn (insn);
4218
4219           /* Return the value in the proper mode for this function.  */
4220           mode = TYPE_MODE (TREE_TYPE (exp));
4221           if (GET_MODE (result) == mode)
4222             return result;
4223           if (target == 0)
4224             return convert_to_mode (mode, result, 0);
4225           convert_move (target, result, 0);
4226           return target;
4227         }
4228
4229       /* Expand the library call ourselves using a stabilized argument
4230          list to avoid re-evaluating the function's arguments twice.  */
4231 #ifdef HAVE_cmpstrnsi
4232     do_libcall:
4233 #endif
4234       fndecl = get_callee_fndecl (exp);
4235       fn = build_call_nofold_loc (EXPR_LOCATION (exp), fndecl, 2, arg1, arg2);
4236       gcc_assert (TREE_CODE (fn) == CALL_EXPR);
4237       CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (exp);
4238       return expand_call (fn, target, target == const0_rtx);
4239     }
4240 #endif
4241   return NULL_RTX;
4242 }
4243
4244 /* Expand expression EXP, which is a call to the strncmp builtin. Return
4245    NULL_RTX if we failed the caller should emit a normal call, otherwise try to get
4246    the result in TARGET, if convenient.  */
4247
4248 static rtx
4249 expand_builtin_strncmp (tree exp, ATTRIBUTE_UNUSED rtx target,
4250                         ATTRIBUTE_UNUSED enum machine_mode mode)
4251 {
4252   location_t loc ATTRIBUTE_UNUSED = EXPR_LOCATION (exp);
4253
4254   if (!validate_arglist (exp,
4255                          POINTER_TYPE, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
4256     return NULL_RTX;
4257
4258   /* If c_strlen can determine an expression for one of the string
4259      lengths, and it doesn't have side effects, then emit cmpstrnsi
4260      using length MIN(strlen(string)+1, arg3).  */
4261 #ifdef HAVE_cmpstrnsi
4262   if (HAVE_cmpstrnsi)
4263   {
4264     tree len, len1, len2;
4265     rtx arg1_rtx, arg2_rtx, arg3_rtx;
4266     rtx result, insn;
4267     tree fndecl, fn;
4268     tree arg1 = CALL_EXPR_ARG (exp, 0);
4269     tree arg2 = CALL_EXPR_ARG (exp, 1);
4270     tree arg3 = CALL_EXPR_ARG (exp, 2);
4271
4272     int arg1_align
4273       = get_pointer_alignment (arg1, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
4274     int arg2_align
4275       = get_pointer_alignment (arg2, BIGGEST_ALIGNMENT) / BITS_PER_UNIT;
4276     enum machine_mode insn_mode
4277       = insn_data[(int) CODE_FOR_cmpstrnsi].operand[0].mode;
4278
4279     len1 = c_strlen (arg1, 1);
4280     len2 = c_strlen (arg2, 1);
4281
4282     if (len1)
4283       len1 = size_binop_loc (loc, PLUS_EXPR, ssize_int (1), len1);
4284     if (len2)
4285       len2 = size_binop_loc (loc, PLUS_EXPR, ssize_int (1), len2);
4286
4287     /* If we don't have a constant length for the first, use the length
4288        of the second, if we know it.  We don't require a constant for
4289        this case; some cost analysis could be done if both are available
4290        but neither is constant.  For now, assume they're equally cheap,
4291        unless one has side effects.  If both strings have constant lengths,
4292        use the smaller.  */
4293
4294     if (!len1)
4295       len = len2;
4296     else if (!len2)
4297       len = len1;
4298     else if (TREE_SIDE_EFFECTS (len1))
4299       len = len2;
4300     else if (TREE_SIDE_EFFECTS (len2))
4301       len = len1;
4302     else if (TREE_CODE (len1) != INTEGER_CST)
4303       len = len2;
4304     else if (TREE_CODE (len2) != INTEGER_CST)
4305       len = len1;
4306     else if (tree_int_cst_lt (len1, len2))
4307       len = len1;
4308     else
4309       len = len2;
4310
4311     /* If both arguments have side effects, we cannot optimize.  */
4312     if (!len || TREE_SIDE_EFFECTS (len))
4313       return NULL_RTX;
4314
4315     /* The actual new length parameter is MIN(len,arg3).  */
4316     len = fold_build2_loc (loc, MIN_EXPR, TREE_TYPE (len), len,
4317                        fold_convert_loc (loc, TREE_TYPE (len), arg3));
4318
4319     /* If we don't have POINTER_TYPE, call the function.  */
4320     if (arg1_align == 0 || arg2_align == 0)
4321       return NULL_RTX;
4322
4323     /* Make a place to write the result of the instruction.  */
4324     result = target;
4325     if (! (result != 0
4326            && REG_P (result) && GET_MODE (result) == insn_mode
4327            && REGNO (result) >= FIRST_PSEUDO_REGISTER))
4328       result = gen_reg_rtx (insn_mode);
4329
4330     /* Stabilize the arguments in case gen_cmpstrnsi fails.  */
4331     arg1 = builtin_save_expr (arg1);
4332     arg2 = builtin_save_expr (arg2);
4333     len = builtin_save_expr (len);
4334
4335     arg1_rtx = get_memory_rtx (arg1, len);
4336     arg2_rtx = get_memory_rtx (arg2, len);
4337     arg3_rtx = expand_normal (len);
4338     insn = gen_cmpstrnsi (result, arg1_rtx, arg2_rtx, arg3_rtx,
4339                           GEN_INT (MIN (arg1_align, arg2_align)));
4340     if (insn)
4341       {
4342         emit_insn (insn);
4343
4344         /* Return the value in the proper mode for this function.  */
4345         mode = TYPE_MODE (TREE_TYPE (exp));
4346         if (GET_MODE (result) == mode)
4347           return result;
4348         if (target == 0)
4349           return convert_to_mode (mode, result, 0);
4350         convert_move (target, result, 0);
4351         return target;
4352       }
4353
4354     /* Expand the library call ourselves using a stabilized argument
4355        list to avoid re-evaluating the function's arguments twice.  */
4356     fndecl = get_callee_fndecl (exp);
4357     fn = build_call_nofold_loc (EXPR_LOCATION (exp), fndecl, 3,
4358                                 arg1, arg2, len);
4359     gcc_assert (TREE_CODE (fn) == CALL_EXPR);
4360     CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (exp);
4361     return expand_call (fn, target, target == const0_rtx);
4362   }
4363 #endif
4364   return NULL_RTX;
4365 }
4366
4367 /* Expand a call to __builtin_saveregs, generating the result in TARGET,
4368    if that's convenient.  */
4369
4370 rtx
4371 expand_builtin_saveregs (void)
4372 {
4373   rtx val, seq;
4374
4375   /* Don't do __builtin_saveregs more than once in a function.
4376      Save the result of the first call and reuse it.  */
4377   if (saveregs_value != 0)
4378     return saveregs_value;
4379
4380   /* When this function is called, it means that registers must be
4381      saved on entry to this function.  So we migrate the call to the
4382      first insn of this function.  */
4383
4384   start_sequence ();
4385
4386   /* Do whatever the machine needs done in this case.  */
4387   val = targetm.calls.expand_builtin_saveregs ();
4388
4389   seq = get_insns ();
4390   end_sequence ();
4391
4392   saveregs_value = val;
4393
4394   /* Put the insns after the NOTE that starts the function.  If this
4395      is inside a start_sequence, make the outer-level insn chain current, so
4396      the code is placed at the start of the function.  */
4397   push_topmost_sequence ();
4398   emit_insn_after (seq, entry_of_function ());
4399   pop_topmost_sequence ();
4400
4401   return val;
4402 }
4403
4404 /* __builtin_args_info (N) returns word N of the arg space info
4405    for the current function.  The number and meanings of words
4406    is controlled by the definition of CUMULATIVE_ARGS.  */
4407
4408 static rtx
4409 expand_builtin_args_info (tree exp)
4410 {
4411   int nwords = sizeof (CUMULATIVE_ARGS) / sizeof (int);
4412   int *word_ptr = (int *) &crtl->args.info;
4413
4414   gcc_assert (sizeof (CUMULATIVE_ARGS) % sizeof (int) == 0);
4415
4416   if (call_expr_nargs (exp) != 0)
4417     {
4418       if (!host_integerp (CALL_EXPR_ARG (exp, 0), 0))
4419         error ("argument of %<__builtin_args_info%> must be constant");
4420       else
4421         {
4422           HOST_WIDE_INT wordnum = tree_low_cst (CALL_EXPR_ARG (exp, 0), 0);
4423
4424           if (wordnum < 0 || wordnum >= nwords)
4425             error ("argument of %<__builtin_args_info%> out of range");
4426           else
4427             return GEN_INT (word_ptr[wordnum]);
4428         }
4429     }
4430   else
4431     error ("missing argument in %<__builtin_args_info%>");
4432
4433   return const0_rtx;
4434 }
4435
4436 /* Expand a call to __builtin_next_arg.  */
4437
4438 static rtx
4439 expand_builtin_next_arg (void)
4440 {
4441   /* Checking arguments is already done in fold_builtin_next_arg
4442      that must be called before this function.  */
4443   return expand_binop (ptr_mode, add_optab,
4444                        crtl->args.internal_arg_pointer,
4445                        crtl->args.arg_offset_rtx,
4446                        NULL_RTX, 0, OPTAB_LIB_WIDEN);
4447 }
4448
4449 /* Make it easier for the backends by protecting the valist argument
4450    from multiple evaluations.  */
4451
4452 static tree
4453 stabilize_va_list_loc (location_t loc, tree valist, int needs_lvalue)
4454 {
4455   tree vatype = targetm.canonical_va_list_type (TREE_TYPE (valist));
4456
4457   /* The current way of determining the type of valist is completely
4458      bogus.  We should have the information on the va builtin instead.  */
4459   if (!vatype)
4460     vatype = targetm.fn_abi_va_list (cfun->decl);
4461
4462   if (TREE_CODE (vatype) == ARRAY_TYPE)
4463     {
4464       if (TREE_SIDE_EFFECTS (valist))
4465         valist = save_expr (valist);
4466
4467       /* For this case, the backends will be expecting a pointer to
4468          vatype, but it's possible we've actually been given an array
4469          (an actual TARGET_CANONICAL_VA_LIST_TYPE (valist)).
4470          So fix it.  */
4471       if (TREE_CODE (TREE_TYPE (valist)) == ARRAY_TYPE)
4472         {
4473           tree p1 = build_pointer_type (TREE_TYPE (vatype));
4474           valist = build_fold_addr_expr_with_type_loc (loc, valist, p1);
4475         }
4476     }
4477   else
4478     {
4479       tree pt = build_pointer_type (vatype);
4480
4481       if (! needs_lvalue)
4482         {
4483           if (! TREE_SIDE_EFFECTS (valist))
4484             return valist;
4485
4486           valist = fold_build1_loc (loc, ADDR_EXPR, pt, valist);
4487           TREE_SIDE_EFFECTS (valist) = 1;
4488         }
4489
4490       if (TREE_SIDE_EFFECTS (valist))
4491         valist = save_expr (valist);
4492       valist = fold_build2_loc (loc, MEM_REF,
4493                                 vatype, valist, build_int_cst (pt, 0));
4494     }
4495
4496   return valist;
4497 }
4498
4499 /* The "standard" definition of va_list is void*.  */
4500
4501 tree
4502 std_build_builtin_va_list (void)
4503 {
4504   return ptr_type_node;
4505 }
4506
4507 /* The "standard" abi va_list is va_list_type_node.  */
4508
4509 tree
4510 std_fn_abi_va_list (tree fndecl ATTRIBUTE_UNUSED)
4511 {
4512   return va_list_type_node;
4513 }
4514
4515 /* The "standard" type of va_list is va_list_type_node.  */
4516
4517 tree
4518 std_canonical_va_list_type (tree type)
4519 {
4520   tree wtype, htype;
4521
4522   if (INDIRECT_REF_P (type))
4523     type = TREE_TYPE (type);
4524   else if (POINTER_TYPE_P (type) && POINTER_TYPE_P (TREE_TYPE(type)))
4525     type = TREE_TYPE (type);
4526   wtype = va_list_type_node;
4527   htype = type;
4528   /* Treat structure va_list types.  */
4529   if (TREE_CODE (wtype) == RECORD_TYPE && POINTER_TYPE_P (htype))
4530     htype = TREE_TYPE (htype);
4531   else if (TREE_CODE (wtype) == ARRAY_TYPE)
4532     {
4533       /* If va_list is an array type, the argument may have decayed
4534          to a pointer type, e.g. by being passed to another function.
4535          In that case, unwrap both types so that we can compare the
4536          underlying records.  */
4537       if (TREE_CODE (htype) == ARRAY_TYPE
4538           || POINTER_TYPE_P (htype))
4539         {
4540           wtype = TREE_TYPE (wtype);
4541           htype = TREE_TYPE (htype);
4542         }
4543     }
4544   if (TYPE_MAIN_VARIANT (wtype) == TYPE_MAIN_VARIANT (htype))
4545     return va_list_type_node;
4546
4547   return NULL_TREE;
4548 }
4549
4550 /* The "standard" implementation of va_start: just assign `nextarg' to
4551    the variable.  */
4552
4553 void
4554 std_expand_builtin_va_start (tree valist, rtx nextarg)
4555 {
4556   rtx va_r = expand_expr (valist, NULL_RTX, VOIDmode, EXPAND_WRITE);
4557   convert_move (va_r, nextarg, 0);
4558 }
4559
4560 /* Expand EXP, a call to __builtin_va_start.  */
4561
4562 static rtx
4563 expand_builtin_va_start (tree exp)
4564 {
4565   rtx nextarg;
4566   tree valist;
4567   location_t loc = EXPR_LOCATION (exp);
4568
4569   if (call_expr_nargs (exp) < 2)
4570     {
4571       error_at (loc, "too few arguments to function %<va_start%>");
4572       return const0_rtx;
4573     }
4574
4575   if (fold_builtin_next_arg (exp, true))
4576     return const0_rtx;
4577
4578   nextarg = expand_builtin_next_arg ();
4579   valist = stabilize_va_list_loc (loc, CALL_EXPR_ARG (exp, 0), 1);
4580
4581   if (targetm.expand_builtin_va_start)
4582     targetm.expand_builtin_va_start (valist, nextarg);
4583   else
4584     std_expand_builtin_va_start (valist, nextarg);
4585
4586   return const0_rtx;
4587 }
4588
4589 /* The "standard" implementation of va_arg: read the value from the
4590    current (padded) address and increment by the (padded) size.  */
4591
4592 tree
4593 std_gimplify_va_arg_expr (tree valist, tree type, gimple_seq *pre_p,
4594                           gimple_seq *post_p)
4595 {
4596   tree addr, t, type_size, rounded_size, valist_tmp;
4597   unsigned HOST_WIDE_INT align, boundary;
4598   bool indirect;
4599
4600 #ifdef ARGS_GROW_DOWNWARD
4601   /* All of the alignment and movement below is for args-grow-up machines.
4602      As of 2004, there are only 3 ARGS_GROW_DOWNWARD targets, and they all
4603      implement their own specialized gimplify_va_arg_expr routines.  */
4604   gcc_unreachable ();
4605 #endif
4606
4607   indirect = pass_by_reference (NULL, TYPE_MODE (type), type, false);
4608   if (indirect)
4609     type = build_pointer_type (type);
4610
4611   align = PARM_BOUNDARY / BITS_PER_UNIT;
4612   boundary = FUNCTION_ARG_BOUNDARY (TYPE_MODE (type), type);
4613
4614   /* When we align parameter on stack for caller, if the parameter
4615      alignment is beyond MAX_SUPPORTED_STACK_ALIGNMENT, it will be
4616      aligned at MAX_SUPPORTED_STACK_ALIGNMENT.  We will match callee
4617      here with caller.  */
4618   if (boundary > MAX_SUPPORTED_STACK_ALIGNMENT)
4619     boundary = MAX_SUPPORTED_STACK_ALIGNMENT;
4620
4621   boundary /= BITS_PER_UNIT;
4622
4623   /* Hoist the valist value into a temporary for the moment.  */
4624   valist_tmp = get_initialized_tmp_var (valist, pre_p, NULL);
4625
4626   /* va_list pointer is aligned to PARM_BOUNDARY.  If argument actually
4627      requires greater alignment, we must perform dynamic alignment.  */
4628   if (boundary > align
4629       && !integer_zerop (TYPE_SIZE (type)))
4630     {
4631       t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
4632                   fold_build2 (POINTER_PLUS_EXPR,
4633                                TREE_TYPE (valist),
4634                                valist_tmp, size_int (boundary - 1)));
4635       gimplify_and_add (t, pre_p);
4636
4637       t = fold_convert (sizetype, valist_tmp);
4638       t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist_tmp,
4639                   fold_convert (TREE_TYPE (valist),
4640                                 fold_build2 (BIT_AND_EXPR, sizetype, t,
4641                                              size_int (-boundary))));
4642       gimplify_and_add (t, pre_p);
4643     }
4644   else
4645     boundary = align;
4646
4647   /* If the actual alignment is less than the alignment of the type,
4648      adjust the type accordingly so that we don't assume strict alignment
4649      when dereferencing the pointer.  */
4650   boundary *= BITS_PER_UNIT;
4651   if (boundary < TYPE_ALIGN (type))
4652     {
4653       type = build_variant_type_copy (type);
4654       TYPE_ALIGN (type) = boundary;
4655     }
4656
4657   /* Compute the rounded size of the type.  */
4658   type_size = size_in_bytes (type);
4659   rounded_size = round_up (type_size, align);
4660
4661   /* Reduce rounded_size so it's sharable with the postqueue.  */
4662   gimplify_expr (&rounded_size, pre_p, post_p, is_gimple_val, fb_rvalue);
4663
4664   /* Get AP.  */
4665   addr = valist_tmp;
4666   if (PAD_VARARGS_DOWN && !integer_zerop (rounded_size))
4667     {
4668       /* Small args are padded downward.  */
4669       t = fold_build2_loc (input_location, GT_EXPR, sizetype,
4670                        rounded_size, size_int (align));
4671       t = fold_build3 (COND_EXPR, sizetype, t, size_zero_node,
4672                        size_binop (MINUS_EXPR, rounded_size, type_size));
4673       addr = fold_build2 (POINTER_PLUS_EXPR,
4674                           TREE_TYPE (addr), addr, t);
4675     }
4676
4677   /* Compute new value for AP.  */
4678   t = build2 (POINTER_PLUS_EXPR, TREE_TYPE (valist), valist_tmp, rounded_size);
4679   t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist, t);
4680   gimplify_and_add (t, pre_p);
4681
4682   addr = fold_convert (build_pointer_type (type), addr);
4683
4684   if (indirect)
4685     addr = build_va_arg_indirect_ref (addr);
4686
4687   return build_va_arg_indirect_ref (addr);
4688 }
4689
4690 /* Build an indirect-ref expression over the given TREE, which represents a
4691    piece of a va_arg() expansion.  */
4692 tree
4693 build_va_arg_indirect_ref (tree addr)
4694 {
4695   addr = build_fold_indirect_ref_loc (EXPR_LOCATION (addr), addr);
4696
4697   if (flag_mudflap) /* Don't instrument va_arg INDIRECT_REF.  */
4698     mf_mark (addr);
4699
4700   return addr;
4701 }
4702
4703 /* Return a dummy expression of type TYPE in order to keep going after an
4704    error.  */
4705
4706 static tree
4707 dummy_object (tree type)
4708 {
4709   tree t = build_int_cst (build_pointer_type (type), 0);
4710   return build1 (INDIRECT_REF, type, t);
4711 }
4712
4713 /* Gimplify __builtin_va_arg, aka VA_ARG_EXPR, which is not really a
4714    builtin function, but a very special sort of operator.  */
4715
4716 enum gimplify_status
4717 gimplify_va_arg_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
4718 {
4719   tree promoted_type, have_va_type;
4720   tree valist = TREE_OPERAND (*expr_p, 0);
4721   tree type = TREE_TYPE (*expr_p);
4722   tree t;
4723   location_t loc = EXPR_LOCATION (*expr_p);
4724
4725   /* Verify that valist is of the proper type.  */
4726   have_va_type = TREE_TYPE (valist);
4727   if (have_va_type == error_mark_node)
4728     return GS_ERROR;
4729   have_va_type = targetm.canonical_va_list_type (have_va_type);
4730
4731   if (have_va_type == NULL_TREE)
4732     {
4733       error_at (loc, "first argument to %<va_arg%> not of type %<va_list%>");
4734       return GS_ERROR;
4735     }
4736
4737   /* Generate a diagnostic for requesting data of a type that cannot
4738      be passed through `...' due to type promotion at the call site.  */
4739   if ((promoted_type = lang_hooks.types.type_promotes_to (type))
4740            != type)
4741     {
4742       static bool gave_help;
4743       bool warned;
4744
4745       /* Unfortunately, this is merely undefined, rather than a constraint
4746          violation, so we cannot make this an error.  If this call is never
4747          executed, the program is still strictly conforming.  */
4748       warned = warning_at (loc, 0,
4749                            "%qT is promoted to %qT when passed through %<...%>",
4750                            type, promoted_type);
4751       if (!gave_help && warned)
4752         {
4753           gave_help = true;
4754           inform (loc, "(so you should pass %qT not %qT to %<va_arg%>)",
4755                   promoted_type, type);
4756         }
4757
4758       /* We can, however, treat "undefined" any way we please.
4759          Call abort to encourage the user to fix the program.  */
4760       if (warned)
4761         inform (loc, "if this code is reached, the program will abort");
4762       /* Before the abort, allow the evaluation of the va_list
4763          expression to exit or longjmp.  */
4764       gimplify_and_add (valist, pre_p);
4765       t = build_call_expr_loc (loc,
4766                                implicit_built_in_decls[BUILT_IN_TRAP], 0);
4767       gimplify_and_add (t, pre_p);
4768
4769       /* This is dead code, but go ahead and finish so that the
4770          mode of the result comes out right.  */
4771       *expr_p = dummy_object (type);
4772       return GS_ALL_DONE;
4773     }
4774   else
4775     {
4776       /* Make it easier for the backends by protecting the valist argument
4777          from multiple evaluations.  */
4778       if (TREE_CODE (have_va_type) == ARRAY_TYPE)
4779         {
4780           /* For this case, the backends will be expecting a pointer to
4781              TREE_TYPE (abi), but it's possible we've
4782              actually been given an array (an actual TARGET_FN_ABI_VA_LIST).
4783              So fix it.  */
4784           if (TREE_CODE (TREE_TYPE (valist)) == ARRAY_TYPE)
4785             {
4786               tree p1 = build_pointer_type (TREE_TYPE (have_va_type));
4787               valist = fold_convert_loc (loc, p1,
4788                                          build_fold_addr_expr_loc (loc, valist));
4789             }
4790
4791           gimplify_expr (&valist, pre_p, post_p, is_gimple_val, fb_rvalue);
4792         }
4793       else
4794         gimplify_expr (&valist, pre_p, post_p, is_gimple_min_lval, fb_lvalue);
4795
4796       if (!targetm.gimplify_va_arg_expr)
4797         /* FIXME: Once most targets are converted we should merely
4798            assert this is non-null.  */
4799         return GS_ALL_DONE;
4800
4801       *expr_p = targetm.gimplify_va_arg_expr (valist, type, pre_p, post_p);
4802       return GS_OK;
4803     }
4804 }
4805
4806 /* Expand EXP, a call to __builtin_va_end.  */
4807
4808 static rtx
4809 expand_builtin_va_end (tree exp)
4810 {
4811   tree valist = CALL_EXPR_ARG (exp, 0);
4812
4813   /* Evaluate for side effects, if needed.  I hate macros that don't
4814      do that.  */
4815   if (TREE_SIDE_EFFECTS (valist))
4816     expand_expr (valist, const0_rtx, VOIDmode, EXPAND_NORMAL);
4817
4818   return const0_rtx;
4819 }
4820
4821 /* Expand EXP, a call to __builtin_va_copy.  We do this as a
4822    builtin rather than just as an assignment in stdarg.h because of the
4823    nastiness of array-type va_list types.  */
4824
4825 static rtx
4826 expand_builtin_va_copy (tree exp)
4827 {
4828   tree dst, src, t;
4829   location_t loc = EXPR_LOCATION (exp);
4830
4831   dst = CALL_EXPR_ARG (exp, 0);
4832   src = CALL_EXPR_ARG (exp, 1);
4833
4834   dst = stabilize_va_list_loc (loc, dst, 1);
4835   src = stabilize_va_list_loc (loc, src, 0);
4836
4837   gcc_assert (cfun != NULL && cfun->decl != NULL_TREE);
4838
4839   if (TREE_CODE (targetm.fn_abi_va_list (cfun->decl)) != ARRAY_TYPE)
4840     {
4841       t = build2 (MODIFY_EXPR, targetm.fn_abi_va_list (cfun->decl), dst, src);
4842       TREE_SIDE_EFFECTS (t) = 1;
4843       expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
4844     }
4845   else
4846     {
4847       rtx dstb, srcb, size;
4848
4849       /* Evaluate to pointers.  */
4850       dstb = expand_expr (dst, NULL_RTX, Pmode, EXPAND_NORMAL);
4851       srcb = expand_expr (src, NULL_RTX, Pmode, EXPAND_NORMAL);
4852       size = expand_expr (TYPE_SIZE_UNIT (targetm.fn_abi_va_list (cfun->decl)),
4853                   NULL_RTX, VOIDmode, EXPAND_NORMAL);
4854
4855       dstb = convert_memory_address (Pmode, dstb);
4856       srcb = convert_memory_address (Pmode, srcb);
4857
4858       /* "Dereference" to BLKmode memories.  */
4859       dstb = gen_rtx_MEM (BLKmode, dstb);
4860       set_mem_alias_set (dstb, get_alias_set (TREE_TYPE (TREE_TYPE (dst))));
4861       set_mem_align (dstb, TYPE_ALIGN (targetm.fn_abi_va_list (cfun->decl)));
4862       srcb = gen_rtx_MEM (BLKmode, srcb);
4863       set_mem_alias_set (srcb, get_alias_set (TREE_TYPE (TREE_TYPE (src))));
4864       set_mem_align (srcb, TYPE_ALIGN (targetm.fn_abi_va_list (cfun->decl)));
4865
4866       /* Copy.  */
4867       emit_block_move (dstb, srcb, size, BLOCK_OP_NORMAL);
4868     }
4869
4870   return const0_rtx;
4871 }
4872
4873 /* Expand a call to one of the builtin functions __builtin_frame_address or
4874    __builtin_return_address.  */
4875
4876 static rtx
4877 expand_builtin_frame_address (tree fndecl, tree exp)
4878 {
4879   /* The argument must be a nonnegative integer constant.
4880      It counts the number of frames to scan up the stack.
4881      The value is the return address saved in that frame.  */
4882   if (call_expr_nargs (exp) == 0)
4883     /* Warning about missing arg was already issued.  */
4884     return const0_rtx;
4885   else if (! host_integerp (CALL_EXPR_ARG (exp, 0), 1))
4886     {
4887       if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FRAME_ADDRESS)
4888         error ("invalid argument to %<__builtin_frame_address%>");
4889       else
4890         error ("invalid argument to %<__builtin_return_address%>");
4891       return const0_rtx;
4892     }
4893   else
4894     {
4895       rtx tem
4896         = expand_builtin_return_addr (DECL_FUNCTION_CODE (fndecl),
4897                                       tree_low_cst (CALL_EXPR_ARG (exp, 0), 1));
4898
4899       /* Some ports cannot access arbitrary stack frames.  */
4900       if (tem == NULL)
4901         {
4902           if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FRAME_ADDRESS)
4903             warning (0, "unsupported argument to %<__builtin_frame_address%>");
4904           else
4905             warning (0, "unsupported argument to %<__builtin_return_address%>");
4906           return const0_rtx;
4907         }
4908
4909       /* For __builtin_frame_address, return what we've got.  */
4910       if (DECL_FUNCTION_CODE (fndecl) == BUILT_IN_FRAME_ADDRESS)
4911         return tem;
4912
4913       if (!REG_P (tem)
4914           && ! CONSTANT_P (tem))
4915         tem = copy_to_mode_reg (Pmode, tem);
4916       return tem;
4917     }
4918 }
4919
4920 /* Expand EXP, a call to the alloca builtin.  Return NULL_RTX if
4921    we failed and the caller should emit a normal call, otherwise try to get
4922    the result in TARGET, if convenient.  */
4923
4924 static rtx
4925 expand_builtin_alloca (tree exp, rtx target)
4926 {
4927   rtx op0;
4928   rtx result;
4929
4930   /* Emit normal call if marked not-inlineable.  */
4931   if (CALL_CANNOT_INLINE_P (exp))
4932     return NULL_RTX;
4933
4934   if (!validate_arglist (exp, INTEGER_TYPE, VOID_TYPE))
4935     return NULL_RTX;
4936
4937   /* Compute the argument.  */
4938   op0 = expand_normal (CALL_EXPR_ARG (exp, 0));
4939
4940   /* Allocate the desired space.  */
4941   result = allocate_dynamic_stack_space (op0, target, BITS_PER_UNIT);
4942   result = convert_memory_address (ptr_mode, result);
4943
4944   return result;
4945 }
4946
4947 /* Expand a call to a bswap builtin with argument ARG0.  MODE
4948    is the mode to expand with.  */
4949
4950 static rtx
4951 expand_builtin_bswap (tree exp, rtx target, rtx subtarget)
4952 {
4953   enum machine_mode mode;
4954   tree arg;
4955   rtx op0;
4956
4957   if (!validate_arglist (exp, INTEGER_TYPE, VOID_TYPE))
4958     return NULL_RTX;
4959
4960   arg = CALL_EXPR_ARG (exp, 0);
4961   mode = TYPE_MODE (TREE_TYPE (arg));
4962   op0 = expand_expr (arg, subtarget, VOIDmode, EXPAND_NORMAL);
4963
4964   target = expand_unop (mode, bswap_optab, op0, target, 1);
4965
4966   gcc_assert (target);
4967
4968   return convert_to_mode (mode, target, 0);
4969 }
4970
4971 /* Expand a call to a unary builtin in EXP.
4972    Return NULL_RTX if a normal call should be emitted rather than expanding the
4973    function in-line.  If convenient, the result should be placed in TARGET.
4974    SUBTARGET may be used as the target for computing one of EXP's operands.  */
4975
4976 static rtx
4977 expand_builtin_unop (enum machine_mode target_mode, tree exp, rtx target,
4978                      rtx subtarget, optab op_optab)
4979 {
4980   rtx op0;
4981
4982   if (!validate_arglist (exp, INTEGER_TYPE, VOID_TYPE))
4983     return NULL_RTX;
4984
4985   /* Compute the argument.  */
4986   op0 = expand_expr (CALL_EXPR_ARG (exp, 0), subtarget,
4987                      VOIDmode, EXPAND_NORMAL);
4988   /* Compute op, into TARGET if possible.
4989      Set TARGET to wherever the result comes back.  */
4990   target = expand_unop (TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 0))),
4991                         op_optab, op0, target, 1);
4992   gcc_assert (target);
4993
4994   return convert_to_mode (target_mode, target, 0);
4995 }
4996
4997 /* Expand a call to __builtin_expect.  We just return our argument
4998    as the builtin_expect semantic should've been already executed by
4999    tree branch prediction pass. */
5000
5001 static rtx
5002 expand_builtin_expect (tree exp, rtx target)
5003 {
5004   tree arg;
5005
5006   if (call_expr_nargs (exp) < 2)
5007     return const0_rtx;
5008   arg = CALL_EXPR_ARG (exp, 0);
5009
5010   target = expand_expr (arg, target, VOIDmode, EXPAND_NORMAL);
5011   /* When guessing was done, the hints should be already stripped away.  */
5012   gcc_assert (!flag_guess_branch_prob
5013               || optimize == 0 || seen_error ());
5014   return target;
5015 }
5016
5017 void
5018 expand_builtin_trap (void)
5019 {
5020 #ifdef HAVE_trap
5021   if (HAVE_trap)
5022     emit_insn (gen_trap ());
5023   else
5024 #endif
5025     emit_library_call (abort_libfunc, LCT_NORETURN, VOIDmode, 0);
5026   emit_barrier ();
5027 }
5028
5029 /* Expand a call to __builtin_unreachable.  We do nothing except emit
5030    a barrier saying that control flow will not pass here.
5031
5032    It is the responsibility of the program being compiled to ensure
5033    that control flow does never reach __builtin_unreachable.  */
5034 static void
5035 expand_builtin_unreachable (void)
5036 {
5037   emit_barrier ();
5038 }
5039
5040 /* Expand EXP, a call to fabs, fabsf or fabsl.
5041    Return NULL_RTX if a normal call should be emitted rather than expanding
5042    the function inline.  If convenient, the result should be placed
5043    in TARGET.  SUBTARGET may be used as the target for computing
5044    the operand.  */
5045
5046 static rtx
5047 expand_builtin_fabs (tree exp, rtx target, rtx subtarget)
5048 {
5049   enum machine_mode mode;
5050   tree arg;
5051   rtx op0;
5052
5053   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
5054     return NULL_RTX;
5055
5056   arg = CALL_EXPR_ARG (exp, 0);
5057   CALL_EXPR_ARG (exp, 0) = arg = builtin_save_expr (arg);
5058   mode = TYPE_MODE (TREE_TYPE (arg));
5059   op0 = expand_expr (arg, subtarget, VOIDmode, EXPAND_NORMAL);
5060   return expand_abs (mode, op0, target, 0, safe_from_p (target, arg, 1));
5061 }
5062
5063 /* Expand EXP, a call to copysign, copysignf, or copysignl.
5064    Return NULL is a normal call should be emitted rather than expanding the
5065    function inline.  If convenient, the result should be placed in TARGET.
5066    SUBTARGET may be used as the target for computing the operand.  */
5067
5068 static rtx
5069 expand_builtin_copysign (tree exp, rtx target, rtx subtarget)
5070 {
5071   rtx op0, op1;
5072   tree arg;
5073
5074   if (!validate_arglist (exp, REAL_TYPE, REAL_TYPE, VOID_TYPE))
5075     return NULL_RTX;
5076
5077   arg = CALL_EXPR_ARG (exp, 0);
5078   op0 = expand_expr (arg, subtarget, VOIDmode, EXPAND_NORMAL);
5079
5080   arg = CALL_EXPR_ARG (exp, 1);
5081   op1 = expand_normal (arg);
5082
5083   return expand_copysign (op0, op1, target);
5084 }
5085
5086 /* Create a new constant string literal and return a char* pointer to it.
5087    The STRING_CST value is the LEN characters at STR.  */
5088 tree
5089 build_string_literal (int len, const char *str)
5090 {
5091   tree t, elem, index, type;
5092
5093   t = build_string (len, str);
5094   elem = build_type_variant (char_type_node, 1, 0);
5095   index = build_index_type (size_int (len - 1));
5096   type = build_array_type (elem, index);
5097   TREE_TYPE (t) = type;
5098   TREE_CONSTANT (t) = 1;
5099   TREE_READONLY (t) = 1;
5100   TREE_STATIC (t) = 1;
5101
5102   type = build_pointer_type (elem);
5103   t = build1 (ADDR_EXPR, type,
5104               build4 (ARRAY_REF, elem,
5105                       t, integer_zero_node, NULL_TREE, NULL_TREE));
5106   return t;
5107 }
5108
5109 /* Expand a call to either the entry or exit function profiler.  */
5110
5111 static rtx
5112 expand_builtin_profile_func (bool exitp)
5113 {
5114   rtx this_rtx, which;
5115
5116   this_rtx = DECL_RTL (current_function_decl);
5117   gcc_assert (MEM_P (this_rtx));
5118   this_rtx = XEXP (this_rtx, 0);
5119
5120   if (exitp)
5121     which = profile_function_exit_libfunc;
5122   else
5123     which = profile_function_entry_libfunc;
5124
5125   emit_library_call (which, LCT_NORMAL, VOIDmode, 2, this_rtx, Pmode,
5126                      expand_builtin_return_addr (BUILT_IN_RETURN_ADDRESS,
5127                                                  0),
5128                      Pmode);
5129
5130   return const0_rtx;
5131 }
5132
5133 /* Expand a call to __builtin___clear_cache.  */
5134
5135 static rtx
5136 expand_builtin___clear_cache (tree exp ATTRIBUTE_UNUSED)
5137 {
5138 #ifndef HAVE_clear_cache
5139 #ifdef CLEAR_INSN_CACHE
5140   /* There is no "clear_cache" insn, and __clear_cache() in libgcc
5141      does something.  Just do the default expansion to a call to
5142      __clear_cache().  */
5143   return NULL_RTX;
5144 #else
5145   /* There is no "clear_cache" insn, and __clear_cache() in libgcc
5146      does nothing.  There is no need to call it.  Do nothing.  */
5147   return const0_rtx;
5148 #endif /* CLEAR_INSN_CACHE */
5149 #else
5150   /* We have a "clear_cache" insn, and it will handle everything.  */
5151   tree begin, end;
5152   rtx begin_rtx, end_rtx;
5153   enum insn_code icode;
5154
5155   /* We must not expand to a library call.  If we did, any
5156      fallback library function in libgcc that might contain a call to
5157      __builtin___clear_cache() would recurse infinitely.  */
5158   if (!validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
5159     {
5160       error ("both arguments to %<__builtin___clear_cache%> must be pointers");
5161       return const0_rtx;
5162     }
5163
5164   if (HAVE_clear_cache)
5165     {
5166       icode = CODE_FOR_clear_cache;
5167
5168       begin = CALL_EXPR_ARG (exp, 0);
5169       begin_rtx = expand_expr (begin, NULL_RTX, Pmode, EXPAND_NORMAL);
5170       begin_rtx = convert_memory_address (Pmode, begin_rtx);
5171       if (!insn_data[icode].operand[0].predicate (begin_rtx, Pmode))
5172         begin_rtx = copy_to_mode_reg (Pmode, begin_rtx);
5173
5174       end = CALL_EXPR_ARG (exp, 1);
5175       end_rtx = expand_expr (end, NULL_RTX, Pmode, EXPAND_NORMAL);
5176       end_rtx = convert_memory_address (Pmode, end_rtx);
5177       if (!insn_data[icode].operand[1].predicate (end_rtx, Pmode))
5178         end_rtx = copy_to_mode_reg (Pmode, end_rtx);
5179
5180       emit_insn (gen_clear_cache (begin_rtx, end_rtx));
5181     }
5182   return const0_rtx;
5183 #endif /* HAVE_clear_cache */
5184 }
5185
5186 /* Given a trampoline address, make sure it satisfies TRAMPOLINE_ALIGNMENT.  */
5187
5188 static rtx
5189 round_trampoline_addr (rtx tramp)
5190 {
5191   rtx temp, addend, mask;
5192
5193   /* If we don't need too much alignment, we'll have been guaranteed
5194      proper alignment by get_trampoline_type.  */
5195   if (TRAMPOLINE_ALIGNMENT <= STACK_BOUNDARY)
5196     return tramp;
5197
5198   /* Round address up to desired boundary.  */
5199   temp = gen_reg_rtx (Pmode);
5200   addend = GEN_INT (TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT - 1);
5201   mask = GEN_INT (-TRAMPOLINE_ALIGNMENT / BITS_PER_UNIT);
5202
5203   temp  = expand_simple_binop (Pmode, PLUS, tramp, addend,
5204                                temp, 0, OPTAB_LIB_WIDEN);
5205   tramp = expand_simple_binop (Pmode, AND, temp, mask,
5206                                temp, 0, OPTAB_LIB_WIDEN);
5207
5208   return tramp;
5209 }
5210
5211 static rtx
5212 expand_builtin_init_trampoline (tree exp)
5213 {
5214   tree t_tramp, t_func, t_chain;
5215   rtx m_tramp, r_tramp, r_chain, tmp;
5216
5217   if (!validate_arglist (exp, POINTER_TYPE, POINTER_TYPE,
5218                          POINTER_TYPE, VOID_TYPE))
5219     return NULL_RTX;
5220
5221   t_tramp = CALL_EXPR_ARG (exp, 0);
5222   t_func = CALL_EXPR_ARG (exp, 1);
5223   t_chain = CALL_EXPR_ARG (exp, 2);
5224
5225   r_tramp = expand_normal (t_tramp);
5226   m_tramp = gen_rtx_MEM (BLKmode, r_tramp);
5227   MEM_NOTRAP_P (m_tramp) = 1;
5228
5229   /* The TRAMP argument should be the address of a field within the
5230      local function's FRAME decl.  Let's see if we can fill in the
5231      to fill in the MEM_ATTRs for this memory.  */
5232   if (TREE_CODE (t_tramp) == ADDR_EXPR)
5233     set_mem_attributes_minus_bitpos (m_tramp, TREE_OPERAND (t_tramp, 0),
5234                                      true, 0);
5235
5236   tmp = round_trampoline_addr (r_tramp);
5237   if (tmp != r_tramp)
5238     {
5239       m_tramp = change_address (m_tramp, BLKmode, tmp);
5240       set_mem_align (m_tramp, TRAMPOLINE_ALIGNMENT);
5241       set_mem_size (m_tramp, GEN_INT (TRAMPOLINE_SIZE));
5242     }
5243
5244   /* The FUNC argument should be the address of the nested function.
5245      Extract the actual function decl to pass to the hook.  */
5246   gcc_assert (TREE_CODE (t_func) == ADDR_EXPR);
5247   t_func = TREE_OPERAND (t_func, 0);
5248   gcc_assert (TREE_CODE (t_func) == FUNCTION_DECL);
5249
5250   r_chain = expand_normal (t_chain);
5251
5252   /* Generate insns to initialize the trampoline.  */
5253   targetm.calls.trampoline_init (m_tramp, t_func, r_chain);
5254
5255   trampolines_created = 1;
5256   return const0_rtx;
5257 }
5258
5259 static rtx
5260 expand_builtin_adjust_trampoline (tree exp)
5261 {
5262   rtx tramp;
5263
5264   if (!validate_arglist (exp, POINTER_TYPE, VOID_TYPE))
5265     return NULL_RTX;
5266
5267   tramp = expand_normal (CALL_EXPR_ARG (exp, 0));
5268   tramp = round_trampoline_addr (tramp);
5269   if (targetm.calls.trampoline_adjust_address)
5270     tramp = targetm.calls.trampoline_adjust_address (tramp);
5271
5272   return tramp;
5273 }
5274
5275 /* Expand the call EXP to the built-in signbit, signbitf or signbitl
5276    function.  The function first checks whether the back end provides
5277    an insn to implement signbit for the respective mode.  If not, it
5278    checks whether the floating point format of the value is such that
5279    the sign bit can be extracted.  If that is not the case, the
5280    function returns NULL_RTX to indicate that a normal call should be
5281    emitted rather than expanding the function in-line.  EXP is the
5282    expression that is a call to the builtin function; if convenient,
5283    the result should be placed in TARGET.  */
5284 static rtx
5285 expand_builtin_signbit (tree exp, rtx target)
5286 {
5287   const struct real_format *fmt;
5288   enum machine_mode fmode, imode, rmode;
5289   tree arg;
5290   int word, bitpos;
5291   enum insn_code icode;
5292   rtx temp;
5293   location_t loc = EXPR_LOCATION (exp);
5294
5295   if (!validate_arglist (exp, REAL_TYPE, VOID_TYPE))
5296     return NULL_RTX;
5297
5298   arg = CALL_EXPR_ARG (exp, 0);
5299   fmode = TYPE_MODE (TREE_TYPE (arg));
5300   rmode = TYPE_MODE (TREE_TYPE (exp));
5301   fmt = REAL_MODE_FORMAT (fmode);
5302
5303   arg = builtin_save_expr (arg);
5304
5305   /* Expand the argument yielding a RTX expression. */
5306   temp = expand_normal (arg);
5307
5308   /* Check if the back end provides an insn that handles signbit for the
5309      argument's mode. */
5310   icode = optab_handler (signbit_optab, fmode);
5311   if (icode != CODE_FOR_nothing)
5312     {
5313       rtx last = get_last_insn ();
5314       target = gen_reg_rtx (TYPE_MODE (TREE_TYPE (exp)));
5315       if (maybe_emit_unop_insn (icode, target, temp, UNKNOWN))
5316         return target;
5317       delete_insns_since (last);
5318     }
5319
5320   /* For floating point formats without a sign bit, implement signbit
5321      as "ARG < 0.0".  */
5322   bitpos = fmt->signbit_ro;
5323   if (bitpos < 0)
5324   {
5325     /* But we can't do this if the format supports signed zero.  */
5326     if (fmt->has_signed_zero && HONOR_SIGNED_ZEROS (fmode))
5327       return NULL_RTX;
5328
5329     arg = fold_build2_loc (loc, LT_EXPR, TREE_TYPE (exp), arg,
5330                        build_real (TREE_TYPE (arg), dconst0));
5331     return expand_expr (arg, target, VOIDmode, EXPAND_NORMAL);
5332   }
5333
5334   if (GET_MODE_SIZE (fmode) <= UNITS_PER_WORD)
5335     {
5336       imode = int_mode_for_mode (fmode);
5337       if (imode == BLKmode)
5338         return NULL_RTX;
5339       temp = gen_lowpart (imode, temp);
5340     }
5341   else
5342     {
5343       imode = word_mode;
5344       /* Handle targets with different FP word orders.  */
5345       if (FLOAT_WORDS_BIG_ENDIAN)
5346         word = (GET_MODE_BITSIZE (fmode) - bitpos) / BITS_PER_WORD;
5347       else
5348         word = bitpos / BITS_PER_WORD;
5349       temp = operand_subword_force (temp, word, fmode);
5350       bitpos = bitpos % BITS_PER_WORD;
5351     }
5352
5353   /* Force the intermediate word_mode (or narrower) result into a
5354      register.  This avoids attempting to create paradoxical SUBREGs
5355      of floating point modes below.  */
5356   temp = force_reg (imode, temp);
5357
5358   /* If the bitpos is within the "result mode" lowpart, the operation
5359      can be implement with a single bitwise AND.  Otherwise, we need
5360      a right shift and an AND.  */
5361
5362   if (bitpos < GET_MODE_BITSIZE (rmode))
5363     {
5364       double_int mask = double_int_setbit (double_int_zero, bitpos);
5365
5366       if (GET_MODE_SIZE (imode) > GET_MODE_SIZE (rmode))
5367         temp = gen_lowpart (rmode, temp);
5368       temp = expand_binop (rmode, and_optab, temp,
5369                            immed_double_int_const (mask, rmode),
5370                            NULL_RTX, 1, OPTAB_LIB_WIDEN);
5371     }
5372   else
5373     {
5374       /* Perform a logical right shift to place the signbit in the least
5375          significant bit, then truncate the result to the desired mode
5376          and mask just this bit.  */
5377       temp = expand_shift (RSHIFT_EXPR, imode, temp,
5378                            build_int_cst (NULL_TREE, bitpos), NULL_RTX, 1);
5379       temp = gen_lowpart (rmode, temp);
5380       temp = expand_binop (rmode, and_optab, temp, const1_rtx,
5381                            NULL_RTX, 1, OPTAB_LIB_WIDEN);
5382     }
5383
5384   return temp;
5385 }
5386
5387 /* Expand fork or exec calls.  TARGET is the desired target of the
5388    call.  EXP is the call. FN is the
5389    identificator of the actual function.  IGNORE is nonzero if the
5390    value is to be ignored.  */
5391
5392 static rtx
5393 expand_builtin_fork_or_exec (tree fn, tree exp, rtx target, int ignore)
5394 {
5395   tree id, decl;
5396   tree call;
5397
5398   /* If we are not profiling, just call the function.  */
5399   if (!profile_arc_flag)
5400     return NULL_RTX;
5401
5402   /* Otherwise call the wrapper.  This should be equivalent for the rest of
5403      compiler, so the code does not diverge, and the wrapper may run the
5404      code necessary for keeping the profiling sane.  */
5405
5406   switch (DECL_FUNCTION_CODE (fn))
5407     {
5408     case BUILT_IN_FORK:
5409       id = get_identifier ("__gcov_fork");
5410       break;
5411
5412     case BUILT_IN_EXECL:
5413       id = get_identifier ("__gcov_execl");
5414       break;
5415
5416     case BUILT_IN_EXECV:
5417       id = get_identifier ("__gcov_execv");
5418       break;
5419
5420     case BUILT_IN_EXECLP:
5421       id = get_identifier ("__gcov_execlp");
5422       break;
5423
5424     case BUILT_IN_EXECLE:
5425       id = get_identifier ("__gcov_execle");
5426       break;
5427
5428     case BUILT_IN_EXECVP:
5429       id = get_identifier ("__gcov_execvp");
5430       break;
5431
5432     case BUILT_IN_EXECVE:
5433       id = get_identifier ("__gcov_execve");
5434       break;
5435
5436     default:
5437       gcc_unreachable ();
5438     }
5439
5440   decl = build_decl (DECL_SOURCE_LOCATION (fn),
5441                      FUNCTION_DECL, id, TREE_TYPE (fn));
5442   DECL_EXTERNAL (decl) = 1;
5443   TREE_PUBLIC (decl) = 1;
5444   DECL_ARTIFICIAL (decl) = 1;
5445   TREE_NOTHROW (decl) = 1;
5446   DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
5447   DECL_VISIBILITY_SPECIFIED (decl) = 1;
5448   call = rewrite_call_expr (EXPR_LOCATION (exp), exp, 0, decl, 0);
5449   return expand_call (call, target, ignore);
5450  }
5451
5452
5453 \f
5454 /* Reconstitute a mode for a __sync intrinsic operation.  Since the type of
5455    the pointer in these functions is void*, the tree optimizers may remove
5456    casts.  The mode computed in expand_builtin isn't reliable either, due
5457    to __sync_bool_compare_and_swap.
5458
5459    FCODE_DIFF should be fcode - base, where base is the FOO_1 code for the
5460    group of builtins.  This gives us log2 of the mode size.  */
5461
5462 static inline enum machine_mode
5463 get_builtin_sync_mode (int fcode_diff)
5464 {
5465   /* The size is not negotiable, so ask not to get BLKmode in return
5466      if the target indicates that a smaller size would be better.  */
5467   return mode_for_size (BITS_PER_UNIT << fcode_diff, MODE_INT, 0);
5468 }
5469
5470 /* Expand the memory expression LOC and return the appropriate memory operand
5471    for the builtin_sync operations.  */
5472
5473 static rtx
5474 get_builtin_sync_mem (tree loc, enum machine_mode mode)
5475 {
5476   rtx addr, mem;
5477
5478   addr = expand_expr (loc, NULL_RTX, ptr_mode, EXPAND_SUM);
5479   addr = convert_memory_address (Pmode, addr);
5480
5481   /* Note that we explicitly do not want any alias information for this
5482      memory, so that we kill all other live memories.  Otherwise we don't
5483      satisfy the full barrier semantics of the intrinsic.  */
5484   mem = validize_mem (gen_rtx_MEM (mode, addr));
5485
5486   set_mem_align (mem, get_pointer_alignment (loc, BIGGEST_ALIGNMENT));
5487   set_mem_alias_set (mem, ALIAS_SET_MEMORY_BARRIER);
5488   MEM_VOLATILE_P (mem) = 1;
5489
5490   return mem;
5491 }
5492
5493 /* Expand the __sync_xxx_and_fetch and __sync_fetch_and_xxx intrinsics.
5494    EXP is the CALL_EXPR.  CODE is the rtx code
5495    that corresponds to the arithmetic or logical operation from the name;
5496    an exception here is that NOT actually means NAND.  TARGET is an optional
5497    place for us to store the results; AFTER is true if this is the
5498    fetch_and_xxx form.  IGNORE is true if we don't actually care about
5499    the result of the operation at all.  */
5500
5501 static rtx
5502 expand_builtin_sync_operation (enum machine_mode mode, tree exp,
5503                                enum rtx_code code, bool after,
5504                                rtx target, bool ignore)
5505 {
5506   rtx val, mem;
5507   enum machine_mode old_mode;
5508   location_t loc = EXPR_LOCATION (exp);
5509
5510   if (code == NOT && warn_sync_nand)
5511     {
5512       tree fndecl = get_callee_fndecl (exp);
5513       enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
5514
5515       static bool warned_f_a_n, warned_n_a_f;
5516
5517       switch (fcode)
5518         {
5519         case BUILT_IN_FETCH_AND_NAND_1:
5520         case BUILT_IN_FETCH_AND_NAND_2:
5521         case BUILT_IN_FETCH_AND_NAND_4:
5522         case BUILT_IN_FETCH_AND_NAND_8:
5523         case BUILT_IN_FETCH_AND_NAND_16:
5524
5525           if (warned_f_a_n)
5526             break;
5527
5528           fndecl = implicit_built_in_decls[BUILT_IN_FETCH_AND_NAND_N];
5529           inform (loc, "%qD changed semantics in GCC 4.4", fndecl);
5530           warned_f_a_n = true;
5531           break;
5532
5533         case BUILT_IN_NAND_AND_FETCH_1:
5534         case BUILT_IN_NAND_AND_FETCH_2:
5535         case BUILT_IN_NAND_AND_FETCH_4:
5536         case BUILT_IN_NAND_AND_FETCH_8:
5537         case BUILT_IN_NAND_AND_FETCH_16:
5538
5539           if (warned_n_a_f)
5540             break;
5541
5542           fndecl = implicit_built_in_decls[BUILT_IN_NAND_AND_FETCH_N];
5543           inform (loc, "%qD changed semantics in GCC 4.4", fndecl);
5544           warned_n_a_f = true;
5545           break;
5546
5547         default:
5548           gcc_unreachable ();
5549         }
5550     }
5551
5552   /* Expand the operands.  */
5553   mem = get_builtin_sync_mem (CALL_EXPR_ARG (exp, 0), mode);
5554
5555   val = expand_expr (CALL_EXPR_ARG (exp, 1), NULL_RTX, mode, EXPAND_NORMAL);
5556   /* If VAL is promoted to a wider mode, convert it back to MODE.  Take care
5557      of CONST_INTs, where we know the old_mode only from the call argument.  */
5558   old_mode = GET_MODE (val);
5559   if (old_mode == VOIDmode)
5560     old_mode = TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 1)));
5561   val = convert_modes (mode, old_mode, val, 1);
5562
5563   if (ignore)
5564     return expand_sync_operation (mem, val, code);
5565   else
5566     return expand_sync_fetch_operation (mem, val, code, after, target);
5567 }
5568
5569 /* Expand the __sync_val_compare_and_swap and __sync_bool_compare_and_swap
5570    intrinsics. EXP is the CALL_EXPR.  IS_BOOL is
5571    true if this is the boolean form.  TARGET is a place for us to store the
5572    results; this is NOT optional if IS_BOOL is true.  */
5573
5574 static rtx
5575 expand_builtin_compare_and_swap (enum machine_mode mode, tree exp,
5576                                  bool is_bool, rtx target)
5577 {
5578   rtx old_val, new_val, mem;
5579   enum machine_mode old_mode;
5580
5581   /* Expand the operands.  */
5582   mem = get_builtin_sync_mem (CALL_EXPR_ARG (exp, 0), mode);
5583
5584
5585   old_val = expand_expr (CALL_EXPR_ARG (exp, 1), NULL_RTX,
5586                          mode, EXPAND_NORMAL);
5587   /* If VAL is promoted to a wider mode, convert it back to MODE.  Take care
5588      of CONST_INTs, where we know the old_mode only from the call argument.  */
5589   old_mode = GET_MODE (old_val);
5590   if (old_mode == VOIDmode)
5591     old_mode = TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 1)));
5592   old_val = convert_modes (mode, old_mode, old_val, 1);
5593
5594   new_val = expand_expr (CALL_EXPR_ARG (exp, 2), NULL_RTX,
5595                          mode, EXPAND_NORMAL);
5596   /* If VAL is promoted to a wider mode, convert it back to MODE.  Take care
5597      of CONST_INTs, where we know the old_mode only from the call argument.  */
5598   old_mode = GET_MODE (new_val);
5599   if (old_mode == VOIDmode)
5600     old_mode = TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 2)));
5601   new_val = convert_modes (mode, old_mode, new_val, 1);
5602
5603   if (is_bool)
5604     return expand_bool_compare_and_swap (mem, old_val, new_val, target);
5605   else
5606     return expand_val_compare_and_swap (mem, old_val, new_val, target);
5607 }
5608
5609 /* Expand the __sync_lock_test_and_set intrinsic.  Note that the most
5610    general form is actually an atomic exchange, and some targets only
5611    support a reduced form with the second argument being a constant 1.
5612    EXP is the CALL_EXPR; TARGET is an optional place for us to store
5613    the results.  */
5614
5615 static rtx
5616 expand_builtin_lock_test_and_set (enum machine_mode mode, tree exp,
5617                                   rtx target)
5618 {
5619   rtx val, mem;
5620   enum machine_mode old_mode;
5621
5622   /* Expand the operands.  */
5623   mem = get_builtin_sync_mem (CALL_EXPR_ARG (exp, 0), mode);
5624   val = expand_expr (CALL_EXPR_ARG (exp, 1), NULL_RTX, mode, EXPAND_NORMAL);
5625   /* If VAL is promoted to a wider mode, convert it back to MODE.  Take care
5626      of CONST_INTs, where we know the old_mode only from the call argument.  */
5627   old_mode = GET_MODE (val);
5628   if (old_mode == VOIDmode)
5629     old_mode = TYPE_MODE (TREE_TYPE (CALL_EXPR_ARG (exp, 1)));
5630   val = convert_modes (mode, old_mode, val, 1);
5631
5632   return expand_sync_lock_test_and_set (mem, val, target);
5633 }
5634
5635 /* Expand the __sync_synchronize intrinsic.  */
5636
5637 static void
5638 expand_builtin_synchronize (void)
5639 {
5640   gimple x;
5641   VEC (tree, gc) *v_clobbers;
5642
5643 #ifdef HAVE_memory_barrier
5644   if (HAVE_memory_barrier)
5645     {
5646       emit_insn (gen_memory_barrier ());
5647       return;
5648     }
5649 #endif
5650
5651   if (synchronize_libfunc != NULL_RTX)
5652     {
5653       emit_library_call (synchronize_libfunc, LCT_NORMAL, VOIDmode, 0);
5654       return;
5655     }
5656
5657   /* If no explicit memory barrier instruction is available, create an
5658      empty asm stmt with a memory clobber.  */
5659   v_clobbers = VEC_alloc (tree, gc, 1);
5660   VEC_quick_push (tree, v_clobbers,
5661                   tree_cons (NULL, build_string (6, "memory"), NULL));
5662   x = gimple_build_asm_vec ("", NULL, NULL, v_clobbers, NULL);
5663   gimple_asm_set_volatile (x, true);
5664   expand_asm_stmt (x);
5665 }
5666
5667 /* Expand the __sync_lock_release intrinsic.  EXP is the CALL_EXPR.  */
5668
5669 static void
5670 expand_builtin_lock_release (enum machine_mode mode, tree exp)
5671 {
5672   enum insn_code icode;
5673   rtx mem, insn;
5674   rtx val = const0_rtx;
5675
5676   /* Expand the operands.  */
5677   mem = get_builtin_sync_mem (CALL_EXPR_ARG (exp, 0), mode);
5678
5679   /* If there is an explicit operation in the md file, use it.  */
5680   icode = direct_optab_handler (sync_lock_release_optab, mode);
5681   if (icode != CODE_FOR_nothing)
5682     {
5683       if (!insn_data[icode].operand[1].predicate (val, mode))
5684         val = force_reg (mode, val);
5685
5686       insn = GEN_FCN (icode) (mem, val);
5687       if (insn)
5688         {
5689           emit_insn (insn);
5690           return;
5691         }
5692     }
5693
5694   /* Otherwise we can implement this operation by emitting a barrier
5695      followed by a store of zero.  */
5696   expand_builtin_synchronize ();
5697   emit_move_insn (mem, val);
5698 }
5699 \f
5700 /* Expand an expression EXP that calls a built-in function,
5701    with result going to TARGET if that's convenient
5702    (and in mode MODE if that's convenient).
5703    SUBTARGET may be used as the target for computing one of EXP's operands.
5704    IGNORE is nonzero if the value is to be ignored.  */
5705
5706 rtx
5707 expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode,
5708                 int ignore)
5709 {
5710   tree fndecl = get_callee_fndecl (exp);
5711   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
5712   enum machine_mode target_mode = TYPE_MODE (TREE_TYPE (exp));
5713
5714   if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
5715     return targetm.expand_builtin (exp, target, subtarget, mode, ignore);
5716
5717   /* When not optimizing, generate calls to library functions for a certain
5718      set of builtins.  */
5719   if (!optimize
5720       && !called_as_built_in (fndecl)
5721       && DECL_ASSEMBLER_NAME_SET_P (fndecl)
5722       && fcode != BUILT_IN_ALLOCA
5723       && fcode != BUILT_IN_FREE)
5724     return expand_call (exp, target, ignore);
5725
5726   /* The built-in function expanders test for target == const0_rtx
5727      to determine whether the function's result will be ignored.  */
5728   if (ignore)
5729     target = const0_rtx;
5730
5731   /* If the result of a pure or const built-in function is ignored, and
5732      none of its arguments are volatile, we can avoid expanding the
5733      built-in call and just evaluate the arguments for side-effects.  */
5734   if (target == const0_rtx
5735       && (DECL_PURE_P (fndecl) || TREE_READONLY (fndecl)))
5736     {
5737       bool volatilep = false;
5738       tree arg;
5739       call_expr_arg_iterator iter;
5740
5741       FOR_EACH_CALL_EXPR_ARG (arg, iter, exp)
5742         if (TREE_THIS_VOLATILE (arg))
5743           {
5744             volatilep = true;
5745             break;
5746           }
5747
5748       if (! volatilep)
5749         {
5750           FOR_EACH_CALL_EXPR_ARG (arg, iter, exp)
5751             expand_expr (arg, const0_rtx, VOIDmode, EXPAND_NORMAL);
5752           return const0_rtx;
5753         }
5754     }
5755
5756   switch (fcode)
5757     {
5758     CASE_FLT_FN (BUILT_IN_FABS):
5759       target = expand_builtin_fabs (exp, target, subtarget);
5760       if (target)
5761         return target;
5762       break;
5763
5764     CASE_FLT_FN (BUILT_IN_COPYSIGN):
5765       target = expand_builtin_copysign (exp, target, subtarget);
5766       if (target)
5767         return target;
5768       break;
5769
5770       /* Just do a normal library call if we were unable to fold
5771          the values.  */
5772     CASE_FLT_FN (BUILT_IN_CABS):
5773       break;
5774
5775     CASE_FLT_FN (BUILT_IN_EXP):
5776     CASE_FLT_FN (BUILT_IN_EXP10):
5777     CASE_FLT_FN (BUILT_IN_POW10):
5778     CASE_FLT_FN (BUILT_IN_EXP2):
5779     CASE_FLT_FN (BUILT_IN_EXPM1):
5780     CASE_FLT_FN (BUILT_IN_LOGB):
5781     CASE_FLT_FN (BUILT_IN_LOG):
5782     CASE_FLT_FN (BUILT_IN_LOG10):
5783     CASE_FLT_FN (BUILT_IN_LOG2):
5784     CASE_FLT_FN (BUILT_IN_LOG1P):
5785     CASE_FLT_FN (BUILT_IN_TAN):
5786     CASE_FLT_FN (BUILT_IN_ASIN):
5787     CASE_FLT_FN (BUILT_IN_ACOS):
5788     CASE_FLT_FN (BUILT_IN_ATAN):
5789     CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
5790       /* Treat these like sqrt only if unsafe math optimizations are allowed,
5791          because of possible accuracy problems.  */
5792       if (! flag_unsafe_math_optimizations)
5793         break;
5794     CASE_FLT_FN (BUILT_IN_SQRT):
5795     CASE_FLT_FN (BUILT_IN_FLOOR):
5796     CASE_FLT_FN (BUILT_IN_CEIL):
5797     CASE_FLT_FN (BUILT_IN_TRUNC):
5798     CASE_FLT_FN (BUILT_IN_ROUND):
5799     CASE_FLT_FN (BUILT_IN_NEARBYINT):
5800     CASE_FLT_FN (BUILT_IN_RINT):
5801       target = expand_builtin_mathfn (exp, target, subtarget);
5802       if (target)
5803         return target;
5804       break;
5805
5806     CASE_FLT_FN (BUILT_IN_ILOGB):
5807       if (! flag_unsafe_math_optimizations)
5808         break;
5809     CASE_FLT_FN (BUILT_IN_ISINF):
5810     CASE_FLT_FN (BUILT_IN_FINITE):
5811     case BUILT_IN_ISFINITE:
5812     case BUILT_IN_ISNORMAL:
5813       target = expand_builtin_interclass_mathfn (exp, target, subtarget);
5814       if (target)
5815         return target;
5816       break;
5817
5818     CASE_FLT_FN (BUILT_IN_LCEIL):
5819     CASE_FLT_FN (BUILT_IN_LLCEIL):
5820     CASE_FLT_FN (BUILT_IN_LFLOOR):
5821     CASE_FLT_FN (BUILT_IN_LLFLOOR):
5822       target = expand_builtin_int_roundingfn (exp, target);
5823       if (target)
5824         return target;
5825       break;
5826
5827     CASE_FLT_FN (BUILT_IN_LRINT):
5828     CASE_FLT_FN (BUILT_IN_LLRINT):
5829     CASE_FLT_FN (BUILT_IN_LROUND):
5830     CASE_FLT_FN (BUILT_IN_LLROUND):
5831       target = expand_builtin_int_roundingfn_2 (exp, target);
5832       if (target)
5833         return target;
5834       break;
5835
5836     CASE_FLT_FN (BUILT_IN_POW):
5837       target = expand_builtin_pow (exp, target, subtarget);
5838       if (target)
5839         return target;
5840       break;
5841
5842     CASE_FLT_FN (BUILT_IN_POWI):
5843       target = expand_builtin_powi (exp, target, subtarget);
5844       if (target)
5845         return target;
5846       break;
5847
5848     CASE_FLT_FN (BUILT_IN_ATAN2):
5849     CASE_FLT_FN (BUILT_IN_LDEXP):
5850     CASE_FLT_FN (BUILT_IN_SCALB):
5851     CASE_FLT_FN (BUILT_IN_SCALBN):
5852     CASE_FLT_FN (BUILT_IN_SCALBLN):
5853       if (! flag_unsafe_math_optimizations)
5854         break;
5855
5856     CASE_FLT_FN (BUILT_IN_FMOD):
5857     CASE_FLT_FN (BUILT_IN_REMAINDER):
5858     CASE_FLT_FN (BUILT_IN_DREM):
5859       target = expand_builtin_mathfn_2 (exp, target, subtarget);
5860       if (target)
5861         return target;
5862       break;
5863
5864     CASE_FLT_FN (BUILT_IN_CEXPI):
5865       target = expand_builtin_cexpi (exp, target, subtarget);
5866       gcc_assert (target);
5867       return target;
5868
5869     CASE_FLT_FN (BUILT_IN_SIN):
5870     CASE_FLT_FN (BUILT_IN_COS):
5871       if (! flag_unsafe_math_optimizations)
5872         break;
5873       target = expand_builtin_mathfn_3 (exp, target, subtarget);
5874       if (target)
5875         return target;
5876       break;
5877
5878     CASE_FLT_FN (BUILT_IN_SINCOS):
5879       if (! flag_unsafe_math_optimizations)
5880         break;
5881       target = expand_builtin_sincos (exp);
5882       if (target)
5883         return target;
5884       break;
5885
5886     case BUILT_IN_APPLY_ARGS:
5887       return expand_builtin_apply_args ();
5888
5889       /* __builtin_apply (FUNCTION, ARGUMENTS, ARGSIZE) invokes
5890          FUNCTION with a copy of the parameters described by
5891          ARGUMENTS, and ARGSIZE.  It returns a block of memory
5892          allocated on the stack into which is stored all the registers
5893          that might possibly be used for returning the result of a
5894          function.  ARGUMENTS is the value returned by
5895          __builtin_apply_args.  ARGSIZE is the number of bytes of
5896          arguments that must be copied.  ??? How should this value be
5897          computed?  We'll also need a safe worst case value for varargs
5898          functions.  */
5899     case BUILT_IN_APPLY:
5900       if (!validate_arglist (exp, POINTER_TYPE,
5901                              POINTER_TYPE, INTEGER_TYPE, VOID_TYPE)
5902           && !validate_arglist (exp, REFERENCE_TYPE,
5903                                 POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
5904         return const0_rtx;
5905       else
5906         {
5907           rtx ops[3];
5908
5909           ops[0] = expand_normal (CALL_EXPR_ARG (exp, 0));
5910           ops[1] = expand_normal (CALL_EXPR_ARG (exp, 1));
5911           ops[2] = expand_normal (CALL_EXPR_ARG (exp, 2));
5912
5913           return expand_builtin_apply (ops[0], ops[1], ops[2]);
5914         }
5915
5916       /* __builtin_return (RESULT) causes the function to return the
5917          value described by RESULT.  RESULT is address of the block of
5918          memory returned by __builtin_apply.  */
5919     case BUILT_IN_RETURN:
5920       if (validate_arglist (exp, POINTER_TYPE, VOID_TYPE))
5921         expand_builtin_return (expand_normal (CALL_EXPR_ARG (exp, 0)));
5922       return const0_rtx;
5923
5924     case BUILT_IN_SAVEREGS:
5925       return expand_builtin_saveregs ();
5926
5927     case BUILT_IN_ARGS_INFO:
5928       return expand_builtin_args_info (exp);
5929
5930     case BUILT_IN_VA_ARG_PACK:
5931       /* All valid uses of __builtin_va_arg_pack () are removed during
5932          inlining.  */
5933       error ("%Kinvalid use of %<__builtin_va_arg_pack ()%>", exp);
5934       return const0_rtx;
5935
5936     case BUILT_IN_VA_ARG_PACK_LEN:
5937       /* All valid uses of __builtin_va_arg_pack_len () are removed during
5938          inlining.  */
5939       error ("%Kinvalid use of %<__builtin_va_arg_pack_len ()%>", exp);
5940       return const0_rtx;
5941
5942       /* Return the address of the first anonymous stack arg.  */
5943     case BUILT_IN_NEXT_ARG:
5944       if (fold_builtin_next_arg (exp, false))
5945         return const0_rtx;
5946       return expand_builtin_next_arg ();
5947
5948     case BUILT_IN_CLEAR_CACHE:
5949       target = expand_builtin___clear_cache (exp);
5950       if (target)
5951         return target;
5952       break;
5953
5954     case BUILT_IN_CLASSIFY_TYPE:
5955       return expand_builtin_classify_type (exp);
5956
5957     case BUILT_IN_CONSTANT_P:
5958       return const0_rtx;
5959
5960     case BUILT_IN_FRAME_ADDRESS:
5961     case BUILT_IN_RETURN_ADDRESS:
5962       return expand_builtin_frame_address (fndecl, exp);
5963
5964     /* Returns the address of the area where the structure is returned.
5965        0 otherwise.  */
5966     case BUILT_IN_AGGREGATE_INCOMING_ADDRESS:
5967       if (call_expr_nargs (exp) != 0
5968           || ! AGGREGATE_TYPE_P (TREE_TYPE (TREE_TYPE (current_function_decl)))
5969           || !MEM_P (DECL_RTL (DECL_RESULT (current_function_decl))))
5970         return const0_rtx;
5971       else
5972         return XEXP (DECL_RTL (DECL_RESULT (current_function_decl)), 0);
5973
5974     case BUILT_IN_ALLOCA:
5975       target = expand_builtin_alloca (exp, target);
5976       if (target)
5977         return target;
5978       break;
5979
5980     case BUILT_IN_STACK_SAVE:
5981       return expand_stack_save ();
5982
5983     case BUILT_IN_STACK_RESTORE:
5984       expand_stack_restore (CALL_EXPR_ARG (exp, 0));
5985       return const0_rtx;
5986
5987     case BUILT_IN_BSWAP32:
5988     case BUILT_IN_BSWAP64:
5989       target = expand_builtin_bswap (exp, target, subtarget);
5990
5991       if (target)
5992         return target;
5993       break;
5994
5995     CASE_INT_FN (BUILT_IN_FFS):
5996     case BUILT_IN_FFSIMAX:
5997       target = expand_builtin_unop (target_mode, exp, target,
5998                                     subtarget, ffs_optab);
5999       if (target)
6000         return target;
6001       break;
6002
6003     CASE_INT_FN (BUILT_IN_CLZ):
6004     case BUILT_IN_CLZIMAX:
6005       target = expand_builtin_unop (target_mode, exp, target,
6006                                     subtarget, clz_optab);
6007       if (target)
6008         return target;
6009       break;
6010
6011     CASE_INT_FN (BUILT_IN_CTZ):
6012     case BUILT_IN_CTZIMAX:
6013       target = expand_builtin_unop (target_mode, exp, target,
6014                                     subtarget, ctz_optab);
6015       if (target)
6016         return target;
6017       break;
6018
6019     CASE_INT_FN (BUILT_IN_POPCOUNT):
6020     case BUILT_IN_POPCOUNTIMAX:
6021       target = expand_builtin_unop (target_mode, exp, target,
6022                                     subtarget, popcount_optab);
6023       if (target)
6024         return target;
6025       break;
6026
6027     CASE_INT_FN (BUILT_IN_PARITY):
6028     case BUILT_IN_PARITYIMAX:
6029       target = expand_builtin_unop (target_mode, exp, target,
6030                                     subtarget, parity_optab);
6031       if (target)
6032         return target;
6033       break;
6034
6035     case BUILT_IN_STRLEN:
6036       target = expand_builtin_strlen (exp, target, target_mode);
6037       if (target)
6038         return target;
6039       break;
6040
6041     case BUILT_IN_STRCPY:
6042       target = expand_builtin_strcpy (exp, target);
6043       if (target)
6044         return target;
6045       break;
6046
6047     case BUILT_IN_STRNCPY:
6048       target = expand_builtin_strncpy (exp, target);
6049       if (target)
6050         return target;
6051       break;
6052
6053     case BUILT_IN_STPCPY:
6054       target = expand_builtin_stpcpy (exp, target, mode);
6055       if (target)
6056         return target;
6057       break;
6058
6059     case BUILT_IN_MEMCPY:
6060       target = expand_builtin_memcpy (exp, target);
6061       if (target)
6062         return target;
6063       break;
6064
6065     case BUILT_IN_MEMPCPY:
6066       target = expand_builtin_mempcpy (exp, target, mode);
6067       if (target)
6068         return target;
6069       break;
6070
6071     case BUILT_IN_MEMSET:
6072       target = expand_builtin_memset (exp, target, mode);
6073       if (target)
6074         return target;
6075       break;
6076
6077     case BUILT_IN_BZERO:
6078       target = expand_builtin_bzero (exp);
6079       if (target)
6080         return target;
6081       break;
6082
6083     case BUILT_IN_STRCMP:
6084       target = expand_builtin_strcmp (exp, target);
6085       if (target)
6086         return target;
6087       break;
6088
6089     case BUILT_IN_STRNCMP:
6090       target = expand_builtin_strncmp (exp, target, mode);
6091       if (target)
6092         return target;
6093       break;
6094
6095     case BUILT_IN_BCMP:
6096     case BUILT_IN_MEMCMP:
6097       target = expand_builtin_memcmp (exp, target, mode);
6098       if (target)
6099         return target;
6100       break;
6101
6102     case BUILT_IN_SETJMP:
6103       /* This should have been lowered to the builtins below.  */
6104       gcc_unreachable ();
6105
6106     case BUILT_IN_SETJMP_SETUP:
6107       /* __builtin_setjmp_setup is passed a pointer to an array of five words
6108           and the receiver label.  */
6109       if (validate_arglist (exp, POINTER_TYPE, POINTER_TYPE, VOID_TYPE))
6110         {
6111           rtx buf_addr = expand_expr (CALL_EXPR_ARG (exp, 0), subtarget,
6112                                       VOIDmode, EXPAND_NORMAL);
6113           tree label = TREE_OPERAND (CALL_EXPR_ARG (exp, 1), 0);
6114           rtx label_r = label_rtx (label);
6115
6116           /* This is copied from the handling of non-local gotos.  */
6117           expand_builtin_setjmp_setup (buf_addr, label_r);
6118           nonlocal_goto_handler_labels
6119             = gen_rtx_EXPR_LIST (VOIDmode, label_r,
6120                                  nonlocal_goto_handler_labels);
6121           /* ??? Do not let expand_label treat us as such since we would
6122              not want to be both on the list of non-local labels and on
6123              the list of forced labels.  */
6124           FORCED_LABEL (label) = 0;
6125           return const0_rtx;
6126         }
6127       break;
6128
6129     case BUILT_IN_SETJMP_DISPATCHER:
6130        /* __builtin_setjmp_dispatcher is passed the dispatcher label.  */
6131       if (validate_arglist (exp, POINTER_TYPE, VOID_TYPE))
6132         {
6133           tree label = TREE_OPERAND (CALL_EXPR_ARG (exp, 0), 0);
6134           rtx label_r = label_rtx (label);
6135
6136           /* Remove the dispatcher label from the list of non-local labels
6137              since the receiver labels have been added to it above.  */
6138           remove_node_from_expr_list (label_r, &nonlocal_goto_handler_labels);
6139           return const0_rtx;
6140         }
6141       break;
6142
6143     case BUILT_IN_SETJMP_RECEIVER:
6144        /* __builtin_setjmp_receiver is passed the receiver label.  */
6145       if (validate_arglist (exp, POINTER_TYPE, VOID_TYPE))
6146         {
6147           tree label = TREE_OPERAND (CALL_EXPR_ARG (exp, 0), 0);
6148           rtx label_r = label_rtx (label);
6149
6150           expand_builtin_setjmp_receiver (label_r);
6151           return const0_rtx;
6152         }
6153       break;
6154
6155       /* __builtin_longjmp is passed a pointer to an array of five words.
6156          It's similar to the C library longjmp function but works with
6157          __builtin_setjmp above.  */
6158     case BUILT_IN_LONGJMP:
6159       if (validate_arglist (exp, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
6160         {
6161           rtx buf_addr = expand_expr (CALL_EXPR_ARG (exp, 0), subtarget,
6162                                       VOIDmode, EXPAND_NORMAL);
6163           rtx value = expand_normal (CALL_EXPR_ARG (exp, 1));
6164
6165           if (value != const1_rtx)
6166             {
6167               error ("%<__builtin_longjmp%> second argument must be 1");
6168               return const0_rtx;
6169             }
6170
6171           expand_builtin_longjmp (buf_addr, value);
6172           return const0_rtx;
6173         }
6174       break;
6175
6176     case BUILT_IN_NONLOCAL_GOTO:
6177       target = expand_builtin_nonlocal_goto (exp);
6178       if (target)
6179         return target;
6180       break;
6181
6182       /* This updates the setjmp buffer that is its argument with the value
6183          of the current stack pointer.  */
6184     case BUILT_IN_UPDATE_SETJMP_BUF:
6185       if (validate_arglist (exp, POINTER_TYPE, VOID_TYPE))
6186         {
6187           rtx buf_addr
6188             = expand_normal (CALL_EXPR_ARG (exp, 0));
6189
6190           expand_builtin_update_setjmp_buf (buf_addr);
6191           return const0_rtx;
6192         }
6193       break;
6194
6195     case BUILT_IN_TRAP:
6196       expand_builtin_trap ();
6197       return const0_rtx;
6198
6199     case BUILT_IN_UNREACHABLE:
6200       expand_builtin_unreachable ();
6201       return const0_rtx;
6202
6203     CASE_FLT_FN (BUILT_IN_SIGNBIT):
6204     case BUILT_IN_SIGNBITD32:
6205     case BUILT_IN_SIGNBITD64:
6206     case BUILT_IN_SIGNBITD128:
6207       target = expand_builtin_signbit (exp, target);
6208       if (target)
6209         return target;
6210       break;
6211
6212       /* Various hooks for the DWARF 2 __throw routine.  */
6213     case BUILT_IN_UNWIND_INIT:
6214       expand_builtin_unwind_init ();
6215       return const0_rtx;
6216     case BUILT_IN_DWARF_CFA:
6217       return virtual_cfa_rtx;
6218 #ifdef DWARF2_UNWIND_INFO
6219     case BUILT_IN_DWARF_SP_COLUMN:
6220       return expand_builtin_dwarf_sp_column ();
6221     case BUILT_IN_INIT_DWARF_REG_SIZES:
6222       expand_builtin_init_dwarf_reg_sizes (CALL_EXPR_ARG (exp, 0));
6223       return const0_rtx;
6224 #endif
6225     case BUILT_IN_FROB_RETURN_ADDR:
6226       return expand_builtin_frob_return_addr (CALL_EXPR_ARG (exp, 0));
6227     case BUILT_IN_EXTRACT_RETURN_ADDR:
6228       return expand_builtin_extract_return_addr (CALL_EXPR_ARG (exp, 0));
6229     case BUILT_IN_EH_RETURN:
6230       expand_builtin_eh_return (CALL_EXPR_ARG (exp, 0),
6231                                 CALL_EXPR_ARG (exp, 1));
6232       return const0_rtx;
6233 #ifdef EH_RETURN_DATA_REGNO
6234     case BUILT_IN_EH_RETURN_DATA_REGNO:
6235       return expand_builtin_eh_return_data_regno (exp);
6236 #endif
6237     case BUILT_IN_EXTEND_POINTER:
6238       return expand_builtin_extend_pointer (CALL_EXPR_ARG (exp, 0));
6239     case BUILT_IN_EH_POINTER:
6240       return expand_builtin_eh_pointer (exp);
6241     case BUILT_IN_EH_FILTER:
6242       return expand_builtin_eh_filter (exp);
6243     case BUILT_IN_EH_COPY_VALUES:
6244       return expand_builtin_eh_copy_values (exp);
6245
6246     case BUILT_IN_VA_START:
6247       return expand_builtin_va_start (exp);
6248     case BUILT_IN_VA_END:
6249       return expand_builtin_va_end (exp);
6250     case BUILT_IN_VA_COPY:
6251       return expand_builtin_va_copy (exp);
6252     case BUILT_IN_EXPECT:
6253       return expand_builtin_expect (exp, target);
6254     case BUILT_IN_PREFETCH:
6255       expand_builtin_prefetch (exp);
6256       return const0_rtx;
6257
6258     case BUILT_IN_PROFILE_FUNC_ENTER:
6259       return expand_builtin_profile_func (false);
6260     case BUILT_IN_PROFILE_FUNC_EXIT:
6261       return expand_builtin_profile_func (true);
6262
6263     case BUILT_IN_INIT_TRAMPOLINE:
6264       return expand_builtin_init_trampoline (exp);
6265     case BUILT_IN_ADJUST_TRAMPOLINE:
6266       return expand_builtin_adjust_trampoline (exp);
6267
6268     case BUILT_IN_FORK:
6269     case BUILT_IN_EXECL:
6270     case BUILT_IN_EXECV:
6271     case BUILT_IN_EXECLP:
6272     case BUILT_IN_EXECLE:
6273     case BUILT_IN_EXECVP:
6274     case BUILT_IN_EXECVE:
6275       target = expand_builtin_fork_or_exec (fndecl, exp, target, ignore);
6276       if (target)
6277         return target;
6278       break;
6279
6280     case BUILT_IN_FETCH_AND_ADD_1:
6281     case BUILT_IN_FETCH_AND_ADD_2:
6282     case BUILT_IN_FETCH_AND_ADD_4:
6283     case BUILT_IN_FETCH_AND_ADD_8:
6284     case BUILT_IN_FETCH_AND_ADD_16:
6285       mode = get_builtin_sync_mode (fcode - BUILT_IN_FETCH_AND_ADD_1);
6286       target = expand_builtin_sync_operation (mode, exp, PLUS,
6287                                               false, target, ignore);
6288       if (target)
6289         return target;
6290       break;
6291
6292     case BUILT_IN_FETCH_AND_SUB_1:
6293     case BUILT_IN_FETCH_AND_SUB_2:
6294     case BUILT_IN_FETCH_AND_SUB_4:
6295     case BUILT_IN_FETCH_AND_SUB_8:
6296     case BUILT_IN_FETCH_AND_SUB_16:
6297       mode = get_builtin_sync_mode (fcode - BUILT_IN_FETCH_AND_SUB_1);
6298       target = expand_builtin_sync_operation (mode, exp, MINUS,
6299                                               false, target, ignore);
6300       if (target)
6301         return target;
6302       break;
6303
6304     case BUILT_IN_FETCH_AND_OR_1:
6305     case BUILT_IN_FETCH_AND_OR_2:
6306     case BUILT_IN_FETCH_AND_OR_4:
6307     case BUILT_IN_FETCH_AND_OR_8:
6308     case BUILT_IN_FETCH_AND_OR_16:
6309       mode = get_builtin_sync_mode (fcode - BUILT_IN_FETCH_AND_OR_1);
6310       target = expand_builtin_sync_operation (mode, exp, IOR,
6311                                               false, target, ignore);
6312       if (target)
6313         return target;
6314       break;
6315
6316     case BUILT_IN_FETCH_AND_AND_1:
6317     case BUILT_IN_FETCH_AND_AND_2:
6318     case BUILT_IN_FETCH_AND_AND_4:
6319     case BUILT_IN_FETCH_AND_AND_8:
6320     case BUILT_IN_FETCH_AND_AND_16:
6321       mode = get_builtin_sync_mode (fcode - BUILT_IN_FETCH_AND_AND_1);
6322       target = expand_builtin_sync_operation (mode, exp, AND,
6323                                               false, target, ignore);
6324       if (target)
6325         return target;
6326       break;
6327
6328     case BUILT_IN_FETCH_AND_XOR_1:
6329     case BUILT_IN_FETCH_AND_XOR_2:
6330     case BUILT_IN_FETCH_AND_XOR_4:
6331     case BUILT_IN_FETCH_AND_XOR_8:
6332     case BUILT_IN_FETCH_AND_XOR_16:
6333       mode = get_builtin_sync_mode (fcode - BUILT_IN_FETCH_AND_XOR_1);
6334       target = expand_builtin_sync_operation (mode, exp, XOR,
6335                                               false, target, ignore);
6336       if (target)
6337         return target;
6338       break;
6339
6340     case BUILT_IN_FETCH_AND_NAND_1:
6341     case BUILT_IN_FETCH_AND_NAND_2:
6342     case BUILT_IN_FETCH_AND_NAND_4:
6343     case BUILT_IN_FETCH_AND_NAND_8:
6344     case BUILT_IN_FETCH_AND_NAND_16:
6345       mode = get_builtin_sync_mode (fcode - BUILT_IN_FETCH_AND_NAND_1);
6346       target = expand_builtin_sync_operation (mode, exp, NOT,
6347                                               false, target, ignore);
6348       if (target)
6349         return target;
6350       break;
6351
6352     case BUILT_IN_ADD_AND_FETCH_1:
6353     case BUILT_IN_ADD_AND_FETCH_2:
6354     case BUILT_IN_ADD_AND_FETCH_4:
6355     case BUILT_IN_ADD_AND_FETCH_8:
6356     case BUILT_IN_ADD_AND_FETCH_16:
6357       mode = get_builtin_sync_mode (fcode - BUILT_IN_ADD_AND_FETCH_1);
6358       target = expand_builtin_sync_operation (mode, exp, PLUS,
6359                                               true, target, ignore);
6360       if (target)
6361         return target;
6362       break;
6363
6364     case BUILT_IN_SUB_AND_FETCH_1:
6365     case BUILT_IN_SUB_AND_FETCH_2:
6366     case BUILT_IN_SUB_AND_FETCH_4:
6367     case BUILT_IN_SUB_AND_FETCH_8:
6368     case BUILT_IN_SUB_AND_FETCH_16:
6369       mode = get_builtin_sync_mode (fcode - BUILT_IN_SUB_AND_FETCH_1);
6370       target = expand_builtin_sync_operation (mode, exp, MINUS,
6371                                               true, target, ignore);
6372       if (target)
6373         return target;
6374       break;
6375
6376     case BUILT_IN_OR_AND_FETCH_1:
6377     case BUILT_IN_OR_AND_FETCH_2:
6378     case BUILT_IN_OR_AND_FETCH_4:
6379     case BUILT_IN_OR_AND_FETCH_8:
6380     case BUILT_IN_OR_AND_FETCH_16:
6381       mode = get_builtin_sync_mode (fcode - BUILT_IN_OR_AND_FETCH_1);
6382       target = expand_builtin_sync_operation (mode, exp, IOR,
6383                                               true, target, ignore);
6384       if (target)
6385         return target;
6386       break;
6387
6388     case BUILT_IN_AND_AND_FETCH_1:
6389     case BUILT_IN_AND_AND_FETCH_2:
6390     case BUILT_IN_AND_AND_FETCH_4:
6391     case BUILT_IN_AND_AND_FETCH_8:
6392     case BUILT_IN_AND_AND_FETCH_16:
6393       mode = get_builtin_sync_mode (fcode - BUILT_IN_AND_AND_FETCH_1);
6394       target = expand_builtin_sync_operation (mode, exp, AND,
6395                                               true, target, ignore);
6396       if (target)
6397         return target;
6398       break;
6399
6400     case BUILT_IN_XOR_AND_FETCH_1:
6401     case BUILT_IN_XOR_AND_FETCH_2:
6402     case BUILT_IN_XOR_AND_FETCH_4:
6403     case BUILT_IN_XOR_AND_FETCH_8:
6404     case BUILT_IN_XOR_AND_FETCH_16:
6405       mode = get_builtin_sync_mode (fcode - BUILT_IN_XOR_AND_FETCH_1);
6406       target = expand_builtin_sync_operation (mode, exp, XOR,
6407                                               true, target, ignore);
6408       if (target)
6409         return target;
6410       break;
6411
6412     case BUILT_IN_NAND_AND_FETCH_1:
6413     case BUILT_IN_NAND_AND_FETCH_2:
6414     case BUILT_IN_NAND_AND_FETCH_4:
6415     case BUILT_IN_NAND_AND_FETCH_8:
6416     case BUILT_IN_NAND_AND_FETCH_16:
6417       mode = get_builtin_sync_mode (fcode - BUILT_IN_NAND_AND_FETCH_1);
6418       target = expand_builtin_sync_operation (mode, exp, NOT,
6419                                               true, target, ignore);
6420       if (target)
6421         return target;
6422       break;
6423
6424     case BUILT_IN_BOOL_COMPARE_AND_SWAP_1:
6425     case BUILT_IN_BOOL_COMPARE_AND_SWAP_2:
6426     case BUILT_IN_BOOL_COMPARE_AND_SWAP_4:
6427     case BUILT_IN_BOOL_COMPARE_AND_SWAP_8:
6428     case BUILT_IN_BOOL_COMPARE_AND_SWAP_16:
6429       if (mode == VOIDmode)
6430         mode = TYPE_MODE (boolean_type_node);
6431       if (!target || !register_operand (target, mode))
6432         target = gen_reg_rtx (mode);
6433
6434       mode = get_builtin_sync_mode (fcode - BUILT_IN_BOOL_COMPARE_AND_SWAP_1);
6435       target = expand_builtin_compare_and_swap (mode, exp, true, target);
6436       if (target)
6437         return target;
6438       break;
6439
6440     case BUILT_IN_VAL_COMPARE_AND_SWAP_1:
6441     case BUILT_IN_VAL_COMPARE_AND_SWAP_2:
6442     case BUILT_IN_VAL_COMPARE_AND_SWAP_4:
6443     case BUILT_IN_VAL_COMPARE_AND_SWAP_8:
6444     case BUILT_IN_VAL_COMPARE_AND_SWAP_16:
6445       mode = get_builtin_sync_mode (fcode - BUILT_IN_VAL_COMPARE_AND_SWAP_1);
6446       target = expand_builtin_compare_and_swap (mode, exp, false, target);
6447       if (target)
6448         return target;
6449       break;
6450
6451     case BUILT_IN_LOCK_TEST_AND_SET_1:
6452     case BUILT_IN_LOCK_TEST_AND_SET_2:
6453     case BUILT_IN_LOCK_TEST_AND_SET_4:
6454     case BUILT_IN_LOCK_TEST_AND_SET_8:
6455     case BUILT_IN_LOCK_TEST_AND_SET_16:
6456       mode = get_builtin_sync_mode (fcode - BUILT_IN_LOCK_TEST_AND_SET_1);
6457       target = expand_builtin_lock_test_and_set (mode, exp, target);
6458       if (target)
6459         return target;
6460       break;
6461
6462     case BUILT_IN_LOCK_RELEASE_1:
6463     case BUILT_IN_LOCK_RELEASE_2:
6464     case BUILT_IN_LOCK_RELEASE_4:
6465     case BUILT_IN_LOCK_RELEASE_8:
6466     case BUILT_IN_LOCK_RELEASE_16:
6467       mode = get_builtin_sync_mode (fcode - BUILT_IN_LOCK_RELEASE_1);
6468       expand_builtin_lock_release (mode, exp);
6469       return const0_rtx;
6470
6471     case BUILT_IN_SYNCHRONIZE:
6472       expand_builtin_synchronize ();
6473       return const0_rtx;
6474
6475     case BUILT_IN_OBJECT_SIZE:
6476       return expand_builtin_object_size (exp);
6477
6478     case BUILT_IN_MEMCPY_CHK:
6479     case BUILT_IN_MEMPCPY_CHK:
6480     case BUILT_IN_MEMMOVE_CHK:
6481     case BUILT_IN_MEMSET_CHK:
6482       target = expand_builtin_memory_chk (exp, target, mode, fcode);
6483       if (target)
6484         return target;
6485       break;
6486
6487     case BUILT_IN_STRCPY_CHK:
6488     case BUILT_IN_STPCPY_CHK:
6489     case BUILT_IN_STRNCPY_CHK:
6490     case BUILT_IN_STRCAT_CHK:
6491     case BUILT_IN_STRNCAT_CHK:
6492     case BUILT_IN_SNPRINTF_CHK:
6493     case BUILT_IN_VSNPRINTF_CHK:
6494       maybe_emit_chk_warning (exp, fcode);
6495       break;
6496
6497     case BUILT_IN_SPRINTF_CHK:
6498     case BUILT_IN_VSPRINTF_CHK:
6499       maybe_emit_sprintf_chk_warning (exp, fcode);
6500       break;
6501
6502     case BUILT_IN_FREE:
6503       maybe_emit_free_warning (exp);
6504       break;
6505
6506     default:    /* just do library call, if unknown builtin */
6507       break;
6508     }
6509
6510   /* The switch statement above can drop through to cause the function
6511      to be called normally.  */
6512   return expand_call (exp, target, ignore);
6513 }
6514
6515 /* Determine whether a tree node represents a call to a built-in
6516    function.  If the tree T is a call to a built-in function with
6517    the right number of arguments of the appropriate types, return
6518    the DECL_FUNCTION_CODE of the call, e.g. BUILT_IN_SQRT.
6519    Otherwise the return value is END_BUILTINS.  */
6520
6521 enum built_in_function
6522 builtin_mathfn_code (const_tree t)
6523 {
6524   const_tree fndecl, arg, parmlist;
6525   const_tree argtype, parmtype;
6526   const_call_expr_arg_iterator iter;
6527
6528   if (TREE_CODE (t) != CALL_EXPR
6529       || TREE_CODE (CALL_EXPR_FN (t)) != ADDR_EXPR)
6530     return END_BUILTINS;
6531
6532   fndecl = get_callee_fndecl (t);
6533   if (fndecl == NULL_TREE
6534       || TREE_CODE (fndecl) != FUNCTION_DECL
6535       || ! DECL_BUILT_IN (fndecl)
6536       || DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
6537     return END_BUILTINS;
6538
6539   parmlist = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
6540   init_const_call_expr_arg_iterator (t, &iter);
6541   for (; parmlist; parmlist = TREE_CHAIN (parmlist))
6542     {
6543       /* If a function doesn't take a variable number of arguments,
6544          the last element in the list will have type `void'.  */
6545       parmtype = TREE_VALUE (parmlist);
6546       if (VOID_TYPE_P (parmtype))
6547         {
6548           if (more_const_call_expr_args_p (&iter))
6549             return END_BUILTINS;
6550           return DECL_FUNCTION_CODE (fndecl);
6551         }
6552
6553       if (! more_const_call_expr_args_p (&iter))
6554         return END_BUILTINS;
6555
6556       arg = next_const_call_expr_arg (&iter);
6557       argtype = TREE_TYPE (arg);
6558
6559       if (SCALAR_FLOAT_TYPE_P (parmtype))
6560         {
6561           if (! SCALAR_FLOAT_TYPE_P (argtype))
6562             return END_BUILTINS;
6563         }
6564       else if (COMPLEX_FLOAT_TYPE_P (parmtype))
6565         {
6566           if (! COMPLEX_FLOAT_TYPE_P (argtype))
6567             return END_BUILTINS;
6568         }
6569       else if (POINTER_TYPE_P (parmtype))
6570         {
6571           if (! POINTER_TYPE_P (argtype))
6572             return END_BUILTINS;
6573         }
6574       else if (INTEGRAL_TYPE_P (parmtype))
6575         {
6576           if (! INTEGRAL_TYPE_P (argtype))
6577             return END_BUILTINS;
6578         }
6579       else
6580         return END_BUILTINS;
6581     }
6582
6583   /* Variable-length argument list.  */
6584   return DECL_FUNCTION_CODE (fndecl);
6585 }
6586
6587 /* Fold a call to __builtin_constant_p, if we know its argument ARG will
6588    evaluate to a constant.  */
6589
6590 static tree
6591 fold_builtin_constant_p (tree arg)
6592 {
6593   /* We return 1 for a numeric type that's known to be a constant
6594      value at compile-time or for an aggregate type that's a
6595      literal constant.  */
6596   STRIP_NOPS (arg);
6597
6598   /* If we know this is a constant, emit the constant of one.  */
6599   if (CONSTANT_CLASS_P (arg)
6600       || (TREE_CODE (arg) == CONSTRUCTOR
6601           && TREE_CONSTANT (arg)))
6602     return integer_one_node;
6603   if (TREE_CODE (arg) == ADDR_EXPR)
6604     {
6605        tree op = TREE_OPERAND (arg, 0);
6606        if (TREE_CODE (op) == STRING_CST
6607            || (TREE_CODE (op) == ARRAY_REF
6608                && integer_zerop (TREE_OPERAND (op, 1))
6609                && TREE_CODE (TREE_OPERAND (op, 0)) == STRING_CST))
6610          return integer_one_node;
6611     }
6612
6613   /* If this expression has side effects, show we don't know it to be a
6614      constant.  Likewise if it's a pointer or aggregate type since in
6615      those case we only want literals, since those are only optimized
6616      when generating RTL, not later.
6617      And finally, if we are compiling an initializer, not code, we
6618      need to return a definite result now; there's not going to be any
6619      more optimization done.  */
6620   if (TREE_SIDE_EFFECTS (arg)
6621       || AGGREGATE_TYPE_P (TREE_TYPE (arg))
6622       || POINTER_TYPE_P (TREE_TYPE (arg))
6623       || cfun == 0
6624       || folding_initializer)
6625     return integer_zero_node;
6626
6627   return NULL_TREE;
6628 }
6629
6630 /* Create builtin_expect with PRED and EXPECTED as its arguments and
6631    return it as a truthvalue.  */
6632
6633 static tree
6634 build_builtin_expect_predicate (location_t loc, tree pred, tree expected)
6635 {
6636   tree fn, arg_types, pred_type, expected_type, call_expr, ret_type;
6637
6638   fn = built_in_decls[BUILT_IN_EXPECT];
6639   arg_types = TYPE_ARG_TYPES (TREE_TYPE (fn));
6640   ret_type = TREE_TYPE (TREE_TYPE (fn));
6641   pred_type = TREE_VALUE (arg_types);
6642   expected_type = TREE_VALUE (TREE_CHAIN (arg_types));
6643
6644   pred = fold_convert_loc (loc, pred_type, pred);
6645   expected = fold_convert_loc (loc, expected_type, expected);
6646   call_expr = build_call_expr_loc (loc, fn, 2, pred, expected);
6647
6648   return build2 (NE_EXPR, TREE_TYPE (pred), call_expr,
6649                  build_int_cst (ret_type, 0));
6650 }
6651
6652 /* Fold a call to builtin_expect with arguments ARG0 and ARG1.  Return
6653    NULL_TREE if no simplification is possible.  */
6654
6655 static tree
6656 fold_builtin_expect (location_t loc, tree arg0, tree arg1)
6657 {
6658   tree inner, fndecl;
6659   enum tree_code code;
6660
6661   /* If this is a builtin_expect within a builtin_expect keep the
6662      inner one.  See through a comparison against a constant.  It
6663      might have been added to create a thruthvalue.  */
6664   inner = arg0;
6665   if (COMPARISON_CLASS_P (inner)
6666       && TREE_CODE (TREE_OPERAND (inner, 1)) == INTEGER_CST)
6667     inner = TREE_OPERAND (inner, 0);
6668
6669   if (TREE_CODE (inner) == CALL_EXPR
6670       && (fndecl = get_callee_fndecl (inner))
6671       && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL
6672       && DECL_FUNCTION_CODE (fndecl) == BUILT_IN_EXPECT)
6673     return arg0;
6674
6675   /* Distribute the expected value over short-circuiting operators.
6676      See through the cast from truthvalue_type_node to long.  */
6677   inner = arg0;
6678   while (TREE_CODE (inner) == NOP_EXPR
6679          && INTEGRAL_TYPE_P (TREE_TYPE (inner))
6680          && INTEGRAL_TYPE_P (TREE_TYPE (TREE_OPERAND (inner, 0))))
6681     inner = TREE_OPERAND (inner, 0);
6682
6683   code = TREE_CODE (inner);
6684   if (code == TRUTH_ANDIF_EXPR || code == TRUTH_ORIF_EXPR)
6685     {
6686       tree op0 = TREE_OPERAND (inner, 0);
6687       tree op1 = TREE_OPERAND (inner, 1);
6688
6689       op0 = build_builtin_expect_predicate (loc, op0, arg1);
6690       op1 = build_builtin_expect_predicate (loc, op1, arg1);
6691       inner = build2 (code, TREE_TYPE (inner), op0, op1);
6692
6693       return fold_convert_loc (loc, TREE_TYPE (arg0), inner);
6694     }
6695
6696   /* If the argument isn't invariant then there's nothing else we can do.  */
6697   if (!TREE_CONSTANT (arg0))
6698     return NULL_TREE;
6699
6700   /* If we expect that a comparison against the argument will fold to
6701      a constant return the constant.  In practice, this means a true
6702      constant or the address of a non-weak symbol.  */
6703   inner = arg0;
6704   STRIP_NOPS (inner);
6705   if (TREE_CODE (inner) == ADDR_EXPR)
6706     {
6707       do
6708         {
6709           inner = TREE_OPERAND (inner, 0);
6710         }
6711       while (TREE_CODE (inner) == COMPONENT_REF
6712              || TREE_CODE (inner) == ARRAY_REF);
6713       if ((TREE_CODE (inner) == VAR_DECL
6714            || TREE_CODE (inner) == FUNCTION_DECL)
6715           && DECL_WEAK (inner))
6716         return NULL_TREE;
6717     }
6718
6719   /* Otherwise, ARG0 already has the proper type for the return value.  */
6720   return arg0;
6721 }
6722
6723 /* Fold a call to __builtin_classify_type with argument ARG.  */
6724
6725 static tree
6726 fold_builtin_classify_type (tree arg)
6727 {
6728   if (arg == 0)
6729     return build_int_cst (NULL_TREE, no_type_class);
6730
6731   return build_int_cst (NULL_TREE, type_to_class (TREE_TYPE (arg)));
6732 }
6733
6734 /* Fold a call to __builtin_strlen with argument ARG.  */
6735
6736 static tree
6737 fold_builtin_strlen (location_t loc, tree type, tree arg)
6738 {
6739   if (!validate_arg (arg, POINTER_TYPE))
6740     return NULL_TREE;
6741   else
6742     {
6743       tree len = c_strlen (arg, 0);
6744
6745       if (len)
6746         return fold_convert_loc (loc, type, len);
6747
6748       return NULL_TREE;
6749     }
6750 }
6751
6752 /* Fold a call to __builtin_inf or __builtin_huge_val.  */
6753
6754 static tree
6755 fold_builtin_inf (location_t loc, tree type, int warn)
6756 {
6757   REAL_VALUE_TYPE real;
6758
6759   /* __builtin_inff is intended to be usable to define INFINITY on all
6760      targets.  If an infinity is not available, INFINITY expands "to a
6761      positive constant of type float that overflows at translation
6762      time", footnote "In this case, using INFINITY will violate the
6763      constraint in 6.4.4 and thus require a diagnostic." (C99 7.12#4).
6764      Thus we pedwarn to ensure this constraint violation is
6765      diagnosed.  */
6766   if (!MODE_HAS_INFINITIES (TYPE_MODE (type)) && warn)
6767     pedwarn (loc, 0, "target format does not support infinity");
6768
6769   real_inf (&real);
6770   return build_real (type, real);
6771 }
6772
6773 /* Fold a call to __builtin_nan or __builtin_nans with argument ARG.  */
6774
6775 static tree
6776 fold_builtin_nan (tree arg, tree type, int quiet)
6777 {
6778   REAL_VALUE_TYPE real;
6779   const char *str;
6780
6781   if (!validate_arg (arg, POINTER_TYPE))
6782     return NULL_TREE;
6783   str = c_getstr (arg);
6784   if (!str)
6785     return NULL_TREE;
6786
6787   if (!real_nan (&real, str, quiet, TYPE_MODE (type)))
6788     return NULL_TREE;
6789
6790   return build_real (type, real);
6791 }
6792
6793 /* Return true if the floating point expression T has an integer value.
6794    We also allow +Inf, -Inf and NaN to be considered integer values.  */
6795
6796 static bool
6797 integer_valued_real_p (tree t)
6798 {
6799   switch (TREE_CODE (t))
6800     {
6801     case FLOAT_EXPR:
6802       return true;
6803
6804     case ABS_EXPR:
6805     case SAVE_EXPR:
6806       return integer_valued_real_p (TREE_OPERAND (t, 0));
6807
6808     case COMPOUND_EXPR:
6809     case MODIFY_EXPR:
6810     case BIND_EXPR:
6811       return integer_valued_real_p (TREE_OPERAND (t, 1));
6812
6813     case PLUS_EXPR:
6814     case MINUS_EXPR:
6815     case MULT_EXPR:
6816     case MIN_EXPR:
6817     case MAX_EXPR:
6818       return integer_valued_real_p (TREE_OPERAND (t, 0))
6819              && integer_valued_real_p (TREE_OPERAND (t, 1));
6820
6821     case COND_EXPR:
6822       return integer_valued_real_p (TREE_OPERAND (t, 1))
6823              && integer_valued_real_p (TREE_OPERAND (t, 2));
6824
6825     case REAL_CST:
6826       return real_isinteger (TREE_REAL_CST_PTR (t), TYPE_MODE (TREE_TYPE (t)));
6827
6828     case NOP_EXPR:
6829       {
6830         tree type = TREE_TYPE (TREE_OPERAND (t, 0));
6831         if (TREE_CODE (type) == INTEGER_TYPE)
6832           return true;
6833         if (TREE_CODE (type) == REAL_TYPE)
6834           return integer_valued_real_p (TREE_OPERAND (t, 0));
6835         break;
6836       }
6837
6838     case CALL_EXPR:
6839       switch (builtin_mathfn_code (t))
6840         {
6841         CASE_FLT_FN (BUILT_IN_CEIL):
6842         CASE_FLT_FN (BUILT_IN_FLOOR):
6843         CASE_FLT_FN (BUILT_IN_NEARBYINT):
6844         CASE_FLT_FN (BUILT_IN_RINT):
6845         CASE_FLT_FN (BUILT_IN_ROUND):
6846         CASE_FLT_FN (BUILT_IN_TRUNC):
6847           return true;
6848
6849         CASE_FLT_FN (BUILT_IN_FMIN):
6850         CASE_FLT_FN (BUILT_IN_FMAX):
6851           return integer_valued_real_p (CALL_EXPR_ARG (t, 0))
6852             && integer_valued_real_p (CALL_EXPR_ARG (t, 1));
6853
6854         default:
6855           break;
6856         }
6857       break;
6858
6859     default:
6860       break;
6861     }
6862   return false;
6863 }
6864
6865 /* FNDECL is assumed to be a builtin where truncation can be propagated
6866    across (for instance floor((double)f) == (double)floorf (f).
6867    Do the transformation for a call with argument ARG.  */
6868
6869 static tree
6870 fold_trunc_transparent_mathfn (location_t loc, tree fndecl, tree arg)
6871 {
6872   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
6873
6874   if (!validate_arg (arg, REAL_TYPE))
6875     return NULL_TREE;
6876
6877   /* Integer rounding functions are idempotent.  */
6878   if (fcode == builtin_mathfn_code (arg))
6879     return arg;
6880
6881   /* If argument is already integer valued, and we don't need to worry
6882      about setting errno, there's no need to perform rounding.  */
6883   if (! flag_errno_math && integer_valued_real_p (arg))
6884     return arg;
6885
6886   if (optimize)
6887     {
6888       tree arg0 = strip_float_extensions (arg);
6889       tree ftype = TREE_TYPE (TREE_TYPE (fndecl));
6890       tree newtype = TREE_TYPE (arg0);
6891       tree decl;
6892
6893       if (TYPE_PRECISION (newtype) < TYPE_PRECISION (ftype)
6894           && (decl = mathfn_built_in (newtype, fcode)))
6895         return fold_convert_loc (loc, ftype,
6896                                  build_call_expr_loc (loc, decl, 1,
6897                                                   fold_convert_loc (loc,
6898                                                                     newtype,
6899                                                                     arg0)));
6900     }
6901   return NULL_TREE;
6902 }
6903
6904 /* FNDECL is assumed to be builtin which can narrow the FP type of
6905    the argument, for instance lround((double)f) -> lroundf (f).
6906    Do the transformation for a call with argument ARG.  */
6907
6908 static tree
6909 fold_fixed_mathfn (location_t loc, tree fndecl, tree arg)
6910 {
6911   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
6912
6913   if (!validate_arg (arg, REAL_TYPE))
6914     return NULL_TREE;
6915
6916   /* If argument is already integer valued, and we don't need to worry
6917      about setting errno, there's no need to perform rounding.  */
6918   if (! flag_errno_math && integer_valued_real_p (arg))
6919     return fold_build1_loc (loc, FIX_TRUNC_EXPR,
6920                         TREE_TYPE (TREE_TYPE (fndecl)), arg);
6921
6922   if (optimize)
6923     {
6924       tree ftype = TREE_TYPE (arg);
6925       tree arg0 = strip_float_extensions (arg);
6926       tree newtype = TREE_TYPE (arg0);
6927       tree decl;
6928
6929       if (TYPE_PRECISION (newtype) < TYPE_PRECISION (ftype)
6930           && (decl = mathfn_built_in (newtype, fcode)))
6931         return build_call_expr_loc (loc, decl, 1,
6932                                 fold_convert_loc (loc, newtype, arg0));
6933     }
6934
6935   /* Canonicalize llround (x) to lround (x) on LP64 targets where
6936      sizeof (long long) == sizeof (long).  */
6937   if (TYPE_PRECISION (long_long_integer_type_node)
6938       == TYPE_PRECISION (long_integer_type_node))
6939     {
6940       tree newfn = NULL_TREE;
6941       switch (fcode)
6942         {
6943         CASE_FLT_FN (BUILT_IN_LLCEIL):
6944           newfn = mathfn_built_in (TREE_TYPE (arg), BUILT_IN_LCEIL);
6945           break;
6946
6947         CASE_FLT_FN (BUILT_IN_LLFLOOR):
6948           newfn = mathfn_built_in (TREE_TYPE (arg), BUILT_IN_LFLOOR);
6949           break;
6950
6951         CASE_FLT_FN (BUILT_IN_LLROUND):
6952           newfn = mathfn_built_in (TREE_TYPE (arg), BUILT_IN_LROUND);
6953           break;
6954
6955         CASE_FLT_FN (BUILT_IN_LLRINT):
6956           newfn = mathfn_built_in (TREE_TYPE (arg), BUILT_IN_LRINT);
6957           break;
6958
6959         default:
6960           break;
6961         }
6962
6963       if (newfn)
6964         {
6965           tree newcall = build_call_expr_loc (loc, newfn, 1, arg);
6966           return fold_convert_loc (loc,
6967                                    TREE_TYPE (TREE_TYPE (fndecl)), newcall);
6968         }
6969     }
6970
6971   return NULL_TREE;
6972 }
6973
6974 /* Fold call to builtin cabs, cabsf or cabsl with argument ARG.  TYPE is the
6975    return type.  Return NULL_TREE if no simplification can be made.  */
6976
6977 static tree
6978 fold_builtin_cabs (location_t loc, tree arg, tree type, tree fndecl)
6979 {
6980   tree res;
6981
6982   if (!validate_arg (arg, COMPLEX_TYPE)
6983       || TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) != REAL_TYPE)
6984     return NULL_TREE;
6985
6986   /* Calculate the result when the argument is a constant.  */
6987   if (TREE_CODE (arg) == COMPLEX_CST
6988       && (res = do_mpfr_arg2 (TREE_REALPART (arg), TREE_IMAGPART (arg),
6989                               type, mpfr_hypot)))
6990     return res;
6991
6992   if (TREE_CODE (arg) == COMPLEX_EXPR)
6993     {
6994       tree real = TREE_OPERAND (arg, 0);
6995       tree imag = TREE_OPERAND (arg, 1);
6996
6997       /* If either part is zero, cabs is fabs of the other.  */
6998       if (real_zerop (real))
6999         return fold_build1_loc (loc, ABS_EXPR, type, imag);
7000       if (real_zerop (imag))
7001         return fold_build1_loc (loc, ABS_EXPR, type, real);
7002
7003       /* cabs(x+xi) -> fabs(x)*sqrt(2).  */
7004       if (flag_unsafe_math_optimizations
7005           && operand_equal_p (real, imag, OEP_PURE_SAME))
7006         {
7007           const REAL_VALUE_TYPE sqrt2_trunc
7008             = real_value_truncate (TYPE_MODE (type), dconst_sqrt2 ());
7009           STRIP_NOPS (real);
7010           return fold_build2_loc (loc, MULT_EXPR, type,
7011                               fold_build1_loc (loc, ABS_EXPR, type, real),
7012                               build_real (type, sqrt2_trunc));
7013         }
7014     }
7015
7016   /* Optimize cabs(-z) and cabs(conj(z)) as cabs(z).  */
7017   if (TREE_CODE (arg) == NEGATE_EXPR
7018       || TREE_CODE (arg) == CONJ_EXPR)
7019     return build_call_expr_loc (loc, fndecl, 1, TREE_OPERAND (arg, 0));
7020
7021   /* Don't do this when optimizing for size.  */
7022   if (flag_unsafe_math_optimizations
7023       && optimize && optimize_function_for_speed_p (cfun))
7024     {
7025       tree sqrtfn = mathfn_built_in (type, BUILT_IN_SQRT);
7026
7027       if (sqrtfn != NULL_TREE)
7028         {
7029           tree rpart, ipart, result;
7030
7031           arg = builtin_save_expr (arg);
7032
7033           rpart = fold_build1_loc (loc, REALPART_EXPR, type, arg);
7034           ipart = fold_build1_loc (loc, IMAGPART_EXPR, type, arg);
7035
7036           rpart = builtin_save_expr (rpart);
7037           ipart = builtin_save_expr (ipart);
7038
7039           result = fold_build2_loc (loc, PLUS_EXPR, type,
7040                                 fold_build2_loc (loc, MULT_EXPR, type,
7041                                              rpart, rpart),
7042                                 fold_build2_loc (loc, MULT_EXPR, type,
7043                                              ipart, ipart));
7044
7045           return build_call_expr_loc (loc, sqrtfn, 1, result);
7046         }
7047     }
7048
7049   return NULL_TREE;
7050 }
7051
7052 /* Build a complex (inf +- 0i) for the result of cproj.  TYPE is the
7053    complex tree type of the result.  If NEG is true, the imaginary
7054    zero is negative.  */
7055
7056 static tree
7057 build_complex_cproj (tree type, bool neg)
7058 {
7059   REAL_VALUE_TYPE rinf, rzero = dconst0;
7060   
7061   real_inf (&rinf);
7062   rzero.sign = neg;
7063   return build_complex (type, build_real (TREE_TYPE (type), rinf),
7064                         build_real (TREE_TYPE (type), rzero));
7065 }
7066
7067 /* Fold call to builtin cproj, cprojf or cprojl with argument ARG.  TYPE is the
7068    return type.  Return NULL_TREE if no simplification can be made.  */
7069
7070 static tree
7071 fold_builtin_cproj (location_t loc, tree arg, tree type)
7072 {
7073   if (!validate_arg (arg, COMPLEX_TYPE)
7074       || TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) != REAL_TYPE)
7075     return NULL_TREE;
7076
7077   /* If there are no infinities, return arg.  */
7078   if (! HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (type))))
7079     return non_lvalue_loc (loc, arg);
7080
7081   /* Calculate the result when the argument is a constant.  */
7082   if (TREE_CODE (arg) == COMPLEX_CST)
7083     {
7084       const REAL_VALUE_TYPE *real = TREE_REAL_CST_PTR (TREE_REALPART (arg));
7085       const REAL_VALUE_TYPE *imag = TREE_REAL_CST_PTR (TREE_IMAGPART (arg));
7086       
7087       if (real_isinf (real) || real_isinf (imag))
7088         return build_complex_cproj (type, imag->sign);
7089       else
7090         return arg;
7091     }
7092   else if (TREE_CODE (arg) == COMPLEX_EXPR)
7093     {
7094       tree real = TREE_OPERAND (arg, 0);
7095       tree imag = TREE_OPERAND (arg, 1);
7096
7097       STRIP_NOPS (real);
7098       STRIP_NOPS (imag);
7099       
7100       /* If the real part is inf and the imag part is known to be
7101          nonnegative, return (inf + 0i).  Remember side-effects are
7102          possible in the imag part.  */
7103       if (TREE_CODE (real) == REAL_CST
7104           && real_isinf (TREE_REAL_CST_PTR (real))
7105           && tree_expr_nonnegative_p (imag))
7106         return omit_one_operand_loc (loc, type,
7107                                      build_complex_cproj (type, false),
7108                                      arg);
7109       
7110       /* If the imag part is inf, return (inf+I*copysign(0,imag)).
7111          Remember side-effects are possible in the real part.  */
7112       if (TREE_CODE (imag) == REAL_CST
7113           && real_isinf (TREE_REAL_CST_PTR (imag)))
7114         return
7115           omit_one_operand_loc (loc, type,
7116                                 build_complex_cproj (type, TREE_REAL_CST_PTR
7117                                                      (imag)->sign), arg);
7118     }
7119
7120   return NULL_TREE;
7121 }
7122
7123 /* Fold a builtin function call to sqrt, sqrtf, or sqrtl with argument ARG.
7124    Return NULL_TREE if no simplification can be made.  */
7125
7126 static tree
7127 fold_builtin_sqrt (location_t loc, tree arg, tree type)
7128 {
7129
7130   enum built_in_function fcode;
7131   tree res;
7132
7133   if (!validate_arg (arg, REAL_TYPE))
7134     return NULL_TREE;
7135
7136   /* Calculate the result when the argument is a constant.  */
7137   if ((res = do_mpfr_arg1 (arg, type, mpfr_sqrt, &dconst0, NULL, true)))
7138     return res;
7139
7140   /* Optimize sqrt(expN(x)) = expN(x*0.5).  */
7141   fcode = builtin_mathfn_code (arg);
7142   if (flag_unsafe_math_optimizations && BUILTIN_EXPONENT_P (fcode))
7143     {
7144       tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg), 0);
7145       arg = fold_build2_loc (loc, MULT_EXPR, type,
7146                          CALL_EXPR_ARG (arg, 0),
7147                          build_real (type, dconsthalf));
7148       return build_call_expr_loc (loc, expfn, 1, arg);
7149     }
7150
7151   /* Optimize sqrt(Nroot(x)) -> pow(x,1/(2*N)).  */
7152   if (flag_unsafe_math_optimizations && BUILTIN_ROOT_P (fcode))
7153     {
7154       tree powfn = mathfn_built_in (type, BUILT_IN_POW);
7155
7156       if (powfn)
7157         {
7158           tree arg0 = CALL_EXPR_ARG (arg, 0);
7159           tree tree_root;
7160           /* The inner root was either sqrt or cbrt.  */
7161           /* This was a conditional expression but it triggered a bug
7162              in Sun C 5.5.  */
7163           REAL_VALUE_TYPE dconstroot;
7164           if (BUILTIN_SQRT_P (fcode))
7165             dconstroot = dconsthalf;
7166           else
7167             dconstroot = dconst_third ();
7168
7169           /* Adjust for the outer root.  */
7170           SET_REAL_EXP (&dconstroot, REAL_EXP (&dconstroot) - 1);
7171           dconstroot = real_value_truncate (TYPE_MODE (type), dconstroot);
7172           tree_root = build_real (type, dconstroot);
7173           return build_call_expr_loc (loc, powfn, 2, arg0, tree_root);
7174         }
7175     }
7176
7177   /* Optimize sqrt(pow(x,y)) = pow(|x|,y*0.5).  */
7178   if (flag_unsafe_math_optimizations
7179       && (fcode == BUILT_IN_POW
7180           || fcode == BUILT_IN_POWF
7181           || fcode == BUILT_IN_POWL))
7182     {
7183       tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg), 0);
7184       tree arg0 = CALL_EXPR_ARG (arg, 0);
7185       tree arg1 = CALL_EXPR_ARG (arg, 1);
7186       tree narg1;
7187       if (!tree_expr_nonnegative_p (arg0))
7188         arg0 = build1 (ABS_EXPR, type, arg0);
7189       narg1 = fold_build2_loc (loc, MULT_EXPR, type, arg1,
7190                            build_real (type, dconsthalf));
7191       return build_call_expr_loc (loc, powfn, 2, arg0, narg1);
7192     }
7193
7194   return NULL_TREE;
7195 }
7196
7197 /* Fold a builtin function call to cbrt, cbrtf, or cbrtl with argument ARG.
7198    Return NULL_TREE if no simplification can be made.  */
7199
7200 static tree
7201 fold_builtin_cbrt (location_t loc, tree arg, tree type)
7202 {
7203   const enum built_in_function fcode = builtin_mathfn_code (arg);
7204   tree res;
7205
7206   if (!validate_arg (arg, REAL_TYPE))
7207     return NULL_TREE;
7208
7209   /* Calculate the result when the argument is a constant.  */
7210   if ((res = do_mpfr_arg1 (arg, type, mpfr_cbrt, NULL, NULL, 0)))
7211     return res;
7212
7213   if (flag_unsafe_math_optimizations)
7214     {
7215       /* Optimize cbrt(expN(x)) -> expN(x/3).  */
7216       if (BUILTIN_EXPONENT_P (fcode))
7217         {
7218           tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg), 0);
7219           const REAL_VALUE_TYPE third_trunc =
7220             real_value_truncate (TYPE_MODE (type), dconst_third ());
7221           arg = fold_build2_loc (loc, MULT_EXPR, type,
7222                              CALL_EXPR_ARG (arg, 0),
7223                              build_real (type, third_trunc));
7224           return build_call_expr_loc (loc, expfn, 1, arg);
7225         }
7226
7227       /* Optimize cbrt(sqrt(x)) -> pow(x,1/6).  */
7228       if (BUILTIN_SQRT_P (fcode))
7229         {
7230           tree powfn = mathfn_built_in (type, BUILT_IN_POW);
7231
7232           if (powfn)
7233             {
7234               tree arg0 = CALL_EXPR_ARG (arg, 0);
7235               tree tree_root;
7236               REAL_VALUE_TYPE dconstroot = dconst_third ();
7237
7238               SET_REAL_EXP (&dconstroot, REAL_EXP (&dconstroot) - 1);
7239               dconstroot = real_value_truncate (TYPE_MODE (type), dconstroot);
7240               tree_root = build_real (type, dconstroot);
7241               return build_call_expr_loc (loc, powfn, 2, arg0, tree_root);
7242             }
7243         }
7244
7245       /* Optimize cbrt(cbrt(x)) -> pow(x,1/9) iff x is nonnegative.  */
7246       if (BUILTIN_CBRT_P (fcode))
7247         {
7248           tree arg0 = CALL_EXPR_ARG (arg, 0);
7249           if (tree_expr_nonnegative_p (arg0))
7250             {
7251               tree powfn = mathfn_built_in (type, BUILT_IN_POW);
7252
7253               if (powfn)
7254                 {
7255                   tree tree_root;
7256                   REAL_VALUE_TYPE dconstroot;
7257
7258                   real_arithmetic (&dconstroot, MULT_EXPR,
7259                                    dconst_third_ptr (), dconst_third_ptr ());
7260                   dconstroot = real_value_truncate (TYPE_MODE (type), dconstroot);
7261                   tree_root = build_real (type, dconstroot);
7262                   return build_call_expr_loc (loc, powfn, 2, arg0, tree_root);
7263                 }
7264             }
7265         }
7266
7267       /* Optimize cbrt(pow(x,y)) -> pow(x,y/3) iff x is nonnegative.  */
7268       if (fcode == BUILT_IN_POW
7269           || fcode == BUILT_IN_POWF
7270           || fcode == BUILT_IN_POWL)
7271         {
7272           tree arg00 = CALL_EXPR_ARG (arg, 0);
7273           tree arg01 = CALL_EXPR_ARG (arg, 1);
7274           if (tree_expr_nonnegative_p (arg00))
7275             {
7276               tree powfn = TREE_OPERAND (CALL_EXPR_FN (arg), 0);
7277               const REAL_VALUE_TYPE dconstroot
7278                 = real_value_truncate (TYPE_MODE (type), dconst_third ());
7279               tree narg01 = fold_build2_loc (loc, MULT_EXPR, type, arg01,
7280                                          build_real (type, dconstroot));
7281               return build_call_expr_loc (loc, powfn, 2, arg00, narg01);
7282             }
7283         }
7284     }
7285   return NULL_TREE;
7286 }
7287
7288 /* Fold function call to builtin cos, cosf, or cosl with argument ARG.
7289    TYPE is the type of the return value.  Return NULL_TREE if no
7290    simplification can be made.  */
7291
7292 static tree
7293 fold_builtin_cos (location_t loc,
7294                   tree arg, tree type, tree fndecl)
7295 {
7296   tree res, narg;
7297
7298   if (!validate_arg (arg, REAL_TYPE))
7299     return NULL_TREE;
7300
7301   /* Calculate the result when the argument is a constant.  */
7302   if ((res = do_mpfr_arg1 (arg, type, mpfr_cos, NULL, NULL, 0)))
7303     return res;
7304
7305   /* Optimize cos(-x) into cos (x).  */
7306   if ((narg = fold_strip_sign_ops (arg)))
7307     return build_call_expr_loc (loc, fndecl, 1, narg);
7308
7309   return NULL_TREE;
7310 }
7311
7312 /* Fold function call to builtin cosh, coshf, or coshl with argument ARG.
7313    Return NULL_TREE if no simplification can be made.  */
7314
7315 static tree
7316 fold_builtin_cosh (location_t loc, tree arg, tree type, tree fndecl)
7317 {
7318   if (validate_arg (arg, REAL_TYPE))
7319     {
7320       tree res, narg;
7321
7322       /* Calculate the result when the argument is a constant.  */
7323       if ((res = do_mpfr_arg1 (arg, type, mpfr_cosh, NULL, NULL, 0)))
7324         return res;
7325
7326       /* Optimize cosh(-x) into cosh (x).  */
7327       if ((narg = fold_strip_sign_ops (arg)))
7328         return build_call_expr_loc (loc, fndecl, 1, narg);
7329     }
7330
7331   return NULL_TREE;
7332 }
7333
7334 /* Fold function call to builtin ccos (or ccosh if HYPER is TRUE) with
7335    argument ARG.  TYPE is the type of the return value.  Return
7336    NULL_TREE if no simplification can be made.  */
7337
7338 static tree
7339 fold_builtin_ccos (location_t loc, tree arg, tree type, tree fndecl,
7340                    bool hyper)
7341 {
7342   if (validate_arg (arg, COMPLEX_TYPE)
7343       && TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) == REAL_TYPE)
7344     {
7345       tree tmp;
7346
7347       /* Calculate the result when the argument is a constant.  */
7348       if ((tmp = do_mpc_arg1 (arg, type, (hyper ? mpc_cosh : mpc_cos))))
7349         return tmp;
7350
7351       /* Optimize fn(-x) into fn(x).  */
7352       if ((tmp = fold_strip_sign_ops (arg)))
7353         return build_call_expr_loc (loc, fndecl, 1, tmp);
7354     }
7355
7356   return NULL_TREE;
7357 }
7358
7359 /* Fold function call to builtin tan, tanf, or tanl with argument ARG.
7360    Return NULL_TREE if no simplification can be made.  */
7361
7362 static tree
7363 fold_builtin_tan (tree arg, tree type)
7364 {
7365   enum built_in_function fcode;
7366   tree res;
7367
7368   if (!validate_arg (arg, REAL_TYPE))
7369     return NULL_TREE;
7370
7371   /* Calculate the result when the argument is a constant.  */
7372   if ((res = do_mpfr_arg1 (arg, type, mpfr_tan, NULL, NULL, 0)))
7373     return res;
7374
7375   /* Optimize tan(atan(x)) = x.  */
7376   fcode = builtin_mathfn_code (arg);
7377   if (flag_unsafe_math_optimizations
7378       && (fcode == BUILT_IN_ATAN
7379           || fcode == BUILT_IN_ATANF
7380           || fcode == BUILT_IN_ATANL))
7381     return CALL_EXPR_ARG (arg, 0);
7382
7383   return NULL_TREE;
7384 }
7385
7386 /* Fold function call to builtin sincos, sincosf, or sincosl.  Return
7387    NULL_TREE if no simplification can be made.  */
7388
7389 static tree
7390 fold_builtin_sincos (location_t loc,
7391                      tree arg0, tree arg1, tree arg2)
7392 {
7393   tree type;
7394   tree res, fn, call;
7395
7396   if (!validate_arg (arg0, REAL_TYPE)
7397       || !validate_arg (arg1, POINTER_TYPE)
7398       || !validate_arg (arg2, POINTER_TYPE))
7399     return NULL_TREE;
7400
7401   type = TREE_TYPE (arg0);
7402
7403   /* Calculate the result when the argument is a constant.  */
7404   if ((res = do_mpfr_sincos (arg0, arg1, arg2)))
7405     return res;
7406
7407   /* Canonicalize sincos to cexpi.  */
7408   if (!TARGET_C99_FUNCTIONS)
7409     return NULL_TREE;
7410   fn = mathfn_built_in (type, BUILT_IN_CEXPI);
7411   if (!fn)
7412     return NULL_TREE;
7413
7414   call = build_call_expr_loc (loc, fn, 1, arg0);
7415   call = builtin_save_expr (call);
7416
7417   return build2 (COMPOUND_EXPR, void_type_node,
7418                  build2 (MODIFY_EXPR, void_type_node,
7419                          build_fold_indirect_ref_loc (loc, arg1),
7420                          build1 (IMAGPART_EXPR, type, call)),
7421                  build2 (MODIFY_EXPR, void_type_node,
7422                          build_fold_indirect_ref_loc (loc, arg2),
7423                          build1 (REALPART_EXPR, type, call)));
7424 }
7425
7426 /* Fold function call to builtin cexp, cexpf, or cexpl.  Return
7427    NULL_TREE if no simplification can be made.  */
7428
7429 static tree
7430 fold_builtin_cexp (location_t loc, tree arg0, tree type)
7431 {
7432   tree rtype;
7433   tree realp, imagp, ifn;
7434   tree res;
7435
7436   if (!validate_arg (arg0, COMPLEX_TYPE)
7437       || TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) != REAL_TYPE)
7438     return NULL_TREE;
7439
7440   /* Calculate the result when the argument is a constant.  */
7441   if ((res = do_mpc_arg1 (arg0, type, mpc_exp)))
7442     return res;
7443
7444   rtype = TREE_TYPE (TREE_TYPE (arg0));
7445
7446   /* In case we can figure out the real part of arg0 and it is constant zero
7447      fold to cexpi.  */
7448   if (!TARGET_C99_FUNCTIONS)
7449     return NULL_TREE;
7450   ifn = mathfn_built_in (rtype, BUILT_IN_CEXPI);
7451   if (!ifn)
7452     return NULL_TREE;
7453
7454   if ((realp = fold_unary_loc (loc, REALPART_EXPR, rtype, arg0))
7455       && real_zerop (realp))
7456     {
7457       tree narg = fold_build1_loc (loc, IMAGPART_EXPR, rtype, arg0);
7458       return build_call_expr_loc (loc, ifn, 1, narg);
7459     }
7460
7461   /* In case we can easily decompose real and imaginary parts split cexp
7462      to exp (r) * cexpi (i).  */
7463   if (flag_unsafe_math_optimizations
7464       && realp)
7465     {
7466       tree rfn, rcall, icall;
7467
7468       rfn = mathfn_built_in (rtype, BUILT_IN_EXP);
7469       if (!rfn)
7470         return NULL_TREE;
7471
7472       imagp = fold_unary_loc (loc, IMAGPART_EXPR, rtype, arg0);
7473       if (!imagp)
7474         return NULL_TREE;
7475
7476       icall = build_call_expr_loc (loc, ifn, 1, imagp);
7477       icall = builtin_save_expr (icall);
7478       rcall = build_call_expr_loc (loc, rfn, 1, realp);
7479       rcall = builtin_save_expr (rcall);
7480       return fold_build2_loc (loc, COMPLEX_EXPR, type,
7481                           fold_build2_loc (loc, MULT_EXPR, rtype,
7482                                        rcall,
7483                                        fold_build1_loc (loc, REALPART_EXPR,
7484                                                     rtype, icall)),
7485                           fold_build2_loc (loc, MULT_EXPR, rtype,
7486                                        rcall,
7487                                        fold_build1_loc (loc, IMAGPART_EXPR,
7488                                                     rtype, icall)));
7489     }
7490
7491   return NULL_TREE;
7492 }
7493
7494 /* Fold function call to builtin trunc, truncf or truncl with argument ARG.
7495    Return NULL_TREE if no simplification can be made.  */
7496
7497 static tree
7498 fold_builtin_trunc (location_t loc, tree fndecl, tree arg)
7499 {
7500   if (!validate_arg (arg, REAL_TYPE))
7501     return NULL_TREE;
7502
7503   /* Optimize trunc of constant value.  */
7504   if (TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg))
7505     {
7506       REAL_VALUE_TYPE r, x;
7507       tree type = TREE_TYPE (TREE_TYPE (fndecl));
7508
7509       x = TREE_REAL_CST (arg);
7510       real_trunc (&r, TYPE_MODE (type), &x);
7511       return build_real (type, r);
7512     }
7513
7514   return fold_trunc_transparent_mathfn (loc, fndecl, arg);
7515 }
7516
7517 /* Fold function call to builtin floor, floorf or floorl with argument ARG.
7518    Return NULL_TREE if no simplification can be made.  */
7519
7520 static tree
7521 fold_builtin_floor (location_t loc, tree fndecl, tree arg)
7522 {
7523   if (!validate_arg (arg, REAL_TYPE))
7524     return NULL_TREE;
7525
7526   /* Optimize floor of constant value.  */
7527   if (TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg))
7528     {
7529       REAL_VALUE_TYPE x;
7530
7531       x = TREE_REAL_CST (arg);
7532       if (! REAL_VALUE_ISNAN (x) || ! flag_errno_math)
7533         {
7534           tree type = TREE_TYPE (TREE_TYPE (fndecl));
7535           REAL_VALUE_TYPE r;
7536
7537           real_floor (&r, TYPE_MODE (type), &x);
7538           return build_real (type, r);
7539         }
7540     }
7541
7542   /* Fold floor (x) where x is nonnegative to trunc (x).  */
7543   if (tree_expr_nonnegative_p (arg))
7544     {
7545       tree truncfn = mathfn_built_in (TREE_TYPE (arg), BUILT_IN_TRUNC);
7546       if (truncfn)
7547         return build_call_expr_loc (loc, truncfn, 1, arg);
7548     }
7549
7550   return fold_trunc_transparent_mathfn (loc, fndecl, arg);
7551 }
7552
7553 /* Fold function call to builtin ceil, ceilf or ceill with argument ARG.
7554    Return NULL_TREE if no simplification can be made.  */
7555
7556 static tree
7557 fold_builtin_ceil (location_t loc, tree fndecl, tree arg)
7558 {
7559   if (!validate_arg (arg, REAL_TYPE))
7560     return NULL_TREE;
7561
7562   /* Optimize ceil of constant value.  */
7563   if (TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg))
7564     {
7565       REAL_VALUE_TYPE x;
7566
7567       x = TREE_REAL_CST (arg);
7568       if (! REAL_VALUE_ISNAN (x) || ! flag_errno_math)
7569         {
7570           tree type = TREE_TYPE (TREE_TYPE (fndecl));
7571           REAL_VALUE_TYPE r;
7572
7573           real_ceil (&r, TYPE_MODE (type), &x);
7574           return build_real (type, r);
7575         }
7576     }
7577
7578   return fold_trunc_transparent_mathfn (loc, fndecl, arg);
7579 }
7580
7581 /* Fold function call to builtin round, roundf or roundl with argument ARG.
7582    Return NULL_TREE if no simplification can be made.  */
7583
7584 static tree
7585 fold_builtin_round (location_t loc, tree fndecl, tree arg)
7586 {
7587   if (!validate_arg (arg, REAL_TYPE))
7588     return NULL_TREE;
7589
7590   /* Optimize round of constant value.  */
7591   if (TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg))
7592     {
7593       REAL_VALUE_TYPE x;
7594
7595       x = TREE_REAL_CST (arg);
7596       if (! REAL_VALUE_ISNAN (x) || ! flag_errno_math)
7597         {
7598           tree type = TREE_TYPE (TREE_TYPE (fndecl));
7599           REAL_VALUE_TYPE r;
7600
7601           real_round (&r, TYPE_MODE (type), &x);
7602           return build_real (type, r);
7603         }
7604     }
7605
7606   return fold_trunc_transparent_mathfn (loc, fndecl, arg);
7607 }
7608
7609 /* Fold function call to builtin lround, lroundf or lroundl (or the
7610    corresponding long long versions) and other rounding functions.  ARG
7611    is the argument to the call.  Return NULL_TREE if no simplification
7612    can be made.  */
7613
7614 static tree
7615 fold_builtin_int_roundingfn (location_t loc, tree fndecl, tree arg)
7616 {
7617   if (!validate_arg (arg, REAL_TYPE))
7618     return NULL_TREE;
7619
7620   /* Optimize lround of constant value.  */
7621   if (TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg))
7622     {
7623       const REAL_VALUE_TYPE x = TREE_REAL_CST (arg);
7624
7625       if (real_isfinite (&x))
7626         {
7627           tree itype = TREE_TYPE (TREE_TYPE (fndecl));
7628           tree ftype = TREE_TYPE (arg);
7629           unsigned HOST_WIDE_INT lo2;
7630           HOST_WIDE_INT hi, lo;
7631           REAL_VALUE_TYPE r;
7632
7633           switch (DECL_FUNCTION_CODE (fndecl))
7634             {
7635             CASE_FLT_FN (BUILT_IN_LFLOOR):
7636             CASE_FLT_FN (BUILT_IN_LLFLOOR):
7637               real_floor (&r, TYPE_MODE (ftype), &x);
7638               break;
7639
7640             CASE_FLT_FN (BUILT_IN_LCEIL):
7641             CASE_FLT_FN (BUILT_IN_LLCEIL):
7642               real_ceil (&r, TYPE_MODE (ftype), &x);
7643               break;
7644
7645             CASE_FLT_FN (BUILT_IN_LROUND):
7646             CASE_FLT_FN (BUILT_IN_LLROUND):
7647               real_round (&r, TYPE_MODE (ftype), &x);
7648               break;
7649
7650             default:
7651               gcc_unreachable ();
7652             }
7653
7654           REAL_VALUE_TO_INT (&lo, &hi, r);
7655           if (!fit_double_type (lo, hi, &lo2, &hi, itype))
7656             return build_int_cst_wide (itype, lo2, hi);
7657         }
7658     }
7659
7660   switch (DECL_FUNCTION_CODE (fndecl))
7661     {
7662     CASE_FLT_FN (BUILT_IN_LFLOOR):
7663     CASE_FLT_FN (BUILT_IN_LLFLOOR):
7664       /* Fold lfloor (x) where x is nonnegative to FIX_TRUNC (x).  */
7665       if (tree_expr_nonnegative_p (arg))
7666         return fold_build1_loc (loc, FIX_TRUNC_EXPR,
7667                             TREE_TYPE (TREE_TYPE (fndecl)), arg);
7668       break;
7669     default:;
7670     }
7671
7672   return fold_fixed_mathfn (loc, fndecl, arg);
7673 }
7674
7675 /* Fold function call to builtin ffs, clz, ctz, popcount and parity
7676    and their long and long long variants (i.e. ffsl and ffsll).  ARG is
7677    the argument to the call.  Return NULL_TREE if no simplification can
7678    be made.  */
7679
7680 static tree
7681 fold_builtin_bitop (tree fndecl, tree arg)
7682 {
7683   if (!validate_arg (arg, INTEGER_TYPE))
7684     return NULL_TREE;
7685
7686   /* Optimize for constant argument.  */
7687   if (TREE_CODE (arg) == INTEGER_CST && !TREE_OVERFLOW (arg))
7688     {
7689       HOST_WIDE_INT hi, width, result;
7690       unsigned HOST_WIDE_INT lo;
7691       tree type;
7692
7693       type = TREE_TYPE (arg);
7694       width = TYPE_PRECISION (type);
7695       lo = TREE_INT_CST_LOW (arg);
7696
7697       /* Clear all the bits that are beyond the type's precision.  */
7698       if (width > HOST_BITS_PER_WIDE_INT)
7699         {
7700           hi = TREE_INT_CST_HIGH (arg);
7701           if (width < 2 * HOST_BITS_PER_WIDE_INT)
7702             hi &= ~((HOST_WIDE_INT) (-1) >> (width - HOST_BITS_PER_WIDE_INT));
7703         }
7704       else
7705         {
7706           hi = 0;
7707           if (width < HOST_BITS_PER_WIDE_INT)
7708             lo &= ~((unsigned HOST_WIDE_INT) (-1) << width);
7709         }
7710
7711       switch (DECL_FUNCTION_CODE (fndecl))
7712         {
7713         CASE_INT_FN (BUILT_IN_FFS):
7714           if (lo != 0)
7715             result = exact_log2 (lo & -lo) + 1;
7716           else if (hi != 0)
7717             result = HOST_BITS_PER_WIDE_INT + exact_log2 (hi & -hi) + 1;
7718           else
7719             result = 0;
7720           break;
7721
7722         CASE_INT_FN (BUILT_IN_CLZ):
7723           if (hi != 0)
7724             result = width - floor_log2 (hi) - 1 - HOST_BITS_PER_WIDE_INT;
7725           else if (lo != 0)
7726             result = width - floor_log2 (lo) - 1;
7727           else if (! CLZ_DEFINED_VALUE_AT_ZERO (TYPE_MODE (type), result))
7728             result = width;
7729           break;
7730
7731         CASE_INT_FN (BUILT_IN_CTZ):
7732           if (lo != 0)
7733             result = exact_log2 (lo & -lo);
7734           else if (hi != 0)
7735             result = HOST_BITS_PER_WIDE_INT + exact_log2 (hi & -hi);
7736           else if (! CTZ_DEFINED_VALUE_AT_ZERO (TYPE_MODE (type), result))
7737             result = width;
7738           break;
7739
7740         CASE_INT_FN (BUILT_IN_POPCOUNT):
7741           result = 0;
7742           while (lo)
7743             result++, lo &= lo - 1;
7744           while (hi)
7745             result++, hi &= hi - 1;
7746           break;
7747
7748         CASE_INT_FN (BUILT_IN_PARITY):
7749           result = 0;
7750           while (lo)
7751             result++, lo &= lo - 1;
7752           while (hi)
7753             result++, hi &= hi - 1;
7754           result &= 1;
7755           break;
7756
7757         default:
7758           gcc_unreachable ();
7759         }
7760
7761       return build_int_cst (TREE_TYPE (TREE_TYPE (fndecl)), result);
7762     }
7763
7764   return NULL_TREE;
7765 }
7766
7767 /* Fold function call to builtin_bswap and the long and long long
7768    variants.  Return NULL_TREE if no simplification can be made.  */
7769 static tree
7770 fold_builtin_bswap (tree fndecl, tree arg)
7771 {
7772   if (! validate_arg (arg, INTEGER_TYPE))
7773     return NULL_TREE;
7774
7775   /* Optimize constant value.  */
7776   if (TREE_CODE (arg) == INTEGER_CST && !TREE_OVERFLOW (arg))
7777     {
7778       HOST_WIDE_INT hi, width, r_hi = 0;
7779       unsigned HOST_WIDE_INT lo, r_lo = 0;
7780       tree type;
7781
7782       type = TREE_TYPE (arg);
7783       width = TYPE_PRECISION (type);
7784       lo = TREE_INT_CST_LOW (arg);
7785       hi = TREE_INT_CST_HIGH (arg);
7786
7787       switch (DECL_FUNCTION_CODE (fndecl))
7788         {
7789           case BUILT_IN_BSWAP32:
7790           case BUILT_IN_BSWAP64:
7791             {
7792               int s;
7793
7794               for (s = 0; s < width; s += 8)
7795                 {
7796                   int d = width - s - 8;
7797                   unsigned HOST_WIDE_INT byte;
7798
7799                   if (s < HOST_BITS_PER_WIDE_INT)
7800                     byte = (lo >> s) & 0xff;
7801                   else
7802                     byte = (hi >> (s - HOST_BITS_PER_WIDE_INT)) & 0xff;
7803
7804                   if (d < HOST_BITS_PER_WIDE_INT)
7805                     r_lo |= byte << d;
7806                   else
7807                     r_hi |= byte << (d - HOST_BITS_PER_WIDE_INT);
7808                 }
7809             }
7810
7811             break;
7812
7813         default:
7814           gcc_unreachable ();
7815         }
7816
7817       if (width < HOST_BITS_PER_WIDE_INT)
7818         return build_int_cst (TREE_TYPE (TREE_TYPE (fndecl)), r_lo);
7819       else
7820         return build_int_cst_wide (TREE_TYPE (TREE_TYPE (fndecl)), r_lo, r_hi);
7821     }
7822
7823   return NULL_TREE;
7824 }
7825
7826 /* A subroutine of fold_builtin to fold the various logarithmic
7827    functions.  Return NULL_TREE if no simplification can me made.
7828    FUNC is the corresponding MPFR logarithm function.  */
7829
7830 static tree
7831 fold_builtin_logarithm (location_t loc, tree fndecl, tree arg,
7832                         int (*func)(mpfr_ptr, mpfr_srcptr, mp_rnd_t))
7833 {
7834   if (validate_arg (arg, REAL_TYPE))
7835     {
7836       tree type = TREE_TYPE (TREE_TYPE (fndecl));
7837       tree res;
7838       const enum built_in_function fcode = builtin_mathfn_code (arg);
7839
7840       /* Calculate the result when the argument is a constant.  */
7841       if ((res = do_mpfr_arg1 (arg, type, func, &dconst0, NULL, false)))
7842         return res;
7843
7844       /* Special case, optimize logN(expN(x)) = x.  */
7845       if (flag_unsafe_math_optimizations
7846           && ((func == mpfr_log
7847                && (fcode == BUILT_IN_EXP
7848                    || fcode == BUILT_IN_EXPF
7849                    || fcode == BUILT_IN_EXPL))
7850               || (func == mpfr_log2
7851                   && (fcode == BUILT_IN_EXP2
7852                       || fcode == BUILT_IN_EXP2F
7853                       || fcode == BUILT_IN_EXP2L))
7854               || (func == mpfr_log10 && (BUILTIN_EXP10_P (fcode)))))
7855         return fold_convert_loc (loc, type, CALL_EXPR_ARG (arg, 0));
7856
7857       /* Optimize logN(func()) for various exponential functions.  We
7858          want to determine the value "x" and the power "exponent" in
7859          order to transform logN(x**exponent) into exponent*logN(x).  */
7860       if (flag_unsafe_math_optimizations)
7861         {
7862           tree exponent = 0, x = 0;
7863
7864           switch (fcode)
7865           {
7866           CASE_FLT_FN (BUILT_IN_EXP):
7867             /* Prepare to do logN(exp(exponent) -> exponent*logN(e).  */
7868             x = build_real (type, real_value_truncate (TYPE_MODE (type),
7869                                                        dconst_e ()));
7870             exponent = CALL_EXPR_ARG (arg, 0);
7871             break;
7872           CASE_FLT_FN (BUILT_IN_EXP2):
7873             /* Prepare to do logN(exp2(exponent) -> exponent*logN(2).  */
7874             x = build_real (type, dconst2);
7875             exponent = CALL_EXPR_ARG (arg, 0);
7876             break;
7877           CASE_FLT_FN (BUILT_IN_EXP10):
7878           CASE_FLT_FN (BUILT_IN_POW10):
7879             /* Prepare to do logN(exp10(exponent) -> exponent*logN(10).  */
7880             {
7881               REAL_VALUE_TYPE dconst10;
7882               real_from_integer (&dconst10, VOIDmode, 10, 0, 0);
7883               x = build_real (type, dconst10);
7884             }
7885             exponent = CALL_EXPR_ARG (arg, 0);
7886             break;
7887           CASE_FLT_FN (BUILT_IN_SQRT):
7888             /* Prepare to do logN(sqrt(x) -> 0.5*logN(x).  */
7889             x = CALL_EXPR_ARG (arg, 0);
7890             exponent = build_real (type, dconsthalf);
7891             break;
7892           CASE_FLT_FN (BUILT_IN_CBRT):
7893             /* Prepare to do logN(cbrt(x) -> (1/3)*logN(x).  */
7894             x = CALL_EXPR_ARG (arg, 0);
7895             exponent = build_real (type, real_value_truncate (TYPE_MODE (type),
7896                                                               dconst_third ()));
7897             break;
7898           CASE_FLT_FN (BUILT_IN_POW):
7899             /* Prepare to do logN(pow(x,exponent) -> exponent*logN(x).  */
7900             x = CALL_EXPR_ARG (arg, 0);
7901             exponent = CALL_EXPR_ARG (arg, 1);
7902             break;
7903           default:
7904             break;
7905           }
7906
7907           /* Now perform the optimization.  */
7908           if (x && exponent)
7909             {
7910               tree logfn = build_call_expr_loc (loc, fndecl, 1, x);
7911               return fold_build2_loc (loc, MULT_EXPR, type, exponent, logfn);
7912             }
7913         }
7914     }
7915
7916   return NULL_TREE;
7917 }
7918
7919 /* Fold a builtin function call to hypot, hypotf, or hypotl.  Return
7920    NULL_TREE if no simplification can be made.  */
7921
7922 static tree
7923 fold_builtin_hypot (location_t loc, tree fndecl,
7924                     tree arg0, tree arg1, tree type)
7925 {
7926   tree res, narg0, narg1;
7927
7928   if (!validate_arg (arg0, REAL_TYPE)
7929       || !validate_arg (arg1, REAL_TYPE))
7930     return NULL_TREE;
7931
7932   /* Calculate the result when the argument is a constant.  */
7933   if ((res = do_mpfr_arg2 (arg0, arg1, type, mpfr_hypot)))
7934     return res;
7935
7936   /* If either argument to hypot has a negate or abs, strip that off.
7937      E.g. hypot(-x,fabs(y)) -> hypot(x,y).  */
7938   narg0 = fold_strip_sign_ops (arg0);
7939   narg1 = fold_strip_sign_ops (arg1);
7940   if (narg0 || narg1)
7941     {
7942       return build_call_expr_loc (loc, fndecl, 2, narg0 ? narg0 : arg0,
7943                               narg1 ? narg1 : arg1);
7944     }
7945
7946   /* If either argument is zero, hypot is fabs of the other.  */
7947   if (real_zerop (arg0))
7948     return fold_build1_loc (loc, ABS_EXPR, type, arg1);
7949   else if (real_zerop (arg1))
7950     return fold_build1_loc (loc, ABS_EXPR, type, arg0);
7951
7952   /* hypot(x,x) -> fabs(x)*sqrt(2).  */
7953   if (flag_unsafe_math_optimizations
7954       && operand_equal_p (arg0, arg1, OEP_PURE_SAME))
7955     {
7956       const REAL_VALUE_TYPE sqrt2_trunc
7957         = real_value_truncate (TYPE_MODE (type), dconst_sqrt2 ());
7958       return fold_build2_loc (loc, MULT_EXPR, type,
7959                           fold_build1_loc (loc, ABS_EXPR, type, arg0),
7960                           build_real (type, sqrt2_trunc));
7961     }
7962
7963   return NULL_TREE;
7964 }
7965
7966
7967 /* Fold a builtin function call to pow, powf, or powl.  Return
7968    NULL_TREE if no simplification can be made.  */
7969 static tree
7970 fold_builtin_pow (location_t loc, tree fndecl, tree arg0, tree arg1, tree type)
7971 {
7972   tree res;
7973
7974   if (!validate_arg (arg0, REAL_TYPE)
7975        || !validate_arg (arg1, REAL_TYPE))
7976     return NULL_TREE;
7977
7978   /* Calculate the result when the argument is a constant.  */
7979   if ((res = do_mpfr_arg2 (arg0, arg1, type, mpfr_pow)))
7980     return res;
7981
7982   /* Optimize pow(1.0,y) = 1.0.  */
7983   if (real_onep (arg0))
7984     return omit_one_operand_loc (loc, type, build_real (type, dconst1), arg1);
7985
7986   if (TREE_CODE (arg1) == REAL_CST
7987       && !TREE_OVERFLOW (arg1))
7988     {
7989       REAL_VALUE_TYPE cint;
7990       REAL_VALUE_TYPE c;
7991       HOST_WIDE_INT n;
7992
7993       c = TREE_REAL_CST (arg1);
7994
7995       /* Optimize pow(x,0.0) = 1.0.  */
7996       if (REAL_VALUES_EQUAL (c, dconst0))
7997         return omit_one_operand_loc (loc, type, build_real (type, dconst1),
7998                                  arg0);
7999
8000       /* Optimize pow(x,1.0) = x.  */
8001       if (REAL_VALUES_EQUAL (c, dconst1))
8002         return arg0;
8003
8004       /* Optimize pow(x,-1.0) = 1.0/x.  */
8005       if (REAL_VALUES_EQUAL (c, dconstm1))
8006         return fold_build2_loc (loc, RDIV_EXPR, type,
8007                             build_real (type, dconst1), arg0);
8008
8009       /* Optimize pow(x,0.5) = sqrt(x).  */
8010       if (flag_unsafe_math_optimizations
8011           && REAL_VALUES_EQUAL (c, dconsthalf))
8012         {
8013           tree sqrtfn = mathfn_built_in (type, BUILT_IN_SQRT);
8014
8015           if (sqrtfn != NULL_TREE)
8016             return build_call_expr_loc (loc, sqrtfn, 1, arg0);
8017         }
8018
8019       /* Optimize pow(x,1.0/3.0) = cbrt(x).  */
8020       if (flag_unsafe_math_optimizations)
8021         {
8022           const REAL_VALUE_TYPE dconstroot
8023             = real_value_truncate (TYPE_MODE (type), dconst_third ());
8024
8025           if (REAL_VALUES_EQUAL (c, dconstroot))
8026             {
8027               tree cbrtfn = mathfn_built_in (type, BUILT_IN_CBRT);
8028               if (cbrtfn != NULL_TREE)
8029                 return build_call_expr_loc (loc, cbrtfn, 1, arg0);
8030             }
8031         }
8032
8033       /* Check for an integer exponent.  */
8034       n = real_to_integer (&c);
8035       real_from_integer (&cint, VOIDmode, n, n < 0 ? -1 : 0, 0);
8036       if (real_identical (&c, &cint))
8037         {
8038           /* Attempt to evaluate pow at compile-time, unless this should
8039              raise an exception.  */
8040           if (TREE_CODE (arg0) == REAL_CST
8041               && !TREE_OVERFLOW (arg0)
8042               && (n > 0
8043                   || (!flag_trapping_math && !flag_errno_math)
8044                   || !REAL_VALUES_EQUAL (TREE_REAL_CST (arg0), dconst0)))
8045             {
8046               REAL_VALUE_TYPE x;
8047               bool inexact;
8048
8049               x = TREE_REAL_CST (arg0);
8050               inexact = real_powi (&x, TYPE_MODE (type), &x, n);
8051               if (flag_unsafe_math_optimizations || !inexact)
8052                 return build_real (type, x);
8053             }
8054
8055           /* Strip sign ops from even integer powers.  */
8056           if ((n & 1) == 0 && flag_unsafe_math_optimizations)
8057             {
8058               tree narg0 = fold_strip_sign_ops (arg0);
8059               if (narg0)
8060                 return build_call_expr_loc (loc, fndecl, 2, narg0, arg1);
8061             }
8062         }
8063     }
8064
8065   if (flag_unsafe_math_optimizations)
8066     {
8067       const enum built_in_function fcode = builtin_mathfn_code (arg0);
8068
8069       /* Optimize pow(expN(x),y) = expN(x*y).  */
8070       if (BUILTIN_EXPONENT_P (fcode))
8071         {
8072           tree expfn = TREE_OPERAND (CALL_EXPR_FN (arg0), 0);
8073           tree arg = CALL_EXPR_ARG (arg0, 0);
8074           arg = fold_build2_loc (loc, MULT_EXPR, type, arg, arg1);
8075           return build_call_expr_loc (loc, expfn, 1, arg);
8076         }
8077
8078       /* Optimize pow(sqrt(x),y) = pow(x,y*0.5).  */
8079       if (BUILTIN_SQRT_P (fcode))
8080         {
8081           tree narg0 = CALL_EXPR_ARG (arg0, 0);
8082           tree narg1 = fold_build2_loc (loc, MULT_EXPR, type, arg1,
8083                                     build_real (type, dconsthalf));
8084           return build_call_expr_loc (loc, fndecl, 2, narg0, narg1);
8085         }
8086
8087       /* Optimize pow(cbrt(x),y) = pow(x,y/3) iff x is nonnegative.  */
8088       if (BUILTIN_CBRT_P (fcode))
8089         {
8090           tree arg = CALL_EXPR_ARG (arg0, 0);
8091           if (tree_expr_nonnegative_p (arg))
8092             {
8093               const REAL_VALUE_TYPE dconstroot
8094                 = real_value_truncate (TYPE_MODE (type), dconst_third ());
8095               tree narg1 = fold_build2_loc (loc, MULT_EXPR, type, arg1,
8096                                         build_real (type, dconstroot));
8097               return build_call_expr_loc (loc, fndecl, 2, arg, narg1);
8098             }
8099         }
8100
8101       /* Optimize pow(pow(x,y),z) = pow(x,y*z) iff x is nonnegative.  */
8102       if (fcode == BUILT_IN_POW
8103           || fcode == BUILT_IN_POWF
8104           || fcode == BUILT_IN_POWL)
8105         {
8106           tree arg00 = CALL_EXPR_ARG (arg0, 0);
8107           if (tree_expr_nonnegative_p (arg00))
8108             {
8109               tree arg01 = CALL_EXPR_ARG (arg0, 1);
8110               tree narg1 = fold_build2_loc (loc, MULT_EXPR, type, arg01, arg1);
8111               return build_call_expr_loc (loc, fndecl, 2, arg00, narg1);
8112             }
8113         }
8114     }
8115
8116   return NULL_TREE;
8117 }
8118
8119 /* Fold a builtin function call to powi, powif, or powil with argument ARG.
8120    Return NULL_TREE if no simplification can be made.  */
8121 static tree
8122 fold_builtin_powi (location_t loc, tree fndecl ATTRIBUTE_UNUSED,
8123                    tree arg0, tree arg1, tree type)
8124 {
8125   if (!validate_arg (arg0, REAL_TYPE)
8126       || !validate_arg (arg1, INTEGER_TYPE))
8127     return NULL_TREE;
8128
8129   /* Optimize pow(1.0,y) = 1.0.  */
8130   if (real_onep (arg0))
8131     return omit_one_operand_loc (loc, type, build_real (type, dconst1), arg1);
8132
8133   if (host_integerp (arg1, 0))
8134     {
8135       HOST_WIDE_INT c = TREE_INT_CST_LOW (arg1);
8136
8137       /* Evaluate powi at compile-time.  */
8138       if (TREE_CODE (arg0) == REAL_CST
8139           && !TREE_OVERFLOW (arg0))
8140         {
8141           REAL_VALUE_TYPE x;
8142           x = TREE_REAL_CST (arg0);
8143           real_powi (&x, TYPE_MODE (type), &x, c);
8144           return build_real (type, x);
8145         }
8146
8147       /* Optimize pow(x,0) = 1.0.  */
8148       if (c == 0)
8149         return omit_one_operand_loc (loc, type, build_real (type, dconst1),
8150                                  arg0);
8151
8152       /* Optimize pow(x,1) = x.  */
8153       if (c == 1)
8154         return arg0;
8155
8156       /* Optimize pow(x,-1) = 1.0/x.  */
8157       if (c == -1)
8158         return fold_build2_loc (loc, RDIV_EXPR, type,
8159                            build_real (type, dconst1), arg0);
8160     }
8161
8162   return NULL_TREE;
8163 }
8164
8165 /* A subroutine of fold_builtin to fold the various exponent
8166    functions.  Return NULL_TREE if no simplification can be made.
8167    FUNC is the corresponding MPFR exponent function.  */
8168
8169 static tree
8170 fold_builtin_exponent (location_t loc, tree fndecl, tree arg,
8171                        int (*func)(mpfr_ptr, mpfr_srcptr, mp_rnd_t))
8172 {
8173   if (validate_arg (arg, REAL_TYPE))
8174     {
8175       tree type = TREE_TYPE (TREE_TYPE (fndecl));
8176       tree res;
8177
8178       /* Calculate the result when the argument is a constant.  */
8179       if ((res = do_mpfr_arg1 (arg, type, func, NULL, NULL, 0)))
8180         return res;
8181
8182       /* Optimize expN(logN(x)) = x.  */
8183       if (flag_unsafe_math_optimizations)
8184         {
8185           const enum built_in_function fcode = builtin_mathfn_code (arg);
8186
8187           if ((func == mpfr_exp
8188                && (fcode == BUILT_IN_LOG
8189                    || fcode == BUILT_IN_LOGF
8190                    || fcode == BUILT_IN_LOGL))
8191               || (func == mpfr_exp2
8192                   && (fcode == BUILT_IN_LOG2
8193                       || fcode == BUILT_IN_LOG2F
8194                       || fcode == BUILT_IN_LOG2L))
8195               || (func == mpfr_exp10
8196                   && (fcode == BUILT_IN_LOG10
8197                       || fcode == BUILT_IN_LOG10F
8198                       || fcode == BUILT_IN_LOG10L)))
8199             return fold_convert_loc (loc, type, CALL_EXPR_ARG (arg, 0));
8200         }
8201     }
8202
8203   return NULL_TREE;
8204 }
8205
8206 /* Return true if VAR is a VAR_DECL or a component thereof.  */
8207
8208 static bool
8209 var_decl_component_p (tree var)
8210 {
8211   tree inner = var;
8212   while (handled_component_p (inner))
8213     inner = TREE_OPERAND (inner, 0);
8214   return SSA_VAR_P (inner);
8215 }
8216
8217 /* Fold function call to builtin memset.  Return
8218    NULL_TREE if no simplification can be made.  */
8219
8220 static tree
8221 fold_builtin_memset (location_t loc, tree dest, tree c, tree len,
8222                      tree type, bool ignore)
8223 {
8224   tree var, ret, etype;
8225   unsigned HOST_WIDE_INT length, cval;
8226
8227   if (! validate_arg (dest, POINTER_TYPE)
8228       || ! validate_arg (c, INTEGER_TYPE)
8229       || ! validate_arg (len, INTEGER_TYPE))
8230     return NULL_TREE;
8231
8232   if (! host_integerp (len, 1))
8233     return NULL_TREE;
8234
8235   /* If the LEN parameter is zero, return DEST.  */
8236   if (integer_zerop (len))
8237     return omit_one_operand_loc (loc, type, dest, c);
8238
8239   if (! host_integerp (c, 1) || TREE_SIDE_EFFECTS (dest))
8240     return NULL_TREE;
8241
8242   var = dest;
8243   STRIP_NOPS (var);
8244   if (TREE_CODE (var) != ADDR_EXPR)
8245     return NULL_TREE;
8246
8247   var = TREE_OPERAND (var, 0);
8248   if (TREE_THIS_VOLATILE (var))
8249     return NULL_TREE;
8250
8251   etype = TREE_TYPE (var);
8252   if (TREE_CODE (etype) == ARRAY_TYPE)
8253     etype = TREE_TYPE (etype);
8254
8255   if (!INTEGRAL_TYPE_P (etype)
8256       && !POINTER_TYPE_P (etype))
8257     return NULL_TREE;
8258
8259   if (! var_decl_component_p (var))
8260     return NULL_TREE;
8261
8262   length = tree_low_cst (len, 1);
8263   if (GET_MODE_SIZE (TYPE_MODE (etype)) != length
8264       || get_pointer_alignment (dest, BIGGEST_ALIGNMENT) / BITS_PER_UNIT
8265          < (int) length)
8266     return NULL_TREE;
8267
8268   if (length > HOST_BITS_PER_WIDE_INT / BITS_PER_UNIT)
8269     return NULL_TREE;
8270
8271   if (integer_zerop (c))
8272     cval = 0;
8273   else
8274     {
8275       if (CHAR_BIT != 8 || BITS_PER_UNIT != 8 || HOST_BITS_PER_WIDE_INT > 64)
8276         return NULL_TREE;
8277
8278       cval = tree_low_cst (c, 1);
8279       cval &= 0xff;
8280       cval |= cval << 8;
8281       cval |= cval << 16;
8282       cval |= (cval << 31) << 1;
8283     }
8284
8285   ret = build_int_cst_type (etype, cval);
8286   var = build_fold_indirect_ref_loc (loc,
8287                                  fold_convert_loc (loc,
8288                                                    build_pointer_type (etype),
8289                                                    dest));
8290   ret = build2 (MODIFY_EXPR, etype, var, ret);
8291   if (ignore)
8292     return ret;
8293
8294   return omit_one_operand_loc (loc, type, dest, ret);
8295 }
8296
8297 /* Fold function call to builtin memset.  Return
8298    NULL_TREE if no simplification can be made.  */
8299
8300 static tree
8301 fold_builtin_bzero (location_t loc, tree dest, tree size, bool ignore)
8302 {
8303   if (! validate_arg (dest, POINTER_TYPE)
8304       || ! validate_arg (size, INTEGER_TYPE))
8305     return NULL_TREE;
8306
8307   if (!ignore)
8308     return NULL_TREE;
8309
8310   /* New argument list transforming bzero(ptr x, int y) to
8311      memset(ptr x, int 0, size_t y).   This is done this way
8312      so that if it isn't expanded inline, we fallback to
8313      calling bzero instead of memset.  */
8314
8315   return fold_builtin_memset (loc, dest, integer_zero_node,
8316                               fold_convert_loc (loc, sizetype, size),
8317                               void_type_node, ignore);
8318 }
8319
8320 /* Fold function call to builtin mem{{,p}cpy,move}.  Return
8321    NULL_TREE if no simplification can be made.
8322    If ENDP is 0, return DEST (like memcpy).
8323    If ENDP is 1, return DEST+LEN (like mempcpy).
8324    If ENDP is 2, return DEST+LEN-1 (like stpcpy).
8325    If ENDP is 3, return DEST, additionally *SRC and *DEST may overlap
8326    (memmove).   */
8327
8328 static tree
8329 fold_builtin_memory_op (location_t loc, tree dest, tree src,
8330                         tree len, tree type, bool ignore, int endp)
8331 {
8332   tree destvar, srcvar, expr;
8333
8334   if (! validate_arg (dest, POINTER_TYPE)
8335       || ! validate_arg (src, POINTER_TYPE)
8336       || ! validate_arg (len, INTEGER_TYPE))
8337     return NULL_TREE;
8338
8339   /* If the LEN parameter is zero, return DEST.  */
8340   if (integer_zerop (len))
8341     return omit_one_operand_loc (loc, type, dest, src);
8342
8343   /* If SRC and DEST are the same (and not volatile), return
8344      DEST{,+LEN,+LEN-1}.  */
8345   if (operand_equal_p (src, dest, 0))
8346     expr = len;
8347   else
8348     {
8349       tree srctype, desttype;
8350       int src_align, dest_align;
8351       tree off0;
8352
8353       if (endp == 3)
8354         {
8355           src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
8356           dest_align = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
8357
8358           /* Both DEST and SRC must be pointer types.
8359              ??? This is what old code did.  Is the testing for pointer types
8360              really mandatory?
8361
8362              If either SRC is readonly or length is 1, we can use memcpy.  */
8363           if (!dest_align || !src_align)
8364             return NULL_TREE;
8365           if (readonly_data_expr (src)
8366               || (host_integerp (len, 1)
8367                   && (MIN (src_align, dest_align) / BITS_PER_UNIT
8368                       >= tree_low_cst (len, 1))))
8369             {
8370               tree fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
8371               if (!fn)
8372                 return NULL_TREE;
8373               return build_call_expr_loc (loc, fn, 3, dest, src, len);
8374             }
8375
8376           /* If *src and *dest can't overlap, optimize into memcpy as well.  */
8377           if (TREE_CODE (src) == ADDR_EXPR
8378               && TREE_CODE (dest) == ADDR_EXPR)
8379             {
8380               tree src_base, dest_base, fn;
8381               HOST_WIDE_INT src_offset = 0, dest_offset = 0;
8382               HOST_WIDE_INT size = -1;
8383               HOST_WIDE_INT maxsize = -1;
8384
8385               srcvar = TREE_OPERAND (src, 0);
8386               src_base = get_ref_base_and_extent (srcvar, &src_offset,
8387                                                   &size, &maxsize);
8388               destvar = TREE_OPERAND (dest, 0);
8389               dest_base = get_ref_base_and_extent (destvar, &dest_offset,
8390                                                    &size, &maxsize);
8391               if (host_integerp (len, 1))
8392                 maxsize = tree_low_cst (len, 1);
8393               else
8394                 maxsize = -1;
8395               src_offset /= BITS_PER_UNIT;
8396               dest_offset /= BITS_PER_UNIT;
8397               if (SSA_VAR_P (src_base)
8398                   && SSA_VAR_P (dest_base))
8399                 {
8400                   if (operand_equal_p (src_base, dest_base, 0)
8401                       && ranges_overlap_p (src_offset, maxsize,
8402                                            dest_offset, maxsize))
8403                     return NULL_TREE;
8404                 }
8405               else if (TREE_CODE (src_base) == MEM_REF
8406                        && TREE_CODE (dest_base) == MEM_REF)
8407                 {
8408                   double_int off;
8409                   if (! operand_equal_p (TREE_OPERAND (src_base, 0),
8410                                          TREE_OPERAND (dest_base, 0), 0))
8411                     return NULL_TREE;
8412                   off = double_int_add (mem_ref_offset (src_base),
8413                                         shwi_to_double_int (src_offset));
8414                   if (!double_int_fits_in_shwi_p (off))
8415                     return NULL_TREE;
8416                   src_offset = off.low;
8417                   off = double_int_add (mem_ref_offset (dest_base),
8418                                         shwi_to_double_int (dest_offset));
8419                   if (!double_int_fits_in_shwi_p (off))
8420                     return NULL_TREE;
8421                   dest_offset = off.low;
8422                   if (ranges_overlap_p (src_offset, maxsize,
8423                                         dest_offset, maxsize))
8424                     return NULL_TREE;
8425                 }
8426               else
8427                 return NULL_TREE;
8428
8429               fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
8430               if (!fn)
8431                 return NULL_TREE;
8432               return build_call_expr_loc (loc, fn, 3, dest, src, len);
8433             }
8434           return NULL_TREE;
8435         }
8436
8437       if (!host_integerp (len, 0))
8438         return NULL_TREE;
8439       /* FIXME:
8440          This logic lose for arguments like (type *)malloc (sizeof (type)),
8441          since we strip the casts of up to VOID return value from malloc.
8442          Perhaps we ought to inherit type from non-VOID argument here?  */
8443       STRIP_NOPS (src);
8444       STRIP_NOPS (dest);
8445       /* As we fold (void *)(p + CST) to (void *)p + CST undo this here.  */
8446       if (TREE_CODE (src) == POINTER_PLUS_EXPR)
8447         {
8448           tree tem = TREE_OPERAND (src, 0);
8449           STRIP_NOPS (tem);
8450           if (tem != TREE_OPERAND (src, 0))
8451             src = build1 (NOP_EXPR, TREE_TYPE (tem), src);
8452         }
8453       if (TREE_CODE (dest) == POINTER_PLUS_EXPR)
8454         {
8455           tree tem = TREE_OPERAND (dest, 0);
8456           STRIP_NOPS (tem);
8457           if (tem != TREE_OPERAND (dest, 0))
8458             dest = build1 (NOP_EXPR, TREE_TYPE (tem), dest);
8459         }
8460       srctype = TREE_TYPE (TREE_TYPE (src));
8461       if (srctype
8462           && TREE_CODE (srctype) == ARRAY_TYPE
8463           && !tree_int_cst_equal (TYPE_SIZE_UNIT (srctype), len))
8464         {
8465           srctype = TREE_TYPE (srctype);
8466           STRIP_NOPS (src);
8467           src = build1 (NOP_EXPR, build_pointer_type (srctype), src);
8468         }
8469       desttype = TREE_TYPE (TREE_TYPE (dest));
8470       if (desttype
8471           && TREE_CODE (desttype) == ARRAY_TYPE
8472           && !tree_int_cst_equal (TYPE_SIZE_UNIT (desttype), len))
8473         {
8474           desttype = TREE_TYPE (desttype);
8475           STRIP_NOPS (dest);
8476           dest = build1 (NOP_EXPR, build_pointer_type (desttype), dest);
8477         }
8478       if (!srctype || !desttype
8479           || TREE_ADDRESSABLE (srctype)
8480           || TREE_ADDRESSABLE (desttype)
8481           || !TYPE_SIZE_UNIT (srctype)
8482           || !TYPE_SIZE_UNIT (desttype)
8483           || TREE_CODE (TYPE_SIZE_UNIT (srctype)) != INTEGER_CST
8484           || TREE_CODE (TYPE_SIZE_UNIT (desttype)) != INTEGER_CST)
8485         return NULL_TREE;
8486
8487       src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
8488       dest_align = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
8489       if (dest_align < (int) TYPE_ALIGN (desttype)
8490           || src_align < (int) TYPE_ALIGN (srctype))
8491         return NULL_TREE;
8492
8493       if (!ignore)
8494         dest = builtin_save_expr (dest);
8495
8496       /* Build accesses at offset zero with a ref-all character type.  */
8497       off0 = build_int_cst (build_pointer_type_for_mode (char_type_node,
8498                                                          ptr_mode, true), 0);
8499
8500       destvar = dest;
8501       STRIP_NOPS (destvar);
8502       if (TREE_CODE (destvar) == ADDR_EXPR
8503           && var_decl_component_p (TREE_OPERAND (destvar, 0))
8504           && tree_int_cst_equal (TYPE_SIZE_UNIT (desttype), len))
8505         destvar = fold_build2 (MEM_REF, desttype, destvar, off0);
8506       else
8507         destvar = NULL_TREE;
8508
8509       srcvar = src;
8510       STRIP_NOPS (srcvar);
8511       if (TREE_CODE (srcvar) == ADDR_EXPR
8512           && var_decl_component_p (TREE_OPERAND (srcvar, 0))
8513           && tree_int_cst_equal (TYPE_SIZE_UNIT (srctype), len))
8514         srcvar = fold_build2 (MEM_REF, destvar ? desttype : srctype,
8515                               srcvar, off0);
8516       else
8517         srcvar = NULL_TREE;
8518
8519       if (srcvar == NULL_TREE && destvar == NULL_TREE)
8520         return NULL_TREE;
8521
8522       if (srcvar == NULL_TREE)
8523         {
8524           STRIP_NOPS (src);
8525           srcvar = fold_build2 (MEM_REF, desttype, src, off0);
8526         }
8527       else if (destvar == NULL_TREE)
8528         {
8529           STRIP_NOPS (dest);
8530           destvar = fold_build2 (MEM_REF, srctype, dest, off0);
8531         }
8532
8533       expr = build2 (MODIFY_EXPR, TREE_TYPE (destvar), destvar, srcvar);
8534     }
8535
8536   if (ignore)
8537     return expr;
8538
8539   if (endp == 0 || endp == 3)
8540     return omit_one_operand_loc (loc, type, dest, expr);
8541
8542   if (expr == len)
8543     expr = NULL_TREE;
8544
8545   if (endp == 2)
8546     len = fold_build2_loc (loc, MINUS_EXPR, TREE_TYPE (len), len,
8547                        ssize_int (1));
8548
8549   len = fold_convert_loc (loc, sizetype, len);
8550   dest = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len);
8551   dest = fold_convert_loc (loc, type, dest);
8552   if (expr)
8553     dest = omit_one_operand_loc (loc, type, dest, expr);
8554   return dest;
8555 }
8556
8557 /* Fold function call to builtin strcpy with arguments DEST and SRC.
8558    If LEN is not NULL, it represents the length of the string to be
8559    copied.  Return NULL_TREE if no simplification can be made.  */
8560
8561 tree
8562 fold_builtin_strcpy (location_t loc, tree fndecl, tree dest, tree src, tree len)
8563 {
8564   tree fn;
8565
8566   if (!validate_arg (dest, POINTER_TYPE)
8567       || !validate_arg (src, POINTER_TYPE))
8568     return NULL_TREE;
8569
8570   /* If SRC and DEST are the same (and not volatile), return DEST.  */
8571   if (operand_equal_p (src, dest, 0))
8572     return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest);
8573
8574   if (optimize_function_for_size_p (cfun))
8575     return NULL_TREE;
8576
8577   fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
8578   if (!fn)
8579     return NULL_TREE;
8580
8581   if (!len)
8582     {
8583       len = c_strlen (src, 1);
8584       if (! len || TREE_SIDE_EFFECTS (len))
8585         return NULL_TREE;
8586     }
8587
8588   len = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
8589   return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)),
8590                            build_call_expr_loc (loc, fn, 3, dest, src, len));
8591 }
8592
8593 /* Fold function call to builtin stpcpy with arguments DEST and SRC.
8594    Return NULL_TREE if no simplification can be made.  */
8595
8596 static tree
8597 fold_builtin_stpcpy (location_t loc, tree fndecl, tree dest, tree src)
8598 {
8599   tree fn, len, lenp1, call, type;
8600
8601   if (!validate_arg (dest, POINTER_TYPE)
8602       || !validate_arg (src, POINTER_TYPE))
8603     return NULL_TREE;
8604
8605   len = c_strlen (src, 1);
8606   if (!len
8607       || TREE_CODE (len) != INTEGER_CST)
8608     return NULL_TREE;
8609
8610   if (optimize_function_for_size_p (cfun)
8611       /* If length is zero it's small enough.  */
8612       && !integer_zerop (len))
8613     return NULL_TREE;
8614
8615   fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
8616   if (!fn)
8617     return NULL_TREE;
8618
8619   lenp1 = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
8620   /* We use dest twice in building our expression.  Save it from
8621      multiple expansions.  */
8622   dest = builtin_save_expr (dest);
8623   call = build_call_expr_loc (loc, fn, 3, dest, src, lenp1);
8624
8625   type = TREE_TYPE (TREE_TYPE (fndecl));
8626   len = fold_convert_loc (loc, sizetype, len);
8627   dest = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len);
8628   dest = fold_convert_loc (loc, type, dest);
8629   dest = omit_one_operand_loc (loc, type, dest, call);
8630   return dest;
8631 }
8632
8633 /* Fold function call to builtin strncpy with arguments DEST, SRC, and LEN.
8634    If SLEN is not NULL, it represents the length of the source string.
8635    Return NULL_TREE if no simplification can be made.  */
8636
8637 tree
8638 fold_builtin_strncpy (location_t loc, tree fndecl, tree dest,
8639                       tree src, tree len, tree slen)
8640 {
8641   tree fn;
8642
8643   if (!validate_arg (dest, POINTER_TYPE)
8644       || !validate_arg (src, POINTER_TYPE)
8645       || !validate_arg (len, INTEGER_TYPE))
8646     return NULL_TREE;
8647
8648   /* If the LEN parameter is zero, return DEST.  */
8649   if (integer_zerop (len))
8650     return omit_one_operand_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest, src);
8651
8652   /* We can't compare slen with len as constants below if len is not a
8653      constant.  */
8654   if (len == 0 || TREE_CODE (len) != INTEGER_CST)
8655     return NULL_TREE;
8656
8657   if (!slen)
8658     slen = c_strlen (src, 1);
8659
8660   /* Now, we must be passed a constant src ptr parameter.  */
8661   if (slen == 0 || TREE_CODE (slen) != INTEGER_CST)
8662     return NULL_TREE;
8663
8664   slen = size_binop_loc (loc, PLUS_EXPR, slen, ssize_int (1));
8665
8666   /* We do not support simplification of this case, though we do
8667      support it when expanding trees into RTL.  */
8668   /* FIXME: generate a call to __builtin_memset.  */
8669   if (tree_int_cst_lt (slen, len))
8670     return NULL_TREE;
8671
8672   /* OK transform into builtin memcpy.  */
8673   fn = implicit_built_in_decls[BUILT_IN_MEMCPY];
8674   if (!fn)
8675     return NULL_TREE;
8676   return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)),
8677                            build_call_expr_loc (loc, fn, 3, dest, src, len));
8678 }
8679
8680 /* Fold function call to builtin memchr.  ARG1, ARG2 and LEN are the
8681    arguments to the call, and TYPE is its return type.
8682    Return NULL_TREE if no simplification can be made.  */
8683
8684 static tree
8685 fold_builtin_memchr (location_t loc, tree arg1, tree arg2, tree len, tree type)
8686 {
8687   if (!validate_arg (arg1, POINTER_TYPE)
8688       || !validate_arg (arg2, INTEGER_TYPE)
8689       || !validate_arg (len, INTEGER_TYPE))
8690     return NULL_TREE;
8691   else
8692     {
8693       const char *p1;
8694
8695       if (TREE_CODE (arg2) != INTEGER_CST
8696           || !host_integerp (len, 1))
8697         return NULL_TREE;
8698
8699       p1 = c_getstr (arg1);
8700       if (p1 && compare_tree_int (len, strlen (p1) + 1) <= 0)
8701         {
8702           char c;
8703           const char *r;
8704           tree tem;
8705
8706           if (target_char_cast (arg2, &c))
8707             return NULL_TREE;
8708
8709           r = (char *) memchr (p1, c, tree_low_cst (len, 1));
8710
8711           if (r == NULL)
8712             return build_int_cst (TREE_TYPE (arg1), 0);
8713
8714           tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (arg1), arg1,
8715                              size_int (r - p1));
8716           return fold_convert_loc (loc, type, tem);
8717         }
8718       return NULL_TREE;
8719     }
8720 }
8721
8722 /* Fold function call to builtin memcmp with arguments ARG1 and ARG2.
8723    Return NULL_TREE if no simplification can be made.  */
8724
8725 static tree
8726 fold_builtin_memcmp (location_t loc, tree arg1, tree arg2, tree len)
8727 {
8728   const char *p1, *p2;
8729
8730   if (!validate_arg (arg1, POINTER_TYPE)
8731       || !validate_arg (arg2, POINTER_TYPE)
8732       || !validate_arg (len, INTEGER_TYPE))
8733     return NULL_TREE;
8734
8735   /* If the LEN parameter is zero, return zero.  */
8736   if (integer_zerop (len))
8737     return omit_two_operands_loc (loc, integer_type_node, integer_zero_node,
8738                               arg1, arg2);
8739
8740   /* If ARG1 and ARG2 are the same (and not volatile), return zero.  */
8741   if (operand_equal_p (arg1, arg2, 0))
8742     return omit_one_operand_loc (loc, integer_type_node, integer_zero_node, len);
8743
8744   p1 = c_getstr (arg1);
8745   p2 = c_getstr (arg2);
8746
8747   /* If all arguments are constant, and the value of len is not greater
8748      than the lengths of arg1 and arg2, evaluate at compile-time.  */
8749   if (host_integerp (len, 1) && p1 && p2
8750       && compare_tree_int (len, strlen (p1) + 1) <= 0
8751       && compare_tree_int (len, strlen (p2) + 1) <= 0)
8752     {
8753       const int r = memcmp (p1, p2, tree_low_cst (len, 1));
8754
8755       if (r > 0)
8756         return integer_one_node;
8757       else if (r < 0)
8758         return integer_minus_one_node;
8759       else
8760         return integer_zero_node;
8761     }
8762
8763   /* If len parameter is one, return an expression corresponding to
8764      (*(const unsigned char*)arg1 - (const unsigned char*)arg2).  */
8765   if (host_integerp (len, 1) && tree_low_cst (len, 1) == 1)
8766     {
8767       tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
8768       tree cst_uchar_ptr_node
8769         = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
8770
8771       tree ind1
8772         = fold_convert_loc (loc, integer_type_node,
8773                             build1 (INDIRECT_REF, cst_uchar_node,
8774                                     fold_convert_loc (loc,
8775                                                       cst_uchar_ptr_node,
8776                                                       arg1)));
8777       tree ind2
8778         = fold_convert_loc (loc, integer_type_node,
8779                             build1 (INDIRECT_REF, cst_uchar_node,
8780                                     fold_convert_loc (loc,
8781                                                       cst_uchar_ptr_node,
8782                                                       arg2)));
8783       return fold_build2_loc (loc, MINUS_EXPR, integer_type_node, ind1, ind2);
8784     }
8785
8786   return NULL_TREE;
8787 }
8788
8789 /* Fold function call to builtin strcmp with arguments ARG1 and ARG2.
8790    Return NULL_TREE if no simplification can be made.  */
8791
8792 static tree
8793 fold_builtin_strcmp (location_t loc, tree arg1, tree arg2)
8794 {
8795   const char *p1, *p2;
8796
8797   if (!validate_arg (arg1, POINTER_TYPE)
8798       || !validate_arg (arg2, POINTER_TYPE))
8799     return NULL_TREE;
8800
8801   /* If ARG1 and ARG2 are the same (and not volatile), return zero.  */
8802   if (operand_equal_p (arg1, arg2, 0))
8803     return integer_zero_node;
8804
8805   p1 = c_getstr (arg1);
8806   p2 = c_getstr (arg2);
8807
8808   if (p1 && p2)
8809     {
8810       const int i = strcmp (p1, p2);
8811       if (i < 0)
8812         return integer_minus_one_node;
8813       else if (i > 0)
8814         return integer_one_node;
8815       else
8816         return integer_zero_node;
8817     }
8818
8819   /* If the second arg is "", return *(const unsigned char*)arg1.  */
8820   if (p2 && *p2 == '\0')
8821     {
8822       tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
8823       tree cst_uchar_ptr_node
8824         = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
8825
8826       return fold_convert_loc (loc, integer_type_node,
8827                                build1 (INDIRECT_REF, cst_uchar_node,
8828                                        fold_convert_loc (loc,
8829                                                          cst_uchar_ptr_node,
8830                                                          arg1)));
8831     }
8832
8833   /* If the first arg is "", return -*(const unsigned char*)arg2.  */
8834   if (p1 && *p1 == '\0')
8835     {
8836       tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
8837       tree cst_uchar_ptr_node
8838         = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
8839
8840       tree temp
8841         = fold_convert_loc (loc, integer_type_node,
8842                             build1 (INDIRECT_REF, cst_uchar_node,
8843                                     fold_convert_loc (loc,
8844                                                       cst_uchar_ptr_node,
8845                                                       arg2)));
8846       return fold_build1_loc (loc, NEGATE_EXPR, integer_type_node, temp);
8847     }
8848
8849   return NULL_TREE;
8850 }
8851
8852 /* Fold function call to builtin strncmp with arguments ARG1, ARG2, and LEN.
8853    Return NULL_TREE if no simplification can be made.  */
8854
8855 static tree
8856 fold_builtin_strncmp (location_t loc, tree arg1, tree arg2, tree len)
8857 {
8858   const char *p1, *p2;
8859
8860   if (!validate_arg (arg1, POINTER_TYPE)
8861       || !validate_arg (arg2, POINTER_TYPE)
8862       || !validate_arg (len, INTEGER_TYPE))
8863     return NULL_TREE;
8864
8865   /* If the LEN parameter is zero, return zero.  */
8866   if (integer_zerop (len))
8867     return omit_two_operands_loc (loc, integer_type_node, integer_zero_node,
8868                               arg1, arg2);
8869
8870   /* If ARG1 and ARG2 are the same (and not volatile), return zero.  */
8871   if (operand_equal_p (arg1, arg2, 0))
8872     return omit_one_operand_loc (loc, integer_type_node, integer_zero_node, len);
8873
8874   p1 = c_getstr (arg1);
8875   p2 = c_getstr (arg2);
8876
8877   if (host_integerp (len, 1) && p1 && p2)
8878     {
8879       const int i = strncmp (p1, p2, tree_low_cst (len, 1));
8880       if (i > 0)
8881         return integer_one_node;
8882       else if (i < 0)
8883         return integer_minus_one_node;
8884       else
8885         return integer_zero_node;
8886     }
8887
8888   /* If the second arg is "", and the length is greater than zero,
8889      return *(const unsigned char*)arg1.  */
8890   if (p2 && *p2 == '\0'
8891       && TREE_CODE (len) == INTEGER_CST
8892       && tree_int_cst_sgn (len) == 1)
8893     {
8894       tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
8895       tree cst_uchar_ptr_node
8896         = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
8897
8898       return fold_convert_loc (loc, integer_type_node,
8899                                build1 (INDIRECT_REF, cst_uchar_node,
8900                                        fold_convert_loc (loc,
8901                                                          cst_uchar_ptr_node,
8902                                                          arg1)));
8903     }
8904
8905   /* If the first arg is "", and the length is greater than zero,
8906      return -*(const unsigned char*)arg2.  */
8907   if (p1 && *p1 == '\0'
8908       && TREE_CODE (len) == INTEGER_CST
8909       && tree_int_cst_sgn (len) == 1)
8910     {
8911       tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
8912       tree cst_uchar_ptr_node
8913         = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
8914
8915       tree temp = fold_convert_loc (loc, integer_type_node,
8916                                     build1 (INDIRECT_REF, cst_uchar_node,
8917                                             fold_convert_loc (loc,
8918                                                               cst_uchar_ptr_node,
8919                                                               arg2)));
8920       return fold_build1_loc (loc, NEGATE_EXPR, integer_type_node, temp);
8921     }
8922
8923   /* If len parameter is one, return an expression corresponding to
8924      (*(const unsigned char*)arg1 - (const unsigned char*)arg2).  */
8925   if (host_integerp (len, 1) && tree_low_cst (len, 1) == 1)
8926     {
8927       tree cst_uchar_node = build_type_variant (unsigned_char_type_node, 1, 0);
8928       tree cst_uchar_ptr_node
8929         = build_pointer_type_for_mode (cst_uchar_node, ptr_mode, true);
8930
8931       tree ind1 = fold_convert_loc (loc, integer_type_node,
8932                                     build1 (INDIRECT_REF, cst_uchar_node,
8933                                             fold_convert_loc (loc,
8934                                                               cst_uchar_ptr_node,
8935                                                               arg1)));
8936       tree ind2 = fold_convert_loc (loc, integer_type_node,
8937                                     build1 (INDIRECT_REF, cst_uchar_node,
8938                                             fold_convert_loc (loc,
8939                                                               cst_uchar_ptr_node,
8940                                                               arg2)));
8941       return fold_build2_loc (loc, MINUS_EXPR, integer_type_node, ind1, ind2);
8942     }
8943
8944   return NULL_TREE;
8945 }
8946
8947 /* Fold function call to builtin signbit, signbitf or signbitl with argument
8948    ARG.  Return NULL_TREE if no simplification can be made.  */
8949
8950 static tree
8951 fold_builtin_signbit (location_t loc, tree arg, tree type)
8952 {
8953   tree temp;
8954
8955   if (!validate_arg (arg, REAL_TYPE))
8956     return NULL_TREE;
8957
8958   /* If ARG is a compile-time constant, determine the result.  */
8959   if (TREE_CODE (arg) == REAL_CST
8960       && !TREE_OVERFLOW (arg))
8961     {
8962       REAL_VALUE_TYPE c;
8963
8964       c = TREE_REAL_CST (arg);
8965       temp = REAL_VALUE_NEGATIVE (c) ? integer_one_node : integer_zero_node;
8966       return fold_convert_loc (loc, type, temp);
8967     }
8968
8969   /* If ARG is non-negative, the result is always zero.  */
8970   if (tree_expr_nonnegative_p (arg))
8971     return omit_one_operand_loc (loc, type, integer_zero_node, arg);
8972
8973   /* If ARG's format doesn't have signed zeros, return "arg < 0.0".  */
8974   if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg))))
8975     return fold_build2_loc (loc, LT_EXPR, type, arg,
8976                         build_real (TREE_TYPE (arg), dconst0));
8977
8978   return NULL_TREE;
8979 }
8980
8981 /* Fold function call to builtin copysign, copysignf or copysignl with
8982    arguments ARG1 and ARG2.  Return NULL_TREE if no simplification can
8983    be made.  */
8984
8985 static tree
8986 fold_builtin_copysign (location_t loc, tree fndecl,
8987                        tree arg1, tree arg2, tree type)
8988 {
8989   tree tem;
8990
8991   if (!validate_arg (arg1, REAL_TYPE)
8992       || !validate_arg (arg2, REAL_TYPE))
8993     return NULL_TREE;
8994
8995   /* copysign(X,X) is X.  */
8996   if (operand_equal_p (arg1, arg2, 0))
8997     return fold_convert_loc (loc, type, arg1);
8998
8999   /* If ARG1 and ARG2 are compile-time constants, determine the result.  */
9000   if (TREE_CODE (arg1) == REAL_CST
9001       && TREE_CODE (arg2) == REAL_CST
9002       && !TREE_OVERFLOW (arg1)
9003       && !TREE_OVERFLOW (arg2))
9004     {
9005       REAL_VALUE_TYPE c1, c2;
9006
9007       c1 = TREE_REAL_CST (arg1);
9008       c2 = TREE_REAL_CST (arg2);
9009       /* c1.sign := c2.sign.  */
9010       real_copysign (&c1, &c2);
9011       return build_real (type, c1);
9012     }
9013
9014   /* copysign(X, Y) is fabs(X) when Y is always non-negative.
9015      Remember to evaluate Y for side-effects.  */
9016   if (tree_expr_nonnegative_p (arg2))
9017     return omit_one_operand_loc (loc, type,
9018                              fold_build1_loc (loc, ABS_EXPR, type, arg1),
9019                              arg2);
9020
9021   /* Strip sign changing operations for the first argument.  */
9022   tem = fold_strip_sign_ops (arg1);
9023   if (tem)
9024     return build_call_expr_loc (loc, fndecl, 2, tem, arg2);
9025
9026   return NULL_TREE;
9027 }
9028
9029 /* Fold a call to builtin isascii with argument ARG.  */
9030
9031 static tree
9032 fold_builtin_isascii (location_t loc, tree arg)
9033 {
9034   if (!validate_arg (arg, INTEGER_TYPE))
9035     return NULL_TREE;
9036   else
9037     {
9038       /* Transform isascii(c) -> ((c & ~0x7f) == 0).  */
9039       arg = fold_build2 (BIT_AND_EXPR, integer_type_node, arg,
9040                          build_int_cst (NULL_TREE,
9041                                         ~ (unsigned HOST_WIDE_INT) 0x7f));
9042       return fold_build2_loc (loc, EQ_EXPR, integer_type_node,
9043                           arg, integer_zero_node);
9044     }
9045 }
9046
9047 /* Fold a call to builtin toascii with argument ARG.  */
9048
9049 static tree
9050 fold_builtin_toascii (location_t loc, tree arg)
9051 {
9052   if (!validate_arg (arg, INTEGER_TYPE))
9053     return NULL_TREE;
9054
9055   /* Transform toascii(c) -> (c & 0x7f).  */
9056   return fold_build2_loc (loc, BIT_AND_EXPR, integer_type_node, arg,
9057                       build_int_cst (NULL_TREE, 0x7f));
9058 }
9059
9060 /* Fold a call to builtin isdigit with argument ARG.  */
9061
9062 static tree
9063 fold_builtin_isdigit (location_t loc, tree arg)
9064 {
9065   if (!validate_arg (arg, INTEGER_TYPE))
9066     return NULL_TREE;
9067   else
9068     {
9069       /* Transform isdigit(c) -> (unsigned)(c) - '0' <= 9.  */
9070       /* According to the C standard, isdigit is unaffected by locale.
9071          However, it definitely is affected by the target character set.  */
9072       unsigned HOST_WIDE_INT target_digit0
9073         = lang_hooks.to_target_charset ('0');
9074
9075       if (target_digit0 == 0)
9076         return NULL_TREE;
9077
9078       arg = fold_convert_loc (loc, unsigned_type_node, arg);
9079       arg = fold_build2 (MINUS_EXPR, unsigned_type_node, arg,
9080                          build_int_cst (unsigned_type_node, target_digit0));
9081       return fold_build2_loc (loc, LE_EXPR, integer_type_node, arg,
9082                           build_int_cst (unsigned_type_node, 9));
9083     }
9084 }
9085
9086 /* Fold a call to fabs, fabsf or fabsl with argument ARG.  */
9087
9088 static tree
9089 fold_builtin_fabs (location_t loc, tree arg, tree type)
9090 {
9091   if (!validate_arg (arg, REAL_TYPE))
9092     return NULL_TREE;
9093
9094   arg = fold_convert_loc (loc, type, arg);
9095   if (TREE_CODE (arg) == REAL_CST)
9096     return fold_abs_const (arg, type);
9097   return fold_build1_loc (loc, ABS_EXPR, type, arg);
9098 }
9099
9100 /* Fold a call to abs, labs, llabs or imaxabs with argument ARG.  */
9101
9102 static tree
9103 fold_builtin_abs (location_t loc, tree arg, tree type)
9104 {
9105   if (!validate_arg (arg, INTEGER_TYPE))
9106     return NULL_TREE;
9107
9108   arg = fold_convert_loc (loc, type, arg);
9109   if (TREE_CODE (arg) == INTEGER_CST)
9110     return fold_abs_const (arg, type);
9111   return fold_build1_loc (loc, ABS_EXPR, type, arg);
9112 }
9113
9114 /* Fold a call to builtin fmin or fmax.  */
9115
9116 static tree
9117 fold_builtin_fmin_fmax (location_t loc, tree arg0, tree arg1,
9118                         tree type, bool max)
9119 {
9120   if (validate_arg (arg0, REAL_TYPE) && validate_arg (arg1, REAL_TYPE))
9121     {
9122       /* Calculate the result when the argument is a constant.  */
9123       tree res = do_mpfr_arg2 (arg0, arg1, type, (max ? mpfr_max : mpfr_min));
9124
9125       if (res)
9126         return res;
9127
9128       /* If either argument is NaN, return the other one.  Avoid the
9129          transformation if we get (and honor) a signalling NaN.  Using
9130          omit_one_operand() ensures we create a non-lvalue.  */
9131       if (TREE_CODE (arg0) == REAL_CST
9132           && real_isnan (&TREE_REAL_CST (arg0))
9133           && (! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg0)))
9134               || ! TREE_REAL_CST (arg0).signalling))
9135         return omit_one_operand_loc (loc, type, arg1, arg0);
9136       if (TREE_CODE (arg1) == REAL_CST
9137           && real_isnan (&TREE_REAL_CST (arg1))
9138           && (! HONOR_SNANS (TYPE_MODE (TREE_TYPE (arg1)))
9139               || ! TREE_REAL_CST (arg1).signalling))
9140         return omit_one_operand_loc (loc, type, arg0, arg1);
9141
9142       /* Transform fmin/fmax(x,x) -> x.  */
9143       if (operand_equal_p (arg0, arg1, OEP_PURE_SAME))
9144         return omit_one_operand_loc (loc, type, arg0, arg1);
9145
9146       /* Convert fmin/fmax to MIN_EXPR/MAX_EXPR.  C99 requires these
9147          functions to return the numeric arg if the other one is NaN.
9148          These tree codes don't honor that, so only transform if
9149          -ffinite-math-only is set.  C99 doesn't require -0.0 to be
9150          handled, so we don't have to worry about it either.  */
9151       if (flag_finite_math_only)
9152         return fold_build2_loc (loc, (max ? MAX_EXPR : MIN_EXPR), type,
9153                             fold_convert_loc (loc, type, arg0),
9154                             fold_convert_loc (loc, type, arg1));
9155     }
9156   return NULL_TREE;
9157 }
9158
9159 /* Fold a call to builtin carg(a+bi) -> atan2(b,a).  */
9160
9161 static tree
9162 fold_builtin_carg (location_t loc, tree arg, tree type)
9163 {
9164   if (validate_arg (arg, COMPLEX_TYPE)
9165       && TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) == REAL_TYPE)
9166     {
9167       tree atan2_fn = mathfn_built_in (type, BUILT_IN_ATAN2);
9168
9169       if (atan2_fn)
9170         {
9171           tree new_arg = builtin_save_expr (arg);
9172           tree r_arg = fold_build1_loc (loc, REALPART_EXPR, type, new_arg);
9173           tree i_arg = fold_build1_loc (loc, IMAGPART_EXPR, type, new_arg);
9174           return build_call_expr_loc (loc, atan2_fn, 2, i_arg, r_arg);
9175         }
9176     }
9177
9178   return NULL_TREE;
9179 }
9180
9181 /* Fold a call to builtin logb/ilogb.  */
9182
9183 static tree
9184 fold_builtin_logb (location_t loc, tree arg, tree rettype)
9185 {
9186   if (! validate_arg (arg, REAL_TYPE))
9187     return NULL_TREE;
9188
9189   STRIP_NOPS (arg);
9190
9191   if (TREE_CODE (arg) == REAL_CST && ! TREE_OVERFLOW (arg))
9192     {
9193       const REAL_VALUE_TYPE *const value = TREE_REAL_CST_PTR (arg);
9194
9195       switch (value->cl)
9196       {
9197       case rvc_nan:
9198       case rvc_inf:
9199         /* If arg is Inf or NaN and we're logb, return it.  */
9200         if (TREE_CODE (rettype) == REAL_TYPE)
9201           return fold_convert_loc (loc, rettype, arg);
9202         /* Fall through... */
9203       case rvc_zero:
9204         /* Zero may set errno and/or raise an exception for logb, also
9205            for ilogb we don't know FP_ILOGB0.  */
9206         return NULL_TREE;
9207       case rvc_normal:
9208         /* For normal numbers, proceed iff radix == 2.  In GCC,
9209            normalized significands are in the range [0.5, 1.0).  We
9210            want the exponent as if they were [1.0, 2.0) so get the
9211            exponent and subtract 1.  */
9212         if (REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (arg)))->b == 2)
9213           return fold_convert_loc (loc, rettype,
9214                                    build_int_cst (NULL_TREE,
9215                                                   REAL_EXP (value)-1));
9216         break;
9217       }
9218     }
9219
9220   return NULL_TREE;
9221 }
9222
9223 /* Fold a call to builtin significand, if radix == 2.  */
9224
9225 static tree
9226 fold_builtin_significand (location_t loc, tree arg, tree rettype)
9227 {
9228   if (! validate_arg (arg, REAL_TYPE))
9229     return NULL_TREE;
9230
9231   STRIP_NOPS (arg);
9232
9233   if (TREE_CODE (arg) == REAL_CST && ! TREE_OVERFLOW (arg))
9234     {
9235       const REAL_VALUE_TYPE *const value = TREE_REAL_CST_PTR (arg);
9236
9237       switch (value->cl)
9238       {
9239       case rvc_zero:
9240       case rvc_nan:
9241       case rvc_inf:
9242         /* If arg is +-0, +-Inf or +-NaN, then return it.  */
9243         return fold_convert_loc (loc, rettype, arg);
9244       case rvc_normal:
9245         /* For normal numbers, proceed iff radix == 2.  */
9246         if (REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (arg)))->b == 2)
9247           {
9248             REAL_VALUE_TYPE result = *value;
9249             /* In GCC, normalized significands are in the range [0.5,
9250                1.0).  We want them to be [1.0, 2.0) so set the
9251                exponent to 1.  */
9252             SET_REAL_EXP (&result, 1);
9253             return build_real (rettype, result);
9254           }
9255         break;
9256       }
9257     }
9258
9259   return NULL_TREE;
9260 }
9261
9262 /* Fold a call to builtin frexp, we can assume the base is 2.  */
9263
9264 static tree
9265 fold_builtin_frexp (location_t loc, tree arg0, tree arg1, tree rettype)
9266 {
9267   if (! validate_arg (arg0, REAL_TYPE) || ! validate_arg (arg1, POINTER_TYPE))
9268     return NULL_TREE;
9269
9270   STRIP_NOPS (arg0);
9271
9272   if (!(TREE_CODE (arg0) == REAL_CST && ! TREE_OVERFLOW (arg0)))
9273     return NULL_TREE;
9274
9275   arg1 = build_fold_indirect_ref_loc (loc, arg1);
9276
9277   /* Proceed if a valid pointer type was passed in.  */
9278   if (TYPE_MAIN_VARIANT (TREE_TYPE (arg1)) == integer_type_node)
9279     {
9280       const REAL_VALUE_TYPE *const value = TREE_REAL_CST_PTR (arg0);
9281       tree frac, exp;
9282
9283       switch (value->cl)
9284       {
9285       case rvc_zero:
9286         /* For +-0, return (*exp = 0, +-0).  */
9287         exp = integer_zero_node;
9288         frac = arg0;
9289         break;
9290       case rvc_nan:
9291       case rvc_inf:
9292         /* For +-NaN or +-Inf, *exp is unspecified, return arg0.  */
9293         return omit_one_operand_loc (loc, rettype, arg0, arg1);
9294       case rvc_normal:
9295         {
9296           /* Since the frexp function always expects base 2, and in
9297              GCC normalized significands are already in the range
9298              [0.5, 1.0), we have exactly what frexp wants.  */
9299           REAL_VALUE_TYPE frac_rvt = *value;
9300           SET_REAL_EXP (&frac_rvt, 0);
9301           frac = build_real (rettype, frac_rvt);
9302           exp = build_int_cst (NULL_TREE, REAL_EXP (value));
9303         }
9304         break;
9305       default:
9306         gcc_unreachable ();
9307       }
9308
9309       /* Create the COMPOUND_EXPR (*arg1 = trunc, frac). */
9310       arg1 = fold_build2_loc (loc, MODIFY_EXPR, rettype, arg1, exp);
9311       TREE_SIDE_EFFECTS (arg1) = 1;
9312       return fold_build2_loc (loc, COMPOUND_EXPR, rettype, arg1, frac);
9313     }
9314
9315   return NULL_TREE;
9316 }
9317
9318 /* Fold a call to builtin ldexp or scalbn/scalbln.  If LDEXP is true
9319    then we can assume the base is two.  If it's false, then we have to
9320    check the mode of the TYPE parameter in certain cases.  */
9321
9322 static tree
9323 fold_builtin_load_exponent (location_t loc, tree arg0, tree arg1,
9324                             tree type, bool ldexp)
9325 {
9326   if (validate_arg (arg0, REAL_TYPE) && validate_arg (arg1, INTEGER_TYPE))
9327     {
9328       STRIP_NOPS (arg0);
9329       STRIP_NOPS (arg1);
9330
9331       /* If arg0 is 0, Inf or NaN, or if arg1 is 0, then return arg0.  */
9332       if (real_zerop (arg0) || integer_zerop (arg1)
9333           || (TREE_CODE (arg0) == REAL_CST
9334               && !real_isfinite (&TREE_REAL_CST (arg0))))
9335         return omit_one_operand_loc (loc, type, arg0, arg1);
9336
9337       /* If both arguments are constant, then try to evaluate it.  */
9338       if ((ldexp || REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2)
9339           && TREE_CODE (arg0) == REAL_CST && !TREE_OVERFLOW (arg0)
9340           && host_integerp (arg1, 0))
9341         {
9342           /* Bound the maximum adjustment to twice the range of the
9343              mode's valid exponents.  Use abs to ensure the range is
9344              positive as a sanity check.  */
9345           const long max_exp_adj = 2 *
9346             labs (REAL_MODE_FORMAT (TYPE_MODE (type))->emax
9347                  - REAL_MODE_FORMAT (TYPE_MODE (type))->emin);
9348
9349           /* Get the user-requested adjustment.  */
9350           const HOST_WIDE_INT req_exp_adj = tree_low_cst (arg1, 0);
9351
9352           /* The requested adjustment must be inside this range.  This
9353              is a preliminary cap to avoid things like overflow, we
9354              may still fail to compute the result for other reasons.  */
9355           if (-max_exp_adj < req_exp_adj && req_exp_adj < max_exp_adj)
9356             {
9357               REAL_VALUE_TYPE initial_result;
9358
9359               real_ldexp (&initial_result, &TREE_REAL_CST (arg0), req_exp_adj);
9360
9361               /* Ensure we didn't overflow.  */
9362               if (! real_isinf (&initial_result))
9363                 {
9364                   const REAL_VALUE_TYPE trunc_result
9365                     = real_value_truncate (TYPE_MODE (type), initial_result);
9366
9367                   /* Only proceed if the target mode can hold the
9368                      resulting value.  */
9369                   if (REAL_VALUES_EQUAL (initial_result, trunc_result))
9370                     return build_real (type, trunc_result);
9371                 }
9372             }
9373         }
9374     }
9375
9376   return NULL_TREE;
9377 }
9378
9379 /* Fold a call to builtin modf.  */
9380
9381 static tree
9382 fold_builtin_modf (location_t loc, tree arg0, tree arg1, tree rettype)
9383 {
9384   if (! validate_arg (arg0, REAL_TYPE) || ! validate_arg (arg1, POINTER_TYPE))
9385     return NULL_TREE;
9386
9387   STRIP_NOPS (arg0);
9388
9389   if (!(TREE_CODE (arg0) == REAL_CST && ! TREE_OVERFLOW (arg0)))
9390     return NULL_TREE;
9391
9392   arg1 = build_fold_indirect_ref_loc (loc, arg1);
9393
9394   /* Proceed if a valid pointer type was passed in.  */
9395   if (TYPE_MAIN_VARIANT (TREE_TYPE (arg1)) == TYPE_MAIN_VARIANT (rettype))
9396     {
9397       const REAL_VALUE_TYPE *const value = TREE_REAL_CST_PTR (arg0);
9398       REAL_VALUE_TYPE trunc, frac;
9399
9400       switch (value->cl)
9401       {
9402       case rvc_nan:
9403       case rvc_zero:
9404         /* For +-NaN or +-0, return (*arg1 = arg0, arg0).  */
9405         trunc = frac = *value;
9406         break;
9407       case rvc_inf:
9408         /* For +-Inf, return (*arg1 = arg0, +-0).  */
9409         frac = dconst0;
9410         frac.sign = value->sign;
9411         trunc = *value;
9412         break;
9413       case rvc_normal:
9414         /* Return (*arg1 = trunc(arg0), arg0-trunc(arg0)).  */
9415         real_trunc (&trunc, VOIDmode, value);
9416         real_arithmetic (&frac, MINUS_EXPR, value, &trunc);
9417         /* If the original number was negative and already
9418            integral, then the fractional part is -0.0.  */
9419         if (value->sign && frac.cl == rvc_zero)
9420           frac.sign = value->sign;
9421         break;
9422       }
9423
9424       /* Create the COMPOUND_EXPR (*arg1 = trunc, frac). */
9425       arg1 = fold_build2_loc (loc, MODIFY_EXPR, rettype, arg1,
9426                           build_real (rettype, trunc));
9427       TREE_SIDE_EFFECTS (arg1) = 1;
9428       return fold_build2_loc (loc, COMPOUND_EXPR, rettype, arg1,
9429                           build_real (rettype, frac));
9430     }
9431
9432   return NULL_TREE;
9433 }
9434
9435 /* Given a location LOC, an interclass builtin function decl FNDECL
9436    and its single argument ARG, return an folded expression computing
9437    the same, or NULL_TREE if we either couldn't or didn't want to fold
9438    (the latter happen if there's an RTL instruction available).  */
9439
9440 static tree
9441 fold_builtin_interclass_mathfn (location_t loc, tree fndecl, tree arg)
9442 {
9443   enum machine_mode mode;
9444
9445   if (!validate_arg (arg, REAL_TYPE))
9446     return NULL_TREE;
9447
9448   if (interclass_mathfn_icode (arg, fndecl) != CODE_FOR_nothing)
9449     return NULL_TREE;
9450
9451   mode = TYPE_MODE (TREE_TYPE (arg));
9452
9453   /* If there is no optab, try generic code.  */
9454   switch (DECL_FUNCTION_CODE (fndecl))
9455     {
9456       tree result;
9457
9458     CASE_FLT_FN (BUILT_IN_ISINF):
9459       {
9460         /* isinf(x) -> isgreater(fabs(x),DBL_MAX).  */
9461         tree const isgr_fn = built_in_decls[BUILT_IN_ISGREATER];
9462         tree const type = TREE_TYPE (arg);
9463         REAL_VALUE_TYPE r;
9464         char buf[128];
9465
9466         get_max_float (REAL_MODE_FORMAT (mode), buf, sizeof (buf));
9467         real_from_string (&r, buf);
9468         result = build_call_expr (isgr_fn, 2,
9469                                   fold_build1_loc (loc, ABS_EXPR, type, arg),
9470                                   build_real (type, r));
9471         return result;
9472       }
9473     CASE_FLT_FN (BUILT_IN_FINITE):
9474     case BUILT_IN_ISFINITE:
9475       {
9476         /* isfinite(x) -> islessequal(fabs(x),DBL_MAX).  */
9477         tree const isle_fn = built_in_decls[BUILT_IN_ISLESSEQUAL];
9478         tree const type = TREE_TYPE (arg);
9479         REAL_VALUE_TYPE r;
9480         char buf[128];
9481
9482         get_max_float (REAL_MODE_FORMAT (mode), buf, sizeof (buf));
9483         real_from_string (&r, buf);
9484         result = build_call_expr (isle_fn, 2,
9485                                   fold_build1_loc (loc, ABS_EXPR, type, arg),
9486                                   build_real (type, r));
9487         /*result = fold_build2_loc (loc, UNGT_EXPR,
9488                                   TREE_TYPE (TREE_TYPE (fndecl)),
9489                                   fold_build1_loc (loc, ABS_EXPR, type, arg),
9490                                   build_real (type, r));
9491         result = fold_build1_loc (loc, TRUTH_NOT_EXPR,
9492                                   TREE_TYPE (TREE_TYPE (fndecl)),
9493                                   result);*/
9494         return result;
9495       }
9496     case BUILT_IN_ISNORMAL:
9497       {
9498         /* isnormal(x) -> isgreaterequal(fabs(x),DBL_MIN) &
9499            islessequal(fabs(x),DBL_MAX).  */
9500         tree const isle_fn = built_in_decls[BUILT_IN_ISLESSEQUAL];
9501         tree const isge_fn = built_in_decls[BUILT_IN_ISGREATEREQUAL];
9502         tree const type = TREE_TYPE (arg);
9503         REAL_VALUE_TYPE rmax, rmin;
9504         char buf[128];
9505
9506         get_max_float (REAL_MODE_FORMAT (mode), buf, sizeof (buf));
9507         real_from_string (&rmax, buf);
9508         sprintf (buf, "0x1p%d", REAL_MODE_FORMAT (mode)->emin - 1);
9509         real_from_string (&rmin, buf);
9510         arg = builtin_save_expr (fold_build1_loc (loc, ABS_EXPR, type, arg));
9511         result = build_call_expr (isle_fn, 2, arg,
9512                                   build_real (type, rmax));
9513         result = fold_build2 (BIT_AND_EXPR, integer_type_node, result,
9514                               build_call_expr (isge_fn, 2, arg,
9515                                                build_real (type, rmin)));
9516         return result;
9517       }
9518     default:
9519       break;
9520     }
9521
9522   return NULL_TREE;
9523 }
9524
9525 /* Fold a call to __builtin_isnan(), __builtin_isinf, __builtin_finite.
9526    ARG is the argument for the call.  */
9527
9528 static tree
9529 fold_builtin_classify (location_t loc, tree fndecl, tree arg, int builtin_index)
9530 {
9531   tree type = TREE_TYPE (TREE_TYPE (fndecl));
9532   REAL_VALUE_TYPE r;
9533
9534   if (!validate_arg (arg, REAL_TYPE))
9535     return NULL_TREE;
9536
9537   switch (builtin_index)
9538     {
9539     case BUILT_IN_ISINF:
9540       if (!HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg))))
9541         return omit_one_operand_loc (loc, type, integer_zero_node, arg);
9542
9543       if (TREE_CODE (arg) == REAL_CST)
9544         {
9545           r = TREE_REAL_CST (arg);
9546           if (real_isinf (&r))
9547             return real_compare (GT_EXPR, &r, &dconst0)
9548                    ? integer_one_node : integer_minus_one_node;
9549           else
9550             return integer_zero_node;
9551         }
9552
9553       return NULL_TREE;
9554
9555     case BUILT_IN_ISINF_SIGN:
9556       {
9557         /* isinf_sign(x) -> isinf(x) ? (signbit(x) ? -1 : 1) : 0 */
9558         /* In a boolean context, GCC will fold the inner COND_EXPR to
9559            1.  So e.g. "if (isinf_sign(x))" would be folded to just
9560            "if (isinf(x) ? 1 : 0)" which becomes "if (isinf(x))". */
9561         tree signbit_fn = mathfn_built_in_1 (TREE_TYPE (arg), BUILT_IN_SIGNBIT, 0);
9562         tree isinf_fn = built_in_decls[BUILT_IN_ISINF];
9563         tree tmp = NULL_TREE;
9564
9565         arg = builtin_save_expr (arg);
9566
9567         if (signbit_fn && isinf_fn)
9568           {
9569             tree signbit_call = build_call_expr_loc (loc, signbit_fn, 1, arg);
9570             tree isinf_call = build_call_expr_loc (loc, isinf_fn, 1, arg);
9571
9572             signbit_call = fold_build2_loc (loc, NE_EXPR, integer_type_node,
9573                                         signbit_call, integer_zero_node);
9574             isinf_call = fold_build2_loc (loc, NE_EXPR, integer_type_node,
9575                                       isinf_call, integer_zero_node);
9576
9577             tmp = fold_build3_loc (loc, COND_EXPR, integer_type_node, signbit_call,
9578                                integer_minus_one_node, integer_one_node);
9579             tmp = fold_build3_loc (loc, COND_EXPR, integer_type_node,
9580                                isinf_call, tmp,
9581                                integer_zero_node);
9582           }
9583
9584         return tmp;
9585       }
9586
9587     case BUILT_IN_ISFINITE:
9588       if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg)))
9589           && !HONOR_INFINITIES (TYPE_MODE (TREE_TYPE (arg))))
9590         return omit_one_operand_loc (loc, type, integer_one_node, arg);
9591
9592       if (TREE_CODE (arg) == REAL_CST)
9593         {
9594           r = TREE_REAL_CST (arg);
9595           return real_isfinite (&r) ? integer_one_node : integer_zero_node;
9596         }
9597
9598       return NULL_TREE;
9599
9600     case BUILT_IN_ISNAN:
9601       if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg))))
9602         return omit_one_operand_loc (loc, type, integer_zero_node, arg);
9603
9604       if (TREE_CODE (arg) == REAL_CST)
9605         {
9606           r = TREE_REAL_CST (arg);
9607           return real_isnan (&r) ? integer_one_node : integer_zero_node;
9608         }
9609
9610       arg = builtin_save_expr (arg);
9611       return fold_build2_loc (loc, UNORDERED_EXPR, type, arg, arg);
9612
9613     default:
9614       gcc_unreachable ();
9615     }
9616 }
9617
9618 /* Fold a call to __builtin_fpclassify(int, int, int, int, int, ...).
9619    This builtin will generate code to return the appropriate floating
9620    point classification depending on the value of the floating point
9621    number passed in.  The possible return values must be supplied as
9622    int arguments to the call in the following order: FP_NAN, FP_INFINITE,
9623    FP_NORMAL, FP_SUBNORMAL and FP_ZERO.  The ellipses is for exactly
9624    one floating point argument which is "type generic".  */
9625
9626 static tree
9627 fold_builtin_fpclassify (location_t loc, tree exp)
9628 {
9629   tree fp_nan, fp_infinite, fp_normal, fp_subnormal, fp_zero,
9630     arg, type, res, tmp;
9631   enum machine_mode mode;
9632   REAL_VALUE_TYPE r;
9633   char buf[128];
9634
9635   /* Verify the required arguments in the original call.  */
9636   if (!validate_arglist (exp, INTEGER_TYPE, INTEGER_TYPE,
9637                          INTEGER_TYPE, INTEGER_TYPE,
9638                          INTEGER_TYPE, REAL_TYPE, VOID_TYPE))
9639     return NULL_TREE;
9640
9641   fp_nan = CALL_EXPR_ARG (exp, 0);
9642   fp_infinite = CALL_EXPR_ARG (exp, 1);
9643   fp_normal = CALL_EXPR_ARG (exp, 2);
9644   fp_subnormal = CALL_EXPR_ARG (exp, 3);
9645   fp_zero = CALL_EXPR_ARG (exp, 4);
9646   arg = CALL_EXPR_ARG (exp, 5);
9647   type = TREE_TYPE (arg);
9648   mode = TYPE_MODE (type);
9649   arg = builtin_save_expr (fold_build1_loc (loc, ABS_EXPR, type, arg));
9650
9651   /* fpclassify(x) ->
9652        isnan(x) ? FP_NAN :
9653          (fabs(x) == Inf ? FP_INFINITE :
9654            (fabs(x) >= DBL_MIN ? FP_NORMAL :
9655              (x == 0 ? FP_ZERO : FP_SUBNORMAL))).  */
9656
9657   tmp = fold_build2_loc (loc, EQ_EXPR, integer_type_node, arg,
9658                      build_real (type, dconst0));
9659   res = fold_build3_loc (loc, COND_EXPR, integer_type_node,
9660                      tmp, fp_zero, fp_subnormal);
9661
9662   sprintf (buf, "0x1p%d", REAL_MODE_FORMAT (mode)->emin - 1);
9663   real_from_string (&r, buf);
9664   tmp = fold_build2_loc (loc, GE_EXPR, integer_type_node,
9665                      arg, build_real (type, r));
9666   res = fold_build3_loc (loc, COND_EXPR, integer_type_node, tmp, fp_normal, res);
9667
9668   if (HONOR_INFINITIES (mode))
9669     {
9670       real_inf (&r);
9671       tmp = fold_build2_loc (loc, EQ_EXPR, integer_type_node, arg,
9672                          build_real (type, r));
9673       res = fold_build3_loc (loc, COND_EXPR, integer_type_node, tmp,
9674                          fp_infinite, res);
9675     }
9676
9677   if (HONOR_NANS (mode))
9678     {
9679       tmp = fold_build2_loc (loc, ORDERED_EXPR, integer_type_node, arg, arg);
9680       res = fold_build3_loc (loc, COND_EXPR, integer_type_node, tmp, res, fp_nan);
9681     }
9682
9683   return res;
9684 }
9685
9686 /* Fold a call to an unordered comparison function such as
9687    __builtin_isgreater().  FNDECL is the FUNCTION_DECL for the function
9688    being called and ARG0 and ARG1 are the arguments for the call.
9689    UNORDERED_CODE and ORDERED_CODE are comparison codes that give
9690    the opposite of the desired result.  UNORDERED_CODE is used
9691    for modes that can hold NaNs and ORDERED_CODE is used for
9692    the rest.  */
9693
9694 static tree
9695 fold_builtin_unordered_cmp (location_t loc, tree fndecl, tree arg0, tree arg1,
9696                             enum tree_code unordered_code,
9697                             enum tree_code ordered_code)
9698 {
9699   tree type = TREE_TYPE (TREE_TYPE (fndecl));
9700   enum tree_code code;
9701   tree type0, type1;
9702   enum tree_code code0, code1;
9703   tree cmp_type = NULL_TREE;
9704
9705   type0 = TREE_TYPE (arg0);
9706   type1 = TREE_TYPE (arg1);
9707
9708   code0 = TREE_CODE (type0);
9709   code1 = TREE_CODE (type1);
9710
9711   if (code0 == REAL_TYPE && code1 == REAL_TYPE)
9712     /* Choose the wider of two real types.  */
9713     cmp_type = TYPE_PRECISION (type0) >= TYPE_PRECISION (type1)
9714       ? type0 : type1;
9715   else if (code0 == REAL_TYPE && code1 == INTEGER_TYPE)
9716     cmp_type = type0;
9717   else if (code0 == INTEGER_TYPE && code1 == REAL_TYPE)
9718     cmp_type = type1;
9719
9720   arg0 = fold_convert_loc (loc, cmp_type, arg0);
9721   arg1 = fold_convert_loc (loc, cmp_type, arg1);
9722
9723   if (unordered_code == UNORDERED_EXPR)
9724     {
9725       if (!HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))))
9726         return omit_two_operands_loc (loc, type, integer_zero_node, arg0, arg1);
9727       return fold_build2_loc (loc, UNORDERED_EXPR, type, arg0, arg1);
9728     }
9729
9730   code = HONOR_NANS (TYPE_MODE (TREE_TYPE (arg0))) ? unordered_code
9731                                                    : ordered_code;
9732   return fold_build1_loc (loc, TRUTH_NOT_EXPR, type,
9733                       fold_build2_loc (loc, code, type, arg0, arg1));
9734 }
9735
9736 /* Fold a call to built-in function FNDECL with 0 arguments.
9737    IGNORE is true if the result of the function call is ignored.  This
9738    function returns NULL_TREE if no simplification was possible.  */
9739
9740 static tree
9741 fold_builtin_0 (location_t loc, tree fndecl, bool ignore ATTRIBUTE_UNUSED)
9742 {
9743   tree type = TREE_TYPE (TREE_TYPE (fndecl));
9744   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
9745   switch (fcode)
9746     {
9747     CASE_FLT_FN (BUILT_IN_INF):
9748     case BUILT_IN_INFD32:
9749     case BUILT_IN_INFD64:
9750     case BUILT_IN_INFD128:
9751       return fold_builtin_inf (loc, type, true);
9752
9753     CASE_FLT_FN (BUILT_IN_HUGE_VAL):
9754       return fold_builtin_inf (loc, type, false);
9755
9756     case BUILT_IN_CLASSIFY_TYPE:
9757       return fold_builtin_classify_type (NULL_TREE);
9758
9759     default:
9760       break;
9761     }
9762   return NULL_TREE;
9763 }
9764
9765 /* Fold a call to built-in function FNDECL with 1 argument, ARG0.
9766    IGNORE is true if the result of the function call is ignored.  This
9767    function returns NULL_TREE if no simplification was possible.  */
9768
9769 static tree
9770 fold_builtin_1 (location_t loc, tree fndecl, tree arg0, bool ignore)
9771 {
9772   tree type = TREE_TYPE (TREE_TYPE (fndecl));
9773   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
9774   switch (fcode)
9775     {
9776     case BUILT_IN_CONSTANT_P:
9777       {
9778         tree val = fold_builtin_constant_p (arg0);
9779
9780         /* Gimplification will pull the CALL_EXPR for the builtin out of
9781            an if condition.  When not optimizing, we'll not CSE it back.
9782            To avoid link error types of regressions, return false now.  */
9783         if (!val && !optimize)
9784           val = integer_zero_node;
9785
9786         return val;
9787       }
9788
9789     case BUILT_IN_CLASSIFY_TYPE:
9790       return fold_builtin_classify_type (arg0);
9791
9792     case BUILT_IN_STRLEN:
9793       return fold_builtin_strlen (loc, type, arg0);
9794
9795     CASE_FLT_FN (BUILT_IN_FABS):
9796       return fold_builtin_fabs (loc, arg0, type);
9797
9798     case BUILT_IN_ABS:
9799     case BUILT_IN_LABS:
9800     case BUILT_IN_LLABS:
9801     case BUILT_IN_IMAXABS:
9802       return fold_builtin_abs (loc, arg0, type);
9803
9804     CASE_FLT_FN (BUILT_IN_CONJ):
9805       if (validate_arg (arg0, COMPLEX_TYPE)
9806         && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9807         return fold_build1_loc (loc, CONJ_EXPR, type, arg0);
9808     break;
9809
9810     CASE_FLT_FN (BUILT_IN_CREAL):
9811       if (validate_arg (arg0, COMPLEX_TYPE)
9812         && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9813         return non_lvalue_loc (loc, fold_build1_loc (loc, REALPART_EXPR, type, arg0));;
9814     break;
9815
9816     CASE_FLT_FN (BUILT_IN_CIMAG):
9817       if (validate_arg (arg0, COMPLEX_TYPE)
9818           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9819         return non_lvalue_loc (loc, fold_build1_loc (loc, IMAGPART_EXPR, type, arg0));
9820     break;
9821
9822     CASE_FLT_FN (BUILT_IN_CCOS):
9823       return fold_builtin_ccos(loc, arg0, type, fndecl, /*hyper=*/ false);
9824
9825     CASE_FLT_FN (BUILT_IN_CCOSH):
9826       return fold_builtin_ccos(loc, arg0, type, fndecl, /*hyper=*/ true);
9827
9828     CASE_FLT_FN (BUILT_IN_CPROJ):
9829       return fold_builtin_cproj(loc, arg0, type);
9830
9831     CASE_FLT_FN (BUILT_IN_CSIN):
9832       if (validate_arg (arg0, COMPLEX_TYPE)
9833           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9834         return do_mpc_arg1 (arg0, type, mpc_sin);
9835     break;
9836
9837     CASE_FLT_FN (BUILT_IN_CSINH):
9838       if (validate_arg (arg0, COMPLEX_TYPE)
9839           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9840         return do_mpc_arg1 (arg0, type, mpc_sinh);
9841     break;
9842
9843     CASE_FLT_FN (BUILT_IN_CTAN):
9844       if (validate_arg (arg0, COMPLEX_TYPE)
9845           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9846         return do_mpc_arg1 (arg0, type, mpc_tan);
9847     break;
9848
9849     CASE_FLT_FN (BUILT_IN_CTANH):
9850       if (validate_arg (arg0, COMPLEX_TYPE)
9851           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9852         return do_mpc_arg1 (arg0, type, mpc_tanh);
9853     break;
9854
9855     CASE_FLT_FN (BUILT_IN_CLOG):
9856       if (validate_arg (arg0, COMPLEX_TYPE)
9857           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9858         return do_mpc_arg1 (arg0, type, mpc_log);
9859     break;
9860
9861     CASE_FLT_FN (BUILT_IN_CSQRT):
9862       if (validate_arg (arg0, COMPLEX_TYPE)
9863           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9864         return do_mpc_arg1 (arg0, type, mpc_sqrt);
9865     break;
9866
9867     CASE_FLT_FN (BUILT_IN_CASIN):
9868       if (validate_arg (arg0, COMPLEX_TYPE)
9869           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9870         return do_mpc_arg1 (arg0, type, mpc_asin);
9871     break;
9872
9873     CASE_FLT_FN (BUILT_IN_CACOS):
9874       if (validate_arg (arg0, COMPLEX_TYPE)
9875           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9876         return do_mpc_arg1 (arg0, type, mpc_acos);
9877     break;
9878
9879     CASE_FLT_FN (BUILT_IN_CATAN):
9880       if (validate_arg (arg0, COMPLEX_TYPE)
9881           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9882         return do_mpc_arg1 (arg0, type, mpc_atan);
9883     break;
9884
9885     CASE_FLT_FN (BUILT_IN_CASINH):
9886       if (validate_arg (arg0, COMPLEX_TYPE)
9887           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9888         return do_mpc_arg1 (arg0, type, mpc_asinh);
9889     break;
9890
9891     CASE_FLT_FN (BUILT_IN_CACOSH):
9892       if (validate_arg (arg0, COMPLEX_TYPE)
9893           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9894         return do_mpc_arg1 (arg0, type, mpc_acosh);
9895     break;
9896
9897     CASE_FLT_FN (BUILT_IN_CATANH):
9898       if (validate_arg (arg0, COMPLEX_TYPE)
9899           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
9900         return do_mpc_arg1 (arg0, type, mpc_atanh);
9901     break;
9902
9903     CASE_FLT_FN (BUILT_IN_CABS):
9904       return fold_builtin_cabs (loc, arg0, type, fndecl);
9905
9906     CASE_FLT_FN (BUILT_IN_CARG):
9907       return fold_builtin_carg (loc, arg0, type);
9908
9909     CASE_FLT_FN (BUILT_IN_SQRT):
9910       return fold_builtin_sqrt (loc, arg0, type);
9911
9912     CASE_FLT_FN (BUILT_IN_CBRT):
9913       return fold_builtin_cbrt (loc, arg0, type);
9914
9915     CASE_FLT_FN (BUILT_IN_ASIN):
9916       if (validate_arg (arg0, REAL_TYPE))
9917         return do_mpfr_arg1 (arg0, type, mpfr_asin,
9918                              &dconstm1, &dconst1, true);
9919     break;
9920
9921     CASE_FLT_FN (BUILT_IN_ACOS):
9922       if (validate_arg (arg0, REAL_TYPE))
9923         return do_mpfr_arg1 (arg0, type, mpfr_acos,
9924                              &dconstm1, &dconst1, true);
9925     break;
9926
9927     CASE_FLT_FN (BUILT_IN_ATAN):
9928       if (validate_arg (arg0, REAL_TYPE))
9929         return do_mpfr_arg1 (arg0, type, mpfr_atan, NULL, NULL, 0);
9930     break;
9931
9932     CASE_FLT_FN (BUILT_IN_ASINH):
9933       if (validate_arg (arg0, REAL_TYPE))
9934         return do_mpfr_arg1 (arg0, type, mpfr_asinh, NULL, NULL, 0);
9935     break;
9936
9937     CASE_FLT_FN (BUILT_IN_ACOSH):
9938       if (validate_arg (arg0, REAL_TYPE))
9939         return do_mpfr_arg1 (arg0, type, mpfr_acosh,
9940                              &dconst1, NULL, true);
9941     break;
9942
9943     CASE_FLT_FN (BUILT_IN_ATANH):
9944       if (validate_arg (arg0, REAL_TYPE))
9945         return do_mpfr_arg1 (arg0, type, mpfr_atanh,
9946                              &dconstm1, &dconst1, false);
9947     break;
9948
9949     CASE_FLT_FN (BUILT_IN_SIN):
9950       if (validate_arg (arg0, REAL_TYPE))
9951         return do_mpfr_arg1 (arg0, type, mpfr_sin, NULL, NULL, 0);
9952     break;
9953
9954     CASE_FLT_FN (BUILT_IN_COS):
9955       return fold_builtin_cos (loc, arg0, type, fndecl);
9956
9957     CASE_FLT_FN (BUILT_IN_TAN):
9958       return fold_builtin_tan (arg0, type);
9959
9960     CASE_FLT_FN (BUILT_IN_CEXP):
9961       return fold_builtin_cexp (loc, arg0, type);
9962
9963     CASE_FLT_FN (BUILT_IN_CEXPI):
9964       if (validate_arg (arg0, REAL_TYPE))
9965         return do_mpfr_sincos (arg0, NULL_TREE, NULL_TREE);
9966     break;
9967
9968     CASE_FLT_FN (BUILT_IN_SINH):
9969       if (validate_arg (arg0, REAL_TYPE))
9970         return do_mpfr_arg1 (arg0, type, mpfr_sinh, NULL, NULL, 0);
9971     break;
9972
9973     CASE_FLT_FN (BUILT_IN_COSH):
9974       return fold_builtin_cosh (loc, arg0, type, fndecl);
9975
9976     CASE_FLT_FN (BUILT_IN_TANH):
9977       if (validate_arg (arg0, REAL_TYPE))
9978         return do_mpfr_arg1 (arg0, type, mpfr_tanh, NULL, NULL, 0);
9979     break;
9980
9981     CASE_FLT_FN (BUILT_IN_ERF):
9982       if (validate_arg (arg0, REAL_TYPE))
9983         return do_mpfr_arg1 (arg0, type, mpfr_erf, NULL, NULL, 0);
9984     break;
9985
9986     CASE_FLT_FN (BUILT_IN_ERFC):
9987       if (validate_arg (arg0, REAL_TYPE))
9988         return do_mpfr_arg1 (arg0, type, mpfr_erfc, NULL, NULL, 0);
9989     break;
9990
9991     CASE_FLT_FN (BUILT_IN_TGAMMA):
9992       if (validate_arg (arg0, REAL_TYPE))
9993         return do_mpfr_arg1 (arg0, type, mpfr_gamma, NULL, NULL, 0);
9994     break;
9995
9996     CASE_FLT_FN (BUILT_IN_EXP):
9997       return fold_builtin_exponent (loc, fndecl, arg0, mpfr_exp);
9998
9999     CASE_FLT_FN (BUILT_IN_EXP2):
10000       return fold_builtin_exponent (loc, fndecl, arg0, mpfr_exp2);
10001
10002     CASE_FLT_FN (BUILT_IN_EXP10):
10003     CASE_FLT_FN (BUILT_IN_POW10):
10004       return fold_builtin_exponent (loc, fndecl, arg0, mpfr_exp10);
10005
10006     CASE_FLT_FN (BUILT_IN_EXPM1):
10007       if (validate_arg (arg0, REAL_TYPE))
10008         return do_mpfr_arg1 (arg0, type, mpfr_expm1, NULL, NULL, 0);
10009     break;
10010
10011     CASE_FLT_FN (BUILT_IN_LOG):
10012     return fold_builtin_logarithm (loc, fndecl, arg0, mpfr_log);
10013
10014     CASE_FLT_FN (BUILT_IN_LOG2):
10015       return fold_builtin_logarithm (loc, fndecl, arg0, mpfr_log2);
10016
10017     CASE_FLT_FN (BUILT_IN_LOG10):
10018       return fold_builtin_logarithm (loc, fndecl, arg0, mpfr_log10);
10019
10020     CASE_FLT_FN (BUILT_IN_LOG1P):
10021       if (validate_arg (arg0, REAL_TYPE))
10022         return do_mpfr_arg1 (arg0, type, mpfr_log1p,
10023                              &dconstm1, NULL, false);
10024     break;
10025
10026     CASE_FLT_FN (BUILT_IN_J0):
10027       if (validate_arg (arg0, REAL_TYPE))
10028         return do_mpfr_arg1 (arg0, type, mpfr_j0,
10029                              NULL, NULL, 0);
10030     break;
10031
10032     CASE_FLT_FN (BUILT_IN_J1):
10033       if (validate_arg (arg0, REAL_TYPE))
10034         return do_mpfr_arg1 (arg0, type, mpfr_j1,
10035                              NULL, NULL, 0);
10036     break;
10037
10038     CASE_FLT_FN (BUILT_IN_Y0):
10039       if (validate_arg (arg0, REAL_TYPE))
10040         return do_mpfr_arg1 (arg0, type, mpfr_y0,
10041                              &dconst0, NULL, false);
10042     break;
10043
10044     CASE_FLT_FN (BUILT_IN_Y1):
10045       if (validate_arg (arg0, REAL_TYPE))
10046         return do_mpfr_arg1 (arg0, type, mpfr_y1,
10047                              &dconst0, NULL, false);
10048     break;
10049
10050     CASE_FLT_FN (BUILT_IN_NAN):
10051     case BUILT_IN_NAND32:
10052     case BUILT_IN_NAND64:
10053     case BUILT_IN_NAND128:
10054       return fold_builtin_nan (arg0, type, true);
10055
10056     CASE_FLT_FN (BUILT_IN_NANS):
10057       return fold_builtin_nan (arg0, type, false);
10058
10059     CASE_FLT_FN (BUILT_IN_FLOOR):
10060       return fold_builtin_floor (loc, fndecl, arg0);
10061
10062     CASE_FLT_FN (BUILT_IN_CEIL):
10063       return fold_builtin_ceil (loc, fndecl, arg0);
10064
10065     CASE_FLT_FN (BUILT_IN_TRUNC):
10066       return fold_builtin_trunc (loc, fndecl, arg0);
10067
10068     CASE_FLT_FN (BUILT_IN_ROUND):
10069       return fold_builtin_round (loc, fndecl, arg0);
10070
10071     CASE_FLT_FN (BUILT_IN_NEARBYINT):
10072     CASE_FLT_FN (BUILT_IN_RINT):
10073       return fold_trunc_transparent_mathfn (loc, fndecl, arg0);
10074
10075     CASE_FLT_FN (BUILT_IN_LCEIL):
10076     CASE_FLT_FN (BUILT_IN_LLCEIL):
10077     CASE_FLT_FN (BUILT_IN_LFLOOR):
10078     CASE_FLT_FN (BUILT_IN_LLFLOOR):
10079     CASE_FLT_FN (BUILT_IN_LROUND):
10080     CASE_FLT_FN (BUILT_IN_LLROUND):
10081       return fold_builtin_int_roundingfn (loc, fndecl, arg0);
10082
10083     CASE_FLT_FN (BUILT_IN_LRINT):
10084     CASE_FLT_FN (BUILT_IN_LLRINT):
10085       return fold_fixed_mathfn (loc, fndecl, arg0);
10086
10087     case BUILT_IN_BSWAP32:
10088     case BUILT_IN_BSWAP64:
10089       return fold_builtin_bswap (fndecl, arg0);
10090
10091     CASE_INT_FN (BUILT_IN_FFS):
10092     CASE_INT_FN (BUILT_IN_CLZ):
10093     CASE_INT_FN (BUILT_IN_CTZ):
10094     CASE_INT_FN (BUILT_IN_POPCOUNT):
10095     CASE_INT_FN (BUILT_IN_PARITY):
10096       return fold_builtin_bitop (fndecl, arg0);
10097
10098     CASE_FLT_FN (BUILT_IN_SIGNBIT):
10099       return fold_builtin_signbit (loc, arg0, type);
10100
10101     CASE_FLT_FN (BUILT_IN_SIGNIFICAND):
10102       return fold_builtin_significand (loc, arg0, type);
10103
10104     CASE_FLT_FN (BUILT_IN_ILOGB):
10105     CASE_FLT_FN (BUILT_IN_LOGB):
10106       return fold_builtin_logb (loc, arg0, type);
10107
10108     case BUILT_IN_ISASCII:
10109       return fold_builtin_isascii (loc, arg0);
10110
10111     case BUILT_IN_TOASCII:
10112       return fold_builtin_toascii (loc, arg0);
10113
10114     case BUILT_IN_ISDIGIT:
10115       return fold_builtin_isdigit (loc, arg0);
10116
10117     CASE_FLT_FN (BUILT_IN_FINITE):
10118     case BUILT_IN_FINITED32:
10119     case BUILT_IN_FINITED64:
10120     case BUILT_IN_FINITED128:
10121     case BUILT_IN_ISFINITE:
10122       {
10123         tree ret = fold_builtin_classify (loc, fndecl, arg0, BUILT_IN_ISFINITE);
10124         if (ret)
10125           return ret;
10126         return fold_builtin_interclass_mathfn (loc, fndecl, arg0);
10127       }
10128
10129     CASE_FLT_FN (BUILT_IN_ISINF):
10130     case BUILT_IN_ISINFD32:
10131     case BUILT_IN_ISINFD64:
10132     case BUILT_IN_ISINFD128:
10133       {
10134         tree ret = fold_builtin_classify (loc, fndecl, arg0, BUILT_IN_ISINF);
10135         if (ret)
10136           return ret;
10137         return fold_builtin_interclass_mathfn (loc, fndecl, arg0);
10138       }
10139
10140     case BUILT_IN_ISNORMAL:
10141       return fold_builtin_interclass_mathfn (loc, fndecl, arg0);
10142
10143     case BUILT_IN_ISINF_SIGN:
10144       return fold_builtin_classify (loc, fndecl, arg0, BUILT_IN_ISINF_SIGN);
10145
10146     CASE_FLT_FN (BUILT_IN_ISNAN):
10147     case BUILT_IN_ISNAND32:
10148     case BUILT_IN_ISNAND64:
10149     case BUILT_IN_ISNAND128:
10150       return fold_builtin_classify (loc, fndecl, arg0, BUILT_IN_ISNAN);
10151
10152     case BUILT_IN_PRINTF:
10153     case BUILT_IN_PRINTF_UNLOCKED:
10154     case BUILT_IN_VPRINTF:
10155       return fold_builtin_printf (loc, fndecl, arg0, NULL_TREE, ignore, fcode);
10156
10157     case BUILT_IN_FREE:
10158       if (integer_zerop (arg0))
10159         return build_empty_stmt (loc);
10160       break;
10161
10162     default:
10163       break;
10164     }
10165
10166   return NULL_TREE;
10167
10168 }
10169
10170 /* Fold a call to built-in function FNDECL with 2 arguments, ARG0 and ARG1.
10171    IGNORE is true if the result of the function call is ignored.  This
10172    function returns NULL_TREE if no simplification was possible.  */
10173
10174 static tree
10175 fold_builtin_2 (location_t loc, tree fndecl, tree arg0, tree arg1, bool ignore)
10176 {
10177   tree type = TREE_TYPE (TREE_TYPE (fndecl));
10178   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
10179
10180   switch (fcode)
10181     {
10182     CASE_FLT_FN (BUILT_IN_JN):
10183       if (validate_arg (arg0, INTEGER_TYPE)
10184           && validate_arg (arg1, REAL_TYPE))
10185         return do_mpfr_bessel_n (arg0, arg1, type, mpfr_jn, NULL, 0);
10186     break;
10187
10188     CASE_FLT_FN (BUILT_IN_YN):
10189       if (validate_arg (arg0, INTEGER_TYPE)
10190           && validate_arg (arg1, REAL_TYPE))
10191         return do_mpfr_bessel_n (arg0, arg1, type, mpfr_yn,
10192                                  &dconst0, false);
10193     break;
10194
10195     CASE_FLT_FN (BUILT_IN_DREM):
10196     CASE_FLT_FN (BUILT_IN_REMAINDER):
10197       if (validate_arg (arg0, REAL_TYPE)
10198           && validate_arg(arg1, REAL_TYPE))
10199         return do_mpfr_arg2 (arg0, arg1, type, mpfr_remainder);
10200     break;
10201
10202     CASE_FLT_FN_REENT (BUILT_IN_GAMMA): /* GAMMA_R */
10203     CASE_FLT_FN_REENT (BUILT_IN_LGAMMA): /* LGAMMA_R */
10204       if (validate_arg (arg0, REAL_TYPE)
10205           && validate_arg(arg1, POINTER_TYPE))
10206         return do_mpfr_lgamma_r (arg0, arg1, type);
10207     break;
10208
10209     CASE_FLT_FN (BUILT_IN_ATAN2):
10210       if (validate_arg (arg0, REAL_TYPE)
10211           && validate_arg(arg1, REAL_TYPE))
10212         return do_mpfr_arg2 (arg0, arg1, type, mpfr_atan2);
10213     break;
10214
10215     CASE_FLT_FN (BUILT_IN_FDIM):
10216       if (validate_arg (arg0, REAL_TYPE)
10217           && validate_arg(arg1, REAL_TYPE))
10218         return do_mpfr_arg2 (arg0, arg1, type, mpfr_dim);
10219     break;
10220
10221     CASE_FLT_FN (BUILT_IN_HYPOT):
10222       return fold_builtin_hypot (loc, fndecl, arg0, arg1, type);
10223
10224     CASE_FLT_FN (BUILT_IN_CPOW):
10225       if (validate_arg (arg0, COMPLEX_TYPE)
10226           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE
10227           && validate_arg (arg1, COMPLEX_TYPE)
10228           && TREE_CODE (TREE_TYPE (TREE_TYPE (arg1))) == REAL_TYPE)
10229         return do_mpc_arg2 (arg0, arg1, type, /*do_nonfinite=*/ 0, mpc_pow);
10230     break;
10231
10232     CASE_FLT_FN (BUILT_IN_LDEXP):
10233       return fold_builtin_load_exponent (loc, arg0, arg1, type, /*ldexp=*/true);
10234     CASE_FLT_FN (BUILT_IN_SCALBN):
10235     CASE_FLT_FN (BUILT_IN_SCALBLN):
10236       return fold_builtin_load_exponent (loc, arg0, arg1,
10237                                          type, /*ldexp=*/false);
10238
10239     CASE_FLT_FN (BUILT_IN_FREXP):
10240       return fold_builtin_frexp (loc, arg0, arg1, type);
10241
10242     CASE_FLT_FN (BUILT_IN_MODF):
10243       return fold_builtin_modf (loc, arg0, arg1, type);
10244
10245     case BUILT_IN_BZERO:
10246       return fold_builtin_bzero (loc, arg0, arg1, ignore);
10247
10248     case BUILT_IN_FPUTS:
10249       return fold_builtin_fputs (loc, arg0, arg1, ignore, false, NULL_TREE);
10250
10251     case BUILT_IN_FPUTS_UNLOCKED:
10252       return fold_builtin_fputs (loc, arg0, arg1, ignore, true, NULL_TREE);
10253
10254     case BUILT_IN_STRSTR:
10255       return fold_builtin_strstr (loc, arg0, arg1, type);
10256
10257     case BUILT_IN_STRCAT:
10258       return fold_builtin_strcat (loc, arg0, arg1);
10259
10260     case BUILT_IN_STRSPN:
10261       return fold_builtin_strspn (loc, arg0, arg1);
10262
10263     case BUILT_IN_STRCSPN:
10264       return fold_builtin_strcspn (loc, arg0, arg1);
10265
10266     case BUILT_IN_STRCHR:
10267     case BUILT_IN_INDEX:
10268       return fold_builtin_strchr (loc, arg0, arg1, type);
10269
10270     case BUILT_IN_STRRCHR:
10271     case BUILT_IN_RINDEX:
10272       return fold_builtin_strrchr (loc, arg0, arg1, type);
10273
10274     case BUILT_IN_STRCPY:
10275       return fold_builtin_strcpy (loc, fndecl, arg0, arg1, NULL_TREE);
10276
10277     case BUILT_IN_STPCPY:
10278       if (ignore)
10279         {
10280           tree fn = implicit_built_in_decls[BUILT_IN_STRCPY];
10281           if (!fn)
10282             break;
10283
10284           return build_call_expr_loc (loc, fn, 2, arg0, arg1);
10285         }
10286       else
10287         return fold_builtin_stpcpy (loc, fndecl, arg0, arg1);
10288       break;
10289
10290     case BUILT_IN_STRCMP:
10291       return fold_builtin_strcmp (loc, arg0, arg1);
10292
10293     case BUILT_IN_STRPBRK:
10294       return fold_builtin_strpbrk (loc, arg0, arg1, type);
10295
10296     case BUILT_IN_EXPECT:
10297       return fold_builtin_expect (loc, arg0, arg1);
10298
10299     CASE_FLT_FN (BUILT_IN_POW):
10300       return fold_builtin_pow (loc, fndecl, arg0, arg1, type);
10301
10302     CASE_FLT_FN (BUILT_IN_POWI):
10303       return fold_builtin_powi (loc, fndecl, arg0, arg1, type);
10304
10305     CASE_FLT_FN (BUILT_IN_COPYSIGN):
10306       return fold_builtin_copysign (loc, fndecl, arg0, arg1, type);
10307
10308     CASE_FLT_FN (BUILT_IN_FMIN):
10309       return fold_builtin_fmin_fmax (loc, arg0, arg1, type, /*max=*/false);
10310
10311     CASE_FLT_FN (BUILT_IN_FMAX):
10312       return fold_builtin_fmin_fmax (loc, arg0, arg1, type, /*max=*/true);
10313
10314     case BUILT_IN_ISGREATER:
10315       return fold_builtin_unordered_cmp (loc, fndecl,
10316                                          arg0, arg1, UNLE_EXPR, LE_EXPR);
10317     case BUILT_IN_ISGREATEREQUAL:
10318       return fold_builtin_unordered_cmp (loc, fndecl,
10319                                          arg0, arg1, UNLT_EXPR, LT_EXPR);
10320     case BUILT_IN_ISLESS:
10321       return fold_builtin_unordered_cmp (loc, fndecl,
10322                                          arg0, arg1, UNGE_EXPR, GE_EXPR);
10323     case BUILT_IN_ISLESSEQUAL:
10324       return fold_builtin_unordered_cmp (loc, fndecl,
10325                                          arg0, arg1, UNGT_EXPR, GT_EXPR);
10326     case BUILT_IN_ISLESSGREATER:
10327       return fold_builtin_unordered_cmp (loc, fndecl,
10328                                          arg0, arg1, UNEQ_EXPR, EQ_EXPR);
10329     case BUILT_IN_ISUNORDERED:
10330       return fold_builtin_unordered_cmp (loc, fndecl,
10331                                          arg0, arg1, UNORDERED_EXPR,
10332                                          NOP_EXPR);
10333
10334       /* We do the folding for va_start in the expander.  */
10335     case BUILT_IN_VA_START:
10336       break;
10337
10338     case BUILT_IN_SPRINTF:
10339       return fold_builtin_sprintf (loc, arg0, arg1, NULL_TREE, ignore);
10340
10341     case BUILT_IN_OBJECT_SIZE:
10342       return fold_builtin_object_size (arg0, arg1);
10343
10344     case BUILT_IN_PRINTF:
10345     case BUILT_IN_PRINTF_UNLOCKED:
10346     case BUILT_IN_VPRINTF:
10347       return fold_builtin_printf (loc, fndecl, arg0, arg1, ignore, fcode);
10348
10349     case BUILT_IN_PRINTF_CHK:
10350     case BUILT_IN_VPRINTF_CHK:
10351       if (!validate_arg (arg0, INTEGER_TYPE)
10352           || TREE_SIDE_EFFECTS (arg0))
10353         return NULL_TREE;
10354       else
10355         return fold_builtin_printf (loc, fndecl,
10356                                     arg1, NULL_TREE, ignore, fcode);
10357     break;
10358
10359     case BUILT_IN_FPRINTF:
10360     case BUILT_IN_FPRINTF_UNLOCKED:
10361     case BUILT_IN_VFPRINTF:
10362       return fold_builtin_fprintf (loc, fndecl, arg0, arg1, NULL_TREE,
10363                                    ignore, fcode);
10364
10365     default:
10366       break;
10367     }
10368   return NULL_TREE;
10369 }
10370
10371 /* Fold a call to built-in function FNDECL with 3 arguments, ARG0, ARG1,
10372    and ARG2.  IGNORE is true if the result of the function call is ignored.
10373    This function returns NULL_TREE if no simplification was possible.  */
10374
10375 static tree
10376 fold_builtin_3 (location_t loc, tree fndecl,
10377                 tree arg0, tree arg1, tree arg2, bool ignore)
10378 {
10379   tree type = TREE_TYPE (TREE_TYPE (fndecl));
10380   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
10381   switch (fcode)
10382     {
10383
10384     CASE_FLT_FN (BUILT_IN_SINCOS):
10385       return fold_builtin_sincos (loc, arg0, arg1, arg2);
10386
10387     CASE_FLT_FN (BUILT_IN_FMA):
10388       if (validate_arg (arg0, REAL_TYPE)
10389           && validate_arg(arg1, REAL_TYPE)
10390           && validate_arg(arg2, REAL_TYPE))
10391         return do_mpfr_arg3 (arg0, arg1, arg2, type, mpfr_fma);
10392     break;
10393
10394     CASE_FLT_FN (BUILT_IN_REMQUO):
10395       if (validate_arg (arg0, REAL_TYPE)
10396           && validate_arg(arg1, REAL_TYPE)
10397           && validate_arg(arg2, POINTER_TYPE))
10398         return do_mpfr_remquo (arg0, arg1, arg2);
10399     break;
10400
10401     case BUILT_IN_MEMSET:
10402       return fold_builtin_memset (loc, arg0, arg1, arg2, type, ignore);
10403
10404     case BUILT_IN_BCOPY:
10405       return fold_builtin_memory_op (loc, arg1, arg0, arg2,
10406                                      void_type_node, true, /*endp=*/3);
10407
10408     case BUILT_IN_MEMCPY:
10409       return fold_builtin_memory_op (loc, arg0, arg1, arg2,
10410                                      type, ignore, /*endp=*/0);
10411
10412     case BUILT_IN_MEMPCPY:
10413       return fold_builtin_memory_op (loc, arg0, arg1, arg2,
10414                                      type, ignore, /*endp=*/1);
10415
10416     case BUILT_IN_MEMMOVE:
10417       return fold_builtin_memory_op (loc, arg0, arg1, arg2,
10418                                      type, ignore, /*endp=*/3);
10419
10420     case BUILT_IN_STRNCAT:
10421       return fold_builtin_strncat (loc, arg0, arg1, arg2);
10422
10423     case BUILT_IN_STRNCPY:
10424       return fold_builtin_strncpy (loc, fndecl, arg0, arg1, arg2, NULL_TREE);
10425
10426     case BUILT_IN_STRNCMP:
10427       return fold_builtin_strncmp (loc, arg0, arg1, arg2);
10428
10429     case BUILT_IN_MEMCHR:
10430       return fold_builtin_memchr (loc, arg0, arg1, arg2, type);
10431
10432     case BUILT_IN_BCMP:
10433     case BUILT_IN_MEMCMP:
10434       return fold_builtin_memcmp (loc, arg0, arg1, arg2);;
10435
10436     case BUILT_IN_SPRINTF:
10437       return fold_builtin_sprintf (loc, arg0, arg1, arg2, ignore);
10438
10439     case BUILT_IN_STRCPY_CHK:
10440     case BUILT_IN_STPCPY_CHK:
10441       return fold_builtin_stxcpy_chk (loc, fndecl, arg0, arg1, arg2, NULL_TREE,
10442                                       ignore, fcode);
10443
10444     case BUILT_IN_STRCAT_CHK:
10445       return fold_builtin_strcat_chk (loc, fndecl, arg0, arg1, arg2);
10446
10447     case BUILT_IN_PRINTF_CHK:
10448     case BUILT_IN_VPRINTF_CHK:
10449       if (!validate_arg (arg0, INTEGER_TYPE)
10450           || TREE_SIDE_EFFECTS (arg0))
10451         return NULL_TREE;
10452       else
10453         return fold_builtin_printf (loc, fndecl, arg1, arg2, ignore, fcode);
10454     break;
10455
10456     case BUILT_IN_FPRINTF:
10457     case BUILT_IN_FPRINTF_UNLOCKED:
10458     case BUILT_IN_VFPRINTF:
10459       return fold_builtin_fprintf (loc, fndecl, arg0, arg1, arg2,
10460                                    ignore, fcode);
10461
10462     case BUILT_IN_FPRINTF_CHK:
10463     case BUILT_IN_VFPRINTF_CHK:
10464       if (!validate_arg (arg1, INTEGER_TYPE)
10465           || TREE_SIDE_EFFECTS (arg1))
10466         return NULL_TREE;
10467       else
10468         return fold_builtin_fprintf (loc, fndecl, arg0, arg2, NULL_TREE,
10469                                      ignore, fcode);
10470
10471     default:
10472       break;
10473     }
10474   return NULL_TREE;
10475 }
10476
10477 /* Fold a call to built-in function FNDECL with 4 arguments, ARG0, ARG1,
10478    ARG2, and ARG3.  IGNORE is true if the result of the function call is
10479    ignored.  This function returns NULL_TREE if no simplification was
10480    possible.  */
10481
10482 static tree
10483 fold_builtin_4 (location_t loc, tree fndecl,
10484                 tree arg0, tree arg1, tree arg2, tree arg3, bool ignore)
10485 {
10486   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
10487
10488   switch (fcode)
10489     {
10490     case BUILT_IN_MEMCPY_CHK:
10491     case BUILT_IN_MEMPCPY_CHK:
10492     case BUILT_IN_MEMMOVE_CHK:
10493     case BUILT_IN_MEMSET_CHK:
10494       return fold_builtin_memory_chk (loc, fndecl, arg0, arg1, arg2, arg3,
10495                                       NULL_TREE, ignore,
10496                                       DECL_FUNCTION_CODE (fndecl));
10497
10498     case BUILT_IN_STRNCPY_CHK:
10499       return fold_builtin_strncpy_chk (loc, arg0, arg1, arg2, arg3, NULL_TREE);
10500
10501     case BUILT_IN_STRNCAT_CHK:
10502       return fold_builtin_strncat_chk (loc, fndecl, arg0, arg1, arg2, arg3);
10503
10504     case BUILT_IN_FPRINTF_CHK:
10505     case BUILT_IN_VFPRINTF_CHK:
10506       if (!validate_arg (arg1, INTEGER_TYPE)
10507           || TREE_SIDE_EFFECTS (arg1))
10508         return NULL_TREE;
10509       else
10510         return fold_builtin_fprintf (loc, fndecl, arg0, arg2, arg3,
10511                                      ignore, fcode);
10512     break;
10513
10514     default:
10515       break;
10516     }
10517   return NULL_TREE;
10518 }
10519
10520 /* Fold a call to built-in function FNDECL.  ARGS is an array of NARGS
10521     arguments, where NARGS <= 4.  IGNORE is true if the result of the
10522     function call is ignored.  This function returns NULL_TREE if no
10523     simplification was possible.  Note that this only folds builtins with
10524     fixed argument patterns.  Foldings that do varargs-to-varargs
10525     transformations, or that match calls with more than 4 arguments,
10526     need to be handled with fold_builtin_varargs instead.  */
10527
10528 #define MAX_ARGS_TO_FOLD_BUILTIN 4
10529
10530 static tree
10531 fold_builtin_n (location_t loc, tree fndecl, tree *args, int nargs, bool ignore)
10532 {
10533   tree ret = NULL_TREE;
10534
10535   switch (nargs)
10536     {
10537     case 0:
10538       ret = fold_builtin_0 (loc, fndecl, ignore);
10539       break;
10540     case 1:
10541       ret = fold_builtin_1 (loc, fndecl, args[0], ignore);
10542       break;
10543     case 2:
10544       ret = fold_builtin_2 (loc, fndecl, args[0], args[1], ignore);
10545       break;
10546     case 3:
10547       ret = fold_builtin_3 (loc, fndecl, args[0], args[1], args[2], ignore);
10548       break;
10549     case 4:
10550       ret = fold_builtin_4 (loc, fndecl, args[0], args[1], args[2], args[3],
10551                             ignore);
10552       break;
10553     default:
10554       break;
10555     }
10556   if (ret)
10557     {
10558       ret = build1 (NOP_EXPR, TREE_TYPE (ret), ret);
10559       SET_EXPR_LOCATION (ret, loc);
10560       TREE_NO_WARNING (ret) = 1;
10561       return ret;
10562     }
10563   return NULL_TREE;
10564 }
10565
10566 /* Builtins with folding operations that operate on "..." arguments
10567    need special handling; we need to store the arguments in a convenient
10568    data structure before attempting any folding.  Fortunately there are
10569    only a few builtins that fall into this category.  FNDECL is the
10570    function, EXP is the CALL_EXPR for the call, and IGNORE is true if the
10571    result of the function call is ignored.  */
10572
10573 static tree
10574 fold_builtin_varargs (location_t loc, tree fndecl, tree exp,
10575                       bool ignore ATTRIBUTE_UNUSED)
10576 {
10577   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
10578   tree ret = NULL_TREE;
10579
10580   switch (fcode)
10581     {
10582     case BUILT_IN_SPRINTF_CHK:
10583     case BUILT_IN_VSPRINTF_CHK:
10584       ret = fold_builtin_sprintf_chk (loc, exp, fcode);
10585       break;
10586
10587     case BUILT_IN_SNPRINTF_CHK:
10588     case BUILT_IN_VSNPRINTF_CHK:
10589       ret = fold_builtin_snprintf_chk (loc, exp, NULL_TREE, fcode);
10590       break;
10591
10592     case BUILT_IN_FPCLASSIFY:
10593       ret = fold_builtin_fpclassify (loc, exp);
10594       break;
10595
10596     default:
10597       break;
10598     }
10599   if (ret)
10600     {
10601       ret = build1 (NOP_EXPR, TREE_TYPE (ret), ret);
10602       SET_EXPR_LOCATION (ret, loc);
10603       TREE_NO_WARNING (ret) = 1;
10604       return ret;
10605     }
10606   return NULL_TREE;
10607 }
10608
10609 /* Return true if FNDECL shouldn't be folded right now.
10610    If a built-in function has an inline attribute always_inline
10611    wrapper, defer folding it after always_inline functions have
10612    been inlined, otherwise e.g. -D_FORTIFY_SOURCE checking
10613    might not be performed.  */
10614
10615 static bool
10616 avoid_folding_inline_builtin (tree fndecl)
10617 {
10618   return (DECL_DECLARED_INLINE_P (fndecl)
10619           && DECL_DISREGARD_INLINE_LIMITS (fndecl)
10620           && cfun
10621           && !cfun->always_inline_functions_inlined
10622           && lookup_attribute ("always_inline", DECL_ATTRIBUTES (fndecl)));
10623 }
10624
10625 /* A wrapper function for builtin folding that prevents warnings for
10626    "statement without effect" and the like, caused by removing the
10627    call node earlier than the warning is generated.  */
10628
10629 tree
10630 fold_call_expr (location_t loc, tree exp, bool ignore)
10631 {
10632   tree ret = NULL_TREE;
10633   tree fndecl = get_callee_fndecl (exp);
10634   if (fndecl
10635       && TREE_CODE (fndecl) == FUNCTION_DECL
10636       && DECL_BUILT_IN (fndecl)
10637       /* If CALL_EXPR_VA_ARG_PACK is set, the arguments aren't finalized
10638          yet.  Defer folding until we see all the arguments
10639          (after inlining).  */
10640       && !CALL_EXPR_VA_ARG_PACK (exp))
10641     {
10642       int nargs = call_expr_nargs (exp);
10643
10644       /* Before gimplification CALL_EXPR_VA_ARG_PACK is not set, but
10645          instead last argument is __builtin_va_arg_pack ().  Defer folding
10646          even in that case, until arguments are finalized.  */
10647       if (nargs && TREE_CODE (CALL_EXPR_ARG (exp, nargs - 1)) == CALL_EXPR)
10648         {
10649           tree fndecl2 = get_callee_fndecl (CALL_EXPR_ARG (exp, nargs - 1));
10650           if (fndecl2
10651               && TREE_CODE (fndecl2) == FUNCTION_DECL
10652               && DECL_BUILT_IN_CLASS (fndecl2) == BUILT_IN_NORMAL
10653               && DECL_FUNCTION_CODE (fndecl2) == BUILT_IN_VA_ARG_PACK)
10654             return NULL_TREE;
10655         }
10656
10657       if (avoid_folding_inline_builtin (fndecl))
10658         return NULL_TREE;
10659
10660       if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
10661         return targetm.fold_builtin (fndecl, call_expr_nargs (exp),
10662                                      CALL_EXPR_ARGP (exp), ignore);
10663       else
10664         {
10665           if (nargs <= MAX_ARGS_TO_FOLD_BUILTIN)
10666             {
10667               tree *args = CALL_EXPR_ARGP (exp);
10668               ret = fold_builtin_n (loc, fndecl, args, nargs, ignore);
10669             }
10670           if (!ret)
10671             ret = fold_builtin_varargs (loc, fndecl, exp, ignore);
10672           if (ret)
10673             return ret;
10674         }
10675     }
10676   return NULL_TREE;
10677 }
10678
10679 /* Conveniently construct a function call expression.  FNDECL names the
10680     function to be called and ARGLIST is a TREE_LIST of arguments.  */
10681
10682 tree
10683 build_function_call_expr (location_t loc, tree fndecl, tree arglist)
10684 {
10685   tree fntype = TREE_TYPE (fndecl);
10686   tree fn = build1 (ADDR_EXPR, build_pointer_type (fntype), fndecl);
10687   int n = list_length (arglist);
10688   tree *argarray = (tree *) alloca (n * sizeof (tree));
10689   int i;
10690
10691   for (i = 0; i < n; i++, arglist = TREE_CHAIN (arglist))
10692     argarray[i] = TREE_VALUE (arglist);
10693   return fold_builtin_call_array (loc, TREE_TYPE (fntype), fn, n, argarray);
10694 }
10695
10696 /* Conveniently construct a function call expression.  FNDECL names the
10697    function to be called, N is the number of arguments, and the "..."
10698    parameters are the argument expressions.  */
10699
10700 tree
10701 build_call_expr_loc (location_t loc, tree fndecl, int n, ...)
10702 {
10703   va_list ap;
10704   tree fntype = TREE_TYPE (fndecl);
10705   tree fn = build1 (ADDR_EXPR, build_pointer_type (fntype), fndecl);
10706   tree *argarray = (tree *) alloca (n * sizeof (tree));
10707   int i;
10708
10709   va_start (ap, n);
10710   for (i = 0; i < n; i++)
10711     argarray[i] = va_arg (ap, tree);
10712   va_end (ap);
10713   return fold_builtin_call_array (loc, TREE_TYPE (fntype), fn, n, argarray);
10714 }
10715
10716 /* Like build_call_expr_loc (UNKNOWN_LOCATION, ...).  Duplicated because
10717    varargs macros aren't supported by all bootstrap compilers.  */
10718
10719 tree
10720 build_call_expr (tree fndecl, int n, ...)
10721 {
10722   va_list ap;
10723   tree fntype = TREE_TYPE (fndecl);
10724   tree fn = build1 (ADDR_EXPR, build_pointer_type (fntype), fndecl);
10725   tree *argarray = (tree *) alloca (n * sizeof (tree));
10726   int i;
10727
10728   va_start (ap, n);
10729   for (i = 0; i < n; i++)
10730     argarray[i] = va_arg (ap, tree);
10731   va_end (ap);
10732   return fold_builtin_call_array (UNKNOWN_LOCATION, TREE_TYPE (fntype),
10733                                   fn, n, argarray);
10734 }
10735
10736 /* Construct a CALL_EXPR with type TYPE with FN as the function expression.
10737    N arguments are passed in the array ARGARRAY.  */
10738
10739 tree
10740 fold_builtin_call_array (location_t loc, tree type,
10741                          tree fn,
10742                          int n,
10743                          tree *argarray)
10744 {
10745   tree ret = NULL_TREE;
10746    tree exp;
10747
10748   if (TREE_CODE (fn) == ADDR_EXPR)
10749   {
10750     tree fndecl = TREE_OPERAND (fn, 0);
10751     if (TREE_CODE (fndecl) == FUNCTION_DECL
10752         && DECL_BUILT_IN (fndecl))
10753       {
10754         /* If last argument is __builtin_va_arg_pack (), arguments to this
10755            function are not finalized yet.  Defer folding until they are.  */
10756         if (n && TREE_CODE (argarray[n - 1]) == CALL_EXPR)
10757           {
10758             tree fndecl2 = get_callee_fndecl (argarray[n - 1]);
10759             if (fndecl2
10760                 && TREE_CODE (fndecl2) == FUNCTION_DECL
10761                 && DECL_BUILT_IN_CLASS (fndecl2) == BUILT_IN_NORMAL
10762                 && DECL_FUNCTION_CODE (fndecl2) == BUILT_IN_VA_ARG_PACK)
10763               return build_call_array_loc (loc, type, fn, n, argarray);
10764           }
10765         if (avoid_folding_inline_builtin (fndecl))
10766           return build_call_array_loc (loc, type, fn, n, argarray);
10767         if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
10768           {
10769             ret = targetm.fold_builtin (fndecl, n, argarray, false);
10770             if (ret)
10771               return ret;
10772
10773             return build_call_array_loc (loc, type, fn, n, argarray);
10774           }
10775         else if (n <= MAX_ARGS_TO_FOLD_BUILTIN)
10776           {
10777             /* First try the transformations that don't require consing up
10778                an exp.  */
10779             ret = fold_builtin_n (loc, fndecl, argarray, n, false);
10780             if (ret)
10781               return ret;
10782           }
10783
10784         /* If we got this far, we need to build an exp.  */
10785         exp = build_call_array_loc (loc, type, fn, n, argarray);
10786         ret = fold_builtin_varargs (loc, fndecl, exp, false);
10787         return ret ? ret : exp;
10788       }
10789   }
10790
10791   return build_call_array_loc (loc, type, fn, n, argarray);
10792 }
10793
10794 /* Construct a new CALL_EXPR using the tail of the argument list of EXP
10795    along with N new arguments specified as the "..." parameters.  SKIP
10796    is the number of arguments in EXP to be omitted.  This function is used
10797    to do varargs-to-varargs transformations.  */
10798
10799 static tree
10800 rewrite_call_expr (location_t loc, tree exp, int skip, tree fndecl, int n, ...)
10801 {
10802   int oldnargs = call_expr_nargs (exp);
10803   int nargs = oldnargs - skip + n;
10804   tree fntype = TREE_TYPE (fndecl);
10805   tree fn = build1 (ADDR_EXPR, build_pointer_type (fntype), fndecl);
10806   tree *buffer;
10807
10808   if (n > 0)
10809     {
10810       int i, j;
10811       va_list ap;
10812
10813       buffer = XALLOCAVEC (tree, nargs);
10814       va_start (ap, n);
10815       for (i = 0; i < n; i++)
10816         buffer[i] = va_arg (ap, tree);
10817       va_end (ap);
10818       for (j = skip; j < oldnargs; j++, i++)
10819         buffer[i] = CALL_EXPR_ARG (exp, j);
10820     }
10821   else
10822     buffer = CALL_EXPR_ARGP (exp) + skip;
10823
10824   return fold (build_call_array_loc (loc, TREE_TYPE (exp), fn, nargs, buffer));
10825 }
10826
10827 /* Validate a single argument ARG against a tree code CODE representing
10828    a type.  */
10829
10830 static bool
10831 validate_arg (const_tree arg, enum tree_code code)
10832 {
10833   if (!arg)
10834     return false;
10835   else if (code == POINTER_TYPE)
10836     return POINTER_TYPE_P (TREE_TYPE (arg));
10837   else if (code == INTEGER_TYPE)
10838     return INTEGRAL_TYPE_P (TREE_TYPE (arg));
10839   return code == TREE_CODE (TREE_TYPE (arg));
10840 }
10841
10842 /* This function validates the types of a function call argument list
10843    against a specified list of tree_codes.  If the last specifier is a 0,
10844    that represents an ellipses, otherwise the last specifier must be a
10845    VOID_TYPE.
10846
10847    This is the GIMPLE version of validate_arglist.  Eventually we want to
10848    completely convert builtins.c to work from GIMPLEs and the tree based
10849    validate_arglist will then be removed.  */
10850
10851 bool
10852 validate_gimple_arglist (const_gimple call, ...)
10853 {
10854   enum tree_code code;
10855   bool res = 0;
10856   va_list ap;
10857   const_tree arg;
10858   size_t i;
10859
10860   va_start (ap, call);
10861   i = 0;
10862
10863   do
10864     {
10865       code = (enum tree_code) va_arg (ap, int);
10866       switch (code)
10867         {
10868         case 0:
10869           /* This signifies an ellipses, any further arguments are all ok.  */
10870           res = true;
10871           goto end;
10872         case VOID_TYPE:
10873           /* This signifies an endlink, if no arguments remain, return
10874              true, otherwise return false.  */
10875           res = (i == gimple_call_num_args (call));
10876           goto end;
10877         default:
10878           /* If no parameters remain or the parameter's code does not
10879              match the specified code, return false.  Otherwise continue
10880              checking any remaining arguments.  */
10881           arg = gimple_call_arg (call, i++);
10882           if (!validate_arg (arg, code))
10883             goto end;
10884           break;
10885         }
10886     }
10887   while (1);
10888
10889   /* We need gotos here since we can only have one VA_CLOSE in a
10890      function.  */
10891  end: ;
10892   va_end (ap);
10893
10894   return res;
10895 }
10896
10897 /* This function validates the types of a function call argument list
10898    against a specified list of tree_codes.  If the last specifier is a 0,
10899    that represents an ellipses, otherwise the last specifier must be a
10900    VOID_TYPE.  */
10901
10902 bool
10903 validate_arglist (const_tree callexpr, ...)
10904 {
10905   enum tree_code code;
10906   bool res = 0;
10907   va_list ap;
10908   const_call_expr_arg_iterator iter;
10909   const_tree arg;
10910
10911   va_start (ap, callexpr);
10912   init_const_call_expr_arg_iterator (callexpr, &iter);
10913
10914   do
10915     {
10916       code = (enum tree_code) va_arg (ap, int);
10917       switch (code)
10918         {
10919         case 0:
10920           /* This signifies an ellipses, any further arguments are all ok.  */
10921           res = true;
10922           goto end;
10923         case VOID_TYPE:
10924           /* This signifies an endlink, if no arguments remain, return
10925              true, otherwise return false.  */
10926           res = !more_const_call_expr_args_p (&iter);
10927           goto end;
10928         default:
10929           /* If no parameters remain or the parameter's code does not
10930              match the specified code, return false.  Otherwise continue
10931              checking any remaining arguments.  */
10932           arg = next_const_call_expr_arg (&iter);
10933           if (!validate_arg (arg, code))
10934             goto end;
10935           break;
10936         }
10937     }
10938   while (1);
10939
10940   /* We need gotos here since we can only have one VA_CLOSE in a
10941      function.  */
10942  end: ;
10943   va_end (ap);
10944
10945   return res;
10946 }
10947
10948 /* Default target-specific builtin expander that does nothing.  */
10949
10950 rtx
10951 default_expand_builtin (tree exp ATTRIBUTE_UNUSED,
10952                         rtx target ATTRIBUTE_UNUSED,
10953                         rtx subtarget ATTRIBUTE_UNUSED,
10954                         enum machine_mode mode ATTRIBUTE_UNUSED,
10955                         int ignore ATTRIBUTE_UNUSED)
10956 {
10957   return NULL_RTX;
10958 }
10959
10960 /* Returns true is EXP represents data that would potentially reside
10961    in a readonly section.  */
10962
10963 static bool
10964 readonly_data_expr (tree exp)
10965 {
10966   STRIP_NOPS (exp);
10967
10968   if (TREE_CODE (exp) != ADDR_EXPR)
10969     return false;
10970
10971   exp = get_base_address (TREE_OPERAND (exp, 0));
10972   if (!exp)
10973     return false;
10974
10975   /* Make sure we call decl_readonly_section only for trees it
10976      can handle (since it returns true for everything it doesn't
10977      understand).  */
10978   if (TREE_CODE (exp) == STRING_CST
10979       || TREE_CODE (exp) == CONSTRUCTOR
10980       || (TREE_CODE (exp) == VAR_DECL && TREE_STATIC (exp)))
10981     return decl_readonly_section (exp, 0);
10982   else
10983     return false;
10984 }
10985
10986 /* Simplify a call to the strstr builtin.  S1 and S2 are the arguments
10987    to the call, and TYPE is its return type.
10988
10989    Return NULL_TREE if no simplification was possible, otherwise return the
10990    simplified form of the call as a tree.
10991
10992    The simplified form may be a constant or other expression which
10993    computes the same value, but in a more efficient manner (including
10994    calls to other builtin functions).
10995
10996    The call may contain arguments which need to be evaluated, but
10997    which are not useful to determine the result of the call.  In
10998    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
10999    COMPOUND_EXPR will be an argument which must be evaluated.
11000    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11001    COMPOUND_EXPR in the chain will contain the tree for the simplified
11002    form of the builtin function call.  */
11003
11004 static tree
11005 fold_builtin_strstr (location_t loc, tree s1, tree s2, tree type)
11006 {
11007   if (!validate_arg (s1, POINTER_TYPE)
11008       || !validate_arg (s2, POINTER_TYPE))
11009     return NULL_TREE;
11010   else
11011     {
11012       tree fn;
11013       const char *p1, *p2;
11014
11015       p2 = c_getstr (s2);
11016       if (p2 == NULL)
11017         return NULL_TREE;
11018
11019       p1 = c_getstr (s1);
11020       if (p1 != NULL)
11021         {
11022           const char *r = strstr (p1, p2);
11023           tree tem;
11024
11025           if (r == NULL)
11026             return build_int_cst (TREE_TYPE (s1), 0);
11027
11028           /* Return an offset into the constant string argument.  */
11029           tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
11030                              s1, size_int (r - p1));
11031           return fold_convert_loc (loc, type, tem);
11032         }
11033
11034       /* The argument is const char *, and the result is char *, so we need
11035          a type conversion here to avoid a warning.  */
11036       if (p2[0] == '\0')
11037         return fold_convert_loc (loc, type, s1);
11038
11039       if (p2[1] != '\0')
11040         return NULL_TREE;
11041
11042       fn = implicit_built_in_decls[BUILT_IN_STRCHR];
11043       if (!fn)
11044         return NULL_TREE;
11045
11046       /* New argument list transforming strstr(s1, s2) to
11047          strchr(s1, s2[0]).  */
11048       return build_call_expr_loc (loc, fn, 2, s1, build_int_cst (NULL_TREE, p2[0]));
11049     }
11050 }
11051
11052 /* Simplify a call to the strchr builtin.  S1 and S2 are the arguments to
11053    the call, and TYPE is its return type.
11054
11055    Return NULL_TREE if no simplification was possible, otherwise return the
11056    simplified form of the call as a tree.
11057
11058    The simplified form may be a constant or other expression which
11059    computes the same value, but in a more efficient manner (including
11060    calls to other builtin functions).
11061
11062    The call may contain arguments which need to be evaluated, but
11063    which are not useful to determine the result of the call.  In
11064    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11065    COMPOUND_EXPR will be an argument which must be evaluated.
11066    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11067    COMPOUND_EXPR in the chain will contain the tree for the simplified
11068    form of the builtin function call.  */
11069
11070 static tree
11071 fold_builtin_strchr (location_t loc, tree s1, tree s2, tree type)
11072 {
11073   if (!validate_arg (s1, POINTER_TYPE)
11074       || !validate_arg (s2, INTEGER_TYPE))
11075     return NULL_TREE;
11076   else
11077     {
11078       const char *p1;
11079
11080       if (TREE_CODE (s2) != INTEGER_CST)
11081         return NULL_TREE;
11082
11083       p1 = c_getstr (s1);
11084       if (p1 != NULL)
11085         {
11086           char c;
11087           const char *r;
11088           tree tem;
11089
11090           if (target_char_cast (s2, &c))
11091             return NULL_TREE;
11092
11093           r = strchr (p1, c);
11094
11095           if (r == NULL)
11096             return build_int_cst (TREE_TYPE (s1), 0);
11097
11098           /* Return an offset into the constant string argument.  */
11099           tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
11100                              s1, size_int (r - p1));
11101           return fold_convert_loc (loc, type, tem);
11102         }
11103       return NULL_TREE;
11104     }
11105 }
11106
11107 /* Simplify a call to the strrchr builtin.  S1 and S2 are the arguments to
11108    the call, and TYPE is its return type.
11109
11110    Return NULL_TREE if no simplification was possible, otherwise return the
11111    simplified form of the call as a tree.
11112
11113    The simplified form may be a constant or other expression which
11114    computes the same value, but in a more efficient manner (including
11115    calls to other builtin functions).
11116
11117    The call may contain arguments which need to be evaluated, but
11118    which are not useful to determine the result of the call.  In
11119    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11120    COMPOUND_EXPR will be an argument which must be evaluated.
11121    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11122    COMPOUND_EXPR in the chain will contain the tree for the simplified
11123    form of the builtin function call.  */
11124
11125 static tree
11126 fold_builtin_strrchr (location_t loc, tree s1, tree s2, tree type)
11127 {
11128   if (!validate_arg (s1, POINTER_TYPE)
11129       || !validate_arg (s2, INTEGER_TYPE))
11130     return NULL_TREE;
11131   else
11132     {
11133       tree fn;
11134       const char *p1;
11135
11136       if (TREE_CODE (s2) != INTEGER_CST)
11137         return NULL_TREE;
11138
11139       p1 = c_getstr (s1);
11140       if (p1 != NULL)
11141         {
11142           char c;
11143           const char *r;
11144           tree tem;
11145
11146           if (target_char_cast (s2, &c))
11147             return NULL_TREE;
11148
11149           r = strrchr (p1, c);
11150
11151           if (r == NULL)
11152             return build_int_cst (TREE_TYPE (s1), 0);
11153
11154           /* Return an offset into the constant string argument.  */
11155           tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
11156                              s1, size_int (r - p1));
11157           return fold_convert_loc (loc, type, tem);
11158         }
11159
11160       if (! integer_zerop (s2))
11161         return NULL_TREE;
11162
11163       fn = implicit_built_in_decls[BUILT_IN_STRCHR];
11164       if (!fn)
11165         return NULL_TREE;
11166
11167       /* Transform strrchr(s1, '\0') to strchr(s1, '\0').  */
11168       return build_call_expr_loc (loc, fn, 2, s1, s2);
11169     }
11170 }
11171
11172 /* Simplify a call to the strpbrk builtin.  S1 and S2 are the arguments
11173    to the call, and TYPE is its return type.
11174
11175    Return NULL_TREE if no simplification was possible, otherwise return the
11176    simplified form of the call as a tree.
11177
11178    The simplified form may be a constant or other expression which
11179    computes the same value, but in a more efficient manner (including
11180    calls to other builtin functions).
11181
11182    The call may contain arguments which need to be evaluated, but
11183    which are not useful to determine the result of the call.  In
11184    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11185    COMPOUND_EXPR will be an argument which must be evaluated.
11186    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11187    COMPOUND_EXPR in the chain will contain the tree for the simplified
11188    form of the builtin function call.  */
11189
11190 static tree
11191 fold_builtin_strpbrk (location_t loc, tree s1, tree s2, tree type)
11192 {
11193   if (!validate_arg (s1, POINTER_TYPE)
11194       || !validate_arg (s2, POINTER_TYPE))
11195     return NULL_TREE;
11196   else
11197     {
11198       tree fn;
11199       const char *p1, *p2;
11200
11201       p2 = c_getstr (s2);
11202       if (p2 == NULL)
11203         return NULL_TREE;
11204
11205       p1 = c_getstr (s1);
11206       if (p1 != NULL)
11207         {
11208           const char *r = strpbrk (p1, p2);
11209           tree tem;
11210
11211           if (r == NULL)
11212             return build_int_cst (TREE_TYPE (s1), 0);
11213
11214           /* Return an offset into the constant string argument.  */
11215           tem = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (s1),
11216                              s1, size_int (r - p1));
11217           return fold_convert_loc (loc, type, tem);
11218         }
11219
11220       if (p2[0] == '\0')
11221         /* strpbrk(x, "") == NULL.
11222            Evaluate and ignore s1 in case it had side-effects.  */
11223         return omit_one_operand_loc (loc, TREE_TYPE (s1), integer_zero_node, s1);
11224
11225       if (p2[1] != '\0')
11226         return NULL_TREE;  /* Really call strpbrk.  */
11227
11228       fn = implicit_built_in_decls[BUILT_IN_STRCHR];
11229       if (!fn)
11230         return NULL_TREE;
11231
11232       /* New argument list transforming strpbrk(s1, s2) to
11233          strchr(s1, s2[0]).  */
11234       return build_call_expr_loc (loc, fn, 2, s1, build_int_cst (NULL_TREE, p2[0]));
11235     }
11236 }
11237
11238 /* Simplify a call to the strcat builtin.  DST and SRC are the arguments
11239    to the call.
11240
11241    Return NULL_TREE if no simplification was possible, otherwise return the
11242    simplified form of the call as a tree.
11243
11244    The simplified form may be a constant or other expression which
11245    computes the same value, but in a more efficient manner (including
11246    calls to other builtin functions).
11247
11248    The call may contain arguments which need to be evaluated, but
11249    which are not useful to determine the result of the call.  In
11250    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11251    COMPOUND_EXPR will be an argument which must be evaluated.
11252    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11253    COMPOUND_EXPR in the chain will contain the tree for the simplified
11254    form of the builtin function call.  */
11255
11256 static tree
11257 fold_builtin_strcat (location_t loc ATTRIBUTE_UNUSED, tree dst, tree src)
11258 {
11259   if (!validate_arg (dst, POINTER_TYPE)
11260       || !validate_arg (src, POINTER_TYPE))
11261     return NULL_TREE;
11262   else
11263     {
11264       const char *p = c_getstr (src);
11265
11266       /* If the string length is zero, return the dst parameter.  */
11267       if (p && *p == '\0')
11268         return dst;
11269
11270       if (optimize_insn_for_speed_p ())
11271         {
11272           /* See if we can store by pieces into (dst + strlen(dst)).  */
11273           tree newdst, call;
11274           tree strlen_fn = implicit_built_in_decls[BUILT_IN_STRLEN];
11275           tree strcpy_fn = implicit_built_in_decls[BUILT_IN_STRCPY];
11276
11277           if (!strlen_fn || !strcpy_fn)
11278             return NULL_TREE;
11279
11280           /* If we don't have a movstr we don't want to emit an strcpy
11281              call.  We have to do that if the length of the source string
11282              isn't computable (in that case we can use memcpy probably
11283              later expanding to a sequence of mov instructions).  If we
11284              have movstr instructions we can emit strcpy calls.  */
11285           if (!HAVE_movstr)
11286             {
11287               tree len = c_strlen (src, 1);
11288               if (! len || TREE_SIDE_EFFECTS (len))
11289                 return NULL_TREE;
11290             }
11291
11292           /* Stabilize the argument list.  */
11293           dst = builtin_save_expr (dst);
11294
11295           /* Create strlen (dst).  */
11296           newdst = build_call_expr_loc (loc, strlen_fn, 1, dst);
11297           /* Create (dst p+ strlen (dst)).  */
11298
11299           newdst = fold_build2_loc (loc, POINTER_PLUS_EXPR,
11300                                 TREE_TYPE (dst), dst, newdst);
11301           newdst = builtin_save_expr (newdst);
11302
11303           call = build_call_expr_loc (loc, strcpy_fn, 2, newdst, src);
11304           return build2 (COMPOUND_EXPR, TREE_TYPE (dst), call, dst);
11305         }
11306       return NULL_TREE;
11307     }
11308 }
11309
11310 /* Simplify a call to the strncat builtin.  DST, SRC, and LEN are the
11311    arguments to the call.
11312
11313    Return NULL_TREE if no simplification was possible, otherwise return the
11314    simplified form of the call as a tree.
11315
11316    The simplified form may be a constant or other expression which
11317    computes the same value, but in a more efficient manner (including
11318    calls to other builtin functions).
11319
11320    The call may contain arguments which need to be evaluated, but
11321    which are not useful to determine the result of the call.  In
11322    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11323    COMPOUND_EXPR will be an argument which must be evaluated.
11324    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11325    COMPOUND_EXPR in the chain will contain the tree for the simplified
11326    form of the builtin function call.  */
11327
11328 static tree
11329 fold_builtin_strncat (location_t loc, tree dst, tree src, tree len)
11330 {
11331   if (!validate_arg (dst, POINTER_TYPE)
11332       || !validate_arg (src, POINTER_TYPE)
11333       || !validate_arg (len, INTEGER_TYPE))
11334     return NULL_TREE;
11335   else
11336     {
11337       const char *p = c_getstr (src);
11338
11339       /* If the requested length is zero, or the src parameter string
11340          length is zero, return the dst parameter.  */
11341       if (integer_zerop (len) || (p && *p == '\0'))
11342         return omit_two_operands_loc (loc, TREE_TYPE (dst), dst, src, len);
11343
11344       /* If the requested len is greater than or equal to the string
11345          length, call strcat.  */
11346       if (TREE_CODE (len) == INTEGER_CST && p
11347           && compare_tree_int (len, strlen (p)) >= 0)
11348         {
11349           tree fn = implicit_built_in_decls[BUILT_IN_STRCAT];
11350
11351           /* If the replacement _DECL isn't initialized, don't do the
11352              transformation.  */
11353           if (!fn)
11354             return NULL_TREE;
11355
11356           return build_call_expr_loc (loc, fn, 2, dst, src);
11357         }
11358       return NULL_TREE;
11359     }
11360 }
11361
11362 /* Simplify a call to the strspn builtin.  S1 and S2 are the arguments
11363    to the call.
11364
11365    Return NULL_TREE if no simplification was possible, otherwise return the
11366    simplified form of the call as a tree.
11367
11368    The simplified form may be a constant or other expression which
11369    computes the same value, but in a more efficient manner (including
11370    calls to other builtin functions).
11371
11372    The call may contain arguments which need to be evaluated, but
11373    which are not useful to determine the result of the call.  In
11374    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11375    COMPOUND_EXPR will be an argument which must be evaluated.
11376    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11377    COMPOUND_EXPR in the chain will contain the tree for the simplified
11378    form of the builtin function call.  */
11379
11380 static tree
11381 fold_builtin_strspn (location_t loc, tree s1, tree s2)
11382 {
11383   if (!validate_arg (s1, POINTER_TYPE)
11384       || !validate_arg (s2, POINTER_TYPE))
11385     return NULL_TREE;
11386   else
11387     {
11388       const char *p1 = c_getstr (s1), *p2 = c_getstr (s2);
11389
11390       /* If both arguments are constants, evaluate at compile-time.  */
11391       if (p1 && p2)
11392         {
11393           const size_t r = strspn (p1, p2);
11394           return size_int (r);
11395         }
11396
11397       /* If either argument is "", return NULL_TREE.  */
11398       if ((p1 && *p1 == '\0') || (p2 && *p2 == '\0'))
11399         /* Evaluate and ignore both arguments in case either one has
11400            side-effects.  */
11401         return omit_two_operands_loc (loc, size_type_node, size_zero_node,
11402                                   s1, s2);
11403       return NULL_TREE;
11404     }
11405 }
11406
11407 /* Simplify a call to the strcspn builtin.  S1 and S2 are the arguments
11408    to the call.
11409
11410    Return NULL_TREE if no simplification was possible, otherwise return the
11411    simplified form of the call as a tree.
11412
11413    The simplified form may be a constant or other expression which
11414    computes the same value, but in a more efficient manner (including
11415    calls to other builtin functions).
11416
11417    The call may contain arguments which need to be evaluated, but
11418    which are not useful to determine the result of the call.  In
11419    this case we return a chain of COMPOUND_EXPRs.  The LHS of each
11420    COMPOUND_EXPR will be an argument which must be evaluated.
11421    COMPOUND_EXPRs are chained through their RHS.  The RHS of the last
11422    COMPOUND_EXPR in the chain will contain the tree for the simplified
11423    form of the builtin function call.  */
11424
11425 static tree
11426 fold_builtin_strcspn (location_t loc, tree s1, tree s2)
11427 {
11428   if (!validate_arg (s1, POINTER_TYPE)
11429       || !validate_arg (s2, POINTER_TYPE))
11430     return NULL_TREE;
11431   else
11432     {
11433       const char *p1 = c_getstr (s1), *p2 = c_getstr (s2);
11434
11435       /* If both arguments are constants, evaluate at compile-time.  */
11436       if (p1 && p2)
11437         {
11438           const size_t r = strcspn (p1, p2);
11439           return size_int (r);
11440         }
11441
11442       /* If the first argument is "", return NULL_TREE.  */
11443       if (p1 && *p1 == '\0')
11444         {
11445           /* Evaluate and ignore argument s2 in case it has
11446              side-effects.  */
11447           return omit_one_operand_loc (loc, size_type_node,
11448                                    size_zero_node, s2);
11449         }
11450
11451       /* If the second argument is "", return __builtin_strlen(s1).  */
11452       if (p2 && *p2 == '\0')
11453         {
11454           tree fn = implicit_built_in_decls[BUILT_IN_STRLEN];
11455
11456           /* If the replacement _DECL isn't initialized, don't do the
11457              transformation.  */
11458           if (!fn)
11459             return NULL_TREE;
11460
11461           return build_call_expr_loc (loc, fn, 1, s1);
11462         }
11463       return NULL_TREE;
11464     }
11465 }
11466
11467 /* Fold a call to the fputs builtin.  ARG0 and ARG1 are the arguments
11468    to the call.  IGNORE is true if the value returned
11469    by the builtin will be ignored.  UNLOCKED is true is true if this
11470    actually a call to fputs_unlocked.  If LEN in non-NULL, it represents
11471    the known length of the string.  Return NULL_TREE if no simplification
11472    was possible.  */
11473
11474 tree
11475 fold_builtin_fputs (location_t loc, tree arg0, tree arg1,
11476                     bool ignore, bool unlocked, tree len)
11477 {
11478   /* If we're using an unlocked function, assume the other unlocked
11479      functions exist explicitly.  */
11480   tree const fn_fputc = unlocked ? built_in_decls[BUILT_IN_FPUTC_UNLOCKED]
11481     : implicit_built_in_decls[BUILT_IN_FPUTC];
11482   tree const fn_fwrite = unlocked ? built_in_decls[BUILT_IN_FWRITE_UNLOCKED]
11483     : implicit_built_in_decls[BUILT_IN_FWRITE];
11484
11485   /* If the return value is used, don't do the transformation.  */
11486   if (!ignore)
11487     return NULL_TREE;
11488
11489   /* Verify the arguments in the original call.  */
11490   if (!validate_arg (arg0, POINTER_TYPE)
11491       || !validate_arg (arg1, POINTER_TYPE))
11492     return NULL_TREE;
11493
11494   if (! len)
11495     len = c_strlen (arg0, 0);
11496
11497   /* Get the length of the string passed to fputs.  If the length
11498      can't be determined, punt.  */
11499   if (!len
11500       || TREE_CODE (len) != INTEGER_CST)
11501     return NULL_TREE;
11502
11503   switch (compare_tree_int (len, 1))
11504     {
11505     case -1: /* length is 0, delete the call entirely .  */
11506       return omit_one_operand_loc (loc, integer_type_node,
11507                                integer_zero_node, arg1);;
11508
11509     case 0: /* length is 1, call fputc.  */
11510       {
11511         const char *p = c_getstr (arg0);
11512
11513         if (p != NULL)
11514           {
11515             if (fn_fputc)
11516               return build_call_expr_loc (loc, fn_fputc, 2,
11517                                       build_int_cst (NULL_TREE, p[0]), arg1);
11518             else
11519               return NULL_TREE;
11520           }
11521       }
11522       /* FALLTHROUGH */
11523     case 1: /* length is greater than 1, call fwrite.  */
11524       {
11525         /* If optimizing for size keep fputs.  */
11526         if (optimize_function_for_size_p (cfun))
11527           return NULL_TREE;
11528         /* New argument list transforming fputs(string, stream) to
11529            fwrite(string, 1, len, stream).  */
11530         if (fn_fwrite)
11531           return build_call_expr_loc (loc, fn_fwrite, 4, arg0,
11532                                   size_one_node, len, arg1);
11533         else
11534           return NULL_TREE;
11535       }
11536     default:
11537       gcc_unreachable ();
11538     }
11539   return NULL_TREE;
11540 }
11541
11542 /* Fold the next_arg or va_start call EXP. Returns true if there was an error
11543    produced.  False otherwise.  This is done so that we don't output the error
11544    or warning twice or three times.  */
11545
11546 bool
11547 fold_builtin_next_arg (tree exp, bool va_start_p)
11548 {
11549   tree fntype = TREE_TYPE (current_function_decl);
11550   int nargs = call_expr_nargs (exp);
11551   tree arg;
11552
11553   if (TYPE_ARG_TYPES (fntype) == 0
11554       || (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
11555           == void_type_node))
11556     {
11557       error ("%<va_start%> used in function with fixed args");
11558       return true;
11559     }
11560
11561   if (va_start_p)
11562     {
11563       if (va_start_p && (nargs != 2))
11564         {
11565           error ("wrong number of arguments to function %<va_start%>");
11566           return true;
11567         }
11568       arg = CALL_EXPR_ARG (exp, 1);
11569     }
11570   /* We use __builtin_va_start (ap, 0, 0) or __builtin_next_arg (0, 0)
11571      when we checked the arguments and if needed issued a warning.  */
11572   else
11573     {
11574       if (nargs == 0)
11575         {
11576           /* Evidently an out of date version of <stdarg.h>; can't validate
11577              va_start's second argument, but can still work as intended.  */
11578           warning (0, "%<__builtin_next_arg%> called without an argument");
11579           return true;
11580         }
11581       else if (nargs > 1)
11582         {
11583           error ("wrong number of arguments to function %<__builtin_next_arg%>");
11584           return true;
11585         }
11586       arg = CALL_EXPR_ARG (exp, 0);
11587     }
11588
11589   if (TREE_CODE (arg) == SSA_NAME)
11590     arg = SSA_NAME_VAR (arg);
11591
11592   /* We destructively modify the call to be __builtin_va_start (ap, 0)
11593      or __builtin_next_arg (0) the first time we see it, after checking
11594      the arguments and if needed issuing a warning.  */
11595   if (!integer_zerop (arg))
11596     {
11597       tree last_parm = tree_last (DECL_ARGUMENTS (current_function_decl));
11598
11599       /* Strip off all nops for the sake of the comparison.  This
11600          is not quite the same as STRIP_NOPS.  It does more.
11601          We must also strip off INDIRECT_EXPR for C++ reference
11602          parameters.  */
11603       while (CONVERT_EXPR_P (arg)
11604              || TREE_CODE (arg) == INDIRECT_REF)
11605         arg = TREE_OPERAND (arg, 0);
11606       if (arg != last_parm)
11607         {
11608           /* FIXME: Sometimes with the tree optimizers we can get the
11609              not the last argument even though the user used the last
11610              argument.  We just warn and set the arg to be the last
11611              argument so that we will get wrong-code because of
11612              it.  */
11613           warning (0, "second parameter of %<va_start%> not last named argument");
11614         }
11615
11616       /* Undefined by C99 7.15.1.4p4 (va_start):
11617          "If the parameter parmN is declared with the register storage
11618          class, with a function or array type, or with a type that is
11619          not compatible with the type that results after application of
11620          the default argument promotions, the behavior is undefined."
11621       */
11622       else if (DECL_REGISTER (arg))
11623         warning (0, "undefined behaviour when second parameter of "
11624                  "%<va_start%> is declared with %<register%> storage");
11625
11626       /* We want to verify the second parameter just once before the tree
11627          optimizers are run and then avoid keeping it in the tree,
11628          as otherwise we could warn even for correct code like:
11629          void foo (int i, ...)
11630          { va_list ap; i++; va_start (ap, i); va_end (ap); }  */
11631       if (va_start_p)
11632         CALL_EXPR_ARG (exp, 1) = integer_zero_node;
11633       else
11634         CALL_EXPR_ARG (exp, 0) = integer_zero_node;
11635     }
11636   return false;
11637 }
11638
11639
11640 /* Simplify a call to the sprintf builtin with arguments DEST, FMT, and ORIG.
11641    ORIG may be null if this is a 2-argument call.  We don't attempt to
11642    simplify calls with more than 3 arguments.
11643
11644    Return NULL_TREE if no simplification was possible, otherwise return the
11645    simplified form of the call as a tree.  If IGNORED is true, it means that
11646    the caller does not use the returned value of the function.  */
11647
11648 static tree
11649 fold_builtin_sprintf (location_t loc, tree dest, tree fmt,
11650                       tree orig, int ignored)
11651 {
11652   tree call, retval;
11653   const char *fmt_str = NULL;
11654
11655   /* Verify the required arguments in the original call.  We deal with two
11656      types of sprintf() calls: 'sprintf (str, fmt)' and
11657      'sprintf (dest, "%s", orig)'.  */
11658   if (!validate_arg (dest, POINTER_TYPE)
11659       || !validate_arg (fmt, POINTER_TYPE))
11660     return NULL_TREE;
11661   if (orig && !validate_arg (orig, POINTER_TYPE))
11662     return NULL_TREE;
11663
11664   /* Check whether the format is a literal string constant.  */
11665   fmt_str = c_getstr (fmt);
11666   if (fmt_str == NULL)
11667     return NULL_TREE;
11668
11669   call = NULL_TREE;
11670   retval = NULL_TREE;
11671
11672   if (!init_target_chars ())
11673     return NULL_TREE;
11674
11675   /* If the format doesn't contain % args or %%, use strcpy.  */
11676   if (strchr (fmt_str, target_percent) == NULL)
11677     {
11678       tree fn = implicit_built_in_decls[BUILT_IN_STRCPY];
11679
11680       if (!fn)
11681         return NULL_TREE;
11682
11683       /* Don't optimize sprintf (buf, "abc", ptr++).  */
11684       if (orig)
11685         return NULL_TREE;
11686
11687       /* Convert sprintf (str, fmt) into strcpy (str, fmt) when
11688          'format' is known to contain no % formats.  */
11689       call = build_call_expr_loc (loc, fn, 2, dest, fmt);
11690       if (!ignored)
11691         retval = build_int_cst (NULL_TREE, strlen (fmt_str));
11692     }
11693
11694   /* If the format is "%s", use strcpy if the result isn't used.  */
11695   else if (fmt_str && strcmp (fmt_str, target_percent_s) == 0)
11696     {
11697       tree fn;
11698       fn = implicit_built_in_decls[BUILT_IN_STRCPY];
11699
11700       if (!fn)
11701         return NULL_TREE;
11702
11703       /* Don't crash on sprintf (str1, "%s").  */
11704       if (!orig)
11705         return NULL_TREE;
11706
11707       /* Convert sprintf (str1, "%s", str2) into strcpy (str1, str2).  */
11708       if (!ignored)
11709         {
11710           retval = c_strlen (orig, 1);
11711           if (!retval || TREE_CODE (retval) != INTEGER_CST)
11712             return NULL_TREE;
11713         }
11714       call = build_call_expr_loc (loc, fn, 2, dest, orig);
11715     }
11716
11717   if (call && retval)
11718     {
11719       retval = fold_convert_loc
11720         (loc, TREE_TYPE (TREE_TYPE (implicit_built_in_decls[BUILT_IN_SPRINTF])),
11721          retval);
11722       return build2 (COMPOUND_EXPR, TREE_TYPE (retval), call, retval);
11723     }
11724   else
11725     return call;
11726 }
11727
11728 /* Expand a call EXP to __builtin_object_size.  */
11729
11730 rtx
11731 expand_builtin_object_size (tree exp)
11732 {
11733   tree ost;
11734   int object_size_type;
11735   tree fndecl = get_callee_fndecl (exp);
11736
11737   if (!validate_arglist (exp, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
11738     {
11739       error ("%Kfirst argument of %D must be a pointer, second integer constant",
11740              exp, fndecl);
11741       expand_builtin_trap ();
11742       return const0_rtx;
11743     }
11744
11745   ost = CALL_EXPR_ARG (exp, 1);
11746   STRIP_NOPS (ost);
11747
11748   if (TREE_CODE (ost) != INTEGER_CST
11749       || tree_int_cst_sgn (ost) < 0
11750       || compare_tree_int (ost, 3) > 0)
11751     {
11752       error ("%Klast argument of %D is not integer constant between 0 and 3",
11753              exp, fndecl);
11754       expand_builtin_trap ();
11755       return const0_rtx;
11756     }
11757
11758   object_size_type = tree_low_cst (ost, 0);
11759
11760   return object_size_type < 2 ? constm1_rtx : const0_rtx;
11761 }
11762
11763 /* Expand EXP, a call to the __mem{cpy,pcpy,move,set}_chk builtin.
11764    FCODE is the BUILT_IN_* to use.
11765    Return NULL_RTX if we failed; the caller should emit a normal call,
11766    otherwise try to get the result in TARGET, if convenient (and in
11767    mode MODE if that's convenient).  */
11768
11769 static rtx
11770 expand_builtin_memory_chk (tree exp, rtx target, enum machine_mode mode,
11771                            enum built_in_function fcode)
11772 {
11773   tree dest, src, len, size;
11774
11775   if (!validate_arglist (exp,
11776                          POINTER_TYPE,
11777                          fcode == BUILT_IN_MEMSET_CHK
11778                          ? INTEGER_TYPE : POINTER_TYPE,
11779                          INTEGER_TYPE, INTEGER_TYPE, VOID_TYPE))
11780     return NULL_RTX;
11781
11782   dest = CALL_EXPR_ARG (exp, 0);
11783   src = CALL_EXPR_ARG (exp, 1);
11784   len = CALL_EXPR_ARG (exp, 2);
11785   size = CALL_EXPR_ARG (exp, 3);
11786
11787   if (! host_integerp (size, 1))
11788     return NULL_RTX;
11789
11790   if (host_integerp (len, 1) || integer_all_onesp (size))
11791     {
11792       tree fn;
11793
11794       if (! integer_all_onesp (size) && tree_int_cst_lt (size, len))
11795         {
11796           warning_at (tree_nonartificial_location (exp),
11797                       0, "%Kcall to %D will always overflow destination buffer",
11798                       exp, get_callee_fndecl (exp));
11799           return NULL_RTX;
11800         }
11801
11802       fn = NULL_TREE;
11803       /* If __builtin_mem{cpy,pcpy,move,set}_chk is used, assume
11804          mem{cpy,pcpy,move,set} is available.  */
11805       switch (fcode)
11806         {
11807         case BUILT_IN_MEMCPY_CHK:
11808           fn = built_in_decls[BUILT_IN_MEMCPY];
11809           break;
11810         case BUILT_IN_MEMPCPY_CHK:
11811           fn = built_in_decls[BUILT_IN_MEMPCPY];
11812           break;
11813         case BUILT_IN_MEMMOVE_CHK:
11814           fn = built_in_decls[BUILT_IN_MEMMOVE];
11815           break;
11816         case BUILT_IN_MEMSET_CHK:
11817           fn = built_in_decls[BUILT_IN_MEMSET];
11818           break;
11819         default:
11820           break;
11821         }
11822
11823       if (! fn)
11824         return NULL_RTX;
11825
11826       fn = build_call_nofold_loc (EXPR_LOCATION (exp), fn, 3, dest, src, len);
11827       gcc_assert (TREE_CODE (fn) == CALL_EXPR);
11828       CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (exp);
11829       return expand_expr (fn, target, mode, EXPAND_NORMAL);
11830     }
11831   else if (fcode == BUILT_IN_MEMSET_CHK)
11832     return NULL_RTX;
11833   else
11834     {
11835       unsigned int dest_align
11836         = get_pointer_alignment (dest, BIGGEST_ALIGNMENT);
11837
11838       /* If DEST is not a pointer type, call the normal function.  */
11839       if (dest_align == 0)
11840         return NULL_RTX;
11841
11842       /* If SRC and DEST are the same (and not volatile), do nothing.  */
11843       if (operand_equal_p (src, dest, 0))
11844         {
11845           tree expr;
11846
11847           if (fcode != BUILT_IN_MEMPCPY_CHK)
11848             {
11849               /* Evaluate and ignore LEN in case it has side-effects.  */
11850               expand_expr (len, const0_rtx, VOIDmode, EXPAND_NORMAL);
11851               return expand_expr (dest, target, mode, EXPAND_NORMAL);
11852             }
11853
11854           expr = fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (dest), dest, len);
11855           return expand_expr (expr, target, mode, EXPAND_NORMAL);
11856         }
11857
11858       /* __memmove_chk special case.  */
11859       if (fcode == BUILT_IN_MEMMOVE_CHK)
11860         {
11861           unsigned int src_align
11862             = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
11863
11864           if (src_align == 0)
11865             return NULL_RTX;
11866
11867           /* If src is categorized for a readonly section we can use
11868              normal __memcpy_chk.  */
11869           if (readonly_data_expr (src))
11870             {
11871               tree fn = built_in_decls[BUILT_IN_MEMCPY_CHK];
11872               if (!fn)
11873                 return NULL_RTX;
11874               fn = build_call_nofold_loc (EXPR_LOCATION (exp), fn, 4,
11875                                           dest, src, len, size);
11876               gcc_assert (TREE_CODE (fn) == CALL_EXPR);
11877               CALL_EXPR_TAILCALL (fn) = CALL_EXPR_TAILCALL (exp);
11878               return expand_expr (fn, target, mode, EXPAND_NORMAL);
11879             }
11880         }
11881       return NULL_RTX;
11882     }
11883 }
11884
11885 /* Emit warning if a buffer overflow is detected at compile time.  */
11886
11887 static void
11888 maybe_emit_chk_warning (tree exp, enum built_in_function fcode)
11889 {
11890   int is_strlen = 0;
11891   tree len, size;
11892   location_t loc = tree_nonartificial_location (exp);
11893
11894   switch (fcode)
11895     {
11896     case BUILT_IN_STRCPY_CHK:
11897     case BUILT_IN_STPCPY_CHK:
11898     /* For __strcat_chk the warning will be emitted only if overflowing
11899        by at least strlen (dest) + 1 bytes.  */
11900     case BUILT_IN_STRCAT_CHK:
11901       len = CALL_EXPR_ARG (exp, 1);
11902       size = CALL_EXPR_ARG (exp, 2);
11903       is_strlen = 1;
11904       break;
11905     case BUILT_IN_STRNCAT_CHK:
11906     case BUILT_IN_STRNCPY_CHK:
11907       len = CALL_EXPR_ARG (exp, 2);
11908       size = CALL_EXPR_ARG (exp, 3);
11909       break;
11910     case BUILT_IN_SNPRINTF_CHK:
11911     case BUILT_IN_VSNPRINTF_CHK:
11912       len = CALL_EXPR_ARG (exp, 1);
11913       size = CALL_EXPR_ARG (exp, 3);
11914       break;
11915     default:
11916       gcc_unreachable ();
11917     }
11918
11919   if (!len || !size)
11920     return;
11921
11922   if (! host_integerp (size, 1) || integer_all_onesp (size))
11923     return;
11924
11925   if (is_strlen)
11926     {
11927       len = c_strlen (len, 1);
11928       if (! len || ! host_integerp (len, 1) || tree_int_cst_lt (len, size))
11929         return;
11930     }
11931   else if (fcode == BUILT_IN_STRNCAT_CHK)
11932     {
11933       tree src = CALL_EXPR_ARG (exp, 1);
11934       if (! src || ! host_integerp (len, 1) || tree_int_cst_lt (len, size))
11935         return;
11936       src = c_strlen (src, 1);
11937       if (! src || ! host_integerp (src, 1))
11938         {
11939           warning_at (loc, 0, "%Kcall to %D might overflow destination buffer",
11940                       exp, get_callee_fndecl (exp));
11941           return;
11942         }
11943       else if (tree_int_cst_lt (src, size))
11944         return;
11945     }
11946   else if (! host_integerp (len, 1) || ! tree_int_cst_lt (size, len))
11947     return;
11948
11949   warning_at (loc, 0, "%Kcall to %D will always overflow destination buffer",
11950               exp, get_callee_fndecl (exp));
11951 }
11952
11953 /* Emit warning if a buffer overflow is detected at compile time
11954    in __sprintf_chk/__vsprintf_chk calls.  */
11955
11956 static void
11957 maybe_emit_sprintf_chk_warning (tree exp, enum built_in_function fcode)
11958 {
11959   tree size, len, fmt;
11960   const char *fmt_str;
11961   int nargs = call_expr_nargs (exp);
11962
11963   /* Verify the required arguments in the original call.  */
11964
11965   if (nargs < 4)
11966     return;
11967   size = CALL_EXPR_ARG (exp, 2);
11968   fmt = CALL_EXPR_ARG (exp, 3);
11969
11970   if (! host_integerp (size, 1) || integer_all_onesp (size))
11971     return;
11972
11973   /* Check whether the format is a literal string constant.  */
11974   fmt_str = c_getstr (fmt);
11975   if (fmt_str == NULL)
11976     return;
11977
11978   if (!init_target_chars ())
11979     return;
11980
11981   /* If the format doesn't contain % args or %%, we know its size.  */
11982   if (strchr (fmt_str, target_percent) == 0)
11983     len = build_int_cstu (size_type_node, strlen (fmt_str));
11984   /* If the format is "%s" and first ... argument is a string literal,
11985      we know it too.  */
11986   else if (fcode == BUILT_IN_SPRINTF_CHK
11987            && strcmp (fmt_str, target_percent_s) == 0)
11988     {
11989       tree arg;
11990
11991       if (nargs < 5)
11992         return;
11993       arg = CALL_EXPR_ARG (exp, 4);
11994       if (! POINTER_TYPE_P (TREE_TYPE (arg)))
11995         return;
11996
11997       len = c_strlen (arg, 1);
11998       if (!len || ! host_integerp (len, 1))
11999         return;
12000     }
12001   else
12002     return;
12003
12004   if (! tree_int_cst_lt (len, size))
12005     warning_at (tree_nonartificial_location (exp),
12006                 0, "%Kcall to %D will always overflow destination buffer",
12007                 exp, get_callee_fndecl (exp));
12008 }
12009
12010 /* Emit warning if a free is called with address of a variable.  */
12011
12012 static void
12013 maybe_emit_free_warning (tree exp)
12014 {
12015   tree arg = CALL_EXPR_ARG (exp, 0);
12016
12017   STRIP_NOPS (arg);
12018   if (TREE_CODE (arg) != ADDR_EXPR)
12019     return;
12020
12021   arg = get_base_address (TREE_OPERAND (arg, 0));
12022   if (arg == NULL || INDIRECT_REF_P (arg) || TREE_CODE (arg) == MEM_REF)
12023     return;
12024
12025   if (SSA_VAR_P (arg))
12026     warning_at (tree_nonartificial_location (exp),
12027                 0, "%Kattempt to free a non-heap object %qD", exp, arg);
12028   else
12029     warning_at (tree_nonartificial_location (exp),
12030                 0, "%Kattempt to free a non-heap object", exp);
12031 }
12032
12033 /* Fold a call to __builtin_object_size with arguments PTR and OST,
12034    if possible.  */
12035
12036 tree
12037 fold_builtin_object_size (tree ptr, tree ost)
12038 {
12039   tree ret = NULL_TREE;
12040   int object_size_type;
12041
12042   if (!validate_arg (ptr, POINTER_TYPE)
12043       || !validate_arg (ost, INTEGER_TYPE))
12044     return NULL_TREE;
12045
12046   STRIP_NOPS (ost);
12047
12048   if (TREE_CODE (ost) != INTEGER_CST
12049       || tree_int_cst_sgn (ost) < 0
12050       || compare_tree_int (ost, 3) > 0)
12051     return NULL_TREE;
12052
12053   object_size_type = tree_low_cst (ost, 0);
12054
12055   /* __builtin_object_size doesn't evaluate side-effects in its arguments;
12056      if there are any side-effects, it returns (size_t) -1 for types 0 and 1
12057      and (size_t) 0 for types 2 and 3.  */
12058   if (TREE_SIDE_EFFECTS (ptr))
12059     return build_int_cst_type (size_type_node, object_size_type < 2 ? -1 : 0);
12060
12061   if (TREE_CODE (ptr) == ADDR_EXPR)
12062     ret = build_int_cstu (size_type_node,
12063                           compute_builtin_object_size (ptr, object_size_type));
12064
12065   else if (TREE_CODE (ptr) == SSA_NAME)
12066     {
12067       unsigned HOST_WIDE_INT bytes;
12068
12069       /* If object size is not known yet, delay folding until
12070        later.  Maybe subsequent passes will help determining
12071        it.  */
12072       bytes = compute_builtin_object_size (ptr, object_size_type);
12073       if (bytes != (unsigned HOST_WIDE_INT) (object_size_type < 2
12074                                              ? -1 : 0))
12075         ret = build_int_cstu (size_type_node, bytes);
12076     }
12077
12078   if (ret)
12079     {
12080       unsigned HOST_WIDE_INT low = TREE_INT_CST_LOW (ret);
12081       HOST_WIDE_INT high = TREE_INT_CST_HIGH (ret);
12082       if (fit_double_type (low, high, &low, &high, TREE_TYPE (ret)))
12083         ret = NULL_TREE;
12084     }
12085
12086   return ret;
12087 }
12088
12089 /* Fold a call to the __mem{cpy,pcpy,move,set}_chk builtin.
12090    DEST, SRC, LEN, and SIZE are the arguments to the call.
12091    IGNORE is true, if return value can be ignored.  FCODE is the BUILT_IN_*
12092    code of the builtin.  If MAXLEN is not NULL, it is maximum length
12093    passed as third argument.  */
12094
12095 tree
12096 fold_builtin_memory_chk (location_t loc, tree fndecl,
12097                          tree dest, tree src, tree len, tree size,
12098                          tree maxlen, bool ignore,
12099                          enum built_in_function fcode)
12100 {
12101   tree fn;
12102
12103   if (!validate_arg (dest, POINTER_TYPE)
12104       || !validate_arg (src,
12105                         (fcode == BUILT_IN_MEMSET_CHK
12106                          ? INTEGER_TYPE : POINTER_TYPE))
12107       || !validate_arg (len, INTEGER_TYPE)
12108       || !validate_arg (size, INTEGER_TYPE))
12109     return NULL_TREE;
12110
12111   /* If SRC and DEST are the same (and not volatile), return DEST
12112      (resp. DEST+LEN for __mempcpy_chk).  */
12113   if (fcode != BUILT_IN_MEMSET_CHK && operand_equal_p (src, dest, 0))
12114     {
12115       if (fcode != BUILT_IN_MEMPCPY_CHK)
12116         return omit_one_operand_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)),
12117                                  dest, len);
12118       else
12119         {
12120           tree temp = fold_build2_loc (loc, POINTER_PLUS_EXPR, TREE_TYPE (dest),
12121                                    dest, len);
12122           return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), temp);
12123         }
12124     }
12125
12126   if (! host_integerp (size, 1))
12127     return NULL_TREE;
12128
12129   if (! integer_all_onesp (size))
12130     {
12131       if (! host_integerp (len, 1))
12132         {
12133           /* If LEN is not constant, try MAXLEN too.
12134              For MAXLEN only allow optimizing into non-_ocs function
12135              if SIZE is >= MAXLEN, never convert to __ocs_fail ().  */
12136           if (maxlen == NULL_TREE || ! host_integerp (maxlen, 1))
12137             {
12138               if (fcode == BUILT_IN_MEMPCPY_CHK && ignore)
12139                 {
12140                   /* (void) __mempcpy_chk () can be optimized into
12141                      (void) __memcpy_chk ().  */
12142                   fn = built_in_decls[BUILT_IN_MEMCPY_CHK];
12143                   if (!fn)
12144                     return NULL_TREE;
12145
12146                   return build_call_expr_loc (loc, fn, 4, dest, src, len, size);
12147                 }
12148               return NULL_TREE;
12149             }
12150         }
12151       else
12152         maxlen = len;
12153
12154       if (tree_int_cst_lt (size, maxlen))
12155         return NULL_TREE;
12156     }
12157
12158   fn = NULL_TREE;
12159   /* If __builtin_mem{cpy,pcpy,move,set}_chk is used, assume
12160      mem{cpy,pcpy,move,set} is available.  */
12161   switch (fcode)
12162     {
12163     case BUILT_IN_MEMCPY_CHK:
12164       fn = built_in_decls[BUILT_IN_MEMCPY];
12165       break;
12166     case BUILT_IN_MEMPCPY_CHK:
12167       fn = built_in_decls[BUILT_IN_MEMPCPY];
12168       break;
12169     case BUILT_IN_MEMMOVE_CHK:
12170       fn = built_in_decls[BUILT_IN_MEMMOVE];
12171       break;
12172     case BUILT_IN_MEMSET_CHK:
12173       fn = built_in_decls[BUILT_IN_MEMSET];
12174       break;
12175     default:
12176       break;
12177     }
12178
12179   if (!fn)
12180     return NULL_TREE;
12181
12182   return build_call_expr_loc (loc, fn, 3, dest, src, len);
12183 }
12184
12185 /* Fold a call to the __st[rp]cpy_chk builtin.
12186    DEST, SRC, and SIZE are the arguments to the call.
12187    IGNORE is true if return value can be ignored.  FCODE is the BUILT_IN_*
12188    code of the builtin.  If MAXLEN is not NULL, it is maximum length of
12189    strings passed as second argument.  */
12190
12191 tree
12192 fold_builtin_stxcpy_chk (location_t loc, tree fndecl, tree dest,
12193                          tree src, tree size,
12194                          tree maxlen, bool ignore,
12195                          enum built_in_function fcode)
12196 {
12197   tree len, fn;
12198
12199   if (!validate_arg (dest, POINTER_TYPE)
12200       || !validate_arg (src, POINTER_TYPE)
12201       || !validate_arg (size, INTEGER_TYPE))
12202     return NULL_TREE;
12203
12204   /* If SRC and DEST are the same (and not volatile), return DEST.  */
12205   if (fcode == BUILT_IN_STRCPY_CHK && operand_equal_p (src, dest, 0))
12206     return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest);
12207
12208   if (! host_integerp (size, 1))
12209     return NULL_TREE;
12210
12211   if (! integer_all_onesp (size))
12212     {
12213       len = c_strlen (src, 1);
12214       if (! len || ! host_integerp (len, 1))
12215         {
12216           /* If LEN is not constant, try MAXLEN too.
12217              For MAXLEN only allow optimizing into non-_ocs function
12218              if SIZE is >= MAXLEN, never convert to __ocs_fail ().  */
12219           if (maxlen == NULL_TREE || ! host_integerp (maxlen, 1))
12220             {
12221               if (fcode == BUILT_IN_STPCPY_CHK)
12222                 {
12223                   if (! ignore)
12224                     return NULL_TREE;
12225
12226                   /* If return value of __stpcpy_chk is ignored,
12227                      optimize into __strcpy_chk.  */
12228                   fn = built_in_decls[BUILT_IN_STRCPY_CHK];
12229                   if (!fn)
12230                     return NULL_TREE;
12231
12232                   return build_call_expr_loc (loc, fn, 3, dest, src, size);
12233                 }
12234
12235               if (! len || TREE_SIDE_EFFECTS (len))
12236                 return NULL_TREE;
12237
12238               /* If c_strlen returned something, but not a constant,
12239                  transform __strcpy_chk into __memcpy_chk.  */
12240               fn = built_in_decls[BUILT_IN_MEMCPY_CHK];
12241               if (!fn)
12242                 return NULL_TREE;
12243
12244               len = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
12245               return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)),
12246                                        build_call_expr_loc (loc, fn, 4,
12247                                                         dest, src, len, size));
12248             }
12249         }
12250       else
12251         maxlen = len;
12252
12253       if (! tree_int_cst_lt (maxlen, size))
12254         return NULL_TREE;
12255     }
12256
12257   /* If __builtin_st{r,p}cpy_chk is used, assume st{r,p}cpy is available.  */
12258   fn = built_in_decls[fcode == BUILT_IN_STPCPY_CHK
12259                       ? BUILT_IN_STPCPY : BUILT_IN_STRCPY];
12260   if (!fn)
12261     return NULL_TREE;
12262
12263   return build_call_expr_loc (loc, fn, 2, dest, src);
12264 }
12265
12266 /* Fold a call to the __strncpy_chk builtin.  DEST, SRC, LEN, and SIZE
12267    are the arguments to the call.  If MAXLEN is not NULL, it is maximum
12268    length passed as third argument.  */
12269
12270 tree
12271 fold_builtin_strncpy_chk (location_t loc, tree dest, tree src,
12272                           tree len, tree size, tree maxlen)
12273 {
12274   tree fn;
12275
12276   if (!validate_arg (dest, POINTER_TYPE)
12277       || !validate_arg (src, POINTER_TYPE)
12278       || !validate_arg (len, INTEGER_TYPE)
12279       || !validate_arg (size, INTEGER_TYPE))
12280     return NULL_TREE;
12281
12282   if (! host_integerp (size, 1))
12283     return NULL_TREE;
12284
12285   if (! integer_all_onesp (size))
12286     {
12287       if (! host_integerp (len, 1))
12288         {
12289           /* If LEN is not constant, try MAXLEN too.
12290              For MAXLEN only allow optimizing into non-_ocs function
12291              if SIZE is >= MAXLEN, never convert to __ocs_fail ().  */
12292           if (maxlen == NULL_TREE || ! host_integerp (maxlen, 1))
12293             return NULL_TREE;
12294         }
12295       else
12296         maxlen = len;
12297
12298       if (tree_int_cst_lt (size, maxlen))
12299         return NULL_TREE;
12300     }
12301
12302   /* If __builtin_strncpy_chk is used, assume strncpy is available.  */
12303   fn = built_in_decls[BUILT_IN_STRNCPY];
12304   if (!fn)
12305     return NULL_TREE;
12306
12307   return build_call_expr_loc (loc, fn, 3, dest, src, len);
12308 }
12309
12310 /* Fold a call to the __strcat_chk builtin FNDECL.  DEST, SRC, and SIZE
12311    are the arguments to the call.  */
12312
12313 static tree
12314 fold_builtin_strcat_chk (location_t loc, tree fndecl, tree dest,
12315                          tree src, tree size)
12316 {
12317   tree fn;
12318   const char *p;
12319
12320   if (!validate_arg (dest, POINTER_TYPE)
12321       || !validate_arg (src, POINTER_TYPE)
12322       || !validate_arg (size, INTEGER_TYPE))
12323     return NULL_TREE;
12324
12325   p = c_getstr (src);
12326   /* If the SRC parameter is "", return DEST.  */
12327   if (p && *p == '\0')
12328     return omit_one_operand_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest, src);
12329
12330   if (! host_integerp (size, 1) || ! integer_all_onesp (size))
12331     return NULL_TREE;
12332
12333   /* If __builtin_strcat_chk is used, assume strcat is available.  */
12334   fn = built_in_decls[BUILT_IN_STRCAT];
12335   if (!fn)
12336     return NULL_TREE;
12337
12338   return build_call_expr_loc (loc, fn, 2, dest, src);
12339 }
12340
12341 /* Fold a call to the __strncat_chk builtin with arguments DEST, SRC,
12342    LEN, and SIZE.  */
12343
12344 static tree
12345 fold_builtin_strncat_chk (location_t loc, tree fndecl,
12346                           tree dest, tree src, tree len, tree size)
12347 {
12348   tree fn;
12349   const char *p;
12350
12351   if (!validate_arg (dest, POINTER_TYPE)
12352       || !validate_arg (src, POINTER_TYPE)
12353       || !validate_arg (size, INTEGER_TYPE)
12354       || !validate_arg (size, INTEGER_TYPE))
12355     return NULL_TREE;
12356
12357   p = c_getstr (src);
12358   /* If the SRC parameter is "" or if LEN is 0, return DEST.  */
12359   if (p && *p == '\0')
12360     return omit_one_operand_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest, len);
12361   else if (integer_zerop (len))
12362     return omit_one_operand_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), dest, src);
12363
12364   if (! host_integerp (size, 1))
12365     return NULL_TREE;
12366
12367   if (! integer_all_onesp (size))
12368     {
12369       tree src_len = c_strlen (src, 1);
12370       if (src_len
12371           && host_integerp (src_len, 1)
12372           && host_integerp (len, 1)
12373           && ! tree_int_cst_lt (len, src_len))
12374         {
12375           /* If LEN >= strlen (SRC), optimize into __strcat_chk.  */
12376           fn = built_in_decls[BUILT_IN_STRCAT_CHK];
12377           if (!fn)
12378             return NULL_TREE;
12379
12380           return build_call_expr_loc (loc, fn, 3, dest, src, size);
12381         }
12382       return NULL_TREE;
12383     }
12384
12385   /* If __builtin_strncat_chk is used, assume strncat is available.  */
12386   fn = built_in_decls[BUILT_IN_STRNCAT];
12387   if (!fn)
12388     return NULL_TREE;
12389
12390   return build_call_expr_loc (loc, fn, 3, dest, src, len);
12391 }
12392
12393 /* Fold a call EXP to __{,v}sprintf_chk.  Return NULL_TREE if
12394    a normal call should be emitted rather than expanding the function
12395    inline.  FCODE is either BUILT_IN_SPRINTF_CHK or BUILT_IN_VSPRINTF_CHK.  */
12396
12397 static tree
12398 fold_builtin_sprintf_chk (location_t loc, tree exp,
12399                           enum built_in_function fcode)
12400 {
12401   tree dest, size, len, fn, fmt, flag;
12402   const char *fmt_str;
12403   int nargs = call_expr_nargs (exp);
12404
12405   /* Verify the required arguments in the original call.  */
12406   if (nargs < 4)
12407     return NULL_TREE;
12408   dest = CALL_EXPR_ARG (exp, 0);
12409   if (!validate_arg (dest, POINTER_TYPE))
12410     return NULL_TREE;
12411   flag = CALL_EXPR_ARG (exp, 1);
12412   if (!validate_arg (flag, INTEGER_TYPE))
12413     return NULL_TREE;
12414   size = CALL_EXPR_ARG (exp, 2);
12415   if (!validate_arg (size, INTEGER_TYPE))
12416     return NULL_TREE;
12417   fmt = CALL_EXPR_ARG (exp, 3);
12418   if (!validate_arg (fmt, POINTER_TYPE))
12419     return NULL_TREE;
12420
12421   if (! host_integerp (size, 1))
12422     return NULL_TREE;
12423
12424   len = NULL_TREE;
12425
12426   if (!init_target_chars ())
12427     return NULL_TREE;
12428
12429   /* Check whether the format is a literal string constant.  */
12430   fmt_str = c_getstr (fmt);
12431   if (fmt_str != NULL)
12432     {
12433       /* If the format doesn't contain % args or %%, we know the size.  */
12434       if (strchr (fmt_str, target_percent) == 0)
12435         {
12436           if (fcode != BUILT_IN_SPRINTF_CHK || nargs == 4)
12437             len = build_int_cstu (size_type_node, strlen (fmt_str));
12438         }
12439       /* If the format is "%s" and first ... argument is a string literal,
12440          we know the size too.  */
12441       else if (fcode == BUILT_IN_SPRINTF_CHK
12442                && strcmp (fmt_str, target_percent_s) == 0)
12443         {
12444           tree arg;
12445
12446           if (nargs == 5)
12447             {
12448               arg = CALL_EXPR_ARG (exp, 4);
12449               if (validate_arg (arg, POINTER_TYPE))
12450                 {
12451                   len = c_strlen (arg, 1);
12452                   if (! len || ! host_integerp (len, 1))
12453                     len = NULL_TREE;
12454                 }
12455             }
12456         }
12457     }
12458
12459   if (! integer_all_onesp (size))
12460     {
12461       if (! len || ! tree_int_cst_lt (len, size))
12462         return NULL_TREE;
12463     }
12464
12465   /* Only convert __{,v}sprintf_chk to {,v}sprintf if flag is 0
12466      or if format doesn't contain % chars or is "%s".  */
12467   if (! integer_zerop (flag))
12468     {
12469       if (fmt_str == NULL)
12470         return NULL_TREE;
12471       if (strchr (fmt_str, target_percent) != NULL
12472           && strcmp (fmt_str, target_percent_s))
12473         return NULL_TREE;
12474     }
12475
12476   /* If __builtin_{,v}sprintf_chk is used, assume {,v}sprintf is available.  */
12477   fn = built_in_decls[fcode == BUILT_IN_VSPRINTF_CHK
12478                       ? BUILT_IN_VSPRINTF : BUILT_IN_SPRINTF];
12479   if (!fn)
12480     return NULL_TREE;
12481
12482   return rewrite_call_expr (loc, exp, 4, fn, 2, dest, fmt);
12483 }
12484
12485 /* Fold a call EXP to {,v}snprintf.  Return NULL_TREE if
12486    a normal call should be emitted rather than expanding the function
12487    inline.  FCODE is either BUILT_IN_SNPRINTF_CHK or
12488    BUILT_IN_VSNPRINTF_CHK.  If MAXLEN is not NULL, it is maximum length
12489    passed as second argument.  */
12490
12491 tree
12492 fold_builtin_snprintf_chk (location_t loc, tree exp, tree maxlen,
12493                            enum built_in_function fcode)
12494 {
12495   tree dest, size, len, fn, fmt, flag;
12496   const char *fmt_str;
12497
12498   /* Verify the required arguments in the original call.  */
12499   if (call_expr_nargs (exp) < 5)
12500     return NULL_TREE;
12501   dest = CALL_EXPR_ARG (exp, 0);
12502   if (!validate_arg (dest, POINTER_TYPE))
12503     return NULL_TREE;
12504   len = CALL_EXPR_ARG (exp, 1);
12505   if (!validate_arg (len, INTEGER_TYPE))
12506     return NULL_TREE;
12507   flag = CALL_EXPR_ARG (exp, 2);
12508   if (!validate_arg (flag, INTEGER_TYPE))
12509     return NULL_TREE;
12510   size = CALL_EXPR_ARG (exp, 3);
12511   if (!validate_arg (size, INTEGER_TYPE))
12512     return NULL_TREE;
12513   fmt = CALL_EXPR_ARG (exp, 4);
12514   if (!validate_arg (fmt, POINTER_TYPE))
12515     return NULL_TREE;
12516
12517   if (! host_integerp (size, 1))
12518     return NULL_TREE;
12519
12520   if (! integer_all_onesp (size))
12521     {
12522       if (! host_integerp (len, 1))
12523         {
12524           /* If LEN is not constant, try MAXLEN too.
12525              For MAXLEN only allow optimizing into non-_ocs function
12526              if SIZE is >= MAXLEN, never convert to __ocs_fail ().  */
12527           if (maxlen == NULL_TREE || ! host_integerp (maxlen, 1))
12528             return NULL_TREE;
12529         }
12530       else
12531         maxlen = len;
12532
12533       if (tree_int_cst_lt (size, maxlen))
12534         return NULL_TREE;
12535     }
12536
12537   if (!init_target_chars ())
12538     return NULL_TREE;
12539
12540   /* Only convert __{,v}snprintf_chk to {,v}snprintf if flag is 0
12541      or if format doesn't contain % chars or is "%s".  */
12542   if (! integer_zerop (flag))
12543     {
12544       fmt_str = c_getstr (fmt);
12545       if (fmt_str == NULL)
12546         return NULL_TREE;
12547       if (strchr (fmt_str, target_percent) != NULL
12548           && strcmp (fmt_str, target_percent_s))
12549         return NULL_TREE;
12550     }
12551
12552   /* If __builtin_{,v}snprintf_chk is used, assume {,v}snprintf is
12553      available.  */
12554   fn = built_in_decls[fcode == BUILT_IN_VSNPRINTF_CHK
12555                       ? BUILT_IN_VSNPRINTF : BUILT_IN_SNPRINTF];
12556   if (!fn)
12557     return NULL_TREE;
12558
12559   return rewrite_call_expr (loc, exp, 5, fn, 3, dest, len, fmt);
12560 }
12561
12562 /* Fold a call to the {,v}printf{,_unlocked} and __{,v}printf_chk builtins.
12563    FMT and ARG are the arguments to the call; we don't fold cases with
12564    more than 2 arguments, and ARG may be null if this is a 1-argument case.
12565
12566    Return NULL_TREE if no simplification was possible, otherwise return the
12567    simplified form of the call as a tree.  FCODE is the BUILT_IN_*
12568    code of the function to be simplified.  */
12569
12570 static tree
12571 fold_builtin_printf (location_t loc, tree fndecl, tree fmt,
12572                      tree arg, bool ignore,
12573                      enum built_in_function fcode)
12574 {
12575   tree fn_putchar, fn_puts, newarg, call = NULL_TREE;
12576   const char *fmt_str = NULL;
12577
12578   /* If the return value is used, don't do the transformation.  */
12579   if (! ignore)
12580     return NULL_TREE;
12581
12582   /* Verify the required arguments in the original call.  */
12583   if (!validate_arg (fmt, POINTER_TYPE))
12584     return NULL_TREE;
12585
12586   /* Check whether the format is a literal string constant.  */
12587   fmt_str = c_getstr (fmt);
12588   if (fmt_str == NULL)
12589     return NULL_TREE;
12590
12591   if (fcode == BUILT_IN_PRINTF_UNLOCKED)
12592     {
12593       /* If we're using an unlocked function, assume the other
12594          unlocked functions exist explicitly.  */
12595       fn_putchar = built_in_decls[BUILT_IN_PUTCHAR_UNLOCKED];
12596       fn_puts = built_in_decls[BUILT_IN_PUTS_UNLOCKED];
12597     }
12598   else
12599     {
12600       fn_putchar = implicit_built_in_decls[BUILT_IN_PUTCHAR];
12601       fn_puts = implicit_built_in_decls[BUILT_IN_PUTS];
12602     }
12603
12604   if (!init_target_chars ())
12605     return NULL_TREE;
12606
12607   if (strcmp (fmt_str, target_percent_s) == 0
12608       || strchr (fmt_str, target_percent) == NULL)
12609     {
12610       const char *str;
12611
12612       if (strcmp (fmt_str, target_percent_s) == 0)
12613         {
12614           if (fcode == BUILT_IN_VPRINTF || fcode == BUILT_IN_VPRINTF_CHK)
12615             return NULL_TREE;
12616
12617           if (!arg || !validate_arg (arg, POINTER_TYPE))
12618             return NULL_TREE;
12619
12620           str = c_getstr (arg);
12621           if (str == NULL)
12622             return NULL_TREE;
12623         }
12624       else
12625         {
12626           /* The format specifier doesn't contain any '%' characters.  */
12627           if (fcode != BUILT_IN_VPRINTF && fcode != BUILT_IN_VPRINTF_CHK
12628               && arg)
12629             return NULL_TREE;
12630           str = fmt_str;
12631         }
12632
12633       /* If the string was "", printf does nothing.  */
12634       if (str[0] == '\0')
12635         return build_int_cst (TREE_TYPE (TREE_TYPE (fndecl)), 0);
12636
12637       /* If the string has length of 1, call putchar.  */
12638       if (str[1] == '\0')
12639         {
12640           /* Given printf("c"), (where c is any one character,)
12641              convert "c"[0] to an int and pass that to the replacement
12642              function.  */
12643           newarg = build_int_cst (NULL_TREE, str[0]);
12644           if (fn_putchar)
12645             call = build_call_expr_loc (loc, fn_putchar, 1, newarg);
12646         }
12647       else
12648         {
12649           /* If the string was "string\n", call puts("string").  */
12650           size_t len = strlen (str);
12651           if ((unsigned char)str[len - 1] == target_newline)
12652             {
12653               /* Create a NUL-terminated string that's one char shorter
12654                  than the original, stripping off the trailing '\n'.  */
12655               char *newstr = XALLOCAVEC (char, len);
12656               memcpy (newstr, str, len - 1);
12657               newstr[len - 1] = 0;
12658
12659               newarg = build_string_literal (len, newstr);
12660               if (fn_puts)
12661                 call = build_call_expr_loc (loc, fn_puts, 1, newarg);
12662             }
12663           else
12664             /* We'd like to arrange to call fputs(string,stdout) here,
12665                but we need stdout and don't have a way to get it yet.  */
12666             return NULL_TREE;
12667         }
12668     }
12669
12670   /* The other optimizations can be done only on the non-va_list variants.  */
12671   else if (fcode == BUILT_IN_VPRINTF || fcode == BUILT_IN_VPRINTF_CHK)
12672     return NULL_TREE;
12673
12674   /* If the format specifier was "%s\n", call __builtin_puts(arg).  */
12675   else if (strcmp (fmt_str, target_percent_s_newline) == 0)
12676     {
12677       if (!arg || !validate_arg (arg, POINTER_TYPE))
12678         return NULL_TREE;
12679       if (fn_puts)
12680         call = build_call_expr_loc (loc, fn_puts, 1, arg);
12681     }
12682
12683   /* If the format specifier was "%c", call __builtin_putchar(arg).  */
12684   else if (strcmp (fmt_str, target_percent_c) == 0)
12685     {
12686       if (!arg || !validate_arg (arg, INTEGER_TYPE))
12687         return NULL_TREE;
12688       if (fn_putchar)
12689         call = build_call_expr_loc (loc, fn_putchar, 1, arg);
12690     }
12691
12692   if (!call)
12693     return NULL_TREE;
12694
12695   return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), call);
12696 }
12697
12698 /* Fold a call to the {,v}fprintf{,_unlocked} and __{,v}printf_chk builtins.
12699    FP, FMT, and ARG are the arguments to the call.  We don't fold calls with
12700    more than 3 arguments, and ARG may be null in the 2-argument case.
12701
12702    Return NULL_TREE if no simplification was possible, otherwise return the
12703    simplified form of the call as a tree.  FCODE is the BUILT_IN_*
12704    code of the function to be simplified.  */
12705
12706 static tree
12707 fold_builtin_fprintf (location_t loc, tree fndecl, tree fp,
12708                       tree fmt, tree arg, bool ignore,
12709                       enum built_in_function fcode)
12710 {
12711   tree fn_fputc, fn_fputs, call = NULL_TREE;
12712   const char *fmt_str = NULL;
12713
12714   /* If the return value is used, don't do the transformation.  */
12715   if (! ignore)
12716     return NULL_TREE;
12717
12718   /* Verify the required arguments in the original call.  */
12719   if (!validate_arg (fp, POINTER_TYPE))
12720     return NULL_TREE;
12721   if (!validate_arg (fmt, POINTER_TYPE))
12722     return NULL_TREE;
12723
12724   /* Check whether the format is a literal string constant.  */
12725   fmt_str = c_getstr (fmt);
12726   if (fmt_str == NULL)
12727     return NULL_TREE;
12728
12729   if (fcode == BUILT_IN_FPRINTF_UNLOCKED)
12730     {
12731       /* If we're using an unlocked function, assume the other
12732          unlocked functions exist explicitly.  */
12733       fn_fputc = built_in_decls[BUILT_IN_FPUTC_UNLOCKED];
12734       fn_fputs = built_in_decls[BUILT_IN_FPUTS_UNLOCKED];
12735     }
12736   else
12737     {
12738       fn_fputc = implicit_built_in_decls[BUILT_IN_FPUTC];
12739       fn_fputs = implicit_built_in_decls[BUILT_IN_FPUTS];
12740     }
12741
12742   if (!init_target_chars ())
12743     return NULL_TREE;
12744
12745   /* If the format doesn't contain % args or %%, use strcpy.  */
12746   if (strchr (fmt_str, target_percent) == NULL)
12747     {
12748       if (fcode != BUILT_IN_VFPRINTF && fcode != BUILT_IN_VFPRINTF_CHK
12749           && arg)
12750         return NULL_TREE;
12751
12752       /* If the format specifier was "", fprintf does nothing.  */
12753       if (fmt_str[0] == '\0')
12754         {
12755           /* If FP has side-effects, just wait until gimplification is
12756              done.  */
12757           if (TREE_SIDE_EFFECTS (fp))
12758             return NULL_TREE;
12759
12760           return build_int_cst (TREE_TYPE (TREE_TYPE (fndecl)), 0);
12761         }
12762
12763       /* When "string" doesn't contain %, replace all cases of
12764          fprintf (fp, string) with fputs (string, fp).  The fputs
12765          builtin will take care of special cases like length == 1.  */
12766       if (fn_fputs)
12767         call = build_call_expr_loc (loc, fn_fputs, 2, fmt, fp);
12768     }
12769
12770   /* The other optimizations can be done only on the non-va_list variants.  */
12771   else if (fcode == BUILT_IN_VFPRINTF || fcode == BUILT_IN_VFPRINTF_CHK)
12772     return NULL_TREE;
12773
12774   /* If the format specifier was "%s", call __builtin_fputs (arg, fp).  */
12775   else if (strcmp (fmt_str, target_percent_s) == 0)
12776     {
12777       if (!arg || !validate_arg (arg, POINTER_TYPE))
12778         return NULL_TREE;
12779       if (fn_fputs)
12780         call = build_call_expr_loc (loc, fn_fputs, 2, arg, fp);
12781     }
12782
12783   /* If the format specifier was "%c", call __builtin_fputc (arg, fp).  */
12784   else if (strcmp (fmt_str, target_percent_c) == 0)
12785     {
12786       if (!arg || !validate_arg (arg, INTEGER_TYPE))
12787         return NULL_TREE;
12788       if (fn_fputc)
12789         call = build_call_expr_loc (loc, fn_fputc, 2, arg, fp);
12790     }
12791
12792   if (!call)
12793     return NULL_TREE;
12794   return fold_convert_loc (loc, TREE_TYPE (TREE_TYPE (fndecl)), call);
12795 }
12796
12797 /* Initialize format string characters in the target charset.  */
12798
12799 static bool
12800 init_target_chars (void)
12801 {
12802   static bool init;
12803   if (!init)
12804     {
12805       target_newline = lang_hooks.to_target_charset ('\n');
12806       target_percent = lang_hooks.to_target_charset ('%');
12807       target_c = lang_hooks.to_target_charset ('c');
12808       target_s = lang_hooks.to_target_charset ('s');
12809       if (target_newline == 0 || target_percent == 0 || target_c == 0
12810           || target_s == 0)
12811         return false;
12812
12813       target_percent_c[0] = target_percent;
12814       target_percent_c[1] = target_c;
12815       target_percent_c[2] = '\0';
12816
12817       target_percent_s[0] = target_percent;
12818       target_percent_s[1] = target_s;
12819       target_percent_s[2] = '\0';
12820
12821       target_percent_s_newline[0] = target_percent;
12822       target_percent_s_newline[1] = target_s;
12823       target_percent_s_newline[2] = target_newline;
12824       target_percent_s_newline[3] = '\0';
12825
12826       init = true;
12827     }
12828   return true;
12829 }
12830
12831 /* Helper function for do_mpfr_arg*().  Ensure M is a normal number
12832    and no overflow/underflow occurred.  INEXACT is true if M was not
12833    exactly calculated.  TYPE is the tree type for the result.  This
12834    function assumes that you cleared the MPFR flags and then
12835    calculated M to see if anything subsequently set a flag prior to
12836    entering this function.  Return NULL_TREE if any checks fail.  */
12837
12838 static tree
12839 do_mpfr_ckconv (mpfr_srcptr m, tree type, int inexact)
12840 {
12841   /* Proceed iff we get a normal number, i.e. not NaN or Inf and no
12842      overflow/underflow occurred.  If -frounding-math, proceed iff the
12843      result of calling FUNC was exact.  */
12844   if (mpfr_number_p (m) && !mpfr_overflow_p () && !mpfr_underflow_p ()
12845       && (!flag_rounding_math || !inexact))
12846     {
12847       REAL_VALUE_TYPE rr;
12848
12849       real_from_mpfr (&rr, m, type, GMP_RNDN);
12850       /* Proceed iff GCC's REAL_VALUE_TYPE can hold the MPFR value,
12851          check for overflow/underflow.  If the REAL_VALUE_TYPE is zero
12852          but the mpft_t is not, then we underflowed in the
12853          conversion.  */
12854       if (real_isfinite (&rr)
12855           && (rr.cl == rvc_zero) == (mpfr_zero_p (m) != 0))
12856         {
12857           REAL_VALUE_TYPE rmode;
12858
12859           real_convert (&rmode, TYPE_MODE (type), &rr);
12860           /* Proceed iff the specified mode can hold the value.  */
12861           if (real_identical (&rmode, &rr))
12862             return build_real (type, rmode);
12863         }
12864     }
12865   return NULL_TREE;
12866 }
12867
12868 /* Helper function for do_mpc_arg*().  Ensure M is a normal complex
12869    number and no overflow/underflow occurred.  INEXACT is true if M
12870    was not exactly calculated.  TYPE is the tree type for the result.
12871    This function assumes that you cleared the MPFR flags and then
12872    calculated M to see if anything subsequently set a flag prior to
12873    entering this function.  Return NULL_TREE if any checks fail, if
12874    FORCE_CONVERT is true, then bypass the checks.  */
12875
12876 static tree
12877 do_mpc_ckconv (mpc_srcptr m, tree type, int inexact, int force_convert)
12878 {
12879   /* Proceed iff we get a normal number, i.e. not NaN or Inf and no
12880      overflow/underflow occurred.  If -frounding-math, proceed iff the
12881      result of calling FUNC was exact.  */
12882   if (force_convert
12883       || (mpfr_number_p (mpc_realref (m)) && mpfr_number_p (mpc_imagref (m))
12884           && !mpfr_overflow_p () && !mpfr_underflow_p ()
12885           && (!flag_rounding_math || !inexact)))
12886     {
12887       REAL_VALUE_TYPE re, im;
12888
12889       real_from_mpfr (&re, mpc_realref (m), TREE_TYPE (type), GMP_RNDN);
12890       real_from_mpfr (&im, mpc_imagref (m), TREE_TYPE (type), GMP_RNDN);
12891       /* Proceed iff GCC's REAL_VALUE_TYPE can hold the MPFR values,
12892          check for overflow/underflow.  If the REAL_VALUE_TYPE is zero
12893          but the mpft_t is not, then we underflowed in the
12894          conversion.  */
12895       if (force_convert
12896           || (real_isfinite (&re) && real_isfinite (&im)
12897               && (re.cl == rvc_zero) == (mpfr_zero_p (mpc_realref (m)) != 0)
12898               && (im.cl == rvc_zero) == (mpfr_zero_p (mpc_imagref (m)) != 0)))
12899         {
12900           REAL_VALUE_TYPE re_mode, im_mode;
12901
12902           real_convert (&re_mode, TYPE_MODE (TREE_TYPE (type)), &re);
12903           real_convert (&im_mode, TYPE_MODE (TREE_TYPE (type)), &im);
12904           /* Proceed iff the specified mode can hold the value.  */
12905           if (force_convert
12906               || (real_identical (&re_mode, &re)
12907                   && real_identical (&im_mode, &im)))
12908             return build_complex (type, build_real (TREE_TYPE (type), re_mode),
12909                                   build_real (TREE_TYPE (type), im_mode));
12910         }
12911     }
12912   return NULL_TREE;
12913 }
12914
12915 /* If argument ARG is a REAL_CST, call the one-argument mpfr function
12916    FUNC on it and return the resulting value as a tree with type TYPE.
12917    If MIN and/or MAX are not NULL, then the supplied ARG must be
12918    within those bounds.  If INCLUSIVE is true, then MIN/MAX are
12919    acceptable values, otherwise they are not.  The mpfr precision is
12920    set to the precision of TYPE.  We assume that function FUNC returns
12921    zero if the result could be calculated exactly within the requested
12922    precision.  */
12923
12924 static tree
12925 do_mpfr_arg1 (tree arg, tree type, int (*func)(mpfr_ptr, mpfr_srcptr, mp_rnd_t),
12926               const REAL_VALUE_TYPE *min, const REAL_VALUE_TYPE *max,
12927               bool inclusive)
12928 {
12929   tree result = NULL_TREE;
12930
12931   STRIP_NOPS (arg);
12932
12933   /* To proceed, MPFR must exactly represent the target floating point
12934      format, which only happens when the target base equals two.  */
12935   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
12936       && TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg))
12937     {
12938       const REAL_VALUE_TYPE *const ra = &TREE_REAL_CST (arg);
12939
12940       if (real_isfinite (ra)
12941           && (!min || real_compare (inclusive ? GE_EXPR: GT_EXPR , ra, min))
12942           && (!max || real_compare (inclusive ? LE_EXPR: LT_EXPR , ra, max)))
12943         {
12944           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
12945           const int prec = fmt->p;
12946           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
12947           int inexact;
12948           mpfr_t m;
12949
12950           mpfr_init2 (m, prec);
12951           mpfr_from_real (m, ra, GMP_RNDN);
12952           mpfr_clear_flags ();
12953           inexact = func (m, m, rnd);
12954           result = do_mpfr_ckconv (m, type, inexact);
12955           mpfr_clear (m);
12956         }
12957     }
12958
12959   return result;
12960 }
12961
12962 /* If argument ARG is a REAL_CST, call the two-argument mpfr function
12963    FUNC on it and return the resulting value as a tree with type TYPE.
12964    The mpfr precision is set to the precision of TYPE.  We assume that
12965    function FUNC returns zero if the result could be calculated
12966    exactly within the requested precision.  */
12967
12968 static tree
12969 do_mpfr_arg2 (tree arg1, tree arg2, tree type,
12970               int (*func)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mp_rnd_t))
12971 {
12972   tree result = NULL_TREE;
12973
12974   STRIP_NOPS (arg1);
12975   STRIP_NOPS (arg2);
12976
12977   /* To proceed, MPFR must exactly represent the target floating point
12978      format, which only happens when the target base equals two.  */
12979   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
12980       && TREE_CODE (arg1) == REAL_CST && !TREE_OVERFLOW (arg1)
12981       && TREE_CODE (arg2) == REAL_CST && !TREE_OVERFLOW (arg2))
12982     {
12983       const REAL_VALUE_TYPE *const ra1 = &TREE_REAL_CST (arg1);
12984       const REAL_VALUE_TYPE *const ra2 = &TREE_REAL_CST (arg2);
12985
12986       if (real_isfinite (ra1) && real_isfinite (ra2))
12987         {
12988           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
12989           const int prec = fmt->p;
12990           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
12991           int inexact;
12992           mpfr_t m1, m2;
12993
12994           mpfr_inits2 (prec, m1, m2, NULL);
12995           mpfr_from_real (m1, ra1, GMP_RNDN);
12996           mpfr_from_real (m2, ra2, GMP_RNDN);
12997           mpfr_clear_flags ();
12998           inexact = func (m1, m1, m2, rnd);
12999           result = do_mpfr_ckconv (m1, type, inexact);
13000           mpfr_clears (m1, m2, NULL);
13001         }
13002     }
13003
13004   return result;
13005 }
13006
13007 /* If argument ARG is a REAL_CST, call the three-argument mpfr function
13008    FUNC on it and return the resulting value as a tree with type TYPE.
13009    The mpfr precision is set to the precision of TYPE.  We assume that
13010    function FUNC returns zero if the result could be calculated
13011    exactly within the requested precision.  */
13012
13013 static tree
13014 do_mpfr_arg3 (tree arg1, tree arg2, tree arg3, tree type,
13015               int (*func)(mpfr_ptr, mpfr_srcptr, mpfr_srcptr, mpfr_srcptr, mp_rnd_t))
13016 {
13017   tree result = NULL_TREE;
13018
13019   STRIP_NOPS (arg1);
13020   STRIP_NOPS (arg2);
13021   STRIP_NOPS (arg3);
13022
13023   /* To proceed, MPFR must exactly represent the target floating point
13024      format, which only happens when the target base equals two.  */
13025   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13026       && TREE_CODE (arg1) == REAL_CST && !TREE_OVERFLOW (arg1)
13027       && TREE_CODE (arg2) == REAL_CST && !TREE_OVERFLOW (arg2)
13028       && TREE_CODE (arg3) == REAL_CST && !TREE_OVERFLOW (arg3))
13029     {
13030       const REAL_VALUE_TYPE *const ra1 = &TREE_REAL_CST (arg1);
13031       const REAL_VALUE_TYPE *const ra2 = &TREE_REAL_CST (arg2);
13032       const REAL_VALUE_TYPE *const ra3 = &TREE_REAL_CST (arg3);
13033
13034       if (real_isfinite (ra1) && real_isfinite (ra2) && real_isfinite (ra3))
13035         {
13036           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13037           const int prec = fmt->p;
13038           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13039           int inexact;
13040           mpfr_t m1, m2, m3;
13041
13042           mpfr_inits2 (prec, m1, m2, m3, NULL);
13043           mpfr_from_real (m1, ra1, GMP_RNDN);
13044           mpfr_from_real (m2, ra2, GMP_RNDN);
13045           mpfr_from_real (m3, ra3, GMP_RNDN);
13046           mpfr_clear_flags ();
13047           inexact = func (m1, m1, m2, m3, rnd);
13048           result = do_mpfr_ckconv (m1, type, inexact);
13049           mpfr_clears (m1, m2, m3, NULL);
13050         }
13051     }
13052
13053   return result;
13054 }
13055
13056 /* If argument ARG is a REAL_CST, call mpfr_sin_cos() on it and set
13057    the pointers *(ARG_SINP) and *(ARG_COSP) to the resulting values.
13058    If ARG_SINP and ARG_COSP are NULL then the result is returned
13059    as a complex value.
13060    The type is taken from the type of ARG and is used for setting the
13061    precision of the calculation and results.  */
13062
13063 static tree
13064 do_mpfr_sincos (tree arg, tree arg_sinp, tree arg_cosp)
13065 {
13066   tree const type = TREE_TYPE (arg);
13067   tree result = NULL_TREE;
13068
13069   STRIP_NOPS (arg);
13070
13071   /* To proceed, MPFR must exactly represent the target floating point
13072      format, which only happens when the target base equals two.  */
13073   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13074       && TREE_CODE (arg) == REAL_CST
13075       && !TREE_OVERFLOW (arg))
13076     {
13077       const REAL_VALUE_TYPE *const ra = &TREE_REAL_CST (arg);
13078
13079       if (real_isfinite (ra))
13080         {
13081           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13082           const int prec = fmt->p;
13083           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13084           tree result_s, result_c;
13085           int inexact;
13086           mpfr_t m, ms, mc;
13087
13088           mpfr_inits2 (prec, m, ms, mc, NULL);
13089           mpfr_from_real (m, ra, GMP_RNDN);
13090           mpfr_clear_flags ();
13091           inexact = mpfr_sin_cos (ms, mc, m, rnd);
13092           result_s = do_mpfr_ckconv (ms, type, inexact);
13093           result_c = do_mpfr_ckconv (mc, type, inexact);
13094           mpfr_clears (m, ms, mc, NULL);
13095           if (result_s && result_c)
13096             {
13097               /* If we are to return in a complex value do so.  */
13098               if (!arg_sinp && !arg_cosp)
13099                 return build_complex (build_complex_type (type),
13100                                       result_c, result_s);
13101
13102               /* Dereference the sin/cos pointer arguments.  */
13103               arg_sinp = build_fold_indirect_ref (arg_sinp);
13104               arg_cosp = build_fold_indirect_ref (arg_cosp);
13105               /* Proceed if valid pointer type were passed in.  */
13106               if (TYPE_MAIN_VARIANT (TREE_TYPE (arg_sinp)) == TYPE_MAIN_VARIANT (type)
13107                   && TYPE_MAIN_VARIANT (TREE_TYPE (arg_cosp)) == TYPE_MAIN_VARIANT (type))
13108                 {
13109                   /* Set the values. */
13110                   result_s = fold_build2 (MODIFY_EXPR, type, arg_sinp,
13111                                           result_s);
13112                   TREE_SIDE_EFFECTS (result_s) = 1;
13113                   result_c = fold_build2 (MODIFY_EXPR, type, arg_cosp,
13114                                           result_c);
13115                   TREE_SIDE_EFFECTS (result_c) = 1;
13116                   /* Combine the assignments into a compound expr.  */
13117                   result = non_lvalue (fold_build2 (COMPOUND_EXPR, type,
13118                                                     result_s, result_c));
13119                 }
13120             }
13121         }
13122     }
13123   return result;
13124 }
13125
13126 /* If argument ARG1 is an INTEGER_CST and ARG2 is a REAL_CST, call the
13127    two-argument mpfr order N Bessel function FUNC on them and return
13128    the resulting value as a tree with type TYPE.  The mpfr precision
13129    is set to the precision of TYPE.  We assume that function FUNC
13130    returns zero if the result could be calculated exactly within the
13131    requested precision.  */
13132 static tree
13133 do_mpfr_bessel_n (tree arg1, tree arg2, tree type,
13134                   int (*func)(mpfr_ptr, long, mpfr_srcptr, mp_rnd_t),
13135                   const REAL_VALUE_TYPE *min, bool inclusive)
13136 {
13137   tree result = NULL_TREE;
13138
13139   STRIP_NOPS (arg1);
13140   STRIP_NOPS (arg2);
13141
13142   /* To proceed, MPFR must exactly represent the target floating point
13143      format, which only happens when the target base equals two.  */
13144   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13145       && host_integerp (arg1, 0)
13146       && TREE_CODE (arg2) == REAL_CST && !TREE_OVERFLOW (arg2))
13147     {
13148       const HOST_WIDE_INT n = tree_low_cst(arg1, 0);
13149       const REAL_VALUE_TYPE *const ra = &TREE_REAL_CST (arg2);
13150
13151       if (n == (long)n
13152           && real_isfinite (ra)
13153           && (!min || real_compare (inclusive ? GE_EXPR: GT_EXPR , ra, min)))
13154         {
13155           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13156           const int prec = fmt->p;
13157           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13158           int inexact;
13159           mpfr_t m;
13160
13161           mpfr_init2 (m, prec);
13162           mpfr_from_real (m, ra, GMP_RNDN);
13163           mpfr_clear_flags ();
13164           inexact = func (m, n, m, rnd);
13165           result = do_mpfr_ckconv (m, type, inexact);
13166           mpfr_clear (m);
13167         }
13168     }
13169
13170   return result;
13171 }
13172
13173 /* If arguments ARG0 and ARG1 are REAL_CSTs, call mpfr_remquo() to set
13174    the pointer *(ARG_QUO) and return the result.  The type is taken
13175    from the type of ARG0 and is used for setting the precision of the
13176    calculation and results.  */
13177
13178 static tree
13179 do_mpfr_remquo (tree arg0, tree arg1, tree arg_quo)
13180 {
13181   tree const type = TREE_TYPE (arg0);
13182   tree result = NULL_TREE;
13183
13184   STRIP_NOPS (arg0);
13185   STRIP_NOPS (arg1);
13186
13187   /* To proceed, MPFR must exactly represent the target floating point
13188      format, which only happens when the target base equals two.  */
13189   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13190       && TREE_CODE (arg0) == REAL_CST && !TREE_OVERFLOW (arg0)
13191       && TREE_CODE (arg1) == REAL_CST && !TREE_OVERFLOW (arg1))
13192     {
13193       const REAL_VALUE_TYPE *const ra0 = TREE_REAL_CST_PTR (arg0);
13194       const REAL_VALUE_TYPE *const ra1 = TREE_REAL_CST_PTR (arg1);
13195
13196       if (real_isfinite (ra0) && real_isfinite (ra1))
13197         {
13198           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13199           const int prec = fmt->p;
13200           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13201           tree result_rem;
13202           long integer_quo;
13203           mpfr_t m0, m1;
13204
13205           mpfr_inits2 (prec, m0, m1, NULL);
13206           mpfr_from_real (m0, ra0, GMP_RNDN);
13207           mpfr_from_real (m1, ra1, GMP_RNDN);
13208           mpfr_clear_flags ();
13209           mpfr_remquo (m0, &integer_quo, m0, m1, rnd);
13210           /* Remquo is independent of the rounding mode, so pass
13211              inexact=0 to do_mpfr_ckconv().  */
13212           result_rem = do_mpfr_ckconv (m0, type, /*inexact=*/ 0);
13213           mpfr_clears (m0, m1, NULL);
13214           if (result_rem)
13215             {
13216               /* MPFR calculates quo in the host's long so it may
13217                  return more bits in quo than the target int can hold
13218                  if sizeof(host long) > sizeof(target int).  This can
13219                  happen even for native compilers in LP64 mode.  In
13220                  these cases, modulo the quo value with the largest
13221                  number that the target int can hold while leaving one
13222                  bit for the sign.  */
13223               if (sizeof (integer_quo) * CHAR_BIT > INT_TYPE_SIZE)
13224                 integer_quo %= (long)(1UL << (INT_TYPE_SIZE - 1));
13225
13226               /* Dereference the quo pointer argument.  */
13227               arg_quo = build_fold_indirect_ref (arg_quo);
13228               /* Proceed iff a valid pointer type was passed in.  */
13229               if (TYPE_MAIN_VARIANT (TREE_TYPE (arg_quo)) == integer_type_node)
13230                 {
13231                   /* Set the value. */
13232                   tree result_quo = fold_build2 (MODIFY_EXPR,
13233                                                  TREE_TYPE (arg_quo), arg_quo,
13234                                                  build_int_cst (NULL, integer_quo));
13235                   TREE_SIDE_EFFECTS (result_quo) = 1;
13236                   /* Combine the quo assignment with the rem.  */
13237                   result = non_lvalue (fold_build2 (COMPOUND_EXPR, type,
13238                                                     result_quo, result_rem));
13239                 }
13240             }
13241         }
13242     }
13243   return result;
13244 }
13245
13246 /* If ARG is a REAL_CST, call mpfr_lgamma() on it and return the
13247    resulting value as a tree with type TYPE.  The mpfr precision is
13248    set to the precision of TYPE.  We assume that this mpfr function
13249    returns zero if the result could be calculated exactly within the
13250    requested precision.  In addition, the integer pointer represented
13251    by ARG_SG will be dereferenced and set to the appropriate signgam
13252    (-1,1) value.  */
13253
13254 static tree
13255 do_mpfr_lgamma_r (tree arg, tree arg_sg, tree type)
13256 {
13257   tree result = NULL_TREE;
13258
13259   STRIP_NOPS (arg);
13260
13261   /* To proceed, MPFR must exactly represent the target floating point
13262      format, which only happens when the target base equals two.  Also
13263      verify ARG is a constant and that ARG_SG is an int pointer.  */
13264   if (REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2
13265       && TREE_CODE (arg) == REAL_CST && !TREE_OVERFLOW (arg)
13266       && TREE_CODE (TREE_TYPE (arg_sg)) == POINTER_TYPE
13267       && TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (arg_sg))) == integer_type_node)
13268     {
13269       const REAL_VALUE_TYPE *const ra = TREE_REAL_CST_PTR (arg);
13270
13271       /* In addition to NaN and Inf, the argument cannot be zero or a
13272          negative integer.  */
13273       if (real_isfinite (ra)
13274           && ra->cl != rvc_zero
13275           && !(real_isneg(ra) && real_isinteger(ra, TYPE_MODE (type))))
13276         {
13277           const struct real_format *fmt = REAL_MODE_FORMAT (TYPE_MODE (type));
13278           const int prec = fmt->p;
13279           const mp_rnd_t rnd = fmt->round_towards_zero? GMP_RNDZ : GMP_RNDN;
13280           int inexact, sg;
13281           mpfr_t m;
13282           tree result_lg;
13283
13284           mpfr_init2 (m, prec);
13285           mpfr_from_real (m, ra, GMP_RNDN);
13286           mpfr_clear_flags ();
13287           inexact = mpfr_lgamma (m, &sg, m, rnd);
13288           result_lg = do_mpfr_ckconv (m, type, inexact);
13289           mpfr_clear (m);
13290           if (result_lg)
13291             {
13292               tree result_sg;
13293
13294               /* Dereference the arg_sg pointer argument.  */
13295               arg_sg = build_fold_indirect_ref (arg_sg);
13296               /* Assign the signgam value into *arg_sg. */
13297               result_sg = fold_build2 (MODIFY_EXPR,
13298                                        TREE_TYPE (arg_sg), arg_sg,
13299                                        build_int_cst (NULL, sg));
13300               TREE_SIDE_EFFECTS (result_sg) = 1;
13301               /* Combine the signgam assignment with the lgamma result.  */
13302               result = non_lvalue (fold_build2 (COMPOUND_EXPR, type,
13303                                                 result_sg, result_lg));
13304             }
13305         }
13306     }
13307
13308   return result;
13309 }
13310
13311 /* If argument ARG is a COMPLEX_CST, call the one-argument mpc
13312    function FUNC on it and return the resulting value as a tree with
13313    type TYPE.  The mpfr precision is set to the precision of TYPE.  We
13314    assume that function FUNC returns zero if the result could be
13315    calculated exactly within the requested precision.  */
13316
13317 static tree
13318 do_mpc_arg1 (tree arg, tree type, int (*func)(mpc_ptr, mpc_srcptr, mpc_rnd_t))
13319 {
13320   tree result = NULL_TREE;
13321
13322   STRIP_NOPS (arg);
13323
13324   /* To proceed, MPFR must exactly represent the target floating point
13325      format, which only happens when the target base equals two.  */
13326   if (TREE_CODE (arg) == COMPLEX_CST && !TREE_OVERFLOW (arg)
13327       && TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) == REAL_TYPE
13328       && REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (TREE_TYPE (arg))))->b == 2)
13329     {
13330       const REAL_VALUE_TYPE *const re = TREE_REAL_CST_PTR (TREE_REALPART (arg));
13331       const REAL_VALUE_TYPE *const im = TREE_REAL_CST_PTR (TREE_IMAGPART (arg));
13332
13333       if (real_isfinite (re) && real_isfinite (im))
13334         {
13335           const struct real_format *const fmt =
13336             REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (type)));
13337           const int prec = fmt->p;
13338           const mp_rnd_t rnd = fmt->round_towards_zero ? GMP_RNDZ : GMP_RNDN;
13339           const mpc_rnd_t crnd = fmt->round_towards_zero ? MPC_RNDZZ : MPC_RNDNN;
13340           int inexact;
13341           mpc_t m;
13342
13343           mpc_init2 (m, prec);
13344           mpfr_from_real (mpc_realref(m), re, rnd);
13345           mpfr_from_real (mpc_imagref(m), im, rnd);
13346           mpfr_clear_flags ();
13347           inexact = func (m, m, crnd);
13348           result = do_mpc_ckconv (m, type, inexact, /*force_convert=*/ 0);
13349           mpc_clear (m);
13350         }
13351     }
13352
13353   return result;
13354 }
13355
13356 /* If arguments ARG0 and ARG1 are a COMPLEX_CST, call the two-argument
13357    mpc function FUNC on it and return the resulting value as a tree
13358    with type TYPE.  The mpfr precision is set to the precision of
13359    TYPE.  We assume that function FUNC returns zero if the result
13360    could be calculated exactly within the requested precision.  If
13361    DO_NONFINITE is true, then fold expressions containing Inf or NaN
13362    in the arguments and/or results.  */
13363
13364 tree
13365 do_mpc_arg2 (tree arg0, tree arg1, tree type, int do_nonfinite,
13366              int (*func)(mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t))
13367 {
13368   tree result = NULL_TREE;
13369
13370   STRIP_NOPS (arg0);
13371   STRIP_NOPS (arg1);
13372
13373   /* To proceed, MPFR must exactly represent the target floating point
13374      format, which only happens when the target base equals two.  */
13375   if (TREE_CODE (arg0) == COMPLEX_CST && !TREE_OVERFLOW (arg0)
13376       && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE
13377       && TREE_CODE (arg1) == COMPLEX_CST && !TREE_OVERFLOW (arg1)
13378       && TREE_CODE (TREE_TYPE (TREE_TYPE (arg1))) == REAL_TYPE
13379       && REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (TREE_TYPE (arg0))))->b == 2)
13380     {
13381       const REAL_VALUE_TYPE *const re0 = TREE_REAL_CST_PTR (TREE_REALPART (arg0));
13382       const REAL_VALUE_TYPE *const im0 = TREE_REAL_CST_PTR (TREE_IMAGPART (arg0));
13383       const REAL_VALUE_TYPE *const re1 = TREE_REAL_CST_PTR (TREE_REALPART (arg1));
13384       const REAL_VALUE_TYPE *const im1 = TREE_REAL_CST_PTR (TREE_IMAGPART (arg1));
13385
13386       if (do_nonfinite
13387           || (real_isfinite (re0) && real_isfinite (im0)
13388               && real_isfinite (re1) && real_isfinite (im1)))
13389         {
13390           const struct real_format *const fmt =
13391             REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (type)));
13392           const int prec = fmt->p;
13393           const mp_rnd_t rnd = fmt->round_towards_zero ? GMP_RNDZ : GMP_RNDN;
13394           const mpc_rnd_t crnd = fmt->round_towards_zero ? MPC_RNDZZ : MPC_RNDNN;
13395           int inexact;
13396           mpc_t m0, m1;
13397
13398           mpc_init2 (m0, prec);
13399           mpc_init2 (m1, prec);
13400           mpfr_from_real (mpc_realref(m0), re0, rnd);
13401           mpfr_from_real (mpc_imagref(m0), im0, rnd);
13402           mpfr_from_real (mpc_realref(m1), re1, rnd);
13403           mpfr_from_real (mpc_imagref(m1), im1, rnd);
13404           mpfr_clear_flags ();
13405           inexact = func (m0, m0, m1, crnd);
13406           result = do_mpc_ckconv (m0, type, inexact, do_nonfinite);
13407           mpc_clear (m0);
13408           mpc_clear (m1);
13409         }
13410     }
13411
13412   return result;
13413 }
13414
13415 /* FIXME tuples.
13416    The functions below provide an alternate interface for folding
13417    builtin function calls presented as GIMPLE_CALL statements rather
13418    than as CALL_EXPRs.  The folded result is still expressed as a
13419    tree.  There is too much code duplication in the handling of
13420    varargs functions, and a more intrusive re-factoring would permit
13421    better sharing of code between the tree and statement-based
13422    versions of these functions.  */
13423
13424 /* Construct a new CALL_EXPR using the tail of the argument list of STMT
13425    along with N new arguments specified as the "..." parameters.  SKIP
13426    is the number of arguments in STMT to be omitted.  This function is used
13427    to do varargs-to-varargs transformations.  */
13428
13429 static tree
13430 gimple_rewrite_call_expr (gimple stmt, int skip, tree fndecl, int n, ...)
13431 {
13432   int oldnargs = gimple_call_num_args (stmt);
13433   int nargs = oldnargs - skip + n;
13434   tree fntype = TREE_TYPE (fndecl);
13435   tree fn = build1 (ADDR_EXPR, build_pointer_type (fntype), fndecl);
13436   tree *buffer;
13437   int i, j;
13438   va_list ap;
13439   location_t loc = gimple_location (stmt);
13440
13441   buffer = XALLOCAVEC (tree, nargs);
13442   va_start (ap, n);
13443   for (i = 0; i < n; i++)
13444     buffer[i] = va_arg (ap, tree);
13445   va_end (ap);
13446   for (j = skip; j < oldnargs; j++, i++)
13447     buffer[i] = gimple_call_arg (stmt, j);
13448
13449   return fold (build_call_array_loc (loc, TREE_TYPE (fntype), fn, nargs, buffer));
13450 }
13451
13452 /* Fold a call STMT to __{,v}sprintf_chk.  Return NULL_TREE if
13453    a normal call should be emitted rather than expanding the function
13454    inline.  FCODE is either BUILT_IN_SPRINTF_CHK or BUILT_IN_VSPRINTF_CHK.  */
13455
13456 static tree
13457 gimple_fold_builtin_sprintf_chk (gimple stmt, enum built_in_function fcode)
13458 {
13459   tree dest, size, len, fn, fmt, flag;
13460   const char *fmt_str;
13461   int nargs = gimple_call_num_args (stmt);
13462
13463   /* Verify the required arguments in the original call.  */
13464   if (nargs < 4)
13465     return NULL_TREE;
13466   dest = gimple_call_arg (stmt, 0);
13467   if (!validate_arg (dest, POINTER_TYPE))
13468     return NULL_TREE;
13469   flag = gimple_call_arg (stmt, 1);
13470   if (!validate_arg (flag, INTEGER_TYPE))
13471     return NULL_TREE;
13472   size = gimple_call_arg (stmt, 2);
13473   if (!validate_arg (size, INTEGER_TYPE))
13474     return NULL_TREE;
13475   fmt = gimple_call_arg (stmt, 3);
13476   if (!validate_arg (fmt, POINTER_TYPE))
13477     return NULL_TREE;
13478
13479   if (! host_integerp (size, 1))
13480     return NULL_TREE;
13481
13482   len = NULL_TREE;
13483
13484   if (!init_target_chars ())
13485     return NULL_TREE;
13486
13487   /* Check whether the format is a literal string constant.  */
13488   fmt_str = c_getstr (fmt);
13489   if (fmt_str != NULL)
13490     {
13491       /* If the format doesn't contain % args or %%, we know the size.  */
13492       if (strchr (fmt_str, target_percent) == 0)
13493         {
13494           if (fcode != BUILT_IN_SPRINTF_CHK || nargs == 4)
13495             len = build_int_cstu (size_type_node, strlen (fmt_str));
13496         }
13497       /* If the format is "%s" and first ... argument is a string literal,
13498          we know the size too.  */
13499       else if (fcode == BUILT_IN_SPRINTF_CHK
13500                && strcmp (fmt_str, target_percent_s) == 0)
13501         {
13502           tree arg;
13503
13504           if (nargs == 5)
13505             {
13506               arg = gimple_call_arg (stmt, 4);
13507               if (validate_arg (arg, POINTER_TYPE))
13508                 {
13509                   len = c_strlen (arg, 1);
13510                   if (! len || ! host_integerp (len, 1))
13511                     len = NULL_TREE;
13512                 }
13513             }
13514         }
13515     }
13516
13517   if (! integer_all_onesp (size))
13518     {
13519       if (! len || ! tree_int_cst_lt (len, size))
13520         return NULL_TREE;
13521     }
13522
13523   /* Only convert __{,v}sprintf_chk to {,v}sprintf if flag is 0
13524      or if format doesn't contain % chars or is "%s".  */
13525   if (! integer_zerop (flag))
13526     {
13527       if (fmt_str == NULL)
13528         return NULL_TREE;
13529       if (strchr (fmt_str, target_percent) != NULL
13530           && strcmp (fmt_str, target_percent_s))
13531         return NULL_TREE;
13532     }
13533
13534   /* If __builtin_{,v}sprintf_chk is used, assume {,v}sprintf is available.  */
13535   fn = built_in_decls[fcode == BUILT_IN_VSPRINTF_CHK
13536                       ? BUILT_IN_VSPRINTF : BUILT_IN_SPRINTF];
13537   if (!fn)
13538     return NULL_TREE;
13539
13540   return gimple_rewrite_call_expr (stmt, 4, fn, 2, dest, fmt);
13541 }
13542
13543 /* Fold a call STMT to {,v}snprintf.  Return NULL_TREE if
13544    a normal call should be emitted rather than expanding the function
13545    inline.  FCODE is either BUILT_IN_SNPRINTF_CHK or
13546    BUILT_IN_VSNPRINTF_CHK.  If MAXLEN is not NULL, it is maximum length
13547    passed as second argument.  */
13548
13549 tree
13550 gimple_fold_builtin_snprintf_chk (gimple stmt, tree maxlen,
13551                                   enum built_in_function fcode)
13552 {
13553   tree dest, size, len, fn, fmt, flag;
13554   const char *fmt_str;
13555
13556   /* Verify the required arguments in the original call.  */
13557   if (gimple_call_num_args (stmt) < 5)
13558     return NULL_TREE;
13559   dest = gimple_call_arg (stmt, 0);
13560   if (!validate_arg (dest, POINTER_TYPE))
13561     return NULL_TREE;
13562   len = gimple_call_arg (stmt, 1);
13563   if (!validate_arg (len, INTEGER_TYPE))
13564     return NULL_TREE;
13565   flag = gimple_call_arg (stmt, 2);
13566   if (!validate_arg (flag, INTEGER_TYPE))
13567     return NULL_TREE;
13568   size = gimple_call_arg (stmt, 3);
13569   if (!validate_arg (size, INTEGER_TYPE))
13570     return NULL_TREE;
13571   fmt = gimple_call_arg (stmt, 4);
13572   if (!validate_arg (fmt, POINTER_TYPE))
13573     return NULL_TREE;
13574
13575   if (! host_integerp (size, 1))
13576     return NULL_TREE;
13577
13578   if (! integer_all_onesp (size))
13579     {
13580       if (! host_integerp (len, 1))
13581         {
13582           /* If LEN is not constant, try MAXLEN too.
13583              For MAXLEN only allow optimizing into non-_ocs function
13584              if SIZE is >= MAXLEN, never convert to __ocs_fail ().  */
13585           if (maxlen == NULL_TREE || ! host_integerp (maxlen, 1))
13586             return NULL_TREE;
13587         }
13588       else
13589         maxlen = len;
13590
13591       if (tree_int_cst_lt (size, maxlen))
13592         return NULL_TREE;
13593     }
13594
13595   if (!init_target_chars ())
13596     return NULL_TREE;
13597
13598   /* Only convert __{,v}snprintf_chk to {,v}snprintf if flag is 0
13599      or if format doesn't contain % chars or is "%s".  */
13600   if (! integer_zerop (flag))
13601     {
13602       fmt_str = c_getstr (fmt);
13603       if (fmt_str == NULL)
13604         return NULL_TREE;
13605       if (strchr (fmt_str, target_percent) != NULL
13606           && strcmp (fmt_str, target_percent_s))
13607         return NULL_TREE;
13608     }
13609
13610   /* If __builtin_{,v}snprintf_chk is used, assume {,v}snprintf is
13611      available.  */
13612   fn = built_in_decls[fcode == BUILT_IN_VSNPRINTF_CHK
13613                       ? BUILT_IN_VSNPRINTF : BUILT_IN_SNPRINTF];
13614   if (!fn)
13615     return NULL_TREE;
13616
13617   return gimple_rewrite_call_expr (stmt, 5, fn, 3, dest, len, fmt);
13618 }
13619
13620 /* Builtins with folding operations that operate on "..." arguments
13621    need special handling; we need to store the arguments in a convenient
13622    data structure before attempting any folding.  Fortunately there are
13623    only a few builtins that fall into this category.  FNDECL is the
13624    function, EXP is the CALL_EXPR for the call, and IGNORE is true if the
13625    result of the function call is ignored.  */
13626
13627 static tree
13628 gimple_fold_builtin_varargs (tree fndecl, gimple stmt,
13629                              bool ignore ATTRIBUTE_UNUSED)
13630 {
13631   enum built_in_function fcode = DECL_FUNCTION_CODE (fndecl);
13632   tree ret = NULL_TREE;
13633
13634   switch (fcode)
13635     {
13636     case BUILT_IN_SPRINTF_CHK:
13637     case BUILT_IN_VSPRINTF_CHK:
13638       ret = gimple_fold_builtin_sprintf_chk (stmt, fcode);
13639       break;
13640
13641     case BUILT_IN_SNPRINTF_CHK:
13642     case BUILT_IN_VSNPRINTF_CHK:
13643       ret = gimple_fold_builtin_snprintf_chk (stmt, NULL_TREE, fcode);
13644
13645     default:
13646       break;
13647     }
13648   if (ret)
13649     {
13650       ret = build1 (NOP_EXPR, TREE_TYPE (ret), ret);
13651       TREE_NO_WARNING (ret) = 1;
13652       return ret;
13653     }
13654   return NULL_TREE;
13655 }
13656
13657 /* A wrapper function for builtin folding that prevents warnings for
13658    "statement without effect" and the like, caused by removing the
13659    call node earlier than the warning is generated.  */
13660
13661 tree
13662 fold_call_stmt (gimple stmt, bool ignore)
13663 {
13664   tree ret = NULL_TREE;
13665   tree fndecl = gimple_call_fndecl (stmt);
13666   location_t loc = gimple_location (stmt);
13667   if (fndecl
13668       && TREE_CODE (fndecl) == FUNCTION_DECL
13669       && DECL_BUILT_IN (fndecl)
13670       && !gimple_call_va_arg_pack_p (stmt))
13671     {
13672       int nargs = gimple_call_num_args (stmt);
13673
13674       if (avoid_folding_inline_builtin (fndecl))
13675         return NULL_TREE;
13676       if (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
13677         {
13678           return targetm.fold_builtin (fndecl, nargs,
13679                                        (nargs > 0
13680                                         ? gimple_call_arg_ptr (stmt, 0)
13681                                         : &error_mark_node), ignore);
13682         }
13683       else
13684         {
13685           if (nargs <= MAX_ARGS_TO_FOLD_BUILTIN)
13686             {
13687               tree args[MAX_ARGS_TO_FOLD_BUILTIN];
13688               int i;
13689               for (i = 0; i < nargs; i++)
13690                 args[i] = gimple_call_arg (stmt, i);
13691               ret = fold_builtin_n (loc, fndecl, args, nargs, ignore);
13692             }
13693           if (!ret)
13694             ret = gimple_fold_builtin_varargs (fndecl, stmt, ignore);
13695           if (ret)
13696             {
13697               /* Propagate location information from original call to
13698                  expansion of builtin.  Otherwise things like
13699                  maybe_emit_chk_warning, that operate on the expansion
13700                  of a builtin, will use the wrong location information.  */
13701               if (gimple_has_location (stmt))
13702                 {
13703                   tree realret = ret;
13704                   if (TREE_CODE (ret) == NOP_EXPR)
13705                     realret = TREE_OPERAND (ret, 0);
13706                   if (CAN_HAVE_LOCATION_P (realret)
13707                       && !EXPR_HAS_LOCATION (realret))
13708                     SET_EXPR_LOCATION (realret, loc);
13709                   return realret;
13710                 }
13711               return ret;
13712             }
13713         }
13714     }
13715   return NULL_TREE;
13716 }
13717
13718 /* Look up the function in built_in_decls that corresponds to DECL
13719    and set ASMSPEC as its user assembler name.  DECL must be a
13720    function decl that declares a builtin.  */
13721
13722 void
13723 set_builtin_user_assembler_name (tree decl, const char *asmspec)
13724 {
13725   tree builtin;
13726   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL
13727               && DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
13728               && asmspec != 0);
13729
13730   builtin = built_in_decls [DECL_FUNCTION_CODE (decl)];
13731   set_user_assembler_name (builtin, asmspec);
13732   switch (DECL_FUNCTION_CODE (decl))
13733     {
13734     case BUILT_IN_MEMCPY:
13735       init_block_move_fn (asmspec);
13736       memcpy_libfunc = set_user_assembler_libfunc ("memcpy", asmspec);
13737       break;
13738     case BUILT_IN_MEMSET:
13739       init_block_clear_fn (asmspec);
13740       memset_libfunc = set_user_assembler_libfunc ("memset", asmspec);
13741       break;
13742     case BUILT_IN_MEMMOVE:
13743       memmove_libfunc = set_user_assembler_libfunc ("memmove", asmspec);
13744       break;
13745     case BUILT_IN_MEMCMP:
13746       memcmp_libfunc = set_user_assembler_libfunc ("memcmp", asmspec);
13747       break;
13748     case BUILT_IN_ABORT:
13749       abort_libfunc = set_user_assembler_libfunc ("abort", asmspec);
13750       break;
13751     case BUILT_IN_FFS:
13752       if (INT_TYPE_SIZE < BITS_PER_WORD)
13753         {
13754           set_user_assembler_libfunc ("ffs", asmspec);
13755           set_optab_libfunc (ffs_optab, mode_for_size (INT_TYPE_SIZE,
13756                                                        MODE_INT, 0), "ffs");
13757         }
13758       break;
13759     default:
13760       break;
13761     }
13762 }