Thanks for the answer I am trying to test the PA with a program very similar to the one used as an example in the paper located here: http://llvm.cs.uiuc.edu/pubs/2003-04-29-DataStructureAnalysisTR.html The program is as follows: =========================struct list { struct list *Next; }; struct list *makeList (int Num) { struct list *New = malloc ( sizeof ( struct list ) ); New->Next = Num ? makeList (Num-1) : 0; return New; } int main() { struct list *X = makeList(10); } ========================= After applying the PA to it, the output is something like this: =========================int main(void) { signed char *ltmp_2_5; struct l_struct_2E_list *l6_tmp_2E_7_2E_i2; #if defined(__GNUC__) && !defined(__llvm__) #if defined(i386) || defined(__i386__) || defined(__i386) {short FPCW;__asm__ ("fnstcw %0" : "=m" (*&FPCW)); FPCW=(FPCW&~0x300)|0x200;__asm__("fldcw %0" :: "m" (*&FPCW));} #endif #endif poolinit((&l2_GlobalPool), 4u, 4u); ltmp_2_5 = malloc(4u); l6_tmp_2E_7_2E_i2 = l1_makeList((&l2_GlobalPool), 8); *(&((struct l_struct_2E_list *)ltmp_2_5)->field0) = l6_tmp_2E_7_2E_i2; return ((int )/*UNDEF*/0); } ========================= My question is: why is this malloc necessary? ltmp_2_5 = malloc(4u); Shouldn't be the result a program with this malloc replaced by poolalloc? Should I include a special flag to achieve this? I am using this line: opt -load ~/llvm/install/lib/libpoolalloc.so -poolalloc and also with -pooloptimize Thanks in advance --- Chris Lattner <sabre at nondot.org> wrote:> On Sat, 2 Apr 2005, Ricardo wrote: > > Hello, > > I am trying to run a program optimized with the Pool Allocation, but I am receiving this > error: > > > > ===================> > > > *** 4 DYNAMIC POOLS INITIALIZED *** > > > > *** 4 DYNAMIC POOLS ALLOCATED FROM *** > > > > MaxHeapSize = 0.062500KB HeapSizeAtExit = 0.062500KB NOTE: only valid if using > > Heuristic=AllPools and no bumpptr/realloc! > > ===================> > This output is what happens when you link with the debug version of the > runtime library. If you rebuild the FL2Allocator with 'make > ENABLE_OPTIMIZED=1' and link with the result, you shouldn't get this. > > > I have tried to link the program with the Analysis and with Datastructure libs: > > llvm-gcc -o test test.opt.bc -lpoolalloc -lpoolalloc_rt -lLLVMDataStructure -lLLVMAnalysis > > But I am still receiving the error. > > You should only need -lpoolalloc_rt. > > For the record, I usually do (effectively) this to test the pool > allocator: > > llvm-gcc *.c -o program # compile&link whole prog with LLVM > opt -load ... -poolalloc program.bc ... -o program.pa.bc > llc program.pa.bc -march=c -o program.pa.cbe.c > gcc -fno-strict-aliasing -O2 program.pa.cbe.c -o program.pa > -L~/llvm/projects/llvm-poolalloc/Release/lib/ -lpoolalloc_rt > > Alternatively, if you want a quick test, you can do the first two steps, > then: > > lli -load ~/llvm/projects/llvm-poolalloc/Release/lib/libpoolalloc_rt.so program.pa.bc > > If you're on a target that supports the JIT. > > > Another question, I do not want to use the bump ptr optimization, and I suppose that the right > > heuristic for that is AllNodes? But if I want to use it, what is the right heuristic? > > The AllNodes heuristic is the only one that is substantially tested. I > would recommend it, none of the others have any significant performance > benefit anyway. > > The bump pointer and other opts are a seperate option -pooloptimize, which > can be run after -poolalloc. It does not work with -pointercompress > though. > > > Also, if I want to use the Pointer Compression, I suppose that I have to > > use the -pointercompress switch with opt or what? > > Yes, if you use it, don't specify -poolalloc manually. > > -Chris > > -- > http://nondot.org/sabre/ > http://llvm.cs.uiuc.edu/ >
On Sat, 2 Apr 2005, Ricardo wrote:> After applying the PA to it, the output is something like this:...> My question is: why is this malloc necessary? > ltmp_2_5 = malloc(4u);> Shouldn't be the result a program with this malloc replaced by poolalloc? > Should I include a special flag to achieve this?Ah, sorry, my memory was wrong. The default is to perform the "SelectivePA" optimization. Since pool allocation detected that there is no point in putting a single allocation into a pool, it left it a malloc. If you really want it to be a in a pool, pass -poolalloc-heuristic=AllNodes to opt. Sorry for the confusion! -Chris> I am using this line: > opt -load ~/llvm/install/lib/libpoolalloc.so -poolalloc > and also with -pooloptimize > > Thanks in advance > > > > > --- Chris Lattner <sabre at nondot.org> wrote: > >> On Sat, 2 Apr 2005, Ricardo wrote: >>> Hello, >>> I am trying to run a program optimized with the Pool Allocation, but I am receiving this >> error: >>> >>> ===================>>> >>> *** 4 DYNAMIC POOLS INITIALIZED *** >>> >>> *** 4 DYNAMIC POOLS ALLOCATED FROM *** >>> >>> MaxHeapSize = 0.062500KB HeapSizeAtExit = 0.062500KB NOTE: only valid if using >>> Heuristic=AllPools and no bumpptr/realloc! >>> ===================>> >> This output is what happens when you link with the debug version of the >> runtime library. If you rebuild the FL2Allocator with 'make >> ENABLE_OPTIMIZED=1' and link with the result, you shouldn't get this. >> >>> I have tried to link the program with the Analysis and with Datastructure libs: >>> llvm-gcc -o test test.opt.bc -lpoolalloc -lpoolalloc_rt -lLLVMDataStructure -lLLVMAnalysis >>> But I am still receiving the error. >> >> You should only need -lpoolalloc_rt. >> >> For the record, I usually do (effectively) this to test the pool >> allocator: >> >> llvm-gcc *.c -o program # compile&link whole prog with LLVM >> opt -load ... -poolalloc program.bc ... -o program.pa.bc >> llc program.pa.bc -march=c -o program.pa.cbe.c >> gcc -fno-strict-aliasing -O2 program.pa.cbe.c -o program.pa >> -L~/llvm/projects/llvm-poolalloc/Release/lib/ -lpoolalloc_rt >> >> Alternatively, if you want a quick test, you can do the first two steps, >> then: >> >> lli -load ~/llvm/projects/llvm-poolalloc/Release/lib/libpoolalloc_rt.so program.pa.bc >> >> If you're on a target that supports the JIT. >> >>> Another question, I do not want to use the bump ptr optimization, and I suppose that the right >>> heuristic for that is AllNodes? But if I want to use it, what is the right heuristic? >> >> The AllNodes heuristic is the only one that is substantially tested. I >> would recommend it, none of the others have any significant performance >> benefit anyway. >> >> The bump pointer and other opts are a seperate option -pooloptimize, which >> can be run after -poolalloc. It does not work with -pointercompress >> though. >> >>> Also, if I want to use the Pointer Compression, I suppose that I have to >>> use the -pointercompress switch with opt or what? >> >> Yes, if you use it, don't specify -poolalloc manually. >> >> -Chris >> >> -- >> http://nondot.org/sabre/ >> http://llvm.cs.uiuc.edu/ >> > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://mail.cs.uiuc.edu/mailman/listinfo/llvmdev >-Chris -- http://nondot.org/sabre/ http://llvm.cs.uiuc.edu/
Thanks Chris! That was causing me some confusion. Now it's producing a more meaningful output: poolinit((&l2_GlobalPool), 4u, 4u); poolinit((&l2_GlobalPool1), 4u, 4u); l5_tmp_2E_0_2E_i = poolalloc((&l2_GlobalPool), 4u); l6_tmp_2E_7_2E_i2 = l1_makeList((&l2_GlobalPool1), 0); *(&((struct l_struct_2E_list *)l5_tmp_2E_0_2E_i)->field0) = l6_tmp_2E_7_2E_i2; However, if I am understanding correctly, the first node is being allocated in one pool (that was malloc with the other heuristic) and the rest are being allocated in a differente pool. But why? Why not all the nodes are being allocated in one pool? Also, in your other response you said:>> The AllNodes heuristic is the only one that is substantially tested. I >> would recommend it, none of the others have any significant performance >> benefit anyway.Is that still right or you meant that only SelectivePA is the only substantially tested? --Ricardo P.S. BTW, SelectivePA does not appear as an option when you do opt -load ~/llvmdbg/installed/lib/libpoolalloc.so --help and I could not find any reference in the source code (Heuristic.{h,cpp}) May I assume that is a new heuristic or you are referring to one of the current ones? -poolalloc-heuristic - Heuristic to choose which nodes to pool allocate =AllNodes - Pool allocate all nodes =AllButUnreachableFromMemory - Pool allocate all reachable from memory objects =CyclicNodes - Pool allocate nodes with cycles =SmartCoallesceNodes - Use the smart node merging heuristic =AllInOneGlobalPool - Use pool library as replacement for malloc/free =OnlyOverhead - Do not pool allocate anything, but induce all overhead from it =NoNodes - Do not pool allocate anything --- Chris Lattner <sabre at nondot.org> wrote:> On Sat, 2 Apr 2005, Ricardo wrote: > > After applying the PA to it, the output is something like this: > ... > > > My question is: why is this malloc necessary? > > ltmp_2_5 = malloc(4u); > > > Shouldn't be the result a program with this malloc replaced by poolalloc? > > Should I include a special flag to achieve this? > > Ah, sorry, my memory was wrong. The default is to perform the > "SelectivePA" optimization. Since pool allocation detected that there is > no point in putting a single allocation into a pool, it left it a malloc. > If you really want it to be a in a pool, pass > -poolalloc-heuristic=AllNodes to opt. > > Sorry for the confusion! > > -Chris > > > I am using this line: > > opt -load ~/llvm/install/lib/libpoolalloc.so -poolalloc > > and also with -pooloptimize > > > > Thanks in advance > > > > > > > > > > --- Chris Lattner <sabre at nondot.org> wrote: > > > >> On Sat, 2 Apr 2005, Ricardo wrote: > >>> Hello, > >>> I am trying to run a program optimized with the Pool Allocation, but I am receiving this > >> error: > >>> > >>> ===================> >>> > >>> *** 4 DYNAMIC POOLS INITIALIZED *** > >>> > >>> *** 4 DYNAMIC POOLS ALLOCATED FROM *** > >>> > >>> MaxHeapSize = 0.062500KB HeapSizeAtExit = 0.062500KB NOTE: only valid if using > >>> Heuristic=AllPools and no bumpptr/realloc! > >>> ===================> >> > >> This output is what happens when you link with the debug version of the > >> runtime library. If you rebuild the FL2Allocator with 'make > >> ENABLE_OPTIMIZED=1' and link with the result, you shouldn't get this. > >> > >>> I have tried to link the program with the Analysis and with Datastructure libs: > >>> llvm-gcc -o test test.opt.bc -lpoolalloc -lpoolalloc_rt -lLLVMDataStructure -lLLVMAnalysis > >>> But I am still receiving the error. > >> > >> You should only need -lpoolalloc_rt. > >> > >> For the record, I usually do (effectively) this to test the pool > >> allocator: > >> > >> llvm-gcc *.c -o program # compile&link whole prog with LLVM > >> opt -load ... -poolalloc program.bc ... -o program.pa.bc > >> llc program.pa.bc -march=c -o program.pa.cbe.c > >> gcc -fno-strict-aliasing -O2 program.pa.cbe.c -o program.pa > >> -L~/llvm/projects/llvm-poolalloc/Release/lib/ -lpoolalloc_rt > >> > >> Alternatively, if you want a quick test, you can do the first two steps, > >> then: > >> > >> lli -load ~/llvm/projects/llvm-poolalloc/Release/lib/libpoolalloc_rt.so program.pa.bc > >> > >> If you're on a target that supports the JIT. > >> > >>> Another question, I do not want to use the bump ptr optimization, and I suppose that the > right > >>> heuristic for that is AllNodes? But if I want to use it, what is the right heuristic? > >> > >> The AllNodes heuristic is the only one that is substantially tested. I > >> would recommend it, none of the others have any significant performance > >> benefit anyway. > >> > >> The bump pointer and other opts are a seperate option -pooloptimize, which > >> can be run after -poolalloc. It does not work with -pointercompress > >> though. > >> > >>> Also, if I want to use the Pointer Compression, I suppose that I have to > >>> use the -pointercompress switch with opt or what? > >> > >> Yes, if you use it, don't specify -poolalloc manually. > >> > >> -Chris > >> > >> -- > >> http://nondot.org/sabre/ > >> http://llvm.cs.uiuc.edu/ > >> > > > > _______________________________________________ > > LLVM Developers mailing list > > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > > http://mail.cs.uiuc.edu/mailman/listinfo/llvmdev > > > > -Chris > > -- > http://nondot.org/sabre/ > http://llvm.cs.uiuc.edu/ > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://mail.cs.uiuc.edu/mailman/listinfo/llvmdev >__________________________________ Do you Yahoo!? Yahoo! Small Business - Try our new resources site! http://smallbusiness.yahoo.com/resources/