I\'m debugging a rather weird stack overflow supposedly caused by allocating too large variables on stack and I\'d like to clarify the following.
Suppose I have the
I checked on LLVM:
void doSomething(char*,char*);
void function(bool b)
{
char b1[1 * 1024];
if( b ) {
char b2[1 * 1024];
doSomething(b1, b2);
} else {
char b3[512 * 1024];
doSomething(b1, b3);
}
}
Yields:
; ModuleID = '/tmp/webcompile/_28066_0.bc'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"
define void @_Z8functionb(i1 zeroext %b) {
entry:
%b1 = alloca [1024 x i8], align 1 ; <[1024 x i8]*> [#uses=1]
%b2 = alloca [1024 x i8], align 1 ; <[1024 x i8]*> [#uses=1]
%b3 = alloca [524288 x i8], align 1 ; <[524288 x i8]*> [#uses=1]
%arraydecay = getelementptr inbounds [1024 x i8]* %b1, i64 0, i64 0 ; [#uses=2]
br i1 %b, label %if.then, label %if.else
if.then: ; preds = %entry
%arraydecay2 = getelementptr inbounds [1024 x i8]* %b2, i64 0, i64 0 ; [#uses=1]
call void @_Z11doSomethingPcS_(i8* %arraydecay, i8* %arraydecay2)
ret void
if.else: ; preds = %entry
%arraydecay6 = getelementptr inbounds [524288 x i8]* %b3, i64 0, i64 0 ; [#uses=1]
call void @_Z11doSomethingPcS_(i8* %arraydecay, i8* %arraydecay6)
ret void
}
declare void @_Z11doSomethingPcS_(i8*, i8*)
You can see the 3 alloca
at the top of the function.
I must admit I am slightly disappointed that b2
and b3
are not folded together in the IR, since only one of them will ever be used.