rtx_unchanging_p vs c++ vtable fields

Richard Kenner kenner@vlsi1.ultra.nyu.edu
Fri Dec 7 19:02:00 GMT 2001


    Recently, libstdc++ has been being miscompiled, which causes all c++
    tests to fail on alphaev6-linux.  Not sure exactly what change exposed
    the problem, but the bug is that in ctype<char>::ctype,

    (insn 135 133 139 (set (mem/s/u/j:DI (reg/v/u/f:DI 69)
				     [0 <variable>._vptr$facet+0 S8 A64])
        (reg:DI 90)) -1 (nil)
    (nil))

    the memory reference is marked unchanging.  In a constructor, this field
    is not unchanging; it will in fact be assigned once for every base class.
    Once constructed, the value is unchanging, but I didn't think we make any
    attempt to use this knowledge.

And why is this a problem?  See below.

    I might guess that this should be conditional on
    lang_hooks.honor_read_only, but I have no idea what that hook really
    does.  I merely base this guess on the fact that that flag is only
    true for Ada.

No, that has to do with whether an INDIRECT_REF is to be considered readonly
because the result type is.

The issue here is very different and not something that was changed recently.

Jeff Law, as I recall, ran into this a while ago.  The problem is that if you
have something that has both unchanging and non-unchanging fields and you
store into the whole thing without /u, the unchanging parts won't be
invalidated.

His conclusion then, with which I agree, is that the *safe* direction is no
/u on a read and /u on a store.  So the idea was to be conservative in a
store case and force /u if any part of it would be read that way.  How can it
be an error to have an "extra" /u on a store: all it will do is invalidate
things it shouldn't?



More information about the Gcc-patches mailing list