Hi all, I have 2 simple questions... First, just for you to know, I'm making a compiler (kinda obvious) and the language definition is mine, so there is no much constraint for me, it's written in Java (it generates a .ll file as output) and it's just for fun by now, maybe a serious project after I learn all the stuff needed... and sorry bad english 1) I want to know if when I do this kind of thing: entry: %x = alloca i32 %y = alloca i32 ... normal instructions... other_block: %z = alloca i32 .... br .... label %other_block the stack "grows" when alloca is "called", or its the same as putting "%z alloca" in the beggining? or... if alloca is in a loop, the stack grows every time it iterates?? 2) does the LLVM optimizes this: ; this code (arg -> var) is very similar to what gcc generates define void @foo(i32 %arg0) { entry: %var0 = alloca i32 store i32 %arg0, i32* var0 ... %x = load i32* %var0 .... ; never more stores to %var0 or pass it to any function } to something like: define void @foo(i32 arg0) { entry: ; no alloca .... %x = %arg0 .... } does it??? I'm asking because I can check in my compiler if some arg is only readed or if its used as a var before generate the IR, an then only create (alloca) a %var if the arg is used for read-write :P (my language is "safe" (no pointers)) If LLVM optimizes it, I'll let it... if not, I'll do this optimization Thanks in advance :P -- Judison judison at gmail.com "A wise man first thinks and then speaks and a fool speaks first and then thinks." Imam Ali (as) -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110314/1906fed8/attachment.html>
On 3/14/11 7:52 PM, Judison wrote:> Hi all, > > I have 2 simple questions... > > First, just for you to know, I'm making a compiler (kinda obvious) and > the language definition is mine, so there is no much constraint for > me, it's written in Java (it generates a .ll file as output) and it's > just for fun by now, maybe a serious project after I learn all the > stuff needed... > > and sorry bad english > > 1) I want to know if when I do this kind of thing: > > entry: > %x = alloca i32 > %y = alloca i32 > ... normal instructions... > other_block: > %z = alloca i32 > .... > br .... label %other_block > > the stack "grows" when alloca is "called", or its the same as putting > "%z = alloca" in the beggining? > or... if alloca is in a loop, the stack grows every time it iterates??Yes, you can have alloca's instead of loops, and they will grow the size of the stack frame each time they are executed dynamically.> > > > 2) does the LLVM optimizes this: > > ; this code (arg -> var) is very similar to what gcc generates > define void @foo(i32 %arg0) { > entry: > %var0 = alloca i32 > store i32 %arg0, i32* var0 > ... > %x = load i32* %var0 > .... > ; never more stores to %var0 or pass it to any function > } > > to something like: > > define void @foo(i32 arg0) { > entry: > ; no alloca > .... > %x = %arg0 > .... > } > > does it???I suspect that mem2reg plus a few additional optimizations will do this for you. -- John T.> > I'm asking because I can check in my compiler if some arg is only > readed or if its used as a var before generate the IR, an then only > create (alloca) a %var if the arg is used for read-write :P (my > language is "safe" (no pointers)) > If LLVM optimizes it, I'll let it... if not, I'll do this optimization > > Thanks in advance :P > > -- > Judison > judison at gmail.com <mailto:judison at gmail.com> > > "A wise man first thinks and then speaks and a fool speaks first and > then thinks." Imam Ali (as)-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20110314/9f8aabda/attachment.html>
On Mar 14, 2011, at 5:56 PM, John Criswell wrote:> On 3/14/11 7:52 PM, Judison wrote: >> >> 2) does the LLVM optimizes this: >> >> ; this code (arg -> var) is very similar to what gcc generates >> define void @foo(i32 %arg0) { >> entry: >> %var0 = alloca i32 >> store i32 %arg0, i32* var0 >> ... >> %x = load i32* %var0 >> .... >> ; never more stores to %var0 or pass it to any function >> } >> >> to something like: >> >> define void @foo(i32 arg0) { >> entry: >> ; no alloca >> .... >> %x = %arg0 >> .... >> } >> >> does it??? > > I suspect that mem2reg plus a few additional optimizations will do this for you.mem2reg is sufficient. There's also no limit on the number of loads and stores you can do without disturbing the optimization; just don't do anything too opaque with the address. John.