Hello,
This unch_memory in struct resources is a left-over from
RTX_UNCHANGING_P, but it looks like the change-over to MEM_READONLY_P
was done incorrectly: The resource_conflicts_p code now reports
conflicts for insns reading readonly memory and insns reading normal
memory or no memory at all.
Spotted by checking why reorg.c failed to fill some slots that my
sched-deps based delay slot scheduler managed to fill.
Bootstrappedtested on sparc64-unknown-linux-gnu. OK for trunk?
Ciao!
Steven
* resource.h (struct resources): Remove unch_memory member.
(CLEAR_RESOURCE): Don't clear unch_memory.
* resource.c (mark_referenced_resources): Don't set it.
(mark_set_resources): Likewise.
(mark_target_live_regs): Don't clear it.
(init_resource_info): Likewise.
* reorg.c (resource_conflicts_p): Don't compare it.
(redundant_insn): Don't set it.
Index: resource.h
===
--- resource.h (revision 198737)
+++ resource.h (working copy)
@@ -25,14 +25,13 @@ along with GCC; see the file COPYING3. If not see
/* Macro to clear all resources. */
#define CLEAR_RESOURCE(RES)\
- do { (RES)-memory = (RES)-unch_memory = (RES)-volatil = (RES)-cc = 0; \
+ do { (RES)-memory = (RES)-volatil = (RES)-cc = 0; \
CLEAR_HARD_REG_SET ((RES)-regs); } while (0)
/* The resources used by a given insn. */
struct resources
{
char memory; /* Insn sets or needs a memory location. */
- char unch_memory;/* Insn sets or needs an unchanging MEM. */
char volatil;/* Insn sets or needs a volatile memory loc. */
char cc; /* Insn sets or needs the condition codes. */
HARD_REG_SET regs; /* Which registers are set or needed. */
Index: resource.c
===
--- resource.c (revision 198737)
+++ resource.c (working copy)
@@ -240,9 +240,7 @@ mark_referenced_resources (rtx x, struct resources
case MEM:
/* If this memory shouldn't change, it really isn't referencing
memory. */
- if (MEM_READONLY_P (x))
- res-unch_memory = 1;
- else
+ if (! MEM_READONLY_P (x))
res-memory = 1;
res-volatil |= MEM_VOLATILE_P (x);
@@ -740,7 +738,6 @@ mark_set_resources (rtx x, struct resources *res,
if (in_dest)
{
res-memory = 1;
- res-unch_memory |= MEM_READONLY_P (x);
res-volatil |= MEM_VOLATILE_P (x);
}
@@ -896,7 +893,7 @@ mark_target_live_regs (rtx insns, rtx target, stru
/* We have to assume memory is needed, but the CC isn't. */
res-memory = 1;
- res-volatil = res-unch_memory = 0;
+ res-volatil = 0;
res-cc = 0;
/* See if we have computed this value already. */
@@ -1145,7 +1142,6 @@ init_resource_info (rtx epilogue_insn)
end_of_function_needs.cc = 0;
end_of_function_needs.memory = 1;
- end_of_function_needs.unch_memory = 0;
CLEAR_HARD_REG_SET (end_of_function_needs.regs);
if (frame_pointer_needed)
Index: reorg.c
===
--- reorg.c (revision 198737)
+++ reorg.c (working copy)
@@ -276,7 +276,6 @@ static int
resource_conflicts_p (struct resources *res1, struct resources *res2)
{
if ((res1-cc res2-cc) || (res1-memory res2-memory)
- || (res1-unch_memory res2-unch_memory)
|| res1-volatil || res2-volatil)
return 1;
@@ -1542,7 +1541,6 @@ redundant_insn (rtx insn, rtx target, rtx delay_li
/* Insns we pass may not set either NEEDED or SET, so merge them for
simpler tests. */
needed.memory |= set.memory;
- needed.unch_memory |= set.unch_memory;
IOR_HARD_REG_SET (needed.regs, set.regs);
/* This insn isn't redundant if it conflicts with an insn that either is