nir/search: Don't match inexact expressions with exact subexpressions
authorJason Ekstrand <jason.ekstrand@intel.com>
Mon, 28 Mar 2016 18:12:33 +0000 (11:12 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Mon, 4 Apr 2016 20:48:10 +0000 (13:48 -0700)
commiteb93d6dec82cd02e97b0a673fb11eef1f31777e7
treeb46f8aeef1a41fa8931d591d12f3b9b1f3021eaf
parent65fbc43d54403905e3eaea02372b5a364dc1d773
nir/search: Don't match inexact expressions with exact subexpressions

In the first pass of implementing exact handling, I made a mistake with
search-and-replace.  In particular, we only reallly handled exact/inexact
on the root of the tree.  Instead, we need to check every node in the tree
for an exact/inexact match.  As an example of this, consider the following
GLSL code

precise float a = b + c;
if (a < 0) {
   do_stuff();
}

In that case, only the add will be declared "exact" and an expression that
looks for "b + c < 0" will still match and replace it with "b < -c" which
may yield different results.  The solution is to simply bail if any of the
values are exact when matching an inexact expression.

Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/compiler/nir/nir_search.c