diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ba33e40024c05620af8919d00548c0d2c0f6f730..e21e363f1ce14350c5059939822c64b63ba7f0d3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2002-01-17  Jakub Jelinek  <jakub@redhat.com>
+
+	* config/ia64/ia64.md (prologue_use): New.
+	* config/ia64/ia64.c (ia64_expand_prologue): Use
+	gen_prologue_use instead of gen_rtx_USE.
+	(group_barrier_needed_p): Handle CODE_FOR_prologue_use the same way
+	as CODE_FOR_pred_rel_mutex.
+	(ia64_sched_reorder2): Likewise.
+
 2002-01-16  Eric Christopher  <echristo@redhat.com>
 
 	* config/mips/r3900.h: Reformat.
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c
index f3bbb8f670a5e754c470be9a1906240e65cf7804..1f36cb03543497bbb4ad864a467245658bbaafec 100644
--- a/gcc/config/ia64/ia64.c
+++ b/gcc/config/ia64/ia64.c
@@ -2137,7 +2137,7 @@ ia64_expand_prologue ()
       /* Even if we're not going to generate an epilogue, we still
 	 need to save the register so that EH works.  */
       if (! epilogue_p && current_frame_info.reg_save_ar_unat)
-	emit_insn (gen_rtx_USE (VOIDmode, ar_unat_save_reg));
+	emit_insn (gen_prologue_use (ar_unat_save_reg));
     }
   else
     ar_unat_save_reg = NULL_RTX;
@@ -2178,7 +2178,7 @@ ia64_expand_prologue ()
 	  /* Even if we're not going to generate an epilogue, we still
 	     need to save the register so that EH works.  */
 	  if (! epilogue_p)
-	    emit_insn (gen_rtx_USE (VOIDmode, alt_reg));
+	    emit_insn (gen_prologue_use (alt_reg));
 	}
       else
 	{
@@ -2222,7 +2222,7 @@ ia64_expand_prologue ()
 	  /* Even if we're not going to generate an epilogue, we still
 	     need to save the register so that EH works.  */
 	  if (! epilogue_p)
-	    emit_insn (gen_rtx_USE (VOIDmode, alt_reg));
+	    emit_insn (gen_prologue_use (alt_reg));
 	}
       else
 	{
@@ -2262,7 +2262,7 @@ ia64_expand_prologue ()
 	  /* Even if we're not going to generate an epilogue, we still
 	     need to save the register so that EH works.  */
 	  if (! epilogue_p)
-	    emit_insn (gen_rtx_USE (VOIDmode, alt_reg));
+	    emit_insn (gen_prologue_use (alt_reg));
 	}
       else
 	{
@@ -4776,6 +4776,7 @@ group_barrier_needed_p (insn)
 
 	  /* Doesn't generate code.  */
 	case CODE_FOR_pred_rel_mutex:
+	case CODE_FOR_prologue_use:
 	  return 0;
 
 	default:
@@ -6393,7 +6394,8 @@ ia64_sched_reorder2 (dump, sched_verbose, ready, pn_ready, clock_var)
 
 	  /* Ignore cycle displays and .pred.rel.mutex.  */
 	  if (insn_code == CODE_FOR_cycle_display
-	      || insn_code == CODE_FOR_pred_rel_mutex)
+	      || insn_code == CODE_FOR_pred_rel_mutex
+	      || insn_code == CODE_FOR_prologue_use)
 	    continue;
 
 	  if (insn_code == CODE_FOR_insn_group_barrier)
diff --git a/gcc/config/ia64/ia64.md b/gcc/config/ia64/ia64.md
index 4f45575a55e05b931010b20891e82d9fcd3b0fe0..c88e8b0270ad7a30f9978cfd369c19118b51566d 100644
--- a/gcc/config/ia64/ia64.md
+++ b/gcc/config/ia64/ia64.md
@@ -67,6 +67,7 @@
 ;;	22      bundle selector
 ;;	23      cycle display
 ;;      24      addp4
+;;	25	prologue_use
 ;;
 ;; unspec_volatile:
 ;;	0	alloc
@@ -5302,3 +5303,12 @@
   "addp4 %0 = 0,%1"
   [(set_attr "itanium_class" "ialu")])
 
+;;
+;; As USE insns aren't meaningful after reload, this is used instead
+;; to prevent deleting instructions setting registers for EH handling
+(define_insn "prologue_use"
+  [(unspec:DI [(match_operand:DI 0 "register_operand" "")] 25)]
+  ""
+  "// %0 needed for EH"
+  [(set_attr "itanium_class" "ignore")
+   (set_attr "predicable" "no")])
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0e049be589d14cbdbe64f5496ffd1f3463806720..f3bd7830104823d1ddb38ba3f9756e8e66a83d76 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2002-01-17  Jakub Jelinek  <jakub@redhat.com>
+
+	* gcc.c-torture/compile/20020116-1.c: New test.
+
 2002-01-16  Jakub Jelinek  <jakub@redhat.com>
 
 	* gcc.dg/20020116-2.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/20020116-1.c b/gcc/testsuite/gcc.c-torture/compile/20020116-1.c
new file mode 100644
index 0000000000000000000000000000000000000000..6c023edcabe7813fb0af5af07fdb2d8da5f10631
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20020116-1.c
@@ -0,0 +1,28 @@
+void noret (void) __attribute__ ((noreturn));
+int foo (int, char **);
+char *a, *b;
+int d;
+
+int
+main (int argc, char **argv)
+{
+  register int c;
+
+  d = 1;
+  while ((c = foo (argc, argv)) != -1)
+    switch (c) {
+    case 's':
+    case 'c':
+    case 'f':
+      a = b;
+      break;
+    case 'v':
+      d = 1;
+      break;
+    case 'V':
+      d = 0;
+      break;
+    }
+  noret ();
+  return 0;
+}