[LegalizeTypes][RISCV] Add a special case to ExpandIntRes_UADDSUBO for (uaddo X, 1).
authorCraig Topper <craig.topper@sifive.com>
Thu, 23 Feb 2023 17:16:54 +0000 (09:16 -0800)
committerCraig Topper <craig.topper@sifive.com>
Thu, 23 Feb 2023 17:16:54 +0000 (09:16 -0800)
commit2fc5a5117c613b580be321187555976e4e60872e
treed932d6b7fcc8ff209a7c42a0f427fa9688b9c80c
parente028c9742897cc14c47c426893fb40f571f6fad6
[LegalizeTypes][RISCV] Add a special case to ExpandIntRes_UADDSUBO for (uaddo X, 1).

On targets that lack ADDCARRY support we split a wide uaddo into
an ADD and a SETCC that both need to be split.

For (uaddo X, 1) we can observe that when the add overflows the result
will be 0. We can emit (seteq (or Lo, Hi), 0) to detect this.

This improves D142071.

There is an alternative here. We could use either ~(lo(X) & hi(X)) == 0 or
(lo(X) & hi(X)) == -1 before the addition. That would be closer to the
code before D142071.

Reviewed By: liaolucy

Differential Revision: https://reviews.llvm.org/D144614
llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
llvm/test/CodeGen/RISCV/overflow-intrinsics.ll
llvm/test/CodeGen/RISCV/xaluo.ll