summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDorit Nuzman <dorit.nuzman@intel.com>2016-10-30 14:34:57 +0000
committerDorit Nuzman <dorit.nuzman@intel.com>2016-10-30 14:34:57 +0000
commit6d3c9bdc8f8e9dff0aac3a69442c89e38508bdd6 (patch)
tree5c4e6396613c120a61ea3b3bff6c1e3b2c641018 /lib
parentb10d92715814802a020d7438ec354ded46219769 (diff)
Revert r285517 due to build failures.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@285518 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Transforms/Vectorize/LoopVectorize.cpp60
1 files changed, 1 insertions, 59 deletions
diff --git a/lib/Transforms/Vectorize/LoopVectorize.cpp b/lib/Transforms/Vectorize/LoopVectorize.cpp
index 273707c3c09..24025324dff 100644
--- a/lib/Transforms/Vectorize/LoopVectorize.cpp
+++ b/lib/Transforms/Vectorize/LoopVectorize.cpp
@@ -5734,15 +5734,7 @@ void InterleavedAccessInfo::collectConstStrideAccesses(
continue;
Value *Ptr = getPointerOperand(&I);
- // We don't check wrapping here because we don't know yet if Ptr will be
- // part of a full group or a group with gaps. Checking wrapping for all
- // pointers (even those that end up in groups with no gaps) will be overly
- // conservative. For full groups, wrapping should be ok since if we would
- // wrap around the address space we would do a memory access at nullptr
- // even without the transformation. The wrapping checks are therefore
- // deferred until after we've formed the interleaved groups.
- int64_t Stride = getPtrStride(PSE, Ptr, TheLoop, Strides,
- /*Assume=*/true, /*ShouldCheckWrap=*/false);
+ int64_t Stride = getPtrStride(PSE, Ptr, TheLoop, Strides);
const SCEV *Scev = replaceSymbolicStrideSCEV(PSE, Strides, Ptr);
PointerType *PtrTy = dyn_cast<PointerType>(Ptr->getType());
@@ -5946,56 +5938,6 @@ void InterleavedAccessInfo::analyzeInterleaving(
if (Group->getNumMembers() != Group->getFactor())
releaseGroup(Group);
- // Remove interleaved groups with gaps (currently only loads) whose memory
- // accesses may wrap around. We have to revisit the getPtrStride analysis,
- // this time with ShouldCheckWrap=true, since collectConstStrideAccesses does
- // not check wrapping (see documentation there).
- // FORNOW we use Assume=false;
- // TODO: Change to Assume=true but making sure we don't exceed the threshold
- // of runtime SCEV assumptions checks (thereby potentially failing to
- // vectorize altogether).
- // Additional optional optimizations:
- // TODO: If we are peeling the loop and we know that the first pointer doesn't
- // wrap then we can deduce that all pointers in the group don't wrap.
- // This means that we can forcefully peel the loop in order to only have to
- // check the first pointer for no-wrap. When we'll change to use Assume=true
- // we'll only need at most one runtime check per interleaved group.
- //
- for (InterleaveGroup *Group : LoadGroups) {
-
- // Case 1: A full group. Can Skip the checks; For full groups, if the wide
- // load would wrap around the address space we would do a memory access at
- // nullptr even without the transformation.
- if (Group->getNumMembers() == Group->getFactor())
- continue;
-
- // Case 2: If first and last members of the group don't wrap this implies
- // that all the pointers in the group don't wrap.
- // So we check only group member 0 (which is always guaranteed to exist),
- // and group member Factor-1 (if it doesn't exist we can just ignore it
- // since we know that in this case we will always peel the loop, in which
- // case we only need to check the first member).
- Value *FirstMemberPtr = getPointerOperand(Group->getMember(0));
- if (!getPtrStride(PSE, FirstMemberPtr, TheLoop, Strides, /*Assume=*/false,
- /*ShouldCheckWrap=*/true)) {
- DEBUG(dbgs() << "LV: Invalidate candidate interleaved group due to "
- "potential pointer wrapping.\n");
- releaseGroup(Group);
- continue;
- }
-
- if (Instruction *LastMember = Group->getMember(Group->getFactor() - 1)) {
- Value *LastMemberPtr = getPointerOperand(LastMember);
- if (!getPtrStride(PSE, LastMemberPtr, TheLoop, Strides, /*Assume=*/false,
- /*ShouldCheckWrap=*/true)) {
- DEBUG(dbgs() << "LV: Invalidate candidate interleaved group due to "
- "potential pointer wrapping.\n");
- releaseGroup(Group);
- continue;
- }
- }
- }
-
// If there is a non-reversed interleaved load group with gaps, we will need
// to execute at least one scalar epilogue iteration. This will ensure that
// we don't speculatively access memory out-of-bounds. Note that we only need