On March 14, 2021 6:55:32 AM GMT+01:00, Paul Edwards via Gcc <gcc@gcc.gnu.org> wrote: >If I have code like this: > >char foo(char *p) >{ > return (p[-1]); >} > >It generates a negative index, like this: > >* Function foo code > L 2,=F'-1' > L 3,0(11) > SLR 15,15 > IC 15,0(2,3) >* Function foo epilogue > >See that (2,3) - that is adding both R2 + R3. >R3 is a pointer to a location in 4 GiB space. >R2 is now 0xFFFFFFFF > >In 64-bit mode, both of those values are added >together and there is no address wrap, so it >accesses memory above the 4 GiB boundary >(between 4 GiB and 8 GiB to be precise) >which I don't have access to. > >Is there a way of constraining index registers to positive >values? > >I want it to instead generate >ALR 3,2 >to add these two values together using 32-bit arithmetic, >causing truncation at 32 bits, then it can do >IC 15,0(3) >(ie no index) > >I'm using GCC 3.2.3 using the i370 target if it makes a difference.
You are likely missing a fix that sign extends offsets on Pmode!=ptr_mode targets. 3.2.3 is really old now ;) Richard. >Thanks. Paul.