  Fast numerical libraries have been a cornerstone of scientific computing for
decades, but this comes at a price. Programs may be tied to vendor specific
software ecosystems resulting in polluted, non-portable code. As we enter an
era of heterogeneous computing, there is an explosion in the number of
accelerator libraries required to harness specialized hardware. We need a
system that allows developers to exploit ever-changing accelerator libraries,
without over-specializing their code.
  As we cannot know the behavior of future libraries ahead of time, this paper
develops a scheme that assists developers in matching their code to new
libraries, without requiring the source code for these libraries.
  Furthermore, it can recover equivalent code from programs that use existing
libraries and automatically port them to new interfaces. It first uses program
synthesis to determine the meaning of a library, then maps the synthesized
description into generalized constraints which are used to search the program
for replacement opportunities to present to the developer.
  We applied this approach to existing large applications from the scientific
computing and deep learning domains. Using our approach, we show speedups
ranging from 1.1$\times$ to over 10$\times$ on end to end performance when
using accelerator libraries.
