From c2310f512421067634bb72e63932a926dedbf79e Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 26 Sep 2002 18:07:52 -0700 Subject: [PATCH] sched-deps.c (sched_analyze_insn): Make clobber insns depend on call insns. * sched-deps.c (sched_analyze_insn): Make clobber insns depend on call insns. * gcc.c-torture/compile/20020926-1.c: New. From-SVN: r57566 --- gcc/ChangeLog | 6 ++++++ gcc/sched-deps.c | 10 ++++++++- .../gcc.c-torture/compile/20020926-1.c | 21 +++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20020926-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6c9702a3631..f836df4cf54 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-09-26 Richard Henderson + + PR c/7160 + * sched-deps.c (sched_analyze_insn): Make clobber insns depend + on call insns. + 2002-09-26 Richard Henderson * emit-rtl.c (const_double_htab_eq): Remove unused variable. diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c index 32260a89f50..cf762cccb58 100644 --- a/gcc/sched-deps.c +++ b/gcc/sched-deps.c @@ -922,7 +922,15 @@ sched_analyze_insn (deps, x, insn, loop_notes) code = GET_CODE (x); } if (code == SET || code == CLOBBER) - sched_analyze_1 (deps, x, insn); + { + sched_analyze_1 (deps, x, insn); + + /* Bare clobber insns are used for letting life analysis, reg-stack + and others know that a value is dead. Depend on the last call + instruction so that reg-stack won't get confused. */ + if (code == CLOBBER) + add_dependence_list (insn, deps->last_function_call, REG_DEP_OUTPUT); + } else if (code == PARALLEL) { int i; diff --git a/gcc/testsuite/gcc.c-torture/compile/20020926-1.c b/gcc/testsuite/gcc.c-torture/compile/20020926-1.c new file mode 100644 index 00000000000..260e844549a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20020926-1.c @@ -0,0 +1,21 @@ +/* PR c/7160 */ +/* Verify that the register-to-stack converter properly handles + branches without return value containing function calls. */ + +extern int gi; + +extern int foo1(int, int); +extern void foo2(int, int); +extern float foo3(int); + +float bar(int i1, int i2) +{ + int i3; + + if (i2) { + i3 = foo1(i1, gi); + foo2(i1, i3); + } + else + return foo3(i2); +} -- 2.30.2