[llvm-dev] why is llvm.stacksave() necessary?

alex via llvm-dev llvm-dev at lists.llvm.org
Tue Jul 25 04:17:48 PDT 2017


> Clang does this because clang intentionally generates IR naïvely and relies on LLVM optimisation passes to clean it up.
> 
> In the case of C VLAs, the size of the alloca changes whenever the declaration goes into scope.  By emitting a stack save and restore for d, clang doesn’t need to have different IR generating code for your example and for this one:
> 
> void myfunc(void
> {
> 	for (int i=0 ; i<4; i++)
> 	{
> 		double d[i];
> 		doSomethingWith(d);
> 	}
> }
> 
> In this case, each time that the loop is entered you will get a new d with a different size.  Clang emits code that handles this case, and an early optimisation pass will remove the stack save and stack restore intrinsics if they’re not actually needed.
> 
> David

Hi David,
good example, thank you.
This means than, when generating VLA's, one would need to check for the
'minimal' part which needs to be enclosed by safe/remove (in this
example the related calls need to enclose the inner part of the loop).

what would happen if stack safe/remove would be neglected?
at the end of the function everything should get cleaned-up - right?;
the only problem could be that one consumes much more stack than
necessary - not?

Thx
Alex






More information about the llvm-dev mailing list