This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[mainline] Avoid CLOBBERs of CONCATs (related to IRA for MIPS)


While porting MIPS to IRA, I came across an ICE in
gcc.c-torture/execute/20020227-1.c.  The reason is that:

  - the testcase contains a CLOBBER of a CONCAT of two REGs
  - IRA uses note_stores to analyse SETs and CLOBBERs
  - note_stores passes the CONCAT to the IRA callback
  - the IRA callback ignores any argument that isn't a REG
    or a SUBREG of a REG
  - IRA therefore doesn't realise that the two CONCATenated
    REG operands are clobbered.

IRA certainly seems to be abiding by the documented interface.
The comment above note_stores says:

   FUN receives three arguments:
   1. the REG, MEM, CC0 or PC being stored in or clobbered,

(OK, so that list ought to include at least SUBREG as well, since the
function gets passed SUBREGs of hard REGs.)  And note_stores has
elementwise handling for the similar case of PARALLELs:

      /* If we have a PARALLEL, SET_DEST is a list of EXPR_LIST expressions,
	 each of whose first operand is a register.  */
      if (GET_CODE (dest) == PARALLEL)
	{
	  for (i = XVECLEN (dest, 0) - 1; i >= 0; i--)
	    if (XEXP (XVECEXP (dest, 0, i), 0) != 0)
	      (*fun) (XEXP (XVECEXP (dest, 0, i), 0), x, data);
	}
      else
	(*fun) (dest, x, data);

So if CLOBBERing a CONCAT is valid, I think it's note_stores
that should change.  But is it valid?  This is another case
of woolly GCC definitions.  The documentation says:

/* (CONCAT a b) represents the virtual concatenation of a and b
   to make a value that has as many bits as a and b put together.
   This is used for complex values.  Normally it appears only
   in DECL_RTLs and during RTL generation, but not in the insn chain.  */

Because of the "normally", you could argue it either way.
However, I know of no case in which a SET_DEST can be a CONCAT,
and I'm pretty sure we wouldn't handle that situation correctly.
It would be unwise to have different rules for CLOBBERs, so I think
the only sensible choice is "not valid".  (That was probably obvious,
but I wanted to cover my bases.)

The only reason we get the CLOBBER in the first place is that
gen_reg_rtx can return a CONCAT when generating_concat_p.
So innocent-looking code like:

    reg = gen_reg_rtx (mode);
    emit_insn (gen_rtx_CLOBBER (VOIDmode, reg));

can clobber something that is not in fact a REG.  And that's
what happens here, specifically in the multiword part of
extract_bit_field_1.

A simple fix would be to make extract_bit_field_1 treat CONCATs
as a special case when emitting the clobber.  However, e_b_f_1
uses simplify_gen_subreg to access the individual words, and
simplify_gen_subreg can handle CONCATs just fine.  e_b_f_1 therefore
doesn't treat CONCAT as a special case itself.  Also, we might need
similar handling elsewhere, either now or in future code.

I think a more robust fix is to introduce new routines for emitting
use and clobber "instructions".  We can then leave these routines
to handle CONCATs, and allow any routine called during expand to
pass gen_reg_rtx results to them.  Another advantage is that we'd
be abstracting away the fact that these clobbers and uses are
INSN rtxes (rather than a seperate type of insn, say).

This patch therefore adds routines called emit_clobber and emit_use.
I've deliberately not included "insn" in the name for two reasons:

  - As just mentioned, I don't want to hard-code the fact that we use
    INSN rtxes.

  - Other emit_*_insn functions take patterns rather than expressions
    as argument.

The names are meant to sit alongside emit_note, emit_barrier,
emit_label, etc.

We sometimes need to obtain a use or clobber sequence without
emitting it.  I've added gen_clobber_sequence and gen_use_sequence
for that.

I've tried to search through gcc/ to find and replace cases where
USEs and CLOBBERs are emitted as instructions.  I deliberately
left two cases alone:

  - reload emits pass-local USEs and attaches a mode to the insn.
    The new routine is not guaranteed to emit a single insn in
    general (although it would in reload's case).  Given the
    pass-local nature of the uses and the need for a special mode,
    it seemed better to leave things be.

  - reorg and the PA's md_reorg emit USEs of _insns_ rather than
    expressions.  That seems somewhat dubious, and I don't want
    to pass non-expressions through the new routines.

Also, I deliberately avoided trying to clean up some of the
cases I'm touching.  For example, I wondered about introducing
a new function for:

    emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
    emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));

Also, some pieces of code use things like:

    gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM)

instead of the simpler-but-equivalent "hard_frame_pointer_rtx".
But in the end I made neither change.  It seemed better to make the
replacement as mechanical as possible, with no on-the-side "tweaks".

Tested in combination with the other patches by building
cc1 and cc1plus for:

    alpha-linux-gnu arc-elf arm-eabi avr-rtems bfin-elf cris-elf
    fr30-elf frv-elf h8300-elf i686-linux-gnu x86_64-linux-gnu
    iq2000-elf m32c-elf m32r-elf m68hc11-elf m68k-elf mcore-elf
    mipsisa64-elf mmix-knuth-mmixware hppa2.0-linux-gnu pdp11-bsd
    powerpc64-linux-gnu powerpc-linux-gnu s390-linux-gnu score-elf
    sh-elf sh64-elf sparc-sun-solaris2.8 spu-elf xstormy16-elf
    v850-elf vax-netbsdelf xtensa-elf

and comparing the assembly output for gcc.c-torture, gcc.dg and g++.dg
(compiled once with -g and once with -O2).  Interestingly, it seems that
global also ignored the CONCAT clobber.  It now treats the real and
imaginary registers as conflicting with other registers that are live
at the same time as the clobber, which means we actually get worse code
on some architectures for 20020227-1.c at -O0.  However, I think
we should treat any potential removal of these "for flow" clobbers
separately from IRA.  It may well be that it's better to remove them,
but that's really a df issue rather than an IRA one.  Let's try to
get things correct for the current scheme first.

Bootstrapped & regression-tested on x86_64-linux-gnu.  It fixes the
original MIPS IRA problem.  OK to install?

Richard


gcc/
	* rtl.h (emit_clobber, gen_clobber_sequence, emit_use)
	(emit_use_sequence): Declare.
	* emit-rtl.c (emit_clobber, gen_clobber_sequence, emit_use)
	(emit_use_sequence): New functions.  Do not emit uses and clobbers
	of CONCATs; individually use and clobber their operands.
	* builtins.c (expand_builtin_setjmp_receiver): Use emit_clobber,
	gen_clobber_sequence, emit_use and emit_use_sequence.
	(expand_builtin_longjmp, expand_builtin_nonlocal_goto): Likewise.
	(expand_builtin_return): Likewise.
	* cfgbuild.c (count_basic_blocks): Likewise.
	* cfgrtl.c (rtl_flow_call_edges_add): Likewise.
	* explow.c (emit_stack_restore): Likewise.
	* expmed.c (extract_bit_field_1): Likewise.
	* expr.c (convert_move, emit_move_complex_parts): Likewise.
	(emit_move_multi_word, store_constructor): Likewise.
	* function.c (do_clobber_return_reg, do_use_return_reg): Likewise.
	(thread_prologue_and_epilogue_insns): Likewise.
	* lower-subreg.c (resolve_simple_move): Likewise.
	* optabs.c (widen_operand, expand_binop): Likewise.
	(expand_doubleword_bswap, emit_no_conflict_block): Likewise.
	* reload.c (find_reloads): Likewise.
	* reload1.c (eliminate_regs_in_insn): Likewise.
	* stmt.c (expand_nl_goto_receiver): Likewise.
	* config/alpha/alpha.md (builtin_longjmp): Likewise.
	* config/arc/arc.md (*movdi_insn, *movdf_insn): Likewise.
	* config/arm/arm.c (arm_load_pic_register): Likewise.
	(thumb1_expand_epilogue, thumb_set_return_address): Likewise.
	* config/arm/arm.md (untyped_return): Likewise.
	* config/arm/linux-elf.h (PROFILE_HOOK): Likewise.
	* config/avr/avr.c (expand_prologue): Likewise.
	* config/bfin/bfin.c (do_unlink): Likewise.
	* config/bfin/bfin.md (<optab>di3, adddi3, subdi3): Likewise.
	* config/cris/cris.c (cris_expand_prologue): Likewise.
	* config/darwin.c (machopic_indirect_data_reference): Likewise.
	(machopic_legitimize_pic_address): Likewise.
	* config/frv/frv.c (frv_frame_access, frv_expand_epilogue): Likewise.
	(frv_ifcvt_modify_insn, frv_expand_mdpackh_builtin): Likewise.
	* config/i386/i386.c (ix86_expand_vector_move_misalign): Likewise.
	(ix86_expand_convert_uns_didf_sse): Likewise.
	(ix86_expand_vector_init_general): Likewise.
	* config/ia64/ia64.md (eh_epilogue): Likewise.
	* config/iq2000/iq2000.c (iq2000_expand_epilogue): Likewise.
	* config/m32c/m32c.c (m32c_emit_eh_epilogue): Likewise.
	* config/m32r/m32r.c (m32r_reload_lr): Likewise.
	(config/iq2000/iq2000.c): Likewise.
	* config/mips/mips.md (fixuns_truncdfsi2): Likewise.
	(fixuns_truncdfdi2, fixuns_truncsfsi2, fixuns_truncsfdi2): Likewise.
	(builtin_longjmp): Likewise.
	* config/mn10300/mn10300.md (call, call_value): Likewise.
	* config/pa/pa.md (nonlocal_goto, nonlocal_longjmp): Likewise.
	* config/pdp11/pdp11.md (abshi2): Likewise.
	* config/rs6000/rs6000.c (rs6000_emit_move): Likewise.
	* config/s390/s390.c (s390_emit_prologue): Likewise.
	* config/s390/s390.md (movmem_long, setmem_long): Likewise.
	(cmpmem_long, extendsidi2, zero_extendsidi2, udivmoddi4): Likewise.
	(builtin_setjmp_receiver, restore_stack_nonlocal): Likewise.
	* config/sh/sh.c (prepare_move_operands): Likewise.
	(output_stack_adjust, sh_expand_epilogue): Likewise.
	(sh_set_return_address, sh_expand_t_scc): Likewise.
	* config/sparc/sparc.c (load_pic_register): Likewise.
	* config/sparc/sparc.md (untyped_return, nonlocal_goto): Likewise.
	* config/spu/spu.c (spu_expand_epilogue): Likewise.
	* config/v850/v850.c (expand_epilogue): Likewise.

Index: gcc/rtl.h
===================================================================
--- gcc/rtl.h	2008-05-07 12:12:41.000000000 +0100
+++ gcc/rtl.h	2008-05-07 20:01:39.000000000 +0100
@@ -1591,6 +1591,10 @@ extern rtx emit_label (rtx);
 extern rtx emit_barrier (void);
 extern rtx emit_note (enum insn_note);
 extern rtx emit_note_copy (rtx);
+extern rtx gen_clobber_sequence (rtx);
+extern rtx emit_clobber (rtx);
+extern rtx gen_use_sequence (rtx);
+extern rtx emit_use (rtx);
 extern rtx make_insn_raw (rtx);
 extern rtx make_jump_insn_raw (rtx);
 extern void add_function_usage_to (rtx, rtx);
Index: gcc/emit-rtl.c
===================================================================
--- gcc/emit-rtl.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/emit-rtl.c	2008-05-07 20:01:59.000000000 +0100
@@ -4548,6 +4548,62 @@ emit_note (enum insn_note kind)
   return note;
 }
 
+/* Emit a clobber of lvalue X.  */
+
+rtx
+emit_clobber (rtx x)
+{
+  /* CONCATs should not appear in the insn stream.  */
+  if (GET_CODE (x) == CONCAT)
+    {
+      emit_clobber (XEXP (x, 0));
+      return emit_clobber (XEXP (x, 1));
+    }
+  return emit_insn (gen_rtx_CLOBBER (VOIDmode, x));
+}
+
+/* Return a sequence of insns to clobber lvalue X.  */
+
+rtx
+gen_clobber_sequence (rtx x)
+{
+  rtx seq;
+
+  start_sequence ();
+  emit_clobber (x);
+  seq = get_insns ();
+  end_sequence ();
+  return seq;
+}
+
+/* Emit a use of rvalue X.  */
+
+rtx
+emit_use (rtx x)
+{
+  /* CONCATs should not appear in the insn stream.  */
+  if (GET_CODE (x) == CONCAT)
+    {
+      emit_use (XEXP (x, 0));
+      return emit_use (XEXP (x, 1));
+    }
+  return emit_insn (gen_rtx_USE (VOIDmode, x));
+}
+
+/* Return a sequence of insns to use rvalue X.  */
+
+rtx
+gen_use_sequence (rtx x)
+{
+  rtx seq;
+
+  start_sequence ();
+  emit_use (x);
+  seq = get_insns ();
+  end_sequence ();
+  return seq;
+}
+
 /* Cause next statement to emit a line note even if the line number
    has not changed.  */
 
Index: gcc/builtins.c
===================================================================
--- gcc/builtins.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/builtins.c	2008-05-07 15:18:04.000000000 +0100
@@ -709,11 +709,11 @@ expand_builtin_setjmp_receiver (rtx rece
 {
   /* Clobber the FP when we get here, so we have to make sure it's
      marked as used by this function.  */
-  emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
+  emit_use (hard_frame_pointer_rtx);
 
   /* Mark the static chain as clobbered here so life information
      doesn't get messed up for it.  */
-  emit_insn (gen_rtx_CLOBBER (VOIDmode, static_chain_rtx));
+  emit_clobber (static_chain_rtx);
 
   /* Now put in the code to restore the frame pointer, and argument
      pointer, if needed.  */
@@ -724,7 +724,7 @@ expand_builtin_setjmp_receiver (rtx rece
       emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx);
       /* This might change the hard frame pointer in ways that aren't
 	 apparent to early optimization passes, so force a clobber.  */
-      emit_insn (gen_rtx_CLOBBER (VOIDmode, hard_frame_pointer_rtx));
+      emit_clobber (hard_frame_pointer_rtx);
     }
 
 #if ARG_POINTER_REGNUM != HARD_FRAME_POINTER_REGNUM
@@ -823,18 +823,14 @@ expand_builtin_longjmp (rtx buf_addr, rt
 	{
 	  lab = copy_to_reg (lab);
 
-	  emit_insn (gen_rtx_CLOBBER (VOIDmode,
-				      gen_rtx_MEM (BLKmode,
-						   gen_rtx_SCRATCH (VOIDmode))));
-	  emit_insn (gen_rtx_CLOBBER (VOIDmode,
-				      gen_rtx_MEM (BLKmode,
-						   hard_frame_pointer_rtx)));
+	  emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
+	  emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
 
 	  emit_move_insn (hard_frame_pointer_rtx, fp);
 	  emit_stack_restore (SAVE_NONLOCAL, stack, NULL_RTX);
 
-	  emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
-	  emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
+	  emit_use (hard_frame_pointer_rtx);
+	  emit_use (stack_pointer_rtx);
 	  emit_indirect_jump (lab);
 	}
     }
@@ -893,13 +889,8 @@ expand_builtin_nonlocal_goto (tree exp)
     {
       r_label = copy_to_reg (r_label);
 
-      emit_insn (gen_rtx_CLOBBER (VOIDmode,
-				  gen_rtx_MEM (BLKmode,
-					       gen_rtx_SCRATCH (VOIDmode))));
-
-      emit_insn (gen_rtx_CLOBBER (VOIDmode,
-				  gen_rtx_MEM (BLKmode,
-					       hard_frame_pointer_rtx)));
+      emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
+      emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
 
       /* Restore frame pointer for containing function.
 	 This sets the actual hard register used for the frame pointer
@@ -911,8 +902,8 @@ expand_builtin_nonlocal_goto (tree exp)
 
       /* USE of hard_frame_pointer_rtx added for consistency;
 	 not clear if really needed.  */
-      emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
-      emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
+      emit_use (hard_frame_pointer_rtx);
+      emit_use (stack_pointer_rtx);
 
       /* If the architecture is using a GP register, we must
 	 conservatively assume that the target function makes use of it.
@@ -925,7 +916,7 @@ expand_builtin_nonlocal_goto (tree exp)
 	 a no-op if the GP register is a global invariant.)  */
       if ((unsigned) PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
 	  && fixed_regs[PIC_OFFSET_TABLE_REGNUM])
-	emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
+	emit_use (pic_offset_table_rtx);
 
       emit_indirect_jump (r_label);
     }
@@ -1604,7 +1595,7 @@ expand_builtin_return (rtx result)
 	emit_move_insn (reg, adjust_address (result, mode, size));
 
 	push_to_sequence (call_fusage);
-	emit_insn (gen_rtx_USE (VOIDmode, reg));
+	emit_use (reg);
 	call_fusage = get_insns ();
 	end_sequence ();
 	size += GET_MODE_SIZE (mode);
Index: gcc/cfgbuild.c
===================================================================
--- gcc/cfgbuild.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/cfgbuild.c	2008-05-07 15:18:04.000000000 +0100
@@ -170,7 +170,7 @@ count_basic_blocks (const_rtx f)
      check for the edge case of do-nothing functions with no basic blocks.  */
   if (count == NUM_FIXED_BLOCKS)
     {
-      emit_insn (gen_rtx_USE (VOIDmode, const0_rtx));
+      emit_use (const0_rtx);
       count = NUM_FIXED_BLOCKS + 1;
     }
 
Index: gcc/cfgrtl.c
===================================================================
--- gcc/cfgrtl.c	2008-05-07 19:57:03.000000000 +0100
+++ gcc/cfgrtl.c	2008-05-07 20:02:41.000000000 +0100
@@ -2809,7 +2809,7 @@ rtl_flow_call_edges_add (sbitmap blocks)
 	  e = find_edge (bb, EXIT_BLOCK_PTR);
 	  if (e)
 	    {
-	      insert_insn_on_edge (gen_rtx_USE (VOIDmode, const0_rtx), e);
+	      insert_insn_on_edge (gen_use_sequence (const0_rtx), e);
 	      commit_edge_insertions ();
 	    }
 	}
Index: gcc/explow.c
===================================================================
--- gcc/explow.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/explow.c	2008-05-07 15:18:04.000000000 +0100
@@ -1016,11 +1016,8 @@ emit_stack_restore (enum save_level save
       /* These clobbers prevent the scheduler from moving
 	 references to variable arrays below the code
 	 that deletes (pops) the arrays.  */
-      emit_insn (gen_rtx_CLOBBER (VOIDmode,
-		    gen_rtx_MEM (BLKmode,
-			gen_rtx_SCRATCH (VOIDmode))));
-      emit_insn (gen_rtx_CLOBBER (VOIDmode,
-		    gen_rtx_MEM (BLKmode, stack_pointer_rtx)));
+      emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
+      emit_clobber (gen_rtx_MEM (BLKmode, stack_pointer_rtx));
     }
 
   discard_pending_stack_adjust ();
Index: gcc/expmed.c
===================================================================
--- gcc/expmed.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/expmed.c	2008-05-07 15:18:04.000000000 +0100
@@ -1374,7 +1374,7 @@ extract_bit_field_1 (rtx str_rtx, unsign
 	target = gen_reg_rtx (mode);
 
       /* Indicate for flow that the entire target reg is being set.  */
-      emit_insn (gen_rtx_CLOBBER (VOIDmode, target));
+      emit_clobber (target);
 
       for (i = 0; i < nwords; i++)
 	{
Index: gcc/expr.c
===================================================================
--- gcc/expr.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/expr.c	2008-05-07 15:18:04.000000000 +0100
@@ -557,7 +557,7 @@ convert_move (rtx to, rtx from, int unsi
 	    {
 	      if (reg_overlap_mentioned_p (to, from))
 		from = force_reg (from_mode, from);
-	      emit_insn (gen_rtx_CLOBBER (VOIDmode, to));
+	      emit_clobber (to);
 	    }
 	  convert_move (word_to, from, unsignedp);
 	  emit_unop_insn (code, to, word_to, equiv_code);
@@ -3108,7 +3108,7 @@ emit_move_complex_parts (rtx x, rtx y)
      hard regs shouldn't appear here except as return values.  */
   if (!reload_completed && !reload_in_progress
       && REG_P (x) && !reg_overlap_mentioned_p (x, y))
-    emit_insn (gen_rtx_CLOBBER (VOIDmode, x));
+    emit_clobber (x);
 
   write_complex_part (x, read_complex_part (y, false), false);
   write_complex_part (x, read_complex_part (y, true), true);
@@ -3305,7 +3305,7 @@ emit_move_multi_word (enum machine_mode 
   if (x != y
       && ! (reload_in_progress || reload_completed)
       && need_clobber != 0)
-    emit_insn (gen_rtx_CLOBBER (VOIDmode, x));
+    emit_clobber (x);
 
   emit_insn (seq);
 
@@ -5160,7 +5160,7 @@ store_constructor (tree exp, rtx target,
 	  }
 
 	if (REG_P (target) && !cleared)
-	  emit_insn (gen_rtx_CLOBBER (VOIDmode, target));
+	  emit_clobber (target);
 
 	/* Store each element of the constructor into the
 	   corresponding field of TARGET.  */
@@ -5360,7 +5360,7 @@ store_constructor (tree exp, rtx target,
 
 	if (!cleared && REG_P (target))
 	  /* Inform later passes that the old value is dead.  */
-	  emit_insn (gen_rtx_CLOBBER (VOIDmode, target));
+	  emit_clobber (target);
 
 	/* Store each element of the constructor into the
 	   corresponding element of TARGET, determined by counting the
Index: gcc/function.c
===================================================================
--- gcc/function.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/function.c	2008-05-07 15:18:04.000000000 +0100
@@ -4309,7 +4309,7 @@ diddle_return_value (void (*doit) (rtx, 
 static void
 do_clobber_return_reg (rtx reg, void *arg ATTRIBUTE_UNUSED)
 {
-  emit_insn (gen_rtx_CLOBBER (VOIDmode, reg));
+  emit_clobber (reg);
 }
 
 void
@@ -4332,7 +4332,7 @@ clobber_return_register (void)
 static void
 do_use_return_reg (rtx reg, void *arg ATTRIBUTE_UNUSED)
 {
-  emit_insn (gen_rtx_USE (VOIDmode, reg));
+  emit_use (reg);
 }
 
 static void
@@ -4738,7 +4738,7 @@ thread_prologue_and_epilogue_insns (void
       /* Insert an explicit USE for the frame pointer 
          if the profiling is on and the frame pointer is required.  */
       if (crtl->profile && frame_pointer_needed)
-        emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
+	emit_use (hard_frame_pointer_rtx);
 
       /* Retain a map of the prologue insns.  */
       record_insns (seq, &prologue);
Index: gcc/lower-subreg.c
===================================================================
--- gcc/lower-subreg.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/lower-subreg.c	2008-05-07 15:18:04.000000000 +0100
@@ -850,7 +850,7 @@ resolve_simple_move (rtx set, rtx insn)
       unsigned int i;
 
       if (REG_P (dest) && !HARD_REGISTER_NUM_P (REGNO (dest)))
-	emit_insn (gen_rtx_CLOBBER (VOIDmode, dest));
+	emit_clobber (dest);
 
       for (i = 0; i < words; ++i)
 	emit_move_insn (simplify_gen_subreg_concatn (word_mode, dest,
Index: gcc/optabs.c
===================================================================
--- gcc/optabs.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/optabs.c	2008-05-07 15:18:04.000000000 +0100
@@ -329,7 +329,7 @@ widen_operand (rtx op, enum machine_mode
      part to OP.  */
 
   result = gen_reg_rtx (mode);
-  emit_insn (gen_rtx_CLOBBER (VOIDmode, result));
+  emit_clobber (result);
   emit_move_insn (gen_lowpart (GET_MODE (op), result), op);
   return result;
 }
@@ -1977,7 +1977,7 @@ expand_binop (enum machine_mode mode, op
 
       /* Indicate for flow that the entire target reg is being set.  */
       if (REG_P (target))
-	emit_insn (gen_rtx_CLOBBER (VOIDmode, xtarget));
+	emit_clobber (xtarget);
 
       /* Do the actual arithmetic.  */
       for (i = 0; i < nwords; i++)
@@ -2734,7 +2734,7 @@ expand_doubleword_bswap (enum machine_mo
   if (target == 0)
     target = gen_reg_rtx (mode);
   if (REG_P (target))
-    emit_insn (gen_rtx_CLOBBER (VOIDmode, target));
+    emit_clobber (target);
   emit_move_insn (operand_subword (target, 0, 1, mode), t0);
   emit_move_insn (operand_subword (target, 1, 1, mode), t1);
 
@@ -3925,7 +3925,7 @@ emit_no_conflict_block (rtx insns, rtx t
   /* Now write the CLOBBER of the output, followed by the setting of each
      of the words, followed by the final copy.  */
   if (target != op0 && target != op1)
-    emit_insn (gen_rtx_CLOBBER (VOIDmode, target));
+    emit_clobber (target);
 
   for (insn = insns; insn; insn = next)
     {
Index: gcc/reload.c
===================================================================
--- gcc/reload.c	2008-05-07 15:44:59.000000000 +0100
+++ gcc/reload.c	2008-05-07 20:00:08.000000000 +0100
@@ -4070,7 +4070,7 @@ find_reloads (rtx insn, int replace, int
 		  PUT_MODE (emit_insn_before (gen_rtx_USE (VOIDmode, operand),
 					      insn), QImode);
 		if (modified[i] != RELOAD_READ)
-		  emit_insn_after (gen_rtx_CLOBBER (VOIDmode, operand), insn);
+		  emit_insn_after (gen_clobber_sequence (operand), insn);
 	      }
 	  }
       }
Index: gcc/reload1.c
===================================================================
--- gcc/reload1.c	2008-05-07 15:45:27.000000000 +0100
+++ gcc/reload1.c	2008-05-07 20:00:25.000000000 +0100
@@ -3316,14 +3316,13 @@ eliminate_regs_in_insn (rtx insn, int re
 	     this point.  */
 	  *recog_data.operand_loc[i] = 0;
 
-	/* If an output operand changed from a REG to a MEM and INSN is an
-	   insn, write a CLOBBER insn.  */
+	  /* If an output operand changed from a REG to a MEM and INSN is an
+	     insn, write a CLOBBER insn.  */
 	  if (recog_data.operand_type[i] != OP_IN
 	      && REG_P (orig_operand[i])
 	      && MEM_P (substed_operand[i])
 	      && replace)
-	    emit_insn_after (gen_rtx_CLOBBER (VOIDmode, orig_operand[i]),
-			     insn);
+	    emit_insn_after (gen_clobber_sequence (orig_operand[i]), insn);
 	}
     }
 
Index: gcc/stmt.c
===================================================================
--- gcc/stmt.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/stmt.c	2008-05-07 15:18:04.000000000 +0100
@@ -1775,11 +1775,11 @@ expand_nl_goto_receiver (void)
 {
   /* Clobber the FP when we get here, so we have to make sure it's
      marked as used by this function.  */
-  emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
+  emit_use (hard_frame_pointer_rtx);
 
   /* Mark the static chain as clobbered here so life information
      doesn't get messed up for it.  */
-  emit_insn (gen_rtx_CLOBBER (VOIDmode, static_chain_rtx));
+  emit_clobber (static_chain_rtx);
 
 #ifdef HAVE_nonlocal_goto
   if (! HAVE_nonlocal_goto)
Index: gcc/config/alpha/alpha.md
===================================================================
--- gcc/config/alpha/alpha.md	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/alpha/alpha.md	2008-05-07 15:18:04.000000000 +0100
@@ -6948,8 +6948,8 @@ (define_expand "builtin_longjmp"
   emit_move_insn (hard_frame_pointer_rtx, fp);
   emit_move_insn (pv, lab);
   emit_stack_restore (SAVE_NONLOCAL, stack, NULL_RTX);
-  emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
-  emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
+  emit_use (hard_frame_pointer_rtx);
+  emit_use (stack_pointer_rtx);
 
   /* Load the label we are jumping through into $27 so that we know
      where to look for it when we get back to setjmp's function for
Index: gcc/config/arc/arc.md
===================================================================
--- gcc/config/arc/arc.md	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/arc/arc.md	2008-05-07 15:18:07.000000000 +0100
@@ -313,7 +313,7 @@ (define_insn "*movdi_insn"
 ;{
 ;  /* Flow doesn't understand that this is effectively a DFmode move.
 ;     It doesn't know that all of `operands[0]' is set.  */
-;  emit_insn (gen_rtx_CLOBBER (VOIDmode, operands[0]));
+;  emit_clobber (operands[0]);
 ;
 ;  /* Emit insns that movsi_insn can handle.  */
 ;  emit_insn (gen_movsi (operand_subword (operands[0], 0, 0, DImode),
@@ -406,7 +406,7 @@ (define_insn "*movdf_insn"
 ;{
 ;  /* Flow doesn't understand that this is effectively a DFmode move.
 ;     It doesn't know that all of `operands[0]' is set.  */
-;  emit_insn (gen_rtx_CLOBBER (VOIDmode, operands[0]));
+;  emit_clobber (operands[0]);
 ;
 ;  /* Emit insns that movsi_insn can handle.  */
 ;  emit_insn (gen_movsi (operand_subword (operands[0], 0, 0, DFmode),
Index: gcc/config/arm/arm.c
===================================================================
--- gcc/config/arm/arm.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/arm/arm.c	2008-05-07 15:18:04.000000000 +0100
@@ -3681,7 +3681,7 @@ arm_load_pic_register (unsigned long sav
 
   /* Need to emit this whether or not we obey regdecls,
      since setjmp/longjmp can cause life info to screw up.  */
-  emit_insn (gen_rtx_USE (VOIDmode, pic_reg));
+  emit_use (pic_reg);
 }
 
 
@@ -17052,10 +17052,10 @@ thumb1_expand_epilogue (void)
      so that flow2 will get register lifetimes correct.  */
   for (regno = 0; regno < 13; regno++)
     if (df_regs_ever_live_p (regno) && !call_used_regs[regno])
-      emit_insn (gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, regno)));
+      emit_clobber (gen_rtx_REG (SImode, regno));
 
   if (! df_regs_ever_live_p (LR_REGNUM))
-    emit_insn (gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, LR_REGNUM)));
+    emit_use (gen_rtx_REG (SImode, LR_REGNUM));
 }
 
 static void
@@ -18317,7 +18317,7 @@ thumb_set_return_address (rtx source, rt
   rtx addr;
   unsigned long mask;
 
-  emit_insn (gen_rtx_USE (VOIDmode, source));
+  emit_use (source);
 
   offsets = arm_get_frame_offsets ();
   mask = offsets->saved_regs_mask;
Index: gcc/config/arm/arm.md
===================================================================
--- gcc/config/arm/arm.md	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/arm/arm.md	2008-05-07 15:18:05.000000000 +0100
@@ -8785,8 +8785,7 @@ (define_expand "untyped_return"
 
     /* Emit USE insns before the return.  */
     for (i = 0; i < XVECLEN (operands[1], 0); i++)
-      emit_insn (gen_rtx_USE (VOIDmode,
-			      SET_DEST (XVECEXP (operands[1], 0, i))));
+      emit_use (SET_DEST (XVECEXP (operands[1], 0, i)));
 
     /* Construct the return.  */
     expand_naked_return ();
Index: gcc/config/arm/linux-elf.h
===================================================================
--- gcc/config/arm/linux-elf.h	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/arm/linux-elf.h	2008-05-07 15:18:07.000000000 +0100
@@ -111,7 +111,7 @@ #define ARM_FUNCTION_PROFILER(STREAM, LA
 /* The GNU/Linux profiler clobbers the link register.  Make sure the
    prologue knows to save it.  */
 #define PROFILE_HOOK(X)						\
-  emit_insn (gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (SImode, LR_REGNUM)))
+  emit_clobber (gen_rtx_REG (SImode, LR_REGNUM))
 
 /* The GNU/Linux profiler needs a frame pointer.  */
 #define SUBTARGET_FRAME_POINTER_REQUIRED crtl->profile
Index: gcc/config/avr/avr.c
===================================================================
--- gcc/config/avr/avr.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/avr/avr.c	2008-05-07 15:18:05.000000000 +0100
@@ -662,7 +662,7 @@ expand_prologue (void)
       RTX_FRAME_RELATED_P (insn) = 1;
 
       /* Prevent any attempt to delete the setting of ZERO_REG!  */
-      emit_insn (gen_rtx_USE (VOIDmode, zero_reg_rtx));
+      emit_use (zero_reg_rtx);
     }
   if (minimize && (frame_pointer_needed || live_seq > 6)) 
     {
Index: gcc/config/bfin/bfin.c
===================================================================
--- gcc/config/bfin/bfin.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/bfin/bfin.c	2008-05-07 15:18:05.000000000 +0100
@@ -1011,12 +1011,12 @@ do_unlink (rtx spreg, HOST_WIDE_INT fram
 	{
 	  rtx fpreg = gen_rtx_REG (Pmode, REG_FP);
 	  emit_move_insn (fpreg, postinc);
-	  emit_insn (gen_rtx_USE (VOIDmode, fpreg));
+	  emit_use (fpreg);
 	}
       if (! current_function_is_leaf)
 	{
 	  emit_move_insn (bfin_rets_rtx, postinc);
-	  emit_insn (gen_rtx_USE (VOIDmode, bfin_rets_rtx));
+	  emit_use (bfin_rets_rtx);
 	}
     }
 }
Index: gcc/config/bfin/bfin.md
===================================================================
--- gcc/config/bfin/bfin.md	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/bfin/bfin.md	2008-05-07 15:18:07.000000000 +0100
@@ -904,7 +904,7 @@ (define_expand "<optab>di3"
   enum insn_code icode = CODE_FOR_<optab>si3;
   if (!reg_overlap_mentioned_p (operands[0], operands[1])
       && !reg_overlap_mentioned_p (operands[0], operands[2]))
-    emit_insn (gen_rtx_CLOBBER (VOIDmode, operands[0]));
+    emit_clobber (operands[0]);
   split_di (operands, 3, lo_half, hi_half);
   if (!(*insn_data[icode].operand[2].predicate) (lo_half[2], SImode))
     lo_half[2] = force_reg (SImode, lo_half[2]);
@@ -1022,7 +1022,7 @@ (define_expand "adddi3"
     xops[4] = force_reg (SImode, xops[4]);
   if (!reg_overlap_mentioned_p (operands[0], operands[1])
       && !reg_overlap_mentioned_p (operands[0], operands[2]))
-    emit_insn (gen_rtx_CLOBBER (VOIDmode, operands[0]));
+    emit_clobber (operands[0]);
   emit_insn (gen_add_with_carry (xops[0], xops[2], xops[4], xops[7]));
   emit_insn (gen_movbisi (xops[6], xops[7]));
   if (!register_operand (xops[5], SImode)
@@ -1055,7 +1055,7 @@ (define_expand "subdi3"
   xops[7] = gen_rtx_REG (BImode, REG_CC);
   if (!reg_overlap_mentioned_p (operands[0], operands[1])
       && !reg_overlap_mentioned_p (operands[0], operands[2]))
-    emit_insn (gen_rtx_CLOBBER (VOIDmode, operands[0]));
+    emit_clobber (operands[0]);
   emit_insn (gen_sub_with_carry (xops[0], xops[2], xops[4], xops[7]));
   emit_insn (gen_notbi (xops[7], xops[7]));
   emit_insn (gen_movbisi (xops[6], xops[7]));
Index: gcc/config/cris/cris.c
===================================================================
--- gcc/config/cris/cris.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/cris/cris.c	2008-05-07 15:18:05.000000000 +0100
@@ -3002,7 +3002,7 @@ cris_expand_prologue (void)
 	 the GOT register load as maybe-dead.  To see this, remove the
 	 line below and try libsupc++/vec.cc or a trivial
 	 "static void y (); void x () {try {y ();} catch (...) {}}".  */
-      emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
+      emit_use (pic_offset_table_rtx);
     }
 
   if (cris_max_stackframe && framesize > cris_max_stackframe)
Index: gcc/config/darwin.c
===================================================================
--- gcc/config/darwin.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/darwin.c	2008-05-07 15:18:05.000000000 +0100
@@ -555,7 +555,7 @@ machopic_indirect_data_reference (rtx or
 	  emit_insn (gen_rtx_SET (VOIDmode, reg,
 				  gen_rtx_LO_SUM (Pmode, reg,
 						  copy_rtx (offset))));
-	  emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
+	  emit_use (pic_offset_table_rtx);
 
 	  orig = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, reg);
 #endif
@@ -756,9 +756,7 @@ machopic_legitimize_pic_address (rtx ori
 
 	      pic_ref = reg;
 #else
-	      emit_insn (gen_rtx_USE (VOIDmode,
-				      gen_rtx_REG (Pmode,
-						   PIC_OFFSET_TABLE_REGNUM)));
+	      emit_use (gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM));
 
 	      emit_insn (gen_rtx_SET (VOIDmode, reg,
 				      gen_rtx_HIGH (Pmode,
@@ -782,9 +780,7 @@ machopic_legitimize_pic_address (rtx ori
 		  pic = reg;
 		}
 #if 0
-	      emit_insn (gen_rtx_USE (VOIDmode,
-				      gen_rtx_REG (Pmode,
-						   PIC_OFFSET_TABLE_REGNUM)));
+	      emit_use (gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM));
 #endif
 
 	      if (reload_in_progress)
@@ -857,8 +853,7 @@ machopic_legitimize_pic_address (rtx ori
 		      pic = reg;
 		    }
 #if 0
-		  emit_insn (gen_rtx_USE (VOIDmode,
-					  pic_offset_table_rtx));
+		  emit_use (pic_offset_table_rtx);
 #endif
 		  if (reload_in_progress)
 		    df_set_regs_ever_live (REGNO (pic), true);
Index: gcc/config/frv/frv.c
===================================================================
--- gcc/config/frv/frv.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/frv/frv.c	2008-05-07 20:02:58.000000000 +0100
@@ -1682,7 +1682,7 @@ frv_frame_access (frv_frame_accessor_t *
 	}
       else
 	emit_insn (gen_rtx_SET (VOIDmode, reg, mem));
-      emit_insn (gen_rtx_USE (VOIDmode, reg));
+      emit_use (reg);
     }
   else
     {
@@ -1946,7 +1946,7 @@ frv_expand_epilogue (bool emit_return)
   if (frame_pointer_needed)
     {
       emit_insn (gen_rtx_SET (VOIDmode, fp, gen_rtx_MEM (Pmode, fp)));
-      emit_insn (gen_rtx_USE (VOIDmode, fp));
+      emit_use (fp);
     }
 
   /* Deallocate the stack frame.  */
@@ -1972,7 +1972,7 @@ frv_expand_epilogue (bool emit_return)
 	  emit_move_insn (lr, return_addr);
 	}
 
-      emit_insn (gen_rtx_USE (VOIDmode, lr));
+      emit_use (lr);
     }
 }
 
@@ -5999,7 +5999,7 @@ frv_ifcvt_modify_insn (ce_if_block_t *ce
 		goto fail;
 	    }
 
-	  frv_ifcvt_add_insn (gen_rtx_USE (VOIDmode, dest), insn, FALSE);
+	  frv_ifcvt_add_insn (gen_use_sequence (dest), insn, FALSE);
 	}
 
       /* If we are just loading a constant created for a nested conditional
@@ -9099,8 +9099,8 @@ frv_expand_mdpackh_builtin (tree call, r
 
   /* The high half of each word is not explicitly initialized, so indicate
      that the input operands are not live before this point.  */
-  emit_insn (gen_rtx_CLOBBER (DImode, op0));
-  emit_insn (gen_rtx_CLOBBER (DImode, op1));
+  emit_clobber (op0);
+  emit_clobber (op1);
 
   /* Move each argument into the low half of its associated input word.  */
   emit_move_insn (simplify_gen_subreg (HImode, op0, DImode, 2), arg1);
Index: gcc/config/i386/i386.c
===================================================================
--- gcc/config/i386/i386.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/i386/i386.c	2008-05-07 15:18:07.000000000 +0100
@@ -10519,7 +10519,7 @@ ix86_expand_vector_move_misalign (enum m
 	     writing to the top half twice.  */
 	  if (TARGET_SSE_SPLIT_REGS)
 	    {
-	      emit_insn (gen_rtx_CLOBBER (VOIDmode, op0));
+	      emit_clobber (op0);
 	      zero = op0;
 	    }
 	  else
@@ -10553,7 +10553,7 @@ ix86_expand_vector_move_misalign (enum m
 	  if (TARGET_SSE_PARTIAL_REG_DEPENDENCY)
 	    emit_move_insn (op0, CONST0_RTX (mode));
 	  else
-	    emit_insn (gen_rtx_CLOBBER (VOIDmode, op0));
+	    emit_clobber (op0);
 
 	  if (mode != V4SFmode)
 	    op0 = gen_lowpart (V4SFmode, op0);
@@ -10941,7 +10941,7 @@ ix86_expand_convert_uns_didf_sse (rtx ta
     emit_insn (gen_movdi_to_sse (int_xmm, input));
   else if (TARGET_SSE_SPLIT_REGS)
     {
-      emit_insn (gen_rtx_CLOBBER (VOIDmode, int_xmm));
+      emit_clobber (int_xmm);
       emit_move_insn (gen_lowpart (DImode, int_xmm), input);
     }
   else
@@ -24034,7 +24034,7 @@ ix86_expand_vector_init_general (bool mm
       else if (n_words == 2)
 	{
 	  rtx tmp = gen_reg_rtx (mode);
-	  emit_insn (gen_rtx_CLOBBER (VOIDmode, tmp));
+	  emit_clobber (tmp);
 	  emit_move_insn (gen_lowpart (word_mode, tmp), words[0]);
 	  emit_move_insn (gen_highpart (word_mode, tmp), words[1]);
 	  emit_move_insn (target, tmp);
Index: gcc/config/ia64/ia64.md
===================================================================
--- gcc/config/ia64/ia64.md	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/ia64/ia64.md	2008-05-07 15:18:05.000000000 +0100
@@ -6332,8 +6332,8 @@ (define_expand "eh_epilogue"
       emit_move_insn (sp, operands[2]);
       operands[2] = sp;
     }
-  emit_insn (gen_rtx_USE (VOIDmode, sp));
-  emit_insn (gen_rtx_USE (VOIDmode, bsp));
+  emit_use (sp);
+  emit_use (bsp);
 
   cfun->machine->ia64_eh_epilogue_sp = sp;
   cfun->machine->ia64_eh_epilogue_bsp = bsp;
Index: gcc/config/iq2000/iq2000.c
===================================================================
--- gcc/config/iq2000/iq2000.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/iq2000/iq2000.c	2008-05-07 15:18:05.000000000 +0100
@@ -2085,8 +2085,7 @@ iq2000_expand_epilogue (void)
       /* Perform the additional bump for __throw.  */
       emit_move_insn (gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM),
 		      stack_pointer_rtx);
-      emit_insn (gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode,
-						  HARD_FRAME_POINTER_REGNUM)));
+      emit_use (gen_rtx_REG (Pmode, HARD_FRAME_POINTER_REGNUM));
       emit_jump_insn (gen_eh_return_internal ());
     }
   else
Index: gcc/config/m32c/m32c.c
===================================================================
--- gcc/config/m32c/m32c.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/m32c/m32c.c	2008-05-07 15:18:07.000000000 +0100
@@ -4058,7 +4058,7 @@ m32c_emit_eh_epilogue (rtx ret_addr)
      (fudged), and return (fudged).  This is actually easier to do in
      assembler, so punt to libgcc.  */
   emit_jump_insn (gen_eh_epilogue (ret_addr, cfun->machine->eh_stack_adjust));
-  /*  emit_insn (gen_rtx_CLOBBER (HImode, gen_rtx_REG (HImode, R0L_REGNO))); */
+  /*  emit_clobber (gen_rtx_REG (HImode, R0L_REGNO)); */
   emit_barrier ();
 }
 
Index: gcc/config/m32r/m32r.c
===================================================================
--- gcc/config/m32r/m32r.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/m32r/m32r.c	2008-05-07 15:18:05.000000000 +0100
@@ -1349,7 +1349,7 @@ m32r_reload_lr (rtx sp, int size)
       emit_insn (gen_movsi (lr, gen_frame_mem (Pmode, tmp)));
     }
 
-  emit_insn (gen_rtx_USE (VOIDmode, lr));
+  emit_use (lr);
 }
 
 void
@@ -1361,7 +1361,7 @@ m32r_load_pic_register (void)
 
   /* Need to emit this whether or not we obey regdecls,
      since setjmp/longjmp can cause life info to screw up.  */
-  emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
+  emit_use (pic_offset_table_rtx);
 }
 
 /* Expand the m32r prologue as a series of insns.  */
Index: gcc/config/mips/mips.md
===================================================================
--- gcc/config/mips/mips.md	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/mips/mips.md	2008-05-07 15:18:05.000000000 +0100
@@ -2903,7 +2903,7 @@ (define_expand "fixuns_truncdfsi2"
 
       /* Allow REG_NOTES to be set on last insn (labels don't have enough
 	 fields, and can't be used for REG_NOTES anyway).  */
-      emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
+      emit_use (stack_pointer_rtx);
       DONE;
     }
 })
@@ -2946,7 +2946,7 @@ (define_expand "fixuns_truncdfdi2"
 
   /* Allow REG_NOTES to be set on last insn (labels don't have enough
      fields, and can't be used for REG_NOTES anyway).  */
-  emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
+  emit_use (stack_pointer_rtx);
   DONE;
 })
 
@@ -2988,7 +2988,7 @@ (define_expand "fixuns_truncsfsi2"
 
   /* Allow REG_NOTES to be set on last insn (labels don't have enough
      fields, and can't be used for REG_NOTES anyway).  */
-  emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
+  emit_use (stack_pointer_rtx);
   DONE;
 })
 
@@ -3030,7 +3030,7 @@ (define_expand "fixuns_truncsfdi2"
 
   /* Allow REG_NOTES to be set on last insn (labels don't have enough
      fields, and can't be used for REG_NOTES anyway).  */
-  emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
+  emit_use (stack_pointer_rtx);
   DONE;
 })
 
@@ -5427,9 +5427,9 @@ (define_expand "builtin_longjmp"
   mips_emit_move (pv, lab);
   emit_stack_restore (SAVE_NONLOCAL, stack, NULL_RTX);
   mips_emit_move (gp, gpv);
-  emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
-  emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
-  emit_insn (gen_rtx_USE (VOIDmode, gp));
+  emit_use (hard_frame_pointer_rtx);
+  emit_use (stack_pointer_rtx);
+  emit_use (gp);
   emit_indirect_jump (pv);
   DONE;
 })
Index: gcc/config/mn10300/mn10300.md
===================================================================
--- gcc/config/mn10300/mn10300.md	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/mn10300/mn10300.md	2008-05-07 15:18:06.000000000 +0100
@@ -1807,7 +1807,7 @@ (define_expand "call"
 	     shared library support for AM30 either, so we just assume
 	     the linker is going to adjust all @PLT relocs to the
 	     actual symbols.  */
-	  emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
+	  emit_use (pic_offset_table_rtx);
 	  XEXP (operands[0], 0) = gen_sym2PLT (XEXP (operands[0], 0));
 	}
       else
@@ -1852,7 +1852,7 @@ (define_expand "call_value"
 	     shared library support for AM30 either, so we just assume
 	     the linker is going to adjust all @PLT relocs to the
 	     actual symbols.  */
-	  emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
+	  emit_use (pic_offset_table_rtx);
 	  XEXP (operands[1], 0) = gen_sym2PLT (XEXP (operands[1], 0));
 	}
       else
Index: gcc/config/pa/pa.md
===================================================================
--- gcc/config/pa/pa.md	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/pa/pa.md	2008-05-07 15:18:06.000000000 +0100
@@ -7432,12 +7432,8 @@ (define_expand "nonlocal_goto"
 
   lab = copy_to_reg (lab);
 
-  emit_insn (gen_rtx_CLOBBER (VOIDmode,
-			      gen_rtx_MEM (BLKmode,
-					   gen_rtx_SCRATCH (VOIDmode))));
-  emit_insn (gen_rtx_CLOBBER (VOIDmode,
-			      gen_rtx_MEM (BLKmode,
-					   hard_frame_pointer_rtx)));
+  emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
+  emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
 
   /* Restore the frame pointer.  The virtual_stack_vars_rtx is saved
      instead of the hard_frame_pointer_rtx in the save area.  As a
@@ -7449,8 +7445,8 @@ (define_expand "nonlocal_goto"
 
   emit_stack_restore (SAVE_NONLOCAL, stack, NULL_RTX);
 
-  emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
-  emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
+  emit_use (hard_frame_pointer_rtx);
+  emit_use (stack_pointer_rtx);
 
   /* Nonlocal goto jumps are only used between functions in the same
      translation unit.  Thus, we can avoid the extra overhead of an
@@ -8892,12 +8888,8 @@ (define_expand "builtin_longjmp"
 			   (POINTER_SIZE * 2) / BITS_PER_UNIT));
   rtx pv = gen_rtx_REG (Pmode, 1);
 
-  emit_insn (gen_rtx_CLOBBER (VOIDmode,
-			      gen_rtx_MEM (BLKmode,
-					   gen_rtx_SCRATCH (VOIDmode))));
-  emit_insn (gen_rtx_CLOBBER (VOIDmode,
-			      gen_rtx_MEM (BLKmode,
-					   hard_frame_pointer_rtx)));
+  emit_clobber (gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode)));
+  emit_clobber (gen_rtx_MEM (BLKmode, hard_frame_pointer_rtx));
 
   /* Restore the frame pointer.  The virtual_stack_vars_rtx is saved
      instead of the hard_frame_pointer_rtx in the save area.  We need
@@ -8913,8 +8905,8 @@ (define_expand "builtin_longjmp"
 
   /* This bit is the same as expand_builtin_longjmp.  */
   emit_stack_restore (SAVE_NONLOCAL, stack, NULL_RTX);
-  emit_insn (gen_rtx_USE (VOIDmode, hard_frame_pointer_rtx));
-  emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
+  emit_use (hard_frame_pointer_rtx);
+  emit_use (stack_pointer_rtx);
 
   /* Load the label we are jumping through into r1 so that we know
      where to look for it when we get back to setjmp's function for
Index: gcc/config/pdp11/pdp11.md
===================================================================
--- gcc/config/pdp11/pdp11.md	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/pdp11/pdp11.md	2008-05-07 15:18:06.000000000 +0100
@@ -1593,7 +1593,7 @@ (define_insn "abshi2"
 ;
 ;  /* allow REG_NOTES to be set on last insn (labels don't have enough
 ;     fields, and can't be used for REG_NOTES anyway).  */
-;  emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
+;  emit_use (stack_pointer_rtx);
 ;  DONE;
 ;}")
 
Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/rs6000/rs6000.c	2008-05-07 15:18:06.000000000 +0100
@@ -4987,7 +4987,7 @@ rs6000_emit_move (rtx dest, rtx source, 
 	     This should not be done for operands that contain LABEL_REFs.
 	     For now, we just handle the obvious case.  */
 	  if (GET_CODE (operands[1]) != LABEL_REF)
-	    emit_insn (gen_rtx_USE (VOIDmode, operands[1]));
+	    emit_use (operands[1]);
 
 #if TARGET_MACHO
 	  /* Darwin uses a special PIC legitimizer.  */
Index: gcc/config/s390/s390.c
===================================================================
--- gcc/config/s390/s390.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/s390/s390.c	2008-05-07 15:18:07.000000000 +0100
@@ -7433,7 +7433,7 @@ s390_emit_prologue (void)
       if (TARGET_BACKCHAIN && flag_non_call_exceptions)
 	{
 	  addr = gen_rtx_MEM (BLKmode, gen_rtx_SCRATCH (VOIDmode));
-	  emit_insn (gen_rtx_CLOBBER (VOIDmode, addr));
+	  emit_clobber (addr);
 	}
     }
 
Index: gcc/config/s390/s390.md
===================================================================
--- gcc/config/s390/s390.md	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/s390/s390.md	2008-05-07 15:18:06.000000000 +0100
@@ -2282,11 +2282,11 @@ (define_expand "movmem_long"
   rtx len0 = gen_lowpart (Pmode, reg0);
   rtx len1 = gen_lowpart (Pmode, reg1);
 
-  emit_insn (gen_rtx_CLOBBER (VOIDmode, reg0));
+  emit_clobber (reg0);
   emit_move_insn (addr0, force_operand (XEXP (operands[0], 0), NULL_RTX));
   emit_move_insn (len0, operands[2]);
 
-  emit_insn (gen_rtx_CLOBBER (VOIDmode, reg1));
+  emit_clobber (reg1);
   emit_move_insn (addr1, force_operand (XEXP (operands[1], 0), NULL_RTX));
   emit_move_insn (len1, operands[2]);
 
@@ -2465,7 +2465,7 @@ (define_expand "setmem_long"
   rtx addr0 = gen_lowpart (Pmode, gen_highpart (word_mode, reg0));
   rtx len0 = gen_lowpart (Pmode, reg0);
 
-  emit_insn (gen_rtx_CLOBBER (VOIDmode, reg0));
+  emit_clobber (reg0);
   emit_move_insn (addr0, force_operand (XEXP (operands[0], 0), NULL_RTX));
   emit_move_insn (len0, operands[1]);
 
@@ -2605,11 +2605,11 @@ (define_expand "cmpmem_long"
   rtx len0 = gen_lowpart (Pmode, reg0);
   rtx len1 = gen_lowpart (Pmode, reg1);
 
-  emit_insn (gen_rtx_CLOBBER (VOIDmode, reg0));
+  emit_clobber (reg0);
   emit_move_insn (addr0, force_operand (XEXP (operands[0], 0), NULL_RTX));
   emit_move_insn (len0, operands[2]);
 
-  emit_insn (gen_rtx_CLOBBER (VOIDmode, reg1));
+  emit_clobber (reg1);
   emit_move_insn (addr1, force_operand (XEXP (operands[1], 0), NULL_RTX));
   emit_move_insn (len1, operands[2]);
 
@@ -2893,7 +2893,7 @@ (define_expand "extendsidi2"
 {
   if (!TARGET_64BIT)
     {
-      emit_insn (gen_rtx_CLOBBER (VOIDmode, operands[0]));
+      emit_clobber (operands[0]);
       emit_move_insn (gen_highpart (SImode, operands[0]), operands[1]);
       emit_move_insn (gen_lowpart (SImode, operands[0]), const0_rtx);
       emit_insn (gen_ashrdi3 (operands[0], operands[0], GEN_INT (32)));
@@ -3034,7 +3034,7 @@ (define_expand "zero_extendsidi2"
 {
   if (!TARGET_64BIT)
     {
-      emit_insn (gen_rtx_CLOBBER (VOIDmode, operands[0]));
+      emit_clobber (operands[0]);
       emit_move_insn (gen_lowpart (SImode, operands[0]), operands[1]);
       emit_move_insn (gen_highpart (SImode, operands[0]), const0_rtx);
       DONE;
@@ -4749,7 +4749,7 @@ (define_expand "udivmoddi4"
 		       gen_rtx_ZERO_EXTEND (TImode, div_equal));
 
   operands[4] = gen_reg_rtx(TImode);
-  emit_insn (gen_rtx_CLOBBER (VOIDmode, operands[4]));
+  emit_clobber (operands[4]);
   emit_move_insn (gen_lowpart (DImode, operands[4]), operands[1]);
   emit_move_insn (gen_highpart (DImode, operands[4]), const0_rtx);
 
@@ -4867,7 +4867,7 @@ (define_expand "udivmodsi4"
 		       gen_rtx_ZERO_EXTEND (DImode, div_equal));
 
   operands[4] = gen_reg_rtx(DImode);
-  emit_insn (gen_rtx_CLOBBER (VOIDmode, operands[4]));
+  emit_clobber (operands[4]);
   emit_move_insn (gen_lowpart (SImode, operands[4]), operands[1]);
   emit_move_insn (gen_highpart (SImode, operands[4]), const0_rtx);
 
@@ -7660,7 +7660,7 @@ (define_expand "builtin_setjmp_receiver"
   "flag_pic"
 {
   emit_insn (s390_load_got ());
-  emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
+  emit_use (pic_offset_table_rtx);
   DONE;
 })
 
@@ -7743,7 +7743,7 @@ (define_expand "restore_stack_nonlocal"
   if (temp)
     emit_move_insn (s390_back_chain_rtx (), temp);
 
-  emit_insn (gen_rtx_USE (VOIDmode, base));
+  emit_use (base);
   DONE;
 })
 
Index: gcc/config/sh/sh.c
===================================================================
--- gcc/config/sh/sh.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/sh/sh.c	2008-05-07 15:18:06.000000000 +0100
@@ -1371,8 +1371,7 @@ prepare_move_operands (rtx operands[], e
 		  if (flag_schedule_insns)
 		    emit_insn (gen_blockage ());
 		  emit_insn (gen_GOTaddr2picreg ());
-		  emit_insn (gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode,
-								 PIC_REG)));
+		  emit_use (gen_rtx_REG (SImode, PIC_REG));
 		  if (flag_schedule_insns)
 		    emit_insn (gen_blockage ());
 		}
@@ -5723,8 +5722,8 @@ output_stack_adjust (int size, rtx reg, 
 	      mem = gen_tmp_stack_mem (Pmode, gen_rtx_POST_INC (Pmode, reg));
 	      emit_move_insn (tmp_reg, mem);
 	      /* Tell flow the insns that pop r4/r5 aren't dead.  */
-	      emit_insn (gen_rtx_USE (VOIDmode, tmp_reg));
-	      emit_insn (gen_rtx_USE (VOIDmode, adj_reg));
+	      emit_use (tmp_reg);
+	      emit_use (adj_reg);
 	      return;
 	    }
 	  const_reg = gen_rtx_REG (GET_MODE (reg), temp);
@@ -6863,7 +6862,7 @@ sh_expand_epilogue (bool sibcall_p)
      USE PR_MEDIA_REG, since it will be explicitly copied to TR0_REG
      by the return pattern.  */
   if (TEST_HARD_REG_BIT (live_regs_mask, PR_REG))
-    emit_insn (gen_rtx_USE (VOIDmode, gen_rtx_REG (SImode, PR_REG)));
+    emit_use (gen_rtx_REG (SImode, PR_REG));
 }
 
 static int sh_need_epilogue_known = 0;
@@ -6917,7 +6916,7 @@ sh_set_return_address (rtx ra, rtx tmp)
 
       emit_insn (GEN_MOV (rr, ra));
       /* Tell flow the register for return isn't dead.  */
-      emit_insn (gen_rtx_USE (VOIDmode, rr));
+      emit_use (rr);
       return;
     }
 
@@ -10653,7 +10652,7 @@ sh_expand_t_scc (enum rtx_code code, rtx
     emit_insn (gen_movrt (result));
   else if ((code == EQ && val == 0) || (code == NE && val == 1))
     {
-      emit_insn (gen_rtx_CLOBBER (VOIDmode, result));
+      emit_clobber (result);
       emit_insn (gen_subc (result, result, result));
       emit_insn (gen_addsi3 (result, result, const1_rtx));
     }
Index: gcc/config/sparc/sparc.c
===================================================================
--- gcc/config/sparc/sparc.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/sparc/sparc.c	2008-05-07 15:18:06.000000000 +0100
@@ -3427,7 +3427,7 @@ load_pic_register (bool delay_pic_helper
   if (TARGET_VXWORKS_RTP)
     {
       emit_insn (gen_vxworks_load_got ());
-      emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
+      emit_use (pic_offset_table_rtx);
       return;
     }
 
@@ -3457,7 +3457,7 @@ load_pic_register (bool delay_pic_helper
      since setjmp/longjmp can cause life info to screw up.
      ??? In the case where we don't obey regdecls, this is not sufficient
      since we may not fall out the bottom.  */
-  emit_insn (gen_rtx_USE (VOIDmode, pic_offset_table_rtx));
+  emit_use (pic_offset_table_rtx);
 }
 
 /* Emit a call instruction with the pattern given by PAT.  ADDR is the
Index: gcc/config/sparc/sparc.md
===================================================================
--- gcc/config/sparc/sparc.md	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/sparc/sparc.md	2008-05-07 15:18:06.000000000 +0100
@@ -7104,8 +7104,8 @@ (define_expand "untyped_return"
 		  adjust_address (result, TARGET_ARCH64 ? TFmode : DFmode, 8));
 
   /* Put USE insns before the return.  */
-  emit_insn (gen_rtx_USE (VOIDmode, valreg1));
-  emit_insn (gen_rtx_USE (VOIDmode, valreg2));
+  emit_use (valreg1);
+  emit_use (valreg2);
 
   /* Construct the return.  */
   expand_naked_return ();
@@ -7191,8 +7191,8 @@ (define_expand "nonlocal_goto"
      and reload the appropriate value into %fp.  */
   emit_move_insn (hard_frame_pointer_rtx, stack);
 
-  emit_insn (gen_rtx_USE (VOIDmode, stack_pointer_rtx));
-  emit_insn (gen_rtx_USE (VOIDmode, static_chain_rtx));
+  emit_use (stack_pointer_rtx);
+  emit_use (static_chain_rtx);
 
   /* ??? The V9-specific version was disabled in rev 1.65.  */
   emit_jump_insn (gen_goto_handler_and_restore (labreg));
Index: gcc/config/spu/spu.c
===================================================================
--- gcc/config/spu/spu.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/spu/spu.c	2008-05-07 15:18:07.000000000 +0100
@@ -1906,8 +1906,7 @@ spu_expand_epilogue (bool sibcall_p)
 
   if (!sibcall_p)
     {
-      emit_insn (gen_rtx_USE
-		 (VOIDmode, gen_rtx_REG (SImode, LINK_REGISTER_REGNUM)));
+      emit_use (gen_rtx_REG (SImode, LINK_REGISTER_REGNUM));
       jump = emit_jump_insn (gen__return ());
       emit_barrier_after (jump);
     }
Index: gcc/config/v850/v850.c
===================================================================
--- gcc/config/v850/v850.c	2008-05-07 12:12:41.000000000 +0100
+++ gcc/config/v850/v850.c	2008-05-07 15:18:07.000000000 +0100
@@ -1909,7 +1909,7 @@ Saved %d bytes via epilogue function (%d
 					   plus_constant (stack_pointer_rtx,
 							  offset)));
 
-	      emit_insn (gen_rtx_USE (VOIDmode, restore_regs[i]));
+	      emit_use (restore_regs[i]);
 	      offset -= 4;
 	    }
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]