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