BBVectorize, when using VTTI, should not form types that will be split.
authorHal Finkel <hfinkel@anl.gov>
Thu, 25 Oct 2012 23:47:16 +0000 (23:47 +0000)
committerHal Finkel <hfinkel@anl.gov>
Thu, 25 Oct 2012 23:47:16 +0000 (23:47 +0000)
This is needed so that perl's SHA can be compiled (otherwise
BBVectorize takes far too long to find its fixed point).

I'll try to come up with a reduced test case.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166738 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Vectorize/BBVectorize.cpp

index 61e8d735e411ce4915d398dde98947bacec68fbe..95b78322caa0f0848f2b7f1e0ab19aa13b58d718 100644 (file)
@@ -817,6 +817,15 @@ namespace {
                                                  IAddressSpace);
           if (VCost > ICost + JCost)
             return false;
+
+          // FIXME: We don't want to fuse to a type that will be split, even
+          // if the two input types will also be split and there is no other
+          // associated cost. This check depends on the fact
+          // that the current implementation of getMemoryOpCost returns only
+          // the type-splitting cost.
+          if (VCost > 1)
+            return false;
+
           CostSavings = ICost + JCost - VCost;
         }
       } else {
@@ -831,6 +840,16 @@ namespace {
 
       if (VCost > ICost + JCost)
         return false;
+
+      // FIXME: We don't want to fuse to a type that will be split, even
+      // if the two input types will also be split and there is no other
+      // associated cost. This check depends on the fact
+      // that the current implementation of getMemoryOpCost returns only
+      // the type-splitting cost (and does nothing else).
+      unsigned VTypeCost = VTTI->getMemoryOpCost(I->getOpcode(), VT1, 0, 0);
+      if (VTypeCost > 1)
+        return false;
+
       CostSavings = ICost + JCost - VCost;
     }