[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