InstCombine: Don't miscompile (x lshr C1) udiv C2
authorDavid Majnemer <david.majnemer@gmail.com>
Mon, 13 Oct 2014 21:48:30 +0000 (21:48 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Mon, 13 Oct 2014 21:48:30 +0000 (21:48 +0000)
commitdfe81adbcebb61d762d5c72771741dee7dcc1c4c
tree107d20eebb184684b21efb4ed00fa8802b526600
parent2061a56b8a1d9773a2cbd91ceb87a1ec40be6c51
InstCombine: Don't miscompile (x lshr C1) udiv C2

We have a transform that changes:
  (x lshr C1) udiv C2
into:
  x udiv (C2 << C1)

However, it is unsafe to do so if C2 << C1 discards any of C2's bits.

This fixes PR21255.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@219634 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/ADT/APInt.h
lib/Support/APInt.cpp
lib/Transforms/InstCombine/InstCombineMulDivRem.cpp
test/Transforms/InstCombine/div.ll