Runtime performance of Value::printAsOperand

Hi all,

I am one of the developers of llvm-datalog, a static analysis tool for LLVM bitcode based on Datalog.

The first phase of our tool is to create some CSV files (for our Datalog schema) while traversing a bitcode file. During that phase, our implementation makes use of the Value::printAsOperand method to print operands from several LLVM bitcode instructions to the CSV file. But this approach doesn’t scale and the problem seems to be the Value::printAsOperand method, based on some profiling that we performed afterwards.

After studying the source code, I think that the problem is the “slow path” of this method, which constructs a TypePrinting object from scratch, every time this path is triggered. As far as I can tell, each time this slow path is taken, it invokes methods (e.g., TypeFinder::run) that perform many Module-wide calculations that are redundant (except for the first time they are performed). This whole process accounts for most of our tool’s execution time.

So, my question is: Is there any faster way to perform the same task? Note that we would like to keep our tool as an LLVM client, rather than relying on any internal API.