Handle masked rotate amounts
authorRichard Sandiford <rsandifo@linux.vnet.ibm.com>
Thu, 9 Jan 2014 10:56:42 +0000 (10:56 +0000)
committerRichard Sandiford <rsandifo@linux.vnet.ibm.com>
Thu, 9 Jan 2014 10:56:42 +0000 (10:56 +0000)
commitacb31a245ceef3510f37163e31c0097b0d63cb8f
tree697f6ad55b0ab7c3562eb364d7857e3af5d7e956
parent2984497cc1feb475d8ec97c9924dcc9bd02e0de0
Handle masked rotate amounts

At the moment we expect rotates to have the form:

   (or (shl X, Y), (shr X, Z))

where Y == bitsize(X) - Z or Z == bitsize(X) - Y.  This form means that
the (or ...) is undefined for Y == 0 or Z == 0.  This undefinedness can
be avoided by using Y == (C * bitsize(X) - Z) & (bitsize(X) - 1) or
Z == (C * bitsize(X) - Y) & (bitsize(X) - 1) for any integer C
(including 0, the most natural choice).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198861 91177308-0d34-0410-b5e6-96231b3b80d8
lib/CodeGen/SelectionDAG/DAGCombiner.cpp
test/CodeGen/SystemZ/shift-04.ll