[CodeGen] Handle SMULFIXSAT with scale zero in TargetLowering::expandFixedPointMul
authorBjorn Pettersson <bjorn.a.pettersson@ericsson.com>
Sat, 7 Sep 2019 12:16:23 +0000 (12:16 +0000)
committerBjorn Pettersson <bjorn.a.pettersson@ericsson.com>
Sat, 7 Sep 2019 12:16:23 +0000 (12:16 +0000)
commitd065c811649f0d0df5429741a9a3dd643e88a9fe
tree3e99e0e9a83ebaf1d1eed71659a69ffaebedb96d
parent5e331e4ce85ad37dca45739846c2a801f06ab573
[CodeGen] Handle SMULFIXSAT with scale zero in TargetLowering::expandFixedPointMul

Summary:
Normally TargetLowering::expandFixedPointMul would handle
SMULFIXSAT with scale zero by using an SMULO to compute the
product and determine if saturation is needed (if overflow
happened). But if SMULO isn't custom/legal it falls through
and uses the same technique, using MULHS/SMUL_LOHI, as used
for non-zero scales.

Problem was that when checking for overflow (handling saturation)
when not using MULO we did not expect to find a zero scale. So
we ended up in an assertion when doing
  APInt::getLowBitsSet(VTSize, Scale - 1)

This patch fixes the problem by adding a new special case for
how saturation is computed when scale is zero.

Reviewers: RKSimon, bevinh, leonardchan, spatel

Reviewed By: RKSimon

Subscribers: wuzish, nemanjai, hiraditya, MaskRay, jsji, llvm-commits

Tags: #llvm

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

llvm-svn: 371309
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
llvm/test/CodeGen/PowerPC/smulfixsat.ll [new file with mode: 0644]