This is the mail archive of the
mailing list for the GCC project.
Re: Can shrink-wrapping ever move prologue past an ASM statement?
- From: Segher Boessenkool <segher at kernel dot crashing dot org>
- To: GCC Mailing List <gcc at gcc dot gnu dot org>, Vojtech Pavlik <vojtech at suse dot cz>
- Date: Tue, 7 Jul 2015 13:44:15 -0500
- Subject: Re: Can shrink-wrapping ever move prologue past an ASM statement?
- Authentication-results: sourceware.org; auth=none
- References: <20150707175349 dot GA2325 at virgil dot suse dot cz>
On Tue, Jul 07, 2015 at 07:53:49PM +0200, Martin Jambor wrote:
> I've been asked to look into the item one of
> http://permalink.gmane.org/gmane.linux.kernel/1990397 and found out
> that at least shrink-wrapping happily moves prologue past an asm
> statement which can be bad if the asm statement contains a call
> Am I right concluding that this is a bug? Looking into the manual and
> at requires_stack_frame_p() in shrink-wrap.c, I do not see any obvious
> way of marking the asm statement as requiring the stack frame (but I
> will not mind being proven wrong). Do we want to create one, such as
> only disallowing moving prologue past volatile asm statements? Any
> other ideas?
For architectures like PowerPC where all calls clobber some register,
you can write e.g.
asm("bl func" : : : "lr");
and all is well (better than saving/restoring LR manually, too).
For other archs, e.g. x86-64, you can do
register void *sp asm("%sp");
asm volatile("call func" : "+r"(sp));
and the result seems to be optimal as well.
Some special clobber, maybe "stack" (like "memory", which won't work)
could be nicer? What should the *exact* semantics of that be?