[Codegen] Alter the default promotion for saturating adds and subs
commit7031c3e3f4c7ba8c1b06c2d6e323c63da6a5990e
authorDavid Green <david.green@arm.com>
Thu, 10 Oct 2019 16:04:49 +0000 (10 16:04 +0000)
committerDavid Green <david.green@arm.com>
Thu, 10 Oct 2019 16:04:49 +0000 (10 16:04 +0000)
treea3c3fed03dc4025b1ab43fcb575a07ffd948f84c
parent9c7ae0c0e6a8c188a55a851aaf432fb413aeec6c
[Codegen] Alter the default promotion for saturating adds and subs

The default promotion for the add_sat/sub_sat nodes currently does:
   1. ANY_EXTEND iN to iM
   2. SHL by M-N
   3. [US][ADD|SUB]SAT
   4. L/ASHR by M-N
If the promoted add_sat or sub_sat node is not legal, this can produce code
that effectively does a lot of shifting (and requiring large constants to be
materialised) just to use the overflow flag. It is simpler to just do the
saturation manually, using the higher bitwidth addition and a min/max against
the saturating bounds. That is what this patch attempts to do.

Differential Revision: https://reviews.llvm.org/D68643

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374373 91177308-0d34-0410-b5e6-96231b3b80d8
17 files changed:
lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
test/CodeGen/AArch64/sadd_sat.ll
test/CodeGen/AArch64/sadd_sat_vec.ll
test/CodeGen/AArch64/ssub_sat.ll
test/CodeGen/AArch64/ssub_sat_vec.ll
test/CodeGen/AArch64/uadd_sat.ll
test/CodeGen/AArch64/uadd_sat_vec.ll
test/CodeGen/AArch64/usub_sat.ll
test/CodeGen/AArch64/usub_sat_vec.ll
test/CodeGen/ARM/sadd_sat.ll
test/CodeGen/ARM/ssub_sat.ll
test/CodeGen/ARM/uadd_sat.ll
test/CodeGen/ARM/usub_sat.ll
test/CodeGen/X86/sadd_sat.ll
test/CodeGen/X86/ssub_sat.ll
test/CodeGen/X86/uadd_sat.ll
test/CodeGen/X86/usub_sat.ll