[M3devel] M3CG loophole operator is not LOOPHOLE (but what?)
Jay K
jay.krell at cornell.edu
Sun Jan 3 01:11:41 CET 2016
> Some of them assume address is same size as native integer.
This is correct and by-design.
BYTESIZE(INTEGER) = BYTESIZE(REFANY) etc. (all pointers are the same size)
In C and C++, for the vast majority of systems
sizeof(size_t) = sizeof(char*) etc. (again, all pointers are the same size)
VMS64 might be an exception. Might.
However modern C and C++ offer intptr_t/uintptr_t for this:
sizeof(intptr_t) == sizeof(char*) etc. (again, all pointers are the same size)
It is popular to think sizeof(long) == sizeof(char*) but that is frequently incorrect, maybe half the time.
(i.e. on Win64 and maybe VMS64)
I'd still like to check/test what happens in the C and NT386 backends here, for loophole changing sizes, but not right now, sorry.
The asserts about widen/chop not occurring are from me.
You know, I fairly recently went through much/most/all of what you are doing (I hope all, but I fear much/most) -- implementing a new backend from scratch, and having to figure out precise meanings of things
> > I would prefer one change at a time, each tested by reboostrapping twice.
upgrade.py does the "twice" part builtin.
- Jay
> Date: Sat, 2 Jan 2016 15:03:27 -0600
> From: rodney_bates at lcwb.coop
> To: m3devel at elegosoft.com
> Subject: Re: [M3devel] M3CG loophole operator is not LOOPHOLE (but what?)
>
> The further I get into this, the more worms crawl out. The only cm3 IR
> operators that change an operand size (without storing/refetching in memory)
> are widen and chop. The inserts and extracts work entirely within the same-
> sized word. But widen and chop are never produced by the front end, and
> the integrated and C back ends assert they don't happen. m3cc has code
> for them, but this will be entirely untested, and vetting it involves
> tracing through lots of gcc code.
>
> So I plan to redefine the misdocumented loophole operator to allow size
> changes among Int32/Word32/Int64/Word64, with shortening changes doing a
> chop and widening doing either zero-extend or sign-extend, consistent with
> the signedness of the result type. I think this will cover all the cases
> required by current places where loophole is emitted, which further implies
> the backends are all doing at least these, assuming there are sufficient
> test cases. This amounts only to correcting the documentation in M3CG_Ops.i3
>
> m3llvm will then need to add these behaviors, and things should at least work
> as well as always.
>
> The many loophole-emitting places still need thorough review and documentation
> of their requirements. Some of them assume address is same size as native
> integer.
>
> Implementing chop and widen, using them for size changes, and changing loophole
> back to the same as LOOPHOLE is the right way, but involves a lot of work and
> testing, for small code changes.
>
> On 12/16/2015 12:01 PM, Rodney M. Bates wrote:
> > The issue I raised is not with the M3 LOOPHOLE builtin function. The compiler
> > currently implements it correctly, according to the language definition, as
> > Tony quoted. The front end verifies the size equality, as required by the
> > language, then emits an intermediate "loophole" operator, which will be same
> > size, and thus well-defined as equivalent to LOOPHOLE. (And also llvm bitcast,
> > which is now being used to translate the loophole operator in this case.)
> >
> > My issue is that there are 13 other places the front-end emits an internally
> > generated "loophole", and these (almost?) all can do so with unequal sizes.
> > Moreover, what should be done with the unequal sizes varies from place to place.
> >
> > It is possible that the "loophole" operator can be defined to do what is
> > correct in every case by a conditional rule based on the two types. I
> > need to do another pass through them to be sure. This may be the quickest
> > way to get the llvm backend working, but I think it is not good design.
> > It would be carefully tailored to just a specific set of uses of "loophole",
> > instead of making a reasonable abstraction out of" loophole". It would be
> > rather fragile and involve a lot of analysis on the full Cartesian product
> > of both supplier and client side cases of "loophole" to define and verify.
> >
> > The best way, IMO, is to fix each "loophole"-generating site to use other
> > operators, as appropriate. It is at these sites that it is known what
> > should be done in each case. I suspect existing intermediate operators
> > "widen", "insert_mn" and "extract_mn" are sufficient. Again, another pass
> > through the cases is indicated. The only pragmatic drawback to this is
> > that this requires considerable care and retesting to avoid breakage of
> > existing behavior. At worst, it risks inability to bootstrap the compiler.
> > I would prefer one change at a time, each tested by reboostrapping twice.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://m3lists.elegosoft.com/pipermail/m3devel/attachments/20160103/440ffbf5/attachment-0002.html>
More information about the M3devel
mailing list