[Codegen] Alter the default promotion for saturating adds and subs
authorDavid Green <david.green@arm.com>
Thu, 10 Oct 2019 16:04:49 +0000 (16:04 +0000)
committerDavid Green <david.green@arm.com>
Thu, 10 Oct 2019 16:04:49 +0000 (16:04 +0000)
commit94d379095a9c1030582a6ab9199d67d6c64a2642
tree575bc8bbc61f72e3320195829972a40a5f48837d
parentdd37a26f6d3e206e964f1d5f6e0098c079093f42
[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

llvm-svn: 374373
17 files changed:
llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
llvm/test/CodeGen/AArch64/sadd_sat.ll
llvm/test/CodeGen/AArch64/sadd_sat_vec.ll
llvm/test/CodeGen/AArch64/ssub_sat.ll
llvm/test/CodeGen/AArch64/ssub_sat_vec.ll
llvm/test/CodeGen/AArch64/uadd_sat.ll
llvm/test/CodeGen/AArch64/uadd_sat_vec.ll
llvm/test/CodeGen/AArch64/usub_sat.ll
llvm/test/CodeGen/AArch64/usub_sat_vec.ll
llvm/test/CodeGen/ARM/sadd_sat.ll
llvm/test/CodeGen/ARM/ssub_sat.ll
llvm/test/CodeGen/ARM/uadd_sat.ll
llvm/test/CodeGen/ARM/usub_sat.ll
llvm/test/CodeGen/X86/sadd_sat.ll
llvm/test/CodeGen/X86/ssub_sat.ll
llvm/test/CodeGen/X86/uadd_sat.ll
llvm/test/CodeGen/X86/usub_sat.ll