  For many decades, advances in static verification have focused on linear
integer arithmetic (LIA) programs. Many real-world programs are, however,
written with non-linear integer arithmetic (NLA) expressions, such as programs
that model physical events, control systems, or nonlinear activation functions
in neural networks. While there are some approaches to reasoning about such NLA
programs, still many verification tools fall short when trying to analyze them.
  To expand the scope of existing tools, we introduce a new method of
converting programs with NLA expressions into semantically equivalent LIA
programs via a technique we call dual rewriting. Dual rewriting discovers a
linear replacement for an NLA Boolean expression (e.g. as found in conditional
branching), simultaneously exploring both the positive and negative side of the
condition, and using a combination of static validation and dynamic
generalization of counterexamples. While perhaps surprising at first, this is
often possible because the truth value of a Boolean NLA expression can be
characterized in terms of a Boolean combination of linearly-described
regions/intervals where the expression is true and those where it is false.
  The upshot is that rewriting NLA expressions to LIA expressions beforehand
enables off-the-shelf LIA tools to be applied to the wider class of NLA
programs. We built a new tool DrNLA and show it can discover LIA replacements
for a variety of NLA programs. We then applied our work to branching-time
verification of NLA programs, creating the first set of such benchmarks (92 in
total) and showing that DrNLA's rewriting enable tools such as FuncTion and T2
to verify CTL properties of 42 programs that previously could not be verified.
We also show a potential use of DrNLA assisting Frama-C in program slicing, and
report that execution speed is not impacted much by rewriting.
