[LLVMdev] Runtime optimization of C++ code with virtual functions

Maurizio Vitale maurizio.vitale at polymath-solutions.com
Wed Jun 20 16:01:39 PDT 2007


On Jun 19, 2007, at 1:43 AM, Chris Lattner wrote:

> On Sat, 16 Jun 2007, [ISO-8859-1] Stéphane Letz wrote:
>> At runtime after a graph is created, one could imagine optimizing by
>> resolving call to "virtual  Compute" and possibly get a more
>> efficient Compute method for the entire graph, so that we could  
>> write:
>>
>> DSP* graph = new PAR_DSP(new SEQ_DDSP(new CONCRETE_DSP(), new
>> CONCRETE_DSP()), new CONCRETE_DSP());
>>
>> graph->Optimize();
>>
>> graph->Compute(512, in, out); possibly a lot of time.
>>
>> Is there any possible method using LLVM that would help in this case?
>
> LLVM won't help in this case.

Is that so or it means that LLVM wouldn't have a prebuilt solution?
I'm asking because (without having ever looked seriously into LLVM) I  
was
thinking to experiment along these lines:

class Source {
	void send (T data) {
		invoke_jit_magic();
		transport (data);
         }
}

transport() would be a virtual method like the original posting. In  
my  case send() would be
part of the framework, so it is not a problem to add the  
invoke_jit_magic. In other case it might be trickier.

On the first call, invoke_jit_magic gains control, traverse the  
binary converting (a subset of) what it finds
to LLVM IR, until it gets to the concrete target. It may have to do a  
bit of work to understand how parameters
are passed to the transport code (it is a virtual function call and  
might be messy in presence of multiple/virtual inheritance.
After that LLVM jit can be used to replace the original binary  
fragment with something faster.

I agree with the suggestion of using templates when possible. In my  
case it is not doable because transport would be
propietary and the code containing it distributed only as binary.

I understand that the disassemblying portion need to be rewritten. Is  
there anything else that would prevent this
approach from working?
Again, haven't looked into LLVM yet, so I can immagine there might be  
problems in describing physical registers in the
IR and at some point stuff must be exactly where the pre-existing  
code expects it.
I don;t want to take your time, but if you could elaborate a bit it  
might prevent me from going down the wrong path.

Best regards,

		Maurizio





More information about the llvm-dev mailing list