Port-vax archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Building on NetBSD/VAX 10.0_RC1, Summary(?)
I think we get more attention on a VAX again, as it seems to be usable
again, so I just did a cut&paste of two emails on
our latest thread to get the machines working again.
Thanks again to Greg & Kalvis (for sharing the details), and for sure to
a lot of others for working on it!!!
Also attached to this email is the patch from Kalvis again, so it is
easier to find ...
On 2023-12-07 22:39, Kalvis Duckmanton wrote:
Hi all,
I *think* I've worked out what the 'reload' pass has done when
compiling this test case, though I'm not sure that I understand it
well enough to be able to explain it properly.
I'm not yet sure what the cause is, but I have noticed that the output
from g++'s 'reload' pass isn't correct.
What seems to have happened is that the instructions to push argument
3 have inherited the output reload of --%sp into %r1 from the
instructions pushing argument 5, but GCC hasn't noted that the pushl
$0 for argument 4 has also changed %sp so the output reload can't be
reused.
There's a block of code in gcc/reload1.c which does invalidate old
output reloads; the attached patch adds to this block to invalidate a
reload of an output register if the output register is a reference to
memory using an autoincrement or autodecrement addressing mode.
With the patch applied, I've been able to compile the test case using
the resulting native compiler, and a native build of NetBSD hasn't
failed yet, which is promising. I have not applied any workarounds to
sancov.c or to tree-switch-conversion.c, and I'm also compiling GCC
with the default optimisation level (-O2; I haven't applied any of
Matthew's changes mentioned earlier).
I've also applied this change to a copy of GCC 10.5.0 from upstream
and on amd64 at least there was no change to the regression test
results so I don't think this introduces any regressions.
I'm curious to know if this will work for anyone else.
cheers
kalvis
On 2023-12-12 19:54, Greg Oster wrote:
You don't need to get gcc12 -- You can just use the gcc that is with
the sources you fetch above. Grab the patch that Kalvis posted on Dec
7, and patch the source.
Get is from PKGSRC first & install, than start a "build.sh -V
HAVE_GCC12"?
Just use regular 'build.sh' - no need to specify a different compiler
once the compiler sources are patched... e.g.:
cd /u1/builds/build1/src/
sh ./build.sh -U -u -m vax -D /u1/builds/build1/install/vax \
-R /u1/builds/build1/release
if your sources are in /u1/builds/build1/src/. (My build line is
actually:
sh ./build.sh -U -u -m vax -j 2 -V MAKECONF=/u1/builds/mk.conf \
-D /u1/builds/build3/install/vax -R /u1/builds/build3/release
as the build line gets generated and run by a different script...)
You'll want to have a healthy amount of swapspace setup... right now
I'd suggest 512MB or better. And set your shell limts to something like:
cputime unlimited
filesize unlimited
datasize 524288 kbytes
stacksize 8192 kbytes
coredumpsize 0 kbytes
memoryuse 58296 kbytes
memorylocked 19432 kbytes
maxproc 148
maxthread 2048
openfiles 548
sbsize unlimited
vmemoryuse 524288 kbytes
(which I do with this, in csh:
limit maxproc unlimited
limit datasize unlimited
limit stacksize unlimited
limit coredumpsize 0
limit openfiles unlimited
limit vmemoryuse unlimited
)
If you don't bump the default limits up building certain files will
fail... with '-j 2' I needed over 512MB to get the build to not fail -
1024MB seems better...
Later...
Greg Oster
diff --git a/external/gpl3/gcc.old/dist/gcc/reload1.c b/external/gpl3/gcc.old/dist/gcc/reload1.c
index 88f4727d5453..8d481071a12b 100644
--- a/external/gpl3/gcc.old/dist/gcc/reload1.c
+++ b/external/gpl3/gcc.old/dist/gcc/reload1.c
@@ -8377,6 +8377,43 @@ emit_reload_insns (class insn_chain *chain)
reg_last_reload_reg[out_regno + k] = 0;
}
}
+
+#if AUTO_INC_DEC /* XXX KD */
+ /* Where an output register might be reloaded, and it is a
+ memory reference, and the address is auto-incremented, any
+ previously reloaded copy of the address must be
+ invalidated. */
+ if (i < 0
+ && rld[r].out != 0
+ && MEM_P (rld[r].out))
+ {
+ rtx out = XEXP (rld[r].out, 0); /* address expression */
+ enum rtx_code code = GET_CODE (out);
+
+ if (code != POST_INC && code != POST_DEC
+ && code != PRE_INC && code != PRE_DEC)
+ {
+ /* do nothing */
+ }
+ else
+ {
+ int out_regno = REGNO (XEXP (out, 0));
+ machine_mode mode = GET_MODE (XEXP (out, 0));
+
+ /* for the moment, handle only the case where out_regno
+ is a hardware register */
+
+ if (HARD_REGISTER_NUM_P (out_regno))
+ {
+ int k, out_nregs = hard_regno_nregs (out_regno, mode);
+
+ for (k = 0; k < out_nregs; k++)
+ reg_last_reload_reg[out_regno + k] = 0;
+ }
+ }
+ }
+#endif /* AUTO_INC_DEC */ /* XXX KD */
+
}
reg_reloaded_dead |= reg_reloaded_died;
}
Home |
Main Index |
Thread Index |
Old Index