summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms/RewriteStatepointsForGC/liveness-basics.ll
diff options
context:
space:
mode:
authorSanjoy Das <sanjoy@playingwithpointers.com>2016-01-29 00:28:57 +0000
committerSanjoy Das <sanjoy@playingwithpointers.com>2016-01-29 00:28:57 +0000
commit0407108020ed12d8c34582d847d2c37cd68d1d0b (patch)
tree7de1975eea25776ce57985fbd3c86e19066e48fb /llvm/test/Transforms/RewriteStatepointsForGC/liveness-basics.ll
parentbaf16512ea3187a38b8f7a0298b8c4c2f0741ae5 (diff)
downloadbcm5719-llvm-0407108020ed12d8c34582d847d2c37cd68d1d0b.tar.gz
bcm5719-llvm-0407108020ed12d8c34582d847d2c37cd68d1d0b.zip
[RS4GC] Clamp UseDeoptBundles to true and update tests
The full diff for the test directory may be hard to read because of the filename clash; so here's all that happened as far as the tests are concerned: ``` cd test/Transforms/RewriteStatepointsForGC git rm *ll git mv deopt-bundles/* ./ rmdir deopt-bundles find . -name '*.ll' | xargs gsed -i 's/-rs4gc-use-deopt-bundles //g' ``` llvm-svn: 259129
Diffstat (limited to 'llvm/test/Transforms/RewriteStatepointsForGC/liveness-basics.ll')
-rw-r--r--llvm/test/Transforms/RewriteStatepointsForGC/liveness-basics.ll81
1 files changed, 40 insertions, 41 deletions
diff --git a/llvm/test/Transforms/RewriteStatepointsForGC/liveness-basics.ll b/llvm/test/Transforms/RewriteStatepointsForGC/liveness-basics.ll
index 207003c17b5..9c848e52faf 100644
--- a/llvm/test/Transforms/RewriteStatepointsForGC/liveness-basics.ll
+++ b/llvm/test/Transforms/RewriteStatepointsForGC/liveness-basics.ll
@@ -2,73 +2,72 @@
; correct live values at statepoints
; RUN: opt -rewrite-statepoints-for-gc -spp-rematerialization-threshold=0 -S < %s | FileCheck %s
-
; Tests to make sure we consider %obj live in both the taken and untaken
; predeccessor of merge.
+
define i64 addrspace(1)* @test1(i1 %cmp, i64 addrspace(1)* %obj) gc "statepoint-example" {
; CHECK-LABEL: @test1
entry:
br i1 %cmp, label %taken, label %untaken
-taken:
+taken: ; preds = %entry
; CHECK-LABEL: taken:
; CHECK-NEXT: gc.statepoint
; CHECK-NEXT: %obj.relocated = call coldcc i8 addrspace(1)*
; CHECK-NEXT: bitcast
; CHECK-NEXT: br label %merge
- call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0)
+ call void @foo() [ "deopt"() ]
br label %merge
-untaken:
+untaken: ; preds = %entry
; CHECK-LABEL: untaken:
; CHECK-NEXT: gc.statepoint
-; CHECK-NEXT: %obj.relocated1 = call coldcc i8 addrspace(1)*
+; CHECK-NEXT: %obj.relocated2 = call coldcc i8 addrspace(1)*
; CHECK-NEXT: bitcast
; CHECK-NEXT: br label %merge
- call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0)
+ call void @foo() [ "deopt"() ]
br label %merge
-merge:
+merge: ; preds = %untaken, %taken
; CHECK-LABEL: merge:
-; CHECK-NEXT: %.0 = phi i64 addrspace(1)* [ %obj.relocated.casted, %taken ], [ %obj.relocated1.casted, %untaken ]
+; CHECK-NEXT: %.0 = phi i64 addrspace(1)* [ %obj.relocated.casted, %taken ], [ %obj.relocated2.casted, %untaken ]
; CHECK-NEXT: ret i64 addrspace(1)* %.0
+; A local kill should not effect liveness in predecessor block
ret i64 addrspace(1)* %obj
}
-; A local kill should not effect liveness in predecessor block
define i64 addrspace(1)* @test2(i1 %cmp, i64 addrspace(1)** %loc) gc "statepoint-example" {
; CHECK-LABEL: @test2
entry:
; CHECK-LABEL: entry:
; CHECK-NEXT: gc.statepoint
; CHECK-NEXT: br
- call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0)
+ call void @foo() [ "deopt"() ]
br i1 %cmp, label %taken, label %untaken
-taken:
+taken: ; preds = %entry
; CHECK-LABEL: taken:
; CHECK-NEXT: %obj = load
; CHECK-NEXT: gc.statepoint
; CHECK-NEXT: gc.relocate
; CHECK-NEXT: bitcast
; CHECK-NEXT: ret i64 addrspace(1)* %obj.relocated.casted
-
+; A local kill should effect values live from a successor phi. Also, we
+; should only propagate liveness from a phi to the appropriate predecessors.
%obj = load i64 addrspace(1)*, i64 addrspace(1)** %loc
- call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0)
+ call void @foo() [ "deopt"() ]
ret i64 addrspace(1)* %obj
-untaken:
+untaken: ; preds = %entry
ret i64 addrspace(1)* null
}
-; A local kill should effect values live from a successor phi. Also, we
-; should only propagate liveness from a phi to the appropriate predecessors.
define i64 addrspace(1)* @test3(i1 %cmp, i64 addrspace(1)** %loc) gc "statepoint-example" {
; CHECK-LABEL: @test3
entry:
br i1 %cmp, label %taken, label %untaken
-taken:
+taken: ; preds = %entry
; CHECK-LABEL: taken:
; CHECK-NEXT: gc.statepoint
; CHECK-NEXT: %obj = load
@@ -76,25 +75,25 @@ taken:
; CHECK-NEXT: %obj.relocated = call coldcc i8 addrspace(1)*
; CHECK-NEXT: bitcast
; CHECK-NEXT: br label %merge
- call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0)
+ call void @foo() [ "deopt"() ]
%obj = load i64 addrspace(1)*, i64 addrspace(1)** %loc
- call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0)
+ call void @foo() [ "deopt"() ]
br label %merge
-untaken:
+untaken: ; preds = %entry
; CHECK-LABEL: taken:
; CHECK-NEXT: gc.statepoint
; CHECK-NEXT: br label %merge
- call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0)
+; A base pointer must be live if it is needed at a later statepoint,
+; even if the base pointer is otherwise unused.
+ call void @foo() [ "deopt"() ]
br label %merge
-merge:
+merge: ; preds = %untaken, %taken
%phi = phi i64 addrspace(1)* [ %obj, %taken ], [ null, %untaken ]
ret i64 addrspace(1)* %phi
}
-; A base pointer must be live if it is needed at a later statepoint,
-; even if the base pointer is otherwise unused.
define i64 addrspace(1)* @test4(i1 %cmp, i64 addrspace(1)* %obj) gc "statepoint-example" {
; CHECK-LABEL: @test4
entry:
@@ -106,54 +105,55 @@ entry:
; CHECK-NEXT: %obj.relocated =
; CHECK-NEXT: bitcast
; CHECK-NEXT: gc.statepoint
-; CHECK-NEXT: %derived.relocated1 =
+; CHECK-NEXT: %derived.relocated2 =
; CHECK-NEXT: bitcast
+
; Note: It's legal to relocate obj again, but not strictly needed
-; CHECK-NEXT: %obj.relocated2 =
+; CHECK-NEXT: %obj.relocated3 =
; CHECK-NEXT: bitcast
-; CHECK-NEXT: ret i64 addrspace(1)* %derived.relocated1.casted
+; CHECK-NEXT: ret i64 addrspace(1)* %derived.relocated2.casted
;
+; Make sure that a phi def visited during iteration is considered a kill.
+; Also, liveness after base pointer analysis can change based on new uses,
+; not just new defs.
%derived = getelementptr i64, i64 addrspace(1)* %obj, i64 8
- call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0)
-
- call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0)
+ call void @foo() [ "deopt"() ]
+ call void @foo() [ "deopt"() ]
ret i64 addrspace(1)* %derived
}
-declare void @consume(...) readonly
+declare void @consume(...) readonly "gc-leaf-function"
-; Make sure that a phi def visited during iteration is considered a kill.
-; Also, liveness after base pointer analysis can change based on new uses,
-; not just new defs.
define i64 addrspace(1)* @test5(i1 %cmp, i64 addrspace(1)* %obj) gc "statepoint-example" {
; CHECK-LABEL: @test5
entry:
br i1 %cmp, label %taken, label %untaken
-taken:
+taken: ; preds = %entry
; CHECK-LABEL: taken:
; CHECK-NEXT: gc.statepoint
; CHECK-NEXT: %obj.relocated = call coldcc i8 addrspace(1)*
; CHECK-NEXT: bitcast
; CHECK-NEXT: br label %merge
- call token (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0)
+ call void @foo() [ "deopt"() ]
br label %merge
-untaken:
+untaken: ; preds = %entry
; CHECK-LABEL: untaken:
; CHECK-NEXT: br label %merge
br label %merge
-merge:
+merge: ; preds = %untaken, %taken
; CHECK-LABEL: merge:
; CHECK-NEXT: %.0 = phi i64 addrspace(1)*
; CHECK-NEXT: %obj2a = phi
; CHECK-NEXT: @consume
; CHECK-NEXT: br label %final
- %obj2a = phi i64 addrspace(1)* [ %obj, %taken ], [null, %untaken]
+ %obj2a = phi i64 addrspace(1)* [ %obj, %taken ], [ null, %untaken ]
call void (...) @consume(i64 addrspace(1)* %obj2a)
br label %final
-final:
+
+final: ; preds = %merge
; CHECK-LABEL: final:
; CHECK-NEXT: @consume
; CHECK-NEXT: ret i64 addrspace(1)* %.0
@@ -163,4 +163,3 @@ final:
declare void @foo()
-declare token @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...)
OpenPOWER on IntegriCloud