summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/LoopIdiom
diff options
context:
space:
mode:
authorChad Rosier <mcrosier@codeaurora.org>2015-10-28 12:55:34 +0000
committerChad Rosier <mcrosier@codeaurora.org>2015-10-28 12:55:34 +0000
commitd6a6bd5501c8d7055ee3ac43bb240e8e626f8430 (patch)
treeb2535d8f0289bac5fd8bbc37dc90430189d1ca0c /llvm/test/Transforms/LoopIdiom
parent855233655c07c0f51aae49f74b3b390ab9b547d1 (diff)
downloadbcm5719-llvm-d6a6bd5501c8d7055ee3ac43bb240e8e626f8430.tar.gz
bcm5719-llvm-d6a6bd5501c8d7055ee3ac43bb240e8e626f8430.zip
[LIR] Add support for creating memsets from loops with a negative stride.
http://reviews.llvm.org/D14125 llvm-svn: 251512
Diffstat (limited to 'llvm/test/Transforms/LoopIdiom')
-rw-r--r--llvm/test/Transforms/LoopIdiom/basic.ll44
1 files changed, 44 insertions, 0 deletions
diff --git a/llvm/test/Transforms/LoopIdiom/basic.ll b/llvm/test/Transforms/LoopIdiom/basic.ll
index c633ae95d16..f7317879a36 100644
--- a/llvm/test/Transforms/LoopIdiom/basic.ll
+++ b/llvm/test/Transforms/LoopIdiom/basic.ll
@@ -424,3 +424,47 @@ exit:
ret void
; CHECK: ret void
}
+
+; Recognize loops with a negative stride.
+define void @test15(i32* nocapture %f) {
+entry:
+ br label %for.body
+
+for.body:
+ %indvars.iv = phi i64 [ 65536, %entry ], [ %indvars.iv.next, %for.body ]
+ %arrayidx = getelementptr inbounds i32, i32* %f, i64 %indvars.iv
+ store i32 0, i32* %arrayidx, align 4
+ %indvars.iv.next = add nsw i64 %indvars.iv, -1
+ %cmp = icmp sgt i64 %indvars.iv, 0
+ br i1 %cmp, label %for.body, label %for.cond.cleanup
+
+for.cond.cleanup:
+ ret void
+; CHECK-LABEL: @test15(
+; CHECK: call void @llvm.memset.p0i8.i64(i8* %f1, i8 0, i64 262148, i32 4, i1 false)
+; CHECK-NOT: store
+; CHECK: ret void
+}
+
+; Loop with a negative stride. Verify an aliasing write to f[65536] prevents
+; the creation of a memset.
+define void @test16(i32* nocapture %f) {
+entry:
+ %arrayidx1 = getelementptr inbounds i32, i32* %f, i64 65536
+ br label %for.body
+
+for.body: ; preds = %entry, %for.body
+ %indvars.iv = phi i64 [ 65536, %entry ], [ %indvars.iv.next, %for.body ]
+ %arrayidx = getelementptr inbounds i32, i32* %f, i64 %indvars.iv
+ store i32 0, i32* %arrayidx, align 4
+ store i32 1, i32* %arrayidx1, align 4
+ %indvars.iv.next = add nsw i64 %indvars.iv, -1
+ %cmp = icmp sgt i64 %indvars.iv, 0
+ br i1 %cmp, label %for.body, label %for.cond.cleanup
+
+for.cond.cleanup: ; preds = %for.body
+ ret void
+; CHECK-LABEL: @test16(
+; CHECK-NOT: call void @llvm.memset.p0i8.i64
+; CHECK: ret void
+}
OpenPOWER on IntegriCloud