g++.old-deja/g++.mike/p7325.C - suspected bogus test case

Mark Mitchell mark@codesourcery.com
Sat Jun 26 19:49:00 GMT 2004


Zack Weinberg wrote:

>Mark Mitchell <mark@codesourcery.com> writes:
>
>  
>
>>>Let me reiterate that: it does not test anything meaningful.  It
>>>currently passes or fails depending on details of the platform ABI.
>>>Worse, the compiler is within its rights to extend the lifetimes of
>>>the temporaries because it notices that their addresses have been
>>>taken.  In fact, I expect Ken Zadeck's better alias analysis will
>>>have that effect.
>>>
>>>      
>>>
>>Why do you expect that?  Independently of whether or not their
>>addresses have been taken, the language says these temporaries go away
>>at a particular point.  If the compiler extends their lifetimes
>>unnecessarily because it thinks that pointers to them might survive,
>>that's an unnecessary pessimization -- unless it has some other good
>>reason for doing that.
>>    
>>
>
>It seemed a plausible consequence of the interprocedural escape
>analysis that he was describing.  Sure, the language says these
>temporaries go away at a particular point, but the data-flow analysis
>says their addresses are preserved, so the conservative optimization
>decision is not to recycle the storage.  We might choose to do it
>anyway, of course ... which I think only supports my point that this
>isn't an effective test for stack slot reuse.
>  
>
The point I was trying to make is that the alias analysis code should be 
taught about object lifetimes, if it has the behavior you describe.  In 
other words, if we already did the optimization the test is (trying to) 
test for, then introducing the optimization behavior you describe would 
be a regression.  I think my reaction to your insight is "we should make 
sure the optimizer guys know about this issue so they get this right" 
rather than "we should expect this test to fail when the optimizer gets 
smarter."

>>I agree that this an ugly mechanism for testing for this optimization,
>>and that some kind of stack-frame dumping might be better.  On the
>>other hand, we don't have a way of doing that at present.   And this
>>test does test for an optimization that we want to do, in general.
>>    
>>
>
>I don't see it as an effective test for that optimization.  At all.
>(I do agree that this is an optimization we want to do and currently
>don't.)
>
I agree that if it does nottest for the optimization, then we should 
remove it.

The code in "f" is checking that the return value from "foo" uses the 
same address both times.  The code in "g" is checking that the two 
temporaries constructed by calling "A()" have the same address both 
times.  Since nothing else is going on in those functions, that seems 
like a good thing to hope for; if it's not true, the stack frame is 
probably bigger than we want it to be.

I can certainly think of situations where the compiler could fail this 
test with optimization enabled even though it generally implemented the 
optimization.  For example, it might use two different slots for the 
temporaries; perhaps it can interleave instructions from one constructor 
with another without fear of aliasing, that way.  And, without 
optimization turned on, the compiler might not, well, optimize, 
therefore putting the temporaries in different spots just because that 
was simpler in some way.

So, I agree -- the compiler could reasonably fail this test either with 
optimization enabled or disabled, on plausible architectures.  
Therefore, it's OK to remove this test for 3.4.1 and on the mainline.

(By the way, given this analysis, your stack-frame dumping switch 
wouldn't help; the problem is that we don't really have a good method 
for saying when the compiler must reuse stack slots and when it must 
not.  Probably best to measure the total stack usage of some 
representative program(s) -- of which this might be one.)

-- 
Mark Mitchell
CodeSourcery, LLC
(916) 791-8304
mark@codesourcery.com



More information about the Gcc mailing list