From: Jim Wilson Date: Tue, 15 Oct 2002 22:46:31 +0000 (+0000) Subject: Fix x86 miscompilation of gdb mips simulator. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c15c18c5815a10afc6057038d2a50053083a5491;p=gcc.git Fix x86 miscompilation of gdb mips simulator. * reload1.c (merge_assigned_reloads): After converting overlapping reloads to RELOAD_OTHER, abort if there are now conflicting reloads. * config/i386/i386.md (adddi3_1): Add call to ix86_binary_operator_ok. From-SVN: r58184 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dcb9d7470ae..6026be3b5e5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2002-10-15 Jim Wilson + + * reload1.c (merge_assigned_reloads): After converting overlapping + reloads to RELOAD_OTHER, abort if there are now conflicting reloads. + + * config/i386/i386.md (adddi3_1): Add call to ix86_binary_operator_ok. + Tue Oct 15 22:08:35 CEST 2002 Jan Hubicka * expr.c (do_tablejump): Fix typo in my previous commit. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index efa84c9515c..de6216f9d0d 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -4705,7 +4705,7 @@ (plus:DI (match_operand:DI 1 "nonimmediate_operand" "%0,0") (match_operand:DI 2 "general_operand" "roiF,riF"))) (clobber (reg:CC 17))] - "!TARGET_64BIT" + "!TARGET_64BIT && ix86_binary_operator_ok (PLUS, DImode, operands)" "#") (define_split diff --git a/gcc/reload1.c b/gcc/reload1.c index ea703f162ea..a163b8afb51 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -6119,10 +6119,24 @@ merge_assigned_reloads (insn) || rld[j].when_needed == RELOAD_FOR_INPADDR_ADDRESS) && reg_overlap_mentioned_for_reload_p (rld[j].in, rld[i].in)) - rld[j].when_needed - = ((rld[j].when_needed == RELOAD_FOR_INPUT_ADDRESS - || rld[j].when_needed == RELOAD_FOR_INPADDR_ADDRESS) - ? RELOAD_FOR_OTHER_ADDRESS : RELOAD_OTHER); + { + int k; + + rld[j].when_needed + = ((rld[j].when_needed == RELOAD_FOR_INPUT_ADDRESS + || rld[j].when_needed == RELOAD_FOR_INPADDR_ADDRESS) + ? RELOAD_FOR_OTHER_ADDRESS : RELOAD_OTHER); + + /* Check to see if we accidentally converted two reloads + that use the same reload register to the same type. + If so, the resulting code won't work, so abort. */ + if (rld[j].reg_rtx) + for (k = 0; k < j; k++) + if (rld[k].in != 0 && rld[k].reg_rtx != 0 + && rld[k].when_needed == rld[j].when_needed + && rtx_equal_p (rld[k].reg_rtx, rld[j].reg_rtx)) + abort (); + } } } }