xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/lower-subreg.c (revision 413d532bcc3f62d122e56d92e13ac64825a40baf)
1 /* Decompose multiword subregs.
2    Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
3    Contributed by Richard Henderson <rth@redhat.com>
4 		  Ian Lance Taylor <iant@google.com>
5 
6 This file is part of GCC.
7 
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12 
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17 
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21 
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "machmode.h"
26 #include "tm.h"
27 #include "rtl.h"
28 #include "tm_p.h"
29 #include "timevar.h"
30 #include "flags.h"
31 #include "insn-config.h"
32 #include "obstack.h"
33 #include "basic-block.h"
34 #include "recog.h"
35 #include "bitmap.h"
36 #include "expr.h"
37 #include "except.h"
38 #include "regs.h"
39 #include "tree-pass.h"
40 #include "df.h"
41 
42 #ifdef STACK_GROWS_DOWNWARD
43 # undef STACK_GROWS_DOWNWARD
44 # define STACK_GROWS_DOWNWARD 1
45 #else
46 # define STACK_GROWS_DOWNWARD 0
47 #endif
48 
49 DEF_VEC_P (bitmap);
50 DEF_VEC_ALLOC_P (bitmap,heap);
51 
52 /* Decompose multi-word pseudo-registers into individual
53    pseudo-registers when possible.  This is possible when all the uses
54    of a multi-word register are via SUBREG, or are copies of the
55    register to another location.  Breaking apart the register permits
56    more CSE and permits better register allocation.  */
57 
58 /* Bit N in this bitmap is set if regno N is used in a context in
59    which we can decompose it.  */
60 static bitmap decomposable_context;
61 
62 /* Bit N in this bitmap is set if regno N is used in a context in
63    which it can not be decomposed.  */
64 static bitmap non_decomposable_context;
65 
66 /* Bit N in the bitmap in element M of this array is set if there is a
67    copy from reg M to reg N.  */
68 static VEC(bitmap,heap) *reg_copy_graph;
69 
70 /* Return whether X is a simple object which we can take a word_mode
71    subreg of.  */
72 
73 static bool
74 simple_move_operand (rtx x)
75 {
76   if (GET_CODE (x) == SUBREG)
77     x = SUBREG_REG (x);
78 
79   if (!OBJECT_P (x))
80     return false;
81 
82   if (GET_CODE (x) == LABEL_REF
83       || GET_CODE (x) == SYMBOL_REF
84       || GET_CODE (x) == HIGH
85       || GET_CODE (x) == CONST)
86     return false;
87 
88   if (MEM_P (x)
89       && (MEM_VOLATILE_P (x)
90 	  || mode_dependent_address_p (XEXP (x, 0))))
91     return false;
92 
93   return true;
94 }
95 
96 /* If INSN is a single set between two objects, return the single set.
97    Such an insn can always be decomposed.  INSN should have been
98    passed to recog and extract_insn before this is called.  */
99 
100 static rtx
101 simple_move (rtx insn)
102 {
103   rtx x;
104   rtx set;
105   enum machine_mode mode;
106 
107   if (recog_data.n_operands != 2)
108     return NULL_RTX;
109 
110   set = single_set (insn);
111   if (!set)
112     return NULL_RTX;
113 
114   x = SET_DEST (set);
115   if (x != recog_data.operand[0] && x != recog_data.operand[1])
116     return NULL_RTX;
117   if (!simple_move_operand (x))
118     return NULL_RTX;
119 
120   x = SET_SRC (set);
121   if (x != recog_data.operand[0] && x != recog_data.operand[1])
122     return NULL_RTX;
123   /* For the src we can handle ASM_OPERANDS, and it is beneficial for
124      things like x86 rdtsc which returns a DImode value.  */
125   if (GET_CODE (x) != ASM_OPERANDS
126       && !simple_move_operand (x))
127     return NULL_RTX;
128 
129   /* We try to decompose in integer modes, to avoid generating
130      inefficient code copying between integer and floating point
131      registers.  That means that we can't decompose if this is a
132      non-integer mode for which there is no integer mode of the same
133      size.  */
134   mode = GET_MODE (SET_SRC (set));
135   if (!SCALAR_INT_MODE_P (mode)
136       && (mode_for_size (GET_MODE_SIZE (mode) * BITS_PER_UNIT, MODE_INT, 0)
137 	  == BLKmode))
138     return NULL_RTX;
139 
140   /* Reject PARTIAL_INT modes.  They are used for processor specific
141      purposes and it's probably best not to tamper with them.  */
142   if (GET_MODE_CLASS (mode) == MODE_PARTIAL_INT)
143     return NULL_RTX;
144 
145   return set;
146 }
147 
148 /* If SET is a copy from one multi-word pseudo-register to another,
149    record that in reg_copy_graph.  Return whether it is such a
150    copy.  */
151 
152 static bool
153 find_pseudo_copy (rtx set)
154 {
155   rtx dest = SET_DEST (set);
156   rtx src = SET_SRC (set);
157   unsigned int rd, rs;
158   bitmap b;
159 
160   if (!REG_P (dest) || !REG_P (src))
161     return false;
162 
163   rd = REGNO (dest);
164   rs = REGNO (src);
165   if (HARD_REGISTER_NUM_P (rd) || HARD_REGISTER_NUM_P (rs))
166     return false;
167 
168   if (GET_MODE_SIZE (GET_MODE (dest)) <= UNITS_PER_WORD)
169     return false;
170 
171   b = VEC_index (bitmap, reg_copy_graph, rs);
172   if (b == NULL)
173     {
174       b = BITMAP_ALLOC (NULL);
175       VEC_replace (bitmap, reg_copy_graph, rs, b);
176     }
177 
178   bitmap_set_bit (b, rd);
179 
180   return true;
181 }
182 
183 /* Look through the registers in DECOMPOSABLE_CONTEXT.  For each case
184    where they are copied to another register, add the register to
185    which they are copied to DECOMPOSABLE_CONTEXT.  Use
186    NON_DECOMPOSABLE_CONTEXT to limit this--we don't bother to track
187    copies of registers which are in NON_DECOMPOSABLE_CONTEXT.  */
188 
189 static void
190 propagate_pseudo_copies (void)
191 {
192   bitmap queue, propagate;
193 
194   queue = BITMAP_ALLOC (NULL);
195   propagate = BITMAP_ALLOC (NULL);
196 
197   bitmap_copy (queue, decomposable_context);
198   do
199     {
200       bitmap_iterator iter;
201       unsigned int i;
202 
203       bitmap_clear (propagate);
204 
205       EXECUTE_IF_SET_IN_BITMAP (queue, 0, i, iter)
206 	{
207 	  bitmap b = VEC_index (bitmap, reg_copy_graph, i);
208 	  if (b)
209 	    bitmap_ior_and_compl_into (propagate, b, non_decomposable_context);
210 	}
211 
212       bitmap_and_compl (queue, propagate, decomposable_context);
213       bitmap_ior_into (decomposable_context, propagate);
214     }
215   while (!bitmap_empty_p (queue));
216 
217   BITMAP_FREE (queue);
218   BITMAP_FREE (propagate);
219 }
220 
221 /* A pointer to one of these values is passed to
222    find_decomposable_subregs via for_each_rtx.  */
223 
224 enum classify_move_insn
225 {
226   /* Not a simple move from one location to another.  */
227   NOT_SIMPLE_MOVE,
228   /* A simple move from one pseudo-register to another.  */
229   SIMPLE_PSEUDO_REG_MOVE,
230   /* A simple move involving a non-pseudo-register.  */
231   SIMPLE_MOVE
232 };
233 
234 /* This is called via for_each_rtx.  If we find a SUBREG which we
235    could use to decompose a pseudo-register, set a bit in
236    DECOMPOSABLE_CONTEXT.  If we find an unadorned register which is
237    not a simple pseudo-register copy, DATA will point at the type of
238    move, and we set a bit in DECOMPOSABLE_CONTEXT or
239    NON_DECOMPOSABLE_CONTEXT as appropriate.  */
240 
241 static int
242 find_decomposable_subregs (rtx *px, void *data)
243 {
244   enum classify_move_insn *pcmi = (enum classify_move_insn *) data;
245   rtx x = *px;
246 
247   if (x == NULL_RTX)
248     return 0;
249 
250   if (GET_CODE (x) == SUBREG)
251     {
252       rtx inner = SUBREG_REG (x);
253       unsigned int regno, outer_size, inner_size, outer_words, inner_words;
254 
255       if (!REG_P (inner))
256 	return 0;
257 
258       regno = REGNO (inner);
259       if (HARD_REGISTER_NUM_P (regno))
260 	return -1;
261 
262       outer_size = GET_MODE_SIZE (GET_MODE (x));
263       inner_size = GET_MODE_SIZE (GET_MODE (inner));
264       outer_words = (outer_size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
265       inner_words = (inner_size + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
266 
267       /* We only try to decompose single word subregs of multi-word
268 	 registers.  When we find one, we return -1 to avoid iterating
269 	 over the inner register.
270 
271 	 ??? This doesn't allow, e.g., DImode subregs of TImode values
272 	 on 32-bit targets.  We would need to record the way the
273 	 pseudo-register was used, and only decompose if all the uses
274 	 were the same number and size of pieces.  Hopefully this
275 	 doesn't happen much.  */
276 
277       if (outer_words == 1 && inner_words > 1)
278 	{
279 	  bitmap_set_bit (decomposable_context, regno);
280 	  return -1;
281 	}
282 
283       /* If this is a cast from one mode to another, where the modes
284 	 have the same size, and they are not tieable, then mark this
285 	 register as non-decomposable.  If we decompose it we are
286 	 likely to mess up whatever the backend is trying to do.  */
287       if (outer_words > 1
288 	  && outer_size == inner_size
289 	  && !MODES_TIEABLE_P (GET_MODE (x), GET_MODE (inner)))
290 	{
291 	  bitmap_set_bit (non_decomposable_context, regno);
292 	  return -1;
293 	}
294     }
295   else if (REG_P (x))
296     {
297       unsigned int regno;
298 
299       /* We will see an outer SUBREG before we see the inner REG, so
300 	 when we see a plain REG here it means a direct reference to
301 	 the register.
302 
303 	 If this is not a simple copy from one location to another,
304 	 then we can not decompose this register.  If this is a simple
305 	 copy from one pseudo-register to another, and the mode is right
306 	 then we mark the register as decomposable.
307 	 Otherwise we don't say anything about this register --
308 	 it could be decomposed, but whether that would be
309 	 profitable depends upon how it is used elsewhere.
310 
311 	 We only set bits in the bitmap for multi-word
312 	 pseudo-registers, since those are the only ones we care about
313 	 and it keeps the size of the bitmaps down.  */
314 
315       regno = REGNO (x);
316       if (!HARD_REGISTER_NUM_P (regno)
317 	  && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD)
318 	{
319 	  switch (*pcmi)
320 	    {
321 	    case NOT_SIMPLE_MOVE:
322 	      bitmap_set_bit (non_decomposable_context, regno);
323 	      break;
324 	    case SIMPLE_PSEUDO_REG_MOVE:
325 	      if (MODES_TIEABLE_P (GET_MODE (x), word_mode))
326 		bitmap_set_bit (decomposable_context, regno);
327 	      break;
328 	    case SIMPLE_MOVE:
329 	      break;
330 	    default:
331 	      gcc_unreachable ();
332 	    }
333 	}
334     }
335   else if (MEM_P (x))
336     {
337       enum classify_move_insn cmi_mem = NOT_SIMPLE_MOVE;
338 
339       /* Any registers used in a MEM do not participate in a
340 	 SIMPLE_MOVE or SIMPLE_PSEUDO_REG_MOVE.  Do our own recursion
341 	 here, and return -1 to block the parent's recursion.  */
342       for_each_rtx (&XEXP (x, 0), find_decomposable_subregs, &cmi_mem);
343       return -1;
344     }
345 
346   return 0;
347 }
348 
349 /* Decompose REGNO into word-sized components.  We smash the REG node
350    in place.  This ensures that (1) something goes wrong quickly if we
351    fail to make some replacement, and (2) the debug information inside
352    the symbol table is automatically kept up to date.  */
353 
354 static void
355 decompose_register (unsigned int regno)
356 {
357   rtx reg;
358   unsigned int words, i;
359   rtvec v;
360 
361   reg = regno_reg_rtx[regno];
362 
363   regno_reg_rtx[regno] = NULL_RTX;
364 
365   words = GET_MODE_SIZE (GET_MODE (reg));
366   words = (words + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
367 
368   v = rtvec_alloc (words);
369   for (i = 0; i < words; ++i)
370     RTVEC_ELT (v, i) = gen_reg_rtx_offset (reg, word_mode, i * UNITS_PER_WORD);
371 
372   PUT_CODE (reg, CONCATN);
373   XVEC (reg, 0) = v;
374 
375   if (dump_file)
376     {
377       fprintf (dump_file, "; Splitting reg %u ->", regno);
378       for (i = 0; i < words; ++i)
379 	fprintf (dump_file, " %u", REGNO (XVECEXP (reg, 0, i)));
380       fputc ('\n', dump_file);
381     }
382 }
383 
384 /* Get a SUBREG of a CONCATN.  */
385 
386 static rtx
387 simplify_subreg_concatn (enum machine_mode outermode, rtx op,
388 			 unsigned int byte)
389 {
390   unsigned int inner_size;
391   enum machine_mode innermode;
392   rtx part;
393   unsigned int final_offset;
394 
395   gcc_assert (GET_CODE (op) == CONCATN);
396   gcc_assert (byte % GET_MODE_SIZE (outermode) == 0);
397 
398   innermode = GET_MODE (op);
399   gcc_assert (byte < GET_MODE_SIZE (innermode));
400   gcc_assert (GET_MODE_SIZE (outermode) <= GET_MODE_SIZE (innermode));
401 
402   inner_size = GET_MODE_SIZE (innermode) / XVECLEN (op, 0);
403   part = XVECEXP (op, 0, byte / inner_size);
404   final_offset = byte % inner_size;
405   if (final_offset + GET_MODE_SIZE (outermode) > inner_size)
406     return NULL_RTX;
407 
408   return simplify_gen_subreg (outermode, part, GET_MODE (part), final_offset);
409 }
410 
411 /* Wrapper around simplify_gen_subreg which handles CONCATN.  */
412 
413 static rtx
414 simplify_gen_subreg_concatn (enum machine_mode outermode, rtx op,
415 			     enum machine_mode innermode, unsigned int byte)
416 {
417   rtx ret;
418 
419   /* We have to handle generating a SUBREG of a SUBREG of a CONCATN.
420      If OP is a SUBREG of a CONCATN, then it must be a simple mode
421      change with the same size and offset 0, or it must extract a
422      part.  We shouldn't see anything else here.  */
423   if (GET_CODE (op) == SUBREG && GET_CODE (SUBREG_REG (op)) == CONCATN)
424     {
425       rtx op2;
426 
427       if ((GET_MODE_SIZE (GET_MODE (op))
428 	   == GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))))
429 	  && SUBREG_BYTE (op) == 0)
430 	return simplify_gen_subreg_concatn (outermode, SUBREG_REG (op),
431 					    GET_MODE (SUBREG_REG (op)), byte);
432 
433       op2 = simplify_subreg_concatn (GET_MODE (op), SUBREG_REG (op),
434 				     SUBREG_BYTE (op));
435       if (op2 == NULL_RTX)
436 	{
437 	  /* We don't handle paradoxical subregs here.  */
438 	  gcc_assert (GET_MODE_SIZE (outermode)
439 		      <= GET_MODE_SIZE (GET_MODE (op)));
440 	  gcc_assert (GET_MODE_SIZE (GET_MODE (op))
441 		      <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))));
442 	  op2 = simplify_subreg_concatn (outermode, SUBREG_REG (op),
443 					 byte + SUBREG_BYTE (op));
444 	  gcc_assert (op2 != NULL_RTX);
445 	  return op2;
446 	}
447 
448       op = op2;
449       gcc_assert (op != NULL_RTX);
450       gcc_assert (innermode == GET_MODE (op));
451     }
452 
453   if (GET_CODE (op) == CONCATN)
454     return simplify_subreg_concatn (outermode, op, byte);
455 
456   ret = simplify_gen_subreg (outermode, op, innermode, byte);
457 
458   /* If we see an insn like (set (reg:DI) (subreg:DI (reg:SI) 0)) then
459      resolve_simple_move will ask for the high part of the paradoxical
460      subreg, which does not have a value.  Just return a zero.  */
461   if (ret == NULL_RTX
462       && GET_CODE (op) == SUBREG
463       && SUBREG_BYTE (op) == 0
464       && (GET_MODE_SIZE (innermode)
465 	  > GET_MODE_SIZE (GET_MODE (SUBREG_REG (op)))))
466     return CONST0_RTX (outermode);
467 
468   gcc_assert (ret != NULL_RTX);
469   return ret;
470 }
471 
472 /* Return whether we should resolve X into the registers into which it
473    was decomposed.  */
474 
475 static bool
476 resolve_reg_p (rtx x)
477 {
478   return GET_CODE (x) == CONCATN;
479 }
480 
481 /* Return whether X is a SUBREG of a register which we need to
482    resolve.  */
483 
484 static bool
485 resolve_subreg_p (rtx x)
486 {
487   if (GET_CODE (x) != SUBREG)
488     return false;
489   return resolve_reg_p (SUBREG_REG (x));
490 }
491 
492 /* This is called via for_each_rtx.  Look for SUBREGs which need to be
493    decomposed.  */
494 
495 static int
496 resolve_subreg_use (rtx *px, void *data)
497 {
498   rtx insn = (rtx) data;
499   rtx x = *px;
500 
501   if (x == NULL_RTX)
502     return 0;
503 
504   if (resolve_subreg_p (x))
505     {
506       x = simplify_subreg_concatn (GET_MODE (x), SUBREG_REG (x),
507 				   SUBREG_BYTE (x));
508 
509       /* It is possible for a note to contain a reference which we can
510 	 decompose.  In this case, return 1 to the caller to indicate
511 	 that the note must be removed.  */
512       if (!x)
513 	{
514 	  gcc_assert (!insn);
515 	  return 1;
516 	}
517 
518       validate_change (insn, px, x, 1);
519       return -1;
520     }
521 
522   if (resolve_reg_p (x))
523     {
524       /* Return 1 to the caller to indicate that we found a direct
525 	 reference to a register which is being decomposed.  This can
526 	 happen inside notes, multiword shift or zero-extend
527 	 instructions.  */
528       return 1;
529     }
530 
531   return 0;
532 }
533 
534 /* This is called via for_each_rtx.  Look for SUBREGs which can be
535    decomposed and decomposed REGs that need copying.  */
536 
537 static int
538 adjust_decomposed_uses (rtx *px, void *data ATTRIBUTE_UNUSED)
539 {
540   rtx x = *px;
541 
542   if (x == NULL_RTX)
543     return 0;
544 
545   if (resolve_subreg_p (x))
546     {
547       x = simplify_subreg_concatn (GET_MODE (x), SUBREG_REG (x),
548 				   SUBREG_BYTE (x));
549 
550       if (x)
551 	*px = x;
552       else
553 	x = copy_rtx (*px);
554     }
555 
556   if (resolve_reg_p (x))
557     *px = copy_rtx (x);
558 
559   return 0;
560 }
561 
562 /* Resolve any decomposed registers which appear in register notes on
563    INSN.  */
564 
565 static void
566 resolve_reg_notes (rtx insn)
567 {
568   rtx *pnote, note;
569 
570   note = find_reg_equal_equiv_note (insn);
571   if (note)
572     {
573       int old_count = num_validated_changes ();
574       if (for_each_rtx (&XEXP (note, 0), resolve_subreg_use, NULL))
575 	remove_note (insn, note);
576       else
577 	if (old_count != num_validated_changes ())
578 	  df_notes_rescan (insn);
579     }
580 
581   pnote = &REG_NOTES (insn);
582   while (*pnote != NULL_RTX)
583     {
584       bool del = false;
585 
586       note = *pnote;
587       switch (REG_NOTE_KIND (note))
588 	{
589 	case REG_DEAD:
590 	case REG_UNUSED:
591 	  if (resolve_reg_p (XEXP (note, 0)))
592 	    del = true;
593 	  break;
594 
595 	default:
596 	  break;
597 	}
598 
599       if (del)
600 	*pnote = XEXP (note, 1);
601       else
602 	pnote = &XEXP (note, 1);
603     }
604 }
605 
606 /* Return whether X can be decomposed into subwords.  */
607 
608 static bool
609 can_decompose_p (rtx x)
610 {
611   if (REG_P (x))
612     {
613       unsigned int regno = REGNO (x);
614 
615       if (HARD_REGISTER_NUM_P (regno))
616 	return (validate_subreg (word_mode, GET_MODE (x), x, UNITS_PER_WORD)
617 		&& HARD_REGNO_MODE_OK (regno, word_mode));
618       else
619 	return !bitmap_bit_p (non_decomposable_context, regno);
620     }
621 
622   return true;
623 }
624 
625 /* Decompose the registers used in a simple move SET within INSN.  If
626    we don't change anything, return INSN, otherwise return the start
627    of the sequence of moves.  */
628 
629 static rtx
630 resolve_simple_move (rtx set, rtx insn)
631 {
632   rtx src, dest, real_dest, insns;
633   enum machine_mode orig_mode, dest_mode;
634   unsigned int words;
635   bool pushing;
636 
637   src = SET_SRC (set);
638   dest = SET_DEST (set);
639   orig_mode = GET_MODE (dest);
640 
641   words = (GET_MODE_SIZE (orig_mode) + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
642   if (words <= 1)
643     return insn;
644 
645   start_sequence ();
646 
647   /* We have to handle copying from a SUBREG of a decomposed reg where
648      the SUBREG is larger than word size.  Rather than assume that we
649      can take a word_mode SUBREG of the destination, we copy to a new
650      register and then copy that to the destination.  */
651 
652   real_dest = NULL_RTX;
653 
654   if (GET_CODE (src) == SUBREG
655       && resolve_reg_p (SUBREG_REG (src))
656       && (SUBREG_BYTE (src) != 0
657 	  || (GET_MODE_SIZE (orig_mode)
658 	      != GET_MODE_SIZE (GET_MODE (SUBREG_REG (src))))))
659     {
660       real_dest = dest;
661       dest = gen_reg_rtx (orig_mode);
662       if (REG_P (real_dest))
663 	REG_ATTRS (dest) = REG_ATTRS (real_dest);
664     }
665 
666   /* Similarly if we are copying to a SUBREG of a decomposed reg where
667      the SUBREG is larger than word size.  */
668 
669   if (GET_CODE (dest) == SUBREG
670       && resolve_reg_p (SUBREG_REG (dest))
671       && (SUBREG_BYTE (dest) != 0
672 	  || (GET_MODE_SIZE (orig_mode)
673 	      != GET_MODE_SIZE (GET_MODE (SUBREG_REG (dest))))))
674     {
675       rtx reg, minsn, smove;
676 
677       reg = gen_reg_rtx (orig_mode);
678       minsn = emit_move_insn (reg, src);
679       smove = single_set (minsn);
680       gcc_assert (smove != NULL_RTX);
681       resolve_simple_move (smove, minsn);
682       src = reg;
683     }
684 
685   /* If we didn't have any big SUBREGS of decomposed registers, and
686      neither side of the move is a register we are decomposing, then
687      we don't have to do anything here.  */
688 
689   if (src == SET_SRC (set)
690       && dest == SET_DEST (set)
691       && !resolve_reg_p (src)
692       && !resolve_subreg_p (src)
693       && !resolve_reg_p (dest)
694       && !resolve_subreg_p (dest))
695     {
696       end_sequence ();
697       return insn;
698     }
699 
700   /* It's possible for the code to use a subreg of a decomposed
701      register while forming an address.  We need to handle that before
702      passing the address to emit_move_insn.  We pass NULL_RTX as the
703      insn parameter to resolve_subreg_use because we can not validate
704      the insn yet.  */
705   if (MEM_P (src) || MEM_P (dest))
706     {
707       int acg;
708 
709       if (MEM_P (src))
710 	for_each_rtx (&XEXP (src, 0), resolve_subreg_use, NULL_RTX);
711       if (MEM_P (dest))
712 	for_each_rtx (&XEXP (dest, 0), resolve_subreg_use, NULL_RTX);
713       acg = apply_change_group ();
714       gcc_assert (acg);
715     }
716 
717   /* If SRC is a register which we can't decompose, or has side
718      effects, we need to move via a temporary register.  */
719 
720   if (!can_decompose_p (src)
721       || side_effects_p (src)
722       || GET_CODE (src) == ASM_OPERANDS)
723     {
724       rtx reg;
725 
726       reg = gen_reg_rtx (orig_mode);
727       emit_move_insn (reg, src);
728       src = reg;
729     }
730 
731   /* If DEST is a register which we can't decompose, or has side
732      effects, we need to first move to a temporary register.  We
733      handle the common case of pushing an operand directly.  We also
734      go through a temporary register if it holds a floating point
735      value.  This gives us better code on systems which can't move
736      data easily between integer and floating point registers.  */
737 
738   dest_mode = orig_mode;
739   pushing = push_operand (dest, dest_mode);
740   if (!can_decompose_p (dest)
741       || (side_effects_p (dest) && !pushing)
742       || (!SCALAR_INT_MODE_P (dest_mode)
743 	  && !resolve_reg_p (dest)
744 	  && !resolve_subreg_p (dest)))
745     {
746       if (real_dest == NULL_RTX)
747 	real_dest = dest;
748       if (!SCALAR_INT_MODE_P (dest_mode))
749 	{
750 	  dest_mode = mode_for_size (GET_MODE_SIZE (dest_mode) * BITS_PER_UNIT,
751 				     MODE_INT, 0);
752 	  gcc_assert (dest_mode != BLKmode);
753 	}
754       dest = gen_reg_rtx (dest_mode);
755       if (REG_P (real_dest))
756 	REG_ATTRS (dest) = REG_ATTRS (real_dest);
757     }
758 
759   if (pushing)
760     {
761       unsigned int i, j, jinc;
762 
763       gcc_assert (GET_MODE_SIZE (orig_mode) % UNITS_PER_WORD == 0);
764       gcc_assert (GET_CODE (XEXP (dest, 0)) != PRE_MODIFY);
765       gcc_assert (GET_CODE (XEXP (dest, 0)) != POST_MODIFY);
766 
767       if (WORDS_BIG_ENDIAN == STACK_GROWS_DOWNWARD)
768 	{
769 	  j = 0;
770 	  jinc = 1;
771 	}
772       else
773 	{
774 	  j = words - 1;
775 	  jinc = -1;
776 	}
777 
778       for (i = 0; i < words; ++i, j += jinc)
779 	{
780 	  rtx temp;
781 
782 	  temp = copy_rtx (XEXP (dest, 0));
783 	  temp = adjust_automodify_address_nv (dest, word_mode, temp,
784 					       j * UNITS_PER_WORD);
785 	  emit_move_insn (temp,
786 			  simplify_gen_subreg_concatn (word_mode, src,
787 						       orig_mode,
788 						       j * UNITS_PER_WORD));
789 	}
790     }
791   else
792     {
793       unsigned int i;
794 
795       if (REG_P (dest) && !HARD_REGISTER_NUM_P (REGNO (dest)))
796 	emit_clobber (dest);
797 
798       for (i = 0; i < words; ++i)
799 	emit_move_insn (simplify_gen_subreg_concatn (word_mode, dest,
800 						     dest_mode,
801 						     i * UNITS_PER_WORD),
802 			simplify_gen_subreg_concatn (word_mode, src,
803 						     orig_mode,
804 						     i * UNITS_PER_WORD));
805     }
806 
807   if (real_dest != NULL_RTX)
808     {
809       rtx mdest, minsn, smove;
810 
811       if (dest_mode == orig_mode)
812 	mdest = dest;
813       else
814 	mdest = simplify_gen_subreg (orig_mode, dest, GET_MODE (dest), 0);
815       minsn = emit_move_insn (real_dest, mdest);
816 
817       smove = single_set (minsn);
818       gcc_assert (smove != NULL_RTX);
819 
820       resolve_simple_move (smove, minsn);
821     }
822 
823   insns = get_insns ();
824   end_sequence ();
825 
826   copy_reg_eh_region_note_forward (insn, insns, NULL_RTX);
827 
828   emit_insn_before (insns, insn);
829 
830   delete_insn (insn);
831 
832   return insns;
833 }
834 
835 /* Change a CLOBBER of a decomposed register into a CLOBBER of the
836    component registers.  Return whether we changed something.  */
837 
838 static bool
839 resolve_clobber (rtx pat, rtx insn)
840 {
841   rtx reg;
842   enum machine_mode orig_mode;
843   unsigned int words, i;
844   int ret;
845 
846   reg = XEXP (pat, 0);
847   if (!resolve_reg_p (reg) && !resolve_subreg_p (reg))
848     return false;
849 
850   orig_mode = GET_MODE (reg);
851   words = GET_MODE_SIZE (orig_mode);
852   words = (words + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
853 
854   ret = validate_change (NULL_RTX, &XEXP (pat, 0),
855 			 simplify_gen_subreg_concatn (word_mode, reg,
856 						      orig_mode, 0),
857 			 0);
858   df_insn_rescan (insn);
859   gcc_assert (ret != 0);
860 
861   for (i = words - 1; i > 0; --i)
862     {
863       rtx x;
864 
865       x = simplify_gen_subreg_concatn (word_mode, reg, orig_mode,
866 				       i * UNITS_PER_WORD);
867       x = gen_rtx_CLOBBER (VOIDmode, x);
868       emit_insn_after (x, insn);
869     }
870 
871   resolve_reg_notes (insn);
872 
873   return true;
874 }
875 
876 /* A USE of a decomposed register is no longer meaningful.  Return
877    whether we changed something.  */
878 
879 static bool
880 resolve_use (rtx pat, rtx insn)
881 {
882   if (resolve_reg_p (XEXP (pat, 0)) || resolve_subreg_p (XEXP (pat, 0)))
883     {
884       delete_insn (insn);
885       return true;
886     }
887 
888   resolve_reg_notes (insn);
889 
890   return false;
891 }
892 
893 /* A VAR_LOCATION can be simplified.  */
894 
895 static void
896 resolve_debug (rtx insn)
897 {
898   for_each_rtx (&PATTERN (insn), adjust_decomposed_uses, NULL_RTX);
899 
900   df_insn_rescan (insn);
901 
902   resolve_reg_notes (insn);
903 }
904 
905 /* Checks if INSN is a decomposable multiword-shift or zero-extend and
906    sets the decomposable_context bitmap accordingly.  A non-zero value
907    is returned if a decomposable insn has been found.  */
908 
909 static int
910 find_decomposable_shift_zext (rtx insn)
911 {
912   rtx set;
913   rtx op;
914   rtx op_operand;
915 
916   set = single_set (insn);
917   if (!set)
918     return 0;
919 
920   op = SET_SRC (set);
921   if (GET_CODE (op) != ASHIFT
922       && GET_CODE (op) != LSHIFTRT
923       && GET_CODE (op) != ZERO_EXTEND)
924     return 0;
925 
926   op_operand = XEXP (op, 0);
927   if (!REG_P (SET_DEST (set)) || !REG_P (op_operand)
928       || HARD_REGISTER_NUM_P (REGNO (SET_DEST (set)))
929       || HARD_REGISTER_NUM_P (REGNO (op_operand))
930       || !SCALAR_INT_MODE_P (GET_MODE (op)))
931     return 0;
932 
933   if (GET_CODE (op) == ZERO_EXTEND)
934     {
935       if (GET_MODE (op_operand) != word_mode
936 	  || GET_MODE_BITSIZE (GET_MODE (op)) != 2 * BITS_PER_WORD)
937 	return 0;
938     }
939   else /* left or right shift */
940     {
941       if (!CONST_INT_P (XEXP (op, 1))
942 	  || INTVAL (XEXP (op, 1)) < BITS_PER_WORD
943 	  || GET_MODE_BITSIZE (GET_MODE (op_operand)) != 2 * BITS_PER_WORD)
944 	return 0;
945     }
946 
947   bitmap_set_bit (decomposable_context, REGNO (SET_DEST (set)));
948 
949   if (GET_CODE (op) != ZERO_EXTEND)
950     bitmap_set_bit (decomposable_context, REGNO (op_operand));
951 
952   return 1;
953 }
954 
955 /* Decompose a more than word wide shift (in INSN) of a multiword
956    pseudo or a multiword zero-extend of a wordmode pseudo into a move
957    and 'set to zero' insn.  Return a pointer to the new insn when a
958    replacement was done.  */
959 
960 static rtx
961 resolve_shift_zext (rtx insn)
962 {
963   rtx set;
964   rtx op;
965   rtx op_operand;
966   rtx insns;
967   rtx src_reg, dest_reg, dest_zero;
968   int src_reg_num, dest_reg_num, offset1, offset2, src_offset;
969 
970   set = single_set (insn);
971   if (!set)
972     return NULL_RTX;
973 
974   op = SET_SRC (set);
975   if (GET_CODE (op) != ASHIFT
976       && GET_CODE (op) != LSHIFTRT
977       && GET_CODE (op) != ZERO_EXTEND)
978     return NULL_RTX;
979 
980   op_operand = XEXP (op, 0);
981 
982   if (!resolve_reg_p (SET_DEST (set)) && !resolve_reg_p (op_operand))
983     return NULL_RTX;
984 
985   /* src_reg_num is the number of the word mode register which we
986      are operating on.  For a left shift and a zero_extend on little
987      endian machines this is register 0.  */
988   src_reg_num = GET_CODE (op) == LSHIFTRT ? 1 : 0;
989 
990   if (WORDS_BIG_ENDIAN
991       && GET_MODE_SIZE (GET_MODE (op_operand)) > UNITS_PER_WORD)
992     src_reg_num = 1 - src_reg_num;
993 
994   if (GET_CODE (op) == ZERO_EXTEND)
995     dest_reg_num = WORDS_BIG_ENDIAN ? 1 : 0;
996   else
997     dest_reg_num = 1 - src_reg_num;
998 
999   offset1 = UNITS_PER_WORD * dest_reg_num;
1000   offset2 = UNITS_PER_WORD * (1 - dest_reg_num);
1001   src_offset = UNITS_PER_WORD * src_reg_num;
1002 
1003   if (WORDS_BIG_ENDIAN != BYTES_BIG_ENDIAN)
1004     {
1005       offset1 += UNITS_PER_WORD - 1;
1006       offset2 += UNITS_PER_WORD - 1;
1007       src_offset += UNITS_PER_WORD - 1;
1008     }
1009 
1010   start_sequence ();
1011 
1012   dest_reg = simplify_gen_subreg_concatn (word_mode, SET_DEST (set),
1013                                           GET_MODE (SET_DEST (set)),
1014                                           offset1);
1015   dest_zero = simplify_gen_subreg_concatn (word_mode, SET_DEST (set),
1016                                            GET_MODE (SET_DEST (set)),
1017                                            offset2);
1018   src_reg = simplify_gen_subreg_concatn (word_mode, op_operand,
1019                                          GET_MODE (op_operand),
1020                                          src_offset);
1021   if (GET_CODE (op) != ZERO_EXTEND)
1022     {
1023       int shift_count = INTVAL (XEXP (op, 1));
1024       if (shift_count > BITS_PER_WORD)
1025 	src_reg = expand_shift (GET_CODE (op) == ASHIFT ?
1026 				LSHIFT_EXPR : RSHIFT_EXPR,
1027 				word_mode, src_reg,
1028 				build_int_cst (NULL_TREE,
1029 					       shift_count - BITS_PER_WORD),
1030 				dest_reg, 1);
1031     }
1032 
1033   if (dest_reg != src_reg)
1034     emit_move_insn (dest_reg, src_reg);
1035   emit_move_insn (dest_zero, CONST0_RTX (word_mode));
1036   insns = get_insns ();
1037 
1038   end_sequence ();
1039 
1040   emit_insn_before (insns, insn);
1041 
1042   if (dump_file)
1043     {
1044       rtx in;
1045       fprintf (dump_file, "; Replacing insn: %d with insns: ", INSN_UID (insn));
1046       for (in = insns; in != insn; in = NEXT_INSN (in))
1047 	fprintf (dump_file, "%d ", INSN_UID (in));
1048       fprintf (dump_file, "\n");
1049     }
1050 
1051   delete_insn (insn);
1052   return insns;
1053 }
1054 
1055 /* Look for registers which are always accessed via word-sized SUBREGs
1056    or via copies.  Decompose these registers into several word-sized
1057    pseudo-registers.  */
1058 
1059 static void
1060 decompose_multiword_subregs (void)
1061 {
1062   unsigned int max;
1063   basic_block bb;
1064 
1065   if (df)
1066     df_set_flags (DF_DEFER_INSN_RESCAN);
1067 
1068   max = max_reg_num ();
1069 
1070   /* First see if there are any multi-word pseudo-registers.  If there
1071      aren't, there is nothing we can do.  This should speed up this
1072      pass in the normal case, since it should be faster than scanning
1073      all the insns.  */
1074   {
1075     unsigned int i;
1076 
1077     for (i = FIRST_PSEUDO_REGISTER; i < max; ++i)
1078       {
1079 	if (regno_reg_rtx[i] != NULL
1080 	    && GET_MODE_SIZE (GET_MODE (regno_reg_rtx[i])) > UNITS_PER_WORD)
1081 	  break;
1082       }
1083     if (i == max)
1084       return;
1085   }
1086 
1087   /* FIXME: When the dataflow branch is merged, we can change this
1088      code to look for each multi-word pseudo-register and to find each
1089      insn which sets or uses that register.  That should be faster
1090      than scanning all the insns.  */
1091 
1092   decomposable_context = BITMAP_ALLOC (NULL);
1093   non_decomposable_context = BITMAP_ALLOC (NULL);
1094 
1095   reg_copy_graph = VEC_alloc (bitmap, heap, max);
1096   VEC_safe_grow (bitmap, heap, reg_copy_graph, max);
1097   memset (VEC_address (bitmap, reg_copy_graph), 0, sizeof (bitmap) * max);
1098 
1099   FOR_EACH_BB (bb)
1100     {
1101       rtx insn;
1102 
1103       FOR_BB_INSNS (bb, insn)
1104 	{
1105 	  rtx set;
1106 	  enum classify_move_insn cmi;
1107 	  int i, n;
1108 
1109 	  if (!INSN_P (insn)
1110 	      || GET_CODE (PATTERN (insn)) == CLOBBER
1111 	      || GET_CODE (PATTERN (insn)) == USE)
1112 	    continue;
1113 
1114 	  if (find_decomposable_shift_zext (insn))
1115 	    continue;
1116 
1117 	  recog_memoized (insn);
1118 	  extract_insn (insn);
1119 
1120 	  set = simple_move (insn);
1121 
1122 	  if (!set)
1123 	    cmi = NOT_SIMPLE_MOVE;
1124 	  else
1125 	    {
1126 	      if (find_pseudo_copy (set))
1127 		cmi = SIMPLE_PSEUDO_REG_MOVE;
1128 	      else
1129 		cmi = SIMPLE_MOVE;
1130 	    }
1131 
1132 	  n = recog_data.n_operands;
1133 	  for (i = 0; i < n; ++i)
1134 	    {
1135 	      for_each_rtx (&recog_data.operand[i],
1136 			    find_decomposable_subregs,
1137 			    &cmi);
1138 
1139 	      /* We handle ASM_OPERANDS as a special case to support
1140 		 things like x86 rdtsc which returns a DImode value.
1141 		 We can decompose the output, which will certainly be
1142 		 operand 0, but not the inputs.  */
1143 
1144 	      if (cmi == SIMPLE_MOVE
1145 		  && GET_CODE (SET_SRC (set)) == ASM_OPERANDS)
1146 		{
1147 		  gcc_assert (i == 0);
1148 		  cmi = NOT_SIMPLE_MOVE;
1149 		}
1150 	    }
1151 	}
1152     }
1153 
1154   bitmap_and_compl_into (decomposable_context, non_decomposable_context);
1155   if (!bitmap_empty_p (decomposable_context))
1156     {
1157       sbitmap sub_blocks;
1158       unsigned int i;
1159       sbitmap_iterator sbi;
1160       bitmap_iterator iter;
1161       unsigned int regno;
1162 
1163       propagate_pseudo_copies ();
1164 
1165       sub_blocks = sbitmap_alloc (last_basic_block);
1166       sbitmap_zero (sub_blocks);
1167 
1168       EXECUTE_IF_SET_IN_BITMAP (decomposable_context, 0, regno, iter)
1169 	decompose_register (regno);
1170 
1171       FOR_EACH_BB (bb)
1172 	{
1173 	  rtx insn;
1174 
1175 	  FOR_BB_INSNS (bb, insn)
1176 	    {
1177 	      rtx pat;
1178 
1179 	      if (!INSN_P (insn))
1180 		continue;
1181 
1182 	      pat = PATTERN (insn);
1183 	      if (GET_CODE (pat) == CLOBBER)
1184 		resolve_clobber (pat, insn);
1185 	      else if (GET_CODE (pat) == USE)
1186 		resolve_use (pat, insn);
1187 	      else if (DEBUG_INSN_P (insn))
1188 		resolve_debug (insn);
1189 	      else
1190 		{
1191 		  rtx set;
1192 		  int i;
1193 
1194 		  recog_memoized (insn);
1195 		  extract_insn (insn);
1196 
1197 		  set = simple_move (insn);
1198 		  if (set)
1199 		    {
1200 		      rtx orig_insn = insn;
1201 		      bool cfi = control_flow_insn_p (insn);
1202 
1203 		      /* We can end up splitting loads to multi-word pseudos
1204 			 into separate loads to machine word size pseudos.
1205 			 When this happens, we first had one load that can
1206 			 throw, and after resolve_simple_move we'll have a
1207 			 bunch of loads (at least two).  All those loads may
1208 			 trap if we can have non-call exceptions, so they
1209 			 all will end the current basic block.  We split the
1210 			 block after the outer loop over all insns, but we
1211 			 make sure here that we will be able to split the
1212 			 basic block and still produce the correct control
1213 			 flow graph for it.  */
1214 		      gcc_assert (!cfi
1215 				  || (flag_non_call_exceptions
1216 				      && can_throw_internal (insn)));
1217 
1218 		      insn = resolve_simple_move (set, insn);
1219 		      if (insn != orig_insn)
1220 			{
1221 			  recog_memoized (insn);
1222 			  extract_insn (insn);
1223 
1224 			  if (cfi)
1225 			    SET_BIT (sub_blocks, bb->index);
1226 			}
1227 		    }
1228 		  else
1229 		    {
1230 		      rtx decomposed_shift;
1231 
1232 		      decomposed_shift = resolve_shift_zext (insn);
1233 		      if (decomposed_shift != NULL_RTX)
1234 			{
1235 			  insn = decomposed_shift;
1236 			  recog_memoized (insn);
1237 			  extract_insn (insn);
1238 			}
1239 		    }
1240 
1241 		  for (i = recog_data.n_operands - 1; i >= 0; --i)
1242 		    for_each_rtx (recog_data.operand_loc[i],
1243 				  resolve_subreg_use,
1244 				  insn);
1245 
1246 		  resolve_reg_notes (insn);
1247 
1248 		  if (num_validated_changes () > 0)
1249 		    {
1250 		      for (i = recog_data.n_dups - 1; i >= 0; --i)
1251 			{
1252 			  rtx *pl = recog_data.dup_loc[i];
1253 			  int dup_num = recog_data.dup_num[i];
1254 			  rtx *px = recog_data.operand_loc[dup_num];
1255 
1256 			  validate_unshare_change (insn, pl, *px, 1);
1257 			}
1258 
1259 		      i = apply_change_group ();
1260 		      gcc_assert (i);
1261 		    }
1262 		}
1263 	    }
1264 	}
1265 
1266       /* If we had insns to split that caused control flow insns in the middle
1267 	 of a basic block, split those blocks now.  Note that we only handle
1268 	 the case where splitting a load has caused multiple possibly trapping
1269 	 loads to appear.  */
1270       EXECUTE_IF_SET_IN_SBITMAP (sub_blocks, 0, i, sbi)
1271 	{
1272 	  rtx insn, end;
1273 	  edge fallthru;
1274 
1275 	  bb = BASIC_BLOCK (i);
1276 	  insn = BB_HEAD (bb);
1277 	  end = BB_END (bb);
1278 
1279 	  while (insn != end)
1280 	    {
1281 	      if (control_flow_insn_p (insn))
1282 		{
1283 		  /* Split the block after insn.  There will be a fallthru
1284 		     edge, which is OK so we keep it.  We have to create the
1285 		     exception edges ourselves.  */
1286 		  fallthru = split_block (bb, insn);
1287 		  rtl_make_eh_edge (NULL, bb, BB_END (bb));
1288 		  bb = fallthru->dest;
1289 		  insn = BB_HEAD (bb);
1290 		}
1291 	      else
1292 	        insn = NEXT_INSN (insn);
1293 	    }
1294 	}
1295 
1296       sbitmap_free (sub_blocks);
1297     }
1298 
1299   {
1300     unsigned int i;
1301     bitmap b;
1302 
1303     for (i = 0; VEC_iterate (bitmap, reg_copy_graph, i, b); ++i)
1304       if (b)
1305 	BITMAP_FREE (b);
1306   }
1307 
1308   VEC_free (bitmap, heap, reg_copy_graph);
1309 
1310   BITMAP_FREE (decomposable_context);
1311   BITMAP_FREE (non_decomposable_context);
1312 }
1313 
1314 /* Gate function for lower subreg pass.  */
1315 
1316 static bool
1317 gate_handle_lower_subreg (void)
1318 {
1319   return flag_split_wide_types != 0;
1320 }
1321 
1322 /* Implement first lower subreg pass.  */
1323 
1324 static unsigned int
1325 rest_of_handle_lower_subreg (void)
1326 {
1327   decompose_multiword_subregs ();
1328   return 0;
1329 }
1330 
1331 /* Implement second lower subreg pass.  */
1332 
1333 static unsigned int
1334 rest_of_handle_lower_subreg2 (void)
1335 {
1336   decompose_multiword_subregs ();
1337   return 0;
1338 }
1339 
1340 struct rtl_opt_pass pass_lower_subreg =
1341 {
1342  {
1343   RTL_PASS,
1344   "subreg1",	                        /* name */
1345   gate_handle_lower_subreg,             /* gate */
1346   rest_of_handle_lower_subreg,          /* execute */
1347   NULL,                                 /* sub */
1348   NULL,                                 /* next */
1349   0,                                    /* static_pass_number */
1350   TV_LOWER_SUBREG,                      /* tv_id */
1351   0,                                    /* properties_required */
1352   0,                                    /* properties_provided */
1353   0,                                    /* properties_destroyed */
1354   0,                                    /* todo_flags_start */
1355   TODO_dump_func |
1356   TODO_ggc_collect |
1357   TODO_verify_flow                      /* todo_flags_finish */
1358  }
1359 };
1360 
1361 struct rtl_opt_pass pass_lower_subreg2 =
1362 {
1363  {
1364   RTL_PASS,
1365   "subreg2",	                        /* name */
1366   gate_handle_lower_subreg,             /* gate */
1367   rest_of_handle_lower_subreg2,          /* execute */
1368   NULL,                                 /* sub */
1369   NULL,                                 /* next */
1370   0,                                    /* static_pass_number */
1371   TV_LOWER_SUBREG,                      /* tv_id */
1372   0,                                    /* properties_required */
1373   0,                                    /* properties_provided */
1374   0,                                    /* properties_destroyed */
1375   0,                                    /* todo_flags_start */
1376   TODO_df_finish | TODO_verify_rtl_sharing |
1377   TODO_dump_func |
1378   TODO_ggc_collect |
1379   TODO_verify_flow                      /* todo_flags_finish */
1380  }
1381 };
1382