From: Bernd Schmidt Date: Thu, 30 Nov 2000 12:28:02 +0000 (+0000) Subject: Backport a change to the 2.95 branch X-Git-Tag: prereleases/gcc-2.95.3-test1~46 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3f3fdff8fb3017383c2e275effac90687e673576;p=thirdparty%2Fgcc.git Backport a change to the 2.95 branch From-SVN: r37887 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 16dde7299e9e..2924f0daf97a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,13 @@ 2000-11-30 Bernd Schmidt + Wed Oct 27 03:09:23 1999 J"orn Rennecke + * reload.h (earlyclobber_operand_p): Declare. + * reload.c (earlyclobber_operand_p): Don't declare. No longer static. + * reload1.c (reload_reg_free_for_value_p): RELOAD_OTHER reloads with + an earlyclobbered output conflict with RELOAD_INPUT reloads - handle + case where the RELOAD_OTHER reload is new. Use + earlyclobber_operand_p. + 2000-01-12 Bernd Schmidt * reload1.c (reload_reg_unavailable): New static variable. (reload_reg_free_p): Test it. diff --git a/gcc/reload.c b/gcc/reload.c index 689acaa2ec3c..72b38f325165 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -322,7 +322,6 @@ static int find_reusable_reload PROTO((rtx *, rtx, enum reg_class, static rtx find_dummy_reload PROTO((rtx, rtx, rtx *, rtx *, enum machine_mode, enum machine_mode, enum reg_class, int, int)); -static int earlyclobber_operand_p PROTO((rtx)); static int hard_reg_set_here_p PROTO((int, int, rtx)); static struct decomposition decompose PROTO((rtx)); static int immune_p PROTO((rtx, rtx, struct decomposition)); @@ -2006,7 +2005,7 @@ find_dummy_reload (real_in, real_out, inloc, outloc, /* Return 1 if X is an operand of an insn that is being earlyclobbered. */ -static int +int earlyclobber_operand_p (x) rtx x; { diff --git a/gcc/reload.h b/gcc/reload.h index 968d3124af49..50526db8566f 100644 --- a/gcc/reload.h +++ b/gcc/reload.h @@ -342,3 +342,5 @@ extern void save_call_clobbered_regs PROTO((void)); /* Replace (subreg (reg)) with the appropriate (reg) for any operands. */ extern void cleanup_subreg_operands PROTO ((rtx)); + +extern int earlyclobber_operand_p PROTO((rtx)); diff --git a/gcc/reload1.c b/gcc/reload1.c index b49d9925551f..82c7cbe4b5c9 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -5206,6 +5206,10 @@ reload_reg_free_for_value_p (regno, opnum, type, value, out, reloadnum, int ignore_address_reloads; { int time1; + /* Set if we see an input reload that must not share its reload register + with any new earlyclobber, but might otherwise share the reload + register with an output or input-output reload. */ + int check_earlyclobber = 0; int i; int copy = 0; @@ -5333,6 +5337,7 @@ reload_reg_free_for_value_p (regno, opnum, type, value, out, reloadnum, break; case RELOAD_FOR_INPUT: time2 = reload_opnum[i] * 4 + 4; + check_earlyclobber = 1; break; /* reload_opnum[i] * 4 + 4 <= (MAX_RECOG_OPERAND - 1) * 4 + 4 == MAX_RECOG_OPERAND * 4 */ @@ -5345,6 +5350,7 @@ reload_reg_free_for_value_p (regno, opnum, type, value, out, reloadnum, break; case RELOAD_FOR_OPERAND_ADDRESS: time2 = MAX_RECOG_OPERANDS * 4 + 2; + check_earlyclobber = 1; break; case RELOAD_FOR_INSN: time2 = MAX_RECOG_OPERANDS * 4 + 3; @@ -5373,6 +5379,9 @@ reload_reg_free_for_value_p (regno, opnum, type, value, out, reloadnum, if (! reload_in[i] || rtx_equal_p (reload_in[i], value)) { time2 = MAX_RECOG_OPERANDS * 4 + 4; + /* Earlyclobbered outputs must conflict with inputs. */ + if (earlyclobber_operand_p (reload_out[i])) + time2 = MAX_RECOG_OPERANDS * 4 + 3; break; } time2 = 1; @@ -5395,6 +5404,11 @@ reload_reg_free_for_value_p (regno, opnum, type, value, out, reloadnum, } } } + + /* Earlyclobbered outputs must conflict with inputs. */ + if (check_earlyclobber && out && earlyclobber_operand_p (out)) + return 0; + return 1; }