c++: Revert unnecessary parts of fix for [PR90996]
[platform/upstream/gcc.git] / gcc / expr.c
1 /* Convert tree expression to rtl instructions, for GNU compiler.
2    Copyright (C) 1988-2020 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "backend.h"
24 #include "target.h"
25 #include "rtl.h"
26 #include "tree.h"
27 #include "gimple.h"
28 #include "predict.h"
29 #include "memmodel.h"
30 #include "tm_p.h"
31 #include "ssa.h"
32 #include "expmed.h"
33 #include "optabs.h"
34 #include "regs.h"
35 #include "emit-rtl.h"
36 #include "recog.h"
37 #include "cgraph.h"
38 #include "diagnostic.h"
39 #include "alias.h"
40 #include "fold-const.h"
41 #include "stor-layout.h"
42 #include "attribs.h"
43 #include "varasm.h"
44 #include "except.h"
45 #include "insn-attr.h"
46 #include "dojump.h"
47 #include "explow.h"
48 #include "calls.h"
49 #include "stmt.h"
50 /* Include expr.h after insn-config.h so we get HAVE_conditional_move.  */
51 #include "expr.h"
52 #include "optabs-tree.h"
53 #include "libfuncs.h"
54 #include "reload.h"
55 #include "langhooks.h"
56 #include "common/common-target.h"
57 #include "tree-dfa.h"
58 #include "tree-ssa-live.h"
59 #include "tree-outof-ssa.h"
60 #include "tree-ssa-address.h"
61 #include "builtins.h"
62 #include "ccmp.h"
63 #include "gimple-fold.h"
64 #include "rtx-vector-builder.h"
65
66
67 /* If this is nonzero, we do not bother generating VOLATILE
68    around volatile memory references, and we are willing to
69    output indirect addresses.  If cse is to follow, we reject
70    indirect addresses so a useful potential cse is generated;
71    if it is used only once, instruction combination will produce
72    the same indirect address eventually.  */
73 int cse_not_expected;
74
75 static bool block_move_libcall_safe_for_call_parm (void);
76 static bool emit_block_move_via_pattern (rtx, rtx, rtx, unsigned, unsigned, 
77                                          HOST_WIDE_INT, unsigned HOST_WIDE_INT,
78                                          unsigned HOST_WIDE_INT,
79                                          unsigned HOST_WIDE_INT, bool);
80 static void emit_block_move_via_loop (rtx, rtx, rtx, unsigned);
81 static void clear_by_pieces (rtx, unsigned HOST_WIDE_INT, unsigned int);
82 static rtx_insn *compress_float_constant (rtx, rtx);
83 static rtx get_subtarget (rtx);
84 static void store_constructor (tree, rtx, int, poly_int64, bool);
85 static rtx store_field (rtx, poly_int64, poly_int64, poly_uint64, poly_uint64,
86                         machine_mode, tree, alias_set_type, bool, bool);
87
88 static unsigned HOST_WIDE_INT highest_pow2_factor_for_target (const_tree, const_tree);
89
90 static int is_aligning_offset (const_tree, const_tree);
91 static rtx reduce_to_bit_field_precision (rtx, rtx, tree);
92 static rtx do_store_flag (sepops, rtx, machine_mode);
93 #ifdef PUSH_ROUNDING
94 static void emit_single_push_insn (machine_mode, rtx, tree);
95 #endif
96 static void do_tablejump (rtx, machine_mode, rtx, rtx, rtx,
97                           profile_probability);
98 static rtx const_vector_from_tree (tree);
99 static rtx const_scalar_mask_from_tree (scalar_int_mode, tree);
100 static tree tree_expr_size (const_tree);
101 static HOST_WIDE_INT int_expr_size (tree);
102 static void convert_mode_scalar (rtx, rtx, int);
103
104 \f
105 /* This is run to set up which modes can be used
106    directly in memory and to initialize the block move optab.  It is run
107    at the beginning of compilation and when the target is reinitialized.  */
108
109 void
110 init_expr_target (void)
111 {
112   rtx pat;
113   int num_clobbers;
114   rtx mem, mem1;
115   rtx reg;
116
117   /* Try indexing by frame ptr and try by stack ptr.
118      It is known that on the Convex the stack ptr isn't a valid index.
119      With luck, one or the other is valid on any machine.  */
120   mem = gen_rtx_MEM (word_mode, stack_pointer_rtx);
121   mem1 = gen_rtx_MEM (word_mode, frame_pointer_rtx);
122
123   /* A scratch register we can modify in-place below to avoid
124      useless RTL allocations.  */
125   reg = gen_rtx_REG (word_mode, LAST_VIRTUAL_REGISTER + 1);
126
127   rtx_insn *insn = as_a<rtx_insn *> (rtx_alloc (INSN));
128   pat = gen_rtx_SET (NULL_RTX, NULL_RTX);
129   PATTERN (insn) = pat;
130
131   for (machine_mode mode = VOIDmode; (int) mode < NUM_MACHINE_MODES;
132        mode = (machine_mode) ((int) mode + 1))
133     {
134       int regno;
135
136       direct_load[(int) mode] = direct_store[(int) mode] = 0;
137       PUT_MODE (mem, mode);
138       PUT_MODE (mem1, mode);
139
140       /* See if there is some register that can be used in this mode and
141          directly loaded or stored from memory.  */
142
143       if (mode != VOIDmode && mode != BLKmode)
144         for (regno = 0; regno < FIRST_PSEUDO_REGISTER
145              && (direct_load[(int) mode] == 0 || direct_store[(int) mode] == 0);
146              regno++)
147           {
148             if (!targetm.hard_regno_mode_ok (regno, mode))
149               continue;
150
151             set_mode_and_regno (reg, mode, regno);
152
153             SET_SRC (pat) = mem;
154             SET_DEST (pat) = reg;
155             if (recog (pat, insn, &num_clobbers) >= 0)
156               direct_load[(int) mode] = 1;
157
158             SET_SRC (pat) = mem1;
159             SET_DEST (pat) = reg;
160             if (recog (pat, insn, &num_clobbers) >= 0)
161               direct_load[(int) mode] = 1;
162
163             SET_SRC (pat) = reg;
164             SET_DEST (pat) = mem;
165             if (recog (pat, insn, &num_clobbers) >= 0)
166               direct_store[(int) mode] = 1;
167
168             SET_SRC (pat) = reg;
169             SET_DEST (pat) = mem1;
170             if (recog (pat, insn, &num_clobbers) >= 0)
171               direct_store[(int) mode] = 1;
172           }
173     }
174
175   mem = gen_rtx_MEM (VOIDmode, gen_raw_REG (Pmode, LAST_VIRTUAL_REGISTER + 1));
176
177   opt_scalar_float_mode mode_iter;
178   FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_FLOAT)
179     {
180       scalar_float_mode mode = mode_iter.require ();
181       scalar_float_mode srcmode;
182       FOR_EACH_MODE_UNTIL (srcmode, mode)
183         {
184           enum insn_code ic;
185
186           ic = can_extend_p (mode, srcmode, 0);
187           if (ic == CODE_FOR_nothing)
188             continue;
189
190           PUT_MODE (mem, srcmode);
191
192           if (insn_operand_matches (ic, 1, mem))
193             float_extend_from_mem[mode][srcmode] = true;
194         }
195     }
196 }
197
198 /* This is run at the start of compiling a function.  */
199
200 void
201 init_expr (void)
202 {
203   memset (&crtl->expr, 0, sizeof (crtl->expr));
204 }
205 \f
206 /* Copy data from FROM to TO, where the machine modes are not the same.
207    Both modes may be integer, or both may be floating, or both may be
208    fixed-point.
209    UNSIGNEDP should be nonzero if FROM is an unsigned type.
210    This causes zero-extension instead of sign-extension.  */
211
212 void
213 convert_move (rtx to, rtx from, int unsignedp)
214 {
215   machine_mode to_mode = GET_MODE (to);
216   machine_mode from_mode = GET_MODE (from);
217
218   gcc_assert (to_mode != BLKmode);
219   gcc_assert (from_mode != BLKmode);
220
221   /* If the source and destination are already the same, then there's
222      nothing to do.  */
223   if (to == from)
224     return;
225
226   /* If FROM is a SUBREG that indicates that we have already done at least
227      the required extension, strip it.  We don't handle such SUBREGs as
228      TO here.  */
229
230   scalar_int_mode to_int_mode;
231   if (GET_CODE (from) == SUBREG
232       && SUBREG_PROMOTED_VAR_P (from)
233       && is_a <scalar_int_mode> (to_mode, &to_int_mode)
234       && (GET_MODE_PRECISION (subreg_promoted_mode (from))
235           >= GET_MODE_PRECISION (to_int_mode))
236       && SUBREG_CHECK_PROMOTED_SIGN (from, unsignedp))
237     {
238       from = gen_lowpart (to_int_mode, SUBREG_REG (from));
239       from_mode = to_int_mode;
240     }
241
242   gcc_assert (GET_CODE (to) != SUBREG || !SUBREG_PROMOTED_VAR_P (to));
243
244   if (to_mode == from_mode
245       || (from_mode == VOIDmode && CONSTANT_P (from)))
246     {
247       emit_move_insn (to, from);
248       return;
249     }
250
251   if (VECTOR_MODE_P (to_mode) || VECTOR_MODE_P (from_mode))
252     {
253       if (GET_MODE_UNIT_PRECISION (to_mode)
254           > GET_MODE_UNIT_PRECISION (from_mode))
255         {
256           optab op = unsignedp ? zext_optab : sext_optab;
257           insn_code icode = convert_optab_handler (op, to_mode, from_mode);
258           if (icode != CODE_FOR_nothing)
259             {
260               emit_unop_insn (icode, to, from,
261                               unsignedp ? ZERO_EXTEND : SIGN_EXTEND);
262               return;
263             }
264         }
265
266       if (GET_MODE_UNIT_PRECISION (to_mode)
267           < GET_MODE_UNIT_PRECISION (from_mode))
268         {
269           insn_code icode = convert_optab_handler (trunc_optab,
270                                                    to_mode, from_mode);
271           if (icode != CODE_FOR_nothing)
272             {
273               emit_unop_insn (icode, to, from, TRUNCATE);
274               return;
275             }
276         }
277
278       gcc_assert (known_eq (GET_MODE_BITSIZE (from_mode),
279                             GET_MODE_BITSIZE (to_mode)));
280
281       if (VECTOR_MODE_P (to_mode))
282         from = simplify_gen_subreg (to_mode, from, GET_MODE (from), 0);
283       else
284         to = simplify_gen_subreg (from_mode, to, GET_MODE (to), 0);
285
286       emit_move_insn (to, from);
287       return;
288     }
289
290   if (GET_CODE (to) == CONCAT && GET_CODE (from) == CONCAT)
291     {
292       convert_move (XEXP (to, 0), XEXP (from, 0), unsignedp);
293       convert_move (XEXP (to, 1), XEXP (from, 1), unsignedp);
294       return;
295     }
296
297   convert_mode_scalar (to, from, unsignedp);
298 }
299
300 /* Like convert_move, but deals only with scalar modes.  */
301
302 static void
303 convert_mode_scalar (rtx to, rtx from, int unsignedp)
304 {
305   /* Both modes should be scalar types.  */
306   scalar_mode from_mode = as_a <scalar_mode> (GET_MODE (from));
307   scalar_mode to_mode = as_a <scalar_mode> (GET_MODE (to));
308   bool to_real = SCALAR_FLOAT_MODE_P (to_mode);
309   bool from_real = SCALAR_FLOAT_MODE_P (from_mode);
310   enum insn_code code;
311   rtx libcall;
312
313   gcc_assert (to_real == from_real);
314
315   /* rtx code for making an equivalent value.  */
316   enum rtx_code equiv_code = (unsignedp < 0 ? UNKNOWN
317                               : (unsignedp ? ZERO_EXTEND : SIGN_EXTEND));
318
319   if (to_real)
320     {
321       rtx value;
322       rtx_insn *insns;
323       convert_optab tab;
324
325       gcc_assert ((GET_MODE_PRECISION (from_mode)
326                    != GET_MODE_PRECISION (to_mode))
327                   || (DECIMAL_FLOAT_MODE_P (from_mode)
328                       != DECIMAL_FLOAT_MODE_P (to_mode)));
329
330       if (GET_MODE_PRECISION (from_mode) == GET_MODE_PRECISION (to_mode))
331         /* Conversion between decimal float and binary float, same size.  */
332         tab = DECIMAL_FLOAT_MODE_P (from_mode) ? trunc_optab : sext_optab;
333       else if (GET_MODE_PRECISION (from_mode) < GET_MODE_PRECISION (to_mode))
334         tab = sext_optab;
335       else
336         tab = trunc_optab;
337
338       /* Try converting directly if the insn is supported.  */
339
340       code = convert_optab_handler (tab, to_mode, from_mode);
341       if (code != CODE_FOR_nothing)
342         {
343           emit_unop_insn (code, to, from,
344                           tab == sext_optab ? FLOAT_EXTEND : FLOAT_TRUNCATE);
345           return;
346         }
347
348       /* Otherwise use a libcall.  */
349       libcall = convert_optab_libfunc (tab, to_mode, from_mode);
350
351       /* Is this conversion implemented yet?  */
352       gcc_assert (libcall);
353
354       start_sequence ();
355       value = emit_library_call_value (libcall, NULL_RTX, LCT_CONST, to_mode,
356                                        from, from_mode);
357       insns = get_insns ();
358       end_sequence ();
359       emit_libcall_block (insns, to, value,
360                           tab == trunc_optab ? gen_rtx_FLOAT_TRUNCATE (to_mode,
361                                                                        from)
362                           : gen_rtx_FLOAT_EXTEND (to_mode, from));
363       return;
364     }
365
366   /* Handle pointer conversion.  */                     /* SPEE 900220.  */
367   /* If the target has a converter from FROM_MODE to TO_MODE, use it.  */
368   {
369     convert_optab ctab;
370
371     if (GET_MODE_PRECISION (from_mode) > GET_MODE_PRECISION (to_mode))
372       ctab = trunc_optab;
373     else if (unsignedp)
374       ctab = zext_optab;
375     else
376       ctab = sext_optab;
377
378     if (convert_optab_handler (ctab, to_mode, from_mode)
379         != CODE_FOR_nothing)
380       {
381         emit_unop_insn (convert_optab_handler (ctab, to_mode, from_mode),
382                         to, from, UNKNOWN);
383         return;
384       }
385   }
386
387   /* Targets are expected to provide conversion insns between PxImode and
388      xImode for all MODE_PARTIAL_INT modes they use, but no others.  */
389   if (GET_MODE_CLASS (to_mode) == MODE_PARTIAL_INT)
390     {
391       scalar_int_mode full_mode
392         = smallest_int_mode_for_size (GET_MODE_BITSIZE (to_mode));
393
394       gcc_assert (convert_optab_handler (trunc_optab, to_mode, full_mode)
395                   != CODE_FOR_nothing);
396
397       if (full_mode != from_mode)
398         from = convert_to_mode (full_mode, from, unsignedp);
399       emit_unop_insn (convert_optab_handler (trunc_optab, to_mode, full_mode),
400                       to, from, UNKNOWN);
401       return;
402     }
403   if (GET_MODE_CLASS (from_mode) == MODE_PARTIAL_INT)
404     {
405       rtx new_from;
406       scalar_int_mode full_mode
407         = smallest_int_mode_for_size (GET_MODE_BITSIZE (from_mode));
408       convert_optab ctab = unsignedp ? zext_optab : sext_optab;
409       enum insn_code icode;
410
411       icode = convert_optab_handler (ctab, full_mode, from_mode);
412       gcc_assert (icode != CODE_FOR_nothing);
413
414       if (to_mode == full_mode)
415         {
416           emit_unop_insn (icode, to, from, UNKNOWN);
417           return;
418         }
419
420       new_from = gen_reg_rtx (full_mode);
421       emit_unop_insn (icode, new_from, from, UNKNOWN);
422
423       /* else proceed to integer conversions below.  */
424       from_mode = full_mode;
425       from = new_from;
426     }
427
428    /* Make sure both are fixed-point modes or both are not.  */
429    gcc_assert (ALL_SCALAR_FIXED_POINT_MODE_P (from_mode) ==
430                ALL_SCALAR_FIXED_POINT_MODE_P (to_mode));
431    if (ALL_SCALAR_FIXED_POINT_MODE_P (from_mode))
432     {
433       /* If we widen from_mode to to_mode and they are in the same class,
434          we won't saturate the result.
435          Otherwise, always saturate the result to play safe.  */
436       if (GET_MODE_CLASS (from_mode) == GET_MODE_CLASS (to_mode)
437           && GET_MODE_SIZE (from_mode) < GET_MODE_SIZE (to_mode))
438         expand_fixed_convert (to, from, 0, 0);
439       else
440         expand_fixed_convert (to, from, 0, 1);
441       return;
442     }
443
444   /* Now both modes are integers.  */
445
446   /* Handle expanding beyond a word.  */
447   if (GET_MODE_PRECISION (from_mode) < GET_MODE_PRECISION (to_mode)
448       && GET_MODE_PRECISION (to_mode) > BITS_PER_WORD)
449     {
450       rtx_insn *insns;
451       rtx lowpart;
452       rtx fill_value;
453       rtx lowfrom;
454       int i;
455       scalar_mode lowpart_mode;
456       int nwords = CEIL (GET_MODE_SIZE (to_mode), UNITS_PER_WORD);
457
458       /* Try converting directly if the insn is supported.  */
459       if ((code = can_extend_p (to_mode, from_mode, unsignedp))
460           != CODE_FOR_nothing)
461         {
462           /* If FROM is a SUBREG, put it into a register.  Do this
463              so that we always generate the same set of insns for
464              better cse'ing; if an intermediate assignment occurred,
465              we won't be doing the operation directly on the SUBREG.  */
466           if (optimize > 0 && GET_CODE (from) == SUBREG)
467             from = force_reg (from_mode, from);
468           emit_unop_insn (code, to, from, equiv_code);
469           return;
470         }
471       /* Next, try converting via full word.  */
472       else if (GET_MODE_PRECISION (from_mode) < BITS_PER_WORD
473                && ((code = can_extend_p (to_mode, word_mode, unsignedp))
474                    != CODE_FOR_nothing))
475         {
476           rtx word_to = gen_reg_rtx (word_mode);
477           if (REG_P (to))
478             {
479               if (reg_overlap_mentioned_p (to, from))
480                 from = force_reg (from_mode, from);
481               emit_clobber (to);
482             }
483           convert_move (word_to, from, unsignedp);
484           emit_unop_insn (code, to, word_to, equiv_code);
485           return;
486         }
487
488       /* No special multiword conversion insn; do it by hand.  */
489       start_sequence ();
490
491       /* Since we will turn this into a no conflict block, we must ensure
492          the source does not overlap the target so force it into an isolated
493          register when maybe so.  Likewise for any MEM input, since the
494          conversion sequence might require several references to it and we
495          must ensure we're getting the same value every time.  */
496
497       if (MEM_P (from) || reg_overlap_mentioned_p (to, from))
498         from = force_reg (from_mode, from);
499
500       /* Get a copy of FROM widened to a word, if necessary.  */
501       if (GET_MODE_PRECISION (from_mode) < BITS_PER_WORD)
502         lowpart_mode = word_mode;
503       else
504         lowpart_mode = from_mode;
505
506       lowfrom = convert_to_mode (lowpart_mode, from, unsignedp);
507
508       lowpart = gen_lowpart (lowpart_mode, to);
509       emit_move_insn (lowpart, lowfrom);
510
511       /* Compute the value to put in each remaining word.  */
512       if (unsignedp)
513         fill_value = const0_rtx;
514       else
515         fill_value = emit_store_flag_force (gen_reg_rtx (word_mode),
516                                             LT, lowfrom, const0_rtx,
517                                             lowpart_mode, 0, -1);
518
519       /* Fill the remaining words.  */
520       for (i = GET_MODE_SIZE (lowpart_mode) / UNITS_PER_WORD; i < nwords; i++)
521         {
522           int index = (WORDS_BIG_ENDIAN ? nwords - i - 1 : i);
523           rtx subword = operand_subword (to, index, 1, to_mode);
524
525           gcc_assert (subword);
526
527           if (fill_value != subword)
528             emit_move_insn (subword, fill_value);
529         }
530
531       insns = get_insns ();
532       end_sequence ();
533
534       emit_insn (insns);
535       return;
536     }
537
538   /* Truncating multi-word to a word or less.  */
539   if (GET_MODE_PRECISION (from_mode) > BITS_PER_WORD
540       && GET_MODE_PRECISION (to_mode) <= BITS_PER_WORD)
541     {
542       if (!((MEM_P (from)
543              && ! MEM_VOLATILE_P (from)
544              && direct_load[(int) to_mode]
545              && ! mode_dependent_address_p (XEXP (from, 0),
546                                             MEM_ADDR_SPACE (from)))
547             || REG_P (from)
548             || GET_CODE (from) == SUBREG))
549         from = force_reg (from_mode, from);
550       convert_move (to, gen_lowpart (word_mode, from), 0);
551       return;
552     }
553
554   /* Now follow all the conversions between integers
555      no more than a word long.  */
556
557   /* For truncation, usually we can just refer to FROM in a narrower mode.  */
558   if (GET_MODE_BITSIZE (to_mode) < GET_MODE_BITSIZE (from_mode)
559       && TRULY_NOOP_TRUNCATION_MODES_P (to_mode, from_mode))
560     {
561       if (!((MEM_P (from)
562              && ! MEM_VOLATILE_P (from)
563              && direct_load[(int) to_mode]
564              && ! mode_dependent_address_p (XEXP (from, 0),
565                                             MEM_ADDR_SPACE (from)))
566             || REG_P (from)
567             || GET_CODE (from) == SUBREG))
568         from = force_reg (from_mode, from);
569       if (REG_P (from) && REGNO (from) < FIRST_PSEUDO_REGISTER
570           && !targetm.hard_regno_mode_ok (REGNO (from), to_mode))
571         from = copy_to_reg (from);
572       emit_move_insn (to, gen_lowpart (to_mode, from));
573       return;
574     }
575
576   /* Handle extension.  */
577   if (GET_MODE_PRECISION (to_mode) > GET_MODE_PRECISION (from_mode))
578     {
579       /* Convert directly if that works.  */
580       if ((code = can_extend_p (to_mode, from_mode, unsignedp))
581           != CODE_FOR_nothing)
582         {
583           emit_unop_insn (code, to, from, equiv_code);
584           return;
585         }
586       else
587         {
588           rtx tmp;
589           int shift_amount;
590
591           /* Search for a mode to convert via.  */
592           opt_scalar_mode intermediate_iter;
593           FOR_EACH_MODE_FROM (intermediate_iter, from_mode)
594             {
595               scalar_mode intermediate = intermediate_iter.require ();
596               if (((can_extend_p (to_mode, intermediate, unsignedp)
597                     != CODE_FOR_nothing)
598                    || (GET_MODE_SIZE (to_mode) < GET_MODE_SIZE (intermediate)
599                        && TRULY_NOOP_TRUNCATION_MODES_P (to_mode,
600                                                          intermediate)))
601                   && (can_extend_p (intermediate, from_mode, unsignedp)
602                       != CODE_FOR_nothing))
603                 {
604                   convert_move (to, convert_to_mode (intermediate, from,
605                                                      unsignedp), unsignedp);
606                   return;
607                 }
608             }
609
610           /* No suitable intermediate mode.
611              Generate what we need with shifts.  */
612           shift_amount = (GET_MODE_PRECISION (to_mode)
613                           - GET_MODE_PRECISION (from_mode));
614           from = gen_lowpart (to_mode, force_reg (from_mode, from));
615           tmp = expand_shift (LSHIFT_EXPR, to_mode, from, shift_amount,
616                               to, unsignedp);
617           tmp = expand_shift (RSHIFT_EXPR, to_mode, tmp, shift_amount,
618                               to, unsignedp);
619           if (tmp != to)
620             emit_move_insn (to, tmp);
621           return;
622         }
623     }
624
625   /* Support special truncate insns for certain modes.  */
626   if (convert_optab_handler (trunc_optab, to_mode,
627                              from_mode) != CODE_FOR_nothing)
628     {
629       emit_unop_insn (convert_optab_handler (trunc_optab, to_mode, from_mode),
630                       to, from, UNKNOWN);
631       return;
632     }
633
634   /* Handle truncation of volatile memrefs, and so on;
635      the things that couldn't be truncated directly,
636      and for which there was no special instruction.
637
638      ??? Code above formerly short-circuited this, for most integer
639      mode pairs, with a force_reg in from_mode followed by a recursive
640      call to this routine.  Appears always to have been wrong.  */
641   if (GET_MODE_PRECISION (to_mode) < GET_MODE_PRECISION (from_mode))
642     {
643       rtx temp = force_reg (to_mode, gen_lowpart (to_mode, from));
644       emit_move_insn (to, temp);
645       return;
646     }
647
648   /* Mode combination is not recognized.  */
649   gcc_unreachable ();
650 }
651
652 /* Return an rtx for a value that would result
653    from converting X to mode MODE.
654    Both X and MODE may be floating, or both integer.
655    UNSIGNEDP is nonzero if X is an unsigned value.
656    This can be done by referring to a part of X in place
657    or by copying to a new temporary with conversion.  */
658
659 rtx
660 convert_to_mode (machine_mode mode, rtx x, int unsignedp)
661 {
662   return convert_modes (mode, VOIDmode, x, unsignedp);
663 }
664
665 /* Return an rtx for a value that would result
666    from converting X from mode OLDMODE to mode MODE.
667    Both modes may be floating, or both integer.
668    UNSIGNEDP is nonzero if X is an unsigned value.
669
670    This can be done by referring to a part of X in place
671    or by copying to a new temporary with conversion.
672
673    You can give VOIDmode for OLDMODE, if you are sure X has a nonvoid mode.  */
674
675 rtx
676 convert_modes (machine_mode mode, machine_mode oldmode, rtx x, int unsignedp)
677 {
678   rtx temp;
679   scalar_int_mode int_mode;
680
681   /* If FROM is a SUBREG that indicates that we have already done at least
682      the required extension, strip it.  */
683
684   if (GET_CODE (x) == SUBREG
685       && SUBREG_PROMOTED_VAR_P (x)
686       && is_a <scalar_int_mode> (mode, &int_mode)
687       && (GET_MODE_PRECISION (subreg_promoted_mode (x))
688           >= GET_MODE_PRECISION (int_mode))
689       && SUBREG_CHECK_PROMOTED_SIGN (x, unsignedp))
690     x = gen_lowpart (int_mode, SUBREG_REG (x));
691
692   if (GET_MODE (x) != VOIDmode)
693     oldmode = GET_MODE (x);
694
695   if (mode == oldmode)
696     return x;
697
698   if (CONST_SCALAR_INT_P (x)
699       && is_int_mode (mode, &int_mode))
700     {
701       /* If the caller did not tell us the old mode, then there is not
702          much to do with respect to canonicalization.  We have to
703          assume that all the bits are significant.  */
704       if (GET_MODE_CLASS (oldmode) != MODE_INT)
705         oldmode = MAX_MODE_INT;
706       wide_int w = wide_int::from (rtx_mode_t (x, oldmode),
707                                    GET_MODE_PRECISION (int_mode),
708                                    unsignedp ? UNSIGNED : SIGNED);
709       return immed_wide_int_const (w, int_mode);
710     }
711
712   /* We can do this with a gen_lowpart if both desired and current modes
713      are integer, and this is either a constant integer, a register, or a
714      non-volatile MEM. */
715   scalar_int_mode int_oldmode;
716   if (is_int_mode (mode, &int_mode)
717       && is_int_mode (oldmode, &int_oldmode)
718       && GET_MODE_PRECISION (int_mode) <= GET_MODE_PRECISION (int_oldmode)
719       && ((MEM_P (x) && !MEM_VOLATILE_P (x) && direct_load[(int) int_mode])
720           || CONST_POLY_INT_P (x)
721           || (REG_P (x)
722               && (!HARD_REGISTER_P (x)
723                   || targetm.hard_regno_mode_ok (REGNO (x), int_mode))
724               && TRULY_NOOP_TRUNCATION_MODES_P (int_mode, GET_MODE (x)))))
725    return gen_lowpart (int_mode, x);
726
727   /* Converting from integer constant into mode is always equivalent to an
728      subreg operation.  */
729   if (VECTOR_MODE_P (mode) && GET_MODE (x) == VOIDmode)
730     {
731       gcc_assert (known_eq (GET_MODE_BITSIZE (mode),
732                             GET_MODE_BITSIZE (oldmode)));
733       return simplify_gen_subreg (mode, x, oldmode, 0);
734     }
735
736   temp = gen_reg_rtx (mode);
737   convert_move (temp, x, unsignedp);
738   return temp;
739 }
740 \f
741 /* Return the largest alignment we can use for doing a move (or store)
742    of MAX_PIECES.  ALIGN is the largest alignment we could use.  */
743
744 static unsigned int
745 alignment_for_piecewise_move (unsigned int max_pieces, unsigned int align)
746 {
747   scalar_int_mode tmode
748     = int_mode_for_size (max_pieces * BITS_PER_UNIT, 1).require ();
749
750   if (align >= GET_MODE_ALIGNMENT (tmode))
751     align = GET_MODE_ALIGNMENT (tmode);
752   else
753     {
754       scalar_int_mode xmode = NARROWEST_INT_MODE;
755       opt_scalar_int_mode mode_iter;
756       FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_INT)
757         {
758           tmode = mode_iter.require ();
759           if (GET_MODE_SIZE (tmode) > max_pieces
760               || targetm.slow_unaligned_access (tmode, align))
761             break;
762           xmode = tmode;
763         }
764
765       align = MAX (align, GET_MODE_ALIGNMENT (xmode));
766     }
767
768   return align;
769 }
770
771 /* Return the widest integer mode that is narrower than SIZE bytes.  */
772
773 static scalar_int_mode
774 widest_int_mode_for_size (unsigned int size)
775 {
776   scalar_int_mode result = NARROWEST_INT_MODE;
777
778   gcc_checking_assert (size > 1);
779
780   opt_scalar_int_mode tmode;
781   FOR_EACH_MODE_IN_CLASS (tmode, MODE_INT)
782     if (GET_MODE_SIZE (tmode.require ()) < size)
783       result = tmode.require ();
784
785   return result;
786 }
787
788 /* Determine whether an operation OP on LEN bytes with alignment ALIGN can
789    and should be performed piecewise.  */
790
791 static bool
792 can_do_by_pieces (unsigned HOST_WIDE_INT len, unsigned int align,
793                   enum by_pieces_operation op)
794 {
795   return targetm.use_by_pieces_infrastructure_p (len, align, op,
796                                                  optimize_insn_for_speed_p ());
797 }
798
799 /* Determine whether the LEN bytes can be moved by using several move
800    instructions.  Return nonzero if a call to move_by_pieces should
801    succeed.  */
802
803 bool
804 can_move_by_pieces (unsigned HOST_WIDE_INT len, unsigned int align)
805 {
806   return can_do_by_pieces (len, align, MOVE_BY_PIECES);
807 }
808
809 /* Return number of insns required to perform operation OP by pieces
810    for L bytes.  ALIGN (in bits) is maximum alignment we can assume.  */
811
812 unsigned HOST_WIDE_INT
813 by_pieces_ninsns (unsigned HOST_WIDE_INT l, unsigned int align,
814                   unsigned int max_size, by_pieces_operation op)
815 {
816   unsigned HOST_WIDE_INT n_insns = 0;
817
818   align = alignment_for_piecewise_move (MOVE_MAX_PIECES, align);
819
820   while (max_size > 1 && l > 0)
821     {
822       scalar_int_mode mode = widest_int_mode_for_size (max_size);
823       enum insn_code icode;
824
825       unsigned int modesize = GET_MODE_SIZE (mode);
826
827       icode = optab_handler (mov_optab, mode);
828       if (icode != CODE_FOR_nothing && align >= GET_MODE_ALIGNMENT (mode))
829         {
830           unsigned HOST_WIDE_INT n_pieces = l / modesize;
831           l %= modesize;
832           switch (op)
833             {
834             default:
835               n_insns += n_pieces;
836               break;
837
838             case COMPARE_BY_PIECES:
839               int batch = targetm.compare_by_pieces_branch_ratio (mode);
840               int batch_ops = 4 * batch - 1;
841               unsigned HOST_WIDE_INT full = n_pieces / batch;
842               n_insns += full * batch_ops;
843               if (n_pieces % batch != 0)
844                 n_insns++;
845               break;
846
847             }
848         }
849       max_size = modesize;
850     }
851
852   gcc_assert (!l);
853   return n_insns;
854 }
855
856 /* Used when performing piecewise block operations, holds information
857    about one of the memory objects involved.  The member functions
858    can be used to generate code for loading from the object and
859    updating the address when iterating.  */
860
861 class pieces_addr
862 {
863   /* The object being referenced, a MEM.  Can be NULL_RTX to indicate
864      stack pushes.  */
865   rtx m_obj;
866   /* The address of the object.  Can differ from that seen in the
867      MEM rtx if we copied the address to a register.  */
868   rtx m_addr;
869   /* Nonzero if the address on the object has an autoincrement already,
870      signifies whether that was an increment or decrement.  */
871   signed char m_addr_inc;
872   /* Nonzero if we intend to use autoinc without the address already
873      having autoinc form.  We will insert add insns around each memory
874      reference, expecting later passes to form autoinc addressing modes.
875      The only supported options are predecrement and postincrement.  */
876   signed char m_explicit_inc;
877   /* True if we have either of the two possible cases of using
878      autoincrement.  */
879   bool m_auto;
880   /* True if this is an address to be used for load operations rather
881      than stores.  */
882   bool m_is_load;
883
884   /* Optionally, a function to obtain constants for any given offset into
885      the objects, and data associated with it.  */
886   by_pieces_constfn m_constfn;
887   void *m_cfndata;
888 public:
889   pieces_addr (rtx, bool, by_pieces_constfn, void *);
890   rtx adjust (scalar_int_mode, HOST_WIDE_INT);
891   void increment_address (HOST_WIDE_INT);
892   void maybe_predec (HOST_WIDE_INT);
893   void maybe_postinc (HOST_WIDE_INT);
894   void decide_autoinc (machine_mode, bool, HOST_WIDE_INT);
895   int get_addr_inc ()
896   {
897     return m_addr_inc;
898   }
899 };
900
901 /* Initialize a pieces_addr structure from an object OBJ.  IS_LOAD is
902    true if the operation to be performed on this object is a load
903    rather than a store.  For stores, OBJ can be NULL, in which case we
904    assume the operation is a stack push.  For loads, the optional
905    CONSTFN and its associated CFNDATA can be used in place of the
906    memory load.  */
907
908 pieces_addr::pieces_addr (rtx obj, bool is_load, by_pieces_constfn constfn,
909                           void *cfndata)
910   : m_obj (obj), m_is_load (is_load), m_constfn (constfn), m_cfndata (cfndata)
911 {
912   m_addr_inc = 0;
913   m_auto = false;
914   if (obj)
915     {
916       rtx addr = XEXP (obj, 0);
917       rtx_code code = GET_CODE (addr);
918       m_addr = addr;
919       bool dec = code == PRE_DEC || code == POST_DEC;
920       bool inc = code == PRE_INC || code == POST_INC;
921       m_auto = inc || dec;
922       if (m_auto)
923         m_addr_inc = dec ? -1 : 1;
924
925       /* While we have always looked for these codes here, the code
926          implementing the memory operation has never handled them.
927          Support could be added later if necessary or beneficial.  */
928       gcc_assert (code != PRE_INC && code != POST_DEC);
929     }
930   else
931     {
932       m_addr = NULL_RTX;
933       if (!is_load)
934         {
935           m_auto = true;
936           if (STACK_GROWS_DOWNWARD)
937             m_addr_inc = -1;
938           else
939             m_addr_inc = 1;
940         }
941       else
942         gcc_assert (constfn != NULL);
943     }
944   m_explicit_inc = 0;
945   if (constfn)
946     gcc_assert (is_load);
947 }
948
949 /* Decide whether to use autoinc for an address involved in a memory op.
950    MODE is the mode of the accesses, REVERSE is true if we've decided to
951    perform the operation starting from the end, and LEN is the length of
952    the operation.  Don't override an earlier decision to set m_auto.  */
953
954 void
955 pieces_addr::decide_autoinc (machine_mode ARG_UNUSED (mode), bool reverse,
956                              HOST_WIDE_INT len)
957 {
958   if (m_auto || m_obj == NULL_RTX)
959     return;
960
961   bool use_predec = (m_is_load
962                      ? USE_LOAD_PRE_DECREMENT (mode)
963                      : USE_STORE_PRE_DECREMENT (mode));
964   bool use_postinc = (m_is_load
965                       ? USE_LOAD_POST_INCREMENT (mode)
966                       : USE_STORE_POST_INCREMENT (mode));
967   machine_mode addr_mode = get_address_mode (m_obj);
968
969   if (use_predec && reverse)
970     {
971       m_addr = copy_to_mode_reg (addr_mode,
972                                  plus_constant (addr_mode,
973                                                 m_addr, len));
974       m_auto = true;
975       m_explicit_inc = -1;
976     }
977   else if (use_postinc && !reverse)
978     {
979       m_addr = copy_to_mode_reg (addr_mode, m_addr);
980       m_auto = true;
981       m_explicit_inc = 1;
982     }
983   else if (CONSTANT_P (m_addr))
984     m_addr = copy_to_mode_reg (addr_mode, m_addr);
985 }
986
987 /* Adjust the address to refer to the data at OFFSET in MODE.  If we
988    are using autoincrement for this address, we don't add the offset,
989    but we still modify the MEM's properties.  */
990
991 rtx
992 pieces_addr::adjust (scalar_int_mode mode, HOST_WIDE_INT offset)
993 {
994   if (m_constfn)
995     return m_constfn (m_cfndata, offset, mode);
996   if (m_obj == NULL_RTX)
997     return NULL_RTX;
998   if (m_auto)
999     return adjust_automodify_address (m_obj, mode, m_addr, offset);
1000   else
1001     return adjust_address (m_obj, mode, offset);
1002 }
1003
1004 /* Emit an add instruction to increment the address by SIZE.  */
1005
1006 void
1007 pieces_addr::increment_address (HOST_WIDE_INT size)
1008 {
1009   rtx amount = gen_int_mode (size, GET_MODE (m_addr));
1010   emit_insn (gen_add2_insn (m_addr, amount));
1011 }
1012
1013 /* If we are supposed to decrement the address after each access, emit code
1014    to do so now.  Increment by SIZE (which has should have the correct sign
1015    already).  */
1016
1017 void
1018 pieces_addr::maybe_predec (HOST_WIDE_INT size)
1019 {
1020   if (m_explicit_inc >= 0)
1021     return;
1022   gcc_assert (HAVE_PRE_DECREMENT);
1023   increment_address (size);
1024 }
1025
1026 /* If we are supposed to decrement the address after each access, emit code
1027    to do so now.  Increment by SIZE.  */
1028
1029 void
1030 pieces_addr::maybe_postinc (HOST_WIDE_INT size)
1031 {
1032   if (m_explicit_inc <= 0)
1033     return;
1034   gcc_assert (HAVE_POST_INCREMENT);
1035   increment_address (size);
1036 }
1037
1038 /* This structure is used by do_op_by_pieces to describe the operation
1039    to be performed.  */
1040
1041 class op_by_pieces_d
1042 {
1043  protected:
1044   pieces_addr m_to, m_from;
1045   unsigned HOST_WIDE_INT m_len;
1046   HOST_WIDE_INT m_offset;
1047   unsigned int m_align;
1048   unsigned int m_max_size;
1049   bool m_reverse;
1050
1051   /* Virtual functions, overriden by derived classes for the specific
1052      operation.  */
1053   virtual void generate (rtx, rtx, machine_mode) = 0;
1054   virtual bool prepare_mode (machine_mode, unsigned int) = 0;
1055   virtual void finish_mode (machine_mode)
1056   {
1057   }
1058
1059  public:
1060   op_by_pieces_d (rtx, bool, rtx, bool, by_pieces_constfn, void *,
1061                   unsigned HOST_WIDE_INT, unsigned int);
1062   void run ();
1063 };
1064
1065 /* The constructor for an op_by_pieces_d structure.  We require two
1066    objects named TO and FROM, which are identified as loads or stores
1067    by TO_LOAD and FROM_LOAD.  If FROM is a load, the optional FROM_CFN
1068    and its associated FROM_CFN_DATA can be used to replace loads with
1069    constant values.  LEN describes the length of the operation.  */
1070
1071 op_by_pieces_d::op_by_pieces_d (rtx to, bool to_load,
1072                                 rtx from, bool from_load,
1073                                 by_pieces_constfn from_cfn,
1074                                 void *from_cfn_data,
1075                                 unsigned HOST_WIDE_INT len,
1076                                 unsigned int align)
1077   : m_to (to, to_load, NULL, NULL),
1078     m_from (from, from_load, from_cfn, from_cfn_data),
1079     m_len (len), m_max_size (MOVE_MAX_PIECES + 1)
1080 {
1081   int toi = m_to.get_addr_inc ();
1082   int fromi = m_from.get_addr_inc ();
1083   if (toi >= 0 && fromi >= 0)
1084     m_reverse = false;
1085   else if (toi <= 0 && fromi <= 0)
1086     m_reverse = true;
1087   else
1088     gcc_unreachable ();
1089
1090   m_offset = m_reverse ? len : 0;
1091   align = MIN (to ? MEM_ALIGN (to) : align,
1092                from ? MEM_ALIGN (from) : align);
1093
1094   /* If copying requires more than two move insns,
1095      copy addresses to registers (to make displacements shorter)
1096      and use post-increment if available.  */
1097   if (by_pieces_ninsns (len, align, m_max_size, MOVE_BY_PIECES) > 2)
1098     {
1099       /* Find the mode of the largest comparison.  */
1100       scalar_int_mode mode = widest_int_mode_for_size (m_max_size);
1101
1102       m_from.decide_autoinc (mode, m_reverse, len);
1103       m_to.decide_autoinc (mode, m_reverse, len);
1104     }
1105
1106   align = alignment_for_piecewise_move (MOVE_MAX_PIECES, align);
1107   m_align = align;
1108 }
1109
1110 /* This function contains the main loop used for expanding a block
1111    operation.  First move what we can in the largest integer mode,
1112    then go to successively smaller modes.  For every access, call
1113    GENFUN with the two operands and the EXTRA_DATA.  */
1114
1115 void
1116 op_by_pieces_d::run ()
1117 {
1118   while (m_max_size > 1 && m_len > 0)
1119     {
1120       scalar_int_mode mode = widest_int_mode_for_size (m_max_size);
1121
1122       if (prepare_mode (mode, m_align))
1123         {
1124           unsigned int size = GET_MODE_SIZE (mode);
1125           rtx to1 = NULL_RTX, from1;
1126
1127           while (m_len >= size)
1128             {
1129               if (m_reverse)
1130                 m_offset -= size;
1131
1132               to1 = m_to.adjust (mode, m_offset);
1133               from1 = m_from.adjust (mode, m_offset);
1134
1135               m_to.maybe_predec (-(HOST_WIDE_INT)size);
1136               m_from.maybe_predec (-(HOST_WIDE_INT)size);
1137
1138               generate (to1, from1, mode);
1139
1140               m_to.maybe_postinc (size);
1141               m_from.maybe_postinc (size);
1142
1143               if (!m_reverse)
1144                 m_offset += size;
1145
1146               m_len -= size;
1147             }
1148
1149           finish_mode (mode);
1150         }
1151
1152       m_max_size = GET_MODE_SIZE (mode);
1153     }
1154
1155   /* The code above should have handled everything.  */
1156   gcc_assert (!m_len);
1157 }
1158
1159 /* Derived class from op_by_pieces_d, providing support for block move
1160    operations.  */
1161
1162 class move_by_pieces_d : public op_by_pieces_d
1163 {
1164   insn_gen_fn m_gen_fun;
1165   void generate (rtx, rtx, machine_mode);
1166   bool prepare_mode (machine_mode, unsigned int);
1167
1168  public:
1169   move_by_pieces_d (rtx to, rtx from, unsigned HOST_WIDE_INT len,
1170                     unsigned int align)
1171     : op_by_pieces_d (to, false, from, true, NULL, NULL, len, align)
1172   {
1173   }
1174   rtx finish_retmode (memop_ret);
1175 };
1176
1177 /* Return true if MODE can be used for a set of copies, given an
1178    alignment ALIGN.  Prepare whatever data is necessary for later
1179    calls to generate.  */
1180
1181 bool
1182 move_by_pieces_d::prepare_mode (machine_mode mode, unsigned int align)
1183 {
1184   insn_code icode = optab_handler (mov_optab, mode);
1185   m_gen_fun = GEN_FCN (icode);
1186   return icode != CODE_FOR_nothing && align >= GET_MODE_ALIGNMENT (mode);
1187 }
1188
1189 /* A callback used when iterating for a compare_by_pieces_operation.
1190    OP0 and OP1 are the values that have been loaded and should be
1191    compared in MODE.  If OP0 is NULL, this means we should generate a
1192    push; otherwise EXTRA_DATA holds a pointer to a pointer to the insn
1193    gen function that should be used to generate the mode.  */
1194
1195 void
1196 move_by_pieces_d::generate (rtx op0, rtx op1,
1197                             machine_mode mode ATTRIBUTE_UNUSED)
1198 {
1199 #ifdef PUSH_ROUNDING
1200   if (op0 == NULL_RTX)
1201     {
1202       emit_single_push_insn (mode, op1, NULL);
1203       return;
1204     }
1205 #endif
1206   emit_insn (m_gen_fun (op0, op1));
1207 }
1208
1209 /* Perform the final adjustment at the end of a string to obtain the
1210    correct return value for the block operation.
1211    Return value is based on RETMODE argument.  */
1212
1213 rtx
1214 move_by_pieces_d::finish_retmode (memop_ret retmode)
1215 {
1216   gcc_assert (!m_reverse);
1217   if (retmode == RETURN_END_MINUS_ONE)
1218     {
1219       m_to.maybe_postinc (-1);
1220       --m_offset;
1221     }
1222   return m_to.adjust (QImode, m_offset);
1223 }
1224
1225 /* Generate several move instructions to copy LEN bytes from block FROM to
1226    block TO.  (These are MEM rtx's with BLKmode).
1227
1228    If PUSH_ROUNDING is defined and TO is NULL, emit_single_push_insn is
1229    used to push FROM to the stack.
1230
1231    ALIGN is maximum stack alignment we can assume.
1232
1233    Return value is based on RETMODE argument.  */
1234
1235 rtx
1236 move_by_pieces (rtx to, rtx from, unsigned HOST_WIDE_INT len,
1237                 unsigned int align, memop_ret retmode)
1238 {
1239 #ifndef PUSH_ROUNDING
1240   if (to == NULL)
1241     gcc_unreachable ();
1242 #endif
1243
1244   move_by_pieces_d data (to, from, len, align);
1245
1246   data.run ();
1247
1248   if (retmode != RETURN_BEGIN)
1249     return data.finish_retmode (retmode);
1250   else
1251     return to;
1252 }
1253
1254 /* Derived class from op_by_pieces_d, providing support for block move
1255    operations.  */
1256
1257 class store_by_pieces_d : public op_by_pieces_d
1258 {
1259   insn_gen_fn m_gen_fun;
1260   void generate (rtx, rtx, machine_mode);
1261   bool prepare_mode (machine_mode, unsigned int);
1262
1263  public:
1264   store_by_pieces_d (rtx to, by_pieces_constfn cfn, void *cfn_data,
1265                      unsigned HOST_WIDE_INT len, unsigned int align)
1266     : op_by_pieces_d (to, false, NULL_RTX, true, cfn, cfn_data, len, align)
1267   {
1268   }
1269   rtx finish_retmode (memop_ret);
1270 };
1271
1272 /* Return true if MODE can be used for a set of stores, given an
1273    alignment ALIGN.  Prepare whatever data is necessary for later
1274    calls to generate.  */
1275
1276 bool
1277 store_by_pieces_d::prepare_mode (machine_mode mode, unsigned int align)
1278 {
1279   insn_code icode = optab_handler (mov_optab, mode);
1280   m_gen_fun = GEN_FCN (icode);
1281   return icode != CODE_FOR_nothing && align >= GET_MODE_ALIGNMENT (mode);
1282 }
1283
1284 /* A callback used when iterating for a store_by_pieces_operation.
1285    OP0 and OP1 are the values that have been loaded and should be
1286    compared in MODE.  If OP0 is NULL, this means we should generate a
1287    push; otherwise EXTRA_DATA holds a pointer to a pointer to the insn
1288    gen function that should be used to generate the mode.  */
1289
1290 void
1291 store_by_pieces_d::generate (rtx op0, rtx op1, machine_mode)
1292 {
1293   emit_insn (m_gen_fun (op0, op1));
1294 }
1295
1296 /* Perform the final adjustment at the end of a string to obtain the
1297    correct return value for the block operation.
1298    Return value is based on RETMODE argument.  */
1299
1300 rtx
1301 store_by_pieces_d::finish_retmode (memop_ret retmode)
1302 {
1303   gcc_assert (!m_reverse);
1304   if (retmode == RETURN_END_MINUS_ONE)
1305     {
1306       m_to.maybe_postinc (-1);
1307       --m_offset;
1308     }
1309   return m_to.adjust (QImode, m_offset);
1310 }
1311
1312 /* Determine whether the LEN bytes generated by CONSTFUN can be
1313    stored to memory using several move instructions.  CONSTFUNDATA is
1314    a pointer which will be passed as argument in every CONSTFUN call.
1315    ALIGN is maximum alignment we can assume.  MEMSETP is true if this is
1316    a memset operation and false if it's a copy of a constant string.
1317    Return nonzero if a call to store_by_pieces should succeed.  */
1318
1319 int
1320 can_store_by_pieces (unsigned HOST_WIDE_INT len,
1321                      rtx (*constfun) (void *, HOST_WIDE_INT, scalar_int_mode),
1322                      void *constfundata, unsigned int align, bool memsetp)
1323 {
1324   unsigned HOST_WIDE_INT l;
1325   unsigned int max_size;
1326   HOST_WIDE_INT offset = 0;
1327   enum insn_code icode;
1328   int reverse;
1329   /* cst is set but not used if LEGITIMATE_CONSTANT doesn't use it.  */
1330   rtx cst ATTRIBUTE_UNUSED;
1331
1332   if (len == 0)
1333     return 1;
1334
1335   if (!targetm.use_by_pieces_infrastructure_p (len, align,
1336                                                memsetp
1337                                                  ? SET_BY_PIECES
1338                                                  : STORE_BY_PIECES,
1339                                                optimize_insn_for_speed_p ()))
1340     return 0;
1341
1342   align = alignment_for_piecewise_move (STORE_MAX_PIECES, align);
1343
1344   /* We would first store what we can in the largest integer mode, then go to
1345      successively smaller modes.  */
1346
1347   for (reverse = 0;
1348        reverse <= (HAVE_PRE_DECREMENT || HAVE_POST_DECREMENT);
1349        reverse++)
1350     {
1351       l = len;
1352       max_size = STORE_MAX_PIECES + 1;
1353       while (max_size > 1 && l > 0)
1354         {
1355           scalar_int_mode mode = widest_int_mode_for_size (max_size);
1356
1357           icode = optab_handler (mov_optab, mode);
1358           if (icode != CODE_FOR_nothing
1359               && align >= GET_MODE_ALIGNMENT (mode))
1360             {
1361               unsigned int size = GET_MODE_SIZE (mode);
1362
1363               while (l >= size)
1364                 {
1365                   if (reverse)
1366                     offset -= size;
1367
1368                   cst = (*constfun) (constfundata, offset, mode);
1369                   if (!targetm.legitimate_constant_p (mode, cst))
1370                     return 0;
1371
1372                   if (!reverse)
1373                     offset += size;
1374
1375                   l -= size;
1376                 }
1377             }
1378
1379           max_size = GET_MODE_SIZE (mode);
1380         }
1381
1382       /* The code above should have handled everything.  */
1383       gcc_assert (!l);
1384     }
1385
1386   return 1;
1387 }
1388
1389 /* Generate several move instructions to store LEN bytes generated by
1390    CONSTFUN to block TO.  (A MEM rtx with BLKmode).  CONSTFUNDATA is a
1391    pointer which will be passed as argument in every CONSTFUN call.
1392    ALIGN is maximum alignment we can assume.  MEMSETP is true if this is
1393    a memset operation and false if it's a copy of a constant string.
1394    Return value is based on RETMODE argument.  */
1395
1396 rtx
1397 store_by_pieces (rtx to, unsigned HOST_WIDE_INT len,
1398                  rtx (*constfun) (void *, HOST_WIDE_INT, scalar_int_mode),
1399                  void *constfundata, unsigned int align, bool memsetp,
1400                  memop_ret retmode)
1401 {
1402   if (len == 0)
1403     {
1404       gcc_assert (retmode != RETURN_END_MINUS_ONE);
1405       return to;
1406     }
1407
1408   gcc_assert (targetm.use_by_pieces_infrastructure_p
1409                 (len, align,
1410                  memsetp ? SET_BY_PIECES : STORE_BY_PIECES,
1411                  optimize_insn_for_speed_p ()));
1412
1413   store_by_pieces_d data (to, constfun, constfundata, len, align);
1414   data.run ();
1415
1416   if (retmode != RETURN_BEGIN)
1417     return data.finish_retmode (retmode);
1418   else
1419     return to;
1420 }
1421
1422 /* Callback routine for clear_by_pieces.
1423    Return const0_rtx unconditionally.  */
1424
1425 static rtx
1426 clear_by_pieces_1 (void *, HOST_WIDE_INT, scalar_int_mode)
1427 {
1428   return const0_rtx;
1429 }
1430
1431 /* Generate several move instructions to clear LEN bytes of block TO.  (A MEM
1432    rtx with BLKmode).  ALIGN is maximum alignment we can assume.  */
1433
1434 static void
1435 clear_by_pieces (rtx to, unsigned HOST_WIDE_INT len, unsigned int align)
1436 {
1437   if (len == 0)
1438     return;
1439
1440   store_by_pieces_d data (to, clear_by_pieces_1, NULL, len, align);
1441   data.run ();
1442 }
1443
1444 /* Context used by compare_by_pieces_genfn.  It stores the fail label
1445    to jump to in case of miscomparison, and for branch ratios greater than 1,
1446    it stores an accumulator and the current and maximum counts before
1447    emitting another branch.  */
1448
1449 class compare_by_pieces_d : public op_by_pieces_d
1450 {
1451   rtx_code_label *m_fail_label;
1452   rtx m_accumulator;
1453   int m_count, m_batch;
1454
1455   void generate (rtx, rtx, machine_mode);
1456   bool prepare_mode (machine_mode, unsigned int);
1457   void finish_mode (machine_mode);
1458  public:
1459   compare_by_pieces_d (rtx op0, rtx op1, by_pieces_constfn op1_cfn,
1460                        void *op1_cfn_data, HOST_WIDE_INT len, int align,
1461                        rtx_code_label *fail_label)
1462     : op_by_pieces_d (op0, true, op1, true, op1_cfn, op1_cfn_data, len, align)
1463   {
1464     m_fail_label = fail_label;
1465   }
1466 };
1467
1468 /* A callback used when iterating for a compare_by_pieces_operation.
1469    OP0 and OP1 are the values that have been loaded and should be
1470    compared in MODE.  DATA holds a pointer to the compare_by_pieces_data
1471    context structure.  */
1472
1473 void
1474 compare_by_pieces_d::generate (rtx op0, rtx op1, machine_mode mode)
1475 {
1476   if (m_batch > 1)
1477     {
1478       rtx temp = expand_binop (mode, sub_optab, op0, op1, NULL_RTX,
1479                                true, OPTAB_LIB_WIDEN);
1480       if (m_count != 0)
1481         temp = expand_binop (mode, ior_optab, m_accumulator, temp, temp,
1482                              true, OPTAB_LIB_WIDEN);
1483       m_accumulator = temp;
1484
1485       if (++m_count < m_batch)
1486         return;
1487
1488       m_count = 0;
1489       op0 = m_accumulator;
1490       op1 = const0_rtx;
1491       m_accumulator = NULL_RTX;
1492     }
1493   do_compare_rtx_and_jump (op0, op1, NE, true, mode, NULL_RTX, NULL,
1494                            m_fail_label, profile_probability::uninitialized ());
1495 }
1496
1497 /* Return true if MODE can be used for a set of moves and comparisons,
1498    given an alignment ALIGN.  Prepare whatever data is necessary for
1499    later calls to generate.  */
1500
1501 bool
1502 compare_by_pieces_d::prepare_mode (machine_mode mode, unsigned int align)
1503 {
1504   insn_code icode = optab_handler (mov_optab, mode);
1505   if (icode == CODE_FOR_nothing
1506       || align < GET_MODE_ALIGNMENT (mode)
1507       || !can_compare_p (EQ, mode, ccp_jump))
1508     return false;
1509   m_batch = targetm.compare_by_pieces_branch_ratio (mode);
1510   if (m_batch < 0)
1511     return false;
1512   m_accumulator = NULL_RTX;
1513   m_count = 0;
1514   return true;
1515 }
1516
1517 /* Called after expanding a series of comparisons in MODE.  If we have
1518    accumulated results for which we haven't emitted a branch yet, do
1519    so now.  */
1520
1521 void
1522 compare_by_pieces_d::finish_mode (machine_mode mode)
1523 {
1524   if (m_accumulator != NULL_RTX)
1525     do_compare_rtx_and_jump (m_accumulator, const0_rtx, NE, true, mode,
1526                              NULL_RTX, NULL, m_fail_label,
1527                              profile_probability::uninitialized ());
1528 }
1529
1530 /* Generate several move instructions to compare LEN bytes from blocks
1531    ARG0 and ARG1.  (These are MEM rtx's with BLKmode).
1532
1533    If PUSH_ROUNDING is defined and TO is NULL, emit_single_push_insn is
1534    used to push FROM to the stack.
1535
1536    ALIGN is maximum stack alignment we can assume.
1537
1538    Optionally, the caller can pass a constfn and associated data in A1_CFN
1539    and A1_CFN_DATA. describing that the second operand being compared is a
1540    known constant and how to obtain its data.  */
1541
1542 static rtx
1543 compare_by_pieces (rtx arg0, rtx arg1, unsigned HOST_WIDE_INT len,
1544                    rtx target, unsigned int align,
1545                    by_pieces_constfn a1_cfn, void *a1_cfn_data)
1546 {
1547   rtx_code_label *fail_label = gen_label_rtx ();
1548   rtx_code_label *end_label = gen_label_rtx ();
1549
1550   if (target == NULL_RTX
1551       || !REG_P (target) || REGNO (target) < FIRST_PSEUDO_REGISTER)
1552     target = gen_reg_rtx (TYPE_MODE (integer_type_node));
1553
1554   compare_by_pieces_d data (arg0, arg1, a1_cfn, a1_cfn_data, len, align,
1555                             fail_label);
1556
1557   data.run ();
1558
1559   emit_move_insn (target, const0_rtx);
1560   emit_jump (end_label);
1561   emit_barrier ();
1562   emit_label (fail_label);
1563   emit_move_insn (target, const1_rtx);
1564   emit_label (end_label);
1565
1566   return target;
1567 }
1568 \f
1569 /* Emit code to move a block Y to a block X.  This may be done with
1570    string-move instructions, with multiple scalar move instructions,
1571    or with a library call.
1572
1573    Both X and Y must be MEM rtx's (perhaps inside VOLATILE) with mode BLKmode.
1574    SIZE is an rtx that says how long they are.
1575    ALIGN is the maximum alignment we can assume they have.
1576    METHOD describes what kind of copy this is, and what mechanisms may be used.
1577    MIN_SIZE is the minimal size of block to move
1578    MAX_SIZE is the maximal size of block to move, if it cannot be represented
1579    in unsigned HOST_WIDE_INT, than it is mask of all ones.
1580
1581    Return the address of the new block, if memcpy is called and returns it,
1582    0 otherwise.  */
1583
1584 rtx
1585 emit_block_move_hints (rtx x, rtx y, rtx size, enum block_op_methods method,
1586                        unsigned int expected_align, HOST_WIDE_INT expected_size,
1587                        unsigned HOST_WIDE_INT min_size,
1588                        unsigned HOST_WIDE_INT max_size,
1589                        unsigned HOST_WIDE_INT probable_max_size,
1590                        bool bail_out_libcall, bool *is_move_done,
1591                        bool might_overlap)
1592 {
1593   int may_use_call;
1594   rtx retval = 0;
1595   unsigned int align;
1596
1597   if (is_move_done)
1598     *is_move_done = true;
1599
1600   gcc_assert (size);
1601   if (CONST_INT_P (size) && INTVAL (size) == 0)
1602     return 0;
1603
1604   switch (method)
1605     {
1606     case BLOCK_OP_NORMAL:
1607     case BLOCK_OP_TAILCALL:
1608       may_use_call = 1;
1609       break;
1610
1611     case BLOCK_OP_CALL_PARM:
1612       may_use_call = block_move_libcall_safe_for_call_parm ();
1613
1614       /* Make inhibit_defer_pop nonzero around the library call
1615          to force it to pop the arguments right away.  */
1616       NO_DEFER_POP;
1617       break;
1618
1619     case BLOCK_OP_NO_LIBCALL:
1620       may_use_call = 0;
1621       break;
1622
1623     case BLOCK_OP_NO_LIBCALL_RET:
1624       may_use_call = -1;
1625       break;
1626
1627     default:
1628       gcc_unreachable ();
1629     }
1630
1631   gcc_assert (MEM_P (x) && MEM_P (y));
1632   align = MIN (MEM_ALIGN (x), MEM_ALIGN (y));
1633   gcc_assert (align >= BITS_PER_UNIT);
1634
1635   /* Make sure we've got BLKmode addresses; store_one_arg can decide that
1636      block copy is more efficient for other large modes, e.g. DCmode.  */
1637   x = adjust_address (x, BLKmode, 0);
1638   y = adjust_address (y, BLKmode, 0);
1639
1640   /* Set MEM_SIZE as appropriate for this block copy.  The main place this
1641      can be incorrect is coming from __builtin_memcpy.  */
1642   poly_int64 const_size;
1643   if (poly_int_rtx_p (size, &const_size))
1644     {
1645       x = shallow_copy_rtx (x);
1646       y = shallow_copy_rtx (y);
1647       set_mem_size (x, const_size);
1648       set_mem_size (y, const_size);
1649     }
1650
1651   bool pieces_ok = CONST_INT_P (size)
1652     && can_move_by_pieces (INTVAL (size), align);
1653   bool pattern_ok = false;
1654
1655   if (!pieces_ok || might_overlap)
1656     {
1657       pattern_ok
1658         = emit_block_move_via_pattern (x, y, size, align,
1659                                        expected_align, expected_size,
1660                                        min_size, max_size, probable_max_size,
1661                                        might_overlap);
1662       if (!pattern_ok && might_overlap)
1663         {
1664           /* Do not try any of the other methods below as they are not safe
1665              for overlapping moves.  */
1666           *is_move_done = false;
1667           return retval;
1668         }
1669     }
1670
1671   if (pattern_ok)
1672     ;
1673   else if (pieces_ok)
1674     move_by_pieces (x, y, INTVAL (size), align, RETURN_BEGIN);
1675   else if (may_use_call && !might_overlap
1676            && ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (x))
1677            && ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (y)))
1678     {
1679       if (bail_out_libcall)
1680         {
1681           if (is_move_done)
1682             *is_move_done = false;
1683           return retval;
1684         }
1685
1686       if (may_use_call < 0)
1687         return pc_rtx;
1688
1689       retval = emit_block_copy_via_libcall (x, y, size,
1690                                             method == BLOCK_OP_TAILCALL);
1691     }
1692   else if (might_overlap)
1693     *is_move_done = false;
1694   else
1695     emit_block_move_via_loop (x, y, size, align);
1696
1697   if (method == BLOCK_OP_CALL_PARM)
1698     OK_DEFER_POP;
1699
1700   return retval;
1701 }
1702
1703 rtx
1704 emit_block_move (rtx x, rtx y, rtx size, enum block_op_methods method)
1705 {
1706   unsigned HOST_WIDE_INT max, min = 0;
1707   if (GET_CODE (size) == CONST_INT)
1708     min = max = UINTVAL (size);
1709   else
1710     max = GET_MODE_MASK (GET_MODE (size));
1711   return emit_block_move_hints (x, y, size, method, 0, -1,
1712                                 min, max, max);
1713 }
1714
1715 /* A subroutine of emit_block_move.  Returns true if calling the
1716    block move libcall will not clobber any parameters which may have
1717    already been placed on the stack.  */
1718
1719 static bool
1720 block_move_libcall_safe_for_call_parm (void)
1721 {
1722   tree fn;
1723
1724   /* If arguments are pushed on the stack, then they're safe.  */
1725   if (PUSH_ARGS)
1726     return true;
1727
1728   /* If registers go on the stack anyway, any argument is sure to clobber
1729      an outgoing argument.  */
1730 #if defined (REG_PARM_STACK_SPACE)
1731   fn = builtin_decl_implicit (BUILT_IN_MEMCPY);
1732   /* Avoid set but not used warning if *REG_PARM_STACK_SPACE doesn't
1733      depend on its argument.  */
1734   (void) fn;
1735   if (OUTGOING_REG_PARM_STACK_SPACE ((!fn ? NULL_TREE : TREE_TYPE (fn)))
1736       && REG_PARM_STACK_SPACE (fn) != 0)
1737     return false;
1738 #endif
1739
1740   /* If any argument goes in memory, then it might clobber an outgoing
1741      argument.  */
1742   {
1743     CUMULATIVE_ARGS args_so_far_v;
1744     cumulative_args_t args_so_far;
1745     tree arg;
1746
1747     fn = builtin_decl_implicit (BUILT_IN_MEMCPY);
1748     INIT_CUMULATIVE_ARGS (args_so_far_v, TREE_TYPE (fn), NULL_RTX, 0, 3);
1749     args_so_far = pack_cumulative_args (&args_so_far_v);
1750
1751     arg = TYPE_ARG_TYPES (TREE_TYPE (fn));
1752     for ( ; arg != void_list_node ; arg = TREE_CHAIN (arg))
1753       {
1754         machine_mode mode = TYPE_MODE (TREE_VALUE (arg));
1755         function_arg_info arg_info (mode, /*named=*/true);
1756         rtx tmp = targetm.calls.function_arg (args_so_far, arg_info);
1757         if (!tmp || !REG_P (tmp))
1758           return false;
1759         if (targetm.calls.arg_partial_bytes (args_so_far, arg_info))
1760           return false;
1761         targetm.calls.function_arg_advance (args_so_far, arg_info);
1762       }
1763   }
1764   return true;
1765 }
1766
1767 /* A subroutine of emit_block_move.  Expand a cpymem or movmem pattern;
1768    return true if successful.
1769   
1770    X is the destination of the copy or move.
1771    Y is the source of the copy or move.
1772    SIZE is the size of the block to be moved.
1773
1774    MIGHT_OVERLAP indicates this originated with expansion of a
1775    builtin_memmove() and the source and destination blocks may
1776    overlap.
1777   */
1778
1779 static bool
1780 emit_block_move_via_pattern (rtx x, rtx y, rtx size, unsigned int align,
1781                              unsigned int expected_align,
1782                              HOST_WIDE_INT expected_size,
1783                              unsigned HOST_WIDE_INT min_size,
1784                              unsigned HOST_WIDE_INT max_size,
1785                              unsigned HOST_WIDE_INT probable_max_size,
1786                              bool might_overlap)
1787 {
1788   if (expected_align < align)
1789     expected_align = align;
1790   if (expected_size != -1)
1791     {
1792       if ((unsigned HOST_WIDE_INT)expected_size > probable_max_size)
1793         expected_size = probable_max_size;
1794       if ((unsigned HOST_WIDE_INT)expected_size < min_size)
1795         expected_size = min_size;
1796     }
1797
1798   /* Since this is a move insn, we don't care about volatility.  */
1799   temporary_volatile_ok v (true);
1800
1801   /* Try the most limited insn first, because there's no point
1802      including more than one in the machine description unless
1803      the more limited one has some advantage.  */
1804
1805   opt_scalar_int_mode mode_iter;
1806   FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_INT)
1807     {
1808       scalar_int_mode mode = mode_iter.require ();
1809       enum insn_code code;
1810       if (might_overlap)
1811         code = direct_optab_handler (movmem_optab, mode);
1812       else
1813         code = direct_optab_handler (cpymem_optab, mode);
1814
1815       if (code != CODE_FOR_nothing
1816           /* We don't need MODE to be narrower than BITS_PER_HOST_WIDE_INT
1817              here because if SIZE is less than the mode mask, as it is
1818              returned by the macro, it will definitely be less than the
1819              actual mode mask.  Since SIZE is within the Pmode address
1820              space, we limit MODE to Pmode.  */
1821           && ((CONST_INT_P (size)
1822                && ((unsigned HOST_WIDE_INT) INTVAL (size)
1823                    <= (GET_MODE_MASK (mode) >> 1)))
1824               || max_size <= (GET_MODE_MASK (mode) >> 1)
1825               || GET_MODE_BITSIZE (mode) >= GET_MODE_BITSIZE (Pmode)))
1826         {
1827           class expand_operand ops[9];
1828           unsigned int nops;
1829
1830           /* ??? When called via emit_block_move_for_call, it'd be
1831              nice if there were some way to inform the backend, so
1832              that it doesn't fail the expansion because it thinks
1833              emitting the libcall would be more efficient.  */
1834           nops = insn_data[(int) code].n_generator_args;
1835           gcc_assert (nops == 4 || nops == 6 || nops == 8 || nops == 9);
1836
1837           create_fixed_operand (&ops[0], x);
1838           create_fixed_operand (&ops[1], y);
1839           /* The check above guarantees that this size conversion is valid.  */
1840           create_convert_operand_to (&ops[2], size, mode, true);
1841           create_integer_operand (&ops[3], align / BITS_PER_UNIT);
1842           if (nops >= 6)
1843             {
1844               create_integer_operand (&ops[4], expected_align / BITS_PER_UNIT);
1845               create_integer_operand (&ops[5], expected_size);
1846             }
1847           if (nops >= 8)
1848             {
1849               create_integer_operand (&ops[6], min_size);
1850               /* If we cannot represent the maximal size,
1851                  make parameter NULL.  */
1852               if ((HOST_WIDE_INT) max_size != -1)
1853                 create_integer_operand (&ops[7], max_size);
1854               else
1855                 create_fixed_operand (&ops[7], NULL);
1856             }
1857           if (nops == 9)
1858             {
1859               /* If we cannot represent the maximal size,
1860                  make parameter NULL.  */
1861               if ((HOST_WIDE_INT) probable_max_size != -1)
1862                 create_integer_operand (&ops[8], probable_max_size);
1863               else
1864                 create_fixed_operand (&ops[8], NULL);
1865             }
1866           if (maybe_expand_insn (code, nops, ops))
1867             return true;
1868         }
1869     }
1870
1871   return false;
1872 }
1873
1874 /* A subroutine of emit_block_move.  Copy the data via an explicit
1875    loop.  This is used only when libcalls are forbidden.  */
1876 /* ??? It'd be nice to copy in hunks larger than QImode.  */
1877
1878 static void
1879 emit_block_move_via_loop (rtx x, rtx y, rtx size,
1880                           unsigned int align ATTRIBUTE_UNUSED)
1881 {
1882   rtx_code_label *cmp_label, *top_label;
1883   rtx iter, x_addr, y_addr, tmp;
1884   machine_mode x_addr_mode = get_address_mode (x);
1885   machine_mode y_addr_mode = get_address_mode (y);
1886   machine_mode iter_mode;
1887
1888   iter_mode = GET_MODE (size);
1889   if (iter_mode == VOIDmode)
1890     iter_mode = word_mode;
1891
1892   top_label = gen_label_rtx ();
1893   cmp_label = gen_label_rtx ();
1894   iter = gen_reg_rtx (iter_mode);
1895
1896   emit_move_insn (iter, const0_rtx);
1897
1898   x_addr = force_operand (XEXP (x, 0), NULL_RTX);
1899   y_addr = force_operand (XEXP (y, 0), NULL_RTX);
1900   do_pending_stack_adjust ();
1901
1902   emit_jump (cmp_label);
1903   emit_label (top_label);
1904
1905   tmp = convert_modes (x_addr_mode, iter_mode, iter, true);
1906   x_addr = simplify_gen_binary (PLUS, x_addr_mode, x_addr, tmp);
1907
1908   if (x_addr_mode != y_addr_mode)
1909     tmp = convert_modes (y_addr_mode, iter_mode, iter, true);
1910   y_addr = simplify_gen_binary (PLUS, y_addr_mode, y_addr, tmp);
1911
1912   x = change_address (x, QImode, x_addr);
1913   y = change_address (y, QImode, y_addr);
1914
1915   emit_move_insn (x, y);
1916
1917   tmp = expand_simple_binop (iter_mode, PLUS, iter, const1_rtx, iter,
1918                              true, OPTAB_LIB_WIDEN);
1919   if (tmp != iter)
1920     emit_move_insn (iter, tmp);
1921
1922   emit_label (cmp_label);
1923
1924   emit_cmp_and_jump_insns (iter, size, LT, NULL_RTX, iter_mode,
1925                            true, top_label,
1926                            profile_probability::guessed_always ()
1927                                 .apply_scale (9, 10));
1928 }
1929 \f
1930 /* Expand a call to memcpy or memmove or memcmp, and return the result.
1931    TAILCALL is true if this is a tail call.  */
1932
1933 rtx
1934 emit_block_op_via_libcall (enum built_in_function fncode, rtx dst, rtx src,
1935                            rtx size, bool tailcall)
1936 {
1937   rtx dst_addr, src_addr;
1938   tree call_expr, dst_tree, src_tree, size_tree;
1939   machine_mode size_mode;
1940
1941   /* Since dst and src are passed to a libcall, mark the corresponding
1942      tree EXPR as addressable.  */
1943   tree dst_expr = MEM_EXPR (dst);
1944   tree src_expr = MEM_EXPR (src);
1945   if (dst_expr)
1946     mark_addressable (dst_expr);
1947   if (src_expr)
1948     mark_addressable (src_expr);
1949
1950   dst_addr = copy_addr_to_reg (XEXP (dst, 0));
1951   dst_addr = convert_memory_address (ptr_mode, dst_addr);
1952   dst_tree = make_tree (ptr_type_node, dst_addr);
1953
1954   src_addr = copy_addr_to_reg (XEXP (src, 0));
1955   src_addr = convert_memory_address (ptr_mode, src_addr);
1956   src_tree = make_tree (ptr_type_node, src_addr);
1957
1958   size_mode = TYPE_MODE (sizetype);
1959   size = convert_to_mode (size_mode, size, 1);
1960   size = copy_to_mode_reg (size_mode, size);
1961   size_tree = make_tree (sizetype, size);
1962
1963   /* It is incorrect to use the libcall calling conventions for calls to
1964      memcpy/memmove/memcmp because they can be provided by the user.  */
1965   tree fn = builtin_decl_implicit (fncode);
1966   call_expr = build_call_expr (fn, 3, dst_tree, src_tree, size_tree);
1967   CALL_EXPR_TAILCALL (call_expr) = tailcall;
1968
1969   return expand_call (call_expr, NULL_RTX, false);
1970 }
1971
1972 /* Try to expand cmpstrn or cmpmem operation ICODE with the given operands.
1973    ARG3_TYPE is the type of ARG3_RTX.  Return the result rtx on success,
1974    otherwise return null.  */
1975
1976 rtx
1977 expand_cmpstrn_or_cmpmem (insn_code icode, rtx target, rtx arg1_rtx,
1978                           rtx arg2_rtx, tree arg3_type, rtx arg3_rtx,
1979                           HOST_WIDE_INT align)
1980 {
1981   machine_mode insn_mode = insn_data[icode].operand[0].mode;
1982
1983   if (target && (!REG_P (target) || HARD_REGISTER_P (target)))
1984     target = NULL_RTX;
1985
1986   class expand_operand ops[5];
1987   create_output_operand (&ops[0], target, insn_mode);
1988   create_fixed_operand (&ops[1], arg1_rtx);
1989   create_fixed_operand (&ops[2], arg2_rtx);
1990   create_convert_operand_from (&ops[3], arg3_rtx, TYPE_MODE (arg3_type),
1991                                TYPE_UNSIGNED (arg3_type));
1992   create_integer_operand (&ops[4], align);
1993   if (maybe_expand_insn (icode, 5, ops))
1994     return ops[0].value;
1995   return NULL_RTX;
1996 }
1997
1998 /* Expand a block compare between X and Y with length LEN using the
1999    cmpmem optab, placing the result in TARGET.  LEN_TYPE is the type
2000    of the expression that was used to calculate the length.  ALIGN
2001    gives the known minimum common alignment.  */
2002
2003 static rtx
2004 emit_block_cmp_via_cmpmem (rtx x, rtx y, rtx len, tree len_type, rtx target,
2005                            unsigned align)
2006 {
2007   /* Note: The cmpstrnsi pattern, if it exists, is not suitable for
2008      implementing memcmp because it will stop if it encounters two
2009      zero bytes.  */
2010   insn_code icode = direct_optab_handler (cmpmem_optab, SImode);
2011
2012   if (icode == CODE_FOR_nothing)
2013     return NULL_RTX;
2014
2015   return expand_cmpstrn_or_cmpmem (icode, target, x, y, len_type, len, align);
2016 }
2017
2018 /* Emit code to compare a block Y to a block X.  This may be done with
2019    string-compare instructions, with multiple scalar instructions,
2020    or with a library call.
2021
2022    Both X and Y must be MEM rtx's.  LEN is an rtx that says how long
2023    they are.  LEN_TYPE is the type of the expression that was used to
2024    calculate it.
2025
2026    If EQUALITY_ONLY is true, it means we don't have to return the tri-state
2027    value of a normal memcmp call, instead we can just compare for equality.
2028    If FORCE_LIBCALL is true, we should emit a call to memcmp rather than
2029    returning NULL_RTX.
2030
2031    Optionally, the caller can pass a constfn and associated data in Y_CFN
2032    and Y_CFN_DATA. describing that the second operand being compared is a
2033    known constant and how to obtain its data.
2034    Return the result of the comparison, or NULL_RTX if we failed to
2035    perform the operation.  */
2036
2037 rtx
2038 emit_block_cmp_hints (rtx x, rtx y, rtx len, tree len_type, rtx target,
2039                       bool equality_only, by_pieces_constfn y_cfn,
2040                       void *y_cfndata)
2041 {
2042   rtx result = 0;
2043
2044   if (CONST_INT_P (len) && INTVAL (len) == 0)
2045     return const0_rtx;
2046
2047   gcc_assert (MEM_P (x) && MEM_P (y));
2048   unsigned int align = MIN (MEM_ALIGN (x), MEM_ALIGN (y));
2049   gcc_assert (align >= BITS_PER_UNIT);
2050
2051   x = adjust_address (x, BLKmode, 0);
2052   y = adjust_address (y, BLKmode, 0);
2053
2054   if (equality_only
2055       && CONST_INT_P (len)
2056       && can_do_by_pieces (INTVAL (len), align, COMPARE_BY_PIECES))
2057     result = compare_by_pieces (x, y, INTVAL (len), target, align,
2058                                 y_cfn, y_cfndata);
2059   else
2060     result = emit_block_cmp_via_cmpmem (x, y, len, len_type, target, align);
2061
2062   return result;
2063 }
2064 \f
2065 /* Copy all or part of a value X into registers starting at REGNO.
2066    The number of registers to be filled is NREGS.  */
2067
2068 void
2069 move_block_to_reg (int regno, rtx x, int nregs, machine_mode mode)
2070 {
2071   if (nregs == 0)
2072     return;
2073
2074   if (CONSTANT_P (x) && !targetm.legitimate_constant_p (mode, x))
2075     x = validize_mem (force_const_mem (mode, x));
2076
2077   /* See if the machine can do this with a load multiple insn.  */
2078   if (targetm.have_load_multiple ())
2079     {
2080       rtx_insn *last = get_last_insn ();
2081       rtx first = gen_rtx_REG (word_mode, regno);
2082       if (rtx_insn *pat = targetm.gen_load_multiple (first, x,
2083                                                      GEN_INT (nregs)))
2084         {
2085           emit_insn (pat);
2086           return;
2087         }
2088       else
2089         delete_insns_since (last);
2090     }
2091
2092   for (int i = 0; i < nregs; i++)
2093     emit_move_insn (gen_rtx_REG (word_mode, regno + i),
2094                     operand_subword_force (x, i, mode));
2095 }
2096
2097 /* Copy all or part of a BLKmode value X out of registers starting at REGNO.
2098    The number of registers to be filled is NREGS.  */
2099
2100 void
2101 move_block_from_reg (int regno, rtx x, int nregs)
2102 {
2103   if (nregs == 0)
2104     return;
2105
2106   /* See if the machine can do this with a store multiple insn.  */
2107   if (targetm.have_store_multiple ())
2108     {
2109       rtx_insn *last = get_last_insn ();
2110       rtx first = gen_rtx_REG (word_mode, regno);
2111       if (rtx_insn *pat = targetm.gen_store_multiple (x, first,
2112                                                       GEN_INT (nregs)))
2113         {
2114           emit_insn (pat);
2115           return;
2116         }
2117       else
2118         delete_insns_since (last);
2119     }
2120
2121   for (int i = 0; i < nregs; i++)
2122     {
2123       rtx tem = operand_subword (x, i, 1, BLKmode);
2124
2125       gcc_assert (tem);
2126
2127       emit_move_insn (tem, gen_rtx_REG (word_mode, regno + i));
2128     }
2129 }
2130
2131 /* Generate a PARALLEL rtx for a new non-consecutive group of registers from
2132    ORIG, where ORIG is a non-consecutive group of registers represented by
2133    a PARALLEL.  The clone is identical to the original except in that the
2134    original set of registers is replaced by a new set of pseudo registers.
2135    The new set has the same modes as the original set.  */
2136
2137 rtx
2138 gen_group_rtx (rtx orig)
2139 {
2140   int i, length;
2141   rtx *tmps;
2142
2143   gcc_assert (GET_CODE (orig) == PARALLEL);
2144
2145   length = XVECLEN (orig, 0);
2146   tmps = XALLOCAVEC (rtx, length);
2147
2148   /* Skip a NULL entry in first slot.  */
2149   i = XEXP (XVECEXP (orig, 0, 0), 0) ? 0 : 1;
2150
2151   if (i)
2152     tmps[0] = 0;
2153
2154   for (; i < length; i++)
2155     {
2156       machine_mode mode = GET_MODE (XEXP (XVECEXP (orig, 0, i), 0));
2157       rtx offset = XEXP (XVECEXP (orig, 0, i), 1);
2158
2159       tmps[i] = gen_rtx_EXPR_LIST (VOIDmode, gen_reg_rtx (mode), offset);
2160     }
2161
2162   return gen_rtx_PARALLEL (GET_MODE (orig), gen_rtvec_v (length, tmps));
2163 }
2164
2165 /* A subroutine of emit_group_load.  Arguments as for emit_group_load,
2166    except that values are placed in TMPS[i], and must later be moved
2167    into corresponding XEXP (XVECEXP (DST, 0, i), 0) element.  */
2168
2169 static void
2170 emit_group_load_1 (rtx *tmps, rtx dst, rtx orig_src, tree type,
2171                    poly_int64 ssize)
2172 {
2173   rtx src;
2174   int start, i;
2175   machine_mode m = GET_MODE (orig_src);
2176
2177   gcc_assert (GET_CODE (dst) == PARALLEL);
2178
2179   if (m != VOIDmode
2180       && !SCALAR_INT_MODE_P (m)
2181       && !MEM_P (orig_src)
2182       && GET_CODE (orig_src) != CONCAT)
2183     {
2184       scalar_int_mode imode;
2185       if (int_mode_for_mode (GET_MODE (orig_src)).exists (&imode))
2186         {
2187           src = gen_reg_rtx (imode);
2188           emit_move_insn (gen_lowpart (GET_MODE (orig_src), src), orig_src);
2189         }
2190       else
2191         {
2192           src = assign_stack_temp (GET_MODE (orig_src), ssize);
2193           emit_move_insn (src, orig_src);
2194         }
2195       emit_group_load_1 (tmps, dst, src, type, ssize);
2196       return;
2197     }
2198
2199   /* Check for a NULL entry, used to indicate that the parameter goes
2200      both on the stack and in registers.  */
2201   if (XEXP (XVECEXP (dst, 0, 0), 0))
2202     start = 0;
2203   else
2204     start = 1;
2205
2206   /* Process the pieces.  */
2207   for (i = start; i < XVECLEN (dst, 0); i++)
2208     {
2209       machine_mode mode = GET_MODE (XEXP (XVECEXP (dst, 0, i), 0));
2210       poly_int64 bytepos = rtx_to_poly_int64 (XEXP (XVECEXP (dst, 0, i), 1));
2211       poly_int64 bytelen = GET_MODE_SIZE (mode);
2212       poly_int64 shift = 0;
2213
2214       /* Handle trailing fragments that run over the size of the struct.
2215          It's the target's responsibility to make sure that the fragment
2216          cannot be strictly smaller in some cases and strictly larger
2217          in others.  */
2218       gcc_checking_assert (ordered_p (bytepos + bytelen, ssize));
2219       if (known_size_p (ssize) && maybe_gt (bytepos + bytelen, ssize))
2220         {
2221           /* Arrange to shift the fragment to where it belongs.
2222              extract_bit_field loads to the lsb of the reg.  */
2223           if (
2224 #ifdef BLOCK_REG_PADDING
2225               BLOCK_REG_PADDING (GET_MODE (orig_src), type, i == start)
2226               == (BYTES_BIG_ENDIAN ? PAD_UPWARD : PAD_DOWNWARD)
2227 #else
2228               BYTES_BIG_ENDIAN
2229 #endif
2230               )
2231             shift = (bytelen - (ssize - bytepos)) * BITS_PER_UNIT;
2232           bytelen = ssize - bytepos;
2233           gcc_assert (maybe_gt (bytelen, 0));
2234         }
2235
2236       /* If we won't be loading directly from memory, protect the real source
2237          from strange tricks we might play; but make sure that the source can
2238          be loaded directly into the destination.  */
2239       src = orig_src;
2240       if (!MEM_P (orig_src)
2241           && (!CONSTANT_P (orig_src)
2242               || (GET_MODE (orig_src) != mode
2243                   && GET_MODE (orig_src) != VOIDmode)))
2244         {
2245           if (GET_MODE (orig_src) == VOIDmode)
2246             src = gen_reg_rtx (mode);
2247           else
2248             src = gen_reg_rtx (GET_MODE (orig_src));
2249
2250           emit_move_insn (src, orig_src);
2251         }
2252
2253       /* Optimize the access just a bit.  */
2254       if (MEM_P (src)
2255           && (! targetm.slow_unaligned_access (mode, MEM_ALIGN (src))
2256               || MEM_ALIGN (src) >= GET_MODE_ALIGNMENT (mode))
2257           && multiple_p (bytepos * BITS_PER_UNIT, GET_MODE_ALIGNMENT (mode))
2258           && known_eq (bytelen, GET_MODE_SIZE (mode)))
2259         {
2260           tmps[i] = gen_reg_rtx (mode);
2261           emit_move_insn (tmps[i], adjust_address (src, mode, bytepos));
2262         }
2263       else if (COMPLEX_MODE_P (mode)
2264                && GET_MODE (src) == mode
2265                && known_eq (bytelen, GET_MODE_SIZE (mode)))
2266         /* Let emit_move_complex do the bulk of the work.  */
2267         tmps[i] = src;
2268       else if (GET_CODE (src) == CONCAT)
2269         {
2270           poly_int64 slen = GET_MODE_SIZE (GET_MODE (src));
2271           poly_int64 slen0 = GET_MODE_SIZE (GET_MODE (XEXP (src, 0)));
2272           unsigned int elt;
2273           poly_int64 subpos;
2274
2275           if (can_div_trunc_p (bytepos, slen0, &elt, &subpos)
2276               && known_le (subpos + bytelen, slen0))
2277             {
2278               /* The following assumes that the concatenated objects all
2279                  have the same size.  In this case, a simple calculation
2280                  can be used to determine the object and the bit field
2281                  to be extracted.  */
2282               tmps[i] = XEXP (src, elt);
2283               if (maybe_ne (subpos, 0)
2284                   || maybe_ne (subpos + bytelen, slen0)
2285                   || (!CONSTANT_P (tmps[i])
2286                       && (!REG_P (tmps[i]) || GET_MODE (tmps[i]) != mode)))
2287                 tmps[i] = extract_bit_field (tmps[i], bytelen * BITS_PER_UNIT,
2288                                              subpos * BITS_PER_UNIT,
2289                                              1, NULL_RTX, mode, mode, false,
2290                                              NULL);
2291             }
2292           else
2293             {
2294               rtx mem;
2295
2296               gcc_assert (known_eq (bytepos, 0));
2297               mem = assign_stack_temp (GET_MODE (src), slen);
2298               emit_move_insn (mem, src);
2299               tmps[i] = extract_bit_field (mem, bytelen * BITS_PER_UNIT,
2300                                            0, 1, NULL_RTX, mode, mode, false,
2301                                            NULL);
2302             }
2303         }
2304       /* FIXME: A SIMD parallel will eventually lead to a subreg of a
2305          SIMD register, which is currently broken.  While we get GCC
2306          to emit proper RTL for these cases, let's dump to memory.  */
2307       else if (VECTOR_MODE_P (GET_MODE (dst))
2308                && REG_P (src))
2309         {
2310           poly_uint64 slen = GET_MODE_SIZE (GET_MODE (src));
2311           rtx mem;
2312
2313           mem = assign_stack_temp (GET_MODE (src), slen);
2314           emit_move_insn (mem, src);
2315           tmps[i] = adjust_address (mem, mode, bytepos);
2316         }
2317       else if (CONSTANT_P (src) && GET_MODE (dst) != BLKmode
2318                && XVECLEN (dst, 0) > 1)
2319         tmps[i] = simplify_gen_subreg (mode, src, GET_MODE (dst), bytepos);
2320       else if (CONSTANT_P (src))
2321         {
2322           if (known_eq (bytelen, ssize))
2323             tmps[i] = src;
2324           else
2325             {
2326               rtx first, second;
2327
2328               /* TODO: const_wide_int can have sizes other than this...  */
2329               gcc_assert (known_eq (2 * bytelen, ssize));
2330               split_double (src, &first, &second);
2331               if (i)
2332                 tmps[i] = second;
2333               else
2334                 tmps[i] = first;
2335             }
2336         }
2337       else if (REG_P (src) && GET_MODE (src) == mode)
2338         tmps[i] = src;
2339       else
2340         tmps[i] = extract_bit_field (src, bytelen * BITS_PER_UNIT,
2341                                      bytepos * BITS_PER_UNIT, 1, NULL_RTX,
2342                                      mode, mode, false, NULL);
2343
2344       if (maybe_ne (shift, 0))
2345         tmps[i] = expand_shift (LSHIFT_EXPR, mode, tmps[i],
2346                                 shift, tmps[i], 0);
2347     }
2348 }
2349
2350 /* Emit code to move a block SRC of type TYPE to a block DST,
2351    where DST is non-consecutive registers represented by a PARALLEL.
2352    SSIZE represents the total size of block ORIG_SRC in bytes, or -1
2353    if not known.  */
2354
2355 void
2356 emit_group_load (rtx dst, rtx src, tree type, poly_int64 ssize)
2357 {
2358   rtx *tmps;
2359   int i;
2360
2361   tmps = XALLOCAVEC (rtx, XVECLEN (dst, 0));
2362   emit_group_load_1 (tmps, dst, src, type, ssize);
2363
2364   /* Copy the extracted pieces into the proper (probable) hard regs.  */
2365   for (i = 0; i < XVECLEN (dst, 0); i++)
2366     {
2367       rtx d = XEXP (XVECEXP (dst, 0, i), 0);
2368       if (d == NULL)
2369         continue;
2370       emit_move_insn (d, tmps[i]);
2371     }
2372 }
2373
2374 /* Similar, but load SRC into new pseudos in a format that looks like
2375    PARALLEL.  This can later be fed to emit_group_move to get things
2376    in the right place.  */
2377
2378 rtx
2379 emit_group_load_into_temps (rtx parallel, rtx src, tree type, poly_int64 ssize)
2380 {
2381   rtvec vec;
2382   int i;
2383
2384   vec = rtvec_alloc (XVECLEN (parallel, 0));
2385   emit_group_load_1 (&RTVEC_ELT (vec, 0), parallel, src, type, ssize);
2386
2387   /* Convert the vector to look just like the original PARALLEL, except
2388      with the computed values.  */
2389   for (i = 0; i < XVECLEN (parallel, 0); i++)
2390     {
2391       rtx e = XVECEXP (parallel, 0, i);
2392       rtx d = XEXP (e, 0);
2393
2394       if (d)
2395         {
2396           d = force_reg (GET_MODE (d), RTVEC_ELT (vec, i));
2397           e = alloc_EXPR_LIST (REG_NOTE_KIND (e), d, XEXP (e, 1));
2398         }
2399       RTVEC_ELT (vec, i) = e;
2400     }
2401
2402   return gen_rtx_PARALLEL (GET_MODE (parallel), vec);
2403 }
2404
2405 /* Emit code to move a block SRC to block DST, where SRC and DST are
2406    non-consecutive groups of registers, each represented by a PARALLEL.  */
2407
2408 void
2409 emit_group_move (rtx dst, rtx src)
2410 {
2411   int i;
2412
2413   gcc_assert (GET_CODE (src) == PARALLEL
2414               && GET_CODE (dst) == PARALLEL
2415               && XVECLEN (src, 0) == XVECLEN (dst, 0));
2416
2417   /* Skip first entry if NULL.  */
2418   for (i = XEXP (XVECEXP (src, 0, 0), 0) ? 0 : 1; i < XVECLEN (src, 0); i++)
2419     emit_move_insn (XEXP (XVECEXP (dst, 0, i), 0),
2420                     XEXP (XVECEXP (src, 0, i), 0));
2421 }
2422
2423 /* Move a group of registers represented by a PARALLEL into pseudos.  */
2424
2425 rtx
2426 emit_group_move_into_temps (rtx src)
2427 {
2428   rtvec vec = rtvec_alloc (XVECLEN (src, 0));
2429   int i;
2430
2431   for (i = 0; i < XVECLEN (src, 0); i++)
2432     {
2433       rtx e = XVECEXP (src, 0, i);
2434       rtx d = XEXP (e, 0);
2435
2436       if (d)
2437         e = alloc_EXPR_LIST (REG_NOTE_KIND (e), copy_to_reg (d), XEXP (e, 1));
2438       RTVEC_ELT (vec, i) = e;
2439     }
2440
2441   return gen_rtx_PARALLEL (GET_MODE (src), vec);
2442 }
2443
2444 /* Emit code to move a block SRC to a block ORIG_DST of type TYPE,
2445    where SRC is non-consecutive registers represented by a PARALLEL.
2446    SSIZE represents the total size of block ORIG_DST, or -1 if not
2447    known.  */
2448
2449 void
2450 emit_group_store (rtx orig_dst, rtx src, tree type ATTRIBUTE_UNUSED,
2451                   poly_int64 ssize)
2452 {
2453   rtx *tmps, dst;
2454   int start, finish, i;
2455   machine_mode m = GET_MODE (orig_dst);
2456
2457   gcc_assert (GET_CODE (src) == PARALLEL);
2458
2459   if (!SCALAR_INT_MODE_P (m)
2460       && !MEM_P (orig_dst) && GET_CODE (orig_dst) != CONCAT)
2461     {
2462       scalar_int_mode imode;
2463       if (int_mode_for_mode (GET_MODE (orig_dst)).exists (&imode))
2464         {
2465           dst = gen_reg_rtx (imode);
2466           emit_group_store (dst, src, type, ssize);
2467           dst = gen_lowpart (GET_MODE (orig_dst), dst);
2468         }
2469       else
2470         {
2471           dst = assign_stack_temp (GET_MODE (orig_dst), ssize);
2472           emit_group_store (dst, src, type, ssize);
2473         }
2474       emit_move_insn (orig_dst, dst);
2475       return;
2476     }
2477
2478   /* Check for a NULL entry, used to indicate that the parameter goes
2479      both on the stack and in registers.  */
2480   if (XEXP (XVECEXP (src, 0, 0), 0))
2481     start = 0;
2482   else
2483     start = 1;
2484   finish = XVECLEN (src, 0);
2485
2486   tmps = XALLOCAVEC (rtx, finish);
2487
2488   /* Copy the (probable) hard regs into pseudos.  */
2489   for (i = start; i < finish; i++)
2490     {
2491       rtx reg = XEXP (XVECEXP (src, 0, i), 0);
2492       if (!REG_P (reg) || REGNO (reg) < FIRST_PSEUDO_REGISTER)
2493         {
2494           tmps[i] = gen_reg_rtx (GET_MODE (reg));
2495           emit_move_insn (tmps[i], reg);
2496         }
2497       else
2498         tmps[i] = reg;
2499     }
2500
2501   /* If we won't be storing directly into memory, protect the real destination
2502      from strange tricks we might play.  */
2503   dst = orig_dst;
2504   if (GET_CODE (dst) == PARALLEL)
2505     {
2506       rtx temp;
2507
2508       /* We can get a PARALLEL dst if there is a conditional expression in
2509          a return statement.  In that case, the dst and src are the same,
2510          so no action is necessary.  */
2511       if (rtx_equal_p (dst, src))
2512         return;
2513
2514       /* It is unclear if we can ever reach here, but we may as well handle
2515          it.  Allocate a temporary, and split this into a store/load to/from
2516          the temporary.  */
2517       temp = assign_stack_temp (GET_MODE (dst), ssize);
2518       emit_group_store (temp, src, type, ssize);
2519       emit_group_load (dst, temp, type, ssize);
2520       return;
2521     }
2522   else if (!MEM_P (dst) && GET_CODE (dst) != CONCAT)
2523     {
2524       machine_mode outer = GET_MODE (dst);
2525       machine_mode inner;
2526       poly_int64 bytepos;
2527       bool done = false;
2528       rtx temp;
2529
2530       if (!REG_P (dst) || REGNO (dst) < FIRST_PSEUDO_REGISTER)
2531         dst = gen_reg_rtx (outer);
2532
2533       /* Make life a bit easier for combine.  */
2534       /* If the first element of the vector is the low part
2535          of the destination mode, use a paradoxical subreg to
2536          initialize the destination.  */
2537       if (start < finish)
2538         {
2539           inner = GET_MODE (tmps[start]);
2540           bytepos = subreg_lowpart_offset (inner, outer);
2541           if (known_eq (rtx_to_poly_int64 (XEXP (XVECEXP (src, 0, start), 1)),
2542                         bytepos))
2543             {
2544               temp = simplify_gen_subreg (outer, tmps[start],
2545                                           inner, 0);
2546               if (temp)
2547                 {
2548                   emit_move_insn (dst, temp);
2549                   done = true;
2550                   start++;
2551                 }
2552             }
2553         }
2554
2555       /* If the first element wasn't the low part, try the last.  */
2556       if (!done
2557           && start < finish - 1)
2558         {
2559           inner = GET_MODE (tmps[finish - 1]);
2560           bytepos = subreg_lowpart_offset (inner, outer);
2561           if (known_eq (rtx_to_poly_int64 (XEXP (XVECEXP (src, 0,
2562                                                           finish - 1), 1)),
2563                         bytepos))
2564             {
2565               temp = simplify_gen_subreg (outer, tmps[finish - 1],
2566                                           inner, 0);
2567               if (temp)
2568                 {
2569                   emit_move_insn (dst, temp);
2570                   done = true;
2571                   finish--;
2572                 }
2573             }
2574         }
2575
2576       /* Otherwise, simply initialize the result to zero.  */
2577       if (!done)
2578         emit_move_insn (dst, CONST0_RTX (outer));
2579     }
2580
2581   /* Process the pieces.  */
2582   for (i = start; i < finish; i++)
2583     {
2584       poly_int64 bytepos = rtx_to_poly_int64 (XEXP (XVECEXP (src, 0, i), 1));
2585       machine_mode mode = GET_MODE (tmps[i]);
2586       poly_int64 bytelen = GET_MODE_SIZE (mode);
2587       poly_uint64 adj_bytelen;
2588       rtx dest = dst;
2589
2590       /* Handle trailing fragments that run over the size of the struct.
2591          It's the target's responsibility to make sure that the fragment
2592          cannot be strictly smaller in some cases and strictly larger
2593          in others.  */
2594       gcc_checking_assert (ordered_p (bytepos + bytelen, ssize));
2595       if (known_size_p (ssize) && maybe_gt (bytepos + bytelen, ssize))
2596         adj_bytelen = ssize - bytepos;
2597       else
2598         adj_bytelen = bytelen;
2599
2600       if (GET_CODE (dst) == CONCAT)
2601         {
2602           if (known_le (bytepos + adj_bytelen,
2603                         GET_MODE_SIZE (GET_MODE (XEXP (dst, 0)))))
2604             dest = XEXP (dst, 0);
2605           else if (known_ge (bytepos, GET_MODE_SIZE (GET_MODE (XEXP (dst, 0)))))
2606             {
2607               bytepos -= GET_MODE_SIZE (GET_MODE (XEXP (dst, 0)));
2608               dest = XEXP (dst, 1);
2609             }
2610           else
2611             {
2612               machine_mode dest_mode = GET_MODE (dest);
2613               machine_mode tmp_mode = GET_MODE (tmps[i]);
2614
2615               gcc_assert (known_eq (bytepos, 0) && XVECLEN (src, 0));
2616
2617               if (GET_MODE_ALIGNMENT (dest_mode)
2618                   >= GET_MODE_ALIGNMENT (tmp_mode))
2619                 {
2620                   dest = assign_stack_temp (dest_mode,
2621                                             GET_MODE_SIZE (dest_mode));
2622                   emit_move_insn (adjust_address (dest,
2623                                                   tmp_mode,
2624                                                   bytepos),
2625                                   tmps[i]);
2626                   dst = dest;
2627                 }
2628               else
2629                 {
2630                   dest = assign_stack_temp (tmp_mode,
2631                                             GET_MODE_SIZE (tmp_mode));
2632                   emit_move_insn (dest, tmps[i]);
2633                   dst = adjust_address (dest, dest_mode, bytepos);
2634                 }
2635               break;
2636             }
2637         }
2638
2639       /* Handle trailing fragments that run over the size of the struct.  */
2640       if (known_size_p (ssize) && maybe_gt (bytepos + bytelen, ssize))
2641         {
2642           /* store_bit_field always takes its value from the lsb.
2643              Move the fragment to the lsb if it's not already there.  */
2644           if (
2645 #ifdef BLOCK_REG_PADDING
2646               BLOCK_REG_PADDING (GET_MODE (orig_dst), type, i == start)
2647               == (BYTES_BIG_ENDIAN ? PAD_UPWARD : PAD_DOWNWARD)
2648 #else
2649               BYTES_BIG_ENDIAN
2650 #endif
2651               )
2652             {
2653               poly_int64 shift = (bytelen - (ssize - bytepos)) * BITS_PER_UNIT;
2654               tmps[i] = expand_shift (RSHIFT_EXPR, mode, tmps[i],
2655                                       shift, tmps[i], 0);
2656             }
2657
2658           /* Make sure not to write past the end of the struct.  */
2659           store_bit_field (dest,
2660                            adj_bytelen * BITS_PER_UNIT, bytepos * BITS_PER_UNIT,
2661                            bytepos * BITS_PER_UNIT, ssize * BITS_PER_UNIT - 1,
2662                            VOIDmode, tmps[i], false);
2663         }
2664
2665       /* Optimize the access just a bit.  */
2666       else if (MEM_P (dest)
2667                && (!targetm.slow_unaligned_access (mode, MEM_ALIGN (dest))
2668                    || MEM_ALIGN (dest) >= GET_MODE_ALIGNMENT (mode))
2669                && multiple_p (bytepos * BITS_PER_UNIT,
2670                               GET_MODE_ALIGNMENT (mode))
2671                && known_eq (bytelen, GET_MODE_SIZE (mode)))
2672         emit_move_insn (adjust_address (dest, mode, bytepos), tmps[i]);
2673
2674       else
2675         store_bit_field (dest, bytelen * BITS_PER_UNIT, bytepos * BITS_PER_UNIT,
2676                          0, 0, mode, tmps[i], false);
2677     }
2678
2679   /* Copy from the pseudo into the (probable) hard reg.  */
2680   if (orig_dst != dst)
2681     emit_move_insn (orig_dst, dst);
2682 }
2683
2684 /* Return a form of X that does not use a PARALLEL.  TYPE is the type
2685    of the value stored in X.  */
2686
2687 rtx
2688 maybe_emit_group_store (rtx x, tree type)
2689 {
2690   machine_mode mode = TYPE_MODE (type);
2691   gcc_checking_assert (GET_MODE (x) == VOIDmode || GET_MODE (x) == mode);
2692   if (GET_CODE (x) == PARALLEL)
2693     {
2694       rtx result = gen_reg_rtx (mode);
2695       emit_group_store (result, x, type, int_size_in_bytes (type));
2696       return result;
2697     }
2698   return x;
2699 }
2700
2701 /* Copy a BLKmode object of TYPE out of a register SRCREG into TARGET.
2702
2703    This is used on targets that return BLKmode values in registers.  */
2704
2705 static void
2706 copy_blkmode_from_reg (rtx target, rtx srcreg, tree type)
2707 {
2708   unsigned HOST_WIDE_INT bytes = int_size_in_bytes (type);
2709   rtx src = NULL, dst = NULL;
2710   unsigned HOST_WIDE_INT bitsize = MIN (TYPE_ALIGN (type), BITS_PER_WORD);
2711   unsigned HOST_WIDE_INT bitpos, xbitpos, padding_correction = 0;
2712   /* No current ABI uses variable-sized modes to pass a BLKmnode type.  */
2713   fixed_size_mode mode = as_a <fixed_size_mode> (GET_MODE (srcreg));
2714   fixed_size_mode tmode = as_a <fixed_size_mode> (GET_MODE (target));
2715   fixed_size_mode copy_mode;
2716
2717   /* BLKmode registers created in the back-end shouldn't have survived.  */
2718   gcc_assert (mode != BLKmode);
2719
2720   /* If the structure doesn't take up a whole number of words, see whether
2721      SRCREG is padded on the left or on the right.  If it's on the left,
2722      set PADDING_CORRECTION to the number of bits to skip.
2723
2724      In most ABIs, the structure will be returned at the least end of
2725      the register, which translates to right padding on little-endian
2726      targets and left padding on big-endian targets.  The opposite
2727      holds if the structure is returned at the most significant
2728      end of the register.  */
2729   if (bytes % UNITS_PER_WORD != 0
2730       && (targetm.calls.return_in_msb (type)
2731           ? !BYTES_BIG_ENDIAN
2732           : BYTES_BIG_ENDIAN))
2733     padding_correction
2734       = (BITS_PER_WORD - ((bytes % UNITS_PER_WORD) * BITS_PER_UNIT));
2735
2736   /* We can use a single move if we have an exact mode for the size.  */
2737   else if (MEM_P (target)
2738            && (!targetm.slow_unaligned_access (mode, MEM_ALIGN (target))
2739                || MEM_ALIGN (target) >= GET_MODE_ALIGNMENT (mode))
2740            && bytes == GET_MODE_SIZE (mode))
2741   {
2742     emit_move_insn (adjust_address (target, mode, 0), srcreg);
2743     return;
2744   }
2745
2746   /* And if we additionally have the same mode for a register.  */
2747   else if (REG_P (target)
2748            && GET_MODE (target) == mode
2749            && bytes == GET_MODE_SIZE (mode))
2750   {
2751     emit_move_insn (target, srcreg);
2752     return;
2753   }
2754
2755   /* This code assumes srcreg is at least a full word.  If it isn't, copy it
2756      into a new pseudo which is a full word.  */
2757   if (GET_MODE_SIZE (mode) < UNITS_PER_WORD)
2758     {
2759       srcreg = convert_to_mode (word_mode, srcreg, TYPE_UNSIGNED (type));
2760       mode = word_mode;
2761     }
2762
2763   /* Copy the structure BITSIZE bits at a time.  If the target lives in
2764      memory, take care of not reading/writing past its end by selecting
2765      a copy mode suited to BITSIZE.  This should always be possible given
2766      how it is computed.
2767
2768      If the target lives in register, make sure not to select a copy mode
2769      larger than the mode of the register.
2770
2771      We could probably emit more efficient code for machines which do not use
2772      strict alignment, but it doesn't seem worth the effort at the current
2773      time.  */
2774
2775   copy_mode = word_mode;
2776   if (MEM_P (target))
2777     {
2778       opt_scalar_int_mode mem_mode = int_mode_for_size (bitsize, 1);
2779       if (mem_mode.exists ())
2780         copy_mode = mem_mode.require ();
2781     }
2782   else if (REG_P (target) && GET_MODE_BITSIZE (tmode) < BITS_PER_WORD)
2783     copy_mode = tmode;
2784
2785   for (bitpos = 0, xbitpos = padding_correction;
2786        bitpos < bytes * BITS_PER_UNIT;
2787        bitpos += bitsize, xbitpos += bitsize)
2788     {
2789       /* We need a new source operand each time xbitpos is on a
2790          word boundary and when xbitpos == padding_correction
2791          (the first time through).  */
2792       if (xbitpos % BITS_PER_WORD == 0 || xbitpos == padding_correction)
2793         src = operand_subword_force (srcreg, xbitpos / BITS_PER_WORD, mode);
2794
2795       /* We need a new destination operand each time bitpos is on
2796          a word boundary.  */
2797       if (REG_P (target) && GET_MODE_BITSIZE (tmode) < BITS_PER_WORD)
2798         dst = target;
2799       else if (bitpos % BITS_PER_WORD == 0)
2800         dst = operand_subword (target, bitpos / BITS_PER_WORD, 1, tmode);
2801
2802       /* Use xbitpos for the source extraction (right justified) and
2803          bitpos for the destination store (left justified).  */
2804       store_bit_field (dst, bitsize, bitpos % BITS_PER_WORD, 0, 0, copy_mode,
2805                        extract_bit_field (src, bitsize,
2806                                           xbitpos % BITS_PER_WORD, 1,
2807                                           NULL_RTX, copy_mode, copy_mode,
2808                                           false, NULL),
2809                        false);
2810     }
2811 }
2812
2813 /* Copy BLKmode value SRC into a register of mode MODE_IN.  Return the
2814    register if it contains any data, otherwise return null.
2815
2816    This is used on targets that return BLKmode values in registers.  */
2817
2818 rtx
2819 copy_blkmode_to_reg (machine_mode mode_in, tree src)
2820 {
2821   int i, n_regs;
2822   unsigned HOST_WIDE_INT bitpos, xbitpos, padding_correction = 0, bytes;
2823   unsigned int bitsize;
2824   rtx *dst_words, dst, x, src_word = NULL_RTX, dst_word = NULL_RTX;
2825   /* No current ABI uses variable-sized modes to pass a BLKmnode type.  */
2826   fixed_size_mode mode = as_a <fixed_size_mode> (mode_in);
2827   fixed_size_mode dst_mode;
2828   scalar_int_mode min_mode;
2829
2830   gcc_assert (TYPE_MODE (TREE_TYPE (src)) == BLKmode);
2831
2832   x = expand_normal (src);
2833
2834   bytes = arg_int_size_in_bytes (TREE_TYPE (src));
2835   if (bytes == 0)
2836     return NULL_RTX;
2837
2838   /* If the structure doesn't take up a whole number of words, see
2839      whether the register value should be padded on the left or on
2840      the right.  Set PADDING_CORRECTION to the number of padding
2841      bits needed on the left side.
2842
2843      In most ABIs, the structure will be returned at the least end of
2844      the register, which translates to right padding on little-endian
2845      targets and left padding on big-endian targets.  The opposite
2846      holds if the structure is returned at the most significant
2847      end of the register.  */
2848   if (bytes % UNITS_PER_WORD != 0
2849       && (targetm.calls.return_in_msb (TREE_TYPE (src))
2850           ? !BYTES_BIG_ENDIAN
2851           : BYTES_BIG_ENDIAN))
2852     padding_correction = (BITS_PER_WORD - ((bytes % UNITS_PER_WORD)
2853                                            * BITS_PER_UNIT));
2854
2855   n_regs = (bytes + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
2856   dst_words = XALLOCAVEC (rtx, n_regs);
2857   bitsize = MIN (TYPE_ALIGN (TREE_TYPE (src)), BITS_PER_WORD);
2858   min_mode = smallest_int_mode_for_size (bitsize);
2859
2860   /* Copy the structure BITSIZE bits at a time.  */
2861   for (bitpos = 0, xbitpos = padding_correction;
2862        bitpos < bytes * BITS_PER_UNIT;
2863        bitpos += bitsize, xbitpos += bitsize)
2864     {
2865       /* We need a new destination pseudo each time xbitpos is
2866          on a word boundary and when xbitpos == padding_correction
2867          (the first time through).  */
2868       if (xbitpos % BITS_PER_WORD == 0
2869           || xbitpos == padding_correction)
2870         {
2871           /* Generate an appropriate register.  */
2872           dst_word = gen_reg_rtx (word_mode);
2873           dst_words[xbitpos / BITS_PER_WORD] = dst_word;
2874
2875           /* Clear the destination before we move anything into it.  */
2876           emit_move_insn (dst_word, CONST0_RTX (word_mode));
2877         }
2878
2879       /* Find the largest integer mode that can be used to copy all or as
2880          many bits as possible of the structure if the target supports larger
2881          copies.  There are too many corner cases here w.r.t to alignments on
2882          the read/writes.  So if there is any padding just use single byte
2883          operations.  */
2884       opt_scalar_int_mode mode_iter;
2885       if (padding_correction == 0 && !STRICT_ALIGNMENT)
2886         {
2887           FOR_EACH_MODE_FROM (mode_iter, min_mode)
2888             {
2889               unsigned int msize = GET_MODE_BITSIZE (mode_iter.require ());
2890               if (msize <= ((bytes * BITS_PER_UNIT) - bitpos)
2891                   && msize <= BITS_PER_WORD)
2892                 bitsize = msize;
2893               else
2894                 break;
2895             }
2896         }
2897
2898       /* We need a new source operand each time bitpos is on a word
2899          boundary.  */
2900       if (bitpos % BITS_PER_WORD == 0)
2901         src_word = operand_subword_force (x, bitpos / BITS_PER_WORD, BLKmode);
2902
2903       /* Use bitpos for the source extraction (left justified) and
2904          xbitpos for the destination store (right justified).  */
2905       store_bit_field (dst_word, bitsize, xbitpos % BITS_PER_WORD,
2906                        0, 0, word_mode,
2907                        extract_bit_field (src_word, bitsize,
2908                                           bitpos % BITS_PER_WORD, 1,
2909                                           NULL_RTX, word_mode, word_mode,
2910                                           false, NULL),
2911                        false);
2912     }
2913
2914   if (mode == BLKmode)
2915     {
2916       /* Find the smallest integer mode large enough to hold the
2917          entire structure.  */
2918       opt_scalar_int_mode mode_iter;
2919       FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_INT)
2920         if (GET_MODE_SIZE (mode_iter.require ()) >= bytes)
2921           break;
2922
2923       /* A suitable mode should have been found.  */
2924       mode = mode_iter.require ();
2925     }
2926
2927   if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (word_mode))
2928     dst_mode = word_mode;
2929   else
2930     dst_mode = mode;
2931   dst = gen_reg_rtx (dst_mode);
2932
2933   for (i = 0; i < n_regs; i++)
2934     emit_move_insn (operand_subword (dst, i, 0, dst_mode), dst_words[i]);
2935
2936   if (mode != dst_mode)
2937     dst = gen_lowpart (mode, dst);
2938
2939   return dst;
2940 }
2941
2942 /* Add a USE expression for REG to the (possibly empty) list pointed
2943    to by CALL_FUSAGE.  REG must denote a hard register.  */
2944
2945 void
2946 use_reg_mode (rtx *call_fusage, rtx reg, machine_mode mode)
2947 {
2948   gcc_assert (REG_P (reg));
2949
2950   if (!HARD_REGISTER_P (reg))
2951     return;
2952
2953   *call_fusage
2954     = gen_rtx_EXPR_LIST (mode, gen_rtx_USE (VOIDmode, reg), *call_fusage);
2955 }
2956
2957 /* Add a CLOBBER expression for REG to the (possibly empty) list pointed
2958    to by CALL_FUSAGE.  REG must denote a hard register.  */
2959
2960 void
2961 clobber_reg_mode (rtx *call_fusage, rtx reg, machine_mode mode)
2962 {
2963   gcc_assert (REG_P (reg) && REGNO (reg) < FIRST_PSEUDO_REGISTER);
2964
2965   *call_fusage
2966     = gen_rtx_EXPR_LIST (mode, gen_rtx_CLOBBER (VOIDmode, reg), *call_fusage);
2967 }
2968
2969 /* Add USE expressions to *CALL_FUSAGE for each of NREGS consecutive regs,
2970    starting at REGNO.  All of these registers must be hard registers.  */
2971
2972 void
2973 use_regs (rtx *call_fusage, int regno, int nregs)
2974 {
2975   int i;
2976
2977   gcc_assert (regno + nregs <= FIRST_PSEUDO_REGISTER);
2978
2979   for (i = 0; i < nregs; i++)
2980     use_reg (call_fusage, regno_reg_rtx[regno + i]);
2981 }
2982
2983 /* Add USE expressions to *CALL_FUSAGE for each REG contained in the
2984    PARALLEL REGS.  This is for calls that pass values in multiple
2985    non-contiguous locations.  The Irix 6 ABI has examples of this.  */
2986
2987 void
2988 use_group_regs (rtx *call_fusage, rtx regs)
2989 {
2990   int i;
2991
2992   for (i = 0; i < XVECLEN (regs, 0); i++)
2993     {
2994       rtx reg = XEXP (XVECEXP (regs, 0, i), 0);
2995
2996       /* A NULL entry means the parameter goes both on the stack and in
2997          registers.  This can also be a MEM for targets that pass values
2998          partially on the stack and partially in registers.  */
2999       if (reg != 0 && REG_P (reg))
3000         use_reg (call_fusage, reg);
3001     }
3002 }
3003
3004 /* Return the defining gimple statement for SSA_NAME NAME if it is an
3005    assigment and the code of the expresion on the RHS is CODE.  Return
3006    NULL otherwise.  */
3007
3008 static gimple *
3009 get_def_for_expr (tree name, enum tree_code code)
3010 {
3011   gimple *def_stmt;
3012
3013   if (TREE_CODE (name) != SSA_NAME)
3014     return NULL;
3015
3016   def_stmt = get_gimple_for_ssa_name (name);
3017   if (!def_stmt
3018       || gimple_assign_rhs_code (def_stmt) != code)
3019     return NULL;
3020
3021   return def_stmt;
3022 }
3023
3024 /* Return the defining gimple statement for SSA_NAME NAME if it is an
3025    assigment and the class of the expresion on the RHS is CLASS.  Return
3026    NULL otherwise.  */
3027
3028 static gimple *
3029 get_def_for_expr_class (tree name, enum tree_code_class tclass)
3030 {
3031   gimple *def_stmt;
3032
3033   if (TREE_CODE (name) != SSA_NAME)
3034     return NULL;
3035
3036   def_stmt = get_gimple_for_ssa_name (name);
3037   if (!def_stmt
3038       || TREE_CODE_CLASS (gimple_assign_rhs_code (def_stmt)) != tclass)
3039     return NULL;
3040
3041   return def_stmt;
3042 }
3043 \f
3044 /* Write zeros through the storage of OBJECT.  If OBJECT has BLKmode, SIZE is
3045    its length in bytes.  */
3046
3047 rtx
3048 clear_storage_hints (rtx object, rtx size, enum block_op_methods method,
3049                      unsigned int expected_align, HOST_WIDE_INT expected_size,
3050                      unsigned HOST_WIDE_INT min_size,
3051                      unsigned HOST_WIDE_INT max_size,
3052                      unsigned HOST_WIDE_INT probable_max_size)
3053 {
3054   machine_mode mode = GET_MODE (object);
3055   unsigned int align;
3056
3057   gcc_assert (method == BLOCK_OP_NORMAL || method == BLOCK_OP_TAILCALL);
3058
3059   /* If OBJECT is not BLKmode and SIZE is the same size as its mode,
3060      just move a zero.  Otherwise, do this a piece at a time.  */
3061   poly_int64 size_val;
3062   if (mode != BLKmode
3063       && poly_int_rtx_p (size, &size_val)
3064       && known_eq (size_val, GET_MODE_SIZE (mode)))
3065     {
3066       rtx zero = CONST0_RTX (mode);
3067       if (zero != NULL)
3068         {
3069           emit_move_insn (object, zero);
3070           return NULL;
3071         }
3072
3073       if (COMPLEX_MODE_P (mode))
3074         {
3075           zero = CONST0_RTX (GET_MODE_INNER (mode));
3076           if (zero != NULL)
3077             {
3078               write_complex_part (object, zero, 0);
3079               write_complex_part (object, zero, 1);
3080               return NULL;
3081             }
3082         }
3083     }
3084
3085   if (size == const0_rtx)
3086     return NULL;
3087
3088   align = MEM_ALIGN (object);
3089
3090   if (CONST_INT_P (size)
3091       && targetm.use_by_pieces_infrastructure_p (INTVAL (size), align,
3092                                                  CLEAR_BY_PIECES,
3093                                                  optimize_insn_for_speed_p ()))
3094     clear_by_pieces (object, INTVAL (size), align);
3095   else if (set_storage_via_setmem (object, size, const0_rtx, align,
3096                                    expected_align, expected_size,
3097                                    min_size, max_size, probable_max_size))
3098     ;
3099   else if (ADDR_SPACE_GENERIC_P (MEM_ADDR_SPACE (object)))
3100     return set_storage_via_libcall (object, size, const0_rtx,
3101                                     method == BLOCK_OP_TAILCALL);
3102   else
3103     gcc_unreachable ();
3104
3105   return NULL;
3106 }
3107
3108 rtx
3109 clear_storage (rtx object, rtx size, enum block_op_methods method)
3110 {
3111   unsigned HOST_WIDE_INT max, min = 0;
3112   if (GET_CODE (size) == CONST_INT)
3113     min = max = UINTVAL (size);
3114   else
3115     max = GET_MODE_MASK (GET_MODE (size));
3116   return clear_storage_hints (object, size, method, 0, -1, min, max, max);
3117 }
3118
3119
3120 /* A subroutine of clear_storage.  Expand a call to memset.
3121    Return the return value of memset, 0 otherwise.  */
3122
3123 rtx
3124 set_storage_via_libcall (rtx object, rtx size, rtx val, bool tailcall)
3125 {
3126   tree call_expr, fn, object_tree, size_tree, val_tree;
3127   machine_mode size_mode;
3128
3129   object = copy_addr_to_reg (XEXP (object, 0));
3130   object_tree = make_tree (ptr_type_node, object);
3131
3132   if (!CONST_INT_P (val))
3133     val = convert_to_mode (TYPE_MODE (integer_type_node), val, 1);
3134   val_tree = make_tree (integer_type_node, val);
3135
3136   size_mode = TYPE_MODE (sizetype);
3137   size = convert_to_mode (size_mode, size, 1);
3138   size = copy_to_mode_reg (size_mode, size);
3139   size_tree = make_tree (sizetype, size);
3140
3141   /* It is incorrect to use the libcall calling conventions for calls to
3142      memset because it can be provided by the user.  */
3143   fn = builtin_decl_implicit (BUILT_IN_MEMSET);
3144   call_expr = build_call_expr (fn, 3, object_tree, val_tree, size_tree);
3145   CALL_EXPR_TAILCALL (call_expr) = tailcall;
3146
3147   return expand_call (call_expr, NULL_RTX, false);
3148 }
3149 \f
3150 /* Expand a setmem pattern; return true if successful.  */
3151
3152 bool
3153 set_storage_via_setmem (rtx object, rtx size, rtx val, unsigned int align,
3154                         unsigned int expected_align, HOST_WIDE_INT expected_size,
3155                         unsigned HOST_WIDE_INT min_size,
3156                         unsigned HOST_WIDE_INT max_size,
3157                         unsigned HOST_WIDE_INT probable_max_size)
3158 {
3159   /* Try the most limited insn first, because there's no point
3160      including more than one in the machine description unless
3161      the more limited one has some advantage.  */
3162
3163   if (expected_align < align)
3164     expected_align = align;
3165   if (expected_size != -1)
3166     {
3167       if ((unsigned HOST_WIDE_INT)expected_size > max_size)
3168         expected_size = max_size;
3169       if ((unsigned HOST_WIDE_INT)expected_size < min_size)
3170         expected_size = min_size;
3171     }
3172
3173   opt_scalar_int_mode mode_iter;
3174   FOR_EACH_MODE_IN_CLASS (mode_iter, MODE_INT)
3175     {
3176       scalar_int_mode mode = mode_iter.require ();
3177       enum insn_code code = direct_optab_handler (setmem_optab, mode);
3178
3179       if (code != CODE_FOR_nothing
3180           /* We don't need MODE to be narrower than BITS_PER_HOST_WIDE_INT
3181              here because if SIZE is less than the mode mask, as it is
3182              returned by the macro, it will definitely be less than the
3183              actual mode mask.  Since SIZE is within the Pmode address
3184              space, we limit MODE to Pmode.  */
3185           && ((CONST_INT_P (size)
3186                && ((unsigned HOST_WIDE_INT) INTVAL (size)
3187                    <= (GET_MODE_MASK (mode) >> 1)))
3188               || max_size <= (GET_MODE_MASK (mode) >> 1)
3189               || GET_MODE_BITSIZE (mode) >= GET_MODE_BITSIZE (Pmode)))
3190         {
3191           class expand_operand ops[9];
3192           unsigned int nops;
3193
3194           nops = insn_data[(int) code].n_generator_args;
3195           gcc_assert (nops == 4 || nops == 6 || nops == 8 || nops == 9);
3196
3197           create_fixed_operand (&ops[0], object);
3198           /* The check above guarantees that this size conversion is valid.  */
3199           create_convert_operand_to (&ops[1], size, mode, true);
3200           create_convert_operand_from (&ops[2], val, byte_mode, true);
3201           create_integer_operand (&ops[3], align / BITS_PER_UNIT);
3202           if (nops >= 6)
3203             {
3204               create_integer_operand (&ops[4], expected_align / BITS_PER_UNIT);
3205               create_integer_operand (&ops[5], expected_size);
3206             }
3207           if (nops >= 8)
3208             {
3209               create_integer_operand (&ops[6], min_size);
3210               /* If we cannot represent the maximal size,
3211                  make parameter NULL.  */
3212               if ((HOST_WIDE_INT) max_size != -1)
3213                 create_integer_operand (&ops[7], max_size);
3214               else
3215                 create_fixed_operand (&ops[7], NULL);
3216             }
3217           if (nops == 9)
3218             {
3219               /* If we cannot represent the maximal size,
3220                  make parameter NULL.  */
3221               if ((HOST_WIDE_INT) probable_max_size != -1)
3222                 create_integer_operand (&ops[8], probable_max_size);
3223               else
3224                 create_fixed_operand (&ops[8], NULL);
3225             }
3226           if (maybe_expand_insn (code, nops, ops))
3227             return true;
3228         }
3229     }
3230
3231   return false;
3232 }
3233
3234 \f
3235 /* Write to one of the components of the complex value CPLX.  Write VAL to
3236    the real part if IMAG_P is false, and the imaginary part if its true.  */
3237
3238 void
3239 write_complex_part (rtx cplx, rtx val, bool imag_p)
3240 {
3241   machine_mode cmode;
3242   scalar_mode imode;
3243   unsigned ibitsize;
3244
3245   if (GET_CODE (cplx) == CONCAT)
3246     {
3247       emit_move_insn (XEXP (cplx, imag_p), val);
3248       return;
3249     }
3250
3251   cmode = GET_MODE (cplx);
3252   imode = GET_MODE_INNER (cmode);
3253   ibitsize = GET_MODE_BITSIZE (imode);
3254
3255   /* For MEMs simplify_gen_subreg may generate an invalid new address
3256      because, e.g., the original address is considered mode-dependent
3257      by the target, which restricts simplify_subreg from invoking
3258      adjust_address_nv.  Instead of preparing fallback support for an
3259      invalid address, we call adjust_address_nv directly.  */
3260   if (MEM_P (cplx))
3261     {
3262       emit_move_insn (adjust_address_nv (cplx, imode,
3263                                          imag_p ? GET_MODE_SIZE (imode) : 0),
3264                       val);
3265       return;
3266     }
3267
3268   /* If the sub-object is at least word sized, then we know that subregging
3269      will work.  This special case is important, since store_bit_field
3270      wants to operate on integer modes, and there's rarely an OImode to
3271      correspond to TCmode.  */
3272   if (ibitsize >= BITS_PER_WORD
3273       /* For hard regs we have exact predicates.  Assume we can split
3274          the original object if it spans an even number of hard regs.
3275          This special case is important for SCmode on 64-bit platforms
3276          where the natural size of floating-point regs is 32-bit.  */
3277       || (REG_P (cplx)
3278           && REGNO (cplx) < FIRST_PSEUDO_REGISTER
3279           && REG_NREGS (cplx) % 2 == 0))
3280     {
3281       rtx part = simplify_gen_subreg (imode, cplx, cmode,
3282                                       imag_p ? GET_MODE_SIZE (imode) : 0);
3283       if (part)
3284         {
3285           emit_move_insn (part, val);
3286           return;
3287         }
3288       else
3289         /* simplify_gen_subreg may fail for sub-word MEMs.  */
3290         gcc_assert (MEM_P (cplx) && ibitsize < BITS_PER_WORD);
3291     }
3292
3293   store_bit_field (cplx, ibitsize, imag_p ? ibitsize : 0, 0, 0, imode, val,
3294                    false);
3295 }
3296
3297 /* Extract one of the components of the complex value CPLX.  Extract the
3298    real part if IMAG_P is false, and the imaginary part if it's true.  */
3299
3300 rtx
3301 read_complex_part (rtx cplx, bool imag_p)
3302 {
3303   machine_mode cmode;
3304   scalar_mode imode;
3305   unsigned ibitsize;
3306
3307   if (GET_CODE (cplx) == CONCAT)
3308     return XEXP (cplx, imag_p);
3309
3310   cmode = GET_MODE (cplx);
3311   imode = GET_MODE_INNER (cmode);
3312   ibitsize = GET_MODE_BITSIZE (imode);
3313
3314   /* Special case reads from complex constants that got spilled to memory.  */
3315   if (MEM_P (cplx) && GET_CODE (XEXP (cplx, 0)) == SYMBOL_REF)
3316     {
3317       tree decl = SYMBOL_REF_DECL (XEXP (cplx, 0));
3318       if (decl && TREE_CODE (decl) == COMPLEX_CST)
3319         {
3320           tree part = imag_p ? TREE_IMAGPART (decl) : TREE_REALPART (decl);
3321           if (CONSTANT_CLASS_P (part))
3322             return expand_expr (part, NULL_RTX, imode, EXPAND_NORMAL);
3323         }
3324     }
3325
3326   /* For MEMs simplify_gen_subreg may generate an invalid new address
3327      because, e.g., the original address is considered mode-dependent
3328      by the target, which restricts simplify_subreg from invoking
3329      adjust_address_nv.  Instead of preparing fallback support for an
3330      invalid address, we call adjust_address_nv directly.  */
3331   if (MEM_P (cplx))
3332     return adjust_address_nv (cplx, imode,
3333                               imag_p ? GET_MODE_SIZE (imode) : 0);
3334
3335   /* If the sub-object is at least word sized, then we know that subregging
3336      will work.  This special case is important, since extract_bit_field
3337      wants to operate on integer modes, and there's rarely an OImode to
3338      correspond to TCmode.  */
3339   if (ibitsize >= BITS_PER_WORD
3340       /* For hard regs we have exact predicates.  Assume we can split
3341          the original object if it spans an even number of hard regs.
3342          This special case is important for SCmode on 64-bit platforms
3343          where the natural size of floating-point regs is 32-bit.  */
3344       || (REG_P (cplx)
3345           && REGNO (cplx) < FIRST_PSEUDO_REGISTER
3346           && REG_NREGS (cplx) % 2 == 0))
3347     {
3348       rtx ret = simplify_gen_subreg (imode, cplx, cmode,
3349                                      imag_p ? GET_MODE_SIZE (imode) : 0);
3350       if (ret)
3351         return ret;
3352       else
3353         /* simplify_gen_subreg may fail for sub-word MEMs.  */
3354         gcc_assert (MEM_P (cplx) && ibitsize < BITS_PER_WORD);
3355     }
3356
3357   return extract_bit_field (cplx, ibitsize, imag_p ? ibitsize : 0,
3358                             true, NULL_RTX, imode, imode, false, NULL);
3359 }
3360 \f
3361 /* A subroutine of emit_move_insn_1.  Yet another lowpart generator.
3362    NEW_MODE and OLD_MODE are the same size.  Return NULL if X cannot be
3363    represented in NEW_MODE.  If FORCE is true, this will never happen, as
3364    we'll force-create a SUBREG if needed.  */
3365
3366 static rtx
3367 emit_move_change_mode (machine_mode new_mode,
3368                        machine_mode old_mode, rtx x, bool force)
3369 {
3370   rtx ret;
3371
3372   if (push_operand (x, GET_MODE (x)))
3373     {
3374       ret = gen_rtx_MEM (new_mode, XEXP (x, 0));
3375       MEM_COPY_ATTRIBUTES (ret, x);
3376     }
3377   else if (MEM_P (x))
3378     {
3379       /* We don't have to worry about changing the address since the
3380          size in bytes is supposed to be the same.  */
3381       if (reload_in_progress)
3382         {
3383           /* Copy the MEM to change the mode and move any
3384              substitutions from the old MEM to the new one.  */
3385           ret = adjust_address_nv (x, new_mode, 0);
3386           copy_replacements (x, ret);
3387         }
3388       else
3389         ret = adjust_address (x, new_mode, 0);
3390     }
3391   else
3392     {
3393       /* Note that we do want simplify_subreg's behavior of validating
3394          that the new mode is ok for a hard register.  If we were to use
3395          simplify_gen_subreg, we would create the subreg, but would
3396          probably run into the target not being able to implement it.  */
3397       /* Except, of course, when FORCE is true, when this is exactly what
3398          we want.  Which is needed for CCmodes on some targets.  */
3399       if (force)
3400         ret = simplify_gen_subreg (new_mode, x, old_mode, 0);
3401       else
3402         ret = simplify_subreg (new_mode, x, old_mode, 0);
3403     }
3404
3405   return ret;
3406 }
3407
3408 /* A subroutine of emit_move_insn_1.  Generate a move from Y into X using
3409    an integer mode of the same size as MODE.  Returns the instruction
3410    emitted, or NULL if such a move could not be generated.  */
3411
3412 static rtx_insn *
3413 emit_move_via_integer (machine_mode mode, rtx x, rtx y, bool force)
3414 {
3415   scalar_int_mode imode;
3416   enum insn_code code;
3417
3418   /* There must exist a mode of the exact size we require.  */
3419   if (!int_mode_for_mode (mode).exists (&imode))
3420     return NULL;
3421
3422   /* The target must support moves in this mode.  */
3423   code = optab_handler (mov_optab, imode);
3424   if (code == CODE_FOR_nothing)
3425     return NULL;
3426
3427   x = emit_move_change_mode (imode, mode, x, force);
3428   if (x == NULL_RTX)
3429     return NULL;
3430   y = emit_move_change_mode (imode, mode, y, force);
3431   if (y == NULL_RTX)
3432     return NULL;
3433   return emit_insn (GEN_FCN (code) (x, y));
3434 }
3435
3436 /* A subroutine of emit_move_insn_1.  X is a push_operand in MODE.
3437    Return an equivalent MEM that does not use an auto-increment.  */
3438
3439 rtx
3440 emit_move_resolve_push (machine_mode mode, rtx x)
3441 {
3442   enum rtx_code code = GET_CODE (XEXP (x, 0));
3443   rtx temp;
3444
3445   poly_int64 adjust = GET_MODE_SIZE (mode);
3446 #ifdef PUSH_ROUNDING
3447   adjust = PUSH_ROUNDING (adjust);
3448 #endif
3449   if (code == PRE_DEC || code == POST_DEC)
3450     adjust = -adjust;
3451   else if (code == PRE_MODIFY || code == POST_MODIFY)
3452     {
3453       rtx expr = XEXP (XEXP (x, 0), 1);
3454
3455       gcc_assert (GET_CODE (expr) == PLUS || GET_CODE (expr) == MINUS);
3456       poly_int64 val = rtx_to_poly_int64 (XEXP (expr, 1));
3457       if (GET_CODE (expr) == MINUS)
3458         val = -val;
3459       gcc_assert (known_eq (adjust, val) || known_eq (adjust, -val));
3460       adjust = val;
3461     }
3462
3463   /* Do not use anti_adjust_stack, since we don't want to update
3464      stack_pointer_delta.  */
3465   temp = expand_simple_binop (Pmode, PLUS, stack_pointer_rtx,
3466                               gen_int_mode (adjust, Pmode), stack_pointer_rtx,
3467                               0, OPTAB_LIB_WIDEN);
3468   if (temp != stack_pointer_rtx)
3469     emit_move_insn (stack_pointer_rtx, temp);
3470
3471   switch (code)
3472     {
3473     case PRE_INC:
3474     case PRE_DEC:
3475     case PRE_MODIFY:
3476       temp = stack_pointer_rtx;
3477       break;
3478     case POST_INC:
3479     case POST_DEC:
3480     case POST_MODIFY:
3481       temp = plus_constant (Pmode, stack_pointer_rtx, -adjust);
3482       break;
3483     default:
3484       gcc_unreachable ();
3485     }
3486
3487   return replace_equiv_address (x, temp);
3488 }
3489
3490 /* A subroutine of emit_move_complex.  Generate a move from Y into X.
3491    X is known to satisfy push_operand, and MODE is known to be complex.
3492    Returns the last instruction emitted.  */
3493
3494 rtx_insn *
3495 emit_move_complex_push (machine_mode mode, rtx x, rtx y)
3496 {
3497   scalar_mode submode = GET_MODE_INNER (mode);
3498   bool imag_first;
3499
3500 #ifdef PUSH_ROUNDING
3501   poly_int64 submodesize = GET_MODE_SIZE (submode);
3502
3503   /* In case we output to the stack, but the size is smaller than the
3504      machine can push exactly, we need to use move instructions.  */
3505   if (maybe_ne (PUSH_ROUNDING (submodesize), submodesize))
3506     {
3507       x = emit_move_resolve_push (mode, x);
3508       return emit_move_insn (x, y);
3509     }
3510 #endif
3511
3512   /* Note that the real part always precedes the imag part in memory
3513      regardless of machine's endianness.  */
3514   switch (GET_CODE (XEXP (x, 0)))
3515     {
3516     case PRE_DEC:
3517     case POST_DEC:
3518       imag_first = true;
3519       break;
3520     case PRE_INC:
3521     case POST_INC:
3522       imag_first = false;
3523       break;
3524     default:
3525       gcc_unreachable ();
3526     }
3527
3528   emit_move_insn (gen_rtx_MEM (submode, XEXP (x, 0)),
3529                   read_complex_part (y, imag_first));
3530   return emit_move_insn (gen_rtx_MEM (submode, XEXP (x, 0)),
3531                          read_complex_part (y, !imag_first));
3532 }
3533
3534 /* A subroutine of emit_move_complex.  Perform the move from Y to X
3535    via two moves of the parts.  Returns the last instruction emitted.  */
3536
3537 rtx_insn *
3538 emit_move_complex_parts (rtx x, rtx y)
3539 {
3540   /* Show the output dies here.  This is necessary for SUBREGs
3541      of pseudos since we cannot track their lifetimes correctly;
3542      hard regs shouldn't appear here except as return values.  */
3543   if (!reload_completed && !reload_in_progress
3544       && REG_P (x) && !reg_overlap_mentioned_p (x, y))
3545     emit_clobber (x);
3546
3547   write_complex_part (x, read_complex_part (y, false), false);
3548   write_complex_part (x, read_complex_part (y, true), true);
3549
3550   return get_last_insn ();
3551 }
3552
3553 /* A subroutine of emit_move_insn_1.  Generate a move from Y into X.
3554    MODE is known to be complex.  Returns the last instruction emitted.  */
3555
3556 static rtx_insn *
3557 emit_move_complex (machine_mode mode, rtx x, rtx y)
3558 {
3559   bool try_int;
3560
3561   /* Need to take special care for pushes, to maintain proper ordering
3562      of the data, and possibly extra padding.  */
3563   if (push_operand (x, mode))
3564     return emit_move_complex_push (mode, x, y);
3565
3566   /* See if we can coerce the target into moving both values at once, except
3567      for floating point where we favor moving as parts if this is easy.  */
3568   if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT
3569       && optab_handler (mov_optab, GET_MODE_INNER (mode)) != CODE_FOR_nothing
3570       && !(REG_P (x)
3571            && HARD_REGISTER_P (x)
3572            && REG_NREGS (x) == 1)
3573       && !(REG_P (y)
3574            && HARD_REGISTER_P (y)
3575            && REG_NREGS (y) == 1))
3576     try_int = false;
3577   /* Not possible if the values are inherently not adjacent.  */
3578   else if (GET_CODE (x) == CONCAT || GET_CODE (y) == CONCAT)
3579     try_int = false;
3580   /* Is possible if both are registers (or subregs of registers).  */
3581   else if (register_operand (x, mode) && register_operand (y, mode))
3582     try_int = true;
3583   /* If one of the operands is a memory, and alignment constraints
3584      are friendly enough, we may be able to do combined memory operations.
3585      We do not attempt this if Y is a constant because that combination is
3586      usually better with the by-parts thing below.  */
3587   else if ((MEM_P (x) ? !CONSTANT_P (y) : MEM_P (y))
3588            && (!STRICT_ALIGNMENT
3589                || get_mode_alignment (mode) == BIGGEST_ALIGNMENT))
3590     try_int = true;
3591   else
3592     try_int = false;
3593
3594   if (try_int)
3595     {
3596       rtx_insn *ret;
3597
3598       /* For memory to memory moves, optimal behavior can be had with the
3599          existing block move logic.  But use normal expansion if optimizing
3600          for size.  */
3601       if (MEM_P (x) && MEM_P (y))
3602         {
3603           emit_block_move (x, y, gen_int_mode (GET_MODE_SIZE (mode), Pmode),
3604                            (optimize_insn_for_speed_p()
3605                             ? BLOCK_OP_NO_LIBCALL : BLOCK_OP_NORMAL));
3606           return get_last_insn ();
3607         }
3608
3609       ret = emit_move_via_integer (mode, x, y, true);
3610       if (ret)
3611         return ret;
3612     }
3613
3614   return emit_move_complex_parts (x, y);
3615 }
3616
3617 /* A subroutine of emit_move_insn_1.  Generate a move from Y into X.
3618    MODE is known to be MODE_CC.  Returns the last instruction emitted.  */
3619
3620 static rtx_insn *
3621 emit_move_ccmode (machine_mode mode, rtx x, rtx y)
3622 {
3623   rtx_insn *ret;
3624
3625   /* Assume all MODE_CC modes are equivalent; if we have movcc, use it.  */
3626   if (mode != CCmode)
3627     {
3628       enum insn_code code = optab_handler (mov_optab, CCmode);
3629       if (code != CODE_FOR_nothing)
3630         {
3631           x = emit_move_change_mode (CCmode, mode, x, true);
3632           y = emit_move_change_mode (CCmode, mode, y, true);
3633           return emit_insn (GEN_FCN (code) (x, y));
3634         }
3635     }
3636
3637   /* Otherwise, find the MODE_INT mode of the same width.  */
3638   ret = emit_move_via_integer (mode, x, y, false);
3639   gcc_assert (ret != NULL);
3640   return ret;
3641 }
3642
3643 /* Return true if word I of OP lies entirely in the
3644    undefined bits of a paradoxical subreg.  */
3645
3646 static bool
3647 undefined_operand_subword_p (const_rtx op, int i)
3648 {
3649   if (GET_CODE (op) != SUBREG)
3650     return false;
3651   machine_mode innermostmode = GET_MODE (SUBREG_REG (op));
3652   poly_int64 offset = i * UNITS_PER_WORD + subreg_memory_offset (op);
3653   return (known_ge (offset, GET_MODE_SIZE (innermostmode))
3654           || known_le (offset, -UNITS_PER_WORD));
3655 }
3656
3657 /* A subroutine of emit_move_insn_1.  Generate a move from Y into X.
3658    MODE is any multi-word or full-word mode that lacks a move_insn
3659    pattern.  Note that you will get better code if you define such
3660    patterns, even if they must turn into multiple assembler instructions.  */
3661
3662 static rtx_insn *
3663 emit_move_multi_word (machine_mode mode, rtx x, rtx y)
3664 {
3665   rtx_insn *last_insn = 0;
3666   rtx_insn *seq;
3667   rtx inner;
3668   bool need_clobber;
3669   int i, mode_size;
3670
3671   /* This function can only handle cases where the number of words is
3672      known at compile time.  */
3673   mode_size = GET_MODE_SIZE (mode).to_constant ();
3674   gcc_assert (mode_size >= UNITS_PER_WORD);
3675
3676   /* If X is a push on the stack, do the push now and replace
3677      X with a reference to the stack pointer.  */
3678   if (push_operand (x, mode))
3679     x = emit_move_resolve_push (mode, x);
3680
3681   /* If we are in reload, see if either operand is a MEM whose address
3682      is scheduled for replacement.  */
3683   if (reload_in_progress && MEM_P (x)
3684       && (inner = find_replacement (&XEXP (x, 0))) != XEXP (x, 0))
3685     x = replace_equiv_address_nv (x, inner);
3686   if (reload_in_progress && MEM_P (y)
3687       && (inner = find_replacement (&XEXP (y, 0))) != XEXP (y, 0))
3688     y = replace_equiv_address_nv (y, inner);
3689
3690   start_sequence ();
3691
3692   need_clobber = false;
3693   for (i = 0; i < CEIL (mode_size, UNITS_PER_WORD); i++)
3694     {
3695       /* Do not generate code for a move if it would go entirely
3696          to the non-existing bits of a paradoxical subreg.  */
3697       if (undefined_operand_subword_p (x, i))
3698         continue;
3699
3700       rtx xpart = operand_subword (x, i, 1, mode);
3701       rtx ypart;
3702
3703       /* Do not generate code for a move if it would come entirely
3704          from the undefined bits of a paradoxical subreg.  */
3705       if (undefined_operand_subword_p (y, i))
3706         continue;
3707
3708       ypart = operand_subword (y, i, 1, mode);
3709
3710       /* If we can't get a part of Y, put Y into memory if it is a
3711          constant.  Otherwise, force it into a register.  Then we must
3712          be able to get a part of Y.  */
3713       if (ypart == 0 && CONSTANT_P (y))
3714         {
3715           y = use_anchored_address (force_const_mem (mode, y));
3716           ypart = operand_subword (y, i, 1, mode);
3717         }
3718       else if (ypart == 0)
3719         ypart = operand_subword_force (y, i, mode);
3720
3721       gcc_assert (xpart && ypart);
3722
3723       need_clobber |= (GET_CODE (xpart) == SUBREG);
3724
3725       last_insn = emit_move_insn (xpart, ypart);
3726     }
3727
3728   seq = get_insns ();
3729   end_sequence ();
3730
3731   /* Show the output dies here.  This is necessary for SUBREGs
3732      of pseudos since we cannot track their lifetimes correctly;
3733      hard regs shouldn't appear here except as return values.
3734      We never want to emit such a clobber after reload.  */
3735   if (x != y
3736       && ! (reload_in_progress || reload_completed)
3737       && need_clobber != 0)
3738     emit_clobber (x);
3739
3740   emit_insn (seq);
3741
3742   return last_insn;
3743 }
3744
3745 /* Low level part of emit_move_insn.
3746    Called just like emit_move_insn, but assumes X and Y
3747    are basically valid.  */
3748
3749 rtx_insn *
3750 emit_move_insn_1 (rtx x, rtx y)
3751 {
3752   machine_mode mode = GET_MODE (x);
3753   enum insn_code code;
3754
3755   gcc_assert ((unsigned int) mode < (unsigned int) MAX_MACHINE_MODE);
3756
3757   code = optab_handler (mov_optab, mode);
3758   if (code != CODE_FOR_nothing)
3759     return emit_insn (GEN_FCN (code) (x, y));
3760
3761   /* Expand complex moves by moving real part and imag part.  */
3762   if (COMPLEX_MODE_P (mode))
3763     return emit_move_complex (mode, x, y);
3764
3765   if (GET_MODE_CLASS (mode) == MODE_DECIMAL_FLOAT
3766       || ALL_FIXED_POINT_MODE_P (mode))
3767     {
3768       rtx_insn *result = emit_move_via_integer (mode, x, y, true);
3769
3770       /* If we can't find an integer mode, use multi words.  */
3771       if (result)
3772         return result;
3773       else
3774         return emit_move_multi_word (mode, x, y);
3775     }
3776
3777   if (GET_MODE_CLASS (mode) == MODE_CC)
3778     return emit_move_ccmode (mode, x, y);
3779
3780   /* Try using a move pattern for the corresponding integer mode.  This is
3781      only safe when simplify_subreg can convert MODE constants into integer
3782      constants.  At present, it can only do this reliably if the value
3783      fits within a HOST_WIDE_INT.  */
3784   if (!CONSTANT_P (y)
3785       || known_le (GET_MODE_BITSIZE (mode), HOST_BITS_PER_WIDE_INT))
3786     {
3787       rtx_insn *ret = emit_move_via_integer (mode, x, y, lra_in_progress);
3788
3789       if (ret)
3790         {
3791           if (! lra_in_progress || recog (PATTERN (ret), ret, 0) >= 0)
3792             return ret;
3793         }
3794     }
3795
3796   return emit_move_multi_word (mode, x, y);
3797 }
3798
3799 /* Generate code to copy Y into X.
3800    Both Y and X must have the same mode, except that
3801    Y can be a constant with VOIDmode.
3802    This mode cannot be BLKmode; use emit_block_move for that.
3803
3804    Return the last instruction emitted.  */
3805
3806 rtx_insn *
3807 emit_move_insn (rtx x, rtx y)
3808 {
3809   machine_mode mode = GET_MODE (x);
3810   rtx y_cst = NULL_RTX;
3811   rtx_insn *last_insn;
3812   rtx set;
3813
3814   gcc_assert (mode != BLKmode
3815               && (GET_MODE (y) == mode || GET_MODE (y) == VOIDmode));
3816
3817   if (CONSTANT_P (y))
3818     {
3819       if (optimize
3820           && SCALAR_FLOAT_MODE_P (GET_MODE (x))
3821           && (last_insn = compress_float_constant (x, y)))
3822         return last_insn;
3823
3824       y_cst = y;
3825
3826       if (!targetm.legitimate_constant_p (mode, y))
3827         {
3828           y = force_const_mem (mode, y);
3829
3830           /* If the target's cannot_force_const_mem prevented the spill,
3831              assume that the target's move expanders will also take care
3832              of the non-legitimate constant.  */
3833           if (!y)
3834             y = y_cst;
3835           else
3836             y = use_anchored_address (y);
3837         }
3838     }
3839
3840   /* If X or Y are memory references, verify that their addresses are valid
3841      for the machine.  */
3842   if (MEM_P (x)
3843       && (! memory_address_addr_space_p (GET_MODE (x), XEXP (x, 0),
3844                                          MEM_ADDR_SPACE (x))
3845           && ! push_operand (x, GET_MODE (x))))
3846     x = validize_mem (x);
3847
3848   if (MEM_P (y)
3849       && ! memory_address_addr_space_p (GET_MODE (y), XEXP (y, 0),
3850                                         MEM_ADDR_SPACE (y)))
3851     y = validize_mem (y);
3852
3853   gcc_assert (mode != BLKmode);
3854
3855   last_insn = emit_move_insn_1 (x, y);
3856
3857   if (y_cst && REG_P (x)
3858       && (set = single_set (last_insn)) != NULL_RTX
3859       && SET_DEST (set) == x
3860       && ! rtx_equal_p (y_cst, SET_SRC (set)))
3861     set_unique_reg_note (last_insn, REG_EQUAL, copy_rtx (y_cst));
3862
3863   return last_insn;
3864 }
3865
3866 /* Generate the body of an instruction to copy Y into X.
3867    It may be a list of insns, if one insn isn't enough.  */
3868
3869 rtx_insn *
3870 gen_move_insn (rtx x, rtx y)
3871 {
3872   rtx_insn *seq;
3873
3874   start_sequence ();
3875   emit_move_insn_1 (x, y);
3876   seq = get_insns ();
3877   end_sequence ();
3878   return seq;
3879 }
3880
3881 /* If Y is representable exactly in a narrower mode, and the target can
3882    perform the extension directly from constant or memory, then emit the
3883    move as an extension.  */
3884
3885 static rtx_insn *
3886 compress_float_constant (rtx x, rtx y)
3887 {
3888   machine_mode dstmode = GET_MODE (x);
3889   machine_mode orig_srcmode = GET_MODE (y);
3890   machine_mode srcmode;
3891   const REAL_VALUE_TYPE *r;
3892   int oldcost, newcost;
3893   bool speed = optimize_insn_for_speed_p ();
3894
3895   r = CONST_DOUBLE_REAL_VALUE (y);
3896
3897   if (targetm.legitimate_constant_p (dstmode, y))
3898     oldcost = set_src_cost (y, orig_srcmode, speed);
3899   else
3900     oldcost = set_src_cost (force_const_mem (dstmode, y), dstmode, speed);
3901
3902   FOR_EACH_MODE_UNTIL (srcmode, orig_srcmode)
3903     {
3904       enum insn_code ic;
3905       rtx trunc_y;
3906       rtx_insn *last_insn;
3907
3908       /* Skip if the target can't extend this way.  */
3909       ic = can_extend_p (dstmode, srcmode, 0);
3910       if (ic == CODE_FOR_nothing)
3911         continue;
3912
3913       /* Skip if the narrowed value isn't exact.  */
3914       if (! exact_real_truncate (srcmode, r))
3915         continue;
3916
3917       trunc_y = const_double_from_real_value (*r, srcmode);
3918
3919       if (targetm.legitimate_constant_p (srcmode, trunc_y))
3920         {
3921           /* Skip if the target needs extra instructions to perform
3922              the extension.  */
3923           if (!insn_operand_matches (ic, 1, trunc_y))
3924             continue;
3925           /* This is valid, but may not be cheaper than the original. */
3926           newcost = set_src_cost (gen_rtx_FLOAT_EXTEND (dstmode, trunc_y),
3927                                   dstmode, speed);
3928           if (oldcost < newcost)
3929             continue;
3930         }
3931       else if (float_extend_from_mem[dstmode][srcmode])
3932         {
3933           trunc_y = force_const_mem (srcmode, trunc_y);
3934           /* This is valid, but may not be cheaper than the original. */
3935           newcost = set_src_cost (gen_rtx_FLOAT_EXTEND (dstmode, trunc_y),
3936                                   dstmode, speed);
3937           if (oldcost < newcost)
3938             continue;
3939           trunc_y = validize_mem (trunc_y);
3940         }
3941       else
3942         continue;
3943
3944       /* For CSE's benefit, force the compressed constant pool entry
3945          into a new pseudo.  This constant may be used in different modes,
3946          and if not, combine will put things back together for us.  */
3947       trunc_y = force_reg (srcmode, trunc_y);
3948
3949       /* If x is a hard register, perform the extension into a pseudo,
3950          so that e.g. stack realignment code is aware of it.  */
3951       rtx target = x;
3952       if (REG_P (x) && HARD_REGISTER_P (x))
3953         target = gen_reg_rtx (dstmode);
3954
3955       emit_unop_insn (ic, target, trunc_y, UNKNOWN);
3956       last_insn = get_last_insn ();
3957
3958       if (REG_P (target))
3959         set_unique_reg_note (last_insn, REG_EQUAL, y);
3960
3961       if (target != x)
3962         return emit_move_insn (x, target);
3963       return last_insn;
3964     }
3965
3966   return NULL;
3967 }
3968 \f
3969 /* Pushing data onto the stack.  */
3970
3971 /* Push a block of length SIZE (perhaps variable)
3972    and return an rtx to address the beginning of the block.
3973    The value may be virtual_outgoing_args_rtx.
3974
3975    EXTRA is the number of bytes of padding to push in addition to SIZE.
3976    BELOW nonzero means this padding comes at low addresses;
3977    otherwise, the padding comes at high addresses.  */
3978
3979 rtx
3980 push_block (rtx size, poly_int64 extra, int below)
3981 {
3982   rtx temp;
3983
3984   size = convert_modes (Pmode, ptr_mode, size, 1);
3985   if (CONSTANT_P (size))
3986     anti_adjust_stack (plus_constant (Pmode, size, extra));
3987   else if (REG_P (size) && known_eq (extra, 0))
3988     anti_adjust_stack (size);
3989   else
3990     {
3991       temp = copy_to_mode_reg (Pmode, size);
3992       if (maybe_ne (extra, 0))
3993         temp = expand_binop (Pmode, add_optab, temp,
3994                              gen_int_mode (extra, Pmode),
3995                              temp, 0, OPTAB_LIB_WIDEN);
3996       anti_adjust_stack (temp);
3997     }
3998
3999   if (STACK_GROWS_DOWNWARD)
4000     {
4001       temp = virtual_outgoing_args_rtx;
4002       if (maybe_ne (extra, 0) && below)
4003         temp = plus_constant (Pmode, temp, extra);
4004     }
4005   else
4006     {
4007       poly_int64 csize;
4008       if (poly_int_rtx_p (size, &csize))
4009         temp = plus_constant (Pmode, virtual_outgoing_args_rtx,
4010                               -csize - (below ? 0 : extra));
4011       else if (maybe_ne (extra, 0) && !below)
4012         temp = gen_rtx_PLUS (Pmode, virtual_outgoing_args_rtx,
4013                              negate_rtx (Pmode, plus_constant (Pmode, size,
4014                                                                extra)));
4015       else
4016         temp = gen_rtx_PLUS (Pmode, virtual_outgoing_args_rtx,
4017                              negate_rtx (Pmode, size));
4018     }
4019
4020   return memory_address (NARROWEST_INT_MODE, temp);
4021 }
4022
4023 /* A utility routine that returns the base of an auto-inc memory, or NULL.  */
4024
4025 static rtx
4026 mem_autoinc_base (rtx mem)
4027 {
4028   if (MEM_P (mem))
4029     {
4030       rtx addr = XEXP (mem, 0);
4031       if (GET_RTX_CLASS (GET_CODE (addr)) == RTX_AUTOINC)
4032         return XEXP (addr, 0);
4033     }
4034   return NULL;
4035 }
4036
4037 /* A utility routine used here, in reload, and in try_split.  The insns
4038    after PREV up to and including LAST are known to adjust the stack,
4039    with a final value of END_ARGS_SIZE.  Iterate backward from LAST
4040    placing notes as appropriate.  PREV may be NULL, indicating the
4041    entire insn sequence prior to LAST should be scanned.
4042
4043    The set of allowed stack pointer modifications is small:
4044      (1) One or more auto-inc style memory references (aka pushes),
4045      (2) One or more addition/subtraction with the SP as destination,
4046      (3) A single move insn with the SP as destination,
4047      (4) A call_pop insn,
4048      (5) Noreturn call insns if !ACCUMULATE_OUTGOING_ARGS.
4049
4050    Insns in the sequence that do not modify the SP are ignored,
4051    except for noreturn calls.
4052
4053    The return value is the amount of adjustment that can be trivially
4054    verified, via immediate operand or auto-inc.  If the adjustment
4055    cannot be trivially extracted, the return value is HOST_WIDE_INT_MIN.  */
4056
4057 poly_int64
4058 find_args_size_adjust (rtx_insn *insn)
4059 {
4060   rtx dest, set, pat;
4061   int i;
4062
4063   pat = PATTERN (insn);
4064   set = NULL;
4065
4066   /* Look for a call_pop pattern.  */
4067   if (CALL_P (insn))
4068     {
4069       /* We have to allow non-call_pop patterns for the case
4070          of emit_single_push_insn of a TLS address.  */
4071       if (GET_CODE (pat) != PARALLEL)
4072         return 0;
4073
4074       /* All call_pop have a stack pointer adjust in the parallel.
4075          The call itself is always first, and the stack adjust is
4076          usually last, so search from the end.  */
4077       for (i = XVECLEN (pat, 0) - 1; i > 0; --i)
4078         {
4079           set = XVECEXP (pat, 0, i);
4080           if (GET_CODE (set) != SET)
4081             continue;
4082           dest = SET_DEST (set);
4083           if (dest == stack_pointer_rtx)
4084             break;
4085         }
4086       /* We'd better have found the stack pointer adjust.  */
4087       if (i == 0)
4088         return 0;
4089       /* Fall through to process the extracted SET and DEST
4090          as if it was a standalone insn.  */
4091     }
4092   else if (GET_CODE (pat) == SET)
4093     set = pat;
4094   else if ((set = single_set (insn)) != NULL)
4095     ;
4096   else if (GET_CODE (pat) == PARALLEL)
4097     {
4098       /* ??? Some older ports use a parallel with a stack adjust
4099          and a store for a PUSH_ROUNDING pattern, rather than a
4100          PRE/POST_MODIFY rtx.  Don't force them to update yet...  */
4101       /* ??? See h8300 and m68k, pushqi1.  */
4102       for (i = XVECLEN (pat, 0) - 1; i >= 0; --i)
4103         {
4104           set = XVECEXP (pat, 0, i);
4105           if (GET_CODE (set) != SET)
4106             continue;
4107           dest = SET_DEST (set);
4108           if (dest == stack_pointer_rtx)
4109             break;
4110
4111           /* We do not expect an auto-inc of the sp in the parallel.  */
4112           gcc_checking_assert (mem_autoinc_base (dest) != stack_pointer_rtx);
4113           gcc_checking_assert (mem_autoinc_base (SET_SRC (set))
4114                                != stack_pointer_rtx);
4115         }
4116       if (i < 0)
4117         return 0;
4118     }
4119   else
4120     return 0;
4121
4122   dest = SET_DEST (set);
4123
4124   /* Look for direct modifications of the stack pointer.  */
4125   if (REG_P (dest) && REGNO (dest) == STACK_POINTER_REGNUM)
4126     {
4127       /* Look for a trivial adjustment, otherwise assume nothing.  */
4128       /* Note that the SPU restore_stack_block pattern refers to
4129          the stack pointer in V4SImode.  Consider that non-trivial.  */
4130       poly_int64 offset;
4131       if (SCALAR_INT_MODE_P (GET_MODE (dest))
4132           && strip_offset (SET_SRC (set), &offset) == stack_pointer_rtx)
4133         return offset;
4134       /* ??? Reload can generate no-op moves, which will be cleaned
4135          up later.  Recognize it and continue searching.  */
4136       else if (rtx_equal_p (dest, SET_SRC (set)))
4137         return 0;
4138       else
4139         return HOST_WIDE_INT_MIN;
4140     }
4141   else
4142     {
4143       rtx mem, addr;
4144
4145       /* Otherwise only think about autoinc patterns.  */
4146       if (mem_autoinc_base (dest) == stack_pointer_rtx)
4147         {
4148           mem = dest;
4149           gcc_checking_assert (mem_autoinc_base (SET_SRC (set))
4150                                != stack_pointer_rtx);
4151         }
4152       else if (mem_autoinc_base (SET_SRC (set)) == stack_pointer_rtx)
4153         mem = SET_SRC (set);
4154       else
4155         return 0;
4156
4157       addr = XEXP (mem, 0);
4158       switch (GET_CODE (addr))
4159         {
4160         case PRE_INC:
4161         case POST_INC:
4162           return GET_MODE_SIZE (GET_MODE (mem));
4163         case PRE_DEC:
4164         case POST_DEC:
4165           return -GET_MODE_SIZE (GET_MODE (mem));
4166         case PRE_MODIFY:
4167         case POST_MODIFY:
4168           addr = XEXP (addr, 1);
4169           gcc_assert (GET_CODE (addr) == PLUS);
4170           gcc_assert (XEXP (addr, 0) == stack_pointer_rtx);
4171           return rtx_to_poly_int64 (XEXP (addr, 1));
4172         default:
4173           gcc_unreachable ();
4174         }
4175     }
4176 }
4177
4178 poly_int64
4179 fixup_args_size_notes (rtx_insn *prev, rtx_insn *last,
4180                        poly_int64 end_args_size)
4181 {
4182   poly_int64 args_size = end_args_size;
4183   bool saw_unknown = false;
4184   rtx_insn *insn;
4185
4186   for (insn = last; insn != prev; insn = PREV_INSN (insn))
4187     {
4188       if (!NONDEBUG_INSN_P (insn))
4189         continue;
4190
4191       /* We might have existing REG_ARGS_SIZE notes, e.g. when pushing
4192          a call argument containing a TLS address that itself requires
4193          a call to __tls_get_addr.  The handling of stack_pointer_delta
4194          in emit_single_push_insn is supposed to ensure that any such
4195          notes are already correct.  */
4196       rtx note = find_reg_note (insn, REG_ARGS_SIZE, NULL_RTX);
4197       gcc_assert (!note || known_eq (args_size, get_args_size (note)));
4198
4199       poly_int64 this_delta = find_args_size_adjust (insn);
4200       if (known_eq (this_delta, 0))
4201         {
4202           if (!CALL_P (insn)
4203               || ACCUMULATE_OUTGOING_ARGS
4204               || find_reg_note (insn, REG_NORETURN, NULL_RTX) == NULL_RTX)
4205             continue;
4206         }
4207
4208       gcc_assert (!saw_unknown);
4209       if (known_eq (this_delta, HOST_WIDE_INT_MIN))
4210         saw_unknown = true;
4211
4212       if (!note)
4213         add_args_size_note (insn, args_size);
4214       if (STACK_GROWS_DOWNWARD)
4215         this_delta = -poly_uint64 (this_delta);
4216
4217       if (saw_unknown)
4218         args_size = HOST_WIDE_INT_MIN;
4219       else
4220         args_size -= this_delta;
4221     }
4222
4223   return args_size;
4224 }
4225
4226 #ifdef PUSH_ROUNDING
4227 /* Emit single push insn.  */
4228
4229 static void
4230 emit_single_push_insn_1 (machine_mode mode, rtx x, tree type)
4231 {
4232   rtx dest_addr;
4233   poly_int64 rounded_size = PUSH_ROUNDING (GET_MODE_SIZE (mode));
4234   rtx dest;
4235   enum insn_code icode;
4236
4237   /* If there is push pattern, use it.  Otherwise try old way of throwing
4238      MEM representing push operation to move expander.  */
4239   icode = optab_handler (push_optab, mode);
4240   if (icode != CODE_FOR_nothing)
4241     {
4242       class expand_operand ops[1];
4243
4244       create_input_operand (&ops[0], x, mode);
4245       if (maybe_expand_insn (icode, 1, ops))
4246         return;
4247     }
4248   if (known_eq (GET_MODE_SIZE (mode), rounded_size))
4249     dest_addr = gen_rtx_fmt_e (STACK_PUSH_CODE, Pmode, stack_pointer_rtx);
4250   /* If we are to pad downward, adjust the stack pointer first and
4251      then store X into the stack location using an offset.  This is
4252      because emit_move_insn does not know how to pad; it does not have
4253      access to type.  */
4254   else if (targetm.calls.function_arg_padding (mode, type) == PAD_DOWNWARD)
4255     {
4256       emit_move_insn (stack_pointer_rtx,
4257                       expand_binop (Pmode,
4258                                     STACK_GROWS_DOWNWARD ? sub_optab
4259                                     : add_optab,
4260                                     stack_pointer_rtx,
4261                                     gen_int_mode (rounded_size, Pmode),
4262                                     NULL_RTX, 0, OPTAB_LIB_WIDEN));
4263
4264       poly_int64 offset = rounded_size - GET_MODE_SIZE (mode);
4265       if (STACK_GROWS_DOWNWARD && STACK_PUSH_CODE == POST_DEC)
4266         /* We have already decremented the stack pointer, so get the
4267            previous value.  */
4268         offset += rounded_size;
4269
4270       if (!STACK_GROWS_DOWNWARD && STACK_PUSH_CODE == POST_INC)
4271         /* We have already incremented the stack pointer, so get the
4272            previous value.  */
4273         offset -= rounded_size;
4274
4275       dest_addr = plus_constant (Pmode, stack_pointer_rtx, offset);
4276     }
4277   else
4278     {
4279       if (STACK_GROWS_DOWNWARD)
4280         /* ??? This seems wrong if STACK_PUSH_CODE == POST_DEC.  */
4281         dest_addr = plus_constant (Pmode, stack_pointer_rtx, -rounded_size);
4282       else
4283         /* ??? This seems wrong if STACK_PUSH_CODE == POST_INC.  */
4284         dest_addr = plus_constant (Pmode, stack_pointer_rtx, rounded_size);
4285
4286       dest_addr = gen_rtx_PRE_MODIFY (Pmode, stack_pointer_rtx, dest_addr);
4287     }
4288
4289   dest = gen_rtx_MEM (mode, dest_addr);
4290
4291   if (type != 0)
4292     {
4293       set_mem_attributes (dest, type, 1);
4294
4295       if (cfun->tail_call_marked)
4296         /* Function incoming arguments may overlap with sibling call
4297            outgoing arguments and we cannot allow reordering of reads
4298            from function arguments with stores to outgoing arguments
4299            of sibling calls.  */
4300         set_mem_alias_set (dest, 0);
4301     }
4302   emit_move_insn (dest, x);
4303 }
4304
4305 /* Emit and annotate a single push insn.  */
4306
4307 static void
4308 emit_single_push_insn (machine_mode mode, rtx x, tree type)
4309 {
4310   poly_int64 delta, old_delta = stack_pointer_delta;
4311   rtx_insn *prev = get_last_insn ();
4312   rtx_insn *last;
4313
4314   emit_single_push_insn_1 (mode, x, type);
4315
4316   /* Adjust stack_pointer_delta to describe the situation after the push
4317      we just performed.  Note that we must do this after the push rather
4318      than before the push in case calculating X needs pushes and pops of
4319      its own (e.g. if calling __tls_get_addr).  The REG_ARGS_SIZE notes
4320      for such pushes and pops must not include the effect of the future
4321      push of X.  */
4322   stack_pointer_delta += PUSH_ROUNDING (GET_MODE_SIZE (mode));
4323
4324   last = get_last_insn ();
4325
4326   /* Notice the common case where we emitted exactly one insn.  */
4327   if (PREV_INSN (last) == prev)
4328     {
4329       add_args_size_note (last, stack_pointer_delta);
4330       return;
4331     }
4332
4333   delta = fixup_args_size_notes (prev, last, stack_pointer_delta);
4334   gcc_assert (known_eq (delta, HOST_WIDE_INT_MIN)
4335               || known_eq (delta, old_delta));
4336 }
4337 #endif
4338
4339 /* If reading SIZE bytes from X will end up reading from
4340    Y return the number of bytes that overlap.  Return -1
4341    if there is no overlap or -2 if we can't determine
4342    (for example when X and Y have different base registers).  */
4343
4344 static int
4345 memory_load_overlap (rtx x, rtx y, HOST_WIDE_INT size)
4346 {
4347   rtx tmp = plus_constant (Pmode, x, size);
4348   rtx sub = simplify_gen_binary (MINUS, Pmode, tmp, y);
4349
4350   if (!CONST_INT_P (sub))
4351     return -2;
4352
4353   HOST_WIDE_INT val = INTVAL (sub);
4354
4355   return IN_RANGE (val, 1, size) ? val : -1;
4356 }
4357
4358 /* Generate code to push X onto the stack, assuming it has mode MODE and
4359    type TYPE.
4360    MODE is redundant except when X is a CONST_INT (since they don't
4361    carry mode info).
4362    SIZE is an rtx for the size of data to be copied (in bytes),
4363    needed only if X is BLKmode.
4364    Return true if successful.  May return false if asked to push a
4365    partial argument during a sibcall optimization (as specified by
4366    SIBCALL_P) and the incoming and outgoing pointers cannot be shown
4367    to not overlap.
4368
4369    ALIGN (in bits) is maximum alignment we can assume.
4370
4371    If PARTIAL and REG are both nonzero, then copy that many of the first
4372    bytes of X into registers starting with REG, and push the rest of X.
4373    The amount of space pushed is decreased by PARTIAL bytes.
4374    REG must be a hard register in this case.
4375    If REG is zero but PARTIAL is not, take any all others actions for an
4376    argument partially in registers, but do not actually load any
4377    registers.
4378
4379    EXTRA is the amount in bytes of extra space to leave next to this arg.
4380    This is ignored if an argument block has already been allocated.
4381
4382    On a machine that lacks real push insns, ARGS_ADDR is the address of
4383    the bottom of the argument block for this call.  We use indexing off there
4384    to store the arg.  On machines with push insns, ARGS_ADDR is 0 when a
4385    argument block has not been preallocated.
4386
4387    ARGS_SO_FAR is the size of args previously pushed for this call.
4388
4389    REG_PARM_STACK_SPACE is nonzero if functions require stack space
4390    for arguments passed in registers.  If nonzero, it will be the number
4391    of bytes required.  */
4392
4393 bool
4394 emit_push_insn (rtx x, machine_mode mode, tree type, rtx size,
4395                 unsigned int align, int partial, rtx reg, poly_int64 extra,
4396                 rtx args_addr, rtx args_so_far, int reg_parm_stack_space,
4397                 rtx alignment_pad, bool sibcall_p)
4398 {
4399   rtx xinner;
4400   pad_direction stack_direction
4401     = STACK_GROWS_DOWNWARD ? PAD_DOWNWARD : PAD_UPWARD;
4402
4403   /* Decide where to pad the argument: PAD_DOWNWARD for below,
4404      PAD_UPWARD for above, or PAD_NONE for don't pad it.
4405      Default is below for small data on big-endian machines; else above.  */
4406   pad_direction where_pad = targetm.calls.function_arg_padding (mode, type);
4407
4408   /* Invert direction if stack is post-decrement.
4409      FIXME: why?  */
4410   if (STACK_PUSH_CODE == POST_DEC)
4411     if (where_pad != PAD_NONE)
4412       where_pad = (where_pad == PAD_DOWNWARD ? PAD_UPWARD : PAD_DOWNWARD);
4413
4414   xinner = x;
4415
4416   int nregs = partial / UNITS_PER_WORD;
4417   rtx *tmp_regs = NULL;
4418   int overlapping = 0;
4419
4420   if (mode == BLKmode
4421       || (STRICT_ALIGNMENT && align < GET_MODE_ALIGNMENT (mode)))
4422     {
4423       /* Copy a block into the stack, entirely or partially.  */
4424
4425       rtx temp;
4426       int used;
4427       int offset;
4428       int skip;
4429
4430       offset = partial % (PARM_BOUNDARY / BITS_PER_UNIT);
4431       used = partial - offset;
4432
4433       if (mode != BLKmode)
4434         {
4435           /* A value is to be stored in an insufficiently aligned
4436              stack slot; copy via a suitably aligned slot if
4437              necessary.  */
4438           size = gen_int_mode (GET_MODE_SIZE (mode), Pmode);
4439           if (!MEM_P (xinner))
4440             {
4441               temp = assign_temp (type, 1, 1);
4442               emit_move_insn (temp, xinner);
4443               xinner = temp;
4444             }
4445         }
4446
4447       gcc_assert (size);
4448
4449       /* USED is now the # of bytes we need not copy to the stack
4450          because registers will take care of them.  */
4451
4452       if (partial != 0)
4453         xinner = adjust_address (xinner, BLKmode, used);
4454
4455       /* If the partial register-part of the arg counts in its stack size,
4456          skip the part of stack space corresponding to the registers.
4457          Otherwise, start copying to the beginning of the stack space,
4458          by setting SKIP to 0.  */
4459       skip = (reg_parm_stack_space == 0) ? 0 : used;
4460
4461 #ifdef PUSH_ROUNDING
4462       /* Do it with several push insns if that doesn't take lots of insns
4463          and if there is no difficulty with push insns that skip bytes
4464          on the stack for alignment purposes.  */
4465       if (args_addr == 0
4466           && PUSH_ARGS
4467           && CONST_INT_P (size)
4468           && skip == 0
4469           && MEM_ALIGN (xinner) >= align
4470           && can_move_by_pieces ((unsigned) INTVAL (size) - used, align)
4471           /* Here we avoid the case of a structure whose weak alignment
4472              forces many pushes of a small amount of data,
4473              and such small pushes do rounding that causes trouble.  */
4474           && ((!targetm.slow_unaligned_access (word_mode, align))
4475               || align >= BIGGEST_ALIGNMENT
4476               || known_eq (PUSH_ROUNDING (align / BITS_PER_UNIT),
4477                            align / BITS_PER_UNIT))
4478           && known_eq (PUSH_ROUNDING (INTVAL (size)), INTVAL (size)))
4479         {
4480           /* Push padding now if padding above and stack grows down,
4481              or if padding below and stack grows up.
4482              But if space already allocated, this has already been done.  */
4483           if (maybe_ne (extra, 0)
4484               && args_addr == 0
4485               && where_pad != PAD_NONE
4486               && where_pad != stack_direction)
4487             anti_adjust_stack (gen_int_mode (extra, Pmode));
4488
4489           move_by_pieces (NULL, xinner, INTVAL (size) - used, align,
4490                           RETURN_BEGIN);
4491         }
4492       else
4493 #endif /* PUSH_ROUNDING  */
4494         {
4495           rtx target;
4496
4497           /* Otherwise make space on the stack and copy the data
4498              to the address of that space.  */
4499
4500           /* Deduct words put into registers from the size we must copy.  */
4501           if (partial != 0)
4502             {
4503               if (CONST_INT_P (size))
4504                 size = GEN_INT (INTVAL (size) - used);
4505               else
4506                 size = expand_binop (GET_MODE (size), sub_optab, size,
4507                                      gen_int_mode (used, GET_MODE (size)),
4508                                      NULL_RTX, 0, OPTAB_LIB_WIDEN);
4509             }
4510
4511           /* Get the address of the stack space.
4512              In this case, we do not deal with EXTRA separately.
4513              A single stack adjust will do.  */
4514           poly_int64 const_args_so_far;
4515           if (! args_addr)
4516             {
4517               temp = push_block (size, extra, where_pad == PAD_DOWNWARD);
4518               extra = 0;
4519             }
4520           else if (poly_int_rtx_p (args_so_far, &const_args_so_far))
4521             temp = memory_address (BLKmode,
4522                                    plus_constant (Pmode, args_addr,
4523                                                   skip + const_args_so_far));
4524           else
4525             temp = memory_address (BLKmode,
4526                                    plus_constant (Pmode,
4527                                                   gen_rtx_PLUS (Pmode,
4528                                                                 args_addr,
4529                                                                 args_so_far),
4530                                                   skip));
4531
4532           if (!ACCUMULATE_OUTGOING_ARGS)
4533             {
4534               /* If the source is referenced relative to the stack pointer,
4535                  copy it to another register to stabilize it.  We do not need
4536                  to do this if we know that we won't be changing sp.  */
4537
4538               if (reg_mentioned_p (virtual_stack_dynamic_rtx, temp)
4539                   || reg_mentioned_p (virtual_outgoing_args_rtx, temp))
4540                 temp = copy_to_reg (temp);
4541             }
4542
4543           target = gen_rtx_MEM (BLKmode, temp);
4544
4545           /* We do *not* set_mem_attributes here, because incoming arguments
4546              may overlap with sibling call outgoing arguments and we cannot
4547              allow reordering of reads from function arguments with stores
4548              to outgoing arguments of sibling calls.  We do, however, want
4549              to record the alignment of the stack slot.  */
4550           /* ALIGN may well be better aligned than TYPE, e.g. due to
4551              PARM_BOUNDARY.  Assume the caller isn't lying.  */
4552           set_mem_align (target, align);
4553
4554           /* If part should go in registers and pushing to that part would
4555              overwrite some of the values that need to go into regs, load the
4556              overlapping values into temporary pseudos to be moved into the hard
4557              regs at the end after the stack pushing has completed.
4558              We cannot load them directly into the hard regs here because
4559              they can be clobbered by the block move expansions.
4560              See PR 65358.  */
4561
4562           if (partial > 0 && reg != 0 && mode == BLKmode
4563               && GET_CODE (reg) != PARALLEL)
4564             {
4565               overlapping = memory_load_overlap (XEXP (x, 0), temp, partial);
4566               if (overlapping > 0)
4567                 {
4568                   gcc_assert (overlapping % UNITS_PER_WORD == 0);
4569                   overlapping /= UNITS_PER_WORD;
4570
4571                   tmp_regs = XALLOCAVEC (rtx, overlapping);
4572
4573                   for (int i = 0; i < overlapping; i++)
4574                     tmp_regs[i] = gen_reg_rtx (word_mode);
4575
4576                   for (int i = 0; i < overlapping; i++)
4577                     emit_move_insn (tmp_regs[i],
4578                                     operand_subword_force (target, i, mode));
4579                 }
4580               else if (overlapping == -1)
4581                 overlapping = 0;
4582               /* Could not determine whether there is overlap.
4583                  Fail the sibcall.  */
4584               else
4585                 {
4586                   overlapping = 0;
4587                   if (sibcall_p)
4588                     return false;
4589                 }
4590             }
4591           emit_block_move (target, xinner, size, BLOCK_OP_CALL_PARM);
4592         }
4593     }
4594   else if (partial > 0)
4595     {
4596       /* Scalar partly in registers.  This case is only supported
4597          for fixed-wdth modes.  */
4598       int num_words = GET_MODE_SIZE (mode).to_constant ();
4599       num_words /= UNITS_PER_WORD;
4600       int i;
4601       int not_stack;
4602       /* # bytes of start of argument
4603          that we must make space for but need not store.  */
4604       int offset = partial % (PARM_BOUNDARY / BITS_PER_UNIT);
4605       int args_offset = INTVAL (args_so_far);
4606       int skip;
4607
4608       /* Push padding now if padding above and stack grows down,
4609          or if padding below and stack grows up.
4610          But if space already allocated, this has already been done.  */
4611       if (maybe_ne (extra, 0)
4612           && args_addr == 0
4613           && where_pad != PAD_NONE
4614           && where_pad != stack_direction)
4615         anti_adjust_stack (gen_int_mode (extra, Pmode));
4616
4617       /* If we make space by pushing it, we might as well push
4618          the real data.  Otherwise, we can leave OFFSET nonzero
4619          and leave the space uninitialized.  */
4620       if (args_addr == 0)
4621         offset = 0;
4622
4623       /* Now NOT_STACK gets the number of words that we don't need to
4624          allocate on the stack.  Convert OFFSET to words too.  */
4625       not_stack = (partial - offset) / UNITS_PER_WORD;
4626       offset /= UNITS_PER_WORD;
4627
4628       /* If the partial register-part of the arg counts in its stack size,
4629          skip the part of stack space corresponding to the registers.
4630          Otherwise, start copying to the beginning of the stack space,
4631          by setting SKIP to 0.  */
4632       skip = (reg_parm_stack_space == 0) ? 0 : not_stack;
4633
4634       if (CONSTANT_P (x) && !targetm.legitimate_constant_p (mode, x))
4635         x = validize_mem (force_const_mem (mode, x));
4636
4637       /* If X is a hard register in a non-integer mode, copy it into a pseudo;
4638          SUBREGs of such registers are not allowed.  */
4639       if ((REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER
4640            && GET_MODE_CLASS (GET_MODE (x)) != MODE_INT))
4641         x = copy_to_reg (x);
4642
4643       /* Loop over all the words allocated on the stack for this arg.  */
4644       /* We can do it by words, because any scalar bigger than a word
4645          has a size a multiple of a word.  */
4646       for (i = num_words - 1; i >= not_stack; i--)
4647         if (i >= not_stack + offset)
4648           if (!emit_push_insn (operand_subword_force (x, i, mode),
4649                           word_mode, NULL_TREE, NULL_RTX, align, 0, NULL_RTX,
4650                           0, args_addr,
4651                           GEN_INT (args_offset + ((i - not_stack + skip)
4652                                                   * UNITS_PER_WORD)),
4653                           reg_parm_stack_space, alignment_pad, sibcall_p))
4654             return false;
4655     }
4656   else
4657     {
4658       rtx addr;
4659       rtx dest;
4660
4661       /* Push padding now if padding above and stack grows down,
4662          or if padding below and stack grows up.
4663          But if space already allocated, this has already been done.  */
4664       if (maybe_ne (extra, 0)
4665           && args_addr == 0
4666           && where_pad != PAD_NONE
4667           && where_pad != stack_direction)
4668         anti_adjust_stack (gen_int_mode (extra, Pmode));
4669
4670 #ifdef PUSH_ROUNDING
4671       if (args_addr == 0 && PUSH_ARGS)
4672         emit_single_push_insn (mode, x, type);
4673       else
4674 #endif
4675         {
4676           addr = simplify_gen_binary (PLUS, Pmode, args_addr, args_so_far);
4677           dest = gen_rtx_MEM (mode, memory_address (mode, addr));
4678
4679           /* We do *not* set_mem_attributes here, because incoming arguments
4680              may overlap with sibling call outgoing arguments and we cannot
4681              allow reordering of reads from function arguments with stores
4682              to outgoing arguments of sibling calls.  We do, however, want
4683              to record the alignment of the stack slot.  */
4684           /* ALIGN may well be better aligned than TYPE, e.g. due to
4685              PARM_BOUNDARY.  Assume the caller isn't lying.  */
4686           set_mem_align (dest, align);
4687
4688           emit_move_insn (dest, x);
4689         }
4690     }
4691
4692   /* Move the partial arguments into the registers and any overlapping
4693      values that we moved into the pseudos in tmp_regs.  */
4694   if (partial > 0 && reg != 0)
4695     {
4696       /* Handle calls that pass values in multiple non-contiguous locations.
4697          The Irix 6 ABI has examples of this.  */
4698       if (GET_CODE (reg) == PARALLEL)
4699         emit_group_load (reg, x, type, -1);
4700       else
4701         {
4702           gcc_assert (partial % UNITS_PER_WORD == 0);
4703           move_block_to_reg (REGNO (reg), x, nregs - overlapping, mode);
4704
4705           for (int i = 0; i < overlapping; i++)
4706             emit_move_insn (gen_rtx_REG (word_mode, REGNO (reg)
4707                                                     + nregs - overlapping + i),
4708                             tmp_regs[i]);
4709
4710         }
4711     }
4712
4713   if (maybe_ne (extra, 0) && args_addr == 0 && where_pad == stack_direction)
4714     anti_adjust_stack (gen_int_mode (extra, Pmode));
4715
4716   if (alignment_pad && args_addr == 0)
4717     anti_adjust_stack (alignment_pad);
4718
4719   return true;
4720 }
4721 \f
4722 /* Return X if X can be used as a subtarget in a sequence of arithmetic
4723    operations.  */
4724
4725 static rtx
4726 get_subtarget (rtx x)
4727 {
4728   return (optimize
4729           || x == 0
4730            /* Only registers can be subtargets.  */
4731            || !REG_P (x)
4732            /* Don't use hard regs to avoid extending their life.  */
4733            || REGNO (x) < FIRST_PSEUDO_REGISTER
4734           ? 0 : x);
4735 }
4736
4737 /* A subroutine of expand_assignment.  Optimize FIELD op= VAL, where
4738    FIELD is a bitfield.  Returns true if the optimization was successful,
4739    and there's nothing else to do.  */
4740
4741 static bool
4742 optimize_bitfield_assignment_op (poly_uint64 pbitsize,
4743                                  poly_uint64 pbitpos,
4744                                  poly_uint64 pbitregion_start,
4745                                  poly_uint64 pbitregion_end,
4746                                  machine_mode mode1, rtx str_rtx,
4747                                  tree to, tree src, bool reverse)
4748 {
4749   /* str_mode is not guaranteed to be a scalar type.  */
4750   machine_mode str_mode = GET_MODE (str_rtx);
4751   unsigned int str_bitsize;
4752   tree op0, op1;
4753   rtx value, result;
4754   optab binop;
4755   gimple *srcstmt;
4756   enum tree_code code;
4757
4758   unsigned HOST_WIDE_INT bitsize, bitpos, bitregion_start, bitregion_end;
4759   if (mode1 != VOIDmode
4760       || !pbitsize.is_constant (&bitsize)
4761       || !pbitpos.is_constant (&bitpos)
4762       || !pbitregion_start.is_constant (&bitregion_start)
4763       || !pbitregion_end.is_constant (&bitregion_end)
4764       || bitsize >= BITS_PER_WORD
4765       || !GET_MODE_BITSIZE (str_mode).is_constant (&str_bitsize)
4766       || str_bitsize > BITS_PER_WORD
4767       || TREE_SIDE_EFFECTS (to)
4768       || TREE_THIS_VOLATILE (to))
4769     return false;
4770
4771   STRIP_NOPS (src);
4772   if (TREE_CODE (src) != SSA_NAME)
4773     return false;
4774   if (TREE_CODE (TREE_TYPE (src)) != INTEGER_TYPE)
4775     return false;
4776
4777   srcstmt = get_gimple_for_ssa_name (src);
4778   if (!srcstmt
4779       || TREE_CODE_CLASS (gimple_assign_rhs_code (srcstmt)) != tcc_binary)
4780     return false;
4781
4782   code = gimple_assign_rhs_code (srcstmt);
4783
4784   op0 = gimple_assign_rhs1 (srcstmt);
4785
4786   /* If OP0 is an SSA_NAME, then we want to walk the use-def chain
4787      to find its initialization.  Hopefully the initialization will
4788      be from a bitfield load.  */
4789   if (TREE_CODE (op0) == SSA_NAME)
4790     {
4791       gimple *op0stmt = get_gimple_for_ssa_name (op0);
4792
4793       /* We want to eventually have OP0 be the same as TO, which
4794          should be a bitfield.  */
4795       if (!op0stmt
4796           || !is_gimple_assign (op0stmt)
4797           || gimple_assign_rhs_code (op0stmt) != TREE_CODE (to))
4798         return false;
4799       op0 = gimple_assign_rhs1 (op0stmt);
4800     }
4801
4802   op1 = gimple_assign_rhs2 (srcstmt);
4803
4804   if (!operand_equal_p (to, op0, 0))
4805     return false;
4806
4807   if (MEM_P (str_rtx))
4808     {
4809       unsigned HOST_WIDE_INT offset1;
4810
4811       if (str_bitsize == 0 || str_bitsize > BITS_PER_WORD)
4812         str_bitsize = BITS_PER_WORD;
4813
4814       scalar_int_mode best_mode;
4815       if (!get_best_mode (bitsize, bitpos, bitregion_start, bitregion_end,
4816                           MEM_ALIGN (str_rtx), str_bitsize, false, &best_mode))
4817         return false;
4818       str_mode = best_mode;
4819       str_bitsize = GET_MODE_BITSIZE (best_mode);
4820
4821       offset1 = bitpos;
4822       bitpos %= str_bitsize;
4823       offset1 = (offset1 - bitpos) / BITS_PER_UNIT;
4824       str_rtx = adjust_address (str_rtx, str_mode, offset1);
4825     }
4826   else if (!REG_P (str_rtx) && GET_CODE (str_rtx) != SUBREG)
4827     return false;
4828
4829   /* If the bit field covers the whole REG/MEM, store_field
4830      will likely generate better code.  */
4831   if (bitsize >= str_bitsize)
4832     return false;
4833
4834   /* We can't handle fields split across multiple entities.  */
4835   if (bitpos + bitsize > str_bitsize)
4836     return false;
4837
4838   if (reverse ? !BYTES_BIG_ENDIAN : BYTES_BIG_ENDIAN)
4839     bitpos = str_bitsize - bitpos - bitsize;
4840
4841   switch (code)
4842     {
4843     case PLUS_EXPR:
4844     case MINUS_EXPR:
4845       /* For now, just optimize the case of the topmost bitfield
4846          where we don't need to do any masking and also
4847          1 bit bitfields where xor can be used.
4848          We might win by one instruction for the other bitfields
4849          too if insv/extv instructions aren't used, so that
4850          can be added later.  */
4851       if ((reverse || bitpos + bitsize != str_bitsize)
4852           && (bitsize != 1 || TREE_CODE (op1) != INTEGER_CST))
4853         break;
4854
4855       value = expand_expr (op1, NULL_RTX, str_mode, EXPAND_NORMAL);
4856       value = convert_modes (str_mode,
4857                              TYPE_MODE (TREE_TYPE (op1)), value,
4858                              TYPE_UNSIGNED (TREE_TYPE (op1)));
4859
4860       /* We may be accessing data outside the field, which means
4861          we can alias adjacent data.  */
4862       if (MEM_P (str_rtx))
4863         {
4864           str_rtx = shallow_copy_rtx (str_rtx);
4865           set_mem_alias_set (str_rtx, 0);
4866           set_mem_expr (str_rtx, 0);
4867         }
4868
4869       if (bitsize == 1 && (reverse || bitpos + bitsize != str_bitsize))
4870         {
4871           value = expand_and (str_mode, value, const1_rtx, NULL);
4872           binop = xor_optab;
4873         }
4874       else
4875         binop = code == PLUS_EXPR ? add_optab : sub_optab;
4876
4877       value = expand_shift (LSHIFT_EXPR, str_mode, value, bitpos, NULL_RTX, 1);
4878       if (reverse)
4879         value = flip_storage_order (str_mode, value);
4880       result = expand_binop (str_mode, binop, str_rtx,
4881                              value, str_rtx, 1, OPTAB_WIDEN);
4882       if (result != str_rtx)
4883         emit_move_insn (str_rtx, result);
4884       return true;
4885
4886     case BIT_IOR_EXPR:
4887     case BIT_XOR_EXPR:
4888       if (TREE_CODE (op1) != INTEGER_CST)
4889         break;
4890       value = expand_expr (op1, NULL_RTX, str_mode, EXPAND_NORMAL);
4891       value = convert_modes (str_mode,
4892                              TYPE_MODE (TREE_TYPE (op1)), value,
4893                              TYPE_UNSIGNED (TREE_TYPE (op1)));
4894
4895       /* We may be accessing data outside the field, which means
4896          we can alias adjacent data.  */
4897       if (MEM_P (str_rtx))
4898         {
4899           str_rtx = shallow_copy_rtx (str_rtx);
4900           set_mem_alias_set (str_rtx, 0);
4901           set_mem_expr (str_rtx, 0);
4902         }
4903
4904       binop = code == BIT_IOR_EXPR ? ior_optab : xor_optab;
4905       if (bitpos + bitsize != str_bitsize)
4906         {
4907           rtx mask = gen_int_mode ((HOST_WIDE_INT_1U << bitsize) - 1,
4908                                    str_mode);
4909           value = expand_and (str_mode, value, mask, NULL_RTX);
4910         }
4911       value = expand_shift (LSHIFT_EXPR, str_mode, value, bitpos, NULL_RTX, 1);
4912       if (reverse)
4913         value = flip_storage_order (str_mode, value);
4914       result = expand_binop (str_mode, binop, str_rtx,
4915                              value, str_rtx, 1, OPTAB_WIDEN);
4916       if (result != str_rtx)
4917         emit_move_insn (str_rtx, result);
4918       return true;
4919
4920     default:
4921       break;
4922     }
4923
4924   return false;
4925 }
4926
4927 /* In the C++ memory model, consecutive bit fields in a structure are
4928    considered one memory location.
4929
4930    Given a COMPONENT_REF EXP at position (BITPOS, OFFSET), this function
4931    returns the bit range of consecutive bits in which this COMPONENT_REF
4932    belongs.  The values are returned in *BITSTART and *BITEND.  *BITPOS
4933    and *OFFSET may be adjusted in the process.
4934
4935    If the access does not need to be restricted, 0 is returned in both
4936    *BITSTART and *BITEND.  */
4937
4938 void
4939 get_bit_range (poly_uint64_pod *bitstart, poly_uint64_pod *bitend, tree exp,
4940                poly_int64_pod *bitpos, tree *offset)
4941 {
4942   poly_int64 bitoffset;
4943   tree field, repr;
4944
4945   gcc_assert (TREE_CODE (exp) == COMPONENT_REF);
4946
4947   field = TREE_OPERAND (exp, 1);
4948   repr = DECL_BIT_FIELD_REPRESENTATIVE (field);
4949   /* If we do not have a DECL_BIT_FIELD_REPRESENTATIVE there is no
4950      need to limit the range we can access.  */
4951   if (!repr)
4952     {
4953       *bitstart = *bitend = 0;
4954       return;
4955     }
4956
4957   /* If we have a DECL_BIT_FIELD_REPRESENTATIVE but the enclosing record is
4958      part of a larger bit field, then the representative does not serve any
4959      useful purpose.  This can occur in Ada.  */
4960   if (handled_component_p (TREE_OPERAND (exp, 0)))
4961     {
4962       machine_mode rmode;
4963       poly_int64 rbitsize, rbitpos;
4964       tree roffset;
4965       int unsignedp, reversep, volatilep = 0;
4966       get_inner_reference (TREE_OPERAND (exp, 0), &rbitsize, &rbitpos,
4967                            &roffset, &rmode, &unsignedp, &reversep,
4968                            &volatilep);
4969       if (!multiple_p (rbitpos, BITS_PER_UNIT))
4970         {
4971           *bitstart = *bitend = 0;
4972           return;
4973         }
4974     }
4975
4976   /* Compute the adjustment to bitpos from the offset of the field
4977      relative to the representative.  DECL_FIELD_OFFSET of field and
4978      repr are the same by construction if they are not constants,
4979      see finish_bitfield_layout.  */
4980   poly_uint64 field_offset, repr_offset;
4981   if (poly_int_tree_p (DECL_FIELD_OFFSET (field), &field_offset)
4982       && poly_int_tree_p (DECL_FIELD_OFFSET (repr), &repr_offset))
4983     bitoffset = (field_offset - repr_offset) * BITS_PER_UNIT;
4984   else
4985     bitoffset = 0;
4986   bitoffset += (tree_to_uhwi (DECL_FIELD_BIT_OFFSET (field))
4987                 - tree_to_uhwi (DECL_FIELD_BIT_OFFSET (repr)));
4988
4989   /* If the adjustment is larger than bitpos, we would have a negative bit
4990      position for the lower bound and this may wreak havoc later.  Adjust
4991      offset and bitpos to make the lower bound non-negative in that case.  */
4992   if (maybe_gt (bitoffset, *bitpos))
4993     {
4994       poly_int64 adjust_bits = upper_bound (bitoffset, *bitpos) - *bitpos;
4995       poly_int64 adjust_bytes = exact_div (adjust_bits, BITS_PER_UNIT);
4996
4997       *bitpos += adjust_bits;
4998       if (*offset == NULL_TREE)
4999         *offset = size_int (-adjust_bytes);
5000       else
5001         *offset = size_binop (MINUS_EXPR, *offset, size_int (adjust_bytes));
5002       *bitstart = 0;
5003     }
5004   else
5005     *bitstart = *bitpos - bitoffset;
5006
5007   *bitend = *bitstart + tree_to_poly_uint64 (DECL_SIZE (repr)) - 1;
5008 }
5009
5010 /* Returns true if BASE is a DECL that does not reside in memory and
5011    has non-BLKmode.  DECL_RTL must not be a MEM; if
5012    DECL_RTL was not set yet, return false.  */
5013
5014 static inline bool
5015 non_mem_decl_p (tree base)
5016 {
5017   if (!DECL_P (base)
5018       || TREE_ADDRESSABLE (base)
5019       || DECL_MODE (base) == BLKmode)
5020     return false;
5021
5022   if (!DECL_RTL_SET_P (base))
5023     return false;
5024
5025   return (!MEM_P (DECL_RTL (base)));
5026 }
5027
5028 /* Returns true if REF refers to an object that does not
5029    reside in memory and has non-BLKmode.  */
5030
5031 static inline bool
5032 mem_ref_refers_to_non_mem_p (tree ref)
5033 {
5034   tree base;
5035
5036   if (TREE_CODE (ref) == MEM_REF
5037       || TREE_CODE (ref) == TARGET_MEM_REF)
5038     {
5039       tree addr = TREE_OPERAND (ref, 0);
5040
5041       if (TREE_CODE (addr) != ADDR_EXPR)
5042         return false;
5043
5044       base = TREE_OPERAND (addr, 0);
5045     }
5046   else
5047     base = ref;
5048
5049   return non_mem_decl_p (base);
5050 }
5051
5052 /* Expand an assignment that stores the value of FROM into TO.  If NONTEMPORAL
5053    is true, try generating a nontemporal store.  */
5054
5055 void
5056 expand_assignment (tree to, tree from, bool nontemporal)
5057 {
5058   rtx to_rtx = 0;
5059   rtx result;
5060   machine_mode mode;
5061   unsigned int align;
5062   enum insn_code icode;
5063
5064   /* Don't crash if the lhs of the assignment was erroneous.  */
5065   if (TREE_CODE (to) == ERROR_MARK)
5066     {
5067       expand_normal (from);
5068       return;
5069     }
5070
5071   /* Optimize away no-op moves without side-effects.  */
5072   if (operand_equal_p (to, from, 0))
5073     return;
5074
5075   /* Handle misaligned stores.  */
5076   mode = TYPE_MODE (TREE_TYPE (to));
5077   if ((TREE_CODE (to) == MEM_REF
5078        || TREE_CODE (to) == TARGET_MEM_REF
5079        || DECL_P (to))
5080       && mode != BLKmode
5081       && !mem_ref_refers_to_non_mem_p (to)
5082       && ((align = get_object_alignment (to))
5083           < GET_MODE_ALIGNMENT (mode))
5084       && (((icode = optab_handler (movmisalign_optab, mode))
5085            != CODE_FOR_nothing)
5086           || targetm.slow_unaligned_access (mode, align)))
5087     {
5088       rtx reg, mem;
5089
5090       reg = expand_expr (from, NULL_RTX, VOIDmode, EXPAND_NORMAL);
5091       reg = force_not_mem (reg);
5092       mem = expand_expr (to, NULL_RTX, VOIDmode, EXPAND_WRITE);
5093       if (TREE_CODE (to) == MEM_REF && REF_REVERSE_STORAGE_ORDER (to))
5094         reg = flip_storage_order (mode, reg);
5095
5096       if (icode != CODE_FOR_nothing)
5097         {
5098           class expand_operand ops[2];
5099
5100           create_fixed_operand (&ops[0], mem);
5101           create_input_operand (&ops[1], reg, mode);
5102           /* The movmisalign<mode> pattern cannot fail, else the assignment
5103              would silently be omitted.  */
5104           expand_insn (icode, 2, ops);
5105         }
5106       else
5107         store_bit_field (mem, GET_MODE_BITSIZE (mode), 0, 0, 0, mode, reg,
5108                          false);
5109       return;
5110     }
5111
5112   /* Assignment of a structure component needs special treatment
5113      if the structure component's rtx is not simply a MEM.
5114      Assignment of an array element at a constant index, and assignment of
5115      an array element in an unaligned packed structure field, has the same
5116      problem.  Same for (partially) storing into a non-memory object.  */
5117   if (handled_component_p (to)
5118       || (TREE_CODE (to) == MEM_REF
5119           && (REF_REVERSE_STORAGE_ORDER (to)
5120               || mem_ref_refers_to_non_mem_p (to)))
5121       || TREE_CODE (TREE_TYPE (to)) == ARRAY_TYPE)
5122     {
5123       machine_mode mode1;
5124       poly_int64 bitsize, bitpos;
5125       poly_uint64 bitregion_start = 0;
5126       poly_uint64 bitregion_end = 0;
5127       tree offset;
5128       int unsignedp, reversep, volatilep = 0;
5129       tree tem;
5130
5131       push_temp_slots ();
5132       tem = get_inner_reference (to, &bitsize, &bitpos, &offset, &mode1,
5133                                  &unsignedp, &reversep, &volatilep);
5134
5135       /* Make sure bitpos is not negative, it can wreak havoc later.  */
5136       if (maybe_lt (bitpos, 0))
5137         {
5138           gcc_assert (offset == NULL_TREE);
5139           offset = size_int (bits_to_bytes_round_down (bitpos));
5140           bitpos = num_trailing_bits (bitpos);
5141         }
5142
5143       if (TREE_CODE (to) == COMPONENT_REF
5144           && DECL_BIT_FIELD_TYPE (TREE_OPERAND (to, 1)))
5145         get_bit_range (&bitregion_start, &bitregion_end, to, &bitpos, &offset);
5146       /* The C++ memory model naturally applies to byte-aligned fields.
5147          However, if we do not have a DECL_BIT_FIELD_TYPE but BITPOS or
5148          BITSIZE are not byte-aligned, there is no need to limit the range
5149          we can access.  This can occur with packed structures in Ada.  */
5150       else if (maybe_gt (bitsize, 0)
5151                && multiple_p (bitsize, BITS_PER_UNIT)
5152                && multiple_p (bitpos, BITS_PER_UNIT))
5153         {
5154           bitregion_start = bitpos;
5155           bitregion_end = bitpos + bitsize - 1;
5156         }
5157
5158       to_rtx = expand_expr (tem, NULL_RTX, VOIDmode, EXPAND_WRITE);
5159
5160       /* If the field has a mode, we want to access it in the
5161          field's mode, not the computed mode.
5162          If a MEM has VOIDmode (external with incomplete type),
5163          use BLKmode for it instead.  */
5164       if (MEM_P (to_rtx))
5165         {
5166           if (mode1 != VOIDmode)
5167             to_rtx = adjust_address (to_rtx, mode1, 0);
5168           else if (GET_MODE (to_rtx) == VOIDmode)
5169             to_rtx = adjust_address (to_rtx, BLKmode, 0);
5170         }
5171  
5172       if (offset != 0)
5173         {
5174           machine_mode address_mode;
5175           rtx offset_rtx;
5176
5177           if (!MEM_P (to_rtx))
5178             {
5179               /* We can get constant negative offsets into arrays with broken
5180                  user code.  Translate this to a trap instead of ICEing.  */
5181               gcc_assert (TREE_CODE (offset) == INTEGER_CST);
5182               expand_builtin_trap ();
5183               to_rtx = gen_rtx_MEM (BLKmode, const0_rtx);
5184             }
5185
5186           offset_rtx = expand_expr (offset, NULL_RTX, VOIDmode, EXPAND_SUM);
5187           address_mode = get_address_mode (to_rtx);
5188           if (GET_MODE (offset_rtx) != address_mode)
5189             {
5190                 /* We cannot be sure that the RTL in offset_rtx is valid outside
5191                    of a memory address context, so force it into a register
5192                    before attempting to convert it to the desired mode.  */
5193               offset_rtx = force_operand (offset_rtx, NULL_RTX);
5194               offset_rtx = convert_to_mode (address_mode, offset_rtx, 0);
5195             }
5196
5197           /* If we have an expression in OFFSET_RTX and a non-zero
5198              byte offset in BITPOS, adding the byte offset before the
5199              OFFSET_RTX results in better intermediate code, which makes
5200              later rtl optimization passes perform better.
5201
5202              We prefer intermediate code like this:
5203
5204              r124:DI=r123:DI+0x18
5205              [r124:DI]=r121:DI
5206
5207              ... instead of ...
5208
5209              r124:DI=r123:DI+0x10
5210              [r124:DI+0x8]=r121:DI
5211
5212              This is only done for aligned data values, as these can
5213              be expected to result in single move instructions.  */
5214           poly_int64 bytepos;
5215           if (mode1 != VOIDmode
5216               && maybe_ne (bitpos, 0)
5217               && maybe_gt (bitsize, 0)
5218               && multiple_p (bitpos, BITS_PER_UNIT, &bytepos)
5219               && multiple_p (bitpos, bitsize)
5220               && multiple_p (bitsize, GET_MODE_ALIGNMENT (mode1))
5221               && MEM_ALIGN (to_rtx) >= GET_MODE_ALIGNMENT (mode1))
5222             {
5223               to_rtx = adjust_address (to_rtx, mode1, bytepos);
5224               bitregion_start = 0;
5225               if (known_ge (bitregion_end, poly_uint64 (bitpos)))
5226                 bitregion_end -= bitpos;
5227               bitpos = 0;
5228             }
5229
5230           to_rtx = offset_address (to_rtx, offset_rtx,
5231                                    highest_pow2_factor_for_target (to,
5232                                                                    offset));
5233         }
5234
5235       /* No action is needed if the target is not a memory and the field
5236          lies completely outside that target.  This can occur if the source
5237          code contains an out-of-bounds access to a small array.  */
5238       if (!MEM_P (to_rtx)
5239           && GET_MODE (to_rtx) != BLKmode
5240           && known_ge (bitpos, GET_MODE_PRECISION (GET_MODE (to_rtx))))
5241         {
5242           expand_normal (from);
5243           result = NULL;
5244         }
5245       /* Handle expand_expr of a complex value returning a CONCAT.  */
5246       else if (GET_CODE (to_rtx) == CONCAT)
5247         {
5248           machine_mode to_mode = GET_MODE (to_rtx);
5249           gcc_checking_assert (COMPLEX_MODE_P (to_mode));
5250           poly_int64 mode_bitsize = GET_MODE_BITSIZE (to_mode);
5251           unsigned short inner_bitsize = GET_MODE_UNIT_BITSIZE (to_mode);
5252           if (TYPE_MODE (TREE_TYPE (from)) == to_mode
5253               && known_eq (bitpos, 0)
5254               && known_eq (bitsize, mode_bitsize))
5255             result = store_expr (from, to_rtx, false, nontemporal, reversep);
5256           else if (TYPE_MODE (TREE_TYPE (from)) == GET_MODE_INNER (to_mode)
5257                    && known_eq (bitsize, inner_bitsize)
5258                    && (known_eq (bitpos, 0)
5259                        || known_eq (bitpos, inner_bitsize)))
5260             result = store_expr (from, XEXP (to_rtx, maybe_ne (bitpos, 0)),
5261                                  false, nontemporal, reversep);
5262           else if (known_le (bitpos + bitsize, inner_bitsize))
5263             result = store_field (XEXP (to_rtx, 0), bitsize, bitpos,
5264                                   bitregion_start, bitregion_end,
5265                                   mode1, from, get_alias_set (to),
5266                                   nontemporal, reversep);
5267           else if (known_ge (bitpos, inner_bitsize))
5268             result = store_field (XEXP (to_rtx, 1), bitsize,
5269                                   bitpos - inner_bitsize,
5270                                   bitregion_start, bitregion_end,
5271                                   mode1, from, get_alias_set (to),
5272                                   nontemporal, reversep);
5273           else if (known_eq (bitpos, 0) && known_eq (bitsize, mode_bitsize))
5274             {
5275               result = expand_normal (from);
5276               if (GET_CODE (result) == CONCAT)
5277                 {
5278                   to_mode = GET_MODE_INNER (to_mode);
5279                   machine_mode from_mode = GET_MODE_INNER (GET_MODE (result));
5280                   rtx from_real
5281                     = simplify_gen_subreg (to_mode, XEXP (result, 0),
5282                                            from_mode, 0);
5283                   rtx from_imag
5284                     = simplify_gen_subreg (to_mode, XEXP (result, 1),
5285                                            from_mode, 0);
5286                   if (!from_real || !from_imag)
5287                     goto concat_store_slow;
5288                   emit_move_insn (XEXP (to_rtx, 0), from_real);
5289                   emit_move_insn (XEXP (to_rtx, 1), from_imag);
5290                 }
5291               else
5292                 {
5293                   machine_mode from_mode
5294                     = GET_MODE (result) == VOIDmode
5295                       ? TYPE_MODE (TREE_TYPE (from))
5296                       : GET_MODE (result);
5297                   rtx from_rtx;
5298                   if (MEM_P (result))
5299                     from_rtx = change_address (result, to_mode, NULL_RTX);
5300                   else
5301                     from_rtx
5302                       = simplify_gen_subreg (to_mode, result, from_mode, 0);
5303                   if (from_rtx)
5304                     {
5305                       emit_move_insn (XEXP (to_rtx, 0),
5306                                       read_complex_part (from_rtx, false));
5307                       emit_move_insn (XEXP (to_rtx, 1),
5308                                       read_complex_part (from_rtx, true));
5309                     }
5310                   else
5311                     {
5312                       to_mode = GET_MODE_INNER (to_mode);
5313                       rtx from_real
5314                         = simplify_gen_subreg (to_mode, result, from_mode, 0);
5315                       rtx from_imag
5316                         = simplify_gen_subreg (to_mode, result, from_mode,
5317                                                GET_MODE_SIZE (to_mode));
5318                       if (!from_real || !from_imag)
5319                         goto concat_store_slow;
5320                       emit_move_insn (XEXP (to_rtx, 0), from_real);
5321                       emit_move_insn (XEXP (to_rtx, 1), from_imag);
5322                     }
5323                 }
5324             }
5325           else
5326             {
5327             concat_store_slow:;
5328               rtx temp = assign_stack_temp (GET_MODE (to_rtx),
5329                                             GET_MODE_SIZE (GET_MODE (to_rtx)));
5330               write_complex_part (temp, XEXP (to_rtx, 0), false);
5331               write_complex_part (temp, XEXP (to_rtx, 1), true);
5332               result = store_field (temp, bitsize, bitpos,
5333                                     bitregion_start, bitregion_end,
5334                                     mode1, from, get_alias_set (to),
5335                                     nontemporal, reversep);
5336               emit_move_insn (XEXP (to_rtx, 0), read_complex_part (temp, false));
5337               emit_move_insn (XEXP (to_rtx, 1), read_complex_part (temp, true));
5338             }
5339         }
5340       /* For calls to functions returning variable length structures, if TO_RTX
5341          is not a MEM, go through a MEM because we must not create temporaries
5342          of the VLA type.  */
5343       else if (!MEM_P (to_rtx)
5344                && TREE_CODE (from) == CALL_EXPR
5345                && COMPLETE_TYPE_P (TREE_TYPE (from))
5346                && TREE_CODE (TYPE_SIZE (TREE_TYPE (from))) != INTEGER_CST)
5347         {
5348           rtx temp = assign_stack_temp (GET_MODE (to_rtx),
5349                                         GET_MODE_SIZE (GET_MODE (to_rtx)));
5350           result = store_field (temp, bitsize, bitpos, bitregion_start,
5351                                 bitregion_end, mode1, from, get_alias_set (to),
5352                                 nontemporal, reversep);
5353           emit_move_insn (to_rtx, temp);
5354         }
5355       else
5356         {
5357           if (MEM_P (to_rtx))
5358             {
5359               /* If the field is at offset zero, we could have been given the
5360                  DECL_RTX of the parent struct.  Don't munge it.  */
5361               to_rtx = shallow_copy_rtx (to_rtx);
5362               set_mem_attributes_minus_bitpos (to_rtx, to, 0, bitpos);
5363               if (volatilep)
5364                 MEM_VOLATILE_P (to_rtx) = 1;
5365             }
5366
5367           gcc_checking_assert (known_ge (bitpos, 0));
5368           if (optimize_bitfield_assignment_op (bitsize, bitpos,
5369                                                bitregion_start, bitregion_end,
5370                                                mode1, to_rtx, to, from,
5371                                                reversep))
5372             result = NULL;
5373           else
5374             result = store_field (to_rtx, bitsize, bitpos,
5375                                   bitregion_start, bitregion_end,
5376                                   mode1, from, get_alias_set (to),
5377                                   nontemporal, reversep);
5378         }
5379
5380       if (result)
5381         preserve_temp_slots (result);
5382       pop_temp_slots ();
5383       return;
5384     }
5385
5386   /* If the rhs is a function call and its value is not an aggregate,
5387      call the function before we start to compute the lhs.
5388      This is needed for correct code for cases such as
5389      val = setjmp (buf) on machines where reference to val
5390      requires loading up part of an address in a separate insn.
5391
5392      Don't do this if TO is a VAR_DECL or PARM_DECL whose DECL_RTL is REG
5393      since it might be a promoted variable where the zero- or sign- extension
5394      needs to be done.  Handling this in the normal way is safe because no
5395      computation is done before the call.  The same is true for SSA names.  */
5396   if (TREE_CODE (from) == CALL_EXPR && ! aggregate_value_p (from, from)
5397       && COMPLETE_TYPE_P (TREE_TYPE (from))
5398       && TREE_CODE (TYPE_SIZE (TREE_TYPE (from))) == INTEGER_CST
5399       && ! (((VAR_P (to)
5400               || TREE_CODE (to) == PARM_DECL
5401               || TREE_CODE (to) == RESULT_DECL)
5402              && REG_P (DECL_RTL (to)))
5403             || TREE_CODE (to) == SSA_NAME))
5404     {
5405       rtx value;
5406
5407       push_temp_slots ();
5408       value = expand_normal (from);
5409
5410       if (to_rtx == 0)
5411         to_rtx = expand_expr (to, NULL_RTX, VOIDmode, EXPAND_WRITE);
5412
5413       /* Handle calls that return values in multiple non-contiguous locations.
5414          The Irix 6 ABI has examples of this.  */
5415       if (GET_CODE (to_rtx) == PARALLEL)
5416         {
5417           if (GET_CODE (value) == PARALLEL)
5418             emit_group_move (to_rtx, value);
5419           else
5420             emit_group_load (to_rtx, value, TREE_TYPE (from),
5421                              int_size_in_bytes (TREE_TYPE (from)));
5422         }
5423       else if (GET_CODE (value) == PARALLEL)
5424         emit_group_store (to_rtx, value, TREE_TYPE (from),
5425                           int_size_in_bytes (TREE_TYPE (from)));
5426       else if (GET_MODE (to_rtx) == BLKmode)
5427         {
5428           /* Handle calls that return BLKmode values in registers.  */
5429           if (REG_P (value))
5430             copy_blkmode_from_reg (to_rtx, value, TREE_TYPE (from));
5431           else
5432             emit_block_move (to_rtx, value, expr_size (from), BLOCK_OP_NORMAL);
5433         }
5434       else
5435         {
5436           if (POINTER_TYPE_P (TREE_TYPE (to)))
5437             value = convert_memory_address_addr_space
5438               (as_a <scalar_int_mode> (GET_MODE (to_rtx)), value,
5439                TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (to))));
5440
5441           emit_move_insn (to_rtx, value);
5442         }
5443
5444       preserve_temp_slots (to_rtx);
5445       pop_temp_slots ();
5446       return;
5447     }
5448
5449   /* Ordinary treatment.  Expand TO to get a REG or MEM rtx.  */
5450   to_rtx = expand_expr (to, NULL_RTX, VOIDmode, EXPAND_WRITE);
5451
5452   /* Don't move directly into a return register.  */
5453   if (TREE_CODE (to) == RESULT_DECL
5454       && (REG_P (to_rtx) || GET_CODE (to_rtx) == PARALLEL))
5455     {
5456       rtx temp;
5457
5458       push_temp_slots ();
5459
5460       /* If the source is itself a return value, it still is in a pseudo at
5461          this point so we can move it back to the return register directly.  */
5462       if (REG_P (to_rtx)
5463           && TYPE_MODE (TREE_TYPE (from)) == BLKmode
5464           && TREE_CODE (from) != CALL_EXPR)
5465         temp = copy_blkmode_to_reg (GET_MODE (to_rtx), from);
5466       else
5467         temp = expand_expr (from, NULL_RTX, GET_MODE (to_rtx), EXPAND_NORMAL);
5468
5469       /* Handle calls that return values in multiple non-contiguous locations.
5470          The Irix 6 ABI has examples of this.  */
5471       if (GET_CODE (to_rtx) == PARALLEL)
5472         {
5473           if (GET_CODE (temp) == PARALLEL)
5474             emit_group_move (to_rtx, temp);
5475           else
5476             emit_group_load (to_rtx, temp, TREE_TYPE (from),
5477                              int_size_in_bytes (TREE_TYPE (from)));
5478         }
5479       else if (temp)
5480         emit_move_insn (to_rtx, temp);
5481
5482       preserve_temp_slots (to_rtx);
5483       pop_temp_slots ();
5484       return;
5485     }
5486
5487   /* In case we are returning the contents of an object which overlaps
5488      the place the value is being stored, use a safe function when copying
5489      a value through a pointer into a structure value return block.  */
5490   if (TREE_CODE (to) == RESULT_DECL
5491       && TREE_CODE (from) == INDIRECT_REF
5492       && ADDR_SPACE_GENERIC_P
5493            (TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (from, 0)))))
5494       && refs_may_alias_p (to, from)
5495       && cfun->returns_struct
5496       && !cfun->returns_pcc_struct)
5497     {
5498       rtx from_rtx, size;
5499
5500       push_temp_slots ();
5501       size = expr_size (from);
5502       from_rtx = expand_normal (from);
5503
5504       emit_block_move_via_libcall (XEXP (to_rtx, 0), XEXP (from_rtx, 0), size);
5505
5506       preserve_temp_slots (to_rtx);
5507       pop_temp_slots ();
5508       return;
5509     }
5510
5511   /* Compute FROM and store the value in the rtx we got.  */
5512
5513   push_temp_slots ();
5514   result = store_expr (from, to_rtx, 0, nontemporal, false);
5515   preserve_temp_slots (result);
5516   pop_temp_slots ();
5517   return;
5518 }
5519
5520 /* Emits nontemporal store insn that moves FROM to TO.  Returns true if this
5521    succeeded, false otherwise.  */
5522
5523 bool
5524 emit_storent_insn (rtx to, rtx from)
5525 {
5526   class expand_operand ops[2];
5527   machine_mode mode = GET_MODE (to);
5528   enum insn_code code = optab_handler (storent_optab, mode);
5529
5530   if (code == CODE_FOR_nothing)
5531     return false;
5532
5533   create_fixed_operand (&ops[0], to);
5534   create_input_operand (&ops[1], from, mode);
5535   return maybe_expand_insn (code, 2, ops);
5536 }
5537
5538 /* Helper function for store_expr storing of STRING_CST.  */
5539
5540 static rtx
5541 string_cst_read_str (void *data, HOST_WIDE_INT offset, scalar_int_mode mode)
5542 {
5543   tree str = (tree) data;
5544
5545   gcc_assert (offset >= 0);
5546   if (offset >= TREE_STRING_LENGTH (str))
5547     return const0_rtx;
5548
5549   if ((unsigned HOST_WIDE_INT) offset + GET_MODE_SIZE (mode)
5550       > (unsigned HOST_WIDE_INT) TREE_STRING_LENGTH (str))
5551     {
5552       char *p = XALLOCAVEC (char, GET_MODE_SIZE (mode));
5553       size_t l = TREE_STRING_LENGTH (str) - offset;
5554       memcpy (p, TREE_STRING_POINTER (str) + offset, l);
5555       memset (p + l, '\0', GET_MODE_SIZE (mode) - l);
5556       return c_readstr (p, mode, false);
5557     }
5558
5559   return c_readstr (TREE_STRING_POINTER (str) + offset, mode, false);
5560 }
5561
5562 /* Generate code for computing expression EXP,
5563    and storing the value into TARGET.
5564
5565    If the mode is BLKmode then we may return TARGET itself.
5566    It turns out that in BLKmode it doesn't cause a problem.
5567    because C has no operators that could combine two different
5568    assignments into the same BLKmode object with different values
5569    with no sequence point.  Will other languages need this to
5570    be more thorough?
5571
5572    If CALL_PARAM_P is nonzero, this is a store into a call param on the
5573    stack, and block moves may need to be treated specially.
5574
5575    If NONTEMPORAL is true, try using a nontemporal store instruction.
5576
5577    If REVERSE is true, the store is to be done in reverse order.  */
5578
5579 rtx
5580 store_expr (tree exp, rtx target, int call_param_p,
5581             bool nontemporal, bool reverse)
5582 {
5583   rtx temp;
5584   rtx alt_rtl = NULL_RTX;
5585   location_t loc = curr_insn_location ();
5586
5587   if (VOID_TYPE_P (TREE_TYPE (exp)))
5588     {
5589       /* C++ can generate ?: expressions with a throw expression in one
5590          branch and an rvalue in the other. Here, we resolve attempts to
5591          store the throw expression's nonexistent result.  */
5592       gcc_assert (!call_param_p);
5593       expand_expr (exp, const0_rtx, VOIDmode, EXPAND_NORMAL);
5594       return NULL_RTX;
5595     }
5596   if (TREE_CODE (exp) == COMPOUND_EXPR)
5597     {
5598       /* Perform first part of compound expression, then assign from second
5599          part.  */
5600       expand_expr (TREE_OPERAND (exp, 0), const0_rtx, VOIDmode,
5601                    call_param_p ? EXPAND_STACK_PARM : EXPAND_NORMAL);
5602       return store_expr (TREE_OPERAND (exp, 1), target,
5603                                      call_param_p, nontemporal, reverse);
5604     }
5605   else if (TREE_CODE (exp) == COND_EXPR && GET_MODE (target) == BLKmode)
5606     {
5607       /* For conditional expression, get safe form of the target.  Then
5608          test the condition, doing the appropriate assignment on either
5609          side.  This avoids the creation of unnecessary temporaries.
5610          For non-BLKmode, it is more efficient not to do this.  */
5611
5612       rtx_code_label *lab1 = gen_label_rtx (), *lab2 = gen_label_rtx ();
5613
5614       do_pending_stack_adjust ();
5615       NO_DEFER_POP;
5616       jumpifnot (TREE_OPERAND (exp, 0), lab1,
5617                  profile_probability::uninitialized ());
5618       store_expr (TREE_OPERAND (exp, 1), target, call_param_p,
5619                   nontemporal, reverse);
5620       emit_jump_insn (targetm.gen_jump (lab2));
5621       emit_barrier ();
5622       emit_label (lab1);
5623       store_expr (TREE_OPERAND (exp, 2), target, call_param_p,
5624                   nontemporal, reverse);
5625       emit_label (lab2);
5626       OK_DEFER_POP;
5627
5628       return NULL_RTX;
5629     }
5630   else if (GET_CODE (target) == SUBREG && SUBREG_PROMOTED_VAR_P (target))
5631     /* If this is a scalar in a register that is stored in a wider mode
5632        than the declared mode, compute the result into its declared mode
5633        and then convert to the wider mode.  Our value is the computed
5634        expression.  */
5635     {
5636       rtx inner_target = 0;
5637       scalar_int_mode outer_mode = subreg_unpromoted_mode (target);
5638       scalar_int_mode inner_mode = subreg_promoted_mode (target);
5639
5640       /* We can do the conversion inside EXP, which will often result
5641          in some optimizations.  Do the conversion in two steps: first
5642          change the signedness, if needed, then the extend.  But don't
5643          do this if the type of EXP is a subtype of something else
5644          since then the conversion might involve more than just
5645          converting modes.  */
5646       if (INTEGRAL_TYPE_P (TREE_TYPE (exp))
5647           && TREE_TYPE (TREE_TYPE (exp)) == 0
5648           && GET_MODE_PRECISION (outer_mode)
5649              == TYPE_PRECISION (TREE_TYPE (exp)))
5650         {
5651           if (!SUBREG_CHECK_PROMOTED_SIGN (target,
5652                                           TYPE_UNSIGNED (TREE_TYPE (exp))))
5653             {
5654               /* Some types, e.g. Fortran's logical*4, won't have a signed
5655                  version, so use the mode instead.  */
5656               tree ntype
5657                 = (signed_or_unsigned_type_for
5658                    (SUBREG_PROMOTED_SIGN (target), TREE_TYPE (exp)));
5659               if (ntype == NULL)
5660                 ntype = lang_hooks.types.type_for_mode
5661                   (TYPE_MODE (TREE_TYPE (exp)),
5662                    SUBREG_PROMOTED_SIGN (target));
5663
5664               exp = fold_convert_loc (loc, ntype, exp);
5665             }
5666
5667           exp = fold_convert_loc (loc, lang_hooks.types.type_for_mode
5668                                   (inner_mode, SUBREG_PROMOTED_SIGN (target)),
5669                                   exp);
5670
5671           inner_target = SUBREG_REG (target);
5672         }
5673
5674       temp = expand_expr (exp, inner_target, VOIDmode,
5675                           call_param_p ? EXPAND_STACK_PARM : EXPAND_NORMAL);
5676
5677
5678       /* If TEMP is a VOIDmode constant, use convert_modes to make
5679          sure that we properly convert it.  */
5680       if (CONSTANT_P (temp) && GET_MODE (temp) == VOIDmode)
5681         {
5682           temp = convert_modes (outer_mode, TYPE_MODE (TREE_TYPE (exp)),
5683                                 temp, SUBREG_PROMOTED_SIGN (target));
5684           temp = convert_modes (inner_mode, outer_mode, temp,
5685                                 SUBREG_PROMOTED_SIGN (target));
5686         }
5687
5688       convert_move (SUBREG_REG (target), temp,
5689                     SUBREG_PROMOTED_SIGN (target));
5690
5691       return NULL_RTX;
5692     }
5693   else if ((TREE_CODE (exp) == STRING_CST
5694             || (TREE_CODE (exp) == MEM_REF
5695                 && TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
5696                 && TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
5697                    == STRING_CST
5698                 && integer_zerop (TREE_OPERAND (exp, 1))))
5699            && !nontemporal && !call_param_p
5700            && MEM_P (target))
5701     {
5702       /* Optimize initialization of an array with a STRING_CST.  */
5703       HOST_WIDE_INT exp_len, str_copy_len;
5704       rtx dest_mem;
5705       tree str = TREE_CODE (exp) == STRING_CST
5706                  ? exp : TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
5707
5708       exp_len = int_expr_size (exp);
5709       if (exp_len <= 0)
5710         goto normal_expr;
5711
5712       if (TREE_STRING_LENGTH (str) <= 0)
5713         goto normal_expr;
5714
5715       if (can_store_by_pieces (exp_len, string_cst_read_str, (void *) str,
5716                                MEM_ALIGN (target), false))
5717         {
5718           store_by_pieces (target, exp_len, string_cst_read_str, (void *) str,
5719                            MEM_ALIGN (target), false, RETURN_BEGIN);
5720           return NULL_RTX;
5721         }
5722
5723       str_copy_len = TREE_STRING_LENGTH (str);
5724       if ((STORE_MAX_PIECES & (STORE_MAX_PIECES - 1)) == 0)
5725         {
5726           str_copy_len += STORE_MAX_PIECES - 1;
5727           str_copy_len &= ~(STORE_MAX_PIECES - 1);
5728         }
5729       if (str_copy_len >= exp_len)
5730         goto normal_expr;
5731
5732       if (!can_store_by_pieces (str_copy_len, string_cst_read_str,
5733                                 (void *) str, MEM_ALIGN (target), false))
5734         goto normal_expr;
5735
5736       dest_mem = store_by_pieces (target, str_copy_len, string_cst_read_str,
5737                                   (void *) str, MEM_ALIGN (target), false,
5738                                   RETURN_END);
5739       clear_storage (adjust_address_1 (dest_mem, BLKmode, 0, 1, 1, 0,
5740                                        exp_len - str_copy_len),
5741                      GEN_INT (exp_len - str_copy_len), BLOCK_OP_NORMAL);
5742       return NULL_RTX;
5743     }
5744   else
5745     {
5746       rtx tmp_target;
5747
5748   normal_expr:
5749       /* If we want to use a nontemporal or a reverse order store, force the
5750          value into a register first.  */
5751       tmp_target = nontemporal || reverse ? NULL_RTX : target;
5752       temp = expand_expr_real (exp, tmp_target, GET_MODE (target),
5753                                (call_param_p
5754                                 ? EXPAND_STACK_PARM : EXPAND_NORMAL),
5755                                &alt_rtl, false);
5756     }
5757
5758   /* If TEMP is a VOIDmode constant and the mode of the type of EXP is not
5759      the same as that of TARGET, adjust the constant.  This is needed, for
5760      example, in case it is a CONST_DOUBLE or CONST_WIDE_INT and we want 
5761      only a word-sized value.  */
5762   if (CONSTANT_P (temp) && GET_MODE (temp) == VOIDmode
5763       && TREE_CODE (exp) != ERROR_MARK
5764       && GET_MODE (target) != TYPE_MODE (TREE_TYPE (exp)))
5765     {
5766       if (GET_MODE_CLASS (GET_MODE (target))
5767           != GET_MODE_CLASS (TYPE_MODE (TREE_TYPE (exp)))
5768           && known_eq (GET_MODE_BITSIZE (GET_MODE (target)),
5769                        GET_MODE_BITSIZE (TYPE_MODE (TREE_TYPE (exp)))))
5770         {
5771           rtx t = simplify_gen_subreg (GET_MODE (target), temp,
5772                                        TYPE_MODE (TREE_TYPE (exp)), 0);
5773           if (t)
5774             temp = t;
5775         }
5776       if (GET_MODE (temp) == VOIDmode)
5777         temp = convert_modes (GET_MODE (target), TYPE_MODE (TREE_TYPE (exp)),
5778                               temp, TYPE_UNSIGNED (TREE_TYPE (exp)));
5779     }
5780
5781   /* If value was not generated in the target, store it there.
5782      Convert the value to TARGET's type first if necessary and emit the
5783      pending incrementations that have been queued when expanding EXP.
5784      Note that we cannot emit the whole queue blindly because this will
5785      effectively disable the POST_INC optimization later.
5786
5787      If TEMP and TARGET compare equal according to rtx_equal_p, but
5788      one or both of them are volatile memory refs, we have to distinguish
5789      two cases:
5790      - expand_expr has used TARGET.  In this case, we must not generate
5791        another copy.  This can be detected by TARGET being equal according
5792        to == .
5793      - expand_expr has not used TARGET - that means that the source just
5794        happens to have the same RTX form.  Since temp will have been created
5795        by expand_expr, it will compare unequal according to == .
5796        We must generate a copy in this case, to reach the correct number
5797        of volatile memory references.  */
5798
5799   if ((! rtx_equal_p (temp, target)
5800        || (temp != target && (side_effects_p (temp)
5801                               || side_effects_p (target))))
5802       && TREE_CODE (exp) != ERROR_MARK
5803       /* If store_expr stores a DECL whose DECL_RTL(exp) == TARGET,
5804          but TARGET is not valid memory reference, TEMP will differ
5805          from TARGET although it is really the same location.  */
5806       && !(alt_rtl
5807            && rtx_equal_p (alt_rtl, target)
5808            && !side_effects_p (alt_rtl)
5809            && !side_effects_p (target))
5810       /* If there's nothing to copy, don't bother.  Don't call
5811          expr_size unless necessary, because some front-ends (C++)
5812          expr_size-hook must not be given objects that are not
5813          supposed to be bit-copied or bit-initialized.  */
5814       && expr_size (exp) != const0_rtx)
5815     {
5816       if (GET_MODE (temp) != GET_MODE (target) && GET_MODE (temp) != VOIDmode)
5817         {
5818           if (GET_MODE (target) == BLKmode)
5819             {
5820               /* Handle calls that return BLKmode values in registers.  */
5821               if (REG_P (temp) && TREE_CODE (exp) == CALL_EXPR)
5822                 copy_blkmode_from_reg (target, temp, TREE_TYPE (exp));
5823               else
5824                 store_bit_field (target,
5825                                  rtx_to_poly_int64 (expr_size (exp))
5826                                  * BITS_PER_UNIT,
5827                                  0, 0, 0, GET_MODE (temp), temp, reverse);
5828             }
5829           else
5830             convert_move (target, temp, TYPE_UNSIGNED (TREE_TYPE (exp)));
5831         }
5832
5833       else if (GET_MODE (temp) == BLKmode && TREE_CODE (exp) == STRING_CST)
5834         {
5835           /* Handle copying a string constant into an array.  The string
5836              constant may be shorter than the array.  So copy just the string's
5837              actual length, and clear the rest.  First get the size of the data
5838              type of the string, which is actually the size of the target.  */
5839           rtx size = expr_size (exp);
5840
5841           if (CONST_INT_P (size)
5842               && INTVAL (size) < TREE_STRING_LENGTH (exp))
5843             emit_block_move (target, temp, size,
5844                              (call_param_p
5845                               ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
5846           else
5847             {
5848               machine_mode pointer_mode
5849                 = targetm.addr_space.pointer_mode (MEM_ADDR_SPACE (target));
5850               machine_mode address_mode = get_address_mode (target);
5851
5852               /* Compute the size of the data to copy from the string.  */
5853               tree copy_size
5854                 = size_binop_loc (loc, MIN_EXPR,
5855                                   make_tree (sizetype, size),
5856                                   size_int (TREE_STRING_LENGTH (exp)));
5857               rtx copy_size_rtx
5858                 = expand_expr (copy_size, NULL_RTX, VOIDmode,
5859                                (call_param_p
5860                                 ? EXPAND_STACK_PARM : EXPAND_NORMAL));
5861               rtx_code_label *label = 0;
5862
5863               /* Copy that much.  */
5864               copy_size_rtx = convert_to_mode (pointer_mode, copy_size_rtx,
5865                                                TYPE_UNSIGNED (sizetype));
5866               emit_block_move (target, temp, copy_size_rtx,
5867                                (call_param_p
5868                                 ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
5869
5870               /* Figure out how much is left in TARGET that we have to clear.
5871                  Do all calculations in pointer_mode.  */
5872               poly_int64 const_copy_size;
5873               if (poly_int_rtx_p (copy_size_rtx, &const_copy_size))
5874                 {
5875                   size = plus_constant (address_mode, size, -const_copy_size);
5876                   target = adjust_address (target, BLKmode, const_copy_size);
5877                 }
5878               else
5879                 {
5880                   size = expand_binop (TYPE_MODE (sizetype), sub_optab, size,
5881                                        copy_size_rtx, NULL_RTX, 0,
5882                                        OPTAB_LIB_WIDEN);
5883
5884                   if (GET_MODE (copy_size_rtx) != address_mode)
5885                     copy_size_rtx = convert_to_mode (address_mode,
5886                                                      copy_size_rtx,
5887                                                      TYPE_UNSIGNED (sizetype));
5888
5889                   target = offset_address (target, copy_size_rtx,
5890                                            highest_pow2_factor (copy_size));
5891                   label = gen_label_rtx ();
5892                   emit_cmp_and_jump_insns (size, const0_rtx, LT, NULL_RTX,
5893                                            GET_MODE (size), 0, label);
5894                 }
5895
5896               if (size != const0_rtx)
5897                 clear_storage (target, size, BLOCK_OP_NORMAL);
5898
5899               if (label)
5900                 emit_label (label);
5901             }
5902         }
5903       /* Handle calls that return values in multiple non-contiguous locations.
5904          The Irix 6 ABI has examples of this.  */
5905       else if (GET_CODE (target) == PARALLEL)
5906         {
5907           if (GET_CODE (temp) == PARALLEL)
5908             emit_group_move (target, temp);
5909           else
5910             emit_group_load (target, temp, TREE_TYPE (exp),
5911                              int_size_in_bytes (TREE_TYPE (exp)));
5912         }
5913       else if (GET_CODE (temp) == PARALLEL)
5914         emit_group_store (target, temp, TREE_TYPE (exp),
5915                           int_size_in_bytes (TREE_TYPE (exp)));
5916       else if (GET_MODE (temp) == BLKmode)
5917         emit_block_move (target, temp, expr_size (exp),
5918                          (call_param_p
5919                           ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
5920       /* If we emit a nontemporal store, there is nothing else to do.  */
5921       else if (nontemporal && emit_storent_insn (target, temp))
5922         ;
5923       else
5924         {
5925           if (reverse)
5926             temp = flip_storage_order (GET_MODE (target), temp);
5927           temp = force_operand (temp, target);
5928           if (temp != target)
5929             emit_move_insn (target, temp);
5930         }
5931     }
5932
5933   return NULL_RTX;
5934 }
5935 \f
5936 /* Return true if field F of structure TYPE is a flexible array.  */
5937
5938 static bool
5939 flexible_array_member_p (const_tree f, const_tree type)
5940 {
5941   const_tree tf;
5942
5943   tf = TREE_TYPE (f);
5944   return (DECL_CHAIN (f) == NULL
5945           && TREE_CODE (tf) == ARRAY_TYPE
5946           && TYPE_DOMAIN (tf)
5947           && TYPE_MIN_VALUE (TYPE_DOMAIN (tf))
5948           && integer_zerop (TYPE_MIN_VALUE (TYPE_DOMAIN (tf)))
5949           && !TYPE_MAX_VALUE (TYPE_DOMAIN (tf))
5950           && int_size_in_bytes (type) >= 0);
5951 }
5952
5953 /* If FOR_CTOR_P, return the number of top-level elements that a constructor
5954    must have in order for it to completely initialize a value of type TYPE.
5955    Return -1 if the number isn't known.
5956
5957    If !FOR_CTOR_P, return an estimate of the number of scalars in TYPE.  */
5958
5959 static HOST_WIDE_INT
5960 count_type_elements (const_tree type, bool for_ctor_p)
5961 {
5962   switch (TREE_CODE (type))
5963     {
5964     case ARRAY_TYPE:
5965       {
5966         tree nelts;
5967
5968         nelts = array_type_nelts (type);
5969         if (nelts && tree_fits_uhwi_p (nelts))
5970           {
5971             unsigned HOST_WIDE_INT n;
5972
5973             n = tree_to_uhwi (nelts) + 1;
5974             if (n == 0 || for_ctor_p)
5975               return n;
5976             else
5977               return n * count_type_elements (TREE_TYPE (type), false);
5978           }
5979         return for_ctor_p ? -1 : 1;
5980       }
5981
5982     case RECORD_TYPE:
5983       {
5984         unsigned HOST_WIDE_INT n;
5985         tree f;
5986
5987         n = 0;
5988         for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
5989           if (TREE_CODE (f) == FIELD_DECL)
5990             {
5991               if (!for_ctor_p)
5992                 n += count_type_elements (TREE_TYPE (f), false);
5993               else if (!flexible_array_member_p (f, type))
5994                 /* Don't count flexible arrays, which are not supposed
5995                    to be initialized.  */
5996                 n += 1;
5997             }
5998
5999         return n;
6000       }
6001
6002     case UNION_TYPE:
6003     case QUAL_UNION_TYPE:
6004       {
6005         tree f;
6006         HOST_WIDE_INT n, m;
6007
6008         gcc_assert (!for_ctor_p);
6009         /* Estimate the number of scalars in each field and pick the
6010            maximum.  Other estimates would do instead; the idea is simply
6011            to make sure that the estimate is not sensitive to the ordering
6012            of the fields.  */
6013         n = 1;
6014         for (f = TYPE_FIELDS (type); f ; f = DECL_CHAIN (f))
6015           if (TREE_CODE (f) == FIELD_DECL)
6016             {
6017               m = count_type_elements (TREE_TYPE (f), false);
6018               /* If the field doesn't span the whole union, add an extra
6019                  scalar for the rest.  */
6020               if (simple_cst_equal (TYPE_SIZE (TREE_TYPE (f)),
6021                                     TYPE_SIZE (type)) != 1)
6022                 m++;
6023               if (n < m)
6024                 n = m;
6025             }
6026         return n;
6027       }
6028
6029     case COMPLEX_TYPE:
6030       return 2;
6031
6032     case VECTOR_TYPE:
6033       {
6034         unsigned HOST_WIDE_INT nelts;
6035         if (TYPE_VECTOR_SUBPARTS (type).is_constant (&nelts))
6036           return nelts;
6037         else
6038           return -1;
6039       }
6040
6041     case INTEGER_TYPE:
6042     case REAL_TYPE:
6043     case FIXED_POINT_TYPE:
6044     case ENUMERAL_TYPE:
6045     case BOOLEAN_TYPE:
6046     case POINTER_TYPE:
6047     case OFFSET_TYPE:
6048     case REFERENCE_TYPE:
6049     case NULLPTR_TYPE:
6050       return 1;
6051
6052     case ERROR_MARK:
6053       return 0;
6054
6055     case VOID_TYPE:
6056     case METHOD_TYPE:
6057     case FUNCTION_TYPE:
6058     case LANG_TYPE:
6059     default:
6060       gcc_unreachable ();
6061     }
6062 }
6063
6064 /* Helper for categorize_ctor_elements.  Identical interface.  */
6065
6066 static bool
6067 categorize_ctor_elements_1 (const_tree ctor, HOST_WIDE_INT *p_nz_elts,
6068                             HOST_WIDE_INT *p_unique_nz_elts,
6069                             HOST_WIDE_INT *p_init_elts, bool *p_complete)
6070 {
6071   unsigned HOST_WIDE_INT idx;
6072   HOST_WIDE_INT nz_elts, unique_nz_elts, init_elts, num_fields;
6073   tree value, purpose, elt_type;
6074
6075   /* Whether CTOR is a valid constant initializer, in accordance with what
6076      initializer_constant_valid_p does.  If inferred from the constructor
6077      elements, true until proven otherwise.  */
6078   bool const_from_elts_p = constructor_static_from_elts_p (ctor);
6079   bool const_p = const_from_elts_p ? true : TREE_STATIC (ctor);
6080
6081   nz_elts = 0;
6082   unique_nz_elts = 0;
6083   init_elts = 0;
6084   num_fields = 0;
6085   elt_type = NULL_TREE;
6086
6087   FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), idx, purpose, value)
6088     {
6089       HOST_WIDE_INT mult = 1;
6090
6091       if (purpose && TREE_CODE (purpose) == RANGE_EXPR)
6092         {
6093           tree lo_index = TREE_OPERAND (purpose, 0);
6094           tree hi_index = TREE_OPERAND (purpose, 1);
6095
6096           if (tree_fits_uhwi_p (lo_index) && tree_fits_uhwi_p (hi_index))
6097             mult = (tree_to_uhwi (hi_index)
6098                     - tree_to_uhwi (lo_index) + 1);
6099         }
6100       num_fields += mult;
6101       elt_type = TREE_TYPE (value);
6102
6103       switch (TREE_CODE (value))
6104         {
6105         case CONSTRUCTOR:
6106           {
6107             HOST_WIDE_INT nz = 0, unz = 0, ic = 0;
6108
6109             bool const_elt_p = categorize_ctor_elements_1 (value, &nz, &unz,
6110                                                            &ic, p_complete);
6111
6112             nz_elts += mult * nz;
6113             unique_nz_elts += unz;
6114             init_elts += mult * ic;
6115
6116             if (const_from_elts_p && const_p)
6117               const_p = const_elt_p;
6118           }
6119           break;
6120
6121         case INTEGER_CST:
6122         case REAL_CST:
6123         case FIXED_CST:
6124           if (!initializer_zerop (value))
6125             {
6126               nz_elts += mult;
6127               unique_nz_elts++;
6128             }
6129           init_elts += mult;
6130           break;
6131
6132         case STRING_CST:
6133           nz_elts += mult * TREE_STRING_LENGTH (value);
6134           unique_nz_elts += TREE_STRING_LENGTH (value);
6135           init_elts += mult * TREE_STRING_LENGTH (value);
6136           break;
6137
6138         case COMPLEX_CST:
6139           if (!initializer_zerop (TREE_REALPART (value)))
6140             {
6141               nz_elts += mult;
6142               unique_nz_elts++;
6143             }
6144           if (!initializer_zerop (TREE_IMAGPART (value)))
6145             {
6146               nz_elts += mult;
6147               unique_nz_elts++;
6148             }
6149           init_elts += 2 * mult;
6150           break;
6151
6152         case VECTOR_CST:
6153           {
6154             /* We can only construct constant-length vectors using
6155                CONSTRUCTOR.  */
6156             unsigned int nunits = VECTOR_CST_NELTS (value).to_constant ();
6157             for (unsigned int i = 0; i < nunits; ++i)
6158               {
6159                 tree v = VECTOR_CST_ELT (value, i);
6160                 if (!initializer_zerop (v))
6161                   {
6162                     nz_elts += mult;
6163                     unique_nz_elts++;
6164                   }
6165                 init_elts += mult;
6166               }
6167           }
6168           break;
6169
6170         default:
6171           {
6172             HOST_WIDE_INT tc = count_type_elements (elt_type, false);
6173             nz_elts += mult * tc;
6174             unique_nz_elts += tc;
6175             init_elts += mult * tc;
6176
6177             if (const_from_elts_p && const_p)
6178               const_p
6179                 = initializer_constant_valid_p (value,
6180                                                 elt_type,
6181                                                 TYPE_REVERSE_STORAGE_ORDER
6182                                                 (TREE_TYPE (ctor)))
6183                   != NULL_TREE;
6184           }
6185           break;
6186         }
6187     }
6188
6189   if (*p_complete && !complete_ctor_at_level_p (TREE_TYPE (ctor),
6190                                                 num_fields, elt_type))
6191     *p_complete = false;
6192
6193   *p_nz_elts += nz_elts;
6194   *p_unique_nz_elts += unique_nz_elts;
6195   *p_init_elts += init_elts;
6196
6197   return const_p;
6198 }
6199
6200 /* Examine CTOR to discover:
6201    * how many scalar fields are set to nonzero values,
6202      and place it in *P_NZ_ELTS;
6203    * the same, but counting RANGE_EXPRs as multiplier of 1 instead of
6204      high - low + 1 (this can be useful for callers to determine ctors
6205      that could be cheaply initialized with - perhaps nested - loops
6206      compared to copied from huge read-only data),
6207      and place it in *P_UNIQUE_NZ_ELTS;
6208    * how many scalar fields in total are in CTOR,
6209      and place it in *P_ELT_COUNT.
6210    * whether the constructor is complete -- in the sense that every
6211      meaningful byte is explicitly given a value --
6212      and place it in *P_COMPLETE.
6213
6214    Return whether or not CTOR is a valid static constant initializer, the same
6215    as "initializer_constant_valid_p (CTOR, TREE_TYPE (CTOR)) != 0".  */
6216
6217 bool
6218 categorize_ctor_elements (const_tree ctor, HOST_WIDE_INT *p_nz_elts,
6219                           HOST_WIDE_INT *p_unique_nz_elts,
6220                           HOST_WIDE_INT *p_init_elts, bool *p_complete)
6221 {
6222   *p_nz_elts = 0;
6223   *p_unique_nz_elts = 0;
6224   *p_init_elts = 0;
6225   *p_complete = true;
6226
6227   return categorize_ctor_elements_1 (ctor, p_nz_elts, p_unique_nz_elts,
6228                                      p_init_elts, p_complete);
6229 }
6230
6231 /* TYPE is initialized by a constructor with NUM_ELTS elements, the last
6232    of which had type LAST_TYPE.  Each element was itself a complete
6233    initializer, in the sense that every meaningful byte was explicitly
6234    given a value.  Return true if the same is true for the constructor
6235    as a whole.  */
6236
6237 bool
6238 complete_ctor_at_level_p (const_tree type, HOST_WIDE_INT num_elts,
6239                           const_tree last_type)
6240 {
6241   if (TREE_CODE (type) == UNION_TYPE
6242       || TREE_CODE (type) == QUAL_UNION_TYPE)
6243     {
6244       if (num_elts == 0)
6245         return false;
6246
6247       gcc_assert (num_elts == 1 && last_type);
6248
6249       /* ??? We could look at each element of the union, and find the
6250          largest element.  Which would avoid comparing the size of the
6251          initialized element against any tail padding in the union.
6252          Doesn't seem worth the effort...  */
6253       return simple_cst_equal (TYPE_SIZE (type), TYPE_SIZE (last_type)) == 1;
6254     }
6255
6256   return count_type_elements (type, true) == num_elts;
6257 }
6258
6259 /* Return 1 if EXP contains mostly (3/4) zeros.  */
6260
6261 static int
6262 mostly_zeros_p (const_tree exp)
6263 {
6264   if (TREE_CODE (exp) == CONSTRUCTOR)
6265     {
6266       HOST_WIDE_INT nz_elts, unz_elts, init_elts;
6267       bool complete_p;
6268
6269       categorize_ctor_elements (exp, &nz_elts, &unz_elts, &init_elts,
6270                                 &complete_p);
6271       return !complete_p || nz_elts < init_elts / 4;
6272     }
6273
6274   return initializer_zerop (exp);
6275 }
6276
6277 /* Return 1 if EXP contains all zeros.  */
6278
6279 static int
6280 all_zeros_p (const_tree exp)
6281 {
6282   if (TREE_CODE (exp) == CONSTRUCTOR)
6283     {
6284       HOST_WIDE_INT nz_elts, unz_elts, init_elts;
6285       bool complete_p;
6286
6287       categorize_ctor_elements (exp, &nz_elts, &unz_elts, &init_elts,
6288                                 &complete_p);
6289       return nz_elts == 0;
6290     }
6291
6292   return initializer_zerop (exp);
6293 }
6294 \f
6295 /* Helper function for store_constructor.
6296    TARGET, BITSIZE, BITPOS, MODE, EXP are as for store_field.
6297    CLEARED is as for store_constructor.
6298    ALIAS_SET is the alias set to use for any stores.
6299    If REVERSE is true, the store is to be done in reverse order.
6300
6301    This provides a recursive shortcut back to store_constructor when it isn't
6302    necessary to go through store_field.  This is so that we can pass through
6303    the cleared field to let store_constructor know that we may not have to
6304    clear a substructure if the outer structure has already been cleared.  */
6305
6306 static void
6307 store_constructor_field (rtx target, poly_uint64 bitsize, poly_int64 bitpos,
6308                          poly_uint64 bitregion_start,
6309                          poly_uint64 bitregion_end,
6310                          machine_mode mode,
6311                          tree exp, int cleared,
6312                          alias_set_type alias_set, bool reverse)
6313 {
6314   poly_int64 bytepos;
6315   poly_uint64 bytesize;
6316   if (TREE_CODE (exp) == CONSTRUCTOR
6317       /* We can only call store_constructor recursively if the size and
6318          bit position are on a byte boundary.  */
6319       && multiple_p (bitpos, BITS_PER_UNIT, &bytepos)
6320       && maybe_ne (bitsize, 0U)
6321       && multiple_p (bitsize, BITS_PER_UNIT, &bytesize)
6322       /* If we have a nonzero bitpos for a register target, then we just
6323          let store_field do the bitfield handling.  This is unlikely to
6324          generate unnecessary clear instructions anyways.  */
6325       && (known_eq (bitpos, 0) || MEM_P (target)))
6326     {
6327       if (MEM_P (target))
6328         {
6329           machine_mode target_mode = GET_MODE (target);
6330           if (target_mode != BLKmode
6331               && !multiple_p (bitpos, GET_MODE_ALIGNMENT (target_mode)))
6332             target_mode = BLKmode;
6333           target = adjust_address (target, target_mode, bytepos);
6334         }
6335
6336
6337       /* Update the alias set, if required.  */
6338       if (MEM_P (target) && ! MEM_KEEP_ALIAS_SET_P (target)
6339           && MEM_ALIAS_SET (target) != 0)
6340         {
6341           target = copy_rtx (target);
6342           set_mem_alias_set (target, alias_set);
6343         }
6344
6345       store_constructor (exp, target, cleared, bytesize, reverse);
6346     }
6347   else
6348     store_field (target, bitsize, bitpos, bitregion_start, bitregion_end, mode,
6349                  exp, alias_set, false, reverse);
6350 }
6351
6352
6353 /* Returns the number of FIELD_DECLs in TYPE.  */
6354
6355 static int
6356 fields_length (const_tree type)
6357 {
6358   tree t = TYPE_FIELDS (type);
6359   int count = 0;
6360
6361   for (; t; t = DECL_CHAIN (t))
6362     if (TREE_CODE (t) == FIELD_DECL)
6363       ++count;
6364
6365   return count;
6366 }
6367
6368
6369 /* Store the value of constructor EXP into the rtx TARGET.
6370    TARGET is either a REG or a MEM; we know it cannot conflict, since
6371    safe_from_p has been called.
6372    CLEARED is true if TARGET is known to have been zero'd.
6373    SIZE is the number of bytes of TARGET we are allowed to modify: this
6374    may not be the same as the size of EXP if we are assigning to a field
6375    which has been packed to exclude padding bits.
6376    If REVERSE is true, the store is to be done in reverse order.  */
6377
6378 static void
6379 store_constructor (tree exp, rtx target, int cleared, poly_int64 size,
6380                    bool reverse)
6381 {
6382   tree type = TREE_TYPE (exp);
6383   HOST_WIDE_INT exp_size = int_size_in_bytes (type);
6384   poly_int64 bitregion_end = known_gt (size, 0) ? size * BITS_PER_UNIT - 1 : 0;
6385
6386   switch (TREE_CODE (type))
6387     {
6388     case RECORD_TYPE:
6389     case UNION_TYPE:
6390     case QUAL_UNION_TYPE:
6391       {
6392         unsigned HOST_WIDE_INT idx;
6393         tree field, value;
6394
6395         /* The storage order is specified for every aggregate type.  */
6396         reverse = TYPE_REVERSE_STORAGE_ORDER (type);
6397
6398         /* If size is zero or the target is already cleared, do nothing.  */
6399         if (known_eq (size, 0) || cleared)
6400           cleared = 1;
6401         /* We either clear the aggregate or indicate the value is dead.  */
6402         else if ((TREE_CODE (type) == UNION_TYPE
6403                   || TREE_CODE (type) == QUAL_UNION_TYPE)
6404                  && ! CONSTRUCTOR_ELTS (exp))
6405           /* If the constructor is empty, clear the union.  */
6406           {
6407             clear_storage (target, expr_size (exp), BLOCK_OP_NORMAL);
6408             cleared = 1;
6409           }
6410
6411         /* If we are building a static constructor into a register,
6412            set the initial value as zero so we can fold the value into
6413            a constant.  But if more than one register is involved,
6414            this probably loses.  */
6415         else if (REG_P (target) && TREE_STATIC (exp)
6416                  && known_le (GET_MODE_SIZE (GET_MODE (target)),
6417                               REGMODE_NATURAL_SIZE (GET_MODE (target))))
6418           {
6419             emit_move_insn (target, CONST0_RTX (GET_MODE (target)));
6420             cleared = 1;
6421           }
6422
6423         /* If the constructor has fewer fields than the structure or
6424            if we are initializing the structure to mostly zeros, clear
6425            the whole structure first.  Don't do this if TARGET is a
6426            register whose mode size isn't equal to SIZE since
6427            clear_storage can't handle this case.  */
6428         else if (known_size_p (size)
6429                  && (((int) CONSTRUCTOR_NELTS (exp) != fields_length (type))
6430                      || mostly_zeros_p (exp))
6431                  && (!REG_P (target)
6432                      || known_eq (GET_MODE_SIZE (GET_MODE (target)), size)))
6433           {
6434             clear_storage (target, gen_int_mode (size, Pmode),
6435                            BLOCK_OP_NORMAL);
6436             cleared = 1;
6437           }
6438
6439         if (REG_P (target) && !cleared)
6440           emit_clobber (target);
6441
6442         /* Store each element of the constructor into the
6443            corresponding field of TARGET.  */
6444         FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, field, value)
6445           {
6446             machine_mode mode;
6447             HOST_WIDE_INT bitsize;
6448             HOST_WIDE_INT bitpos = 0;
6449             tree offset;
6450             rtx to_rtx = target;
6451
6452             /* Just ignore missing fields.  We cleared the whole
6453                structure, above, if any fields are missing.  */
6454             if (field == 0)
6455               continue;
6456
6457             if (cleared && initializer_zerop (value))
6458               continue;
6459
6460             if (tree_fits_uhwi_p (DECL_SIZE (field)))
6461               bitsize = tree_to_uhwi (DECL_SIZE (field));
6462             else
6463               gcc_unreachable ();
6464
6465             mode = DECL_MODE (field);
6466             if (DECL_BIT_FIELD (field))
6467               mode = VOIDmode;
6468
6469             offset = DECL_FIELD_OFFSET (field);
6470             if (tree_fits_shwi_p (offset)
6471                 && tree_fits_shwi_p (bit_position (field)))
6472               {
6473                 bitpos = int_bit_position (field);
6474                 offset = NULL_TREE;
6475               }
6476             else
6477               gcc_unreachable ();
6478
6479             /* If this initializes a field that is smaller than a
6480                word, at the start of a word, try to widen it to a full
6481                word.  This special case allows us to output C++ member
6482                function initializations in a form that the optimizers
6483                can understand.  */
6484             if (WORD_REGISTER_OPERATIONS
6485                 && REG_P (target)
6486                 && bitsize < BITS_PER_WORD
6487                 && bitpos % BITS_PER_WORD == 0
6488                 && GET_MODE_CLASS (mode) == MODE_INT
6489                 && TREE_CODE (value) == INTEGER_CST
6490                 && exp_size >= 0
6491                 && bitpos + BITS_PER_WORD <= exp_size * BITS_PER_UNIT)
6492               {
6493                 type = TREE_TYPE (value);
6494
6495                 if (TYPE_PRECISION (type) < BITS_PER_WORD)
6496                   {
6497                     type = lang_hooks.types.type_for_mode
6498                       (word_mode, TYPE_UNSIGNED (type));
6499                     value = fold_convert (type, value);
6500                     /* Make sure the bits beyond the original bitsize are zero
6501                        so that we can correctly avoid extra zeroing stores in
6502                        later constructor elements.  */
6503                     tree bitsize_mask
6504                       = wide_int_to_tree (type, wi::mask (bitsize, false,
6505                                                            BITS_PER_WORD));
6506                     value = fold_build2 (BIT_AND_EXPR, type, value, bitsize_mask);
6507                   }
6508
6509                 if (BYTES_BIG_ENDIAN)
6510                   value
6511                    = fold_build2 (LSHIFT_EXPR, type, value,
6512                                    build_int_cst (type,
6513                                                   BITS_PER_WORD - bitsize));
6514                 bitsize = BITS_PER_WORD;
6515                 mode = word_mode;
6516               }
6517
6518             if (MEM_P (to_rtx) && !MEM_KEEP_ALIAS_SET_P (to_rtx)
6519                 && DECL_NONADDRESSABLE_P (field))
6520               {
6521                 to_rtx = copy_rtx (to_rtx);
6522                 MEM_KEEP_ALIAS_SET_P (to_rtx) = 1;
6523               }
6524
6525             store_constructor_field (to_rtx, bitsize, bitpos,
6526                                      0, bitregion_end, mode,
6527                                      value, cleared,
6528                                      get_alias_set (TREE_TYPE (field)),
6529                                      reverse);
6530           }
6531         break;
6532       }
6533     case ARRAY_TYPE:
6534       {
6535         tree value, index;
6536         unsigned HOST_WIDE_INT i;
6537         int need_to_clear;
6538         tree domain;
6539         tree elttype = TREE_TYPE (type);
6540         int const_bounds_p;
6541         HOST_WIDE_INT minelt = 0;
6542         HOST_WIDE_INT maxelt = 0;
6543
6544         /* The storage order is specified for every aggregate type.  */
6545         reverse = TYPE_REVERSE_STORAGE_ORDER (type);
6546
6547         domain = TYPE_DOMAIN (type);
6548         const_bounds_p = (TYPE_MIN_VALUE (domain)
6549                           && TYPE_MAX_VALUE (domain)
6550                           && tree_fits_shwi_p (TYPE_MIN_VALUE (domain))
6551                           && tree_fits_shwi_p (TYPE_MAX_VALUE (domain)));
6552
6553         /* If we have constant bounds for the range of the type, get them.  */
6554         if (const_bounds_p)
6555           {
6556             minelt = tree_to_shwi (TYPE_MIN_VALUE (domain));
6557             maxelt = tree_to_shwi (TYPE_MAX_VALUE (domain));
6558           }
6559
6560         /* If the constructor has fewer elements than the array, clear
6561            the whole array first.  Similarly if this is static
6562            constructor of a non-BLKmode object.  */
6563         if (cleared)
6564           need_to_clear = 0;
6565         else if (REG_P (target) && TREE_STATIC (exp))
6566           need_to_clear = 1;
6567         else
6568           {
6569             unsigned HOST_WIDE_INT idx;
6570             HOST_WIDE_INT count = 0, zero_count = 0;
6571             need_to_clear = ! const_bounds_p;
6572
6573             /* This loop is a more accurate version of the loop in
6574                mostly_zeros_p (it handles RANGE_EXPR in an index).  It
6575                is also needed to check for missing elements.  */
6576             FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), idx, index, value)
6577               {
6578                 HOST_WIDE_INT this_node_count;
6579
6580                 if (need_to_clear)
6581                   break;
6582
6583                 if (index != NULL_TREE && TREE_CODE (index) == RANGE_EXPR)
6584                   {
6585                     tree lo_index = TREE_OPERAND (index, 0);
6586                     tree hi_index = TREE_OPERAND (index, 1);
6587
6588                     if (! tree_fits_uhwi_p (lo_index)
6589                         || ! tree_fits_uhwi_p (hi_index))
6590                       {
6591                         need_to_clear = 1;
6592                         break;
6593                       }
6594
6595                     this_node_count = (tree_to_uhwi (hi_index)
6596                                        - tree_to_uhwi (lo_index) + 1);
6597                   }
6598                 else
6599                   this_node_count = 1;
6600
6601                 count += this_node_count;
6602                 if (mostly_zeros_p (value))
6603                   zero_count += this_node_count;
6604               }
6605
6606             /* Clear the entire array first if there are any missing
6607                elements, or if the incidence of zero elements is >=
6608                75%.  */
6609             if (! need_to_clear
6610                 && (count < maxelt - minelt + 1
6611                     || 4 * zero_count >= 3 * count))
6612               need_to_clear = 1;
6613           }
6614
6615         if (need_to_clear && maybe_gt (size, 0))
6616           {
6617             if (REG_P (target))
6618               emit_move_insn (target, CONST0_RTX (GET_MODE (target)));
6619             else
6620               clear_storage (target, gen_int_mode (size, Pmode),
6621                              BLOCK_OP_NORMAL);
6622             cleared = 1;
6623           }
6624
6625         if (!cleared && REG_P (target))
6626           /* Inform later passes that the old value is dead.  */
6627           emit_clobber (target);
6628
6629         /* Store each element of the constructor into the
6630            corresponding element of TARGET, determined by counting the
6631            elements.  */
6632         FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (exp), i, index, value)
6633           {
6634             machine_mode mode;
6635             poly_int64 bitsize;
6636             HOST_WIDE_INT bitpos;
6637             rtx xtarget = target;
6638
6639             if (cleared && initializer_zerop (value))
6640               continue;
6641
6642             mode = TYPE_MODE (elttype);
6643             if (mode != BLKmode)
6644               bitsize = GET_MODE_BITSIZE (mode);
6645             else if (!poly_int_tree_p (TYPE_SIZE (elttype), &bitsize))
6646               bitsize = -1;
6647
6648             if (index != NULL_TREE && TREE_CODE (index) == RANGE_EXPR)
6649               {
6650                 tree lo_index = TREE_OPERAND (index, 0);
6651                 tree hi_index = TREE_OPERAND (index, 1);
6652                 rtx index_r, pos_rtx;
6653                 HOST_WIDE_INT lo, hi, count;
6654                 tree position;
6655
6656                 /* If the range is constant and "small", unroll the loop.  */
6657                 if (const_bounds_p
6658                     && tree_fits_shwi_p (lo_index)
6659                     && tree_fits_shwi_p (hi_index)
6660                     && (lo = tree_to_shwi (lo_index),
6661                         hi = tree_to_shwi (hi_index),
6662                         count = hi - lo + 1,
6663                         (!MEM_P (target)
6664                          || count <= 2
6665                          || (tree_fits_uhwi_p (TYPE_SIZE (elttype))
6666                              && (tree_to_uhwi (TYPE_SIZE (elttype)) * count
6667                                  <= 40 * 8)))))
6668                   {
6669                     lo -= minelt;  hi -= minelt;
6670                     for (; lo <= hi; lo++)
6671                       {
6672                         bitpos = lo * tree_to_shwi (TYPE_SIZE (elttype));
6673
6674                         if (MEM_P (target)
6675                             && !MEM_KEEP_ALIAS_SET_P (target)
6676                             && TREE_CODE (type) == ARRAY_TYPE
6677                             && TYPE_NONALIASED_COMPONENT (type))
6678                           {
6679                             target = copy_rtx (target);
6680                             MEM_KEEP_ALIAS_SET_P (target) = 1;
6681                           }
6682
6683                         store_constructor_field
6684                           (target, bitsize, bitpos, 0, bitregion_end,
6685                            mode, value, cleared,
6686                            get_alias_set (elttype), reverse);
6687                       }
6688                   }
6689                 else
6690                   {
6691                     rtx_code_label *loop_start = gen_label_rtx ();
6692                     rtx_code_label *loop_end = gen_label_rtx ();
6693                     tree exit_cond;
6694
6695                     expand_normal (hi_index);
6696
6697                     index = build_decl (EXPR_LOCATION (exp),
6698                                         VAR_DECL, NULL_TREE, domain);
6699                     index_r = gen_reg_rtx (promote_decl_mode (index, NULL));
6700                     SET_DECL_RTL (index, index_r);
6701                     store_expr (lo_index, index_r, 0, false, reverse);
6702
6703                     /* Build the head of the loop.  */
6704                     do_pending_stack_adjust ();
6705                     emit_label (loop_start);
6706
6707                     /* Assign value to element index.  */
6708                     position =
6709                       fold_convert (ssizetype,
6710                                     fold_build2 (MINUS_EXPR,
6711                                                  TREE_TYPE (index),
6712                                                  index,
6713                                                  TYPE_MIN_VALUE (domain)));
6714
6715                     position =
6716                         size_binop (MULT_EXPR, position,
6717                                     fold_convert (ssizetype,
6718                                                   TYPE_SIZE_UNIT (elttype)));
6719
6720                     pos_rtx = expand_normal (position);
6721                     xtarget = offset_address (target, pos_rtx,
6722                                               highest_pow2_factor (position));
6723                     xtarget = adjust_address (xtarget, mode, 0);
6724                     if (TREE_CODE (value) == CONSTRUCTOR)
6725                       store_constructor (value, xtarget, cleared,
6726                                          exact_div (bitsize, BITS_PER_UNIT),
6727                                          reverse);
6728                     else
6729                       store_expr (value, xtarget, 0, false, reverse);
6730
6731                     /* Generate a conditional jump to exit the loop.  */
6732                     exit_cond = build2 (LT_EXPR, integer_type_node,
6733                                         index, hi_index);
6734                     jumpif (exit_cond, loop_end,
6735                             profile_probability::uninitialized ());
6736
6737                     /* Update the loop counter, and jump to the head of
6738                        the loop.  */
6739                     expand_assignment (index,
6740                                        build2 (PLUS_EXPR, TREE_TYPE (index),
6741                                                index, integer_one_node),
6742                                        false);
6743
6744                     emit_jump (loop_start);
6745
6746                     /* Build the end of the loop.  */
6747                     emit_label (loop_end);
6748                   }
6749               }
6750             else if ((index != 0 && ! tree_fits_shwi_p (index))
6751                      || ! tree_fits_uhwi_p (TYPE_SIZE (elttype)))
6752               {
6753                 tree position;
6754
6755                 if (index == 0)
6756                   index = ssize_int (1);
6757
6758                 if (minelt)
6759                   index = fold_convert (ssizetype,
6760                                         fold_build2 (MINUS_EXPR,
6761                                                      TREE_TYPE (index),
6762                                                      index,
6763                                                      TYPE_MIN_VALUE (domain)));
6764
6765                 position =
6766                   size_binop (MULT_EXPR, index,
6767                               fold_convert (ssizetype,
6768                                             TYPE_SIZE_UNIT (elttype)));
6769                 xtarget = offset_address (target,
6770                                           expand_normal (position),
6771                                           highest_pow2_factor (position));
6772                 xtarget = adjust_address (xtarget, mode, 0);
6773                 store_expr (value, xtarget, 0, false, reverse);
6774               }
6775             else
6776               {
6777                 if (index != 0)
6778                   bitpos = ((tree_to_shwi (index) - minelt)
6779                             * tree_to_uhwi (TYPE_SIZE (elttype)));
6780                 else
6781                   bitpos = (i * tree_to_uhwi (TYPE_SIZE (elttype)));
6782
6783                 if (MEM_P (target) && !MEM_KEEP_ALIAS_SET_P (target)
6784                     && TREE_CODE (type) == ARRAY_TYPE
6785                     && TYPE_NONALIASED_COMPONENT (type))
6786                   {
6787                     target = copy_rtx (target);
6788                     MEM_KEEP_ALIAS_SET_P (target) = 1;
6789                   }
6790                 store_constructor_field (target, bitsize, bitpos, 0,
6791                                          bitregion_end, mode, value,
6792                                          cleared, get_alias_set (elttype),
6793                                          reverse);
6794               }
6795           }
6796         break;
6797       }
6798
6799     case VECTOR_TYPE:
6800       {
6801         unsigned HOST_WIDE_INT idx;
6802         constructor_elt *ce;
6803         int i;
6804         int need_to_clear;
6805         insn_code icode = CODE_FOR_nothing;
6806         tree elt;
6807         tree elttype = TREE_TYPE (type);
6808         int elt_size = tree_to_uhwi (TYPE_SIZE (elttype));
6809         machine_mode eltmode = TYPE_MODE (elttype);
6810         HOST_WIDE_INT bitsize;
6811         HOST_WIDE_INT bitpos;
6812         rtvec vector = NULL;
6813         poly_uint64 n_elts;
6814         unsigned HOST_WIDE_INT const_n_elts;
6815         alias_set_type alias;
6816         bool vec_vec_init_p = false;
6817         machine_mode mode = GET_MODE (target);
6818
6819         gcc_assert (eltmode != BLKmode);
6820
6821         /* Try using vec_duplicate_optab for uniform vectors.  */
6822         if (!TREE_SIDE_EFFECTS (exp)
6823             && VECTOR_MODE_P (mode)
6824             && eltmode == GET_MODE_INNER (mode)
6825             && ((icode = optab_handler (vec_duplicate_optab, mode))
6826                 != CODE_FOR_nothing)
6827             && (elt = uniform_vector_p (exp)))
6828           {
6829             class expand_operand ops[2];
6830             create_output_operand (&ops[0], target, mode);
6831             create_input_operand (&ops[1], expand_normal (elt), eltmode);
6832             expand_insn (icode, 2, ops);
6833             if (!rtx_equal_p (target, ops[0].value))
6834               emit_move_insn (target, ops[0].value);
6835             break;
6836           }
6837
6838         n_elts = TYPE_VECTOR_SUBPARTS (type);
6839         if (REG_P (target)
6840             && VECTOR_MODE_P (mode)
6841             && n_elts.is_constant (&const_n_elts))
6842           {
6843             machine_mode emode = eltmode;
6844             bool vector_typed_elts_p = false;
6845
6846             if (CONSTRUCTOR_NELTS (exp)
6847                 && (TREE_CODE (TREE_TYPE (CONSTRUCTOR_ELT (exp, 0)->value))
6848                     == VECTOR_TYPE))
6849               {
6850                 tree etype = TREE_TYPE (CONSTRUCTOR_ELT (exp, 0)->value);
6851                 gcc_assert (known_eq (CONSTRUCTOR_NELTS (exp)
6852                                       * TYPE_VECTOR_SUBPARTS (etype),
6853                                       n_elts));
6854                 emode = TYPE_MODE (etype);
6855                 vector_typed_elts_p = true;
6856               }
6857             icode = convert_optab_handler (vec_init_optab, mode, emode);
6858             if (icode != CODE_FOR_nothing)
6859               {
6860                 unsigned int n = const_n_elts;
6861
6862                 if (vector_typed_elts_p)
6863                   {
6864                     n = CONSTRUCTOR_NELTS (exp);
6865                     vec_vec_init_p = true;
6866                   }
6867                 vector = rtvec_alloc (n);
6868                 for (unsigned int k = 0; k < n; k++)
6869                   RTVEC_ELT (vector, k) = CONST0_RTX (emode);
6870               }
6871           }
6872
6873         /* If the constructor has fewer elements than the vector,
6874            clear the whole array first.  Similarly if this is static
6875            constructor of a non-BLKmode object.  */
6876         if (cleared)
6877           need_to_clear = 0;
6878         else if (REG_P (target) && TREE_STATIC (exp))
6879           need_to_clear = 1;
6880         else
6881           {
6882             unsigned HOST_WIDE_INT count = 0, zero_count = 0;
6883             tree value;
6884
6885             FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
6886               {
6887                 tree sz = TYPE_SIZE (TREE_TYPE (value));
6888                 int n_elts_here
6889                   = tree_to_uhwi (int_const_binop (TRUNC_DIV_EXPR, sz,
6890                                                    TYPE_SIZE (elttype)));
6891
6892                 count += n_elts_here;
6893                 if (mostly_zeros_p (value))
6894                   zero_count += n_elts_here;
6895               }
6896
6897             /* Clear the entire vector first if there are any missing elements,
6898                or if the incidence of zero elements is >= 75%.  */
6899             need_to_clear = (maybe_lt (count, n_elts)
6900                              || 4 * zero_count >= 3 * count);
6901           }
6902
6903         if (need_to_clear && maybe_gt (size, 0) && !vector)
6904           {
6905             if (REG_P (target))
6906               emit_move_insn (target, CONST0_RTX (mode));
6907             else
6908               clear_storage (target, gen_int_mode (size, Pmode),
6909                              BLOCK_OP_NORMAL);
6910             cleared = 1;
6911           }
6912
6913         /* Inform later passes that the old value is dead.  */
6914         if (!cleared && !vector && REG_P (target))
6915           emit_move_insn (target, CONST0_RTX (mode));
6916
6917         if (MEM_P (target))
6918           alias = MEM_ALIAS_SET (target);
6919         else
6920           alias = get_alias_set (elttype);
6921
6922         /* Store each element of the constructor into the corresponding
6923            element of TARGET, determined by counting the elements.  */
6924         for (idx = 0, i = 0;
6925              vec_safe_iterate (CONSTRUCTOR_ELTS (exp), idx, &ce);
6926              idx++, i += bitsize / elt_size)
6927           {
6928             HOST_WIDE_INT eltpos;
6929             tree value = ce->value;
6930
6931             bitsize = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (value)));
6932             if (cleared && initializer_zerop (value))
6933               continue;
6934
6935             if (ce->index)
6936               eltpos = tree_to_uhwi (ce->index);
6937             else
6938               eltpos = i;
6939
6940             if (vector)
6941               {
6942                 if (vec_vec_init_p)
6943                   {
6944                     gcc_assert (ce->index == NULL_TREE);
6945                     gcc_assert (TREE_CODE (TREE_TYPE (value)) == VECTOR_TYPE);
6946                     eltpos = idx;
6947                   }
6948                 else
6949                   gcc_assert (TREE_CODE (TREE_TYPE (value)) != VECTOR_TYPE);
6950                 RTVEC_ELT (vector, eltpos) = expand_normal (value);
6951               }
6952             else
6953               {
6954                 machine_mode value_mode
6955                   = (TREE_CODE (TREE_TYPE (value)) == VECTOR_TYPE
6956                      ? TYPE_MODE (TREE_TYPE (value)) : eltmode);
6957                 bitpos = eltpos * elt_size;
6958                 store_constructor_field (target, bitsize, bitpos, 0,
6959                                          bitregion_end, value_mode,
6960                                          value, cleared, alias, reverse);
6961               }
6962           }
6963
6964         if (vector)
6965           emit_insn (GEN_FCN (icode) (target,
6966                                       gen_rtx_PARALLEL (mode, vector)));
6967         break;
6968       }
6969
6970     default:
6971       gcc_unreachable ();
6972     }
6973 }
6974
6975 /* Store the value of EXP (an expression tree)
6976    into a subfield of TARGET which has mode MODE and occupies
6977    BITSIZE bits, starting BITPOS bits from the start of TARGET.
6978    If MODE is VOIDmode, it means that we are storing into a bit-field.
6979
6980    BITREGION_START is bitpos of the first bitfield in this region.
6981    BITREGION_END is the bitpos of the ending bitfield in this region.
6982    These two fields are 0, if the C++ memory model does not apply,
6983    or we are not interested in keeping track of bitfield regions.
6984
6985    Always return const0_rtx unless we have something particular to
6986    return.
6987
6988    ALIAS_SET is the alias set for the destination.  This value will
6989    (in general) be different from that for TARGET, since TARGET is a
6990    reference to the containing structure.
6991
6992    If NONTEMPORAL is true, try generating a nontemporal store.
6993
6994    If REVERSE is true, the store is to be done in reverse order.  */
6995
6996 static rtx
6997 store_field (rtx target, poly_int64 bitsize, poly_int64 bitpos,
6998              poly_uint64 bitregion_start, poly_uint64 bitregion_end,
6999              machine_mode mode, tree exp,
7000              alias_set_type alias_set, bool nontemporal,  bool reverse)
7001 {
7002   if (TREE_CODE (exp) == ERROR_MARK)
7003     return const0_rtx;
7004
7005   /* If we have nothing to store, do nothing unless the expression has
7006      side-effects.  Don't do that for zero sized addressable lhs of
7007      calls.  */
7008   if (known_eq (bitsize, 0)
7009       && (!TREE_ADDRESSABLE (TREE_TYPE (exp))
7010           || TREE_CODE (exp) != CALL_EXPR))
7011     return expand_expr (exp, const0_rtx, VOIDmode, EXPAND_NORMAL);
7012
7013   if (GET_CODE (target) == CONCAT)
7014     {
7015       /* We're storing into a struct containing a single __complex.  */
7016
7017       gcc_assert (known_eq (bitpos, 0));
7018       return store_expr (exp, target, 0, nontemporal, reverse);
7019     }
7020
7021   /* If the structure is in a register or if the component
7022      is a bit field, we cannot use addressing to access it.
7023      Use bit-field techniques or SUBREG to store in it.  */
7024
7025   poly_int64 decl_bitsize;
7026   if (mode == VOIDmode
7027       || (mode != BLKmode && ! direct_store[(int) mode]
7028           && GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
7029           && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT)
7030       || REG_P (target)
7031       || GET_CODE (target) == SUBREG
7032       /* If the field isn't aligned enough to store as an ordinary memref,
7033          store it as a bit field.  */
7034       || (mode != BLKmode
7035           && ((((MEM_ALIGN (target) < GET_MODE_ALIGNMENT (mode))
7036                 || !multiple_p (bitpos, GET_MODE_ALIGNMENT (mode)))
7037                && targetm.slow_unaligned_access (mode, MEM_ALIGN (target)))
7038               || !multiple_p (bitpos, BITS_PER_UNIT)))
7039       || (known_size_p (bitsize)
7040           && mode != BLKmode
7041           && maybe_gt (GET_MODE_BITSIZE (mode), bitsize))
7042       /* If the RHS and field are a constant size and the size of the
7043          RHS isn't the same size as the bitfield, we must use bitfield
7044          operations.  */
7045       || (known_size_p (bitsize)
7046           && poly_int_tree_p (TYPE_SIZE (TREE_TYPE (exp)))
7047           && maybe_ne (wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (exp))),
7048                        bitsize)
7049           /* Except for initialization of full bytes from a CONSTRUCTOR, which
7050              we will handle specially below.  */
7051           && !(TREE_CODE (exp) == CONSTRUCTOR
7052                && multiple_p (bitsize, BITS_PER_UNIT))
7053           /* And except for bitwise copying of TREE_ADDRESSABLE types,
7054              where the FIELD_DECL has the right bitsize, but TREE_TYPE (exp)
7055              includes some extra padding.  store_expr / expand_expr will in
7056              that case call get_inner_reference that will have the bitsize
7057              we check here and thus the block move will not clobber the
7058              padding that shouldn't be clobbered.  In the future we could
7059              replace the TREE_ADDRESSABLE check with a check that
7060              get_base_address needs to live in memory.  */
7061           && (!TREE_ADDRESSABLE (TREE_TYPE (exp))
7062               || TREE_CODE (exp) != COMPONENT_REF
7063               || !multiple_p (bitsize, BITS_PER_UNIT)
7064               || !multiple_p (bitpos, BITS_PER_UNIT)
7065               || !poly_int_tree_p (DECL_SIZE (TREE_OPERAND (exp, 1)),
7066                                    &decl_bitsize)
7067               || maybe_ne (decl_bitsize, bitsize)))
7068       /* If we are expanding a MEM_REF of a non-BLKmode non-addressable
7069          decl we must use bitfield operations.  */
7070       || (known_size_p (bitsize)
7071           && TREE_CODE (exp) == MEM_REF
7072           && TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR
7073           && DECL_P (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
7074           && !TREE_ADDRESSABLE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
7075           && DECL_MODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) != BLKmode))
7076     {
7077       rtx temp;
7078       gimple *nop_def;
7079
7080       /* If EXP is a NOP_EXPR of precision less than its mode, then that
7081          implies a mask operation.  If the precision is the same size as
7082          the field we're storing into, that mask is redundant.  This is
7083          particularly common with bit field assignments generated by the
7084          C front end.  */
7085       nop_def = get_def_for_expr (exp, NOP_EXPR);
7086       if (nop_def)
7087         {
7088           tree type = TREE_TYPE (exp);
7089           if (INTEGRAL_TYPE_P (type)
7090               && maybe_ne (TYPE_PRECISION (type),
7091                            GET_MODE_BITSIZE (TYPE_MODE (type)))
7092               && known_eq (bitsize, TYPE_PRECISION (type)))
7093             {
7094               tree op = gimple_assign_rhs1 (nop_def);
7095               type = TREE_TYPE (op);
7096               if (INTEGRAL_TYPE_P (type)
7097                   && known_ge (TYPE_PRECISION (type), bitsize))
7098                 exp = op;
7099             }
7100         }
7101
7102       temp = expand_normal (exp);
7103
7104       /* We don't support variable-sized BLKmode bitfields, since our
7105          handling of BLKmode is bound up with the ability to break
7106          things into words.  */
7107       gcc_assert (mode != BLKmode || bitsize.is_constant ());
7108
7109       /* Handle calls that return values in multiple non-contiguous locations.
7110          The Irix 6 ABI has examples of this.  */
7111       if (GET_CODE (temp) == PARALLEL)
7112         {
7113           HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp));
7114           machine_mode temp_mode = GET_MODE (temp);
7115           if (temp_mode == BLKmode || temp_mode == VOIDmode)
7116             temp_mode = smallest_int_mode_for_size (size * BITS_PER_UNIT);
7117           rtx temp_target = gen_reg_rtx (temp_mode);
7118           emit_group_store (temp_target, temp, TREE_TYPE (exp), size);
7119           temp = temp_target;
7120         }
7121
7122       /* Handle calls that return BLKmode values in registers.  */
7123       else if (mode == BLKmode && REG_P (temp) && TREE_CODE (exp) == CALL_EXPR)
7124         {
7125           rtx temp_target = gen_reg_rtx (GET_MODE (temp));
7126           copy_blkmode_from_reg (temp_target, temp, TREE_TYPE (exp));
7127           temp = temp_target;
7128         }
7129
7130       /* If the value has aggregate type and an integral mode then, if BITSIZE
7131          is narrower than this mode and this is for big-endian data, we first
7132          need to put the value into the low-order bits for store_bit_field,
7133          except when MODE is BLKmode and BITSIZE larger than the word size
7134          (see the handling of fields larger than a word in store_bit_field).
7135          Moreover, the field may be not aligned on a byte boundary; in this
7136          case, if it has reverse storage order, it needs to be accessed as a
7137          scalar field with reverse storage order and we must first put the
7138          value into target order.  */
7139       scalar_int_mode temp_mode;
7140       if (AGGREGATE_TYPE_P (TREE_TYPE (exp))
7141           && is_int_mode (GET_MODE (temp), &temp_mode))
7142         {
7143           HOST_WIDE_INT size = GET_MODE_BITSIZE (temp_mode);
7144
7145           reverse = TYPE_REVERSE_STORAGE_ORDER (TREE_TYPE (exp));
7146
7147           if (reverse)
7148             temp = flip_storage_order (temp_mode, temp);
7149
7150           gcc_checking_assert (known_le (bitsize, size));
7151           if (maybe_lt (bitsize, size)
7152               && reverse ? !BYTES_BIG_ENDIAN : BYTES_BIG_ENDIAN
7153               /* Use of to_constant for BLKmode was checked above.  */
7154               && !(mode == BLKmode && bitsize.to_constant () > BITS_PER_WORD))
7155             temp = expand_shift (RSHIFT_EXPR, temp_mode, temp,
7156                                  size - bitsize, NULL_RTX, 1);
7157         }
7158
7159       /* Unless MODE is VOIDmode or BLKmode, convert TEMP to MODE.  */
7160       if (mode != VOIDmode && mode != BLKmode
7161           && mode != TYPE_MODE (TREE_TYPE (exp)))
7162         temp = convert_modes (mode, TYPE_MODE (TREE_TYPE (exp)), temp, 1);
7163
7164       /* If the mode of TEMP and TARGET is BLKmode, both must be in memory
7165          and BITPOS must be aligned on a byte boundary.  If so, we simply do
7166          a block copy.  Likewise for a BLKmode-like TARGET.  */
7167       if (GET_MODE (temp) == BLKmode
7168           && (GET_MODE (target) == BLKmode
7169               || (MEM_P (target)
7170                   && GET_MODE_CLASS (GET_MODE (target)) == MODE_INT
7171                   && multiple_p (bitpos, BITS_PER_UNIT)
7172                   && multiple_p (bitsize, BITS_PER_UNIT))))
7173         {
7174           gcc_assert (MEM_P (target) && MEM_P (temp));
7175           poly_int64 bytepos = exact_div (bitpos, BITS_PER_UNIT);
7176           poly_int64 bytesize = bits_to_bytes_round_up (bitsize);
7177
7178           target = adjust_address (target, VOIDmode, bytepos);
7179           emit_block_move (target, temp,
7180                            gen_int_mode (bytesize, Pmode),
7181                            BLOCK_OP_NORMAL);
7182
7183           return const0_rtx;
7184         }
7185
7186       /* If the mode of TEMP is still BLKmode and BITSIZE not larger than the
7187          word size, we need to load the value (see again store_bit_field).  */
7188       if (GET_MODE (temp) == BLKmode && known_le (bitsize, BITS_PER_WORD))
7189         {
7190           temp_mode = smallest_int_mode_for_size (bitsize);
7191           temp = extract_bit_field (temp, bitsize, 0, 1, NULL_RTX, temp_mode,
7192                                     temp_mode, false, NULL);
7193         }
7194
7195       /* Store the value in the bitfield.  */
7196       gcc_checking_assert (known_ge (bitpos, 0));
7197       store_bit_field (target, bitsize, bitpos,
7198                        bitregion_start, bitregion_end,
7199                        mode, temp, reverse);
7200
7201       return const0_rtx;
7202     }
7203   else
7204     {
7205       /* Now build a reference to just the desired component.  */
7206       rtx to_rtx = adjust_address (target, mode,
7207                                    exact_div (bitpos, BITS_PER_UNIT));
7208
7209       if (to_rtx == target)
7210         to_rtx = copy_rtx (to_rtx);
7211
7212       if (!MEM_KEEP_ALIAS_SET_P (to_rtx) && MEM_ALIAS_SET (to_rtx) != 0)
7213         set_mem_alias_set (to_rtx, alias_set);
7214
7215       /* Above we avoided using bitfield operations for storing a CONSTRUCTOR
7216          into a target smaller than its type; handle that case now.  */
7217       if (TREE_CODE (exp) == CONSTRUCTOR && known_size_p (bitsize))
7218         {
7219           poly_int64 bytesize = exact_div (bitsize, BITS_PER_UNIT);
7220           store_constructor (exp, to_rtx, 0, bytesize, reverse);
7221           return to_rtx;
7222         }
7223
7224       return store_expr (exp, to_rtx, 0, nontemporal, reverse);
7225     }
7226 }
7227 \f
7228 /* Given an expression EXP that may be a COMPONENT_REF, a BIT_FIELD_REF,
7229    an ARRAY_REF, or an ARRAY_RANGE_REF, look for nested operations of these
7230    codes and find the ultimate containing object, which we return.
7231
7232    We set *PBITSIZE to the size in bits that we want, *PBITPOS to the
7233    bit position, *PUNSIGNEDP to the signedness and *PREVERSEP to the
7234    storage order of the field.
7235    If the position of the field is variable, we store a tree
7236    giving the variable offset (in units) in *POFFSET.
7237    This offset is in addition to the bit position.
7238    If the position is not variable, we store 0 in *POFFSET.
7239
7240    If any of the extraction expressions is volatile,
7241    we store 1 in *PVOLATILEP.  Otherwise we don't change that.
7242
7243    If the field is a non-BLKmode bit-field, *PMODE is set to VOIDmode.
7244    Otherwise, it is a mode that can be used to access the field.
7245
7246    If the field describes a variable-sized object, *PMODE is set to
7247    BLKmode and *PBITSIZE is set to -1.  An access cannot be made in
7248    this case, but the address of the object can be found.  */
7249
7250 tree
7251 get_inner_reference (tree exp, poly_int64_pod *pbitsize,
7252                      poly_int64_pod *pbitpos, tree *poffset,
7253                      machine_mode *pmode, int *punsignedp,
7254                      int *preversep, int *pvolatilep)
7255 {
7256   tree size_tree = 0;
7257   machine_mode mode = VOIDmode;
7258   bool blkmode_bitfield = false;
7259   tree offset = size_zero_node;
7260   poly_offset_int bit_offset = 0;
7261
7262   /* First get the mode, signedness, storage order and size.  We do this from
7263      just the outermost expression.  */
7264   *pbitsize = -1;
7265   if (TREE_CODE (exp) == COMPONENT_REF)
7266     {
7267       tree field = TREE_OPERAND (exp, 1);
7268       size_tree = DECL_SIZE (field);
7269       if (flag_strict_volatile_bitfields > 0
7270           && TREE_THIS_VOLATILE (exp)
7271           && DECL_BIT_FIELD_TYPE (field)
7272           && DECL_MODE (field) != BLKmode)
7273         /* Volatile bitfields should be accessed in the mode of the
7274              field's type, not the mode computed based on the bit
7275              size.  */
7276         mode = TYPE_MODE (DECL_BIT_FIELD_TYPE (field));
7277       else if (!DECL_BIT_FIELD (field))
7278         {
7279           mode = DECL_MODE (field);
7280           /* For vector fields re-check the target flags, as DECL_MODE
7281              could have been set with different target flags than
7282              the current function has.  */
7283           if (mode == BLKmode
7284               && VECTOR_TYPE_P (TREE_TYPE (field))
7285               && VECTOR_MODE_P (TYPE_MODE_RAW (TREE_TYPE (field))))
7286             mode = TYPE_MODE (TREE_TYPE (field));
7287         }
7288       else if (DECL_MODE (field) == BLKmode)
7289         blkmode_bitfield = true;
7290
7291       *punsignedp = DECL_UNSIGNED (field);
7292     }
7293   else if (TREE_CODE (exp) == BIT_FIELD_REF)
7294     {
7295       size_tree = TREE_OPERAND (exp, 1);
7296       *punsignedp = (! INTEGRAL_TYPE_P (TREE_TYPE (exp))
7297                      || TYPE_UNSIGNED (TREE_TYPE (exp)));
7298
7299       /* For vector element types with the correct size of access or for
7300          vector typed accesses use the mode of the access type.  */
7301       if ((TREE_CODE (TREE_TYPE (TREE_OPERAND (exp, 0))) == VECTOR_TYPE
7302            && TREE_TYPE (exp) == TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0)))
7303            && tree_int_cst_equal (size_tree, TYPE_SIZE (TREE_TYPE (exp))))
7304           || VECTOR_TYPE_P (TREE_TYPE (exp)))
7305         mode = TYPE_MODE (TREE_TYPE (exp));
7306     }
7307   else
7308     {
7309       mode = TYPE_MODE (TREE_TYPE (exp));
7310       *punsignedp = TYPE_UNSIGNED (TREE_TYPE (exp));
7311
7312       if (mode == BLKmode)
7313         size_tree = TYPE_SIZE (TREE_TYPE (exp));
7314       else
7315         *pbitsize = GET_MODE_BITSIZE (mode);
7316     }
7317
7318   if (size_tree != 0)
7319     {
7320       if (! tree_fits_uhwi_p (size_tree))
7321         mode = BLKmode, *pbitsize = -1;
7322       else
7323         *pbitsize = tree_to_uhwi (size_tree);
7324     }
7325
7326   *preversep = reverse_storage_order_for_component_p (exp);
7327
7328   /* Compute cumulative bit-offset for nested component-refs and array-refs,
7329      and find the ultimate containing object.  */
7330   while (1)
7331     {
7332       switch (TREE_CODE (exp))
7333         {
7334         case BIT_FIELD_REF:
7335           bit_offset += wi::to_poly_offset (TREE_OPERAND (exp, 2));
7336           break;
7337
7338         case COMPONENT_REF:
7339           {
7340             tree field = TREE_OPERAND (exp, 1);
7341             tree this_offset = component_ref_field_offset (exp);
7342
7343             /* If this field hasn't been filled in yet, don't go past it.
7344                This should only happen when folding expressions made during
7345                type construction.  */
7346             if (this_offset == 0)
7347               break;
7348
7349             offset = size_binop (PLUS_EXPR, offset, this_offset);
7350             bit_offset += wi::to_poly_offset (DECL_FIELD_BIT_OFFSET (field));
7351
7352             /* ??? Right now we don't do anything with DECL_OFFSET_ALIGN.  */
7353           }
7354           break;
7355
7356         case ARRAY_REF:
7357         case ARRAY_RANGE_REF:
7358           {
7359             tree index = TREE_OPERAND (exp, 1);
7360             tree low_bound = array_ref_low_bound (exp);
7361             tree unit_size = array_ref_element_size (exp);
7362
7363             /* We assume all arrays have sizes that are a multiple of a byte.
7364                First subtract the lower bound, if any, in the type of the
7365                index, then convert to sizetype and multiply by the size of
7366                the array element.  */
7367             if (! integer_zerop (low_bound))
7368               index = fold_build2 (MINUS_EXPR, TREE_TYPE (index),
7369                                    index, low_bound);
7370
7371             offset = size_binop (PLUS_EXPR, offset,
7372                                  size_binop (MULT_EXPR,
7373                                              fold_convert (sizetype, index),
7374                                              unit_size));
7375           }
7376           break;
7377
7378         case REALPART_EXPR:
7379           break;
7380
7381         case IMAGPART_EXPR:
7382           bit_offset += *pbitsize;
7383           break;
7384
7385         case VIEW_CONVERT_EXPR:
7386           break;
7387
7388         case MEM_REF:
7389           /* Hand back the decl for MEM[&decl, off].  */
7390           if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR)
7391             {
7392               tree off = TREE_OPERAND (exp, 1);
7393               if (!integer_zerop (off))
7394                 {
7395                   poly_offset_int boff = mem_ref_offset (exp);
7396                   boff <<= LOG2_BITS_PER_UNIT;
7397                   bit_offset += boff;
7398                 }
7399               exp = TREE_OPERAND (TREE_OPERAND (exp, 0), 0);
7400             }
7401           goto done;
7402
7403         default:
7404           goto done;
7405         }
7406
7407       /* If any reference in the chain is volatile, the effect is volatile.  */
7408       if (TREE_THIS_VOLATILE (exp))
7409         *pvolatilep = 1;
7410
7411       exp = TREE_OPERAND (exp, 0);
7412     }
7413  done:
7414
7415   /* If OFFSET is constant, see if we can return the whole thing as a
7416      constant bit position.  Make sure to handle overflow during
7417      this conversion.  */
7418   if (poly_int_tree_p (offset))
7419     {
7420       poly_offset_int tem = wi::sext (wi::to_poly_offset (offset),
7421                                       TYPE_PRECISION (sizetype));
7422       tem <<= LOG2_BITS_PER_UNIT;
7423       tem += bit_offset;
7424       if (tem.to_shwi (pbitpos))
7425         *poffset = offset = NULL_TREE;
7426     }
7427
7428   /* Otherwise, split it up.  */
7429   if (offset)
7430     {
7431       /* Avoid returning a negative bitpos as this may wreak havoc later.  */
7432       if (!bit_offset.to_shwi (pbitpos) || maybe_lt (*pbitpos, 0))
7433         {
7434           *pbitpos = num_trailing_bits (bit_offset.force_shwi ());
7435           poly_offset_int bytes = bits_to_bytes_round_down (bit_offset);
7436           offset = size_binop (PLUS_EXPR, offset,
7437                                build_int_cst (sizetype, bytes.force_shwi ()));
7438         }
7439
7440       *poffset = offset;
7441     }
7442
7443   /* We can use BLKmode for a byte-aligned BLKmode bitfield.  */
7444   if (mode == VOIDmode
7445       && blkmode_bitfield
7446       && multiple_p (*pbitpos, BITS_PER_UNIT)
7447       && multiple_p (*pbitsize, BITS_PER_UNIT))
7448     *pmode = BLKmode;
7449   else
7450     *pmode = mode;
7451
7452   return exp;
7453 }
7454
7455 /* Alignment in bits the TARGET of an assignment may be assumed to have.  */
7456
7457 static unsigned HOST_WIDE_INT
7458 target_align (const_tree target)
7459 {
7460   /* We might have a chain of nested references with intermediate misaligning
7461      bitfields components, so need to recurse to find out.  */
7462
7463   unsigned HOST_WIDE_INT this_align, outer_align;
7464
7465   switch (TREE_CODE (target))
7466     {
7467     case BIT_FIELD_REF:
7468       return 1;
7469
7470     case COMPONENT_REF:
7471       this_align = DECL_ALIGN (TREE_OPERAND (target, 1));
7472       outer_align = target_align (TREE_OPERAND (target, 0));
7473       return MIN (this_align, outer_align);
7474
7475     case ARRAY_REF:
7476     case ARRAY_RANGE_REF:
7477       this_align = TYPE_ALIGN (TREE_TYPE (target));
7478       outer_align = target_align (TREE_OPERAND (target, 0));
7479       return MIN (this_align, outer_align);
7480
7481     CASE_CONVERT:
7482     case NON_LVALUE_EXPR:
7483     case VIEW_CONVERT_EXPR:
7484       this_align = TYPE_ALIGN (TREE_TYPE (target));
7485       outer_align = target_align (TREE_OPERAND (target, 0));
7486       return MAX (this_align, outer_align);
7487
7488     default:
7489       return TYPE_ALIGN (TREE_TYPE (target));
7490     }
7491 }
7492
7493 \f
7494 /* Given an rtx VALUE that may contain additions and multiplications, return
7495    an equivalent value that just refers to a register, memory, or constant.
7496    This is done by generating instructions to perform the arithmetic and
7497    returning a pseudo-register containing the value.
7498
7499    The returned value may be a REG, SUBREG, MEM or constant.  */
7500
7501 rtx
7502 force_operand (rtx value, rtx target)
7503 {
7504   rtx op1, op2;
7505   /* Use subtarget as the target for operand 0 of a binary operation.  */
7506   rtx subtarget = get_subtarget (target);
7507   enum rtx_code code = GET_CODE (value);
7508
7509   /* Check for subreg applied to an expression produced by loop optimizer.  */
7510   if (code == SUBREG
7511       && !REG_P (SUBREG_REG (value))
7512       && !MEM_P (SUBREG_REG (value)))
7513     {
7514       value
7515         = simplify_gen_subreg (GET_MODE (value),
7516                                force_reg (GET_MODE (SUBREG_REG (value)),
7517                                           force_operand (SUBREG_REG (value),
7518                                                          NULL_RTX)),
7519                                GET_MODE (SUBREG_REG (value)),
7520                                SUBREG_BYTE (value));
7521       code = GET_CODE (value);
7522     }
7523
7524   /* Check for a PIC address load.  */
7525   if ((code == PLUS || code == MINUS)
7526       && XEXP (value, 0) == pic_offset_table_rtx
7527       && (GET_CODE (XEXP (value, 1)) == SYMBOL_REF
7528           || GET_CODE (XEXP (value, 1)) == LABEL_REF
7529           || GET_CODE (XEXP (value, 1)) == CONST))
7530     {
7531       if (!subtarget)
7532         subtarget = gen_reg_rtx (GET_MODE (value));
7533       emit_move_insn (subtarget, value);
7534       return subtarget;
7535     }
7536
7537   if (ARITHMETIC_P (value))
7538     {
7539       op2 = XEXP (value, 1);
7540       if (!CONSTANT_P (op2) && !(REG_P (op2) && op2 != subtarget))
7541         subtarget = 0;
7542       if (code == MINUS && CONST_INT_P (op2))
7543         {
7544           code = PLUS;
7545           op2 = negate_rtx (GET_MODE (value), op2);
7546         }
7547
7548       /* Check for an addition with OP2 a constant integer and our first
7549          operand a PLUS of a virtual register and something else.  In that
7550          case, we want to emit the sum of the virtual register and the
7551          constant first and then add the other value.  This allows virtual
7552          register instantiation to simply modify the constant rather than
7553          creating another one around this addition.  */
7554       if (code == PLUS && CONST_INT_P (op2)
7555           && GET_CODE (XEXP (value, 0)) == PLUS
7556           && REG_P (XEXP (XEXP (value, 0), 0))
7557           && REGNO (XEXP (XEXP (value, 0), 0)) >= FIRST_VIRTUAL_REGISTER
7558           && REGNO (XEXP (XEXP (value, 0), 0)) <= LAST_VIRTUAL_REGISTER)
7559         {
7560           rtx temp = expand_simple_binop (GET_MODE (value), code,
7561                                           XEXP (XEXP (value, 0), 0), op2,
7562                                           subtarget, 0, OPTAB_LIB_WIDEN);
7563           return expand_simple_binop (GET_MODE (value), code, temp,
7564                                       force_operand (XEXP (XEXP (value,
7565                                                                  0), 1), 0),
7566                                       target, 0, OPTAB_LIB_WIDEN);
7567         }
7568
7569       op1 = force_operand (XEXP (value, 0), subtarget);
7570       op2 = force_operand (op2, NULL_RTX);
7571       switch (code)
7572         {
7573         case MULT:
7574           return expand_mult (GET_MODE (value), op1, op2, target, 1);
7575         case DIV:
7576           if (!INTEGRAL_MODE_P (GET_MODE (value)))
7577             return expand_simple_binop (GET_MODE (value), code, op1, op2,
7578                                         target, 1, OPTAB_LIB_WIDEN);
7579           else
7580             return expand_divmod (0,
7581                                   FLOAT_MODE_P (GET_MODE (value))
7582                                   ? RDIV_EXPR : TRUNC_DIV_EXPR,
7583                                   GET_MODE (value), op1, op2, target, 0);
7584         case MOD:
7585           return expand_divmod (1, TRUNC_MOD_EXPR, GET_MODE (value), op1, op2,
7586                                 target, 0);
7587         case UDIV:
7588           return expand_divmod (0, TRUNC_DIV_EXPR, GET_MODE (value), op1, op2,
7589                                 target, 1);
7590         case UMOD:
7591           return expand_divmod (1, TRUNC_MOD_EXPR, GET_MODE (value), op1, op2,
7592                                 target, 1);
7593         case ASHIFTRT:
7594           return expand_simple_binop (GET_MODE (value), code, op1, op2,
7595                                       target, 0, OPTAB_LIB_WIDEN);
7596         default:
7597           return expand_simple_binop (GET_MODE (value), code, op1, op2,
7598                                       target, 1, OPTAB_LIB_WIDEN);
7599         }
7600     }
7601   if (UNARY_P (value))
7602     {
7603       if (!target)
7604         target = gen_reg_rtx (GET_MODE (value));
7605       op1 = force_operand (XEXP (value, 0), NULL_RTX);
7606       switch (code)
7607         {
7608         case ZERO_EXTEND:
7609         case SIGN_EXTEND:
7610         case TRUNCATE:
7611         case FLOAT_EXTEND:
7612         case FLOAT_TRUNCATE:
7613           convert_move (target, op1, code == ZERO_EXTEND);
7614           return target;
7615
7616         case FIX:
7617         case UNSIGNED_FIX:
7618           expand_fix (target, op1, code == UNSIGNED_FIX);
7619           return target;
7620
7621         case FLOAT:
7622         case UNSIGNED_FLOAT:
7623           expand_float (target, op1, code == UNSIGNED_FLOAT);
7624           return target;
7625
7626         default:
7627           return expand_simple_unop (GET_MODE (value), code, op1, target, 0);
7628         }
7629     }
7630
7631 #ifdef INSN_SCHEDULING
7632   /* On machines that have insn scheduling, we want all memory reference to be
7633      explicit, so we need to deal with such paradoxical SUBREGs.  */
7634   if (paradoxical_subreg_p (value) && MEM_P (SUBREG_REG (value)))
7635     value
7636       = simplify_gen_subreg (GET_MODE (value),
7637                              force_reg (GET_MODE (SUBREG_REG (value)),
7638                                         force_operand (SUBREG_REG (value),
7639                                                        NULL_RTX)),
7640                              GET_MODE (SUBREG_REG (value)),
7641                              SUBREG_BYTE (value));
7642 #endif
7643
7644   return value;
7645 }
7646 \f
7647 /* Subroutine of expand_expr: return nonzero iff there is no way that
7648    EXP can reference X, which is being modified.  TOP_P is nonzero if this
7649    call is going to be used to determine whether we need a temporary
7650    for EXP, as opposed to a recursive call to this function.
7651
7652    It is always safe for this routine to return zero since it merely
7653    searches for optimization opportunities.  */
7654
7655 int
7656 safe_from_p (const_rtx x, tree exp, int top_p)
7657 {
7658   rtx exp_rtl = 0;
7659   int i, nops;
7660
7661   if (x == 0
7662       /* If EXP has varying size, we MUST use a target since we currently
7663          have no way of allocating temporaries of variable size
7664          (except for arrays that have TYPE_ARRAY_MAX_SIZE set).
7665          So we assume here that something at a higher level has prevented a
7666          clash.  This is somewhat bogus, but the best we can do.  Only
7667          do this when X is BLKmode and when we are at the top level.  */
7668       || (top_p && TREE_TYPE (exp) != 0 && COMPLETE_TYPE_P (TREE_TYPE (exp))
7669           && TREE_CODE (TYPE_SIZE (TREE_TYPE (exp))) != INTEGER_CST
7670           && (TREE_CODE (TREE_TYPE (exp)) != ARRAY_TYPE
7671               || TYPE_ARRAY_MAX_SIZE (TREE_TYPE (exp)) == NULL_TREE
7672               || TREE_CODE (TYPE_ARRAY_MAX_SIZE (TREE_TYPE (exp)))
7673               != INTEGER_CST)
7674           && GET_MODE (x) == BLKmode)
7675       /* If X is in the outgoing argument area, it is always safe.  */
7676       || (MEM_P (x)
7677           && (XEXP (x, 0) == virtual_outgoing_args_rtx
7678               || (GET_CODE (XEXP (x, 0)) == PLUS
7679                   && XEXP (XEXP (x, 0), 0) == virtual_outgoing_args_rtx))))
7680     return 1;
7681
7682   /* If this is a subreg of a hard register, declare it unsafe, otherwise,
7683      find the underlying pseudo.  */
7684   if (GET_CODE (x) == SUBREG)
7685     {
7686       x = SUBREG_REG (x);
7687       if (REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
7688         return 0;
7689     }
7690
7691   /* Now look at our tree code and possibly recurse.  */
7692   switch (TREE_CODE_CLASS (TREE_CODE (exp)))
7693     {
7694     case tcc_declaration:
7695       exp_rtl = DECL_RTL_IF_SET (exp);
7696       break;
7697
7698     case tcc_constant:
7699       return 1;
7700
7701     case tcc_exceptional:
7702       if (TREE_CODE (exp) == TREE_LIST)
7703         {
7704           while (1)
7705             {
7706               if (TREE_VALUE (exp) && !safe_from_p (x, TREE_VALUE (exp), 0))
7707                 return 0;
7708               exp = TREE_CHAIN (exp);
7709               if (!exp)
7710                 return 1;
7711               if (TREE_CODE (exp) != TREE_LIST)
7712                 return safe_from_p (x, exp, 0);
7713             }
7714         }
7715       else if (TREE_CODE (exp) == CONSTRUCTOR)
7716         {
7717           constructor_elt *ce;
7718           unsigned HOST_WIDE_INT idx;
7719
7720           FOR_EACH_VEC_SAFE_ELT (CONSTRUCTOR_ELTS (exp), idx, ce)
7721             if ((ce->index != NULL_TREE && !safe_from_p (x, ce->index, 0))
7722                 || !safe_from_p (x, ce->value, 0))
7723               return 0;
7724           return 1;
7725         }
7726       else if (TREE_CODE (exp) == ERROR_MARK)
7727         return 1;       /* An already-visited SAVE_EXPR? */
7728       else
7729         return 0;
7730
7731     case tcc_statement:
7732       /* The only case we look at here is the DECL_INITIAL inside a
7733          DECL_EXPR.  */
7734       return (TREE_CODE (exp) != DECL_EXPR
7735               || TREE_CODE (DECL_EXPR_DECL (exp)) != VAR_DECL
7736               || !DECL_INITIAL (DECL_EXPR_DECL (exp))
7737               || safe_from_p (x, DECL_INITIAL (DECL_EXPR_DECL (exp)), 0));
7738
7739     case tcc_binary:
7740     case tcc_comparison:
7741       if (!safe_from_p (x, TREE_OPERAND (exp, 1), 0))
7742         return 0;
7743       /* Fall through.  */
7744
7745     case tcc_unary:
7746       return safe_from_p (x, TREE_OPERAND (exp, 0), 0);
7747
7748     case tcc_expression:
7749     case tcc_reference:
7750     case tcc_vl_exp:
7751       /* Now do code-specific tests.  EXP_RTL is set to any rtx we find in
7752          the expression.  If it is set, we conflict iff we are that rtx or
7753          both are in memory.  Otherwise, we check all operands of the
7754          expression recursively.  */
7755
7756       switch (TREE_CODE (exp))
7757         {
7758         case ADDR_EXPR:
7759           /* If the operand is static or we are static, we can't conflict.
7760              Likewise if we don't conflict with the operand at all.  */
7761           if (staticp (TREE_OPERAND (exp, 0))
7762               || TREE_STATIC (exp)
7763               || safe_from_p (x, TREE_OPERAND (exp, 0), 0))
7764             return 1;
7765
7766           /* Otherwise, the only way this can conflict is if we are taking
7767              the address of a DECL a that address if part of X, which is
7768              very rare.  */
7769           exp = TREE_OPERAND (exp, 0);
7770           if (DECL_P (exp))
7771             {
7772               if (!DECL_RTL_SET_P (exp)
7773                   || !MEM_P (DECL_RTL (exp)))
7774                 return 0;
7775               else
7776                 exp_rtl = XEXP (DECL_RTL (exp), 0);
7777             }
7778           break;
7779
7780         case MEM_REF:
7781           if (MEM_P (x)
7782               && alias_sets_conflict_p (MEM_ALIAS_SET (x),
7783                                         get_alias_set (exp)))
7784             return 0;
7785           break;
7786
7787         case CALL_EXPR:
7788           /* Assume that the call will clobber all hard registers and
7789              all of memory.  */
7790           if ((REG_P (x) && REGNO (x) < FIRST_PSEUDO_REGISTER)
7791               || MEM_P (x))
7792             return 0;
7793           break;
7794
7795         case WITH_CLEANUP_EXPR:
7796         case CLEANUP_POINT_EXPR:
7797           /* Lowered by gimplify.c.  */
7798           gcc_unreachable ();
7799
7800         case SAVE_EXPR:
7801           return safe_from_p (x, TREE_OPERAND (exp, 0), 0);
7802
7803         default:
7804           break;
7805         }
7806
7807       /* If we have an rtx, we do not need to scan our operands.  */
7808       if (exp_rtl)
7809         break;
7810
7811       nops = TREE_OPERAND_LENGTH (exp);
7812       for (i = 0; i < nops; i++)
7813         if (TREE_OPERAND (exp, i) != 0
7814             && ! safe_from_p (x, TREE_OPERAND (exp, i), 0))
7815           return 0;
7816
7817       break;
7818
7819     case tcc_type:
7820       /* Should never get a type here.  */
7821       gcc_unreachable ();
7822     }
7823
7824   /* If we have an rtl, find any enclosed object.  Then see if we conflict
7825      with it.  */
7826   if (exp_rtl)
7827     {
7828       if (GET_CODE (exp_rtl) == SUBREG)
7829         {
7830           exp_rtl = SUBREG_REG (exp_rtl);
7831           if (REG_P (exp_rtl)
7832               && REGNO (exp_rtl) < FIRST_PSEUDO_REGISTER)
7833             return 0;
7834         }
7835
7836       /* If the rtl is X, then it is not safe.  Otherwise, it is unless both
7837          are memory and they conflict.  */
7838       return ! (rtx_equal_p (x, exp_rtl)
7839                 || (MEM_P (x) && MEM_P (exp_rtl)
7840                     && true_dependence (exp_rtl, VOIDmode, x)));
7841     }
7842
7843   /* If we reach here, it is safe.  */
7844   return 1;
7845 }
7846
7847 \f
7848 /* Return the highest power of two that EXP is known to be a multiple of.
7849    This is used in updating alignment of MEMs in array references.  */
7850
7851 unsigned HOST_WIDE_INT
7852 highest_pow2_factor (const_tree exp)
7853 {
7854   unsigned HOST_WIDE_INT ret;
7855   int trailing_zeros = tree_ctz (exp);
7856   if (trailing_zeros >= HOST_BITS_PER_WIDE_INT)
7857     return BIGGEST_ALIGNMENT;
7858   ret = HOST_WIDE_INT_1U << trailing_zeros;
7859   if (ret > BIGGEST_ALIGNMENT)
7860     return BIGGEST_ALIGNMENT;
7861   return ret;
7862 }
7863
7864 /* Similar, except that the alignment requirements of TARGET are
7865    taken into account.  Assume it is at least as aligned as its
7866    type, unless it is a COMPONENT_REF in which case the layout of
7867    the structure gives the alignment.  */
7868
7869 static unsigned HOST_WIDE_INT
7870 highest_pow2_factor_for_target (const_tree target, const_tree exp)
7871 {
7872   unsigned HOST_WIDE_INT talign = target_align (target) / BITS_PER_UNIT;
7873   unsigned HOST_WIDE_INT factor = highest_pow2_factor (exp);
7874
7875   return MAX (factor, talign);
7876 }
7877 \f
7878 /* Convert the tree comparison code TCODE to the rtl one where the
7879    signedness is UNSIGNEDP.  */
7880
7881 static enum rtx_code
7882 convert_tree_comp_to_rtx (enum tree_code tcode, int unsignedp)
7883 {
7884   enum rtx_code code;
7885   switch (tcode)
7886     {
7887     case EQ_EXPR:
7888       code = EQ;
7889       break;
7890     case NE_EXPR:
7891       code = NE;
7892       break;
7893     case LT_EXPR:
7894       code = unsignedp ? LTU : LT;
7895       break;
7896     case LE_EXPR:
7897       code = unsignedp ? LEU : LE;
7898       break;
7899     case GT_EXPR:
7900       code = unsignedp ? GTU : GT;
7901       break;
7902     case GE_EXPR:
7903       code = unsignedp ? GEU : GE;
7904       break;
7905     case UNORDERED_EXPR:
7906       code = UNORDERED;
7907       break;
7908     case ORDERED_EXPR:
7909       code = ORDERED;
7910       break;
7911     case UNLT_EXPR:
7912       code = UNLT;
7913       break;
7914     case UNLE_EXPR:
7915       code = UNLE;
7916       break;
7917     case UNGT_EXPR:
7918       code = UNGT;
7919       break;
7920     case UNGE_EXPR:
7921       code = UNGE;
7922       break;
7923     case UNEQ_EXPR:
7924       code = UNEQ;
7925       break;
7926     case LTGT_EXPR:
7927       code = LTGT;
7928       break;
7929
7930     default:
7931       gcc_unreachable ();
7932     }
7933   return code;
7934 }
7935
7936 /* Subroutine of expand_expr.  Expand the two operands of a binary
7937    expression EXP0 and EXP1 placing the results in OP0 and OP1.
7938    The value may be stored in TARGET if TARGET is nonzero.  The
7939    MODIFIER argument is as documented by expand_expr.  */
7940
7941 void
7942 expand_operands (tree exp0, tree exp1, rtx target, rtx *op0, rtx *op1,
7943                  enum expand_modifier modifier)
7944 {
7945   if (! safe_from_p (target, exp1, 1))
7946     target = 0;
7947   if (operand_equal_p (exp0, exp1, 0))
7948     {
7949       *op0 = expand_expr (exp0, target, VOIDmode, modifier);
7950       *op1 = copy_rtx (*op0);
7951     }
7952   else
7953     {
7954       *op0 = expand_expr (exp0, target, VOIDmode, modifier);
7955       *op1 = expand_expr (exp1, NULL_RTX, VOIDmode, modifier);
7956     }
7957 }
7958
7959 \f
7960 /* Return a MEM that contains constant EXP.  DEFER is as for
7961    output_constant_def and MODIFIER is as for expand_expr.  */
7962
7963 static rtx
7964 expand_expr_constant (tree exp, int defer, enum expand_modifier modifier)
7965 {
7966   rtx mem;
7967
7968   mem = output_constant_def (exp, defer);
7969   if (modifier != EXPAND_INITIALIZER)
7970     mem = use_anchored_address (mem);
7971   return mem;
7972 }
7973
7974 /* A subroutine of expand_expr_addr_expr.  Evaluate the address of EXP.
7975    The TARGET, TMODE and MODIFIER arguments are as for expand_expr.  */
7976
7977 static rtx
7978 expand_expr_addr_expr_1 (tree exp, rtx target, scalar_int_mode tmode,
7979                          enum expand_modifier modifier, addr_space_t as)
7980 {
7981   rtx result, subtarget;
7982   tree inner, offset;
7983   poly_int64 bitsize, bitpos;
7984   int unsignedp, reversep, volatilep = 0;
7985   machine_mode mode1;
7986
7987   /* If we are taking the address of a constant and are at the top level,
7988      we have to use output_constant_def since we can't call force_const_mem
7989      at top level.  */
7990   /* ??? This should be considered a front-end bug.  We should not be
7991      generating ADDR_EXPR of something that isn't an LVALUE.  The only
7992      exception here is STRING_CST.  */
7993   if (CONSTANT_CLASS_P (exp))
7994     {
7995       result = XEXP (expand_expr_constant (exp, 0, modifier), 0);
7996       if (modifier < EXPAND_SUM)
7997         result = force_operand (result, target);
7998       return result;
7999     }
8000
8001   /* Everything must be something allowed by is_gimple_addressable.  */
8002   switch (TREE_CODE (exp))
8003     {
8004     case INDIRECT_REF:
8005       /* This case will happen via recursion for &a->b.  */
8006       return expand_expr (TREE_OPERAND (exp, 0), target, tmode, modifier);
8007
8008     case MEM_REF:
8009       {
8010         tree tem = TREE_OPERAND (exp, 0);
8011         if (!integer_zerop (TREE_OPERAND (exp, 1)))
8012           tem = fold_build_pointer_plus (tem, TREE_OPERAND (exp, 1));
8013         return expand_expr (tem, target, tmode, modifier);
8014       }
8015
8016     case TARGET_MEM_REF:
8017       return addr_for_mem_ref (exp, as, true);
8018
8019     case CONST_DECL:
8020       /* Expand the initializer like constants above.  */
8021       result = XEXP (expand_expr_constant (DECL_INITIAL (exp),
8022                                            0, modifier), 0);
8023       if (modifier < EXPAND_SUM)
8024         result = force_operand (result, target);
8025       return result;
8026
8027     case REALPART_EXPR:
8028       /* The real part of the complex number is always first, therefore
8029          the address is the same as the address of the parent object.  */
8030       offset = 0;
8031       bitpos = 0;
8032       inner = TREE_OPERAND (exp, 0);
8033       break;
8034
8035     case IMAGPART_EXPR:
8036       /* The imaginary part of the complex number is always second.
8037          The expression is therefore always offset by the size of the
8038          scalar type.  */
8039       offset = 0;
8040       bitpos = GET_MODE_BITSIZE (SCALAR_TYPE_MODE (TREE_TYPE (exp)));
8041       inner = TREE_OPERAND (exp, 0);
8042       break;
8043
8044     case COMPOUND_LITERAL_EXPR:
8045       /* Allow COMPOUND_LITERAL_EXPR in initializers or coming from
8046          initializers, if e.g. rtl_for_decl_init is called on DECL_INITIAL
8047          with COMPOUND_LITERAL_EXPRs in it, or ARRAY_REF on a const static
8048          array with address of COMPOUND_LITERAL_EXPR in DECL_INITIAL;
8049          the initializers aren't gimplified.  */
8050       if (COMPOUND_LITERAL_EXPR_DECL (exp)
8051           && TREE_STATIC (COMPOUND_LITERAL_EXPR_DECL (exp)))
8052         return expand_expr_addr_expr_1 (COMPOUND_LITERAL_EXPR_DECL (exp),
8053                                         target, tmode, modifier, as);
8054       /* FALLTHRU */
8055     default:
8056       /* If the object is a DECL, then expand it for its rtl.  Don't bypass
8057          expand_expr, as that can have various side effects; LABEL_DECLs for
8058          example, may not have their DECL_RTL set yet.  Expand the rtl of
8059          CONSTRUCTORs too, which should yield a memory reference for the
8060          constructor's contents.  Assume language specific tree nodes can
8061          be expanded in some interesting way.  */
8062       gcc_assert (TREE_CODE (exp) < LAST_AND_UNUSED_TREE_CODE);
8063       if (DECL_P (exp)
8064           || TREE_CODE (exp) == CONSTRUCTOR
8065           || TREE_CODE (exp) == COMPOUND_LITERAL_EXPR)
8066         {
8067           result = expand_expr (exp, target, tmode,
8068                                 modifier == EXPAND_INITIALIZER
8069                                 ? EXPAND_INITIALIZER : EXPAND_CONST_ADDRESS);
8070
8071           /* If the DECL isn't in memory, then the DECL wasn't properly
8072              marked TREE_ADDRESSABLE, which will be either a front-end
8073              or a tree optimizer bug.  */
8074
8075           gcc_assert (MEM_P (result));
8076           result = XEXP (result, 0);
8077
8078           /* ??? Is this needed anymore?  */
8079           if (DECL_P (exp))
8080             TREE_USED (exp) = 1;
8081
8082           if (modifier != EXPAND_INITIALIZER
8083               && modifier != EXPAND_CONST_ADDRESS
8084               && modifier != EXPAND_SUM)
8085             result = force_operand (result, target);
8086           return result;
8087         }
8088
8089       /* Pass FALSE as the last argument to get_inner_reference although
8090          we are expanding to RTL.  The rationale is that we know how to
8091          handle "aligning nodes" here: we can just bypass them because
8092          they won't change the final object whose address will be returned
8093          (they actually exist only for that purpose).  */
8094       inner = get_inner_reference (exp, &bitsize, &bitpos, &offset, &mode1,
8095                                    &unsignedp, &reversep, &volatilep);
8096       break;
8097     }
8098
8099   /* We must have made progress.  */
8100   gcc_assert (inner != exp);
8101
8102   subtarget = offset || maybe_ne (bitpos, 0) ? NULL_RTX : target;
8103   /* For VIEW_CONVERT_EXPR, where the outer alignment is bigger than
8104      inner alignment, force the inner to be sufficiently aligned.  */
8105   if (CONSTANT_CLASS_P (inner)
8106       && TYPE_ALIGN (TREE_TYPE (inner)) < TYPE_ALIGN (TREE_TYPE (exp)))
8107     {
8108       inner = copy_node (inner);
8109       TREE_TYPE (inner) = copy_node (TREE_TYPE (inner));
8110       SET_TYPE_ALIGN (TREE_TYPE (inner), TYPE_ALIGN (TREE_TYPE (exp)));
8111       TYPE_USER_ALIGN (TREE_TYPE (inner)) = 1;
8112     }
8113   result = expand_expr_addr_expr_1 (inner, subtarget, tmode, modifier, as);
8114
8115   if (offset)
8116     {
8117       rtx tmp;
8118
8119       if (modifier != EXPAND_NORMAL)
8120         result = force_operand (result, NULL);
8121       tmp = expand_expr (offset, NULL_RTX, tmode,
8122                          modifier == EXPAND_INITIALIZER
8123                           ? EXPAND_INITIALIZER : EXPAND_NORMAL);
8124
8125       /* expand_expr is allowed to return an object in a mode other
8126          than TMODE.  If it did, we need to convert.  */
8127       if (GET_MODE (tmp) != VOIDmode && tmode != GET_MODE (tmp))
8128         tmp = convert_modes (tmode, GET_MODE (tmp),
8129                              tmp, TYPE_UNSIGNED (TREE_TYPE (offset)));
8130       result = convert_memory_address_addr_space (tmode, result, as);
8131       tmp = convert_memory_address_addr_space (tmode, tmp, as);
8132
8133       if (modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
8134         result = simplify_gen_binary (PLUS, tmode, result, tmp);
8135       else
8136         {
8137           subtarget = maybe_ne (bitpos, 0) ? NULL_RTX : target;
8138           result = expand_simple_binop (tmode, PLUS, result, tmp, subtarget,
8139                                         1, OPTAB_LIB_WIDEN);
8140         }
8141     }
8142
8143   if (maybe_ne (bitpos, 0))
8144     {
8145       /* Someone beforehand should have rejected taking the address
8146          of an object that isn't byte-aligned.  */
8147       poly_int64 bytepos = exact_div (bitpos, BITS_PER_UNIT);
8148       result = convert_memory_address_addr_space (tmode, result, as);
8149       result = plus_constant (tmode, result, bytepos);
8150       if (modifier < EXPAND_SUM)
8151         result = force_operand (result, target);
8152     }
8153
8154   return result;
8155 }
8156
8157 /* A subroutine of expand_expr.  Evaluate EXP, which is an ADDR_EXPR.
8158    The TARGET, TMODE and MODIFIER arguments are as for expand_expr.  */
8159
8160 static rtx
8161 expand_expr_addr_expr (tree exp, rtx target, machine_mode tmode,
8162                        enum expand_modifier modifier)
8163 {
8164   addr_space_t as = ADDR_SPACE_GENERIC;
8165   scalar_int_mode address_mode = Pmode;
8166   scalar_int_mode pointer_mode = ptr_mode;
8167   machine_mode rmode;
8168   rtx result;
8169
8170   /* Target mode of VOIDmode says "whatever's natural".  */
8171   if (tmode == VOIDmode)
8172     tmode = TYPE_MODE (TREE_TYPE (exp));
8173
8174   if (POINTER_TYPE_P (TREE_TYPE (exp)))
8175     {
8176       as = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (exp)));
8177       address_mode = targetm.addr_space.address_mode (as);
8178       pointer_mode = targetm.addr_space.pointer_mode (as);
8179     }
8180
8181   /* We can get called with some Weird Things if the user does silliness
8182      like "(short) &a".  In that case, convert_memory_address won't do
8183      the right thing, so ignore the given target mode.  */
8184   scalar_int_mode new_tmode = (tmode == pointer_mode
8185                                ? pointer_mode
8186                                : address_mode);
8187
8188   result = expand_expr_addr_expr_1 (TREE_OPERAND (exp, 0), target,
8189                                     new_tmode, modifier, as);
8190
8191   /* Despite expand_expr claims concerning ignoring TMODE when not
8192      strictly convenient, stuff breaks if we don't honor it.  Note
8193      that combined with the above, we only do this for pointer modes.  */
8194   rmode = GET_MODE (result);
8195   if (rmode == VOIDmode)
8196     rmode = new_tmode;
8197   if (rmode != new_tmode)
8198     result = convert_memory_address_addr_space (new_tmode, result, as);
8199
8200   return result;
8201 }
8202
8203 /* Generate code for computing CONSTRUCTOR EXP.
8204    An rtx for the computed value is returned.  If AVOID_TEMP_MEM
8205    is TRUE, instead of creating a temporary variable in memory
8206    NULL is returned and the caller needs to handle it differently.  */
8207
8208 static rtx
8209 expand_constructor (tree exp, rtx target, enum expand_modifier modifier,
8210                     bool avoid_temp_mem)
8211 {
8212   tree type = TREE_TYPE (exp);
8213   machine_mode mode = TYPE_MODE (type);
8214
8215   /* Try to avoid creating a temporary at all.  This is possible
8216      if all of the initializer is zero.
8217      FIXME: try to handle all [0..255] initializers we can handle
8218      with memset.  */
8219   if (TREE_STATIC (exp)
8220       && !TREE_ADDRESSABLE (exp)
8221       && target != 0 && mode == BLKmode
8222       && all_zeros_p (exp))
8223     {
8224       clear_storage (target, expr_size (exp), BLOCK_OP_NORMAL);
8225       return target;
8226     }
8227
8228   /* All elts simple constants => refer to a constant in memory.  But
8229      if this is a non-BLKmode mode, let it store a field at a time
8230      since that should make a CONST_INT, CONST_WIDE_INT or
8231      CONST_DOUBLE when we fold.  Likewise, if we have a target we can
8232      use, it is best to store directly into the target unless the type
8233      is large enough that memcpy will be used.  If we are making an
8234      initializer and all operands are constant, put it in memory as
8235      well.
8236
8237      FIXME: Avoid trying to fill vector constructors piece-meal.
8238      Output them with output_constant_def below unless we're sure
8239      they're zeros.  This should go away when vector initializers
8240      are treated like VECTOR_CST instead of arrays.  */
8241   if ((TREE_STATIC (exp)
8242        && ((mode == BLKmode
8243             && ! (target != 0 && safe_from_p (target, exp, 1)))
8244            || TREE_ADDRESSABLE (exp)
8245            || (tree_fits_uhwi_p (TYPE_SIZE_UNIT (type))
8246                && (! can_move_by_pieces
8247                    (tree_to_uhwi (TYPE_SIZE_UNIT (type)),
8248                     TYPE_ALIGN (type)))
8249                && ! mostly_zeros_p (exp))))
8250       || ((modifier == EXPAND_INITIALIZER || modifier == EXPAND_CONST_ADDRESS)
8251           && TREE_CONSTANT (exp)))
8252     {
8253       rtx constructor;
8254
8255       if (avoid_temp_mem)
8256         return NULL_RTX;
8257
8258       constructor = expand_expr_constant (exp, 1, modifier);
8259
8260       if (modifier != EXPAND_CONST_ADDRESS
8261           && modifier != EXPAND_INITIALIZER
8262           && modifier != EXPAND_SUM)
8263         constructor = validize_mem (constructor);
8264
8265       return constructor;
8266     }
8267
8268   /* Handle calls that pass values in multiple non-contiguous
8269      locations.  The Irix 6 ABI has examples of this.  */
8270   if (target == 0 || ! safe_from_p (target, exp, 1)
8271       || GET_CODE (target) == PARALLEL || modifier == EXPAND_STACK_PARM)
8272     {
8273       if (avoid_temp_mem)
8274         return NULL_RTX;
8275
8276       target = assign_temp (type, TREE_ADDRESSABLE (exp), 1);
8277     }
8278
8279   store_constructor (exp, target, 0, int_expr_size (exp), false);
8280   return target;
8281 }
8282
8283
8284 /* expand_expr: generate code for computing expression EXP.
8285    An rtx for the computed value is returned.  The value is never null.
8286    In the case of a void EXP, const0_rtx is returned.
8287
8288    The value may be stored in TARGET if TARGET is nonzero.
8289    TARGET is just a suggestion; callers must assume that
8290    the rtx returned may not be the same as TARGET.
8291
8292    If TARGET is CONST0_RTX, it means that the value will be ignored.
8293
8294    If TMODE is not VOIDmode, it suggests generating the
8295    result in mode TMODE.  But this is done only when convenient.
8296    Otherwise, TMODE is ignored and the value generated in its natural mode.
8297    TMODE is just a suggestion; callers must assume that
8298    the rtx returned may not have mode TMODE.
8299
8300    Note that TARGET may have neither TMODE nor MODE.  In that case, it
8301    probably will not be used.
8302
8303    If MODIFIER is EXPAND_SUM then when EXP is an addition
8304    we can return an rtx of the form (MULT (REG ...) (CONST_INT ...))
8305    or a nest of (PLUS ...) and (MINUS ...) where the terms are
8306    products as above, or REG or MEM, or constant.
8307    Ordinarily in such cases we would output mul or add instructions
8308    and then return a pseudo reg containing the sum.
8309
8310    EXPAND_INITIALIZER is much like EXPAND_SUM except that
8311    it also marks a label as absolutely required (it can't be dead).
8312    It also makes a ZERO_EXTEND or SIGN_EXTEND instead of emitting extend insns.
8313    This is used for outputting expressions used in initializers.
8314
8315    EXPAND_CONST_ADDRESS says that it is okay to return a MEM
8316    with a constant address even if that address is not normally legitimate.
8317    EXPAND_INITIALIZER and EXPAND_SUM also have this effect.
8318
8319    EXPAND_STACK_PARM is used when expanding to a TARGET on the stack for
8320    a call parameter.  Such targets require special care as we haven't yet
8321    marked TARGET so that it's safe from being trashed by libcalls.  We
8322    don't want to use TARGET for anything but the final result;
8323    Intermediate values must go elsewhere.   Additionally, calls to
8324    emit_block_move will be flagged with BLOCK_OP_CALL_PARM.
8325
8326    If EXP is a VAR_DECL whose DECL_RTL was a MEM with an invalid
8327    address, and ALT_RTL is non-NULL, then *ALT_RTL is set to the
8328    DECL_RTL of the VAR_DECL.  *ALT_RTL is also set if EXP is a
8329    COMPOUND_EXPR whose second argument is such a VAR_DECL, and so on
8330    recursively.
8331    If the result can be stored at TARGET, and ALT_RTL is non-NULL,
8332    then *ALT_RTL is set to TARGET (before legitimziation).
8333
8334    If INNER_REFERENCE_P is true, we are expanding an inner reference.
8335    In this case, we don't adjust a returned MEM rtx that wouldn't be
8336    sufficiently aligned for its mode; instead, it's up to the caller
8337    to deal with it afterwards.  This is used to make sure that unaligned
8338    base objects for which out-of-bounds accesses are supported, for
8339    example record types with trailing arrays, aren't realigned behind
8340    the back of the caller.
8341    The normal operating mode is to pass FALSE for this parameter.  */
8342
8343 rtx
8344 expand_expr_real (tree exp, rtx target, machine_mode tmode,
8345                   enum expand_modifier modifier, rtx *alt_rtl,
8346                   bool inner_reference_p)
8347 {
8348   rtx ret;
8349
8350   /* Handle ERROR_MARK before anybody tries to access its type.  */
8351   if (TREE_CODE (exp) == ERROR_MARK
8352       || (TREE_CODE (TREE_TYPE (exp)) == ERROR_MARK))
8353     {
8354       ret = CONST0_RTX (tmode);
8355       return ret ? ret : const0_rtx;
8356     }
8357
8358   ret = expand_expr_real_1 (exp, target, tmode, modifier, alt_rtl,
8359                             inner_reference_p);
8360   return ret;
8361 }
8362
8363 /* Try to expand the conditional expression which is represented by
8364    TREEOP0 ? TREEOP1 : TREEOP2 using conditonal moves.  If it succeeds
8365    return the rtl reg which represents the result.  Otherwise return
8366    NULL_RTX.  */
8367
8368 static rtx
8369 expand_cond_expr_using_cmove (tree treeop0 ATTRIBUTE_UNUSED,
8370                               tree treeop1 ATTRIBUTE_UNUSED,
8371                               tree treeop2 ATTRIBUTE_UNUSED)
8372 {
8373   rtx insn;
8374   rtx op00, op01, op1, op2;
8375   enum rtx_code comparison_code;
8376   machine_mode comparison_mode;
8377   gimple *srcstmt;
8378   rtx temp;
8379   tree type = TREE_TYPE (treeop1);
8380   int unsignedp = TYPE_UNSIGNED (type);
8381   machine_mode mode = TYPE_MODE (type);
8382   machine_mode orig_mode = mode;
8383   static bool expanding_cond_expr_using_cmove = false;
8384
8385   /* Conditional move expansion can end up TERing two operands which,
8386      when recursively hitting conditional expressions can result in
8387      exponential behavior if the cmove expansion ultimatively fails.
8388      It's hardly profitable to TER a cmove into a cmove so avoid doing
8389      that by failing early if we end up recursing.  */
8390   if (expanding_cond_expr_using_cmove)
8391     return NULL_RTX;
8392
8393   /* If we cannot do a conditional move on the mode, try doing it
8394      with the promoted mode. */
8395   if (!can_conditionally_move_p (mode))
8396     {
8397       mode = promote_mode (type, mode, &unsignedp);
8398       if (!can_conditionally_move_p (mode))
8399         return NULL_RTX;
8400       temp = assign_temp (type, 0, 0); /* Use promoted mode for temp.  */
8401     }
8402   else
8403     temp = assign_temp (type, 0, 1);
8404
8405   expanding_cond_expr_using_cmove = true;
8406   start_sequence ();
8407   expand_operands (treeop1, treeop2,
8408                    temp, &op1, &op2, EXPAND_NORMAL);
8409
8410   if (TREE_CODE (treeop0) == SSA_NAME
8411       && (srcstmt = get_def_for_expr_class (treeop0, tcc_comparison)))
8412     {
8413       type = TREE_TYPE (gimple_assign_rhs1 (srcstmt));
8414       enum tree_code cmpcode = gimple_assign_rhs_code (srcstmt);
8415       op00 = expand_normal (gimple_assign_rhs1 (srcstmt));
8416       op01 = expand_normal (gimple_assign_rhs2 (srcstmt));
8417       comparison_mode = TYPE_MODE (type);
8418       unsignedp = TYPE_UNSIGNED (type);
8419       comparison_code = convert_tree_comp_to_rtx (cmpcode, unsignedp);
8420     }
8421   else if (COMPARISON_CLASS_P (treeop0))
8422     {
8423       type = TREE_TYPE (TREE_OPERAND (treeop0, 0));
8424       enum tree_code cmpcode = TREE_CODE (treeop0);
8425       op00 = expand_normal (TREE_OPERAND (treeop0, 0));
8426       op01 = expand_normal (TREE_OPERAND (treeop0, 1));
8427       unsignedp = TYPE_UNSIGNED (type);
8428       comparison_mode = TYPE_MODE (type);
8429       comparison_code = convert_tree_comp_to_rtx (cmpcode, unsignedp);
8430     }
8431   else
8432     {
8433       op00 = expand_normal (treeop0);
8434       op01 = const0_rtx;
8435       comparison_code = NE;
8436       comparison_mode = GET_MODE (op00);
8437       if (comparison_mode == VOIDmode)
8438         comparison_mode = TYPE_MODE (TREE_TYPE (treeop0));
8439     }
8440   expanding_cond_expr_using_cmove = false;
8441
8442   if (GET_MODE (op1) != mode)
8443     op1 = gen_lowpart (mode, op1);
8444
8445   if (GET_MODE (op2) != mode)
8446     op2 = gen_lowpart (mode, op2);
8447
8448   /* Try to emit the conditional move.  */
8449   insn = emit_conditional_move (temp, comparison_code,
8450                                 op00, op01, comparison_mode,
8451                                 op1, op2, mode,
8452                                 unsignedp);
8453
8454   /* If we could do the conditional move, emit the sequence,
8455      and return.  */
8456   if (insn)
8457     {
8458       rtx_insn *seq = get_insns ();
8459       end_sequence ();
8460       emit_insn (seq);
8461       return convert_modes (orig_mode, mode, temp, 0);
8462     }
8463
8464   /* Otherwise discard the sequence and fall back to code with
8465      branches.  */
8466   end_sequence ();
8467   return NULL_RTX;
8468 }
8469
8470 /* A helper function for expand_expr_real_2 to be used with a
8471    misaligned mem_ref TEMP.  Assume an unsigned type if UNSIGNEDP
8472    is nonzero, with alignment ALIGN in bits.
8473    Store the value at TARGET if possible (if TARGET is nonzero).
8474    Regardless of TARGET, we return the rtx for where the value is placed.
8475    If the result can be stored at TARGET, and ALT_RTL is non-NULL,
8476    then *ALT_RTL is set to TARGET (before legitimziation).  */
8477
8478 static rtx
8479 expand_misaligned_mem_ref (rtx temp, machine_mode mode, int unsignedp,
8480                            unsigned int align, rtx target, rtx *alt_rtl)
8481 {
8482   enum insn_code icode;
8483
8484   if ((icode = optab_handler (movmisalign_optab, mode))
8485       != CODE_FOR_nothing)
8486     {
8487       class expand_operand ops[2];
8488
8489       /* We've already validated the memory, and we're creating a
8490          new pseudo destination.  The predicates really can't fail,
8491          nor can the generator.  */
8492       create_output_operand (&ops[0], NULL_RTX, mode);
8493       create_fixed_operand (&ops[1], temp);
8494       expand_insn (icode, 2, ops);
8495       temp = ops[0].value;
8496     }
8497   else if (targetm.slow_unaligned_access (mode, align))
8498     temp = extract_bit_field (temp, GET_MODE_BITSIZE (mode),
8499                               0, unsignedp, target,
8500                               mode, mode, false, alt_rtl);
8501   return temp;
8502 }
8503
8504 rtx
8505 expand_expr_real_2 (sepops ops, rtx target, machine_mode tmode,
8506                     enum expand_modifier modifier)
8507 {
8508   rtx op0, op1, op2, temp;
8509   rtx_code_label *lab;
8510   tree type;
8511   int unsignedp;
8512   machine_mode mode;
8513   scalar_int_mode int_mode;
8514   enum tree_code code = ops->code;
8515   optab this_optab;
8516   rtx subtarget, original_target;
8517   int ignore;
8518   bool reduce_bit_field;
8519   location_t loc = ops->location;
8520   tree treeop0, treeop1, treeop2;
8521 #define REDUCE_BIT_FIELD(expr)  (reduce_bit_field                         \
8522                                  ? reduce_to_bit_field_precision ((expr), \
8523                                                                   target, \
8524                                                                   type)   \
8525                                  : (expr))
8526
8527   type = ops->type;
8528   mode = TYPE_MODE (type);
8529   unsignedp = TYPE_UNSIGNED (type);
8530
8531   treeop0 = ops->op0;
8532   treeop1 = ops->op1;
8533   treeop2 = ops->op2;
8534
8535   /* We should be called only on simple (binary or unary) expressions,
8536      exactly those that are valid in gimple expressions that aren't
8537      GIMPLE_SINGLE_RHS (or invalid).  */
8538   gcc_assert (get_gimple_rhs_class (code) == GIMPLE_UNARY_RHS
8539               || get_gimple_rhs_class (code) == GIMPLE_BINARY_RHS
8540               || get_gimple_rhs_class (code) == GIMPLE_TERNARY_RHS);
8541
8542   ignore = (target == const0_rtx
8543             || ((CONVERT_EXPR_CODE_P (code)
8544                  || code == COND_EXPR || code == VIEW_CONVERT_EXPR)
8545                 && TREE_CODE (type) == VOID_TYPE));
8546
8547   /* We should be called only if we need the result.  */
8548   gcc_assert (!ignore);
8549
8550   /* An operation in what may be a bit-field type needs the
8551      result to be reduced to the precision of the bit-field type,
8552      which is narrower than that of the type's mode.  */
8553   reduce_bit_field = (INTEGRAL_TYPE_P (type)
8554                       && !type_has_mode_precision_p (type));
8555
8556   if (reduce_bit_field && modifier == EXPAND_STACK_PARM)
8557     target = 0;
8558
8559   /* Use subtarget as the target for operand 0 of a binary operation.  */
8560   subtarget = get_subtarget (target);
8561   original_target = target;
8562
8563   switch (code)
8564     {
8565     case NON_LVALUE_EXPR:
8566     case PAREN_EXPR:
8567     CASE_CONVERT:
8568       if (treeop0 == error_mark_node)
8569         return const0_rtx;
8570
8571       if (TREE_CODE (type) == UNION_TYPE)
8572         {
8573           tree valtype = TREE_TYPE (treeop0);
8574
8575           /* If both input and output are BLKmode, this conversion isn't doing
8576              anything except possibly changing memory attribute.  */
8577           if (mode == BLKmode && TYPE_MODE (valtype) == BLKmode)
8578             {
8579               rtx result = expand_expr (treeop0, target, tmode,
8580                                         modifier);
8581
8582               result = copy_rtx (result);
8583               set_mem_attributes (result, type, 0);
8584               return result;
8585             }
8586
8587           if (target == 0)
8588             {
8589               if (TYPE_MODE (type) != BLKmode)
8590                 target = gen_reg_rtx (TYPE_MODE (type));
8591               else
8592                 target = assign_temp (type, 1, 1);
8593             }
8594
8595           if (MEM_P (target))
8596             /* Store data into beginning of memory target.  */
8597             store_expr (treeop0,
8598                         adjust_address (target, TYPE_MODE (valtype), 0),
8599                         modifier == EXPAND_STACK_PARM,
8600                         false, TYPE_REVERSE_STORAGE_ORDER (type));
8601
8602           else
8603             {
8604               gcc_assert (REG_P (target)
8605                           && !TYPE_REVERSE_STORAGE_ORDER (type));
8606
8607               /* Store this field into a union of the proper type.  */
8608               poly_uint64 op0_size
8609                 = tree_to_poly_uint64 (TYPE_SIZE (TREE_TYPE (treeop0)));
8610               poly_uint64 union_size = GET_MODE_BITSIZE (mode);
8611               store_field (target,
8612                            /* The conversion must be constructed so that
8613                               we know at compile time how many bits
8614                               to preserve.  */
8615                            ordered_min (op0_size, union_size),
8616                            0, 0, 0, TYPE_MODE (valtype), treeop0, 0,
8617                            false, false);
8618             }
8619
8620           /* Return the entire union.  */
8621           return target;
8622         }
8623
8624       if (mode == TYPE_MODE (TREE_TYPE (treeop0)))
8625         {
8626           op0 = expand_expr (treeop0, target, VOIDmode,
8627                              modifier);
8628
8629           /* If the signedness of the conversion differs and OP0 is
8630              a promoted SUBREG, clear that indication since we now
8631              have to do the proper extension.  */
8632           if (TYPE_UNSIGNED (TREE_TYPE (treeop0)) != unsignedp
8633               && GET_CODE (op0) == SUBREG)
8634             SUBREG_PROMOTED_VAR_P (op0) = 0;
8635
8636           return REDUCE_BIT_FIELD (op0);
8637         }
8638
8639       op0 = expand_expr (treeop0, NULL_RTX, mode,
8640                          modifier == EXPAND_SUM ? EXPAND_NORMAL : modifier);
8641       if (GET_MODE (op0) == mode)
8642         ;
8643
8644       /* If OP0 is a constant, just convert it into the proper mode.  */
8645       else if (CONSTANT_P (op0))
8646         {
8647           tree inner_type = TREE_TYPE (treeop0);
8648           machine_mode inner_mode = GET_MODE (op0);
8649
8650           if (inner_mode == VOIDmode)
8651             inner_mode = TYPE_MODE (inner_type);
8652
8653           if (modifier == EXPAND_INITIALIZER)
8654             op0 = lowpart_subreg (mode, op0, inner_mode);
8655           else
8656             op0=  convert_modes (mode, inner_mode, op0,
8657                                  TYPE_UNSIGNED (inner_type));
8658         }
8659
8660       else if (modifier == EXPAND_INITIALIZER)
8661         op0 = gen_rtx_fmt_e (TYPE_UNSIGNED (TREE_TYPE (treeop0))
8662                              ? ZERO_EXTEND : SIGN_EXTEND, mode, op0);
8663
8664       else if (target == 0)
8665         op0 = convert_to_mode (mode, op0,
8666                                TYPE_UNSIGNED (TREE_TYPE
8667                                               (treeop0)));
8668       else
8669         {
8670           convert_move (target, op0,
8671                         TYPE_UNSIGNED (TREE_TYPE (treeop0)));
8672           op0 = target;
8673         }
8674
8675       return REDUCE_BIT_FIELD (op0);
8676
8677     case ADDR_SPACE_CONVERT_EXPR:
8678       {
8679         tree treeop0_type = TREE_TYPE (treeop0);
8680
8681         gcc_assert (POINTER_TYPE_P (type));
8682         gcc_assert (POINTER_TYPE_P (treeop0_type));
8683
8684         addr_space_t as_to = TYPE_ADDR_SPACE (TREE_TYPE (type));
8685         addr_space_t as_from = TYPE_ADDR_SPACE (TREE_TYPE (treeop0_type));
8686
8687         /* Conversions between pointers to the same address space should
8688            have been implemented via CONVERT_EXPR / NOP_EXPR.  */
8689         gcc_assert (as_to != as_from);
8690
8691         op0 = expand_expr (treeop0, NULL_RTX, VOIDmode, modifier);
8692
8693         /* Ask target code to handle conversion between pointers
8694            to overlapping address spaces.  */
8695         if (targetm.addr_space.subset_p (as_to, as_from)
8696             || targetm.addr_space.subset_p (as_from, as_to))
8697           {
8698             op0 = targetm.addr_space.convert (op0, treeop0_type, type);
8699           }
8700         else
8701           {
8702             /* For disjoint address spaces, converting anything but a null
8703                pointer invokes undefined behavior.  We truncate or extend the
8704                value as if we'd converted via integers, which handles 0 as
8705                required, and all others as the programmer likely expects.  */
8706 #ifndef POINTERS_EXTEND_UNSIGNED
8707             const int POINTERS_EXTEND_UNSIGNED = 1;
8708 #endif
8709             op0 = convert_modes (mode, TYPE_MODE (treeop0_type),
8710                                  op0, POINTERS_EXTEND_UNSIGNED);
8711           }
8712         gcc_assert (op0);
8713         return op0;
8714       }
8715
8716     case POINTER_PLUS_EXPR:
8717       /* Even though the sizetype mode and the pointer's mode can be different
8718          expand is able to handle this correctly and get the correct result out
8719          of the PLUS_EXPR code.  */
8720       /* Make sure to sign-extend the sizetype offset in a POINTER_PLUS_EXPR
8721          if sizetype precision is smaller than pointer precision.  */
8722       if (TYPE_PRECISION (sizetype) < TYPE_PRECISION (type))
8723         treeop1 = fold_convert_loc (loc, type,
8724                                     fold_convert_loc (loc, ssizetype,
8725                                                       treeop1));
8726       /* If sizetype precision is larger than pointer precision, truncate the
8727          offset to have matching modes.  */
8728       else if (TYPE_PRECISION (sizetype) > TYPE_PRECISION (type))
8729         treeop1 = fold_convert_loc (loc, type, treeop1);
8730       /* FALLTHRU */
8731
8732     case PLUS_EXPR:
8733       /* If we are adding a constant, a VAR_DECL that is sp, fp, or ap, and
8734          something else, make sure we add the register to the constant and
8735          then to the other thing.  This case can occur during strength
8736          reduction and doing it this way will produce better code if the
8737          frame pointer or argument pointer is eliminated.
8738
8739          fold-const.c will ensure that the constant is always in the inner
8740          PLUS_EXPR, so the only case we need to do anything about is if
8741          sp, ap, or fp is our second argument, in which case we must swap
8742          the innermost first argument and our second argument.  */
8743
8744       if (TREE_CODE (treeop0) == PLUS_EXPR
8745           && TREE_CODE (TREE_OPERAND (treeop0, 1)) == INTEGER_CST
8746           && VAR_P (treeop1)
8747           && (DECL_RTL (treeop1) == frame_pointer_rtx
8748               || DECL_RTL (treeop1) == stack_pointer_rtx
8749               || DECL_RTL (treeop1) == arg_pointer_rtx))
8750         {
8751           gcc_unreachable ();
8752         }
8753
8754       /* If the result is to be ptr_mode and we are adding an integer to
8755          something, we might be forming a constant.  So try to use
8756          plus_constant.  If it produces a sum and we can't accept it,
8757          use force_operand.  This allows P = &ARR[const] to generate
8758          efficient code on machines where a SYMBOL_REF is not a valid
8759          address.
8760
8761          If this is an EXPAND_SUM call, always return the sum.  */
8762       if (modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER
8763           || (mode == ptr_mode && (unsignedp || ! flag_trapv)))
8764         {
8765           if (modifier == EXPAND_STACK_PARM)
8766             target = 0;
8767           if (TREE_CODE (treeop0) == INTEGER_CST
8768               && HWI_COMPUTABLE_MODE_P (mode)
8769               && TREE_CONSTANT (treeop1))
8770             {
8771               rtx constant_part;
8772               HOST_WIDE_INT wc;
8773               machine_mode wmode = TYPE_MODE (TREE_TYPE (treeop1));
8774
8775               op1 = expand_expr (treeop1, subtarget, VOIDmode,
8776                                  EXPAND_SUM);
8777               /* Use wi::shwi to ensure that the constant is
8778                  truncated according to the mode of OP1, then sign extended
8779                  to a HOST_WIDE_INT.  Using the constant directly can result
8780                  in non-canonical RTL in a 64x32 cross compile.  */
8781               wc = TREE_INT_CST_LOW (treeop0);
8782               constant_part =
8783                 immed_wide_int_const (wi::shwi (wc, wmode), wmode);
8784               op1 = plus_constant (mode, op1, INTVAL (constant_part));
8785               if (modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
8786                 op1 = force_operand (op1, target);
8787               return REDUCE_BIT_FIELD (op1);
8788             }
8789
8790           else if (TREE_CODE (treeop1) == INTEGER_CST
8791                    && HWI_COMPUTABLE_MODE_P (mode)
8792                    && TREE_CONSTANT (treeop0))
8793             {
8794               rtx constant_part;
8795               HOST_WIDE_INT wc;
8796               machine_mode wmode = TYPE_MODE (TREE_TYPE (treeop0));
8797
8798               op0 = expand_expr (treeop0, subtarget, VOIDmode,
8799                                  (modifier == EXPAND_INITIALIZER
8800                                  ? EXPAND_INITIALIZER : EXPAND_SUM));
8801               if (! CONSTANT_P (op0))
8802                 {
8803                   op1 = expand_expr (treeop1, NULL_RTX,
8804                                      VOIDmode, modifier);
8805                   /* Return a PLUS if modifier says it's OK.  */
8806                   if (modifier == EXPAND_SUM
8807                       || modifier == EXPAND_INITIALIZER)
8808                     return simplify_gen_binary (PLUS, mode, op0, op1);
8809                   goto binop2;
8810                 }
8811               /* Use wi::shwi to ensure that the constant is
8812                  truncated according to the mode of OP1, then sign extended
8813                  to a HOST_WIDE_INT.  Using the constant directly can result
8814                  in non-canonical RTL in a 64x32 cross compile.  */
8815               wc = TREE_INT_CST_LOW (treeop1);
8816               constant_part
8817                 = immed_wide_int_const (wi::shwi (wc, wmode), wmode);
8818               op0 = plus_constant (mode, op0, INTVAL (constant_part));
8819               if (modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
8820                 op0 = force_operand (op0, target);
8821               return REDUCE_BIT_FIELD (op0);
8822             }
8823         }
8824
8825       /* Use TER to expand pointer addition of a negated value
8826          as pointer subtraction.  */
8827       if ((POINTER_TYPE_P (TREE_TYPE (treeop0))
8828            || (TREE_CODE (TREE_TYPE (treeop0)) == VECTOR_TYPE
8829                && POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (treeop0)))))
8830           && TREE_CODE (treeop1) == SSA_NAME
8831           && TYPE_MODE (TREE_TYPE (treeop0))
8832              == TYPE_MODE (TREE_TYPE (treeop1)))
8833         {
8834           gimple *def = get_def_for_expr (treeop1, NEGATE_EXPR);
8835           if (def)
8836             {
8837               treeop1 = gimple_assign_rhs1 (def);
8838               code = MINUS_EXPR;
8839               goto do_minus;
8840             }
8841         }
8842
8843       /* No sense saving up arithmetic to be done
8844          if it's all in the wrong mode to form part of an address.
8845          And force_operand won't know whether to sign-extend or
8846          zero-extend.  */
8847       if (modifier != EXPAND_INITIALIZER
8848           && (modifier != EXPAND_SUM || mode != ptr_mode))
8849         {
8850           expand_operands (treeop0, treeop1,
8851                            subtarget, &op0, &op1, modifier);
8852           if (op0 == const0_rtx)
8853             return op1;
8854           if (op1 == const0_rtx)
8855             return op0;
8856           goto binop2;
8857         }
8858
8859       expand_operands (treeop0, treeop1,
8860                        subtarget, &op0, &op1, modifier);
8861       return REDUCE_BIT_FIELD (simplify_gen_binary (PLUS, mode, op0, op1));
8862
8863     case MINUS_EXPR:
8864     case POINTER_DIFF_EXPR:
8865     do_minus:
8866       /* For initializers, we are allowed to return a MINUS of two
8867          symbolic constants.  Here we handle all cases when both operands
8868          are constant.  */
8869       /* Handle difference of two symbolic constants,
8870          for the sake of an initializer.  */
8871       if ((modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
8872           && really_constant_p (treeop0)
8873           && really_constant_p (treeop1))
8874         {
8875           expand_operands (treeop0, treeop1,
8876                            NULL_RTX, &op0, &op1, modifier);
8877           return simplify_gen_binary (MINUS, mode, op0, op1);
8878         }
8879
8880       /* No sense saving up arithmetic to be done
8881          if it's all in the wrong mode to form part of an address.
8882          And force_operand won't know whether to sign-extend or
8883          zero-extend.  */
8884       if (modifier != EXPAND_INITIALIZER
8885           && (modifier != EXPAND_SUM || mode != ptr_mode))
8886         goto binop;
8887
8888       expand_operands (treeop0, treeop1,
8889                        subtarget, &op0, &op1, modifier);
8890
8891       /* Convert A - const to A + (-const).  */
8892       if (CONST_INT_P (op1))
8893         {
8894           op1 = negate_rtx (mode, op1);
8895           return REDUCE_BIT_FIELD (simplify_gen_binary (PLUS, mode, op0, op1));
8896         }
8897
8898       goto binop2;
8899
8900     case WIDEN_MULT_PLUS_EXPR:
8901     case WIDEN_MULT_MINUS_EXPR:
8902       expand_operands (treeop0, treeop1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
8903       op2 = expand_normal (treeop2);
8904       target = expand_widen_pattern_expr (ops, op0, op1, op2,
8905                                           target, unsignedp);
8906       return target;
8907
8908     case WIDEN_MULT_EXPR:
8909       /* If first operand is constant, swap them.
8910          Thus the following special case checks need only
8911          check the second operand.  */
8912       if (TREE_CODE (treeop0) == INTEGER_CST)
8913         std::swap (treeop0, treeop1);
8914
8915       /* First, check if we have a multiplication of one signed and one
8916          unsigned operand.  */
8917       if (TREE_CODE (treeop1) != INTEGER_CST
8918           && (TYPE_UNSIGNED (TREE_TYPE (treeop0))
8919               != TYPE_UNSIGNED (TREE_TYPE (treeop1))))
8920         {
8921           machine_mode innermode = TYPE_MODE (TREE_TYPE (treeop0));
8922           this_optab = usmul_widen_optab;
8923           if (find_widening_optab_handler (this_optab, mode, innermode)
8924                 != CODE_FOR_nothing)
8925             {
8926               if (TYPE_UNSIGNED (TREE_TYPE (treeop0)))
8927                 expand_operands (treeop0, treeop1, NULL_RTX, &op0, &op1,
8928                                  EXPAND_NORMAL);
8929               else
8930                 expand_operands (treeop0, treeop1, NULL_RTX, &op1, &op0,
8931                                  EXPAND_NORMAL);
8932               /* op0 and op1 might still be constant, despite the above
8933                  != INTEGER_CST check.  Handle it.  */
8934               if (GET_MODE (op0) == VOIDmode && GET_MODE (op1) == VOIDmode)
8935                 {
8936                   op0 = convert_modes (mode, innermode, op0, true);
8937                   op1 = convert_modes (mode, innermode, op1, false);
8938                   return REDUCE_BIT_FIELD (expand_mult (mode, op0, op1,
8939                                                         target, unsignedp));
8940                 }
8941               goto binop3;
8942             }
8943         }
8944       /* Check for a multiplication with matching signedness.  */
8945       else if ((TREE_CODE (treeop1) == INTEGER_CST
8946                 && int_fits_type_p (treeop1, TREE_TYPE (treeop0)))
8947                || (TYPE_UNSIGNED (TREE_TYPE (treeop1))
8948                    == TYPE_UNSIGNED (TREE_TYPE (treeop0))))
8949         {
8950           tree op0type = TREE_TYPE (treeop0);
8951           machine_mode innermode = TYPE_MODE (op0type);
8952           bool zextend_p = TYPE_UNSIGNED (op0type);
8953           optab other_optab = zextend_p ? smul_widen_optab : umul_widen_optab;
8954           this_optab = zextend_p ? umul_widen_optab : smul_widen_optab;
8955
8956           if (TREE_CODE (treeop0) != INTEGER_CST)
8957             {
8958               if (find_widening_optab_handler (this_optab, mode, innermode)
8959                   != CODE_FOR_nothing)
8960                 {
8961                   expand_operands (treeop0, treeop1, NULL_RTX, &op0, &op1,
8962                                    EXPAND_NORMAL);
8963                   /* op0 and op1 might still be constant, despite the above
8964                      != INTEGER_CST check.  Handle it.  */
8965                   if (GET_MODE (op0) == VOIDmode && GET_MODE (op1) == VOIDmode)
8966                     {
8967                      widen_mult_const:
8968                       op0 = convert_modes (mode, innermode, op0, zextend_p);
8969                       op1
8970                         = convert_modes (mode, innermode, op1,
8971                                          TYPE_UNSIGNED (TREE_TYPE (treeop1)));
8972                       return REDUCE_BIT_FIELD (expand_mult (mode, op0, op1,
8973                                                             target,
8974                                                             unsignedp));
8975                     }
8976                   temp = expand_widening_mult (mode, op0, op1, target,
8977                                                unsignedp, this_optab);
8978                   return REDUCE_BIT_FIELD (temp);
8979                 }
8980               if (find_widening_optab_handler (other_optab, mode, innermode)
8981                   != CODE_FOR_nothing
8982                   && innermode == word_mode)
8983                 {
8984                   rtx htem, hipart;
8985                   op0 = expand_normal (treeop0);
8986                   op1 = expand_normal (treeop1);
8987                   /* op0 and op1 might be constants, despite the above
8988                      != INTEGER_CST check.  Handle it.  */
8989                   if (GET_MODE (op0) == VOIDmode && GET_MODE (op1) == VOIDmode)
8990                     goto widen_mult_const;
8991                   temp = expand_binop (mode, other_optab, op0, op1, target,
8992                                        unsignedp, OPTAB_LIB_WIDEN);
8993                   hipart = gen_highpart (word_mode, temp);
8994                   htem = expand_mult_highpart_adjust (word_mode, hipart,
8995                                                       op0, op1, hipart,
8996                                                       zextend_p);
8997                   if (htem != hipart)
8998                     emit_move_insn (hipart, htem);
8999                   return REDUCE_BIT_FIELD (temp);
9000                 }
9001             }
9002         }
9003       treeop0 = fold_build1 (CONVERT_EXPR, type, treeop0);
9004       treeop1 = fold_build1 (CONVERT_EXPR, type, treeop1);
9005       expand_operands (treeop0, treeop1, subtarget, &op0, &op1, EXPAND_NORMAL);
9006       return REDUCE_BIT_FIELD (expand_mult (mode, op0, op1, target, unsignedp));
9007
9008     case MULT_EXPR:
9009       /* If this is a fixed-point operation, then we cannot use the code
9010          below because "expand_mult" doesn't support sat/no-sat fixed-point
9011          multiplications.   */
9012       if (ALL_FIXED_POINT_MODE_P (mode))
9013         goto binop;
9014
9015       /* If first operand is constant, swap them.
9016          Thus the following special case checks need only
9017          check the second operand.  */
9018       if (TREE_CODE (treeop0) == INTEGER_CST)
9019         std::swap (treeop0, treeop1);
9020
9021       /* Attempt to return something suitable for generating an
9022          indexed address, for machines that support that.  */
9023
9024       if (modifier == EXPAND_SUM && mode == ptr_mode
9025           && tree_fits_shwi_p (treeop1))
9026         {
9027           tree exp1 = treeop1;
9028
9029           op0 = expand_expr (treeop0, subtarget, VOIDmode,
9030                              EXPAND_SUM);
9031
9032           if (!REG_P (op0))
9033             op0 = force_operand (op0, NULL_RTX);
9034           if (!REG_P (op0))
9035             op0 = copy_to_mode_reg (mode, op0);
9036
9037           return REDUCE_BIT_FIELD (gen_rtx_MULT (mode, op0,
9038                                gen_int_mode (tree_to_shwi (exp1),
9039                                              TYPE_MODE (TREE_TYPE (exp1)))));
9040         }
9041
9042       if (modifier == EXPAND_STACK_PARM)
9043         target = 0;
9044
9045       expand_operands (treeop0, treeop1, subtarget, &op0, &op1, EXPAND_NORMAL);
9046       return REDUCE_BIT_FIELD (expand_mult (mode, op0, op1, target, unsignedp));
9047
9048     case TRUNC_MOD_EXPR:
9049     case FLOOR_MOD_EXPR:
9050     case CEIL_MOD_EXPR:
9051     case ROUND_MOD_EXPR:
9052
9053     case TRUNC_DIV_EXPR:
9054     case FLOOR_DIV_EXPR:
9055     case CEIL_DIV_EXPR:
9056     case ROUND_DIV_EXPR:
9057     case EXACT_DIV_EXPR:
9058      {
9059        /* If this is a fixed-point operation, then we cannot use the code
9060           below because "expand_divmod" doesn't support sat/no-sat fixed-point
9061           divisions.   */
9062        if (ALL_FIXED_POINT_MODE_P (mode))
9063          goto binop;
9064
9065        if (modifier == EXPAND_STACK_PARM)
9066          target = 0;
9067        /* Possible optimization: compute the dividend with EXPAND_SUM
9068           then if the divisor is constant can optimize the case
9069           where some terms of the dividend have coeffs divisible by it.  */
9070        expand_operands (treeop0, treeop1,
9071                         subtarget, &op0, &op1, EXPAND_NORMAL);
9072        bool mod_p = code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR
9073                     || code == CEIL_MOD_EXPR || code == ROUND_MOD_EXPR;
9074        if (SCALAR_INT_MODE_P (mode)
9075            && optimize >= 2
9076            && get_range_pos_neg (treeop0) == 1
9077            && get_range_pos_neg (treeop1) == 1)
9078          {
9079            /* If both arguments are known to be positive when interpreted
9080               as signed, we can expand it as both signed and unsigned
9081               division or modulo.  Choose the cheaper sequence in that case.  */
9082            bool speed_p = optimize_insn_for_speed_p ();
9083            do_pending_stack_adjust ();
9084            start_sequence ();
9085            rtx uns_ret = expand_divmod (mod_p, code, mode, op0, op1, target, 1);
9086            rtx_insn *uns_insns = get_insns ();
9087            end_sequence ();
9088            start_sequence ();
9089            rtx sgn_ret = expand_divmod (mod_p, code, mode, op0, op1, target, 0);
9090            rtx_insn *sgn_insns = get_insns ();
9091            end_sequence ();
9092            unsigned uns_cost = seq_cost (uns_insns, speed_p);
9093            unsigned sgn_cost = seq_cost (sgn_insns, speed_p);
9094
9095            /* If costs are the same then use as tie breaker the other
9096               other factor.  */
9097            if (uns_cost == sgn_cost)
9098              {
9099                 uns_cost = seq_cost (uns_insns, !speed_p);
9100                 sgn_cost = seq_cost (sgn_insns, !speed_p);
9101              }
9102
9103            if (uns_cost < sgn_cost || (uns_cost == sgn_cost && unsignedp))
9104              {
9105                emit_insn (uns_insns);
9106                return uns_ret;
9107              }
9108            emit_insn (sgn_insns);
9109            return sgn_ret;
9110          }
9111        return expand_divmod (mod_p, code, mode, op0, op1, target, unsignedp);
9112      }
9113     case RDIV_EXPR:
9114       goto binop;
9115
9116     case MULT_HIGHPART_EXPR:
9117       expand_operands (treeop0, treeop1, subtarget, &op0, &op1, EXPAND_NORMAL);
9118       temp = expand_mult_highpart (mode, op0, op1, target, unsignedp);
9119       gcc_assert (temp);
9120       return temp;
9121
9122     case FIXED_CONVERT_EXPR:
9123       op0 = expand_normal (treeop0);
9124       if (target == 0 || modifier == EXPAND_STACK_PARM)
9125         target = gen_reg_rtx (mode);
9126
9127       if ((TREE_CODE (TREE_TYPE (treeop0)) == INTEGER_TYPE
9128            && TYPE_UNSIGNED (TREE_TYPE (treeop0)))
9129           || (TREE_CODE (type) == INTEGER_TYPE && TYPE_UNSIGNED (type)))
9130         expand_fixed_convert (target, op0, 1, TYPE_SATURATING (type));
9131       else
9132         expand_fixed_convert (target, op0, 0, TYPE_SATURATING (type));
9133       return target;
9134
9135     case FIX_TRUNC_EXPR:
9136       op0 = expand_normal (treeop0);
9137       if (target == 0 || modifier == EXPAND_STACK_PARM)
9138         target = gen_reg_rtx (mode);
9139       expand_fix (target, op0, unsignedp);
9140       return target;
9141
9142     case FLOAT_EXPR:
9143       op0 = expand_normal (treeop0);
9144       if (target == 0 || modifier == EXPAND_STACK_PARM)
9145         target = gen_reg_rtx (mode);
9146       /* expand_float can't figure out what to do if FROM has VOIDmode.
9147          So give it the correct mode.  With -O, cse will optimize this.  */
9148       if (GET_MODE (op0) == VOIDmode)
9149         op0 = copy_to_mode_reg (TYPE_MODE (TREE_TYPE (treeop0)),
9150                                 op0);
9151       expand_float (target, op0,
9152                     TYPE_UNSIGNED (TREE_TYPE (treeop0)));
9153       return target;
9154
9155     case NEGATE_EXPR:
9156       op0 = expand_expr (treeop0, subtarget,
9157                          VOIDmode, EXPAND_NORMAL);
9158       if (modifier == EXPAND_STACK_PARM)
9159         target = 0;
9160       temp = expand_unop (mode,
9161                           optab_for_tree_code (NEGATE_EXPR, type,
9162                                                optab_default),
9163                           op0, target, 0);
9164       gcc_assert (temp);
9165       return REDUCE_BIT_FIELD (temp);
9166
9167     case ABS_EXPR:
9168     case ABSU_EXPR:
9169       op0 = expand_expr (treeop0, subtarget,
9170                          VOIDmode, EXPAND_NORMAL);
9171       if (modifier == EXPAND_STACK_PARM)
9172         target = 0;
9173
9174       /* ABS_EXPR is not valid for complex arguments.  */
9175       gcc_assert (GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
9176                   && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT);
9177
9178       /* Unsigned abs is simply the operand.  Testing here means we don't
9179          risk generating incorrect code below.  */
9180       if (TYPE_UNSIGNED (TREE_TYPE (treeop0)))
9181         return op0;
9182
9183       return expand_abs (mode, op0, target, unsignedp,
9184                          safe_from_p (target, treeop0, 1));
9185
9186     case MAX_EXPR:
9187     case MIN_EXPR:
9188       target = original_target;
9189       if (target == 0
9190           || modifier == EXPAND_STACK_PARM
9191           || (MEM_P (target) && MEM_VOLATILE_P (target))
9192           || GET_MODE (target) != mode
9193           || (REG_P (target)
9194               && REGNO (target) < FIRST_PSEUDO_REGISTER))
9195         target = gen_reg_rtx (mode);
9196       expand_operands (treeop0, treeop1,
9197                        target, &op0, &op1, EXPAND_NORMAL);
9198
9199       /* First try to do it with a special MIN or MAX instruction.
9200          If that does not win, use a conditional jump to select the proper
9201          value.  */
9202       this_optab = optab_for_tree_code (code, type, optab_default);
9203       temp = expand_binop (mode, this_optab, op0, op1, target, unsignedp,
9204                            OPTAB_WIDEN);
9205       if (temp != 0)
9206         return temp;
9207
9208       /* For vector MIN <x, y>, expand it a VEC_COND_EXPR <x <= y, x, y>
9209          and similarly for MAX <x, y>.  */
9210       if (VECTOR_TYPE_P (type))
9211         {
9212           tree t0 = make_tree (type, op0);
9213           tree t1 = make_tree (type, op1);
9214           tree comparison = build2 (code == MIN_EXPR ? LE_EXPR : GE_EXPR,
9215                                     type, t0, t1);
9216           return expand_vec_cond_expr (type, comparison, t0, t1,
9217                                        original_target);
9218         }
9219
9220       /* At this point, a MEM target is no longer useful; we will get better
9221          code without it.  */
9222
9223       if (! REG_P (target))
9224         target = gen_reg_rtx (mode);
9225
9226       /* If op1 was placed in target, swap op0 and op1.  */
9227       if (target != op0 && target == op1)
9228         std::swap (op0, op1);
9229
9230       /* We generate better code and avoid problems with op1 mentioning
9231          target by forcing op1 into a pseudo if it isn't a constant.  */
9232       if (! CONSTANT_P (op1))
9233         op1 = force_reg (mode, op1);
9234
9235       {
9236         enum rtx_code comparison_code;
9237         rtx cmpop1 = op1;
9238
9239         if (code == MAX_EXPR)
9240           comparison_code = unsignedp ? GEU : GE;
9241         else
9242           comparison_code = unsignedp ? LEU : LE;
9243
9244         /* Canonicalize to comparisons against 0.  */
9245         if (op1 == const1_rtx)
9246           {
9247             /* Converting (a >= 1 ? a : 1) into (a > 0 ? a : 1)
9248                or (a != 0 ? a : 1) for unsigned.
9249                For MIN we are safe converting (a <= 1 ? a : 1)
9250                into (a <= 0 ? a : 1)  */
9251             cmpop1 = const0_rtx;
9252             if (code == MAX_EXPR)
9253               comparison_code = unsignedp ? NE : GT;
9254           }
9255         if (op1 == constm1_rtx && !unsignedp)
9256           {
9257             /* Converting (a >= -1 ? a : -1) into (a >= 0 ? a : -1)
9258                and (a <= -1 ? a : -1) into (a < 0 ? a : -1) */
9259             cmpop1 = const0_rtx;
9260             if (code == MIN_EXPR)
9261               comparison_code = LT;
9262           }
9263
9264         /* Use a conditional move if possible.  */
9265         if (can_conditionally_move_p (mode))
9266           {
9267             rtx insn;
9268
9269             start_sequence ();
9270
9271             /* Try to emit the conditional move.  */
9272             insn = emit_conditional_move (target, comparison_code,
9273                                           op0, cmpop1, mode,
9274                                           op0, op1, mode,
9275                                           unsignedp);
9276
9277             /* If we could do the conditional move, emit the sequence,
9278                and return.  */
9279             if (insn)
9280               {
9281                 rtx_insn *seq = get_insns ();
9282                 end_sequence ();
9283                 emit_insn (seq);
9284                 return target;
9285               }
9286
9287             /* Otherwise discard the sequence and fall back to code with
9288                branches.  */
9289             end_sequence ();
9290           }
9291
9292         if (target != op0)
9293           emit_move_insn (target, op0);
9294
9295         lab = gen_label_rtx ();
9296         do_compare_rtx_and_jump (target, cmpop1, comparison_code,
9297                                  unsignedp, mode, NULL_RTX, NULL, lab,
9298                                  profile_probability::uninitialized ());
9299       }
9300       emit_move_insn (target, op1);
9301       emit_label (lab);
9302       return target;
9303
9304     case BIT_NOT_EXPR:
9305       op0 = expand_expr (treeop0, subtarget,
9306                          VOIDmode, EXPAND_NORMAL);
9307       if (modifier == EXPAND_STACK_PARM)
9308         target = 0;
9309       /* In case we have to reduce the result to bitfield precision
9310          for unsigned bitfield expand this as XOR with a proper constant
9311          instead.  */
9312       if (reduce_bit_field && TYPE_UNSIGNED (type))
9313         {
9314           int_mode = SCALAR_INT_TYPE_MODE (type);
9315           wide_int mask = wi::mask (TYPE_PRECISION (type),
9316                                     false, GET_MODE_PRECISION (int_mode));
9317
9318           temp = expand_binop (int_mode, xor_optab, op0,
9319                                immed_wide_int_const (mask, int_mode),
9320                                target, 1, OPTAB_LIB_WIDEN);
9321         }
9322       else
9323         temp = expand_unop (mode, one_cmpl_optab, op0, target, 1);
9324       gcc_assert (temp);
9325       return temp;
9326
9327       /* ??? Can optimize bitwise operations with one arg constant.
9328          Can optimize (a bitwise1 n) bitwise2 (a bitwise3 b)
9329          and (a bitwise1 b) bitwise2 b (etc)
9330          but that is probably not worth while.  */
9331
9332     case BIT_AND_EXPR:
9333     case BIT_IOR_EXPR:
9334     case BIT_XOR_EXPR:
9335       goto binop;
9336
9337     case LROTATE_EXPR:
9338     case RROTATE_EXPR:
9339       gcc_assert (VECTOR_MODE_P (TYPE_MODE (type))
9340                   || type_has_mode_precision_p (type));
9341       /* fall through */
9342
9343     case LSHIFT_EXPR:
9344     case RSHIFT_EXPR:
9345       {
9346         /* If this is a fixed-point operation, then we cannot use the code
9347            below because "expand_shift" doesn't support sat/no-sat fixed-point
9348            shifts.  */
9349         if (ALL_FIXED_POINT_MODE_P (mode))
9350           goto binop;
9351
9352         if (! safe_from_p (subtarget, treeop1, 1))
9353           subtarget = 0;
9354         if (modifier == EXPAND_STACK_PARM)
9355           target = 0;
9356         op0 = expand_expr (treeop0, subtarget,
9357                            VOIDmode, EXPAND_NORMAL);
9358
9359         /* Left shift optimization when shifting across word_size boundary.
9360
9361            If mode == GET_MODE_WIDER_MODE (word_mode), then normally
9362            there isn't native instruction to support this wide mode
9363            left shift.  Given below scenario:
9364
9365             Type A = (Type) B  << C
9366
9367             |<           T          >|
9368             | dest_high  |  dest_low |
9369
9370                          | word_size |
9371
9372            If the shift amount C caused we shift B to across the word
9373            size boundary, i.e part of B shifted into high half of
9374            destination register, and part of B remains in the low
9375            half, then GCC will use the following left shift expand
9376            logic:
9377
9378            1. Initialize dest_low to B.
9379            2. Initialize every bit of dest_high to the sign bit of B.
9380            3. Logic left shift dest_low by C bit to finalize dest_low.
9381               The value of dest_low before this shift is kept in a temp D.
9382            4. Logic left shift dest_high by C.
9383            5. Logic right shift D by (word_size - C).
9384            6. Or the result of 4 and 5 to finalize dest_high.
9385
9386            While, by checking gimple statements, if operand B is
9387            coming from signed extension, then we can simplify above
9388            expand logic into:
9389
9390               1. dest_high = src_low >> (word_size - C).
9391               2. dest_low = src_low << C.
9392
9393            We can use one arithmetic right shift to finish all the
9394            purpose of steps 2, 4, 5, 6, thus we reduce the steps
9395            needed from 6 into 2.
9396
9397            The case is similar for zero extension, except that we
9398            initialize dest_high to zero rather than copies of the sign
9399            bit from B.  Furthermore, we need to use a logical right shift
9400            in this case.
9401
9402            The choice of sign-extension versus zero-extension is
9403            determined entirely by whether or not B is signed and is
9404            independent of the current setting of unsignedp.  */
9405
9406         temp = NULL_RTX;
9407         if (code == LSHIFT_EXPR
9408             && target
9409             && REG_P (target)
9410             && GET_MODE_2XWIDER_MODE (word_mode).exists (&int_mode)
9411             && mode == int_mode
9412             && TREE_CONSTANT (treeop1)
9413             && TREE_CODE (treeop0) == SSA_NAME)
9414           {
9415             gimple *def = SSA_NAME_DEF_STMT (treeop0);
9416             if (is_gimple_assign (def)
9417                 && gimple_assign_rhs_code (def) == NOP_EXPR)
9418               {
9419                 scalar_int_mode rmode = SCALAR_INT_TYPE_MODE
9420                   (TREE_TYPE (gimple_assign_rhs1 (def)));
9421
9422                 if (GET_MODE_SIZE (rmode) < GET_MODE_SIZE (int_mode)
9423                     && TREE_INT_CST_LOW (treeop1) < GET_MODE_BITSIZE (word_mode)
9424                     && ((TREE_INT_CST_LOW (treeop1) + GET_MODE_BITSIZE (rmode))
9425                         >= GET_MODE_BITSIZE (word_mode)))
9426                   {
9427                     rtx_insn *seq, *seq_old;
9428                     poly_uint64 high_off = subreg_highpart_offset (word_mode,
9429                                                                    int_mode);
9430                     bool extend_unsigned
9431                       = TYPE_UNSIGNED (TREE_TYPE (gimple_assign_rhs1 (def)));
9432                     rtx low = lowpart_subreg (word_mode, op0, int_mode);
9433                     rtx dest_low = lowpart_subreg (word_mode, target, int_mode);
9434                     rtx dest_high = simplify_gen_subreg (word_mode, target,
9435                                                          int_mode, high_off);
9436                     HOST_WIDE_INT ramount = (BITS_PER_WORD
9437                                              - TREE_INT_CST_LOW (treeop1));
9438                     tree rshift = build_int_cst (TREE_TYPE (treeop1), ramount);
9439
9440                     start_sequence ();
9441                     /* dest_high = src_low >> (word_size - C).  */
9442                     temp = expand_variable_shift (RSHIFT_EXPR, word_mode, low,
9443                                                   rshift, dest_high,
9444                                                   extend_unsigned);
9445                     if (temp != dest_high)
9446                       emit_move_insn (dest_high, temp);
9447
9448                     /* dest_low = src_low << C.  */
9449                     temp = expand_variable_shift (LSHIFT_EXPR, word_mode, low,
9450                                                   treeop1, dest_low, unsignedp);
9451                     if (temp != dest_low)
9452                       emit_move_insn (dest_low, temp);
9453
9454                     seq = get_insns ();
9455                     end_sequence ();
9456                     temp = target ;
9457
9458                     if (have_insn_for (ASHIFT, int_mode))
9459                       {
9460                         bool speed_p = optimize_insn_for_speed_p ();
9461                         start_sequence ();
9462                         rtx ret_old = expand_variable_shift (code, int_mode,
9463                                                              op0, treeop1,
9464                                                              target,
9465                                                              unsignedp);
9466
9467                         seq_old = get_insns ();
9468                         end_sequence ();
9469                         if (seq_cost (seq, speed_p)
9470                             >= seq_cost (seq_old, speed_p))
9471                           {
9472                             seq = seq_old;
9473                             temp = ret_old;
9474                           }
9475                       }
9476                       emit_insn (seq);
9477                   }
9478               }
9479           }
9480
9481         if (temp == NULL_RTX)
9482           temp = expand_variable_shift (code, mode, op0, treeop1, target,
9483                                         unsignedp);
9484         if (code == LSHIFT_EXPR)
9485           temp = REDUCE_BIT_FIELD (temp);
9486         return temp;
9487       }
9488
9489       /* Could determine the answer when only additive constants differ.  Also,
9490          the addition of one can be handled by changing the condition.  */
9491     case LT_EXPR:
9492     case LE_EXPR:
9493     case GT_EXPR:
9494     case GE_EXPR:
9495     case EQ_EXPR:
9496     case NE_EXPR:
9497     case UNORDERED_EXPR:
9498     case ORDERED_EXPR:
9499     case UNLT_EXPR:
9500     case UNLE_EXPR:
9501     case UNGT_EXPR:
9502     case UNGE_EXPR:
9503     case UNEQ_EXPR:
9504     case LTGT_EXPR:
9505       {
9506         temp = do_store_flag (ops,
9507                               modifier != EXPAND_STACK_PARM ? target : NULL_RTX,
9508                               tmode != VOIDmode ? tmode : mode);
9509         if (temp)
9510           return temp;
9511
9512         /* Use a compare and a jump for BLKmode comparisons, or for function
9513            type comparisons is have_canonicalize_funcptr_for_compare.  */
9514
9515         if ((target == 0
9516              || modifier == EXPAND_STACK_PARM
9517              || ! safe_from_p (target, treeop0, 1)
9518              || ! safe_from_p (target, treeop1, 1)
9519              /* Make sure we don't have a hard reg (such as function's return
9520                 value) live across basic blocks, if not optimizing.  */
9521              || (!optimize && REG_P (target)
9522                  && REGNO (target) < FIRST_PSEUDO_REGISTER)))
9523           target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
9524
9525         emit_move_insn (target, const0_rtx);
9526
9527         rtx_code_label *lab1 = gen_label_rtx ();
9528         jumpifnot_1 (code, treeop0, treeop1, lab1,
9529                      profile_probability::uninitialized ());
9530
9531         if (TYPE_PRECISION (type) == 1 && !TYPE_UNSIGNED (type))
9532           emit_move_insn (target, constm1_rtx);
9533         else
9534           emit_move_insn (target, const1_rtx);
9535
9536         emit_label (lab1);
9537         return target;
9538       }
9539     case COMPLEX_EXPR:
9540       /* Get the rtx code of the operands.  */
9541       op0 = expand_normal (treeop0);
9542       op1 = expand_normal (treeop1);
9543
9544       if (!target)
9545         target = gen_reg_rtx (TYPE_MODE (type));
9546       else
9547         /* If target overlaps with op1, then either we need to force
9548            op1 into a pseudo (if target also overlaps with op0),
9549            or write the complex parts in reverse order.  */
9550         switch (GET_CODE (target))
9551           {
9552           case CONCAT:
9553             if (reg_overlap_mentioned_p (XEXP (target, 0), op1))
9554               {
9555                 if (reg_overlap_mentioned_p (XEXP (target, 1), op0))
9556                   {
9557                   complex_expr_force_op1:
9558                     temp = gen_reg_rtx (GET_MODE_INNER (GET_MODE (target)));
9559                     emit_move_insn (temp, op1);
9560                     op1 = temp;
9561                     break;
9562                   }
9563               complex_expr_swap_order:
9564                 /* Move the imaginary (op1) and real (op0) parts to their
9565                    location.  */
9566                 write_complex_part (target, op1, true);
9567                 write_complex_part (target, op0, false);
9568
9569                 return target;
9570               }
9571             break;
9572           case MEM:
9573             temp = adjust_address_nv (target,
9574                                       GET_MODE_INNER (GET_MODE (target)), 0);
9575             if (reg_overlap_mentioned_p (temp, op1))
9576               {
9577                 scalar_mode imode = GET_MODE_INNER (GET_MODE (target));
9578                 temp = adjust_address_nv (target, imode,
9579                                           GET_MODE_SIZE (imode));
9580                 if (reg_overlap_mentioned_p (temp, op0))
9581                   goto complex_expr_force_op1;
9582                 goto complex_expr_swap_order;
9583               }
9584             break;
9585           default:
9586             if (reg_overlap_mentioned_p (target, op1))
9587               {
9588                 if (reg_overlap_mentioned_p (target, op0))
9589                   goto complex_expr_force_op1;
9590                 goto complex_expr_swap_order;
9591               }
9592             break;
9593           }
9594
9595       /* Move the real (op0) and imaginary (op1) parts to their location.  */
9596       write_complex_part (target, op0, false);
9597       write_complex_part (target, op1, true);
9598
9599       return target;
9600
9601     case WIDEN_SUM_EXPR:
9602       {
9603         tree oprnd0 = treeop0;
9604         tree oprnd1 = treeop1;
9605
9606         expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
9607         target = expand_widen_pattern_expr (ops, op0, NULL_RTX, op1,
9608                                             target, unsignedp);
9609         return target;
9610       }
9611
9612     case VEC_UNPACK_HI_EXPR:
9613     case VEC_UNPACK_LO_EXPR:
9614     case VEC_UNPACK_FIX_TRUNC_HI_EXPR:
9615     case VEC_UNPACK_FIX_TRUNC_LO_EXPR:
9616       {
9617         op0 = expand_normal (treeop0);
9618         temp = expand_widen_pattern_expr (ops, op0, NULL_RTX, NULL_RTX,
9619                                           target, unsignedp);
9620         gcc_assert (temp);
9621         return temp;
9622       }
9623
9624     case VEC_UNPACK_FLOAT_HI_EXPR:
9625     case VEC_UNPACK_FLOAT_LO_EXPR:
9626       {
9627         op0 = expand_normal (treeop0);
9628         /* The signedness is determined from input operand.  */
9629         temp = expand_widen_pattern_expr
9630           (ops, op0, NULL_RTX, NULL_RTX,
9631            target, TYPE_UNSIGNED (TREE_TYPE (treeop0)));
9632
9633         gcc_assert (temp);
9634         return temp;
9635       }
9636
9637     case VEC_WIDEN_MULT_HI_EXPR:
9638     case VEC_WIDEN_MULT_LO_EXPR:
9639     case VEC_WIDEN_MULT_EVEN_EXPR:
9640     case VEC_WIDEN_MULT_ODD_EXPR:
9641     case VEC_WIDEN_LSHIFT_HI_EXPR:
9642     case VEC_WIDEN_LSHIFT_LO_EXPR:
9643       expand_operands (treeop0, treeop1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
9644       target = expand_widen_pattern_expr (ops, op0, op1, NULL_RTX,
9645                                           target, unsignedp);
9646       gcc_assert (target);
9647       return target;
9648
9649     case VEC_PACK_SAT_EXPR:
9650     case VEC_PACK_FIX_TRUNC_EXPR:
9651       mode = TYPE_MODE (TREE_TYPE (treeop0));
9652       goto binop;
9653
9654     case VEC_PACK_TRUNC_EXPR:
9655       if (VECTOR_BOOLEAN_TYPE_P (type)
9656           && VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (treeop0))
9657           && mode == TYPE_MODE (TREE_TYPE (treeop0))
9658           && SCALAR_INT_MODE_P (mode))
9659         {
9660           class expand_operand eops[4];
9661           machine_mode imode = TYPE_MODE (TREE_TYPE (treeop0));
9662           expand_operands (treeop0, treeop1,
9663                            subtarget, &op0, &op1, EXPAND_NORMAL);
9664           this_optab = vec_pack_sbool_trunc_optab;
9665           enum insn_code icode = optab_handler (this_optab, imode);
9666           create_output_operand (&eops[0], target, mode);
9667           create_convert_operand_from (&eops[1], op0, imode, false);
9668           create_convert_operand_from (&eops[2], op1, imode, false);
9669           temp = GEN_INT (TYPE_VECTOR_SUBPARTS (type).to_constant ());
9670           create_input_operand (&eops[3], temp, imode);
9671           expand_insn (icode, 4, eops);
9672           return eops[0].value;
9673         }
9674       mode = TYPE_MODE (TREE_TYPE (treeop0));
9675       goto binop;
9676
9677     case VEC_PACK_FLOAT_EXPR:
9678       mode = TYPE_MODE (TREE_TYPE (treeop0));
9679       expand_operands (treeop0, treeop1,
9680                        subtarget, &op0, &op1, EXPAND_NORMAL);
9681       this_optab = optab_for_tree_code (code, TREE_TYPE (treeop0),
9682                                         optab_default);
9683       target = expand_binop (mode, this_optab, op0, op1, target,
9684                              TYPE_UNSIGNED (TREE_TYPE (treeop0)),
9685                              OPTAB_LIB_WIDEN);
9686       gcc_assert (target);
9687       return target;
9688
9689     case VEC_PERM_EXPR:
9690       {
9691         expand_operands (treeop0, treeop1, target, &op0, &op1, EXPAND_NORMAL);
9692         vec_perm_builder sel;
9693         if (TREE_CODE (treeop2) == VECTOR_CST
9694             && tree_to_vec_perm_builder (&sel, treeop2))
9695           {
9696             machine_mode sel_mode = TYPE_MODE (TREE_TYPE (treeop2));
9697             temp = expand_vec_perm_const (mode, op0, op1, sel,
9698                                           sel_mode, target);
9699           }
9700         else
9701           {
9702             op2 = expand_normal (treeop2);
9703             temp = expand_vec_perm_var (mode, op0, op1, op2, target);
9704           }
9705         gcc_assert (temp);
9706         return temp;
9707       }
9708
9709     case DOT_PROD_EXPR:
9710       {
9711         tree oprnd0 = treeop0;
9712         tree oprnd1 = treeop1;
9713         tree oprnd2 = treeop2;
9714
9715         expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
9716         op2 = expand_normal (oprnd2);
9717         target = expand_widen_pattern_expr (ops, op0, op1, op2,
9718                                             target, unsignedp);
9719         return target;
9720       }
9721
9722       case SAD_EXPR:
9723       {
9724         tree oprnd0 = treeop0;
9725         tree oprnd1 = treeop1;
9726         tree oprnd2 = treeop2;
9727
9728         expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
9729         op2 = expand_normal (oprnd2);
9730         target = expand_widen_pattern_expr (ops, op0, op1, op2,
9731                                             target, unsignedp);
9732         return target;
9733       }
9734
9735     case REALIGN_LOAD_EXPR:
9736       {
9737         tree oprnd0 = treeop0;
9738         tree oprnd1 = treeop1;
9739         tree oprnd2 = treeop2;
9740
9741         this_optab = optab_for_tree_code (code, type, optab_default);
9742         expand_operands (oprnd0, oprnd1, NULL_RTX, &op0, &op1, EXPAND_NORMAL);
9743         op2 = expand_normal (oprnd2);
9744         temp = expand_ternary_op (mode, this_optab, op0, op1, op2,
9745                                   target, unsignedp);
9746         gcc_assert (temp);
9747         return temp;
9748       }
9749
9750     case COND_EXPR:
9751       {
9752         /* A COND_EXPR with its type being VOID_TYPE represents a
9753            conditional jump and is handled in
9754            expand_gimple_cond_expr.  */
9755         gcc_assert (!VOID_TYPE_P (type));
9756
9757         /* Note that COND_EXPRs whose type is a structure or union
9758            are required to be constructed to contain assignments of
9759            a temporary variable, so that we can evaluate them here
9760            for side effect only.  If type is void, we must do likewise.  */
9761
9762         gcc_assert (!TREE_ADDRESSABLE (type)
9763                     && !ignore
9764                     && TREE_TYPE (treeop1) != void_type_node
9765                     && TREE_TYPE (treeop2) != void_type_node);
9766
9767         temp = expand_cond_expr_using_cmove (treeop0, treeop1, treeop2);
9768         if (temp)
9769           return temp;
9770
9771         /* If we are not to produce a result, we have no target.  Otherwise,
9772            if a target was specified use it; it will not be used as an
9773            intermediate target unless it is safe.  If no target, use a
9774            temporary.  */
9775
9776         if (modifier != EXPAND_STACK_PARM
9777             && original_target
9778             && safe_from_p (original_target, treeop0, 1)
9779             && GET_MODE (original_target) == mode
9780             && !MEM_P (original_target))
9781           temp = original_target;
9782         else
9783           temp = assign_temp (type, 0, 1);
9784
9785         do_pending_stack_adjust ();
9786         NO_DEFER_POP;
9787         rtx_code_label *lab0 = gen_label_rtx ();
9788         rtx_code_label *lab1 = gen_label_rtx ();
9789         jumpifnot (treeop0, lab0,
9790                    profile_probability::uninitialized ());
9791         store_expr (treeop1, temp,
9792                     modifier == EXPAND_STACK_PARM,
9793                     false, false);
9794
9795         emit_jump_insn (targetm.gen_jump (lab1));
9796         emit_barrier ();
9797         emit_label (lab0);
9798         store_expr (treeop2, temp,
9799                     modifier == EXPAND_STACK_PARM,
9800                     false, false);
9801
9802         emit_label (lab1);
9803         OK_DEFER_POP;
9804         return temp;
9805       }
9806
9807     case VEC_COND_EXPR:
9808       target = expand_vec_cond_expr (type, treeop0, treeop1, treeop2, target);
9809       return target;
9810
9811     case VEC_DUPLICATE_EXPR:
9812       op0 = expand_expr (treeop0, NULL_RTX, VOIDmode, modifier);
9813       target = expand_vector_broadcast (mode, op0);
9814       gcc_assert (target);
9815       return target;
9816
9817     case VEC_SERIES_EXPR:
9818       expand_operands (treeop0, treeop1, NULL_RTX, &op0, &op1, modifier);
9819       return expand_vec_series_expr (mode, op0, op1, target);
9820
9821     case BIT_INSERT_EXPR:
9822       {
9823         unsigned bitpos = tree_to_uhwi (treeop2);
9824         unsigned bitsize;
9825         if (INTEGRAL_TYPE_P (TREE_TYPE (treeop1)))
9826           bitsize = TYPE_PRECISION (TREE_TYPE (treeop1));
9827         else
9828           bitsize = tree_to_uhwi (TYPE_SIZE (TREE_TYPE (treeop1)));
9829         op0 = expand_normal (treeop0);
9830         op1 = expand_normal (treeop1);
9831         rtx dst = gen_reg_rtx (mode);
9832         emit_move_insn (dst, op0);
9833         store_bit_field (dst, bitsize, bitpos, 0, 0,
9834                          TYPE_MODE (TREE_TYPE (treeop1)), op1, false);
9835         return dst;
9836       }
9837
9838     default:
9839       gcc_unreachable ();
9840     }
9841
9842   /* Here to do an ordinary binary operator.  */
9843  binop:
9844   expand_operands (treeop0, treeop1,
9845                    subtarget, &op0, &op1, EXPAND_NORMAL);
9846  binop2:
9847   this_optab = optab_for_tree_code (code, type, optab_default);
9848  binop3:
9849   if (modifier == EXPAND_STACK_PARM)
9850     target = 0;
9851   temp = expand_binop (mode, this_optab, op0, op1, target,
9852                        unsignedp, OPTAB_LIB_WIDEN);
9853   gcc_assert (temp);
9854   /* Bitwise operations do not need bitfield reduction as we expect their
9855      operands being properly truncated.  */
9856   if (code == BIT_XOR_EXPR
9857       || code == BIT_AND_EXPR
9858       || code == BIT_IOR_EXPR)
9859     return temp;
9860   return REDUCE_BIT_FIELD (temp);
9861 }
9862 #undef REDUCE_BIT_FIELD
9863
9864
9865 /* Return TRUE if expression STMT is suitable for replacement.  
9866    Never consider memory loads as replaceable, because those don't ever lead 
9867    into constant expressions.  */
9868
9869 static bool
9870 stmt_is_replaceable_p (gimple *stmt)
9871 {
9872   if (ssa_is_replaceable_p (stmt))
9873     {
9874       /* Don't move around loads.  */
9875       if (!gimple_assign_single_p (stmt)
9876           || is_gimple_val (gimple_assign_rhs1 (stmt)))
9877         return true;
9878     }
9879   return false;
9880 }
9881
9882 rtx
9883 expand_expr_real_1 (tree exp, rtx target, machine_mode tmode,
9884                     enum expand_modifier modifier, rtx *alt_rtl,
9885                     bool inner_reference_p)
9886 {
9887   rtx op0, op1, temp, decl_rtl;
9888   tree type;
9889   int unsignedp;
9890   machine_mode mode, dmode;
9891   enum tree_code code = TREE_CODE (exp);
9892   rtx subtarget, original_target;
9893   int ignore;
9894   tree context;
9895   bool reduce_bit_field;
9896   location_t loc = EXPR_LOCATION (exp);
9897   struct separate_ops ops;
9898   tree treeop0, treeop1, treeop2;
9899   tree ssa_name = NULL_TREE;
9900   gimple *g;
9901
9902   type = TREE_TYPE (exp);
9903   mode = TYPE_MODE (type);
9904   unsignedp = TYPE_UNSIGNED (type);
9905
9906   treeop0 = treeop1 = treeop2 = NULL_TREE;
9907   if (!VL_EXP_CLASS_P (exp))
9908     switch (TREE_CODE_LENGTH (code))
9909       {
9910         default:
9911         case 3: treeop2 = TREE_OPERAND (exp, 2); /* FALLTHRU */
9912         case 2: treeop1 = TREE_OPERAND (exp, 1); /* FALLTHRU */
9913         case 1: treeop0 = TREE_OPERAND (exp, 0); /* FALLTHRU */
9914         case 0: break;
9915       }
9916   ops.code = code;
9917   ops.type = type;
9918   ops.op0 = treeop0;
9919   ops.op1 = treeop1;
9920   ops.op2 = treeop2;
9921   ops.location = loc;
9922
9923   ignore = (target == const0_rtx
9924             || ((CONVERT_EXPR_CODE_P (code)
9925                  || code == COND_EXPR || code == VIEW_CONVERT_EXPR)
9926                 && TREE_CODE (type) == VOID_TYPE));
9927
9928   /* An operation in what may be a bit-field type needs the
9929      result to be reduced to the precision of the bit-field type,
9930      which is narrower than that of the type's mode.  */
9931   reduce_bit_field = (!ignore
9932                       && INTEGRAL_TYPE_P (type)
9933                       && !type_has_mode_precision_p (type));
9934
9935   /* If we are going to ignore this result, we need only do something
9936      if there is a side-effect somewhere in the expression.  If there
9937      is, short-circuit the most common cases here.  Note that we must
9938      not call expand_expr with anything but const0_rtx in case this
9939      is an initial expansion of a size that contains a PLACEHOLDER_EXPR.  */
9940
9941   if (ignore)
9942     {
9943       if (! TREE_SIDE_EFFECTS (exp))
9944         return const0_rtx;
9945
9946       /* Ensure we reference a volatile object even if value is ignored, but
9947          don't do this if all we are doing is taking its address.  */
9948       if (TREE_THIS_VOLATILE (exp)
9949           && TREE_CODE (exp) != FUNCTION_DECL
9950           && mode != VOIDmode && mode != BLKmode
9951           && modifier != EXPAND_CONST_ADDRESS)
9952         {
9953           temp = expand_expr (exp, NULL_RTX, VOIDmode, modifier);
9954           if (MEM_P (temp))
9955             copy_to_reg (temp);
9956           return const0_rtx;
9957         }
9958
9959       if (TREE_CODE_CLASS (code) == tcc_unary
9960           || code == BIT_FIELD_REF
9961           || code == COMPONENT_REF
9962           || code == INDIRECT_REF)
9963         return expand_expr (treeop0, const0_rtx, VOIDmode,
9964                             modifier);
9965
9966       else if (TREE_CODE_CLASS (code) == tcc_binary
9967                || TREE_CODE_CLASS (code) == tcc_comparison
9968                || code == ARRAY_REF || code == ARRAY_RANGE_REF)
9969         {
9970           expand_expr (treeop0, const0_rtx, VOIDmode, modifier);
9971           expand_expr (treeop1, const0_rtx, VOIDmode, modifier);
9972           return const0_rtx;
9973         }
9974
9975       target = 0;
9976     }
9977
9978   if (reduce_bit_field && modifier == EXPAND_STACK_PARM)
9979     target = 0;
9980
9981   /* Use subtarget as the target for operand 0 of a binary operation.  */
9982   subtarget = get_subtarget (target);
9983   original_target = target;
9984
9985   switch (code)
9986     {
9987     case LABEL_DECL:
9988       {
9989         tree function = decl_function_context (exp);
9990
9991         temp = label_rtx (exp);
9992         temp = gen_rtx_LABEL_REF (Pmode, temp);
9993
9994         if (function != current_function_decl
9995             && function != 0)
9996           LABEL_REF_NONLOCAL_P (temp) = 1;
9997
9998         temp = gen_rtx_MEM (FUNCTION_MODE, temp);
9999         return temp;
10000       }
10001
10002     case SSA_NAME:
10003       /* ??? ivopts calls expander, without any preparation from
10004          out-of-ssa.  So fake instructions as if this was an access to the
10005          base variable.  This unnecessarily allocates a pseudo, see how we can
10006          reuse it, if partition base vars have it set already.  */
10007       if (!currently_expanding_to_rtl)
10008         {
10009           tree var = SSA_NAME_VAR (exp);
10010           if (var && DECL_RTL_SET_P (var))
10011             return DECL_RTL (var);
10012           return gen_raw_REG (TYPE_MODE (TREE_TYPE (exp)),
10013                               LAST_VIRTUAL_REGISTER + 1);
10014         }
10015
10016       g = get_gimple_for_ssa_name (exp);
10017       /* For EXPAND_INITIALIZER try harder to get something simpler.  */
10018       if (g == NULL
10019           && modifier == EXPAND_INITIALIZER
10020           && !SSA_NAME_IS_DEFAULT_DEF (exp)
10021           && (optimize || !SSA_NAME_VAR (exp)
10022               || DECL_IGNORED_P (SSA_NAME_VAR (exp)))
10023           && stmt_is_replaceable_p (SSA_NAME_DEF_STMT (exp)))
10024         g = SSA_NAME_DEF_STMT (exp);
10025       if (g)
10026         {
10027           rtx r;
10028           location_t saved_loc = curr_insn_location ();
10029           loc = gimple_location (g);
10030           if (loc != UNKNOWN_LOCATION)
10031             set_curr_insn_location (loc);
10032           ops.code = gimple_assign_rhs_code (g);
10033           switch (get_gimple_rhs_class (ops.code))
10034             {
10035             case GIMPLE_TERNARY_RHS:
10036               ops.op2 = gimple_assign_rhs3 (g);
10037               /* Fallthru */
10038             case GIMPLE_BINARY_RHS:
10039               ops.op1 = gimple_assign_rhs2 (g);
10040
10041               /* Try to expand conditonal compare.  */
10042               if (targetm.gen_ccmp_first)
10043                 {
10044                   gcc_checking_assert (targetm.gen_ccmp_next != NULL);
10045                   r = expand_ccmp_expr (g, mode);
10046                   if (r)
10047                     break;
10048                 }
10049               /* Fallthru */
10050             case GIMPLE_UNARY_RHS:
10051               ops.op0 = gimple_assign_rhs1 (g);
10052               ops.type = TREE_TYPE (gimple_assign_lhs (g));
10053               ops.location = loc;
10054               r = expand_expr_real_2 (&ops, target, tmode, modifier);
10055               break;
10056             case GIMPLE_SINGLE_RHS:
10057               {
10058                 r = expand_expr_real (gimple_assign_rhs1 (g), target,
10059                                       tmode, modifier, alt_rtl,
10060                                       inner_reference_p);
10061                 break;
10062               }
10063             default:
10064               gcc_unreachable ();
10065             }
10066           set_curr_insn_location (saved_loc);
10067           if (REG_P (r) && !REG_EXPR (r))
10068             set_reg_attrs_for_decl_rtl (SSA_NAME_VAR (exp), r);
10069           return r;
10070         }
10071
10072       ssa_name = exp;
10073       decl_rtl = get_rtx_for_ssa_name (ssa_name);
10074       exp = SSA_NAME_VAR (ssa_name);
10075       goto expand_decl_rtl;
10076
10077     case PARM_DECL:
10078     case VAR_DECL:
10079       /* If a static var's type was incomplete when the decl was written,
10080          but the type is complete now, lay out the decl now.  */
10081       if (DECL_SIZE (exp) == 0
10082           && COMPLETE_OR_UNBOUND_ARRAY_TYPE_P (TREE_TYPE (exp))
10083           && (TREE_STATIC (exp) || DECL_EXTERNAL (exp)))
10084         layout_decl (exp, 0);
10085
10086       /* fall through */
10087
10088     case FUNCTION_DECL:
10089     case RESULT_DECL:
10090       decl_rtl = DECL_RTL (exp);
10091     expand_decl_rtl:
10092       gcc_assert (decl_rtl);
10093
10094       /* DECL_MODE might change when TYPE_MODE depends on attribute target
10095          settings for VECTOR_TYPE_P that might switch for the function.  */
10096       if (currently_expanding_to_rtl
10097           && code == VAR_DECL && MEM_P (decl_rtl)
10098           && VECTOR_TYPE_P (type) && exp && DECL_MODE (exp) != mode)
10099         decl_rtl = change_address (decl_rtl, TYPE_MODE (type), 0);
10100       else
10101         decl_rtl = copy_rtx (decl_rtl);
10102
10103       /* Record writes to register variables.  */
10104       if (modifier == EXPAND_WRITE
10105           && REG_P (decl_rtl)
10106           && HARD_REGISTER_P (decl_rtl))
10107         add_to_hard_reg_set (&crtl->asm_clobbers,
10108                              GET_MODE (decl_rtl), REGNO (decl_rtl));
10109
10110       /* Ensure variable marked as used even if it doesn't go through
10111          a parser.  If it hasn't be used yet, write out an external
10112          definition.  */
10113       if (exp)
10114         TREE_USED (exp) = 1;
10115
10116       /* Show we haven't gotten RTL for this yet.  */
10117       temp = 0;
10118
10119       /* Variables inherited from containing functions should have
10120          been lowered by this point.  */
10121       if (exp)
10122         context = decl_function_context (exp);
10123       gcc_assert (!exp
10124                   || SCOPE_FILE_SCOPE_P (context)
10125                   || context == current_function_decl
10126                   || TREE_STATIC (exp)
10127                   || DECL_EXTERNAL (exp)
10128                   /* ??? C++ creates functions that are not TREE_STATIC.  */
10129                   || TREE_CODE (exp) == FUNCTION_DECL);
10130
10131       /* This is the case of an array whose size is to be determined
10132          from its initializer, while the initializer is still being parsed.
10133          ??? We aren't parsing while expanding anymore.  */
10134
10135       if (MEM_P (decl_rtl) && REG_P (XEXP (decl_rtl, 0)))
10136         temp = validize_mem (decl_rtl);
10137
10138       /* If DECL_RTL is memory, we are in the normal case and the
10139          address is not valid, get the address into a register.  */
10140
10141       else if (MEM_P (decl_rtl) && modifier != EXPAND_INITIALIZER)
10142         {
10143           if (alt_rtl)
10144             *alt_rtl = decl_rtl;
10145           decl_rtl = use_anchored_address (decl_rtl);
10146           if (modifier != EXPAND_CONST_ADDRESS
10147               && modifier != EXPAND_SUM
10148               && !memory_address_addr_space_p (exp ? DECL_MODE (exp)
10149                                                : GET_MODE (decl_rtl),
10150                                                XEXP (decl_rtl, 0),
10151                                                MEM_ADDR_SPACE (decl_rtl)))
10152             temp = replace_equiv_address (decl_rtl,
10153                                           copy_rtx (XEXP (decl_rtl, 0)));
10154         }
10155
10156       /* If we got something, return it.  But first, set the alignment
10157          if the address is a register.  */
10158       if (temp != 0)
10159         {
10160           if (exp && MEM_P (temp) && REG_P (XEXP (temp, 0)))
10161             mark_reg_pointer (XEXP (temp, 0), DECL_ALIGN (exp));
10162         }
10163       else if (MEM_P (decl_rtl))
10164         temp = decl_rtl;
10165
10166       if (temp != 0)
10167         {
10168           if (MEM_P (temp)
10169               && modifier != EXPAND_WRITE
10170               && modifier != EXPAND_MEMORY
10171               && modifier != EXPAND_INITIALIZER
10172               && modifier != EXPAND_CONST_ADDRESS
10173               && modifier != EXPAND_SUM
10174               && !inner_reference_p
10175               && mode != BLKmode
10176               && MEM_ALIGN (temp) < GET_MODE_ALIGNMENT (mode))
10177             temp = expand_misaligned_mem_ref (temp, mode, unsignedp,
10178                                               MEM_ALIGN (temp), NULL_RTX, NULL);
10179
10180           return temp;
10181         }
10182
10183       if (exp)
10184         dmode = DECL_MODE (exp);
10185       else
10186         dmode = TYPE_MODE (TREE_TYPE (ssa_name));
10187
10188       /* If the mode of DECL_RTL does not match that of the decl,
10189          there are two cases: we are dealing with a BLKmode value
10190          that is returned in a register, or we are dealing with
10191          a promoted value.  In the latter case, return a SUBREG
10192          of the wanted mode, but mark it so that we know that it
10193          was already extended.  */
10194       if (REG_P (decl_rtl)
10195           && dmode != BLKmode
10196           && GET_MODE (decl_rtl) != dmode)
10197         {
10198           machine_mode pmode;
10199
10200           /* Get the signedness to be used for this variable.  Ensure we get
10201              the same mode we got when the variable was declared.  */
10202           if (code != SSA_NAME)
10203             pmode = promote_decl_mode (exp, &unsignedp);
10204           else if ((g = SSA_NAME_DEF_STMT (ssa_name))
10205                    && gimple_code (g) == GIMPLE_CALL
10206                    && !gimple_call_internal_p (g))
10207             pmode = promote_function_mode (type, mode, &unsignedp,
10208                                            gimple_call_fntype (g),
10209                                            2);
10210           else
10211             pmode = promote_ssa_mode (ssa_name, &unsignedp);
10212           gcc_assert (GET_MODE (decl_rtl) == pmode);
10213
10214           temp = gen_lowpart_SUBREG (mode, decl_rtl);
10215           SUBREG_PROMOTED_VAR_P (temp) = 1;
10216           SUBREG_PROMOTED_SET (temp, unsignedp);
10217           return temp;
10218         }
10219
10220       return decl_rtl;
10221
10222     case INTEGER_CST:
10223       {
10224         /* Given that TYPE_PRECISION (type) is not always equal to
10225            GET_MODE_PRECISION (TYPE_MODE (type)), we need to extend from
10226            the former to the latter according to the signedness of the
10227            type.  */
10228         scalar_int_mode int_mode = SCALAR_INT_TYPE_MODE (type);
10229         temp = immed_wide_int_const
10230           (wi::to_wide (exp, GET_MODE_PRECISION (int_mode)), int_mode);
10231         return temp;
10232       }
10233
10234     case VECTOR_CST:
10235       {
10236         tree tmp = NULL_TREE;
10237         if (VECTOR_MODE_P (mode))
10238           return const_vector_from_tree (exp);
10239         scalar_int_mode int_mode;
10240         if (is_int_mode (mode, &int_mode))
10241           {
10242             if (VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (exp)))
10243               return const_scalar_mask_from_tree (int_mode, exp);
10244             else
10245               {
10246                 tree type_for_mode
10247                   = lang_hooks.types.type_for_mode (int_mode, 1);
10248                 if (type_for_mode)
10249                   tmp = fold_unary_loc (loc, VIEW_CONVERT_EXPR,
10250                                         type_for_mode, exp);
10251               }
10252           }
10253         if (!tmp)
10254           {
10255             vec<constructor_elt, va_gc> *v;
10256             /* Constructors need to be fixed-length.  FIXME.  */
10257             unsigned int nunits = VECTOR_CST_NELTS (exp).to_constant ();
10258             vec_alloc (v, nunits);
10259             for (unsigned int i = 0; i < nunits; ++i)
10260               CONSTRUCTOR_APPEND_ELT (v, NULL_TREE, VECTOR_CST_ELT (exp, i));
10261             tmp = build_constructor (type, v);
10262           }
10263         return expand_expr (tmp, ignore ? const0_rtx : target,
10264                             tmode, modifier);
10265       }
10266
10267     case CONST_DECL:
10268       if (modifier == EXPAND_WRITE)
10269         {
10270           /* Writing into CONST_DECL is always invalid, but handle it
10271              gracefully.  */
10272           addr_space_t as = TYPE_ADDR_SPACE (TREE_TYPE (exp));
10273           scalar_int_mode address_mode = targetm.addr_space.address_mode (as);
10274           op0 = expand_expr_addr_expr_1 (exp, NULL_RTX, address_mode,
10275                                          EXPAND_NORMAL, as);
10276           op0 = memory_address_addr_space (mode, op0, as);
10277           temp = gen_rtx_MEM (mode, op0);
10278           set_mem_addr_space (temp, as);
10279           return temp;
10280         }
10281       return expand_expr (DECL_INITIAL (exp), target, VOIDmode, modifier);
10282
10283     case REAL_CST:
10284       /* If optimized, generate immediate CONST_DOUBLE
10285          which will be turned into memory by reload if necessary.
10286
10287          We used to force a register so that loop.c could see it.  But
10288          this does not allow gen_* patterns to perform optimizations with
10289          the constants.  It also produces two insns in cases like "x = 1.0;".
10290          On most machines, floating-point constants are not permitted in
10291          many insns, so we'd end up copying it to a register in any case.
10292
10293          Now, we do the copying in expand_binop, if appropriate.  */
10294       return const_double_from_real_value (TREE_REAL_CST (exp),
10295                                            TYPE_MODE (TREE_TYPE (exp)));
10296
10297     case FIXED_CST:
10298       return CONST_FIXED_FROM_FIXED_VALUE (TREE_FIXED_CST (exp),
10299                                            TYPE_MODE (TREE_TYPE (exp)));
10300
10301     case COMPLEX_CST:
10302       /* Handle evaluating a complex constant in a CONCAT target.  */
10303       if (original_target && GET_CODE (original_target) == CONCAT)
10304         {
10305           rtx rtarg, itarg;
10306
10307           mode = TYPE_MODE (TREE_TYPE (TREE_TYPE (exp)));
10308           rtarg = XEXP (original_target, 0);
10309           itarg = XEXP (original_target, 1);
10310
10311           /* Move the real and imaginary parts separately.  */
10312           op0 = expand_expr (TREE_REALPART (exp), rtarg, mode, EXPAND_NORMAL);
10313           op1 = expand_expr (TREE_IMAGPART (exp), itarg, mode, EXPAND_NORMAL);
10314
10315           if (op0 != rtarg)
10316             emit_move_insn (rtarg, op0);
10317           if (op1 != itarg)
10318             emit_move_insn (itarg, op1);
10319
10320           return original_target;
10321         }
10322
10323       /* fall through */
10324
10325     case STRING_CST:
10326       temp = expand_expr_constant (exp, 1, modifier);
10327
10328       /* temp contains a constant address.
10329          On RISC machines where a constant address isn't valid,
10330          make some insns to get that address into a register.  */
10331       if (modifier != EXPAND_CONST_ADDRESS
10332           && modifier != EXPAND_INITIALIZER
10333           && modifier != EXPAND_SUM
10334           && ! memory_address_addr_space_p (mode, XEXP (temp, 0),
10335                                             MEM_ADDR_SPACE (temp)))
10336         return replace_equiv_address (temp,
10337                                       copy_rtx (XEXP (temp, 0)));
10338       return temp;
10339
10340     case POLY_INT_CST:
10341       return immed_wide_int_const (poly_int_cst_value (exp), mode);
10342
10343     case SAVE_EXPR:
10344       {
10345         tree val = treeop0;
10346         rtx ret = expand_expr_real_1 (val, target, tmode, modifier, alt_rtl,
10347                                       inner_reference_p);
10348
10349         if (!SAVE_EXPR_RESOLVED_P (exp))
10350           {
10351             /* We can indeed still hit this case, typically via builtin
10352                expanders calling save_expr immediately before expanding
10353                something.  Assume this means that we only have to deal
10354                with non-BLKmode values.  */
10355             gcc_assert (GET_MODE (ret) != BLKmode);
10356
10357             val = build_decl (curr_insn_location (),
10358                               VAR_DECL, NULL, TREE_TYPE (exp));
10359             DECL_ARTIFICIAL (val) = 1;
10360             DECL_IGNORED_P (val) = 1;
10361             treeop0 = val;
10362             TREE_OPERAND (exp, 0) = treeop0;
10363             SAVE_EXPR_RESOLVED_P (exp) = 1;
10364
10365             if (!CONSTANT_P (ret))
10366               ret = copy_to_reg (ret);
10367             SET_DECL_RTL (val, ret);
10368           }
10369
10370         return ret;
10371       }
10372
10373
10374     case CONSTRUCTOR:
10375       /* If we don't need the result, just ensure we evaluate any
10376          subexpressions.  */
10377       if (ignore)
10378         {
10379           unsigned HOST_WIDE_INT idx;
10380           tree value;
10381
10382           FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value)
10383             expand_expr (value, const0_rtx, VOIDmode, EXPAND_NORMAL);
10384
10385           return const0_rtx;
10386         }
10387
10388       return expand_constructor (exp, target, modifier, false);
10389
10390     case TARGET_MEM_REF:
10391       {
10392         addr_space_t as
10393           = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0))));
10394         unsigned int align;
10395
10396         op0 = addr_for_mem_ref (exp, as, true);
10397         op0 = memory_address_addr_space (mode, op0, as);
10398         temp = gen_rtx_MEM (mode, op0);
10399         set_mem_attributes (temp, exp, 0);
10400         set_mem_addr_space (temp, as);
10401         align = get_object_alignment (exp);
10402         if (modifier != EXPAND_WRITE
10403             && modifier != EXPAND_MEMORY
10404             && mode != BLKmode
10405             && align < GET_MODE_ALIGNMENT (mode))
10406           temp = expand_misaligned_mem_ref (temp, mode, unsignedp,
10407                                             align, NULL_RTX, NULL);
10408         return temp;
10409       }
10410
10411     case MEM_REF:
10412       {
10413         const bool reverse = REF_REVERSE_STORAGE_ORDER (exp);
10414         addr_space_t as
10415           = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (TREE_OPERAND (exp, 0))));
10416         machine_mode address_mode;
10417         tree base = TREE_OPERAND (exp, 0);
10418         gimple *def_stmt;
10419         unsigned align;
10420         /* Handle expansion of non-aliased memory with non-BLKmode.  That
10421            might end up in a register.  */
10422         if (mem_ref_refers_to_non_mem_p (exp))
10423           {
10424             poly_int64 offset = mem_ref_offset (exp).force_shwi ();
10425             base = TREE_OPERAND (base, 0);
10426             poly_uint64 type_size;
10427             if (known_eq (offset, 0)
10428                 && !reverse
10429                 && poly_int_tree_p (TYPE_SIZE (type), &type_size)
10430                 && known_eq (GET_MODE_BITSIZE (DECL_MODE (base)), type_size))
10431               return expand_expr (build1 (VIEW_CONVERT_EXPR, type, base),
10432                                   target, tmode, modifier);
10433             if (TYPE_MODE (type) == BLKmode)
10434               {
10435                 temp = assign_stack_temp (DECL_MODE (base),
10436                                           GET_MODE_SIZE (DECL_MODE (base)));
10437                 store_expr (base, temp, 0, false, false);
10438                 temp = adjust_address (temp, BLKmode, offset);
10439                 set_mem_size (temp, int_size_in_bytes (type));
10440                 return temp;
10441               }
10442             exp = build3 (BIT_FIELD_REF, type, base, TYPE_SIZE (type),
10443                           bitsize_int (offset * BITS_PER_UNIT));
10444             REF_REVERSE_STORAGE_ORDER (exp) = reverse;
10445             return expand_expr (exp, target, tmode, modifier);
10446           }
10447         address_mode = targetm.addr_space.address_mode (as);
10448         if ((def_stmt = get_def_for_expr (base, BIT_AND_EXPR)))
10449           {
10450             tree mask = gimple_assign_rhs2 (def_stmt);
10451             base = build2 (BIT_AND_EXPR, TREE_TYPE (base),
10452                            gimple_assign_rhs1 (def_stmt), mask);
10453             TREE_OPERAND (exp, 0) = base;
10454           }
10455         align = get_object_alignment (exp);
10456         op0 = expand_expr (base, NULL_RTX, VOIDmode, EXPAND_SUM);
10457         op0 = memory_address_addr_space (mode, op0, as);
10458         if (!integer_zerop (TREE_OPERAND (exp, 1)))
10459           {
10460             rtx off = immed_wide_int_const (mem_ref_offset (exp), address_mode);
10461             op0 = simplify_gen_binary (PLUS, address_mode, op0, off);
10462             op0 = memory_address_addr_space (mode, op0, as);
10463           }
10464         temp = gen_rtx_MEM (mode, op0);
10465         set_mem_attributes (temp, exp, 0);
10466         set_mem_addr_space (temp, as);
10467         if (TREE_THIS_VOLATILE (exp))
10468           MEM_VOLATILE_P (temp) = 1;
10469         if (modifier != EXPAND_WRITE
10470             && modifier != EXPAND_MEMORY
10471             && !inner_reference_p
10472             && mode != BLKmode
10473             && align < GET_MODE_ALIGNMENT (mode))
10474           temp = expand_misaligned_mem_ref (temp, mode, unsignedp, align,
10475                                             modifier == EXPAND_STACK_PARM
10476                                             ? NULL_RTX : target, alt_rtl);
10477         if (reverse
10478             && modifier != EXPAND_MEMORY
10479             && modifier != EXPAND_WRITE)
10480           temp = flip_storage_order (mode, temp);
10481         return temp;
10482       }
10483
10484     case ARRAY_REF:
10485
10486       {
10487         tree array = treeop0;
10488         tree index = treeop1;
10489         tree init;
10490
10491         /* Fold an expression like: "foo"[2].
10492            This is not done in fold so it won't happen inside &.
10493            Don't fold if this is for wide characters since it's too
10494            difficult to do correctly and this is a very rare case.  */
10495
10496         if (modifier != EXPAND_CONST_ADDRESS
10497             && modifier != EXPAND_INITIALIZER
10498             && modifier != EXPAND_MEMORY)
10499           {
10500             tree t = fold_read_from_constant_string (exp);
10501
10502             if (t)
10503               return expand_expr (t, target, tmode, modifier);
10504           }
10505
10506         /* If this is a constant index into a constant array,
10507            just get the value from the array.  Handle both the cases when
10508            we have an explicit constructor and when our operand is a variable
10509            that was declared const.  */
10510
10511         if (modifier != EXPAND_CONST_ADDRESS
10512             && modifier != EXPAND_INITIALIZER
10513             && modifier != EXPAND_MEMORY
10514             && TREE_CODE (array) == CONSTRUCTOR
10515             && ! TREE_SIDE_EFFECTS (array)
10516             && TREE_CODE (index) == INTEGER_CST)
10517           {
10518             unsigned HOST_WIDE_INT ix;
10519             tree field, value;
10520
10521             FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (array), ix,
10522                                       field, value)
10523               if (tree_int_cst_equal (field, index))
10524                 {
10525                   if (!TREE_SIDE_EFFECTS (value))
10526                     return expand_expr (fold (value), target, tmode, modifier);
10527                   break;
10528                 }
10529           }
10530
10531         else if (optimize >= 1
10532                  && modifier != EXPAND_CONST_ADDRESS
10533                  && modifier != EXPAND_INITIALIZER
10534                  && modifier != EXPAND_MEMORY
10535                  && TREE_READONLY (array) && ! TREE_SIDE_EFFECTS (array)
10536                  && TREE_CODE (index) == INTEGER_CST
10537                  && (VAR_P (array) || TREE_CODE (array) == CONST_DECL)
10538                  && (init = ctor_for_folding (array)) != error_mark_node)
10539           {
10540             if (init == NULL_TREE)
10541               {
10542                 tree value = build_zero_cst (type);
10543                 if (TREE_CODE (value) == CONSTRUCTOR)
10544                   {
10545                     /* If VALUE is a CONSTRUCTOR, this optimization is only
10546                        useful if this doesn't store the CONSTRUCTOR into
10547                        memory.  If it does, it is more efficient to just
10548                        load the data from the array directly.  */
10549                     rtx ret = expand_constructor (value, target,
10550                                                   modifier, true);
10551                     if (ret == NULL_RTX)
10552                       value = NULL_TREE;
10553                   }
10554
10555                 if (value)
10556                   return expand_expr (value, target, tmode, modifier);
10557               }
10558             else if (TREE_CODE (init) == CONSTRUCTOR)
10559               {
10560                 unsigned HOST_WIDE_INT ix;
10561                 tree field, value;
10562
10563                 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (init), ix,
10564                                           field, value)
10565                   if (tree_int_cst_equal (field, index))
10566                     {
10567                       if (TREE_SIDE_EFFECTS (value))
10568                         break;
10569
10570                       if (TREE_CODE (value) == CONSTRUCTOR)
10571                         {
10572                           /* If VALUE is a CONSTRUCTOR, this
10573                              optimization is only useful if
10574                              this doesn't store the CONSTRUCTOR
10575                              into memory.  If it does, it is more
10576                              efficient to just load the data from
10577                              the array directly.  */
10578                           rtx ret = expand_constructor (value, target,
10579                                                         modifier, true);
10580                           if (ret == NULL_RTX)
10581                             break;
10582                         }
10583
10584                       return
10585                         expand_expr (fold (value), target, tmode, modifier);
10586                     }
10587               }
10588             else if (TREE_CODE (init) == STRING_CST)
10589               {
10590                 tree low_bound = array_ref_low_bound (exp);
10591                 tree index1 = fold_convert_loc (loc, sizetype, treeop1);
10592
10593                 /* Optimize the special case of a zero lower bound.
10594
10595                    We convert the lower bound to sizetype to avoid problems
10596                    with constant folding.  E.g. suppose the lower bound is
10597                    1 and its mode is QI.  Without the conversion
10598                       (ARRAY + (INDEX - (unsigned char)1))
10599                    becomes
10600                       (ARRAY + (-(unsigned char)1) + INDEX)
10601                    which becomes
10602                       (ARRAY + 255 + INDEX).  Oops!  */
10603                 if (!integer_zerop (low_bound))
10604                   index1 = size_diffop_loc (loc, index1,
10605                                             fold_convert_loc (loc, sizetype,
10606                                                               low_bound));
10607
10608                 if (tree_fits_uhwi_p (index1)
10609                     && compare_tree_int (index1, TREE_STRING_LENGTH (init)) < 0)
10610                   {
10611                     tree char_type = TREE_TYPE (TREE_TYPE (init));
10612                     scalar_int_mode char_mode;
10613
10614                     if (is_int_mode (TYPE_MODE (char_type), &char_mode)
10615                         && GET_MODE_SIZE (char_mode) == 1)
10616                       return gen_int_mode (TREE_STRING_POINTER (init)
10617                                            [TREE_INT_CST_LOW (index1)],
10618                                            char_mode);
10619                   }
10620               }
10621           }
10622       }
10623       goto normal_inner_ref;
10624
10625     case COMPONENT_REF:
10626       /* If the operand is a CONSTRUCTOR, we can just extract the
10627          appropriate field if it is present.  */
10628       if (TREE_CODE (treeop0) == CONSTRUCTOR)
10629         {
10630           unsigned HOST_WIDE_INT idx;
10631           tree field, value;
10632           scalar_int_mode field_mode;
10633
10634           FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (treeop0),
10635                                     idx, field, value)
10636             if (field == treeop1
10637                 /* We can normally use the value of the field in the
10638                    CONSTRUCTOR.  However, if this is a bitfield in
10639                    an integral mode that we can fit in a HOST_WIDE_INT,
10640                    we must mask only the number of bits in the bitfield,
10641                    since this is done implicitly by the constructor.  If
10642                    the bitfield does not meet either of those conditions,
10643                    we can't do this optimization.  */
10644                 && (! DECL_BIT_FIELD (field)
10645                     || (is_int_mode (DECL_MODE (field), &field_mode)
10646                         && (GET_MODE_PRECISION (field_mode)
10647                             <= HOST_BITS_PER_WIDE_INT))))
10648               {
10649                 if (DECL_BIT_FIELD (field)
10650                     && modifier == EXPAND_STACK_PARM)
10651                   target = 0;
10652                 op0 = expand_expr (value, target, tmode, modifier);
10653                 if (DECL_BIT_FIELD (field))
10654                   {
10655                     HOST_WIDE_INT bitsize = TREE_INT_CST_LOW (DECL_SIZE (field));
10656                     scalar_int_mode imode
10657                       = SCALAR_INT_TYPE_MODE (TREE_TYPE (field));
10658
10659                     if (TYPE_UNSIGNED (TREE_TYPE (field)))
10660                       {
10661                         op1 = gen_int_mode ((HOST_WIDE_INT_1 << bitsize) - 1,
10662                                             imode);
10663                         op0 = expand_and (imode, op0, op1, target);
10664                       }
10665                     else
10666                       {
10667                         int count = GET_MODE_PRECISION (imode) - bitsize;
10668
10669                         op0 = expand_shift (LSHIFT_EXPR, imode, op0, count,
10670                                             target, 0);
10671                         op0 = expand_shift (RSHIFT_EXPR, imode, op0, count,
10672                                             target, 0);
10673                       }
10674                   }
10675
10676                 return op0;
10677               }
10678         }
10679       goto normal_inner_ref;
10680
10681     case BIT_FIELD_REF:
10682     case ARRAY_RANGE_REF:
10683     normal_inner_ref:
10684       {
10685         machine_mode mode1, mode2;
10686         poly_int64 bitsize, bitpos, bytepos;
10687         tree offset;
10688         int reversep, volatilep = 0, must_force_mem;
10689         tree tem
10690           = get_inner_reference (exp, &bitsize, &bitpos, &offset, &mode1,
10691                                  &unsignedp, &reversep, &volatilep);
10692         rtx orig_op0, memloc;
10693         bool clear_mem_expr = false;
10694
10695         /* If we got back the original object, something is wrong.  Perhaps
10696            we are evaluating an expression too early.  In any event, don't
10697            infinitely recurse.  */
10698         gcc_assert (tem != exp);
10699
10700         /* If TEM's type is a union of variable size, pass TARGET to the inner
10701            computation, since it will need a temporary and TARGET is known
10702            to have to do.  This occurs in unchecked conversion in Ada.  */
10703         orig_op0 = op0
10704           = expand_expr_real (tem,
10705                               (TREE_CODE (TREE_TYPE (tem)) == UNION_TYPE
10706                                && COMPLETE_TYPE_P (TREE_TYPE (tem))
10707                                && (TREE_CODE (TYPE_SIZE (TREE_TYPE (tem)))
10708                                    != INTEGER_CST)
10709                                && modifier != EXPAND_STACK_PARM
10710                                ? target : NULL_RTX),
10711                               VOIDmode,
10712                               modifier == EXPAND_SUM ? EXPAND_NORMAL : modifier,
10713                               NULL, true);
10714
10715         /* If the field has a mode, we want to access it in the
10716            field's mode, not the computed mode.
10717            If a MEM has VOIDmode (external with incomplete type),
10718            use BLKmode for it instead.  */
10719         if (MEM_P (op0))
10720           {
10721             if (mode1 != VOIDmode)
10722               op0 = adjust_address (op0, mode1, 0);
10723             else if (GET_MODE (op0) == VOIDmode)
10724               op0 = adjust_address (op0, BLKmode, 0);
10725           }
10726
10727         mode2
10728           = CONSTANT_P (op0) ? TYPE_MODE (TREE_TYPE (tem)) : GET_MODE (op0);
10729
10730         /* Make sure bitpos is not negative, it can wreak havoc later.  */
10731         if (maybe_lt (bitpos, 0))
10732           {
10733             gcc_checking_assert (offset == NULL_TREE);
10734             offset = size_int (bits_to_bytes_round_down (bitpos));
10735             bitpos = num_trailing_bits (bitpos);
10736           }
10737
10738         /* If we have either an offset, a BLKmode result, or a reference
10739            outside the underlying object, we must force it to memory.
10740            Such a case can occur in Ada if we have unchecked conversion
10741            of an expression from a scalar type to an aggregate type or
10742            for an ARRAY_RANGE_REF whose type is BLKmode, or if we were
10743            passed a partially uninitialized object or a view-conversion
10744            to a larger size.  */
10745         must_force_mem = (offset
10746                           || mode1 == BLKmode
10747                           || (mode == BLKmode
10748                               && !int_mode_for_size (bitsize, 1).exists ())
10749                           || maybe_gt (bitpos + bitsize,
10750                                        GET_MODE_BITSIZE (mode2)));
10751
10752         /* Handle CONCAT first.  */
10753         if (GET_CODE (op0) == CONCAT && !must_force_mem)
10754           {
10755             if (known_eq (bitpos, 0)
10756                 && known_eq (bitsize, GET_MODE_BITSIZE (GET_MODE (op0)))
10757                 && COMPLEX_MODE_P (mode1)
10758                 && COMPLEX_MODE_P (GET_MODE (op0))
10759                 && (GET_MODE_PRECISION (GET_MODE_INNER (mode1))
10760                     == GET_MODE_PRECISION (GET_MODE_INNER (GET_MODE (op0)))))
10761               {
10762                 if (reversep)
10763                   op0 = flip_storage_order (GET_MODE (op0), op0);
10764                 if (mode1 != GET_MODE (op0))
10765                   {
10766                     rtx parts[2];
10767                     for (int i = 0; i < 2; i++)
10768                       {
10769                         rtx op = read_complex_part (op0, i != 0);
10770                         if (GET_CODE (op) == SUBREG)
10771                           op = force_reg (GET_MODE (op), op);
10772                         temp = gen_lowpart_common (GET_MODE_INNER (mode1), op);
10773                         if (temp)
10774                           op = temp;
10775                         else
10776                           {
10777                             if (!REG_P (op) && !MEM_P (op))
10778                               op = force_reg (GET_MODE (op), op);
10779                             op = gen_lowpart (GET_MODE_INNER (mode1), op);
10780                           }
10781                         parts[i] = op;
10782                       }
10783                     op0 = gen_rtx_CONCAT (mode1, parts[0], parts[1]);
10784                   }
10785                 return op0;
10786               }
10787             if (known_eq (bitpos, 0)
10788                 && known_eq (bitsize,
10789                              GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0))))
10790                 && maybe_ne (bitsize, 0))
10791               {
10792                 op0 = XEXP (op0, 0);
10793                 mode2 = GET_MODE (op0);
10794               }
10795             else if (known_eq (bitpos,
10796                                GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 0))))
10797                      && known_eq (bitsize,
10798                                   GET_MODE_BITSIZE (GET_MODE (XEXP (op0, 1))))
10799                      && maybe_ne (bitpos, 0)
10800                      && maybe_ne (bitsize, 0))
10801               {
10802                 op0 = XEXP (op0, 1);
10803                 bitpos = 0;
10804                 mode2 = GET_MODE (op0);
10805               }
10806             else
10807               /* Otherwise force into memory.  */
10808               must_force_mem = 1;
10809           }
10810
10811         /* If this is a constant, put it in a register if it is a legitimate
10812            constant and we don't need a memory reference.  */
10813         if (CONSTANT_P (op0)
10814             && mode2 != BLKmode
10815             && targetm.legitimate_constant_p (mode2, op0)
10816             && !must_force_mem)
10817           op0 = force_reg (mode2, op0);
10818
10819         /* Otherwise, if this is a constant, try to force it to the constant
10820            pool.  Note that back-ends, e.g. MIPS, may refuse to do so if it
10821            is a legitimate constant.  */
10822         else if (CONSTANT_P (op0) && (memloc = force_const_mem (mode2, op0)))
10823           op0 = validize_mem (memloc);
10824
10825         /* Otherwise, if this is a constant or the object is not in memory
10826            and need be, put it there.  */
10827         else if (CONSTANT_P (op0) || (!MEM_P (op0) && must_force_mem))
10828           {
10829             memloc = assign_temp (TREE_TYPE (tem), 1, 1);
10830             emit_move_insn (memloc, op0);
10831             op0 = memloc;
10832             clear_mem_expr = true;
10833           }
10834
10835         if (offset)
10836           {
10837             machine_mode address_mode;
10838             rtx offset_rtx = expand_expr (offset, NULL_RTX, VOIDmode,
10839                                           EXPAND_SUM);
10840
10841             gcc_assert (MEM_P (op0));
10842
10843             address_mode = get_address_mode (op0);
10844             if (GET_MODE (offset_rtx) != address_mode)
10845               {
10846                 /* We cannot be sure that the RTL in offset_rtx is valid outside
10847                    of a memory address context, so force it into a register
10848                    before attempting to convert it to the desired mode.  */
10849                 offset_rtx = force_operand (offset_rtx, NULL_RTX);
10850                 offset_rtx = convert_to_mode (address_mode, offset_rtx, 0);
10851               }
10852
10853             /* See the comment in expand_assignment for the rationale.  */
10854             if (mode1 != VOIDmode
10855                 && maybe_ne (bitpos, 0)
10856                 && maybe_gt (bitsize, 0)
10857                 && multiple_p (bitpos, BITS_PER_UNIT, &bytepos)
10858                 && multiple_p (bitpos, bitsize)
10859                 && multiple_p (bitsize, GET_MODE_ALIGNMENT (mode1))
10860                 && MEM_ALIGN (op0) >= GET_MODE_ALIGNMENT (mode1))
10861               {
10862                 op0 = adjust_address (op0, mode1, bytepos);
10863                 bitpos = 0;
10864               }
10865
10866             op0 = offset_address (op0, offset_rtx,
10867                                   highest_pow2_factor (offset));
10868           }
10869
10870         /* If OFFSET is making OP0 more aligned than BIGGEST_ALIGNMENT,
10871            record its alignment as BIGGEST_ALIGNMENT.  */
10872         if (MEM_P (op0)
10873             && known_eq (bitpos, 0)
10874             && offset != 0
10875             && is_aligning_offset (offset, tem))
10876           set_mem_align (op0, BIGGEST_ALIGNMENT);
10877
10878         /* Don't forget about volatility even if this is a bitfield.  */
10879         if (MEM_P (op0) && volatilep && ! MEM_VOLATILE_P (op0))
10880           {
10881             if (op0 == orig_op0)
10882               op0 = copy_rtx (op0);
10883
10884             MEM_VOLATILE_P (op0) = 1;
10885           }
10886
10887         if (MEM_P (op0) && TREE_CODE (tem) == FUNCTION_DECL)
10888           {
10889             if (op0 == orig_op0)
10890               op0 = copy_rtx (op0);
10891
10892             set_mem_align (op0, BITS_PER_UNIT);
10893           }
10894
10895         /* In cases where an aligned union has an unaligned object
10896            as a field, we might be extracting a BLKmode value from
10897            an integer-mode (e.g., SImode) object.  Handle this case
10898            by doing the extract into an object as wide as the field
10899            (which we know to be the width of a basic mode), then
10900            storing into memory, and changing the mode to BLKmode.  */
10901         if (mode1 == VOIDmode
10902             || REG_P (op0) || GET_CODE (op0) == SUBREG
10903             || (mode1 != BLKmode && ! direct_load[(int) mode1]
10904                 && GET_MODE_CLASS (mode) != MODE_COMPLEX_INT
10905                 && GET_MODE_CLASS (mode) != MODE_COMPLEX_FLOAT
10906                 && modifier != EXPAND_CONST_ADDRESS
10907                 && modifier != EXPAND_INITIALIZER
10908                 && modifier != EXPAND_MEMORY)
10909             /* If the bitfield is volatile and the bitsize
10910                is narrower than the access size of the bitfield,
10911                we need to extract bitfields from the access.  */
10912             || (volatilep && TREE_CODE (exp) == COMPONENT_REF
10913                 && DECL_BIT_FIELD_TYPE (TREE_OPERAND (exp, 1))
10914                 && mode1 != BLKmode
10915                 && maybe_lt (bitsize, GET_MODE_SIZE (mode1) * BITS_PER_UNIT))
10916             /* If the field isn't aligned enough to fetch as a memref,
10917                fetch it as a bit field.  */
10918             || (mode1 != BLKmode
10919                 && (((MEM_P (op0)
10920                       ? MEM_ALIGN (op0) < GET_MODE_ALIGNMENT (mode1)
10921                         || !multiple_p (bitpos, GET_MODE_ALIGNMENT (mode1))
10922                       : TYPE_ALIGN (TREE_TYPE (tem)) < GET_MODE_ALIGNMENT (mode)
10923                         || !multiple_p (bitpos, GET_MODE_ALIGNMENT (mode)))
10924                      && modifier != EXPAND_MEMORY
10925                      && ((modifier == EXPAND_CONST_ADDRESS
10926                           || modifier == EXPAND_INITIALIZER)
10927                          ? STRICT_ALIGNMENT
10928                          : targetm.slow_unaligned_access (mode1,
10929                                                           MEM_ALIGN (op0))))
10930                     || !multiple_p (bitpos, BITS_PER_UNIT)))
10931             /* If the type and the field are a constant size and the
10932                size of the type isn't the same size as the bitfield,
10933                we must use bitfield operations.  */
10934             || (known_size_p (bitsize)
10935                 && TYPE_SIZE (TREE_TYPE (exp))
10936                 && poly_int_tree_p (TYPE_SIZE (TREE_TYPE (exp)))
10937                 && maybe_ne (wi::to_poly_offset (TYPE_SIZE (TREE_TYPE (exp))),
10938                              bitsize)))
10939           {
10940             machine_mode ext_mode = mode;
10941
10942             if (ext_mode == BLKmode
10943                 && ! (target != 0 && MEM_P (op0)
10944                       && MEM_P (target)
10945                       && multiple_p (bitpos, BITS_PER_UNIT)))
10946               ext_mode = int_mode_for_size (bitsize, 1).else_blk ();
10947
10948             if (ext_mode == BLKmode)
10949               {
10950                 if (target == 0)
10951                   target = assign_temp (type, 1, 1);
10952
10953                 /* ??? Unlike the similar test a few lines below, this one is
10954                    very likely obsolete.  */
10955                 if (known_eq (bitsize, 0))
10956                   return target;
10957
10958                 /* In this case, BITPOS must start at a byte boundary and
10959                    TARGET, if specified, must be a MEM.  */
10960                 gcc_assert (MEM_P (op0)
10961                             && (!target || MEM_P (target)));
10962
10963                 bytepos = exact_div (bitpos, BITS_PER_UNIT);
10964                 poly_int64 bytesize = bits_to_bytes_round_up (bitsize);
10965                 emit_block_move (target,
10966                                  adjust_address (op0, VOIDmode, bytepos),
10967                                  gen_int_mode (bytesize, Pmode),
10968                                  (modifier == EXPAND_STACK_PARM
10969                                   ? BLOCK_OP_CALL_PARM : BLOCK_OP_NORMAL));
10970
10971                 return target;
10972               }
10973
10974             /* If we have nothing to extract, the result will be 0 for targets
10975                with SHIFT_COUNT_TRUNCATED == 0 and garbage otherwise.  Always
10976                return 0 for the sake of consistency, as reading a zero-sized
10977                bitfield is valid in Ada and the value is fully specified.  */
10978             if (known_eq (bitsize, 0))
10979               return const0_rtx;
10980
10981             op0 = validize_mem (op0);
10982
10983             if (MEM_P (op0) && REG_P (XEXP (op0, 0)))
10984               mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));
10985
10986             /* If the result has aggregate type and the extraction is done in
10987                an integral mode, then the field may be not aligned on a byte
10988                boundary; in this case, if it has reverse storage order, it
10989                needs to be extracted as a scalar field with reverse storage
10990                order and put back into memory order afterwards.  */
10991             if (AGGREGATE_TYPE_P (type)
10992                 && GET_MODE_CLASS (ext_mode) == MODE_INT)
10993               reversep = TYPE_REVERSE_STORAGE_ORDER (type);
10994
10995             gcc_checking_assert (known_ge (bitpos, 0));
10996             op0 = extract_bit_field (op0, bitsize, bitpos, unsignedp,
10997                                      (modifier == EXPAND_STACK_PARM
10998                                       ? NULL_RTX : target),
10999                                      ext_mode, ext_mode, reversep, alt_rtl);
11000
11001             /* If the result has aggregate type and the mode of OP0 is an
11002                integral mode then, if BITSIZE is narrower than this mode
11003                and this is for big-endian data, we must put the field
11004                into the high-order bits.  And we must also put it back
11005                into memory order if it has been previously reversed.  */
11006             scalar_int_mode op0_mode;
11007             if (AGGREGATE_TYPE_P (type)
11008                 && is_int_mode (GET_MODE (op0), &op0_mode))
11009               {
11010                 HOST_WIDE_INT size = GET_MODE_BITSIZE (op0_mode);
11011
11012                 gcc_checking_assert (known_le (bitsize, size));
11013                 if (maybe_lt (bitsize, size)
11014                     && reversep ? !BYTES_BIG_ENDIAN : BYTES_BIG_ENDIAN)
11015                   op0 = expand_shift (LSHIFT_EXPR, op0_mode, op0,
11016                                       size - bitsize, op0, 1);
11017
11018                 if (reversep)
11019                   op0 = flip_storage_order (op0_mode, op0);
11020               }
11021
11022             /* If the result type is BLKmode, store the data into a temporary
11023                of the appropriate type, but with the mode corresponding to the
11024                mode for the data we have (op0's mode).  */
11025             if (mode == BLKmode)
11026               {
11027                 rtx new_rtx
11028                   = assign_stack_temp_for_type (ext_mode,
11029                                                 GET_MODE_BITSIZE (ext_mode),
11030                                                 type);
11031                 emit_move_insn (new_rtx, op0);
11032                 op0 = copy_rtx (new_rtx);
11033                 PUT_MODE (op0, BLKmode);
11034               }
11035
11036             return op0;
11037           }
11038
11039         /* If the result is BLKmode, use that to access the object
11040            now as well.  */
11041         if (mode == BLKmode)
11042           mode1 = BLKmode;
11043
11044         /* Get a reference to just this component.  */
11045         bytepos = bits_to_bytes_round_down (bitpos);
11046         if (modifier == EXPAND_CONST_ADDRESS
11047             || modifier == EXPAND_SUM || modifier == EXPAND_INITIALIZER)
11048           op0 = adjust_address_nv (op0, mode1, bytepos);
11049         else
11050           op0 = adjust_address (op0, mode1, bytepos);
11051
11052         if (op0 == orig_op0)
11053           op0 = copy_rtx (op0);
11054
11055         /* Don't set memory attributes if the base expression is
11056            SSA_NAME that got expanded as a MEM or a CONSTANT.  In that case,
11057            we should just honor its original memory attributes.  */
11058         if (!(TREE_CODE (tem) == SSA_NAME
11059               && (MEM_P (orig_op0) || CONSTANT_P (orig_op0))))
11060           set_mem_attributes (op0, exp, 0);
11061
11062         if (REG_P (XEXP (op0, 0)))
11063           mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));
11064
11065         /* If op0 is a temporary because the original expressions was forced
11066            to memory, clear MEM_EXPR so that the original expression cannot
11067            be marked as addressable through MEM_EXPR of the temporary.  */
11068         if (clear_mem_expr)
11069           set_mem_expr (op0, NULL_TREE);
11070
11071         MEM_VOLATILE_P (op0) |= volatilep;
11072
11073         if (reversep
11074             && modifier != EXPAND_MEMORY
11075             && modifier != EXPAND_WRITE)
11076           op0 = flip_storage_order (mode1, op0);
11077
11078         if (mode == mode1 || mode1 == BLKmode || mode1 == tmode
11079             || modifier == EXPAND_CONST_ADDRESS
11080             || modifier == EXPAND_INITIALIZER)
11081           return op0;
11082
11083         if (target == 0)
11084           target = gen_reg_rtx (tmode != VOIDmode ? tmode : mode);
11085
11086         convert_move (target, op0, unsignedp);
11087         return target;
11088       }
11089
11090     case OBJ_TYPE_REF:
11091       return expand_expr (OBJ_TYPE_REF_EXPR (exp), target, tmode, modifier);
11092
11093     case CALL_EXPR:
11094       /* All valid uses of __builtin_va_arg_pack () are removed during
11095          inlining.  */
11096       if (CALL_EXPR_VA_ARG_PACK (exp))
11097         error ("%Kinvalid use of %<__builtin_va_arg_pack ()%>", exp);
11098       {
11099         tree fndecl = get_callee_fndecl (exp), attr;
11100
11101         if (fndecl
11102             /* Don't diagnose the error attribute in thunks, those are
11103                artificially created.  */
11104             && !CALL_FROM_THUNK_P (exp)
11105             && (attr = lookup_attribute ("error",
11106                                          DECL_ATTRIBUTES (fndecl))) != NULL)
11107           {
11108             const char *ident = lang_hooks.decl_printable_name (fndecl, 1);
11109             error ("%Kcall to %qs declared with attribute error: %s", exp,
11110                    identifier_to_locale (ident),
11111                    TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr))));
11112           }
11113         if (fndecl
11114             /* Don't diagnose the warning attribute in thunks, those are
11115                artificially created.  */
11116             && !CALL_FROM_THUNK_P (exp)
11117             && (attr = lookup_attribute ("warning",
11118                                          DECL_ATTRIBUTES (fndecl))) != NULL)
11119           {
11120             const char *ident = lang_hooks.decl_printable_name (fndecl, 1);
11121             warning_at (tree_nonartificial_location (exp),
11122                         OPT_Wattribute_warning,
11123                         "%Kcall to %qs declared with attribute warning: %s",
11124                         exp, identifier_to_locale (ident),
11125                         TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr))));
11126           }
11127
11128         /* Check for a built-in function.  */
11129         if (fndecl && fndecl_built_in_p (fndecl))
11130           {
11131             gcc_assert (DECL_BUILT_IN_CLASS (fndecl) != BUILT_IN_FRONTEND);
11132             return expand_builtin (exp, target, subtarget, tmode, ignore);
11133           }
11134       }
11135       return expand_call (exp, target, ignore);
11136
11137     case VIEW_CONVERT_EXPR:
11138       op0 = NULL_RTX;
11139
11140       /* If we are converting to BLKmode, try to avoid an intermediate
11141          temporary by fetching an inner memory reference.  */
11142       if (mode == BLKmode
11143           && poly_int_tree_p (TYPE_SIZE (type))
11144           && TYPE_MODE (TREE_TYPE (treeop0)) != BLKmode
11145           && handled_component_p (treeop0))
11146       {
11147         machine_mode mode1;
11148         poly_int64 bitsize, bitpos, bytepos;
11149         tree offset;
11150         int reversep, volatilep = 0;
11151         tree tem
11152           = get_inner_reference (treeop0, &bitsize, &bitpos, &offset, &mode1,
11153                                  &unsignedp, &reversep, &volatilep);
11154
11155         /* ??? We should work harder and deal with non-zero offsets.  */
11156         if (!offset
11157             && multiple_p (bitpos, BITS_PER_UNIT, &bytepos)
11158             && !reversep
11159             && known_size_p (bitsize)
11160             && known_eq (wi::to_poly_offset (TYPE_SIZE (type)), bitsize))
11161           {
11162             /* See the normal_inner_ref case for the rationale.  */
11163             rtx orig_op0
11164               = expand_expr_real (tem,
11165                                   (TREE_CODE (TREE_TYPE (tem)) == UNION_TYPE
11166                                    && (TREE_CODE (TYPE_SIZE (TREE_TYPE (tem)))
11167                                        != INTEGER_CST)
11168                                    && modifier != EXPAND_STACK_PARM
11169                                    ? target : NULL_RTX),
11170                                   VOIDmode,
11171                                   modifier == EXPAND_SUM ? EXPAND_NORMAL : modifier,
11172                                   NULL, true);
11173
11174             if (MEM_P (orig_op0))
11175               {
11176                 op0 = orig_op0;
11177
11178                 /* Get a reference to just this component.  */
11179                 if (modifier == EXPAND_CONST_ADDRESS
11180                     || modifier == EXPAND_SUM
11181                     || modifier == EXPAND_INITIALIZER)
11182                   op0 = adjust_address_nv (op0, mode, bytepos);
11183                 else
11184                   op0 = adjust_address (op0, mode, bytepos);
11185
11186                 if (op0 == orig_op0)
11187                   op0 = copy_rtx (op0);
11188
11189                 set_mem_attributes (op0, treeop0, 0);
11190                 if (REG_P (XEXP (op0, 0)))
11191                   mark_reg_pointer (XEXP (op0, 0), MEM_ALIGN (op0));
11192
11193                 MEM_VOLATILE_P (op0) |= volatilep;
11194               }
11195           }
11196       }
11197
11198       if (!op0)
11199         op0 = expand_expr_real (treeop0, NULL_RTX, VOIDmode, modifier,
11200                                 NULL, inner_reference_p);
11201
11202       /* If the input and output modes are both the same, we are done.  */
11203       if (mode == GET_MODE (op0))
11204         ;
11205       /* If neither mode is BLKmode, and both modes are the same size
11206          then we can use gen_lowpart.  */
11207       else if (mode != BLKmode
11208                && GET_MODE (op0) != BLKmode
11209                && known_eq (GET_MODE_PRECISION (mode),
11210                             GET_MODE_PRECISION (GET_MODE (op0)))
11211                && !COMPLEX_MODE_P (GET_MODE (op0)))
11212         {
11213           if (GET_CODE (op0) == SUBREG)
11214             op0 = force_reg (GET_MODE (op0), op0);
11215           temp = gen_lowpart_common (mode, op0);
11216           if (temp)
11217             op0 = temp;
11218           else
11219             {
11220               if (!REG_P (op0) && !MEM_P (op0))
11221                 op0 = force_reg (GET_MODE (op0), op0);
11222               op0 = gen_lowpart (mode, op0);
11223             }
11224         }
11225       /* If both types are integral, convert from one mode to the other.  */
11226       else if (INTEGRAL_TYPE_P (type) && INTEGRAL_TYPE_P (TREE_TYPE (treeop0)))
11227         op0 = convert_modes (mode, GET_MODE (op0), op0,
11228                              TYPE_UNSIGNED (TREE_TYPE (treeop0)));
11229       /* If the output type is a bit-field type, do an extraction.  */
11230       else if (reduce_bit_field)
11231         return extract_bit_field (op0, TYPE_PRECISION (type), 0,
11232                                   TYPE_UNSIGNED (type), NULL_RTX,
11233                                   mode, mode, false, NULL);
11234       /* As a last resort, spill op0 to memory, and reload it in a
11235          different mode.  */
11236       else if (!MEM_P (op0))
11237         {
11238           /* If the operand is not a MEM, force it into memory.  Since we
11239              are going to be changing the mode of the MEM, don't call
11240              force_const_mem for constants because we don't allow pool
11241              constants to change mode.  */
11242           tree inner_type = TREE_TYPE (treeop0);
11243
11244           gcc_assert (!TREE_ADDRESSABLE (exp));
11245
11246           if (target == 0 || GET_MODE (target) != TYPE_MODE (inner_type))
11247             target
11248               = assign_stack_temp_for_type
11249                 (TYPE_MODE (inner_type),
11250                  GET_MODE_SIZE (TYPE_MODE (inner_type)), inner_type);
11251
11252           emit_move_insn (target, op0);
11253           op0 = target;
11254         }
11255
11256       /* If OP0 is (now) a MEM, we need to deal with alignment issues.  If the
11257          output type is such that the operand is known to be aligned, indicate
11258          that it is.  Otherwise, we need only be concerned about alignment for
11259          non-BLKmode results.  */
11260       if (MEM_P (op0))
11261         {
11262           enum insn_code icode;
11263
11264           if (modifier != EXPAND_WRITE
11265               && modifier != EXPAND_MEMORY
11266               && !inner_reference_p
11267               && mode != BLKmode
11268               && MEM_ALIGN (op0) < GET_MODE_ALIGNMENT (mode))
11269             {
11270               /* If the target does have special handling for unaligned
11271                  loads of mode then use them.  */
11272               if ((icode = optab_handler (movmisalign_optab, mode))
11273                   != CODE_FOR_nothing)
11274                 {
11275                   rtx reg;
11276
11277                   op0 = adjust_address (op0, mode, 0);
11278                   /* We've already validated the memory, and we're creating a
11279                      new pseudo destination.  The predicates really can't
11280                      fail.  */
11281                   reg = gen_reg_rtx (mode);
11282
11283                   /* Nor can the insn generator.  */
11284                   rtx_insn *insn = GEN_FCN (icode) (reg, op0);
11285                   emit_insn (insn);
11286                   return reg;
11287                 }
11288               else if (STRICT_ALIGNMENT)
11289                 {
11290                   poly_uint64 mode_size = GET_MODE_SIZE (mode);
11291                   poly_uint64 temp_size = mode_size;
11292                   if (GET_MODE (op0) != BLKmode)
11293                     temp_size = upper_bound (temp_size,
11294                                              GET_MODE_SIZE (GET_MODE (op0)));
11295                   rtx new_rtx
11296                     = assign_stack_temp_for_type (mode, temp_size, type);
11297                   rtx new_with_op0_mode
11298                     = adjust_address (new_rtx, GET_MODE (op0), 0);
11299
11300                   gcc_assert (!TREE_ADDRESSABLE (exp));
11301
11302                   if (GET_MODE (op0) == BLKmode)
11303                     {
11304                       rtx size_rtx = gen_int_mode (mode_size, Pmode);
11305                       emit_block_move (new_with_op0_mode, op0, size_rtx,
11306                                        (modifier == EXPAND_STACK_PARM
11307                                         ? BLOCK_OP_CALL_PARM
11308                                         : BLOCK_OP_NORMAL));
11309                     }
11310                   else
11311                     emit_move_insn (new_with_op0_mode, op0);
11312
11313                   op0 = new_rtx;
11314                 }
11315             }
11316
11317           op0 = adjust_address (op0, mode, 0);
11318         }
11319
11320       return op0;
11321
11322     case MODIFY_EXPR:
11323       {
11324         tree lhs = treeop0;
11325         tree rhs = treeop1;
11326         gcc_assert (ignore);
11327
11328         /* Check for |= or &= of a bitfield of size one into another bitfield
11329            of size 1.  In this case, (unless we need the result of the
11330            assignment) we can do this more efficiently with a
11331            test followed by an assignment, if necessary.
11332
11333            ??? At this point, we can't get a BIT_FIELD_REF here.  But if
11334            things change so we do, this code should be enhanced to
11335            support it.  */
11336         if (TREE_CODE (lhs) == COMPONENT_REF
11337             && (TREE_CODE (rhs) == BIT_IOR_EXPR
11338                 || TREE_CODE (rhs) == BIT_AND_EXPR)
11339             && TREE_OPERAND (rhs, 0) == lhs
11340             && TREE_CODE (TREE_OPERAND (rhs, 1)) == COMPONENT_REF
11341             && integer_onep (DECL_SIZE (TREE_OPERAND (lhs, 1)))
11342             && integer_onep (DECL_SIZE (TREE_OPERAND (TREE_OPERAND (rhs, 1), 1))))
11343           {
11344             rtx_code_label *label = gen_label_rtx ();
11345             int value = TREE_CODE (rhs) == BIT_IOR_EXPR;
11346             profile_probability prob = profile_probability::uninitialized ();
11347             if (value)
11348               jumpifnot (TREE_OPERAND (rhs, 1), label, prob);
11349             else
11350               jumpif (TREE_OPERAND (rhs, 1), label, prob);
11351             expand_assignment (lhs, build_int_cst (TREE_TYPE (rhs), value),
11352                                false);
11353             do_pending_stack_adjust ();
11354             emit_label (label);
11355             return const0_rtx;
11356           }
11357
11358         expand_assignment (lhs, rhs, false);
11359         return const0_rtx;
11360       }
11361
11362     case ADDR_EXPR:
11363       return expand_expr_addr_expr (exp, target, tmode, modifier);
11364
11365     case REALPART_EXPR:
11366       op0 = expand_normal (treeop0);
11367       return read_complex_part (op0, false);
11368
11369     case IMAGPART_EXPR:
11370       op0 = expand_normal (treeop0);
11371       return read_complex_part (op0, true);
11372
11373     case RETURN_EXPR:
11374     case LABEL_EXPR:
11375     case GOTO_EXPR:
11376     case SWITCH_EXPR:
11377     case ASM_EXPR:
11378       /* Expanded in cfgexpand.c.  */
11379       gcc_unreachable ();
11380
11381     case TRY_CATCH_EXPR:
11382     case CATCH_EXPR:
11383     case EH_FILTER_EXPR:
11384     case TRY_FINALLY_EXPR:
11385     case EH_ELSE_EXPR:
11386       /* Lowered by tree-eh.c.  */
11387       gcc_unreachable ();
11388
11389     case WITH_CLEANUP_EXPR:
11390     case CLEANUP_POINT_EXPR:
11391     case TARGET_EXPR:
11392     case CASE_LABEL_EXPR:
11393     case VA_ARG_EXPR:
11394     case BIND_EXPR:
11395     case INIT_EXPR:
11396     case CONJ_EXPR:
11397     case COMPOUND_EXPR:
11398     case PREINCREMENT_EXPR:
11399     case PREDECREMENT_EXPR:
11400     case POSTINCREMENT_EXPR:
11401     case POSTDECREMENT_EXPR:
11402     case LOOP_EXPR:
11403     case EXIT_EXPR:
11404     case COMPOUND_LITERAL_EXPR:
11405       /* Lowered by gimplify.c.  */
11406       gcc_unreachable ();
11407
11408     case FDESC_EXPR:
11409       /* Function descriptors are not valid except for as
11410          initialization constants, and should not be expanded.  */
11411       gcc_unreachable ();
11412
11413     case WITH_SIZE_EXPR:
11414       /* WITH_SIZE_EXPR expands to its first argument.  The caller should
11415          have pulled out the size to use in whatever context it needed.  */
11416       return expand_expr_real (treeop0, original_target, tmode,
11417                                modifier, alt_rtl, inner_reference_p);
11418
11419     default:
11420       return expand_expr_real_2 (&ops, target, tmode, modifier);
11421     }
11422 }
11423 \f
11424 /* Subroutine of above: reduce EXP to the precision of TYPE (in the
11425    signedness of TYPE), possibly returning the result in TARGET.
11426    TYPE is known to be a partial integer type.  */
11427 static rtx
11428 reduce_to_bit_field_precision (rtx exp, rtx target, tree type)
11429 {
11430   HOST_WIDE_INT prec = TYPE_PRECISION (type);
11431   if (target && GET_MODE (target) != GET_MODE (exp))
11432     target = 0;
11433   /* For constant values, reduce using build_int_cst_type. */
11434   poly_int64 const_exp;
11435   if (poly_int_rtx_p (exp, &const_exp))
11436     {
11437       tree t = build_int_cst_type (type, const_exp);
11438       return expand_expr (t, target, VOIDmode, EXPAND_NORMAL);
11439     }
11440   else if (TYPE_UNSIGNED (type))
11441     {
11442       scalar_int_mode mode = as_a <scalar_int_mode> (GET_MODE (exp));
11443       rtx mask = immed_wide_int_const
11444         (wi::mask (prec, false, GET_MODE_PRECISION (mode)), mode);
11445       return expand_and (mode, exp, mask, target);
11446     }
11447   else
11448     {
11449       scalar_int_mode mode = as_a <scalar_int_mode> (GET_MODE (exp));
11450       int count = GET_MODE_PRECISION (mode) - prec;
11451       exp = expand_shift (LSHIFT_EXPR, mode, exp, count, target, 0);
11452       return expand_shift (RSHIFT_EXPR, mode, exp, count, target, 0);
11453     }
11454 }
11455 \f
11456 /* Subroutine of above: returns 1 if OFFSET corresponds to an offset that
11457    when applied to the address of EXP produces an address known to be
11458    aligned more than BIGGEST_ALIGNMENT.  */
11459
11460 static int
11461 is_aligning_offset (const_tree offset, const_tree exp)
11462 {
11463   /* Strip off any conversions.  */
11464   while (CONVERT_EXPR_P (offset))
11465     offset = TREE_OPERAND (offset, 0);
11466
11467   /* We must now have a BIT_AND_EXPR with a constant that is one less than
11468      power of 2 and which is larger than BIGGEST_ALIGNMENT.  */
11469   if (TREE_CODE (offset) != BIT_AND_EXPR
11470       || !tree_fits_uhwi_p (TREE_OPERAND (offset, 1))
11471       || compare_tree_int (TREE_OPERAND (offset, 1),
11472                            BIGGEST_ALIGNMENT / BITS_PER_UNIT) <= 0
11473       || !pow2p_hwi (tree_to_uhwi (TREE_OPERAND (offset, 1)) + 1))
11474     return 0;
11475
11476   /* Look at the first operand of BIT_AND_EXPR and strip any conversion.
11477      It must be NEGATE_EXPR.  Then strip any more conversions.  */
11478   offset = TREE_OPERAND (offset, 0);
11479   while (CONVERT_EXPR_P (offset))
11480     offset = TREE_OPERAND (offset, 0);
11481
11482   if (TREE_CODE (offset) != NEGATE_EXPR)
11483     return 0;
11484
11485   offset = TREE_OPERAND (offset, 0);
11486   while (CONVERT_EXPR_P (offset))
11487     offset = TREE_OPERAND (offset, 0);
11488
11489   /* This must now be the address of EXP.  */
11490   return TREE_CODE (offset) == ADDR_EXPR && TREE_OPERAND (offset, 0) == exp;
11491 }
11492 \f
11493 /* Return the tree node if an ARG corresponds to a string constant or zero
11494    if it doesn't.  If we return nonzero, set *PTR_OFFSET to the (possibly
11495    non-constant) offset in bytes within the string that ARG is accessing.
11496    If MEM_SIZE is non-zero the storage size of the memory is returned.
11497    If DECL is non-zero the constant declaration is returned if available.  */
11498
11499 tree
11500 string_constant (tree arg, tree *ptr_offset, tree *mem_size, tree *decl)
11501 {
11502   tree dummy = NULL_TREE;;
11503   if (!mem_size)
11504     mem_size = &dummy;
11505
11506   /* Store the type of the original expression before conversions
11507      via NOP_EXPR or POINTER_PLUS_EXPR to other types have been
11508      removed.  */
11509   tree argtype = TREE_TYPE (arg);
11510
11511   tree array;
11512   STRIP_NOPS (arg);
11513
11514   /* Non-constant index into the character array in an ARRAY_REF
11515      expression or null.  */
11516   tree varidx = NULL_TREE;
11517
11518   poly_int64 base_off = 0;
11519
11520   if (TREE_CODE (arg) == ADDR_EXPR)
11521     {
11522       arg = TREE_OPERAND (arg, 0);
11523       tree ref = arg;
11524       if (TREE_CODE (arg) == ARRAY_REF)
11525         {
11526           tree idx = TREE_OPERAND (arg, 1);
11527           if (TREE_CODE (idx) != INTEGER_CST)
11528             {
11529               /* From a pointer (but not array) argument extract the variable
11530                  index to prevent get_addr_base_and_unit_offset() from failing
11531                  due to it.  Use it later to compute the non-constant offset
11532                  into the string and return it to the caller.  */
11533               varidx = idx;
11534               ref = TREE_OPERAND (arg, 0);
11535
11536               if (TREE_CODE (TREE_TYPE (arg)) == ARRAY_TYPE)
11537                 return NULL_TREE;
11538
11539               if (!integer_zerop (array_ref_low_bound (arg)))
11540                 return NULL_TREE;
11541
11542               if (!integer_onep (array_ref_element_size (arg)))
11543                 return NULL_TREE;
11544             }
11545         }
11546       array = get_addr_base_and_unit_offset (ref, &base_off);
11547       if (!array
11548           || (TREE_CODE (array) != VAR_DECL
11549               && TREE_CODE (array) != CONST_DECL
11550               && TREE_CODE (array) != STRING_CST))
11551         return NULL_TREE;
11552     }
11553   else if (TREE_CODE (arg) == PLUS_EXPR || TREE_CODE (arg) == POINTER_PLUS_EXPR)
11554     {
11555       tree arg0 = TREE_OPERAND (arg, 0);
11556       tree arg1 = TREE_OPERAND (arg, 1);
11557
11558       tree offset;
11559       tree str = string_constant (arg0, &offset, mem_size, decl);
11560       if (!str)
11561         {
11562            str = string_constant (arg1, &offset, mem_size, decl);
11563            arg1 = arg0;
11564         }
11565
11566       if (str)
11567         {
11568           /* Avoid pointers to arrays (see bug 86622).  */
11569           if (POINTER_TYPE_P (TREE_TYPE (arg))
11570               && TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) == ARRAY_TYPE
11571               && !(decl && !*decl)
11572               && !(decl && tree_fits_uhwi_p (DECL_SIZE_UNIT (*decl))
11573                    && tree_fits_uhwi_p (*mem_size)
11574                    && tree_int_cst_equal (*mem_size, DECL_SIZE_UNIT (*decl))))
11575             return NULL_TREE;
11576
11577           tree type = TREE_TYPE (offset);
11578           arg1 = fold_convert (type, arg1);
11579           *ptr_offset = fold_build2 (PLUS_EXPR, type, offset, arg1);
11580           return str;
11581         }
11582       return NULL_TREE;
11583     }
11584   else if (TREE_CODE (arg) == SSA_NAME)
11585     {
11586       gimple *stmt = SSA_NAME_DEF_STMT (arg);
11587       if (!is_gimple_assign (stmt))
11588         return NULL_TREE;
11589
11590       tree rhs1 = gimple_assign_rhs1 (stmt);
11591       tree_code code = gimple_assign_rhs_code (stmt);
11592       if (code == ADDR_EXPR)
11593         return string_constant (rhs1, ptr_offset, mem_size, decl);
11594       else if (code != POINTER_PLUS_EXPR)
11595         return NULL_TREE;
11596
11597       tree offset;
11598       if (tree str = string_constant (rhs1, &offset, mem_size, decl))
11599         {
11600           /* Avoid pointers to arrays (see bug 86622).  */
11601           if (POINTER_TYPE_P (TREE_TYPE (rhs1))
11602               && TREE_CODE (TREE_TYPE (TREE_TYPE (rhs1))) == ARRAY_TYPE
11603               && !(decl && !*decl)
11604               && !(decl && tree_fits_uhwi_p (DECL_SIZE_UNIT (*decl))
11605                    && tree_fits_uhwi_p (*mem_size)
11606                    && tree_int_cst_equal (*mem_size, DECL_SIZE_UNIT (*decl))))
11607             return NULL_TREE;
11608
11609           tree rhs2 = gimple_assign_rhs2 (stmt);
11610           tree type = TREE_TYPE (offset);
11611           rhs2 = fold_convert (type, rhs2);
11612           *ptr_offset = fold_build2 (PLUS_EXPR, type, offset, rhs2);
11613           return str;
11614         }
11615       return NULL_TREE;
11616     }
11617   else if (DECL_P (arg))
11618     array = arg;
11619   else
11620     return NULL_TREE;
11621
11622   tree offset = wide_int_to_tree (sizetype, base_off);
11623   if (varidx)
11624     {
11625       if (TREE_CODE (TREE_TYPE (array)) != ARRAY_TYPE)
11626         return NULL_TREE;
11627
11628       gcc_assert (TREE_CODE (arg) == ARRAY_REF);
11629       tree chartype = TREE_TYPE (TREE_TYPE (TREE_OPERAND (arg, 0)));
11630       if (TREE_CODE (chartype) != INTEGER_TYPE)
11631         return NULL;
11632
11633       offset = fold_convert (sizetype, varidx);
11634     }
11635
11636   if (TREE_CODE (array) == STRING_CST)
11637     {
11638       *ptr_offset = fold_convert (sizetype, offset);
11639       *mem_size = TYPE_SIZE_UNIT (TREE_TYPE (array));
11640       if (decl)
11641         *decl = NULL_TREE;
11642       gcc_checking_assert (tree_to_shwi (TYPE_SIZE_UNIT (TREE_TYPE (array)))
11643                            >= TREE_STRING_LENGTH (array));
11644       return array;
11645     }
11646
11647   if (!VAR_P (array) && TREE_CODE (array) != CONST_DECL)
11648     return NULL_TREE;
11649
11650   tree init = ctor_for_folding (array);
11651
11652   /* Handle variables initialized with string literals.  */
11653   if (!init || init == error_mark_node)
11654     return NULL_TREE;
11655   if (TREE_CODE (init) == CONSTRUCTOR)
11656     {
11657       /* Convert the 64-bit constant offset to a wider type to avoid
11658          overflow.  */
11659       offset_int wioff;
11660       if (!base_off.is_constant (&wioff))
11661         return NULL_TREE;
11662
11663       wioff *= BITS_PER_UNIT;
11664       if (!wi::fits_uhwi_p (wioff))
11665         return NULL_TREE;
11666
11667       base_off = wioff.to_uhwi ();
11668       unsigned HOST_WIDE_INT fieldoff = 0;
11669       init = fold_ctor_reference (TREE_TYPE (arg), init, base_off, 0, array,
11670                                   &fieldoff);
11671       HOST_WIDE_INT cstoff;
11672       if (!base_off.is_constant (&cstoff))
11673         return NULL_TREE;
11674
11675       cstoff = (cstoff - fieldoff) / BITS_PER_UNIT;
11676       tree off = build_int_cst (sizetype, cstoff);
11677       if (varidx)
11678         offset = fold_build2 (PLUS_EXPR, TREE_TYPE (offset), offset, off);
11679       else
11680         offset = off;
11681     }
11682
11683   if (!init)
11684     return NULL_TREE;
11685
11686   *ptr_offset = offset;
11687
11688   tree inittype = TREE_TYPE (init);
11689
11690   if (TREE_CODE (init) == INTEGER_CST
11691       && (TREE_CODE (TREE_TYPE (array)) == INTEGER_TYPE
11692           || TYPE_MAIN_VARIANT (inittype) == char_type_node))
11693     {
11694       /* For a reference to (address of) a single constant character,
11695          store the native representation of the character in CHARBUF.
11696          If the reference is to an element of an array or a member
11697          of a struct, only consider narrow characters until ctors
11698          for wide character arrays are transformed to STRING_CSTs
11699          like those for narrow arrays.  */
11700       unsigned char charbuf[MAX_BITSIZE_MODE_ANY_MODE / BITS_PER_UNIT];
11701       int len = native_encode_expr (init, charbuf, sizeof charbuf, 0);
11702       if (len > 0)
11703         {
11704           /* Construct a string literal with elements of INITTYPE and
11705              the representation above.  Then strip
11706              the ADDR_EXPR (ARRAY_REF (...)) around the STRING_CST.  */
11707           init = build_string_literal (len, (char *)charbuf, inittype);
11708           init = TREE_OPERAND (TREE_OPERAND (init, 0), 0);
11709         }
11710     }
11711
11712   tree initsize = TYPE_SIZE_UNIT (inittype);
11713
11714   if (TREE_CODE (init) == CONSTRUCTOR && initializer_zerop (init))
11715     {
11716       /* Fold an empty/zero constructor for an implicitly initialized
11717          object or subobject into the empty string.  */
11718
11719       /* Determine the character type from that of the original
11720          expression.  */
11721       tree chartype = argtype;
11722       if (POINTER_TYPE_P (chartype))
11723         chartype = TREE_TYPE (chartype);
11724       while (TREE_CODE (chartype) == ARRAY_TYPE)
11725         chartype = TREE_TYPE (chartype);
11726       /* Convert a char array to an empty STRING_CST having an array
11727          of the expected type.  */
11728       if (!initsize)
11729           initsize = integer_zero_node;
11730
11731       unsigned HOST_WIDE_INT size = tree_to_uhwi (initsize);
11732       init = build_string_literal (size ? 1 : 0, "", chartype, size);
11733       init = TREE_OPERAND (init, 0);
11734       init = TREE_OPERAND (init, 0);
11735
11736       *ptr_offset = integer_zero_node;
11737     }
11738
11739   if (decl)
11740     *decl = array;
11741
11742   if (TREE_CODE (init) != STRING_CST)
11743     return NULL_TREE;
11744
11745   *mem_size = initsize;
11746
11747   gcc_checking_assert (tree_to_shwi (initsize) >= TREE_STRING_LENGTH (init));
11748
11749   return init;
11750 }
11751 \f
11752 /* Compute the modular multiplicative inverse of A modulo M
11753    using extended Euclid's algorithm.  Assumes A and M are coprime.  */
11754 static wide_int
11755 mod_inv (const wide_int &a, const wide_int &b)
11756 {
11757   /* Verify the assumption.  */
11758   gcc_checking_assert (wi::eq_p (wi::gcd (a, b), 1));
11759
11760   unsigned int p = a.get_precision () + 1;
11761   gcc_checking_assert (b.get_precision () + 1 == p);
11762   wide_int c = wide_int::from (a, p, UNSIGNED);
11763   wide_int d = wide_int::from (b, p, UNSIGNED);
11764   wide_int x0 = wide_int::from (0, p, UNSIGNED);
11765   wide_int x1 = wide_int::from (1, p, UNSIGNED);
11766
11767   if (wi::eq_p (b, 1))
11768     return wide_int::from (1, p, UNSIGNED);
11769
11770   while (wi::gt_p (c, 1, UNSIGNED))
11771     {
11772       wide_int t = d;
11773       wide_int q = wi::divmod_trunc (c, d, UNSIGNED, &d);
11774       c = t;
11775       wide_int s = x0;
11776       x0 = wi::sub (x1, wi::mul (q, x0));
11777       x1 = s;
11778     }
11779   if (wi::lt_p (x1, 0, SIGNED))
11780     x1 += d;
11781   return x1;
11782 }
11783
11784 /* Optimize x % C1 == C2 for signed modulo if C1 is a power of two and C2
11785    is non-zero and C3 ((1<<(prec-1)) | (C1 - 1)):
11786    for C2 > 0 to x & C3 == C2
11787    for C2 < 0 to x & C3 == (C2 & C3).  */
11788 enum tree_code
11789 maybe_optimize_pow2p_mod_cmp (enum tree_code code, tree *arg0, tree *arg1)
11790 {
11791   gimple *stmt = get_def_for_expr (*arg0, TRUNC_MOD_EXPR);
11792   tree treeop0 = gimple_assign_rhs1 (stmt);
11793   tree treeop1 = gimple_assign_rhs2 (stmt);
11794   tree type = TREE_TYPE (*arg0);
11795   scalar_int_mode mode;
11796   if (!is_a <scalar_int_mode> (TYPE_MODE (type), &mode))
11797     return code;
11798   if (GET_MODE_BITSIZE (mode) != TYPE_PRECISION (type)
11799       || TYPE_PRECISION (type) <= 1
11800       || TYPE_UNSIGNED (type)
11801       /* Signed x % c == 0 should have been optimized into unsigned modulo
11802          earlier.  */
11803       || integer_zerop (*arg1)
11804       /* If c is known to be non-negative, modulo will be expanded as unsigned
11805          modulo.  */
11806       || get_range_pos_neg (treeop0) == 1)
11807     return code;
11808
11809   /* x % c == d where d < 0 && d <= -c should be always false.  */
11810   if (tree_int_cst_sgn (*arg1) == -1
11811       && -wi::to_widest (treeop1) >= wi::to_widest (*arg1))
11812     return code;
11813
11814   int prec = TYPE_PRECISION (type);
11815   wide_int w = wi::to_wide (treeop1) - 1;
11816   w |= wi::shifted_mask (0, prec - 1, true, prec);
11817   tree c3 = wide_int_to_tree (type, w);
11818   tree c4 = *arg1;
11819   if (tree_int_cst_sgn (*arg1) == -1)
11820     c4 = wide_int_to_tree (type, w & wi::to_wide (*arg1));
11821
11822   rtx op0 = expand_normal (treeop0);
11823   treeop0 = make_tree (TREE_TYPE (treeop0), op0);
11824
11825   bool speed_p = optimize_insn_for_speed_p ();
11826
11827   do_pending_stack_adjust ();
11828
11829   location_t loc = gimple_location (stmt);
11830   struct separate_ops ops;
11831   ops.code = TRUNC_MOD_EXPR;
11832   ops.location = loc;
11833   ops.type = TREE_TYPE (treeop0);
11834   ops.op0 = treeop0;
11835   ops.op1 = treeop1;
11836   ops.op2 = NULL_TREE;
11837   start_sequence ();
11838   rtx mor = expand_expr_real_2 (&ops, NULL_RTX, TYPE_MODE (ops.type),
11839                                 EXPAND_NORMAL);
11840   rtx_insn *moinsns = get_insns ();
11841   end_sequence ();
11842
11843   unsigned mocost = seq_cost (moinsns, speed_p);
11844   mocost += rtx_cost (mor, mode, EQ, 0, speed_p);
11845   mocost += rtx_cost (expand_normal (*arg1), mode, EQ, 1, speed_p);
11846
11847   ops.code = BIT_AND_EXPR;
11848   ops.location = loc;
11849   ops.type = TREE_TYPE (treeop0);
11850   ops.op0 = treeop0;
11851   ops.op1 = c3;
11852   ops.op2 = NULL_TREE;
11853   start_sequence ();
11854   rtx mur = expand_expr_real_2 (&ops, NULL_RTX, TYPE_MODE (ops.type),
11855                                 EXPAND_NORMAL);
11856   rtx_insn *muinsns = get_insns ();
11857   end_sequence ();
11858
11859   unsigned mucost = seq_cost (muinsns, speed_p);
11860   mucost += rtx_cost (mur, mode, EQ, 0, speed_p);
11861   mucost += rtx_cost (expand_normal (c4), mode, EQ, 1, speed_p);
11862
11863   if (mocost <= mucost)
11864     {
11865       emit_insn (moinsns);
11866       *arg0 = make_tree (TREE_TYPE (*arg0), mor);
11867       return code;
11868     }
11869
11870   emit_insn (muinsns);
11871   *arg0 = make_tree (TREE_TYPE (*arg0), mur);
11872   *arg1 = c4;
11873   return code;
11874 }
11875
11876 /* Attempt to optimize unsigned (X % C1) == C2 (or (X % C1) != C2).
11877    If C1 is odd to:
11878    (X - C2) * C3 <= C4 (or >), where
11879    C3 is modular multiplicative inverse of C1 and 1<<prec and
11880    C4 is ((1<<prec) - 1) / C1 or ((1<<prec) - 1) / C1 - 1 (the latter
11881    if C2 > ((1<<prec) - 1) % C1).
11882    If C1 is even, S = ctz (C1) and C2 is 0, use
11883    ((X * C3) r>> S) <= C4, where C3 is modular multiplicative
11884    inverse of C1>>S and 1<<prec and C4 is (((1<<prec) - 1) / (C1>>S)) >> S.
11885
11886    For signed (X % C1) == 0 if C1 is odd to (all operations in it
11887    unsigned):
11888    (X * C3) + C4 <= 2 * C4, where
11889    C3 is modular multiplicative inverse of (unsigned) C1 and 1<<prec and
11890    C4 is ((1<<(prec - 1) - 1) / C1).
11891    If C1 is even, S = ctz(C1), use
11892    ((X * C3) + C4) r>> S <= (C4 >> (S - 1))
11893    where C3 is modular multiplicative inverse of (unsigned)(C1>>S) and 1<<prec
11894    and C4 is ((1<<(prec - 1) - 1) / (C1>>S)) & (-1<<S).
11895
11896    See the Hacker's Delight book, section 10-17.  */
11897 enum tree_code
11898 maybe_optimize_mod_cmp (enum tree_code code, tree *arg0, tree *arg1)
11899 {
11900   gcc_checking_assert (code == EQ_EXPR || code == NE_EXPR);
11901   gcc_checking_assert (TREE_CODE (*arg1) == INTEGER_CST);
11902
11903   if (optimize < 2)
11904     return code;
11905
11906   gimple *stmt = get_def_for_expr (*arg0, TRUNC_MOD_EXPR);
11907   if (stmt == NULL)
11908     return code;
11909
11910   tree treeop0 = gimple_assign_rhs1 (stmt);
11911   tree treeop1 = gimple_assign_rhs2 (stmt);
11912   if (TREE_CODE (treeop0) != SSA_NAME
11913       || TREE_CODE (treeop1) != INTEGER_CST
11914       /* Don't optimize the undefined behavior case x % 0;
11915          x % 1 should have been optimized into zero, punt if
11916          it makes it here for whatever reason;
11917          x % -c should have been optimized into x % c.  */
11918       || compare_tree_int (treeop1, 2) <= 0
11919       /* Likewise x % c == d where d >= c should be always false.  */
11920       || tree_int_cst_le (treeop1, *arg1))
11921     return code;
11922
11923   /* Unsigned x % pow2 is handled right already, for signed
11924      modulo handle it in maybe_optimize_pow2p_mod_cmp.  */
11925   if (integer_pow2p (treeop1))
11926     return maybe_optimize_pow2p_mod_cmp (code, arg0, arg1);
11927
11928   tree type = TREE_TYPE (*arg0);
11929   scalar_int_mode mode;
11930   if (!is_a <scalar_int_mode> (TYPE_MODE (type), &mode))
11931     return code;
11932   if (GET_MODE_BITSIZE (mode) != TYPE_PRECISION (type)
11933       || TYPE_PRECISION (type) <= 1)
11934     return code;
11935
11936   signop sgn = UNSIGNED;
11937   /* If both operands are known to have the sign bit clear, handle
11938      even the signed modulo case as unsigned.  treeop1 is always
11939      positive >= 2, checked above.  */
11940   if (!TYPE_UNSIGNED (type) && get_range_pos_neg (treeop0) != 1)
11941     sgn = SIGNED;
11942
11943   if (!TYPE_UNSIGNED (type))
11944     {
11945       if (tree_int_cst_sgn (*arg1) == -1)
11946         return code;
11947       type = unsigned_type_for (type);
11948       if (!type || TYPE_MODE (type) != TYPE_MODE (TREE_TYPE (*arg0)))
11949         return code;
11950     }
11951
11952   int prec = TYPE_PRECISION (type);
11953   wide_int w = wi::to_wide (treeop1);
11954   int shift = wi::ctz (w);
11955   /* Unsigned (X % C1) == C2 is equivalent to (X - C2) % C1 == 0 if
11956      C2 <= -1U % C1, because for any Z >= 0U - C2 in that case (Z % C1) != 0.
11957      If C1 is odd, we can handle all cases by subtracting
11958      C4 below.  We could handle even the even C1 and C2 > -1U % C1 cases
11959      e.g. by testing for overflow on the subtraction, punt on that for now
11960      though.  */
11961   if ((sgn == SIGNED || shift) && !integer_zerop (*arg1))
11962     {
11963       if (sgn == SIGNED)
11964         return code;
11965       wide_int x = wi::umod_trunc (wi::mask (prec, false, prec), w);
11966       if (wi::gtu_p (wi::to_wide (*arg1), x))
11967         return code;
11968     }
11969
11970   imm_use_iterator imm_iter;
11971   use_operand_p use_p;
11972   FOR_EACH_IMM_USE_FAST (use_p, imm_iter, treeop0)
11973     {
11974       gimple *use_stmt = USE_STMT (use_p);
11975       /* Punt if treeop0 is used in the same bb in a division
11976          or another modulo with the same divisor.  We should expect
11977          the division and modulo combined together.  */
11978       if (use_stmt == stmt
11979           || gimple_bb (use_stmt) != gimple_bb (stmt))
11980         continue;
11981       if (!is_gimple_assign (use_stmt)
11982           || (gimple_assign_rhs_code (use_stmt) != TRUNC_DIV_EXPR
11983               && gimple_assign_rhs_code (use_stmt) != TRUNC_MOD_EXPR))
11984         continue;
11985       if (gimple_assign_rhs1 (use_stmt) != treeop0
11986           || !operand_equal_p (gimple_assign_rhs2 (use_stmt), treeop1, 0))
11987         continue;
11988       return code;
11989     }
11990
11991   w = wi::lrshift (w, shift);
11992   wide_int a = wide_int::from (w, prec + 1, UNSIGNED);
11993   wide_int b = wi::shifted_mask (prec, 1, false, prec + 1);
11994   wide_int m = wide_int::from (mod_inv (a, b), prec, UNSIGNED);
11995   tree c3 = wide_int_to_tree (type, m);
11996   tree c5 = NULL_TREE;
11997   wide_int d, e;
11998   if (sgn == UNSIGNED)
11999     {
12000       d = wi::divmod_trunc (wi::mask (prec, false, prec), w, UNSIGNED, &e);
12001       /* Use <= floor ((1<<prec) - 1) / C1 only if C2 <= ((1<<prec) - 1) % C1,
12002          otherwise use < or subtract one from C4.  E.g. for
12003          x % 3U == 0 we transform this into x * 0xaaaaaaab <= 0x55555555, but
12004          x % 3U == 1 already needs to be
12005          (x - 1) * 0xaaaaaaabU <= 0x55555554.  */
12006       if (!shift && wi::gtu_p (wi::to_wide (*arg1), e))
12007         d -= 1;
12008       if (shift)
12009         d = wi::lrshift (d, shift);
12010     }
12011   else
12012     {
12013       e = wi::udiv_trunc (wi::mask (prec - 1, false, prec), w);
12014       if (!shift)
12015         d = wi::lshift (e, 1);
12016       else
12017         {
12018           e = wi::bit_and (e, wi::mask (shift, true, prec));
12019           d = wi::lrshift (e, shift - 1);
12020         }
12021       c5 = wide_int_to_tree (type, e);
12022     }
12023   tree c4 = wide_int_to_tree (type, d);
12024
12025   rtx op0 = expand_normal (treeop0);
12026   treeop0 = make_tree (TREE_TYPE (treeop0), op0);
12027
12028   bool speed_p = optimize_insn_for_speed_p ();
12029
12030   do_pending_stack_adjust ();
12031
12032   location_t loc = gimple_location (stmt);
12033   struct separate_ops ops;
12034   ops.code = TRUNC_MOD_EXPR;
12035   ops.location = loc;
12036   ops.type = TREE_TYPE (treeop0);
12037   ops.op0 = treeop0;
12038   ops.op1 = treeop1;
12039   ops.op2 = NULL_TREE;
12040   start_sequence ();
12041   rtx mor = expand_expr_real_2 (&ops, NULL_RTX, TYPE_MODE (ops.type),
12042                                 EXPAND_NORMAL);
12043   rtx_insn *moinsns = get_insns ();
12044   end_sequence ();
12045
12046   unsigned mocost = seq_cost (moinsns, speed_p);
12047   mocost += rtx_cost (mor, mode, EQ, 0, speed_p);
12048   mocost += rtx_cost (expand_normal (*arg1), mode, EQ, 1, speed_p);
12049
12050   tree t = fold_convert_loc (loc, type, treeop0);
12051   if (!integer_zerop (*arg1))
12052     t = fold_build2_loc (loc, MINUS_EXPR, type, t, fold_convert (type, *arg1));
12053   t = fold_build2_loc (loc, MULT_EXPR, type, t, c3);
12054   if (sgn == SIGNED)
12055     t = fold_build2_loc (loc, PLUS_EXPR, type, t, c5);
12056   if (shift)
12057     {
12058       tree s = build_int_cst (NULL_TREE, shift);
12059       t = fold_build2_loc (loc, RROTATE_EXPR, type, t, s);
12060     }
12061
12062   start_sequence ();
12063   rtx mur = expand_normal (t);
12064   rtx_insn *muinsns = get_insns ();
12065   end_sequence ();
12066
12067   unsigned mucost = seq_cost (muinsns, speed_p);
12068   mucost += rtx_cost (mur, mode, LE, 0, speed_p);
12069   mucost += rtx_cost (expand_normal (c4), mode, LE, 1, speed_p);
12070
12071   if (mocost <= mucost)
12072     {
12073       emit_insn (moinsns);
12074       *arg0 = make_tree (TREE_TYPE (*arg0), mor);
12075       return code;
12076     }
12077
12078   emit_insn (muinsns);
12079   *arg0 = make_tree (type, mur);
12080   *arg1 = c4;
12081   return code == EQ_EXPR ? LE_EXPR : GT_EXPR;
12082 }
12083 \f
12084 /* Generate code to calculate OPS, and exploded expression
12085    using a store-flag instruction and return an rtx for the result.
12086    OPS reflects a comparison.
12087
12088    If TARGET is nonzero, store the result there if convenient.
12089
12090    Return zero if there is no suitable set-flag instruction
12091    available on this machine.
12092
12093    Once expand_expr has been called on the arguments of the comparison,
12094    we are committed to doing the store flag, since it is not safe to
12095    re-evaluate the expression.  We emit the store-flag insn by calling
12096    emit_store_flag, but only expand the arguments if we have a reason
12097    to believe that emit_store_flag will be successful.  If we think that
12098    it will, but it isn't, we have to simulate the store-flag with a
12099    set/jump/set sequence.  */
12100
12101 static rtx
12102 do_store_flag (sepops ops, rtx target, machine_mode mode)
12103 {
12104   enum rtx_code code;
12105   tree arg0, arg1, type;
12106   machine_mode operand_mode;
12107   int unsignedp;
12108   rtx op0, op1;
12109   rtx subtarget = target;
12110   location_t loc = ops->location;
12111
12112   arg0 = ops->op0;
12113   arg1 = ops->op1;
12114
12115   /* Don't crash if the comparison was erroneous.  */
12116   if (arg0 == error_mark_node || arg1 == error_mark_node)
12117     return const0_rtx;
12118
12119   type = TREE_TYPE (arg0);
12120   operand_mode = TYPE_MODE (type);
12121   unsignedp = TYPE_UNSIGNED (type);
12122
12123   /* We won't bother with BLKmode store-flag operations because it would mean
12124      passing a lot of information to emit_store_flag.  */
12125   if (operand_mode == BLKmode)
12126     return 0;
12127
12128   /* We won't bother with store-flag operations involving function pointers
12129      when function pointers must be canonicalized before comparisons.  */
12130   if (targetm.have_canonicalize_funcptr_for_compare ()
12131       && ((POINTER_TYPE_P (TREE_TYPE (arg0))
12132            && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (arg0))))
12133           || (POINTER_TYPE_P (TREE_TYPE (arg1))
12134               && FUNC_OR_METHOD_TYPE_P (TREE_TYPE (TREE_TYPE (arg1))))))
12135     return 0;
12136
12137   STRIP_NOPS (arg0);
12138   STRIP_NOPS (arg1);
12139
12140   /* For vector typed comparisons emit code to generate the desired
12141      all-ones or all-zeros mask.  Conveniently use the VEC_COND_EXPR
12142      expander for this.  */
12143   if (TREE_CODE (ops->type) == VECTOR_TYPE)
12144     {
12145       tree ifexp = build2 (ops->code, ops->type, arg0, arg1);
12146       if (VECTOR_BOOLEAN_TYPE_P (ops->type)
12147           && expand_vec_cmp_expr_p (TREE_TYPE (arg0), ops->type, ops->code))
12148         return expand_vec_cmp_expr (ops->type, ifexp, target);
12149       else
12150         {
12151           tree if_true = constant_boolean_node (true, ops->type);
12152           tree if_false = constant_boolean_node (false, ops->type);
12153           return expand_vec_cond_expr (ops->type, ifexp, if_true,
12154                                        if_false, target);
12155         }
12156     }
12157
12158   /* Optimize (x % C1) == C2 or (x % C1) != C2 if it is beneficial
12159      into (x - C2) * C3 < C4.  */
12160   if ((ops->code == EQ_EXPR || ops->code == NE_EXPR)
12161       && TREE_CODE (arg0) == SSA_NAME
12162       && TREE_CODE (arg1) == INTEGER_CST)
12163     {
12164       enum tree_code new_code = maybe_optimize_mod_cmp (ops->code,
12165                                                         &arg0, &arg1);
12166       if (new_code != ops->code)
12167         {
12168           struct separate_ops nops = *ops;
12169           nops.code = ops->code = new_code;
12170           nops.op0 = arg0;
12171           nops.op1 = arg1;
12172           nops.type = TREE_TYPE (arg0);
12173           return do_store_flag (&nops, target, mode);
12174         }
12175     }
12176
12177   /* Get the rtx comparison code to use.  We know that EXP is a comparison
12178      operation of some type.  Some comparisons against 1 and -1 can be
12179      converted to comparisons with zero.  Do so here so that the tests
12180      below will be aware that we have a comparison with zero.   These
12181      tests will not catch constants in the first operand, but constants
12182      are rarely passed as the first operand.  */
12183
12184   switch (ops->code)
12185     {
12186     case EQ_EXPR:
12187       code = EQ;
12188       break;
12189     case NE_EXPR:
12190       code = NE;
12191       break;
12192     case LT_EXPR:
12193       if (integer_onep (arg1))
12194         arg1 = integer_zero_node, code = unsignedp ? LEU : LE;
12195       else
12196         code = unsignedp ? LTU : LT;
12197       break;
12198     case LE_EXPR:
12199       if (! unsignedp && integer_all_onesp (arg1))
12200         arg1 = integer_zero_node, code = LT;
12201       else
12202         code = unsignedp ? LEU : LE;
12203       break;
12204     case GT_EXPR:
12205       if (! unsignedp && integer_all_onesp (arg1))
12206         arg1 = integer_zero_node, code = GE;
12207       else
12208         code = unsignedp ? GTU : GT;
12209       break;
12210     case GE_EXPR:
12211       if (integer_onep (arg1))
12212         arg1 = integer_zero_node, code = unsignedp ? GTU : GT;
12213       else
12214         code = unsignedp ? GEU : GE;
12215       break;
12216
12217     case UNORDERED_EXPR:
12218       code = UNORDERED;
12219       break;
12220     case ORDERED_EXPR:
12221       code = ORDERED;
12222       break;
12223     case UNLT_EXPR:
12224       code = UNLT;
12225       break;
12226     case UNLE_EXPR:
12227       code = UNLE;
12228       break;
12229     case UNGT_EXPR:
12230       code = UNGT;
12231       break;
12232     case UNGE_EXPR:
12233       code = UNGE;
12234       break;
12235     case UNEQ_EXPR:
12236       code = UNEQ;
12237       break;
12238     case LTGT_EXPR:
12239       code = LTGT;
12240       break;
12241
12242     default:
12243       gcc_unreachable ();
12244     }
12245
12246   /* Put a constant second.  */
12247   if (TREE_CODE (arg0) == REAL_CST || TREE_CODE (arg0) == INTEGER_CST
12248       || TREE_CODE (arg0) == FIXED_CST)
12249     {
12250       std::swap (arg0, arg1);
12251       code = swap_condition (code);
12252     }
12253
12254   /* If this is an equality or inequality test of a single bit, we can
12255      do this by shifting the bit being tested to the low-order bit and
12256      masking the result with the constant 1.  If the condition was EQ,
12257      we xor it with 1.  This does not require an scc insn and is faster
12258      than an scc insn even if we have it.
12259
12260      The code to make this transformation was moved into fold_single_bit_test,
12261      so we just call into the folder and expand its result.  */
12262
12263   if ((code == NE || code == EQ)
12264       && integer_zerop (arg1)
12265       && (TYPE_PRECISION (ops->type) != 1 || TYPE_UNSIGNED (ops->type)))
12266     {
12267       gimple *srcstmt = get_def_for_expr (arg0, BIT_AND_EXPR);
12268       if (srcstmt
12269           && integer_pow2p (gimple_assign_rhs2 (srcstmt)))
12270         {
12271           enum tree_code tcode = code == NE ? NE_EXPR : EQ_EXPR;
12272           type = lang_hooks.types.type_for_mode (mode, unsignedp);
12273           tree temp = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (arg1),
12274                                        gimple_assign_rhs1 (srcstmt),
12275                                        gimple_assign_rhs2 (srcstmt));
12276           temp = fold_single_bit_test (loc, tcode, temp, arg1, type);
12277           if (temp)
12278             return expand_expr (temp, target, VOIDmode, EXPAND_NORMAL);
12279         }
12280     }
12281
12282   if (! get_subtarget (target)
12283       || GET_MODE (subtarget) != operand_mode)
12284     subtarget = 0;
12285
12286   expand_operands (arg0, arg1, subtarget, &op0, &op1, EXPAND_NORMAL);
12287
12288   if (target == 0)
12289     target = gen_reg_rtx (mode);
12290
12291   /* Try a cstore if possible.  */
12292   return emit_store_flag_force (target, code, op0, op1,
12293                                 operand_mode, unsignedp,
12294                                 (TYPE_PRECISION (ops->type) == 1
12295                                  && !TYPE_UNSIGNED (ops->type)) ? -1 : 1);
12296 }
12297 \f
12298 /* Attempt to generate a casesi instruction.  Returns 1 if successful,
12299    0 otherwise (i.e. if there is no casesi instruction).
12300
12301    DEFAULT_PROBABILITY is the probability of jumping to the default
12302    label.  */
12303 int
12304 try_casesi (tree index_type, tree index_expr, tree minval, tree range,
12305             rtx table_label, rtx default_label, rtx fallback_label,
12306             profile_probability default_probability)
12307 {
12308   class expand_operand ops[5];
12309   scalar_int_mode index_mode = SImode;
12310   rtx op1, op2, index;
12311
12312   if (! targetm.have_casesi ())
12313     return 0;
12314
12315   /* The index must be some form of integer.  Convert it to SImode.  */
12316   scalar_int_mode omode = SCALAR_INT_TYPE_MODE (index_type);
12317   if (GET_MODE_BITSIZE (omode) > GET_MODE_BITSIZE (index_mode))
12318     {
12319       rtx rangertx = expand_normal (range);
12320
12321       /* We must handle the endpoints in the original mode.  */
12322       index_expr = build2 (MINUS_EXPR, index_type,
12323                            index_expr, minval);
12324       minval = integer_zero_node;
12325       index = expand_normal (index_expr);
12326       if (default_label)
12327         emit_cmp_and_jump_insns (rangertx, index, LTU, NULL_RTX,
12328                                  omode, 1, default_label,
12329                                  default_probability);
12330       /* Now we can safely truncate.  */
12331       index = convert_to_mode (index_mode, index, 0);
12332     }
12333   else
12334     {
12335       if (omode != index_mode)
12336         {
12337           index_type = lang_hooks.types.type_for_mode (index_mode, 0);
12338           index_expr = fold_convert (index_type, index_expr);
12339         }
12340
12341       index = expand_normal (index_expr);
12342     }
12343
12344   do_pending_stack_adjust ();
12345
12346   op1 = expand_normal (minval);
12347   op2 = expand_normal (range);
12348
12349   create_input_operand (&ops[0], index, index_mode);
12350   create_convert_operand_from_type (&ops[1], op1, TREE_TYPE (minval));
12351   create_convert_operand_from_type (&ops[2], op2, TREE_TYPE (range));
12352   create_fixed_operand (&ops[3], table_label);
12353   create_fixed_operand (&ops[4], (default_label
12354                                   ? default_label
12355                                   : fallback_label));
12356   expand_jump_insn (targetm.code_for_casesi, 5, ops);
12357   return 1;
12358 }
12359
12360 /* Attempt to generate a tablejump instruction; same concept.  */
12361 /* Subroutine of the next function.
12362
12363    INDEX is the value being switched on, with the lowest value
12364    in the table already subtracted.
12365    MODE is its expected mode (needed if INDEX is constant).
12366    RANGE is the length of the jump table.
12367    TABLE_LABEL is a CODE_LABEL rtx for the table itself.
12368
12369    DEFAULT_LABEL is a CODE_LABEL rtx to jump to if the
12370    index value is out of range.
12371    DEFAULT_PROBABILITY is the probability of jumping to
12372    the default label.  */
12373
12374 static void
12375 do_tablejump (rtx index, machine_mode mode, rtx range, rtx table_label,
12376               rtx default_label, profile_probability default_probability)
12377 {
12378   rtx temp, vector;
12379
12380   if (INTVAL (range) > cfun->cfg->max_jumptable_ents)
12381     cfun->cfg->max_jumptable_ents = INTVAL (range);
12382
12383   /* Do an unsigned comparison (in the proper mode) between the index
12384      expression and the value which represents the length of the range.
12385      Since we just finished subtracting the lower bound of the range
12386      from the index expression, this comparison allows us to simultaneously
12387      check that the original index expression value is both greater than
12388      or equal to the minimum value of the range and less than or equal to
12389      the maximum value of the range.  */
12390
12391   if (default_label)
12392     emit_cmp_and_jump_insns (index, range, GTU, NULL_RTX, mode, 1,
12393                              default_label, default_probability);
12394
12395   /* If index is in range, it must fit in Pmode.
12396      Convert to Pmode so we can index with it.  */
12397   if (mode != Pmode)
12398     {
12399       unsigned int width;
12400
12401       /* We know the value of INDEX is between 0 and RANGE.  If we have a
12402          sign-extended subreg, and RANGE does not have the sign bit set, then
12403          we have a value that is valid for both sign and zero extension.  In
12404          this case, we get better code if we sign extend.  */
12405       if (GET_CODE (index) == SUBREG
12406           && SUBREG_PROMOTED_VAR_P (index)
12407           && SUBREG_PROMOTED_SIGNED_P (index)
12408           && ((width = GET_MODE_PRECISION (as_a <scalar_int_mode> (mode)))
12409               <= HOST_BITS_PER_WIDE_INT)
12410           && ! (UINTVAL (range) & (HOST_WIDE_INT_1U << (width - 1))))
12411         index = convert_to_mode (Pmode, index, 0);
12412       else
12413         index = convert_to_mode (Pmode, index, 1);
12414     }
12415
12416   /* Don't let a MEM slip through, because then INDEX that comes
12417      out of PIC_CASE_VECTOR_ADDRESS won't be a valid address,
12418      and break_out_memory_refs will go to work on it and mess it up.  */
12419 #ifdef PIC_CASE_VECTOR_ADDRESS
12420   if (flag_pic && !REG_P (index))
12421     index = copy_to_mode_reg (Pmode, index);
12422 #endif
12423
12424   /* ??? The only correct use of CASE_VECTOR_MODE is the one inside the
12425      GET_MODE_SIZE, because this indicates how large insns are.  The other
12426      uses should all be Pmode, because they are addresses.  This code
12427      could fail if addresses and insns are not the same size.  */
12428   index = simplify_gen_binary (MULT, Pmode, index,
12429                                gen_int_mode (GET_MODE_SIZE (CASE_VECTOR_MODE),
12430                                              Pmode));
12431   index = simplify_gen_binary (PLUS, Pmode, index,
12432                                gen_rtx_LABEL_REF (Pmode, table_label));
12433
12434 #ifdef PIC_CASE_VECTOR_ADDRESS
12435   if (flag_pic)
12436     index = PIC_CASE_VECTOR_ADDRESS (index);
12437   else
12438 #endif
12439     index = memory_address (CASE_VECTOR_MODE, index);
12440   temp = gen_reg_rtx (CASE_VECTOR_MODE);
12441   vector = gen_const_mem (CASE_VECTOR_MODE, index);
12442   convert_move (temp, vector, 0);
12443
12444   emit_jump_insn (targetm.gen_tablejump (temp, table_label));
12445
12446   /* If we are generating PIC code or if the table is PC-relative, the
12447      table and JUMP_INSN must be adjacent, so don't output a BARRIER.  */
12448   if (! CASE_VECTOR_PC_RELATIVE && ! flag_pic)
12449     emit_barrier ();
12450 }
12451
12452 int
12453 try_tablejump (tree index_type, tree index_expr, tree minval, tree range,
12454                rtx table_label, rtx default_label, 
12455                profile_probability default_probability)
12456 {
12457   rtx index;
12458
12459   if (! targetm.have_tablejump ())
12460     return 0;
12461
12462   index_expr = fold_build2 (MINUS_EXPR, index_type,
12463                             fold_convert (index_type, index_expr),
12464                             fold_convert (index_type, minval));
12465   index = expand_normal (index_expr);
12466   do_pending_stack_adjust ();
12467
12468   do_tablejump (index, TYPE_MODE (index_type),
12469                 convert_modes (TYPE_MODE (index_type),
12470                                TYPE_MODE (TREE_TYPE (range)),
12471                                expand_normal (range),
12472                                TYPE_UNSIGNED (TREE_TYPE (range))),
12473                 table_label, default_label, default_probability);
12474   return 1;
12475 }
12476
12477 /* Return a CONST_VECTOR rtx representing vector mask for
12478    a VECTOR_CST of booleans.  */
12479 static rtx
12480 const_vector_mask_from_tree (tree exp)
12481 {
12482   machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
12483   machine_mode inner = GET_MODE_INNER (mode);
12484
12485   rtx_vector_builder builder (mode, VECTOR_CST_NPATTERNS (exp),
12486                               VECTOR_CST_NELTS_PER_PATTERN (exp));
12487   unsigned int count = builder.encoded_nelts ();
12488   for (unsigned int i = 0; i < count; ++i)
12489     {
12490       tree elt = VECTOR_CST_ELT (exp, i);
12491       gcc_assert (TREE_CODE (elt) == INTEGER_CST);
12492       if (integer_zerop (elt))
12493         builder.quick_push (CONST0_RTX (inner));
12494       else if (integer_onep (elt)
12495                || integer_minus_onep (elt))
12496         builder.quick_push (CONSTM1_RTX (inner));
12497       else
12498         gcc_unreachable ();
12499     }
12500   return builder.build ();
12501 }
12502
12503 /* EXP is a VECTOR_CST in which each element is either all-zeros or all-ones.
12504    Return a constant scalar rtx of mode MODE in which bit X is set if element
12505    X of EXP is nonzero.  */
12506 static rtx
12507 const_scalar_mask_from_tree (scalar_int_mode mode, tree exp)
12508 {
12509   wide_int res = wi::zero (GET_MODE_PRECISION (mode));
12510   tree elt;
12511
12512   /* The result has a fixed number of bits so the input must too.  */
12513   unsigned int nunits = VECTOR_CST_NELTS (exp).to_constant ();
12514   for (unsigned int i = 0; i < nunits; ++i)
12515     {
12516       elt = VECTOR_CST_ELT (exp, i);
12517       gcc_assert (TREE_CODE (elt) == INTEGER_CST);
12518       if (integer_all_onesp (elt))
12519         res = wi::set_bit (res, i);
12520       else
12521         gcc_assert (integer_zerop (elt));
12522     }
12523
12524   return immed_wide_int_const (res, mode);
12525 }
12526
12527 /* Return a CONST_VECTOR rtx for a VECTOR_CST tree.  */
12528 static rtx
12529 const_vector_from_tree (tree exp)
12530 {
12531   machine_mode mode = TYPE_MODE (TREE_TYPE (exp));
12532
12533   if (initializer_zerop (exp))
12534     return CONST0_RTX (mode);
12535
12536   if (VECTOR_BOOLEAN_TYPE_P (TREE_TYPE (exp)))
12537     return const_vector_mask_from_tree (exp);
12538
12539   machine_mode inner = GET_MODE_INNER (mode);
12540
12541   rtx_vector_builder builder (mode, VECTOR_CST_NPATTERNS (exp),
12542                               VECTOR_CST_NELTS_PER_PATTERN (exp));
12543   unsigned int count = builder.encoded_nelts ();
12544   for (unsigned int i = 0; i < count; ++i)
12545     {
12546       tree elt = VECTOR_CST_ELT (exp, i);
12547       if (TREE_CODE (elt) == REAL_CST)
12548         builder.quick_push (const_double_from_real_value (TREE_REAL_CST (elt),
12549                                                           inner));
12550       else if (TREE_CODE (elt) == FIXED_CST)
12551         builder.quick_push (CONST_FIXED_FROM_FIXED_VALUE (TREE_FIXED_CST (elt),
12552                                                           inner));
12553       else
12554         builder.quick_push (immed_wide_int_const (wi::to_poly_wide (elt),
12555                                                   inner));
12556     }
12557   return builder.build ();
12558 }
12559
12560 /* Build a decl for a personality function given a language prefix.  */
12561
12562 tree
12563 build_personality_function (const char *lang)
12564 {
12565   const char *unwind_and_version;
12566   tree decl, type;
12567   char *name;
12568
12569   switch (targetm_common.except_unwind_info (&global_options))
12570     {
12571     case UI_NONE:
12572       return NULL;
12573     case UI_SJLJ:
12574       unwind_and_version = "_sj0";
12575       break;
12576     case UI_DWARF2:
12577     case UI_TARGET:
12578       unwind_and_version = "_v0";
12579       break;
12580     case UI_SEH:
12581       unwind_and_version = "_seh0";
12582       break;
12583     default:
12584       gcc_unreachable ();
12585     }
12586
12587   name = ACONCAT (("__", lang, "_personality", unwind_and_version, NULL));
12588
12589   type = build_function_type_list (unsigned_type_node,
12590                                    integer_type_node, integer_type_node,
12591                                    long_long_unsigned_type_node,
12592                                    ptr_type_node, ptr_type_node, NULL_TREE);
12593   decl = build_decl (UNKNOWN_LOCATION, FUNCTION_DECL,
12594                      get_identifier (name), type);
12595   DECL_ARTIFICIAL (decl) = 1;
12596   DECL_EXTERNAL (decl) = 1;
12597   TREE_PUBLIC (decl) = 1;
12598
12599   /* Zap the nonsensical SYMBOL_REF_DECL for this.  What we're left with
12600      are the flags assigned by targetm.encode_section_info.  */
12601   SET_SYMBOL_REF_DECL (XEXP (DECL_RTL (decl), 0), NULL);
12602
12603   return decl;
12604 }
12605
12606 /* Extracts the personality function of DECL and returns the corresponding
12607    libfunc.  */
12608
12609 rtx
12610 get_personality_function (tree decl)
12611 {
12612   tree personality = DECL_FUNCTION_PERSONALITY (decl);
12613   enum eh_personality_kind pk;
12614
12615   pk = function_needs_eh_personality (DECL_STRUCT_FUNCTION (decl));
12616   if (pk == eh_personality_none)
12617     return NULL;
12618
12619   if (!personality
12620       && pk == eh_personality_any)
12621     personality = lang_hooks.eh_personality ();
12622
12623   if (pk == eh_personality_lang)
12624     gcc_assert (personality != NULL_TREE);
12625
12626   return XEXP (DECL_RTL (personality), 0);
12627 }
12628
12629 /* Returns a tree for the size of EXP in bytes.  */
12630
12631 static tree
12632 tree_expr_size (const_tree exp)
12633 {
12634   if (DECL_P (exp)
12635       && DECL_SIZE_UNIT (exp) != 0)
12636     return DECL_SIZE_UNIT (exp);
12637   else
12638     return size_in_bytes (TREE_TYPE (exp));
12639 }
12640
12641 /* Return an rtx for the size in bytes of the value of EXP.  */
12642
12643 rtx
12644 expr_size (tree exp)
12645 {
12646   tree size;
12647
12648   if (TREE_CODE (exp) == WITH_SIZE_EXPR)
12649     size = TREE_OPERAND (exp, 1);
12650   else
12651     {
12652       size = tree_expr_size (exp);
12653       gcc_assert (size);
12654       gcc_assert (size == SUBSTITUTE_PLACEHOLDER_IN_EXPR (size, exp));
12655     }
12656
12657   return expand_expr (size, NULL_RTX, TYPE_MODE (sizetype), EXPAND_NORMAL);
12658 }
12659
12660 /* Return a wide integer for the size in bytes of the value of EXP, or -1
12661    if the size can vary or is larger than an integer.  */
12662
12663 static HOST_WIDE_INT
12664 int_expr_size (tree exp)
12665 {
12666   tree size;
12667
12668   if (TREE_CODE (exp) == WITH_SIZE_EXPR)
12669     size = TREE_OPERAND (exp, 1);
12670   else
12671     {
12672       size = tree_expr_size (exp);
12673       gcc_assert (size);
12674     }
12675
12676   if (size == 0 || !tree_fits_shwi_p (size))
12677     return -1;
12678
12679   return tree_to_shwi (size);
12680 }