mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-29 14:20:29 +00:00
IR: Add a shufflevector mask commutation helper function. NFC.
Summary: Following up on Sanjay's suggetion in D32955, move this functionality into ShuffleVectornstruction. Reviewers: spatel, RKSimon Reviewed By: RKSimon Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D32956 llvm-svn: 302420
This commit is contained in:
parent
e29dd41674
commit
b32fbfb1f1
@ -2261,6 +2261,19 @@ public:
|
||||
return Mask;
|
||||
}
|
||||
|
||||
/// Change values in a shuffle permute mask assuming the two vector operands
|
||||
/// of length InVecNumElts have swapped position.
|
||||
static void commuteShuffleMask(MutableArrayRef<int> Mask,
|
||||
unsigned InVecNumElts) {
|
||||
for (int &Idx : Mask) {
|
||||
if (Idx == -1)
|
||||
continue;
|
||||
Idx = Idx < (int)InVecNumElts ? Idx + InVecNumElts : Idx - InVecNumElts;
|
||||
assert(Idx >= 0 && Idx < (int)InVecNumElts * 2 &&
|
||||
"shufflevector mask index out of range");
|
||||
}
|
||||
}
|
||||
|
||||
// Methods for support type inquiry through isa, cast, and dyn_cast:
|
||||
static inline bool classof(const Instruction *I) {
|
||||
return I->getOpcode() == Instruction::ShuffleVector;
|
||||
|
@ -4126,13 +4126,7 @@ static Value *SimplifyShuffleVectorInst(Value *Op0, Value *Op1, Constant *Mask,
|
||||
// second one.
|
||||
if (Op0Const && !Op1Const) {
|
||||
std::swap(Op0, Op1);
|
||||
for (int &Idx : Indices) {
|
||||
if (Idx == -1)
|
||||
continue;
|
||||
Idx = Idx < (int)InVecNumElts ? Idx + InVecNumElts : Idx - InVecNumElts;
|
||||
assert(Idx >= 0 && Idx < (int)InVecNumElts * 2 &&
|
||||
"shufflevector mask index out of range");
|
||||
}
|
||||
ShuffleVectorInst::commuteShuffleMask(Indices, InVecNumElts);
|
||||
Mask = ConstantDataVector::get(
|
||||
Mask->getContext(),
|
||||
makeArrayRef(reinterpret_cast<uint32_t *>(Indices.data()),
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "llvm/IR/Module.h"
|
||||
#include "llvm/IR/NoFolder.h"
|
||||
#include "llvm/IR/Operator.h"
|
||||
#include "gmock/gmock-matchers.h"
|
||||
#include "gtest/gtest.h"
|
||||
#include <memory>
|
||||
|
||||
@ -740,5 +741,11 @@ TEST(InstructionsTest, SwitchInst) {
|
||||
EXPECT_EQ(BB1.get(), Handle.getCaseSuccessor());
|
||||
}
|
||||
|
||||
TEST(InstructionsTest, CommuteShuffleMask) {
|
||||
SmallVector<int, 16> Indices({-1, 0, 7});
|
||||
ShuffleVectorInst::commuteShuffleMask(Indices, 4);
|
||||
EXPECT_THAT(Indices, testing::ContainerEq(ArrayRef<int>({-1, 4, 3})));
|
||||
}
|
||||
|
||||
} // end anonymous namespace
|
||||
} // end namespace llvm
|
||||
|
Loading…
Reference in New Issue
Block a user