Wolfgang Bangerth wrote:
Mark,
it occurred to me that asking the question you pose may use language that is more unfamiliar than necessary. How about this question instead -- assume


  struct S { int s; };
  struct X {
    int i;
    struct S s;
  };

  void g(struct S*);
  void f() {
    X x;
    g(&x.s);
  }

Would the compiler be allowed to realize that X::i is never referenced and therefore a dead variable? I assume the compiler doesn't do that right now, but it would be straightforward for a scalar replacement algorithm to not even allocate stack space for X::i, but only X::s, and hand the address of the only remaining stack object, of type S, to g().

I agree that this is the same issue, in another guise. My point of view is that this optimization would not be valid, pending clarification of the issues we've been discussing. As soon as any component of "x" is addressed, we must assume that all of "x" is addressed -- unless we can prove otherwise, by, say, looking at the body of "g".


--
Mark Mitchell
CodeSourcery, LLC
[EMAIL PROTECTED]
(916) 791-8304

Reply via email to