aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/Transforms/Vectorize/BBVectorize.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/lib/Transforms/Vectorize/BBVectorize.cpp b/lib/Transforms/Vectorize/BBVectorize.cpp
index 61e8d73..95b7832 100644
--- a/lib/Transforms/Vectorize/BBVectorize.cpp
+++ b/lib/Transforms/Vectorize/BBVectorize.cpp
@@ -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;
}