  With the recent success of embeddings in natural language processing,
research has been conducted into applying similar methods to code analysis.
Most works attempt to process the code directly or use a syntactic tree
representation, treating it like sentences written in a natural language.
However, none of the existing methods are sufficient to comprehend program
semantics robustly, due to structural features such as function calls,
branching, and interchangeable order of statements. In this paper, we propose a
novel processing technique to learn code semantics, and apply it to a variety
of program analysis tasks. In particular, we stipulate that a robust
distributional hypothesis of code applies to both human- and machine-generated
programs. Following this hypothesis, we define an embedding space, inst2vec,
based on an Intermediate Representation (IR) of the code that is independent of
the source programming language. We provide a novel definition of contextual
flow for this IR, leveraging both the underlying data- and control-flow of the
program. We then analyze the embeddings qualitatively using analogies and
clustering, and evaluate the learned representation on three different
high-level tasks. We show that even without fine-tuning, a single RNN
architecture and fixed inst2vec embeddings outperform specialized approaches
for performance prediction (compute device mapping, optimal thread coarsening);
and algorithm classification from raw code (104 classes), where we set a new
state-of-the-art.
