aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2002-01-17 13:07:58 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2002-01-17 13:07:58 +0100
commitd0e8287098058789159a24f649d61bd88a790dd4 (patch)
tree008147a2a9b23216042d95c1ef782685b8f0a91f
parent02c361a4722172970a81ff47d0b4cb95d605aefe (diff)
downloadgcc-d0e8287098058789159a24f649d61bd88a790dd4.zip
gcc-d0e8287098058789159a24f649d61bd88a790dd4.tar.gz
gcc-d0e8287098058789159a24f649d61bd88a790dd4.tar.bz2
ia64.md (prologue_use): New.
* 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. * gcc.c-torture/compile/20020116-1.c: New test. From-SVN: r48946
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/ia64/ia64.c12
-rw-r--r--gcc/config/ia64/ia64.md10
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20020116-1.c28
5 files changed, 58 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index ba33e40..e21e363 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 f3bbb8f..1f36cb0 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 4f45575..c88e8b0 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 0e049be..f3bd783 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 0000000..6c023ed
--- /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;
+}