[llvm] r278837 - Make MDNode::intersect faster than O(n * m)

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 16 11:48:37 PDT 2016


Author: majnemer
Date: Tue Aug 16 13:48:37 2016
New Revision: 278837

URL: http://llvm.org/viewvc/llvm-project?rev=278837&view=rev
Log:
Make MDNode::intersect faster than O(n * m)

It is pretty easy to get it down to O(nlogn + mlogm).  This
implementation has the added benefit of automatically deduplicating
entries between the two sets.

Modified:
    llvm/trunk/lib/IR/Metadata.cpp
    llvm/trunk/test/Transforms/LoopVersioningLICM/loopversioningLICM1.ll
    llvm/trunk/test/Transforms/LoopVersioningLICM/loopversioningLICM2.ll

Modified: llvm/trunk/lib/IR/Metadata.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Metadata.cpp?rev=278837&r1=278836&r2=278837&view=diff
==============================================================================
--- llvm/trunk/lib/IR/Metadata.cpp (original)
+++ llvm/trunk/lib/IR/Metadata.cpp Tue Aug 16 13:48:37 2016
@@ -875,14 +875,13 @@ MDNode *MDNode::intersect(MDNode *A, MDN
   if (!A || !B)
     return nullptr;
 
-  SmallVector<Metadata *, 4> MDs;
-  for (Metadata *MD : A->operands())
-    if (is_contained(B->operands(), MD))
-      MDs.push_back(MD);
+  SmallSetVector<Metadata *, 4> MDs(A->op_begin(), A->op_end());
+  SmallPtrSet<Metadata *, 4> BSet(B->op_begin(), B->op_end());
+  MDs.remove_if([&](Metadata *MD) { return !is_contained(BSet, MD); });
 
   // FIXME: This preserves long-standing behaviour, but is it really the right
   // behaviour?  Or was that an unintended side-effect of node uniquing?
-  return getOrSelfReference(A->getContext(), MDs);
+  return getOrSelfReference(A->getContext(), MDs.getArrayRef());
 }
 
 MDNode *MDNode::getMostGenericAliasScope(MDNode *A, MDNode *B) {

Modified: llvm/trunk/test/Transforms/LoopVersioningLICM/loopversioningLICM1.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopVersioningLICM/loopversioningLICM1.ll?rev=278837&r1=278836&r2=278837&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/LoopVersioningLICM/loopversioningLICM1.ll (original)
+++ llvm/trunk/test/Transforms/LoopVersioningLICM/loopversioningLICM1.ll Tue Aug 16 13:48:37 2016
@@ -12,11 +12,11 @@
 ; CHECK-NEXT: %j.113 = phi i32 [ %j.016, %for.body3.ph ], [ %inc, %for.body3 ]
 ; CHECK-NEXT: %idxprom = zext i32 %j.113 to i64
 ; CHECK-NEXT: %arrayidx = getelementptr inbounds i32, i32* %var1, i64 %idxprom
-; CHECK-NEXT: store i32 %add, i32* %arrayidx, align 4, !alias.scope !6, !noalias !6
+; CHECK-NEXT: store i32 %add, i32* %arrayidx, align 4, !alias.scope !2, !noalias !2
 ; CHECK-NEXT: %add8 = add nsw i32 %add86, %add
 ; CHECK-NEXT: %inc = add nuw i32 %j.113, 1
 ; CHECK-NEXT: %cmp2 = icmp ult i32 %inc, %itr
-; CHECK-NEXT: br i1 %cmp2, label %for.body3, label %for.inc11.loopexit.loopexit5, !llvm.loop !7
+; CHECK-NEXT: br i1 %cmp2, label %for.body3, label %for.inc11.loopexit.loopexit5, !llvm.loop !5
 define i32 @foo(i32* nocapture %var1, i32* nocapture readnone %var2, i32* nocapture %var3, i32 %itr) #0 {
 entry:
   %cmp14 = icmp eq i32 %itr, 0

Modified: llvm/trunk/test/Transforms/LoopVersioningLICM/loopversioningLICM2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopVersioningLICM/loopversioningLICM2.ll?rev=278837&r1=278836&r2=278837&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/LoopVersioningLICM/loopversioningLICM2.ll (original)
+++ llvm/trunk/test/Transforms/LoopVersioningLICM/loopversioningLICM2.ll Tue Aug 16 13:48:37 2016
@@ -9,7 +9,7 @@
 ;
 ; CHECK: for.cond1.for.inc17_crit_edge.us.loopexit5:       ; preds = %for.body3.us
 ; CHECK-NEXT: %add14.us.lcssa = phi float [ %add14.us, %for.body3.us ]
-; CHECK-NEXT: store float %add14.us.lcssa, float* %arrayidx.us, align 4, !alias.scope !7, !noalias !8
+; CHECK-NEXT: store float %add14.us.lcssa, float* %arrayidx.us, align 4, !alias.scope !0, !noalias !0
 ; CHECK-NEXT: br label %for.cond1.for.inc17_crit_edge.us
 ;
 define i32 @foo(float* nocapture %var2, float** nocapture readonly %var3, i32 %itr) #0 {




More information about the llvm-commits mailing list