[llvm] 60e9ee1 - [MergeFuncs] Don't merge shufflevectors with different masks
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Sat May 2 01:22:24 PDT 2020
Author: Nikita Popov
Date: 2020-05-02T10:21:14+02:00
New Revision: 60e9ee16b4a44166e5ceda44acb16f098b19cab4
URL: https://github.com/llvm/llvm-project/commit/60e9ee16b4a44166e5ceda44acb16f098b19cab4
DIFF: https://github.com/llvm/llvm-project/commit/60e9ee16b4a44166e5ceda44acb16f098b19cab4.diff
LOG: [MergeFuncs] Don't merge shufflevectors with different masks
When the shufflevector mask operand was converted into special
instruction data, the FunctionComparator was not updated to
account for this. As such, MergeFuncs will happily merge
shufflevectors with different masks.
This fixes https://bugs.llvm.org/show_bug.cgi?id=45773.
Differential Revision: https://reviews.llvm.org/D79261
Added:
llvm/test/Transforms/MergeFunc/shufflevector.ll
Modified:
llvm/lib/Transforms/Utils/FunctionComparator.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Utils/FunctionComparator.cpp b/llvm/lib/Transforms/Utils/FunctionComparator.cpp
index 8a9ff13329fb..713ae41d2247 100644
--- a/llvm/lib/Transforms/Utils/FunctionComparator.cpp
+++ b/llvm/lib/Transforms/Utils/FunctionComparator.cpp
@@ -656,6 +656,16 @@ int FunctionComparator::cmpOperations(const Instruction *L,
return cmpNumbers(RMWI->getSyncScopeID(),
cast<AtomicRMWInst>(R)->getSyncScopeID());
}
+ if (const ShuffleVectorInst *SVI = dyn_cast<ShuffleVectorInst>(L)) {
+ ArrayRef<int> LMask = SVI->getShuffleMask();
+ ArrayRef<int> RMask = cast<ShuffleVectorInst>(R)->getShuffleMask();
+ if (int Res = cmpNumbers(LMask.size(), RMask.size()))
+ return Res;
+ for (size_t i = 0, e = LMask.size(); i != e; ++i) {
+ if (int Res = cmpNumbers(LMask[i], RMask[i]))
+ return Res;
+ }
+ }
if (const PHINode *PNL = dyn_cast<PHINode>(L)) {
const PHINode *PNR = cast<PHINode>(R);
// Ensure that in addition to the incoming values being identical
diff --git a/llvm/test/Transforms/MergeFunc/shufflevector.ll b/llvm/test/Transforms/MergeFunc/shufflevector.ll
new file mode 100644
index 000000000000..244fd5c8c9ea
--- /dev/null
+++ b/llvm/test/Transforms/MergeFunc/shufflevector.ll
@@ -0,0 +1,40 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -mergefunc < %s | FileCheck %s
+
+define internal <2 x i32> @test1(<2 x i32> %v1, <2 x i32> %v2) {
+; CHECK-LABEL: @test1(
+; CHECK-NEXT: [[X:%.*]] = shufflevector <2 x i32> [[V1:%.*]], <2 x i32> [[V2:%.*]], <2 x i32> <i32 0, i32 1>
+; CHECK-NEXT: ret <2 x i32> [[X]]
+;
+ %x = shufflevector <2 x i32> %v1, <2 x i32> %v2, <2 x i32> <i32 0, i32 1>
+ ret <2 x i32> %x
+}
+
+; Same mask as test1.
+define internal <2 x i32> @test2(<2 x i32> %v1, <2 x i32> %v2) {
+ %x = shufflevector <2 x i32> %v1, <2 x i32> %v2, <2 x i32> <i32 0, i32 1>
+ ret <2 x i32> %x
+}
+
+; Different mask than test1, don't merge.
+define internal <2 x i32> @test3(<2 x i32> %v1, <2 x i32> %v2) {
+; CHECK-LABEL: @test3(
+; CHECK-NEXT: [[X:%.*]] = shufflevector <2 x i32> [[V1:%.*]], <2 x i32> [[V2:%.*]], <2 x i32> <i32 1, i32 0>
+; CHECK-NEXT: ret <2 x i32> [[X]]
+;
+ %x = shufflevector <2 x i32> %v1, <2 x i32> %v2, <2 x i32> <i32 1, i32 0>
+ ret <2 x i32> %x
+}
+
+define void @caller(<2 x i32> %v1, <2 x i32> %v2) {
+; CHECK-LABEL: @caller(
+; CHECK-NEXT: [[TMP1:%.*]] = call <2 x i32> @test1(<2 x i32> [[V1:%.*]], <2 x i32> [[V2:%.*]])
+; CHECK-NEXT: [[TMP2:%.*]] = call <2 x i32> @test1(<2 x i32> [[V1]], <2 x i32> [[V2]])
+; CHECK-NEXT: [[TMP3:%.*]] = call <2 x i32> @test3(<2 x i32> [[V1]], <2 x i32> [[V2]])
+; CHECK-NEXT: ret void
+;
+ call <2 x i32> @test1(<2 x i32> %v1, <2 x i32> %v2)
+ call <2 x i32> @test2(<2 x i32> %v1, <2 x i32> %v2)
+ call <2 x i32> @test3(<2 x i32> %v1, <2 x i32> %v2)
+ ret void
+}
More information about the llvm-commits
mailing list