Avoiding jump (branch) instructions in a LLVM JavaScript backend

Hello llvm-dev,

I’ve been hacking on a JavaScript backend to LLVM, starting with the CBackend as base.

Sadly, JavaScript does not support a “goto” style of jump instruction, making it “tricky” to code generate a jump instruction.

What might you recommend for avoiding jump instructions? Is there a transformation for something like this or any other ideas? The only solution I see at the moment is to write a small VM execution loop in JavaScript, but I was hoping that there might be other solutions.

Thanks!
Charles

What about splitting each block into a javascript function and calling
it with setTimeout( function() {...}, 0)? Or, similarly, having a
while (1) { continuation(); } loop, where goto becomes continuation =
function() {...};.

Charles Ying wrote:

Hello llvm-dev,

I've been hacking on a JavaScript backend to LLVM, starting with the CBackend as base.

Sadly, JavaScript does not support a "goto" style of jump instruction, making it "tricky" to code generate a jump instruction.

One possible solution for code that is well structured is to map the branching behavior back into higher level constructs.

For example, the LoopInfo pass can identify loops; you can probably translate those into JavaScript loops. You might be able to write a similar analysis pass that finds if/then/else constructs.

Of course, this won't work in the general case (since LLVM bitcode can express arbitrary, unstructured branching behavior), but it might offer better code generation for programs that were written using structured programming constructs.

-- John T.

Hi,

Some time ago a friend of mine made a conversion script from AGI (an early virtual machine) to Javascript, including rudimentary goto support. He says it’s not the best code in the world but you can take a look around: http://web.ist.utl.pt/~antonio.afonso/agi/logic.phps. There’s an AGI emulator that plays Leisure Suite Larry a directory above :wink:

You could also convert the LLVM’s IR (SSA) to CPS and then you could just directly emit the javascript code :stuck_out_tongue:

Regards,

F