public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "matz at gcc dot gnu dot org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c++/30252] [4.2 regression] miscompilation of sigc++-2.0 based code with -fstrict-aliasing
Date: Tue, 05 Jun 2007 18:25:00 -0000	[thread overview]
Message-ID: <20070605182454.348.qmail@sourceware.org> (raw)
In-Reply-To: <bug-30252-7958@http.gcc.gnu.org/bugzilla/>



------- Comment #37 from matz at gcc dot gnu dot org  2007-06-05 18:24 -------
> We are pointing to cell, and using that to access cell.i

No.  We are pointing to cell.ii, and use that pointer to access cell.ii.i
(via in->i).  Hence of course the points-to set of 'in' needs to include
cell.in.i (or cell.i, as the point-to debug dump likes to call it).  At least
how the points-to solver is used.  Theoretically it would of course be more
sensible to only note that 'in' can point to 'cell.ii', and make the user
of that information recognize that this actually is a structure, and hence
over that pointer you can access all members of it.  But that's not
how the info is used, so we have to include cell.ii.i in the points to set
(which in our case rather is a can-access set).

Now, regarding where to fix it properly: if you say that solution_set_add()
is not the right place (and I don't buy that yet, because something is wrong
with it no matter what, e.g. looking for subfields starting from the things
in the pt set, which themself might be subfields feels wrong), then we must
not use pointer arithmetic (or at least '+' constraints) to represent pointing
to substructures.  And I'm not sure that's easily doable.  Because the insn
we see is not "in = &cell.in", but "in = &o->in", and only the pt solver
itself sees that 'o' points to cell.  So what constraints do you suggest
should be added instead of offseted constraints for this insn?

> You don't want to play in solution_set_add, which is common to a bunch of 
> code.

Well, it's common to exactly the code which handles offsetted constraints.
And I don't see why the problem we face here (with offseted copy constraints)
doesn't also occur with any other of the offseted constraints, e.g.
"*x = y+32", handled in do_ds_constraint.

> > You can never get back to the parent structure from a pointer to the
> > substructure.
> > I asked this explicitly and was told it was undefined behavior.
> 
> Yep, this is what I convinced myself aswell.

Well, it's perhaps illegal in C (I'm not sure about that actually), but
certainly occurs in C++, and even if it didn't occur there we are talking
about the middle-end, for which such invalidity shouldn't matter (except we
choose to define it as invalid).  To see why this is valid, consider this
C++ program:

struct A {int a;};
struct B {int b;};
struct C : public A, B { int c;};
C* b2c (B* b) { return (C*)b; }
C* get_c (void)
{
  static C c;
  B *pb;
  C *pc;
  pb = &c;
  pc = (C*)pb;
  return pc;
}

This is completely valid (suppose b2c is only ever called with pointers
to the B-in-C base of any C), and results in this insn:

  b.2_3 = (struct C *) b_2(D);
  D.2496_4 = b.2_3 - 4;

A better example might be the other function 'get_c', which also has the
subtraction:

  pb_3 = (struct CD.2478 *) &cD.2495.D.2482;
  pc_4 = pb_3 - 4;
  return pc_4;

This currently only works because points-to gives up on subtraction and 
adds INTEGER to the access set of pc_4 (additionally to c.b and c.c; c.a
or c itself are missing).


-- 

matz at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |matz at gcc dot gnu dot org


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30252


  parent reply	other threads:[~2007-06-05 18:25 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-12-18 15:56 [Bug tree-optimization/30252] New: [4.2/4.3 " belyshev at depni dot sinp dot msu dot ru
2006-12-18 15:57 ` [Bug tree-optimization/30252] " belyshev at depni dot sinp dot msu dot ru
2006-12-18 18:24 ` pinskia at gcc dot gnu dot org
2006-12-18 19:04 ` pinskia at gcc dot gnu dot org
2006-12-19 11:11 ` [Bug tree-optimization/30252] [4.2 " belyshev at depni dot sinp dot msu dot ru
2006-12-27 16:18 ` rguenth at gcc dot gnu dot org
2006-12-27 20:19 ` belyshev at depni dot sinp dot msu dot ru
2007-02-19 20:52 ` mmitchel at gcc dot gnu dot org
2007-04-29  7:02 ` pinskia at gcc dot gnu dot org
2007-04-29  8:58 ` belyshev at depni dot sinp dot msu dot ru
2007-04-30  2:25 ` bangerth at dealii dot org
2007-04-30 14:16 ` pluto at agmk dot net
2007-04-30 14:29 ` pluto at agmk dot net
2007-04-30 14:43 ` bangerth at dealii dot org
2007-05-01  1:11 ` giovannibajo at libero dot it
2007-05-01  1:39 ` bangerth at math dot tamu dot edu
2007-05-01  7:59 ` pluto at agmk dot net
2007-05-01 12:35 ` rguenth at gcc dot gnu dot org
2007-05-01 13:01 ` rguenth at gcc dot gnu dot org
2007-05-01 13:05 ` [Bug c++/30252] " rguenth at gcc dot gnu dot org
2007-05-02 20:59 ` mmitchel at gcc dot gnu dot org
2007-05-13  0:43 ` ismail at pardus dot org dot tr
2007-05-13 10:34 ` rguenth at gcc dot gnu dot org
2007-05-13 12:02 ` rguenth at gcc dot gnu dot org
2007-05-14 19:04 ` dberlin at gcc dot gnu dot org
2007-05-14 21:26 ` mmitchel at gcc dot gnu dot org
2007-05-15  7:59 ` rguenth at gcc dot gnu dot org
2007-06-04 15:28 ` rguenth at gcc dot gnu dot org
2007-06-04 15:45 ` rguenth at gcc dot gnu dot org
2007-06-05  9:27 ` rguenth at gcc dot gnu dot org
2007-06-05 12:05 ` rguenth at gcc dot gnu dot org
2007-06-05 15:01 ` rguenth at gcc dot gnu dot org
2007-06-05 15:57 ` rguenth at gcc dot gnu dot org
2007-06-05 16:20 ` dberlin at dberlin dot org
2007-06-05 16:30 ` rguenther at suse dot de
2007-06-05 17:45 ` dberlin at dberlin dot org
2007-06-05 18:25 ` matz at gcc dot gnu dot org [this message]
2007-06-05 19:07 ` dberlin at dberlin dot org
2007-06-05 19:59 ` rguenther at suse dot de
2007-06-05 22:44 ` dberlin at dberlin dot org
2007-06-06  8:50 ` rguenther at suse dot de
2007-06-06 15:52 ` dberlin at dberlin dot org
2007-06-19  9:24 ` rguenth at gcc dot gnu dot org
2007-06-19  9:46 ` rguenth at gcc dot gnu dot org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20070605182454.348.qmail@sourceware.org \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).