diff options
Diffstat (limited to 'llvm/test/Transforms/LoopVectorize/interleaved-accesses-masked-group.ll')
| -rw-r--r-- | llvm/test/Transforms/LoopVectorize/interleaved-accesses-masked-group.ll | 222 |
1 files changed, 0 insertions, 222 deletions
diff --git a/llvm/test/Transforms/LoopVectorize/interleaved-accesses-masked-group.ll b/llvm/test/Transforms/LoopVectorize/interleaved-accesses-masked-group.ll deleted file mode 100644 index 9ed66a22dbf..00000000000 --- a/llvm/test/Transforms/LoopVectorize/interleaved-accesses-masked-group.ll +++ /dev/null @@ -1,222 +0,0 @@ -; REQUIRES: asserts -; RUN: opt -S -loop-vectorize -force-vector-width=8 -force-vector-interleave=1 -enable-interleaved-mem-accesses -debug-only=loop-vectorize,vectorutils -disable-output < %s 2>&1 | FileCheck %s -check-prefix=STRIDED_UNMASKED -; RUN: opt -S -loop-vectorize -force-vector-width=8 -force-vector-interleave=1 -enable-interleaved-mem-accesses -enable-masked-interleaved-mem-accesses -debug-only=loop-vectorize,vectorutils -disable-output < %s 2>&1 | FileCheck %s -check-prefix=STRIDED_MASKED - -target datalayout = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128" - -; We test here that the loop-vectorizer forms an interleave-groups from -; predicated memory accesses only if they are both in the same (predicated) -; block (first scenario below). -; If the accesses are not in the same predicated block, an interleave-group -; is not formed (scenarios 2,3 below). - -; Scenario 1: Check the case where it is legal to create masked interleave- -; groups. Altogether two groups are created (one for loads and one for stores) -; when masked-interleaved-acceses are enabled. When masked-interleaved-acceses -; are disabled we do not create any interleave-group. -; -; void masked_strided1(const unsigned char* restrict p, -; unsigned char* restrict q, -; unsigned char guard) { -; for(ix=0; ix < 1024; ++ix) { -; if (ix > guard) { -; char left = p[2*ix]; -; char right = p[2*ix + 1]; -; char max = max(left, right); -; q[2*ix] = max; -; q[2*ix+1] = 0 - max; -; } -; } -;} - - -; STRIDED_UNMASKED: LV: Checking a loop in "masked_strided1" -; STRIDED_UNMASKED: LV: Analyzing interleaved accesses... -; STRIDED_UNMASKED-NOT: LV: Creating an interleave group - -; STRIDED_MASKED: LV: Checking a loop in "masked_strided1" -; STRIDED_MASKED: LV: Analyzing interleaved accesses... -; STRIDED_MASKED-NEXT: LV: Creating an interleave group with: store i8 %{{.*}}, i8* %{{.*}}, align 1 -; STRIDED_MASKED-NEXT: LV: Inserted: store i8 %{{.*}}, i8* %{{.*}}, align 1 -; STRIDED_MASKED-NEXT: into the interleave group with store i8 %{{.*}}, i8* %{{.*}}, align 1 -; STRIDED_MASKED-NEXT: LV: Creating an interleave group with: %{{.*}} = load i8, i8* %{{.*}}, align 1 -; STRIDED_MASKED-NEXT: LV: Inserted: %{{.*}} = load i8, i8* %{{.*}}, align 1 -; STRIDED_MASKED-NEXT: into the interleave group with %{{.*}} = load i8, i8* %{{.*}}, align 1 - -; Scenario 2: Check the case where it is illegal to create a masked interleave- -; group because the first access is predicated, and the second isn't. -; We therefore create a separate interleave-group with gaps for each of the -; stores (if masked-interleaved-accesses are enabled) and these are later -; invalidated because interleave-groups of stores with gaps are not supported. -; If masked-interleaved-accesses is not enabled we create only one interleave -; group of stores (for the non-predicated store) and it is later invalidated -; due to gaps. -; -; void masked_strided2(const unsigned char* restrict p, -; unsigned char* restrict q, -; unsigned char guard1, -; unsigned char guard2) { -; for(ix=0; ix < 1024; ++ix) { -; if (ix > guard1) { -; q[2*ix] = 1; -; } -; q[2*ix+1] = 2; -; } -;} - -; STRIDED_UNMASKED: LV: Checking a loop in "masked_strided2" -; STRIDED_UNMASKED: LV: Analyzing interleaved accesses... -; STRIDED_UNMASKED-NEXT: LV: Creating an interleave group with: store i8 1, i8* %{{.*}}, align 1 -; STRIDED_UNMASKED-NEXT: LV: Invalidate candidate interleaved store group due to gaps. -; STRIDED_UNMASKED-NOT: LV: Creating an interleave group - -; STRIDED_MASKED: LV: Checking a loop in "masked_strided2" -; STRIDED_MASKED: LV: Analyzing interleaved accesses... -; STRIDED_MASKED-NEXT: LV: Creating an interleave group with: store i8 2, i8* %{{.*}}, align 1 -; STRIDED_MASKED-NEXT: LV: Creating an interleave group with: store i8 1, i8* %{{.*}}, align 1 -; STRIDED_MASKED-NEXT: LV: Invalidate candidate interleaved store group due to gaps. -; STRIDED_MASKED-NEXT: LV: Invalidate candidate interleaved store group due to gaps. - - -; Scenario 3: Check the case where it is illegal to create a masked interleave- -; group because the two accesses are in separate predicated blocks. -; We therefore create a separate interleave-group with gaps for each of the accesses, -; (which are later invalidated because interleave-groups of stores with gaps are -; not supported). -; If masked-interleaved-accesses is not enabled we don't create any interleave -; group because all accesses are predicated. -; -; void masked_strided3(const unsigned char* restrict p, -; unsigned char* restrict q, -; unsigned char guard1, -; unsigned char guard2) { -; for(ix=0; ix < 1024; ++ix) { -; if (ix > guard1) { -; q[2*ix] = 1; -; } -; if (ix > guard2) { -; q[2*ix+1] = 2; -; } -; } -;} - - -; STRIDED_UNMASKED: LV: Checking a loop in "masked_strided3" -; STRIDED_UNMASKED: LV: Analyzing interleaved accesses... -; STRIDED_UNMASKED-NOT: LV: Creating an interleave group - -; STRIDED_MASKED: LV: Checking a loop in "masked_strided3" -; STRIDED_MASKED: LV: Analyzing interleaved accesses... -; STRIDED_MASKED-NEXT: LV: Creating an interleave group with: store i8 2, i8* %{{.*}}, align 1 -; STRIDED_MASKED-NEXT: LV: Creating an interleave group with: store i8 1, i8* %{{.*}}, align 1 -; STRIDED_MASKED-NEXT: LV: Invalidate candidate interleaved store group due to gaps. -; STRIDED_MASKED-NEXT: LV: Invalidate candidate interleaved store group due to gaps. - - -; ModuleID = 'test.c' -source_filename = "test.c" -target datalayout = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128" -target triple = "i386-unknown-linux-gnu" - -define dso_local void @masked_strided1(i8* noalias nocapture readonly %p, i8* noalias nocapture %q, i8 zeroext %guard) local_unnamed_addr #0 { -entry: - %conv = zext i8 %guard to i32 - br label %for.body - -for.body: - %ix.024 = phi i32 [ 0, %entry ], [ %inc, %for.inc ] - %cmp1 = icmp ugt i32 %ix.024, %conv - br i1 %cmp1, label %if.then, label %for.inc - -if.then: - %mul = shl nuw nsw i32 %ix.024, 1 - %arrayidx = getelementptr inbounds i8, i8* %p, i32 %mul - %0 = load i8, i8* %arrayidx, align 1 - %add = or i32 %mul, 1 - %arrayidx4 = getelementptr inbounds i8, i8* %p, i32 %add - %1 = load i8, i8* %arrayidx4, align 1 - %cmp.i = icmp slt i8 %0, %1 - %spec.select.i = select i1 %cmp.i, i8 %1, i8 %0 - %arrayidx6 = getelementptr inbounds i8, i8* %q, i32 %mul - store i8 %spec.select.i, i8* %arrayidx6, align 1 - %sub = sub i8 0, %spec.select.i - %arrayidx11 = getelementptr inbounds i8, i8* %q, i32 %add - store i8 %sub, i8* %arrayidx11, align 1 - br label %for.inc - -for.inc: - %inc = add nuw nsw i32 %ix.024, 1 - %exitcond = icmp eq i32 %inc, 1024 - br i1 %exitcond, label %for.end, label %for.body - -for.end: - ret void -} - - -define dso_local void @masked_strided2(i8* noalias nocapture readnone %p, i8* noalias nocapture %q, i8 zeroext %guard) local_unnamed_addr #0 { -entry: - %conv = zext i8 %guard to i32 - br label %for.body - -for.body: - %ix.012 = phi i32 [ 0, %entry ], [ %inc, %for.inc ] - %mul = shl nuw nsw i32 %ix.012, 1 - %arrayidx = getelementptr inbounds i8, i8* %q, i32 %mul - store i8 1, i8* %arrayidx, align 1 - %cmp1 = icmp ugt i32 %ix.012, %conv - br i1 %cmp1, label %if.then, label %for.inc - -if.then: - %add = or i32 %mul, 1 - %arrayidx3 = getelementptr inbounds i8, i8* %q, i32 %add - store i8 2, i8* %arrayidx3, align 1 - br label %for.inc - -for.inc: - %inc = add nuw nsw i32 %ix.012, 1 - %exitcond = icmp eq i32 %inc, 1024 - br i1 %exitcond, label %for.end, label %for.body - -for.end: - ret void -} - - -define dso_local void @masked_strided3(i8* noalias nocapture readnone %p, i8* noalias nocapture %q, i8 zeroext %guard1, i8 zeroext %guard2) local_unnamed_addr #0 { -entry: - %conv = zext i8 %guard1 to i32 - %conv3 = zext i8 %guard2 to i32 - br label %for.body - -for.body: - %ix.018 = phi i32 [ 0, %entry ], [ %inc, %for.inc ] - %mul = shl nuw nsw i32 %ix.018, 1 - %cmp1 = icmp ugt i32 %ix.018, %conv - br i1 %cmp1, label %if.then, label %if.end - -if.then: - %arrayidx = getelementptr inbounds i8, i8* %q, i32 %mul - store i8 1, i8* %arrayidx, align 1 - br label %if.end - -if.end: - %cmp4 = icmp ugt i32 %ix.018, %conv3 - br i1 %cmp4, label %if.then6, label %for.inc - -if.then6: - %add = or i32 %mul, 1 - %arrayidx7 = getelementptr inbounds i8, i8* %q, i32 %add - store i8 2, i8* %arrayidx7, align 1 - br label %for.inc - -for.inc: - %inc = add nuw nsw i32 %ix.018, 1 - %exitcond = icmp eq i32 %inc, 1024 - br i1 %exitcond, label %for.end, label %for.body - -for.end: - ret void -} - -attributes #0 = { "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" } |

