[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