OSDN Git Service

[mips][msa] Mask vectors holding shift amounts
authorPetar Jovanovic <petar.jovanovic@imgtec.com>
Thu, 20 Apr 2017 13:26:46 +0000 (13:26 +0000)
committerPetar Jovanovic <petar.jovanovic@imgtec.com>
Thu, 20 Apr 2017 13:26:46 +0000 (13:26 +0000)
commit51d7cb91e64fb60beb1d6ffb583ef8db0e9084e0
treed81cc4f4a019a6b242a6a350f343c10926f8d1f3
parent780f89d9610ac173ac7e0b468a206aa5747d688c
[mips][msa] Mask vectors holding shift amounts

Masked vectors which hold shift amounts when creating the following nodes:
ISD::SHL, ISD::SRL or ISD::SRA.
Instructions that use said nodes, which have had their arguments altered are
sll, srl, sra, bneg, bclr and bset.

For said instructions, the shift amount or the bit position that is
specified in the corresponding vector elements will be interpreted as the
shift amount/bit position modulo the size of the element in bits.

The problem lies in compiling with -O2 enabled, where the instructions for
formats .w and .d are not generated, but are instead optimized away.
In this case, having shift amounts that are either negative or greater than
the element bit size results in generation of incorrect results when
constant folding.

We remedy this by masking the operands for the nodes mentioned above before
actually creating them, so that the final result is correct before placed
into the constant pool.

Patch by Stefan Maksimovic.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@300839 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/Mips/MipsMSAInstrInfo.td
lib/Target/Mips/MipsSEISelLowering.cpp
test/CodeGen/Mips/msa/shift_constant_pool.ll [new file with mode: 0644]
test/CodeGen/Mips/msa/shift_no_and.ll [new file with mode: 0644]