Hi There , Again ,I'm newbie to LLVM and please pardon me ..if you guys feel that ,the below question is very basic :) Here i go ,compiled the below sample with clang i.e *clang enum.c -S -emit-llvm* and there respective file are $ cat enum.c int main() { enum type{one=1,two,three} s; s = one; return s; } $ cat enum.s ; ModuleID = 'enum.c' target datalayout "e-p:32:32:32-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-f80:32:32-n8:16:32-S32" target triple = "i386-pc-cygwin" define i32 @main() nounwind { %1 = alloca i32, align 4 %s = alloca i32, align 4 store i32 0, i32* %1 store i32 1, i32* %s, align 4 %2 = load i32* %s, align 4 ret i32 %2 } *Question :* Why there is extra 4 bytes on stack i.e *"%1 = alloca i32, align 4"* ??? Thanks Umesh -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120202/3906bed1/attachment.html>
On Thu, Feb 2, 2012 at 12:25 PM, Umesh Kalappa <umesh.kalappa0 at gmail.com> wrote:> Hi There , > > Again ,I'm newbie to LLVM and please pardon me ..if you guys feel that > ,the below question is very basic :) > > Here i go ,compiled the below sample with clang i.e clang enum.c -S > -emit-llvm and there respective file are > > $ cat enum.c > int main() > { > enum type{one=1,two,three} s; > s = one; > return s; > } > > $ cat enum.s > ; ModuleID = 'enum.c' > target datalayout > "e-p:32:32:32-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-f80:32:32-n8:16:32-S32" > target triple = "i386-pc-cygwin" > > define i32 @main() nounwind { > %1 = alloca i32, align 4 > %s = alloca i32, align 4 > store i32 0, i32* %1 > store i32 1, i32* %s, align 4 > %2 = load i32* %s, align 4 > ret i32 %2 > } > > Question : Why there is extra 4 bytes on stack i.e "%1 = alloca i32, align > 4" ??? > > Thanks > Umesh >For some reason even the simplest "int main() { return 0; }" program allocates those four bytes: ; ModuleID = '/tmp/webcompile/_29079_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-S128" target triple = "x86_64-unknown-linux-gnu" define i32 @main() nounwind uwtable { %1 = alloca i32, align 4 store i32 0, i32* %1 ret i32 0 }
Hi, The extra bytes are there because you didn't compile with any optimisation. Clang defaults to -O0, so give it -O1 or -O2 to remove those dead stack slots. Cheers, James -----Original Message----- From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On Behalf Of Alexander Potapenko Sent: 02 February 2012 08:36 To: Umesh Kalappa Cc: llvmdev Subject: Re: [LLVMdev] Why extra 4 bytes on stack ??? On Thu, Feb 2, 2012 at 12:25 PM, Umesh Kalappa <umesh.kalappa0 at gmail.com> wrote:> Hi There , > > Again ,I'm newbie to LLVM and please pardon me ..if you guys feel that > ,the below question is very basic :) > > Here i go ,compiled the below sample with clang i.e clang enum.c -S > -emit-llvm and there respective file are > > $ cat enum.c > int main() > { > enum type{one=1,two,three} s; > s = one; > return s; > } > > $ cat enum.s > ; ModuleID = 'enum.c' > target datalayout >"e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:6 4-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32"> target triple = "i386-pc-cygwin" > > define i32 @main() nounwind { > %1 = alloca i32, align 4 > %s = alloca i32, align 4 > store i32 0, i32* %1 > store i32 1, i32* %s, align 4 > %2 = load i32* %s, align 4 > ret i32 %2 > } > > Question : Why there is extra 4 bytes on stack i.e "%1 = alloca i32,align> 4" ??? > > Thanks > Umesh >For some reason even the simplest "int main() { return 0; }" program allocates those four bytes: ; ModuleID = '/tmp/webcompile/_29079_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:6 4-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" define i32 @main() nounwind uwtable { %1 = alloca i32, align 4 store i32 0, i32* %1 ret i32 0 } _______________________________________________ LLVM Developers mailing list LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Hi Alexander,> For some reason even the simplest "int main() { return 0; }" program > allocates those four bytes: > > ; ModuleID = '/tmp/webcompile/_29079_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-S128" > target triple = "x86_64-unknown-linux-gnu" > > define i32 @main() nounwind uwtable { > %1 = alloca i32, align 4 > store i32 0, i32* %1 > ret i32 0 > }this is a clang oddity (dragonegg doesn't do this). Presumably the clang developers found it convenient to do this. It doesn't matter since the optimizers will zap the useless alloca. Ciao, Duncan.