[ConstantFolding] Fold undef for integer intrinsics
authorNikita Popov <nikita.ppv@gmail.com>
Fri, 11 Jan 2019 21:18:00 +0000 (21:18 +0000)
committerNikita Popov <nikita.ppv@gmail.com>
Fri, 11 Jan 2019 21:18:00 +0000 (21:18 +0000)
commit9f6e9cf71bee19c65817965c4334b6fa5ea9d50f
tree2a81a4ec7b71a92f8297f355f323dc91a250fc73
parentc3399db63d159fe28ce4d5e23c3dd9e305ad8523
[ConstantFolding] Fold undef for integer intrinsics

This fixes https://bugs.llvm.org/show_bug.cgi?id=40110.

This implements handling of undef operands for integer intrinsics in
ConstantFolding, in particular for the bitcounting intrinsics (ctpop,
cttz, ctlz), the with.overflow intrinsics, the saturating math
intrinsics and the funnel shift intrinsics.

The undef behavior follows what InstSimplify does for the general cas
e of non-constant operands. For the bitcount intrinsics (where
InstSimplify doesn't do undef handling -- there cannot be a combination
of an undef + non-constant operand) I'm using a 0 result if the intrinsic
is defined for zero and undef otherwise.

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

llvm-svn: 350971
llvm/lib/Analysis/ConstantFolding.cpp
llvm/test/Analysis/ConstantFolding/bitcount.ll
llvm/test/Analysis/ConstantFolding/funnel-shift.ll
llvm/test/Analysis/ConstantFolding/saturating-add-sub.ll
llvm/test/Transforms/ConstProp/overflow-ops.ll
llvm/test/Transforms/InstCombine/saturating-add-sub-vector.ll [deleted file]