nir/gcm: Add global value numbering support
authorJason Ekstrand <jason.ekstrand@intel.com>
Wed, 10 Aug 2016 21:34:49 +0000 (14:34 -0700)
committerJason Ekstrand <jason.ekstrand@intel.com>
Fri, 9 Sep 2016 03:53:01 +0000 (20:53 -0700)
commit88a2a2e05302179c59e257533ed77d2d0a6a5021
tree7b552b25b277a2ee80e2aafdbd34477946610b96
parent99ff4b3eb21ccc5df670e4dc62073cee96d07f23
nir/gcm: Add global value numbering support

Unlike the current CSE pass, global value numbering is capable of detecting
common values even if one does not dominate the other.  For instance, in
you have

if (...) {
   ssa_1 = ssa_0 + 7;
   /* use ssa_1 */
} else {
   ssa_2 = ssa_0 + 7;
   /* use ssa_2 */
}

Global value numbering doesn't care about dominance relationships so it
figures out that ssa_1 and ssa_2 are the same and converts this to

if (...) {
   ssa_1 = ssa_0 + 7;
   /* use ssa_1 */
} else {
   /* use ssa_1 */
}

Obviously, we just broke SSA form which is bad.  Global code motion,
however, will repair this for us by turning this into

ssa_1 = ssa_0 + 7;
if (...) {
   /* use ssa_1 */
} else {
   /* use ssa_1 */
}

This intended to eventually mostly replace CSE.  However, conventional CSE
may still be useful because it's less of a scorched-earth approach and
doesn't require GCM.  This makes it a bit more appropriate for use as a
clean-up in a late optimization run.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/compiler/nir/nir.h
src/compiler/nir/nir_opt_gcm.c