On Wed, 28 Jun 2006 11:53:56 -0500 (CDT) Chris Lattner <sabre at nondot.org> wrote:> On Wed, 28 Jun 2006, Simon Burton wrote: > > Is it possible to take the address > > of a basic block ? > > Nope. > > > I'd like to put a whole bunch of these > > addresses into an array, and then select > > one to branch to. Eg. like a switch statement. > > (i'm thinking also of GCC's computed goto's) > > llvm-gcc supports gcc's computed goto's. You can see what code it > generates.Yes: a bunch of switch statements.> > > I'm finding the code generated by an llvm switch > > is a big bunch of compares and jump instructions, > > which i'm not sure is the most efficent way of > > doing this. > > LLVM does support switch table emission, but only in certain modes. I > think it's only supported in non-pic codegen mode. Patches to improve > this would be welcome :)I am not sure what "non-pic codegen mode" is. PIC is relocatable code ? ie. object files ? So if i'm using the JIT then it will generate a switch table ? How can i test this, since i've been examining the native assembly output (is this 'pic' mode?) of llc. I guess I can compare the speed of a big switch construct with a nest of branch statements and see if it's any faster. Simon.> > -Chris > > -- > http://nondot.org/sabre/ > http://llvm.org/ > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
Hi Simon,> So if i'm using the JIT then it will generate a switch table ? How > can i test this, since i've been examining the native assembly output > (is this 'pic' mode?) of llc.Presumably the JIT means you end up with a `function pointer' that you call to execute the just built code? Can't you just save a lump of memory starting at that address to a file and then run objdump(1) on it to see what native instructions were generated? objdump's -i option will show you the available file formats, one's normally `binary' or something similar. Cheers, Ralph.
On Thu, 29 Jun 2006 10:36:23 +0100 Ralph Corderoy <ralph at inputplus.co.uk> wrote:> > Hi Simon, > > > So if i'm using the JIT then it will generate a switch table ? How > > can i test this, since i've been examining the native assembly output > > (is this 'pic' mode?) of llc. > > Presumably the JIT means you end up with a `function pointer' that you > call to execute the just built code? Can't you just save a lump of > memory starting at that address to a file and then run objdump(1) on it > to see what native instructions were generated? > > objdump's -i option will show you the available file formats, one's > normally `binary' or something similar.I've had a look at this, and it's not yielding any results so far. Surely objdump expects an elf header, symbol table, etc. ? Simon.
On Thu, 29 Jun 2006, Simon Burton wrote:>> LLVM does support switch table emission, but only in certain modes. I >> think it's only supported in non-pic codegen mode. Patches to improve >> this would be welcome :) > > I am not sure what "non-pic codegen mode" is. > PIC is relocatable code ? ie. object files ? > So if i'm using the JIT then it will generate a switch table ? > How can i test this, since > i've been examining the native assembly output (is this 'pic' mode?) of llc. > > I guess I can compare the speed of a big switch construct with > a nest of branch statements and see if it's any faster.Are you using LLVM 1.7 or CVS? LLVM 1.7 never uses jump tables. PIC = Position Independent Code. You can see internal representation of the code generated by passing -print-machineinstrs to the JIT, e.g.: lli -print-machineinstrs program.bc <args> You can control whether PIC is generated or not with LLC by using the "llc -relocation-model=xyz" option. Currently switches get lowered when not in PIC mode, and if the target supports it. The x86 and PPC targets support jump tables currently. Also, only certain switches are lowered to jump tables: the table must have high enough density for it to be worthwhile, etc. If you're not getting a jump table and you think you should be, file a bug and include the args passed to llc you are using. -Chris -- http://nondot.org/sabre/ http://llvm.org/
On Thu, 29 Jun 2006 11:55:22 -0500 (CDT) Chris Lattner <sabre at nondot.org> wrote:> Are you using LLVM 1.7 or CVS? LLVM 1.7 never uses jump tables. >OK, switching to CVS fixes this. The code runs much faster now. (and it looks like there are big tables in the assembly output) Simon.