SLPVectorizer: Improve the compile time of isConsecutive by reordering the conditions...
authorNadav Rotem <nrotem@apple.com>
Fri, 19 Jul 2013 23:11:15 +0000 (23:11 +0000)
committerNadav Rotem <nrotem@apple.com>
Fri, 19 Jul 2013 23:11:15 +0000 (23:11 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@186731 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Vectorize/SLPVectorizer.cpp

index f1da774ede536a0314ef924379af21e6c82bdb90..42aa8a2b431cb207b868be355f0984c0d12d8a80 100644 (file)
@@ -994,19 +994,27 @@ bool BoUpSLP::isConsecutiveAccess(Value *A, Value *B) {
   Type *Ty = cast<PointerType>(PtrA->getType())->getElementType();
   int64_t Sz = DL->getTypeStoreSize(Ty);
 
-  // If both pointers are GEPs:
-  if (GepA && GepB) {
-    // Check that they have the same base pointer.
-    if (GepA->getPointerOperand() != GepB->getPointerOperand())
-      return false;
+  // Check if PtrA is the base and PtrB is a constant offset.
+  if (GepB && GepB->getPointerOperand() == PtrA) {
+    APInt Offset(BW, 0);
+    if (GepB->accumulateConstantOffset(*DL, Offset))
+      return Offset.getSExtValue() == Sz;
+    return false;
+  }
 
-    // Check if the geps use a constant offset.
-    APInt OffsetA(BW, 0) ,OffsetB(BW, 0);
-    if (GepA->accumulateConstantOffset(*DL, OffsetA) &&
-        GepB->accumulateConstantOffset(*DL, OffsetB))
-      return ((OffsetB.getSExtValue() - OffsetA.getSExtValue()) == Sz);
+  // Check if PtrB is the base and PtrA is a constant offset.
+  if (GepA && GepA->getPointerOperand() == PtrB) {
+    APInt Offset(BW, 0);
+    if (GepA->accumulateConstantOffset(*DL, Offset))
+      return Offset.getSExtValue() == -Sz;
+    return false;
+  }
 
-    if (GepA->getNumIndices() != GepB->getNumIndices())
+  // If both pointers are GEPs:
+  if (GepA && GepB) {
+    // Check that they have the same base pointer and number of indices.
+    if (GepA->getPointerOperand() != GepB->getPointerOperand() ||
+        GepA->getNumIndices() != GepB->getNumIndices())
       return false;
 
     // Try to strip the geps. This makes SCEV faster.
@@ -1022,17 +1030,6 @@ bool BoUpSLP::isConsecutiveAccess(Value *A, Value *B) {
     Sz = 1;
   }
 
-  // Check if PtrA is the base and PtrB is a constant offset.
-  if (GepB && GepB->getPointerOperand() == PtrA) {
-    APInt Offset(BW, 0);
-    if (GepB->accumulateConstantOffset(*DL, Offset))
-      return Offset.getZExtValue() == DL->getTypeStoreSize(Ty);
-  }
-
-  // GepA can't use PtrB as a base pointer.
-  if (GepA && GepA->getPointerOperand() == PtrB)
-    return false;
-
   ConstantInt *CA = dyn_cast<ConstantInt>(PtrA);
   ConstantInt *CB = dyn_cast<ConstantInt>(PtrB);
   if (CA && CB) {