summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/LoopIdiom/basic.ll
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2011-02-19 19:56:44 +0000
committerChris Lattner <sabre@nondot.org>2011-02-19 19:56:44 +0000
commit72a35fb97457c2b26c77322f24d2f129959bc7e5 (patch)
tree2b4b95e5053de8f03cd4e02ff5b0ea871141ba17 /llvm/test/Transforms/LoopIdiom/basic.ll
parentacf6b0776a624f1ef0400b131d1623cae24b3409 (diff)
downloadbcm5719-llvm-72a35fb97457c2b26c77322f24d2f129959bc7e5.tar.gz
bcm5719-llvm-72a35fb97457c2b26c77322f24d2f129959bc7e5.zip
rewrite the memset_pattern pattern generation stuff to accept any 2/4/8/16-byte
constant, including globals. This makes us generate much more "pretty" pattern globals as well because it doesn't break it down to an array of bytes all the time. This enables us to handle stores of relocatable globals. This kicks in about 48 times in 254.gap, giving us stuff like this: @.memset_pattern40 = internal constant [2 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*] [%struct.TypHeader* (%struct.TypHeader*, %struct .TypHeader*)* @IsFalse, %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)* @IsFalse], align 16 ... call void @memset_pattern16(i8* %scevgep5859, i8* bitcast ([2 x %struct.TypHeader* (%struct.TypHeader*, %struct.TypHeader*)*]* @.memset_pattern40 to i8* ), i64 %tmp75) nounwind llvm-svn: 126044
Diffstat (limited to 'llvm/test/Transforms/LoopIdiom/basic.ll')
-rw-r--r--llvm/test/Transforms/LoopIdiom/basic.ll29
1 files changed, 27 insertions, 2 deletions
diff --git a/llvm/test/Transforms/LoopIdiom/basic.ll b/llvm/test/Transforms/LoopIdiom/basic.ll
index 122d25a22a0..485114c8d48 100644
--- a/llvm/test/Transforms/LoopIdiom/basic.ll
+++ b/llvm/test/Transforms/LoopIdiom/basic.ll
@@ -277,7 +277,7 @@ for.end13: ; preds = %for.inc10
; On darwin10 (which is the triple in this .ll file) this loop can be turned
; into a memset_pattern call.
; rdar://9009151
-define void @test11(i32* nocapture %P) nounwind ssp {
+define void @test11_pattern(i32* nocapture %P) nounwind ssp {
entry:
br label %for.body
@@ -291,7 +291,7 @@ for.body: ; preds = %entry, %for.body
for.end: ; preds = %for.body
ret void
-; CHECK: @test11
+; CHECK: @test11_pattern
; CHECK-NEXT: entry:
; CHECK-NEXT: bitcast
; CHECK-NEXT: memset_pattern
@@ -322,3 +322,28 @@ for.end: ; preds = %for.body
; CHECK: ret void
}
+@G = global i32 5
+
+; This store-of-address loop can be turned into a memset_pattern call.
+; rdar://9009151
+define void @test13_pattern(i32** nocapture %P) nounwind ssp {
+entry:
+ br label %for.body
+
+for.body: ; preds = %entry, %for.body
+ %indvar = phi i64 [ 0, %entry ], [ %indvar.next, %for.body ]
+ %arrayidx = getelementptr i32** %P, i64 %indvar
+ store i32* @G, i32** %arrayidx, align 4
+ %indvar.next = add i64 %indvar, 1
+ %exitcond = icmp eq i64 %indvar.next, 10000
+ br i1 %exitcond, label %for.end, label %for.body
+
+for.end: ; preds = %for.body
+ ret void
+; CHECK: @test13_pattern
+; CHECK-NEXT: entry:
+; CHECK-NEXT: bitcast
+; CHECK-NEXT: memset_pattern
+; CHECK-NOT: store
+; CHECK: ret void
+}
OpenPOWER on IntegriCloud