[PATCH] D54237: Constant folding and instcombine for saturating adds

Nikita Popov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Sun Nov 11 02:20:23 PST 2018


nikic added a comment.

> Is it perhaps "better" to fold `sadd_sat(X, undef) -> 0` And `uadd_sat(X, undef) -> MaxValue` if we want to get rid of undef here? That way we get rid of the X operand as well.

Folding `sadd_sat(X, undef) -> 0` would not be valid, because if `X = SignedMinValue`, there is no choice of `undef` for which the result would be zero. The largest value that can be reached is `-1`.

I think this is a list of the possibilities that we have:

For signed add I think there is only one choice:

  sadd_sat(X, undef) -> X   // for undef = 0
  sadd_sat(undef, X) -> X   // for undef = 0

For signed sub we have two variants:

  ssub_sat(X, undef) -> X   // for undef = 0
  ssub_sat(undef, X)        // don't simplify
  // or
  ssub_sat(X, undef) -> 0   // for undef = X
  ssub_sat(undef, X) -> 0   // for undef = X

For unsigned add we also have two:

  uadd_sat(X, undef) -> X   // for undef = 0
  uadd_sat(undef, X) -> X   // for undef = 0
  // or
  uadd_sat(X, undef) -> MAX // for undef = MAX
  uadd_sat(undef, X) -> MAX // for undef = MAX

For unsigned sub also two:

  usub_sat(X, undef) -> X   // for undef = 0
  usub_sat(undef, X)        // don't simplify
  // or
  usub_sat(X, undef) -> 0   // for undef = X
  usub_sat(undef, X) -> 0   // for undef = X

Given these possibilities, I would suggest to use the following folds. They don't result in the maximal number of constant results, but they have consistent results/assumptions for the signed&unsigned cases:

  sadd_sat(X, undef) -> X   // for undef = 0
  sadd_sat(undef, X) -> X   // for undef = 0
  uadd_sat(X, undef) -> X   // for undef = 0
  uadd_sat(undef, X) -> X   // for undef = 0
  ssub_sat(X, undef) -> 0   // for undef = X
  ssub_sat(undef, X) -> 0   // for undef = X
  usub_sat(X, undef) -> 0   // for undef = X
  usub_sat(undef, X) -> 0   // for undef = X


https://reviews.llvm.org/D54237





More information about the llvm-commits mailing list