From: J"orn Rennecke Date: Wed, 9 Jun 2004 12:48:21 +0000 (+0000) Subject: re PR rtl-optimization/15521 (sched1 extends life of hard registers on SMALL_REGISTER... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b40742a53183a904e4902b1fcad54b7b2c6cf57d;p=gcc.git re PR rtl-optimization/15521 (sched1 extends life of hard registers on SMALL_REGISTER_CLASSES targets when exceptions are enabled) PR rtl-optimization/15521: * sched-int.h (in_post_call_group_p): Change type to enum. * sched-deps.c (sched_analyze_insn): (sched_analyze): When in_post_call_group_p is post_call_initial, don't add a dependency, but still set SCHED_GROUP_P and CANT_MOVE, and also reset in_post_call_group_p to post_call. (sched_analyze): When the previous basic block ended in a CALL_INSN, initialize in_post_call_group_p as post_call_initial. (init_deps): initialize in_post_call_group_p to not_post_call. From-SVN: r82831 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index db8a7c32465..55d2914e97a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2004-06-09 J"orn Rennecke + + PR rtl-optimization/15521: + * sched-int.h (in_post_call_group_p): Change type to enum. + * sched-deps.c (sched_analyze_insn): + (sched_analyze): When in_post_call_group_p is post_call_initial, + don't add a dependency, but still set SCHED_GROUP_P and CANT_MOVE, + and also reset in_post_call_group_p to post_call. + (sched_analyze): When the previous basic block ended in a CALL_INSN, + initialize in_post_call_group_p as post_call_initial. + (init_deps): initialize in_post_call_group_p to not_post_call. + 2004-06-09 Arnaud Charlet PR ada/6637 diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c index 7802bf23e61..c1c4ece2e8e 100644 --- a/gcc/sched-deps.c +++ b/gcc/sched-deps.c @@ -1145,13 +1145,21 @@ sched_analyze_insn (struct deps *deps, rtx x, rtx insn, rtx loop_notes) if (src_regno < FIRST_PSEUDO_REGISTER || dest_regno < FIRST_PSEUDO_REGISTER) { - set_sched_group_p (insn); + /* If we are inside a post-call group right at the start of the + scheduling region, we must not add a dependency. */ + if (deps->in_post_call_group_p == post_call_initial) + { + SCHED_GROUP_P (insn) = 1; + deps->in_post_call_group_p = post_call; + } + else + set_sched_group_p (insn); CANT_MOVE (insn) = 1; } else { end_call_group: - deps->in_post_call_group_p = false; + deps->in_post_call_group_p = not_post_call; } } } @@ -1168,6 +1176,15 @@ sched_analyze (struct deps *deps, rtx head, rtx tail) if (current_sched_info->use_cselib) cselib_init (true); + /* Before reload, if the previous block ended in a call, show that + we are inside a post-call group, so as to keep the lifetimes of + hard registers correct. */ + if (! reload_completed && GET_CODE (head) != CODE_LABEL) + { + insn = prev_nonnote_insn (head); + if (insn && GET_CODE (insn) == CALL_INSN) + deps->in_post_call_group_p = post_call_initial; + } for (insn = head;; insn = NEXT_INSN (insn)) { rtx link, end_seq, r0, set; @@ -1259,7 +1276,7 @@ sched_analyze (struct deps *deps, rtx head, rtx tail) /* Before reload, begin a post-call group, so as to keep the lifetimes of hard registers correct. */ if (! reload_completed) - deps->in_post_call_group_p = true; + deps->in_post_call_group_p = post_call; } /* See comments on reemit_notes as to why we do this. @@ -1420,7 +1437,7 @@ init_deps (struct deps *deps) deps->last_pending_memory_flush = 0; deps->last_function_call = 0; deps->sched_before_next_call = 0; - deps->in_post_call_group_p = false; + deps->in_post_call_group_p = not_post_call; deps->libcall_block_tail_insn = 0; } diff --git a/gcc/sched-int.h b/gcc/sched-int.h index 6387227f1dd..383a29d3e3a 100644 --- a/gcc/sched-int.h +++ b/gcc/sched-int.h @@ -94,7 +94,7 @@ struct deps /* Used to keep post-call pseudo/hard reg movements together with the call. */ - bool in_post_call_group_p; + enum { not_post_call, post_call, post_call_initial } in_post_call_group_p; /* Set to the tail insn of the outermost libcall block.