[llvm] a5cd278 - [IR] Improve member `ShuffleVectorInst::isReplicationMask()`
Roman Lebedev via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 5 14:09:48 PDT 2021
Author: Roman Lebedev
Date: 2021-11-06T00:09:27+03:00
New Revision: a5cd27880a258df7df32ec1553d9e4ca7e1868a0
URL: https://github.com/llvm/llvm-project/commit/a5cd27880a258df7df32ec1553d9e4ca7e1868a0
DIFF: https://github.com/llvm/llvm-project/commit/a5cd27880a258df7df32ec1553d9e4ca7e1868a0.diff
LOG: [IR] Improve member `ShuffleVectorInst::isReplicationMask()`
When we have an actual shuffle, we can impose the additional restriction
that the mask replicates the elements of the first operand, so we know
the replication factor as a ratio of output and op0 vector sizes.
Added:
Modified:
llvm/include/llvm/IR/Instructions.h
llvm/lib/IR/Instructions.cpp
llvm/unittests/IR/InstructionsTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/IR/Instructions.h b/llvm/include/llvm/IR/Instructions.h
index b380e34523a7..0ef78881c6d7 100644
--- a/llvm/include/llvm/IR/Instructions.h
+++ b/llvm/include/llvm/IR/Instructions.h
@@ -2373,14 +2373,7 @@ class ShuffleVectorInst : public Instruction {
}
/// Return true if this shuffle mask is a replication mask.
- bool isReplicationMask(int &ReplicationFactor, int &VF) const {
- // Not possible to express a shuffle mask for a scalable vector for this
- // case.
- if (isa<ScalableVectorType>(getType()))
- return false;
-
- return isReplicationMask(ShuffleMask, ReplicationFactor, VF);
- }
+ bool isReplicationMask(int &ReplicationFactor, int &VF) const;
/// Change values in a shuffle permute mask assuming the two vector operands
/// of length InVecNumElts have swapped position.
diff --git a/llvm/lib/IR/Instructions.cpp b/llvm/lib/IR/Instructions.cpp
index 63dd07543f43..c42df49d97ea 100644
--- a/llvm/lib/IR/Instructions.cpp
+++ b/llvm/lib/IR/Instructions.cpp
@@ -2502,6 +2502,21 @@ bool ShuffleVectorInst::isReplicationMask(ArrayRef<int> Mask,
return false;
}
+bool ShuffleVectorInst::isReplicationMask(int &ReplicationFactor,
+ int &VF) const {
+ // Not possible to express a shuffle mask for a scalable vector for this
+ // case.
+ if (isa<ScalableVectorType>(getType()))
+ return false;
+
+ VF = cast<FixedVectorType>(Op<0>()->getType())->getNumElements();
+ if (ShuffleMask.size() % VF != 0)
+ return false;
+ ReplicationFactor = ShuffleMask.size() / VF;
+
+ return isReplicationMaskWithParams(ShuffleMask, ReplicationFactor, VF);
+}
+
//===----------------------------------------------------------------------===//
// InsertValueInst Class
//===----------------------------------------------------------------------===//
diff --git a/llvm/unittests/IR/InstructionsTest.cpp b/llvm/unittests/IR/InstructionsTest.cpp
index 213435f4c8d3..a4a96714e82d 100644
--- a/llvm/unittests/IR/InstructionsTest.cpp
+++ b/llvm/unittests/IR/InstructionsTest.cpp
@@ -1126,6 +1126,16 @@ TEST(InstructionsTest, ShuffleMaskIsReplicationMask) {
ReplicatedMask, GuessedReplicationFactor, GuessedVF));
EXPECT_EQ(GuessedReplicationFactor, ReplicationFactor);
EXPECT_EQ(GuessedVF, VF);
+
+ for (int OpVF : seq_inclusive(VF, 2 * VF + 1)) {
+ LLVMContext Ctx;
+ Type *OpVFTy = FixedVectorType::get(IntegerType::getInt1Ty(Ctx), OpVF);
+ Value *Op = ConstantVector::getNullValue(OpVFTy);
+ ShuffleVectorInst *SVI = new ShuffleVectorInst(Op, Op, ReplicatedMask);
+ EXPECT_EQ(SVI->isReplicationMask(GuessedReplicationFactor, GuessedVF),
+ OpVF == VF);
+ delete SVI;
+ }
}
}
}
More information about the llvm-commits
mailing list