Hello, On Mon, 22 Apr 2013 08:12:50 -0500 Peter Bigot <big...@acm.org> wrote:
> Changes to mspgcc are/were driven by tickets filed on the SF bug > tracker. If you'd like this change made after reading the material > below, please file a ticket there. mspgcc evolution/maintenance is > not funded at this time and the issue is below the threshold that I > consider critical enough to donate time, so the ticket will remain > open until somebody takes over such maintenance. Submitted: https://sourceforge.net/p/mspgcc/bugs/351/ . I actually didn't want to spend too much time on this, or call for immediate actions, just point out that there're better choices for implementation-defined behavior as implemented mspgcc. I personally don't expect any immediate changes, the whole idea was to save novices or folks who may port big software from unneeded headache. > For the record, I've reconstructed my reasoning from two years ago, > which makes explicit the point Przemek made. It's not worth the > research to prove it, but again this was justified by similar > practices in other gcc back-ends, even if not x86. > > First, the value of a shift expression should be the same whether it > is computed at compile time or at runtime. Well, it's the same thing - standard doesn't require this ;-). I understand benefit of consistency, but given the choices (both sanctioned by standard, as it simply underfines the case completely): 1. Make runtime & compile-time be consistent. 2. Make compile-time be consistent with mathematical definition, and leave runtime to be optimal for particular h/w. - It hopefully easier to make a choice. If not, then good exercise may be to stop thinking about particular embedded CPU and all quirks which can be done in its realm, but think about a compiler in general, and that metaprogramming is important thing for producing optimal code (especially for embedded targets!), and metapgramming requires robust compile-time evaluation. > I.e., 1 << 16 should > produce the same value as 1 << v when v has the value 16. > > Second, the base MSP430 ISA does not have a multi-position shift > operation like x86 does. It can shift only one bit position at a > time. Exactly, so masking out bits in shift counter wasn't even hardware-bound (I don't know much about MSP430X), but more or less arbitrary choice. > Variable shifts must be translated into loops with the > iteration count provided at runtime. (Second-prime: use of MSP430X > which has a limited version of such instructions should also not > result in a change of the value of the shift expression.) Oops, here you appear to want even more than I: I want just math-guided rules for builtin GCC calculator, you want to generate same-behaving code for different ISAs, at the potential expense of runtime-efficiency. Hmm... > Third, it is unreasonable when v has the value 63532 to stall the > processor for 65532 iterations of a loop calculating 1 << v. Instead > the runtime code should limit the iteration count. Since the maximum > number of iterations before the expression value becomes a constant > (i.e., the number of bits in the expression value) will always be a > known power of two, masking the iteration count to preserve only the > low bits from 0 to that number is the simplest solution. Whoa, so you generate non-optimal code for the slight possibility that someone shifts stuff 63532 times? That clearly goes against what Przemek wrote (and with what I wholly agree, as my suggestions are solely for compile-time behavior). If a programmer wants to shoot oneself in the feet, don't preclude one from doing that, just give a good gun which will shoot in the feet, not suddenly in the opposite direction ;-). > This is the behavior mspgcc currently uses. To accommodate your > request a test would have to be added at runtime to see whether the > iteration count is equal to or greater than the number of bits in the > expression value, and if so to substitute the constant (0 or ~0) that > would have resulted from the shift operation. This introduces code > bloat, as in the vast majority of cases people will not be using a > shift count that is large enough to trigger the conditional. > > In my opinion increasing generated code size just to accommodate a > practice that is explicitly undefined behavior is a poor use of > resources and improperly encourages a misunderstanding of how C > treats this situation. Having considered the arguments, no, the > behavior will not be changed. So once again, I was talking about changing *only* compile-time time behavior, runtime doesn't need to change (except that, as a separate issue, I'd vote for removing any extra masking during runtime shifts - programmer either took care of that by masking count oneself, knows that it's invariantly in range, or well, wants to shift 60K times). > Please note that the new back end under development by Red Hat may > have different behavior. > > Peter > > > On Sun, Apr 21, 2013 at 6:10 PM, Paul Sokolovsky <pmis...@gmail.com> > wrote: > > > Hello, > > > > On Sun, 21 Apr 2013 17:06:51 -0500 > > Peter Bigot <big...@acm.org> wrote: > > > > > This decision was intentional, as documented in > > > https://sourceforge.net/p/mspgcc/bugs/118/. My recollection is > > > that the choice of how to make things consistent was informed by > > > similar behavior in the contemporaneous gcc for x86 or at least > > > one other target architecture. > > > > Thanks for the reference. So, I tested it with x86 gcc 4.4, 4.5, > > 4.6, 4.7 (packages as shipped by Ubuntu), all of them produce > > mathematically expected result. msp430-gcc 4.5.3, 4.7.0 both > > produce unexpected result. > > > > > As you say, the behavior is undefined. Anybody who expects any > > > particular behavior for this situation is confused about how C > > > works and should take the issue up with JTC1/SC22/WG14. > > > > That's why I wrote so many words in the original mail. Yes, in small > > world of JTC1/SC22/WG14 C standard the behavior is undefined. But in > > much bigger world of: mathematics, well-known gcc targets, user > > expectations, principle of least surprise, etc. - it's all pretty > > well defined. So, when something is undefined in small area, it's > > still a good idea to have affinity towards how it's done/expected > > in wider areas. So, the request is just that - please kindly > > consider changing that behavior ;-). > > > > > > > > Peter > > > > > > > -- > > Best regards, > > Paul mailto:pmis...@gmail.com > > -- Best regards, Paul mailto:pmis...@gmail.com ------------------------------------------------------------------------------ Precog is a next-generation analytics platform capable of advanced analytics on semi-structured data. The platform includes APIs for building apps and a phenomenal toolset for data science. Developers can use our toolset for easy data analysis & visualization. Get a free account! http://www2.precog.com/precogplatform/slashdotnewsletter _______________________________________________ Mspgcc-users mailing list Mspgcc-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mspgcc-users