blob: 9c848e52faf9583c2e11acbb1f61455b9973d3ad [file] [log] [blame]
Philip Reames8106a262015-04-10 22:58:39 +00001; A collection of liveness test cases to ensure we're reporting the
2; correct live values at statepoints
Igor Laevskye0317182015-05-19 15:59:05 +00003; RUN: opt -rewrite-statepoints-for-gc -spp-rematerialization-threshold=0 -S < %s | FileCheck %s
Philip Reames8106a262015-04-10 22:58:39 +00004
Philip Reames8106a262015-04-10 22:58:39 +00005; Tests to make sure we consider %obj live in both the taken and untaken
6; predeccessor of merge.
Sanjoy Das04071082016-01-29 00:28:57 +00007
Philip Reames8106a262015-04-10 22:58:39 +00008define i64 addrspace(1)* @test1(i1 %cmp, i64 addrspace(1)* %obj) gc "statepoint-example" {
9; CHECK-LABEL: @test1
10entry:
11 br i1 %cmp, label %taken, label %untaken
12
Sanjoy Das04071082016-01-29 00:28:57 +000013taken: ; preds = %entry
Philip Reames8106a262015-04-10 22:58:39 +000014; CHECK-LABEL: taken:
15; CHECK-NEXT: gc.statepoint
Sanjoy Das89c54912015-05-11 18:49:34 +000016; CHECK-NEXT: %obj.relocated = call coldcc i8 addrspace(1)*
17; CHECK-NEXT: bitcast
Philip Reames8106a262015-04-10 22:58:39 +000018; CHECK-NEXT: br label %merge
Sanjoy Das04071082016-01-29 00:28:57 +000019 call void @foo() [ "deopt"() ]
Philip Reames8106a262015-04-10 22:58:39 +000020 br label %merge
21
Sanjoy Das04071082016-01-29 00:28:57 +000022untaken: ; preds = %entry
Philip Reames8106a262015-04-10 22:58:39 +000023; CHECK-LABEL: untaken:
24; CHECK-NEXT: gc.statepoint
Sanjoy Das04071082016-01-29 00:28:57 +000025; CHECK-NEXT: %obj.relocated2 = call coldcc i8 addrspace(1)*
Sanjoy Das89c54912015-05-11 18:49:34 +000026; CHECK-NEXT: bitcast
Philip Reames8106a262015-04-10 22:58:39 +000027; CHECK-NEXT: br label %merge
Sanjoy Das04071082016-01-29 00:28:57 +000028 call void @foo() [ "deopt"() ]
Philip Reames8106a262015-04-10 22:58:39 +000029 br label %merge
30
Sanjoy Das04071082016-01-29 00:28:57 +000031merge: ; preds = %untaken, %taken
Philip Reames8106a262015-04-10 22:58:39 +000032; CHECK-LABEL: merge:
Sanjoy Das04071082016-01-29 00:28:57 +000033; CHECK-NEXT: %.0 = phi i64 addrspace(1)* [ %obj.relocated.casted, %taken ], [ %obj.relocated2.casted, %untaken ]
Philip Reames8106a262015-04-10 22:58:39 +000034; CHECK-NEXT: ret i64 addrspace(1)* %.0
Sanjoy Das04071082016-01-29 00:28:57 +000035; A local kill should not effect liveness in predecessor block
Philip Reames8106a262015-04-10 22:58:39 +000036 ret i64 addrspace(1)* %obj
37}
38
Philip Reames8106a262015-04-10 22:58:39 +000039define i64 addrspace(1)* @test2(i1 %cmp, i64 addrspace(1)** %loc) gc "statepoint-example" {
40; CHECK-LABEL: @test2
41entry:
42; CHECK-LABEL: entry:
43; CHECK-NEXT: gc.statepoint
44; CHECK-NEXT: br
Sanjoy Das04071082016-01-29 00:28:57 +000045 call void @foo() [ "deopt"() ]
Philip Reames8106a262015-04-10 22:58:39 +000046 br i1 %cmp, label %taken, label %untaken
47
Sanjoy Das04071082016-01-29 00:28:57 +000048taken: ; preds = %entry
Philip Reames8106a262015-04-10 22:58:39 +000049; CHECK-LABEL: taken:
50; CHECK-NEXT: %obj = load
51; CHECK-NEXT: gc.statepoint
52; CHECK-NEXT: gc.relocate
Sanjoy Das89c54912015-05-11 18:49:34 +000053; CHECK-NEXT: bitcast
54; CHECK-NEXT: ret i64 addrspace(1)* %obj.relocated.casted
Sanjoy Das04071082016-01-29 00:28:57 +000055; A local kill should effect values live from a successor phi. Also, we
56; should only propagate liveness from a phi to the appropriate predecessors.
Philip Reames8106a262015-04-10 22:58:39 +000057 %obj = load i64 addrspace(1)*, i64 addrspace(1)** %loc
Sanjoy Das04071082016-01-29 00:28:57 +000058 call void @foo() [ "deopt"() ]
Philip Reames8106a262015-04-10 22:58:39 +000059 ret i64 addrspace(1)* %obj
60
Sanjoy Das04071082016-01-29 00:28:57 +000061untaken: ; preds = %entry
Philip Reames8106a262015-04-10 22:58:39 +000062 ret i64 addrspace(1)* null
63}
64
Philip Reames8106a262015-04-10 22:58:39 +000065define i64 addrspace(1)* @test3(i1 %cmp, i64 addrspace(1)** %loc) gc "statepoint-example" {
66; CHECK-LABEL: @test3
67entry:
68 br i1 %cmp, label %taken, label %untaken
69
Sanjoy Das04071082016-01-29 00:28:57 +000070taken: ; preds = %entry
Philip Reames8106a262015-04-10 22:58:39 +000071; CHECK-LABEL: taken:
72; CHECK-NEXT: gc.statepoint
73; CHECK-NEXT: %obj = load
74; CHECK-NEXT: gc.statepoint
Sanjoy Das89c54912015-05-11 18:49:34 +000075; CHECK-NEXT: %obj.relocated = call coldcc i8 addrspace(1)*
76; CHECK-NEXT: bitcast
Philip Reames8106a262015-04-10 22:58:39 +000077; CHECK-NEXT: br label %merge
Sanjoy Das04071082016-01-29 00:28:57 +000078 call void @foo() [ "deopt"() ]
Philip Reames8106a262015-04-10 22:58:39 +000079 %obj = load i64 addrspace(1)*, i64 addrspace(1)** %loc
Sanjoy Das04071082016-01-29 00:28:57 +000080 call void @foo() [ "deopt"() ]
Philip Reames8106a262015-04-10 22:58:39 +000081 br label %merge
82
Sanjoy Das04071082016-01-29 00:28:57 +000083untaken: ; preds = %entry
Philip Reames8106a262015-04-10 22:58:39 +000084; CHECK-LABEL: taken:
85; CHECK-NEXT: gc.statepoint
86; CHECK-NEXT: br label %merge
Sanjoy Das04071082016-01-29 00:28:57 +000087; A base pointer must be live if it is needed at a later statepoint,
88; even if the base pointer is otherwise unused.
89 call void @foo() [ "deopt"() ]
Philip Reames8106a262015-04-10 22:58:39 +000090 br label %merge
91
Sanjoy Das04071082016-01-29 00:28:57 +000092merge: ; preds = %untaken, %taken
Philip Reames8106a262015-04-10 22:58:39 +000093 %phi = phi i64 addrspace(1)* [ %obj, %taken ], [ null, %untaken ]
94 ret i64 addrspace(1)* %phi
95}
96
Philip Reames8106a262015-04-10 22:58:39 +000097define i64 addrspace(1)* @test4(i1 %cmp, i64 addrspace(1)* %obj) gc "statepoint-example" {
98; CHECK-LABEL: @test4
99entry:
100; CHECK-LABEL: entry:
101; CHECK-NEXT: %derived = getelementptr
102; CHECK-NEXT: gc.statepoint
Sanjoy Das89c54912015-05-11 18:49:34 +0000103; CHECK-NEXT: %derived.relocated =
104; CHECK-NEXT: bitcast
Philip Reames8106a262015-04-10 22:58:39 +0000105; CHECK-NEXT: %obj.relocated =
Sanjoy Das89c54912015-05-11 18:49:34 +0000106; CHECK-NEXT: bitcast
Philip Reames8106a262015-04-10 22:58:39 +0000107; CHECK-NEXT: gc.statepoint
Sanjoy Das04071082016-01-29 00:28:57 +0000108; CHECK-NEXT: %derived.relocated2 =
Sanjoy Das89c54912015-05-11 18:49:34 +0000109; CHECK-NEXT: bitcast
Sanjoy Das04071082016-01-29 00:28:57 +0000110
Philip Reames8106a262015-04-10 22:58:39 +0000111; Note: It's legal to relocate obj again, but not strictly needed
Sanjoy Das04071082016-01-29 00:28:57 +0000112; CHECK-NEXT: %obj.relocated3 =
Sanjoy Das89c54912015-05-11 18:49:34 +0000113; CHECK-NEXT: bitcast
Sanjoy Das04071082016-01-29 00:28:57 +0000114; CHECK-NEXT: ret i64 addrspace(1)* %derived.relocated2.casted
Philip Reames8106a262015-04-10 22:58:39 +0000115;
Philip Reames8106a262015-04-10 22:58:39 +0000116; Make sure that a phi def visited during iteration is considered a kill.
117; Also, liveness after base pointer analysis can change based on new uses,
118; not just new defs.
Sanjoy Das04071082016-01-29 00:28:57 +0000119 %derived = getelementptr i64, i64 addrspace(1)* %obj, i64 8
120 call void @foo() [ "deopt"() ]
121 call void @foo() [ "deopt"() ]
122 ret i64 addrspace(1)* %derived
123}
124
125declare void @consume(...) readonly "gc-leaf-function"
126
Philip Reames8106a262015-04-10 22:58:39 +0000127define i64 addrspace(1)* @test5(i1 %cmp, i64 addrspace(1)* %obj) gc "statepoint-example" {
128; CHECK-LABEL: @test5
129entry:
130 br i1 %cmp, label %taken, label %untaken
131
Sanjoy Das04071082016-01-29 00:28:57 +0000132taken: ; preds = %entry
Philip Reames8106a262015-04-10 22:58:39 +0000133; CHECK-LABEL: taken:
134; CHECK-NEXT: gc.statepoint
Sanjoy Das89c54912015-05-11 18:49:34 +0000135; CHECK-NEXT: %obj.relocated = call coldcc i8 addrspace(1)*
136; CHECK-NEXT: bitcast
Philip Reames8106a262015-04-10 22:58:39 +0000137; CHECK-NEXT: br label %merge
Sanjoy Das04071082016-01-29 00:28:57 +0000138 call void @foo() [ "deopt"() ]
Philip Reames8106a262015-04-10 22:58:39 +0000139 br label %merge
140
Sanjoy Das04071082016-01-29 00:28:57 +0000141untaken: ; preds = %entry
Philip Reames8106a262015-04-10 22:58:39 +0000142; CHECK-LABEL: untaken:
143; CHECK-NEXT: br label %merge
144 br label %merge
145
Sanjoy Das04071082016-01-29 00:28:57 +0000146merge: ; preds = %untaken, %taken
Philip Reames8106a262015-04-10 22:58:39 +0000147; CHECK-LABEL: merge:
148; CHECK-NEXT: %.0 = phi i64 addrspace(1)*
149; CHECK-NEXT: %obj2a = phi
150; CHECK-NEXT: @consume
151; CHECK-NEXT: br label %final
Sanjoy Das04071082016-01-29 00:28:57 +0000152 %obj2a = phi i64 addrspace(1)* [ %obj, %taken ], [ null, %untaken ]
David Blaikie23af6482015-04-16 23:24:18 +0000153 call void (...) @consume(i64 addrspace(1)* %obj2a)
Philip Reames8106a262015-04-10 22:58:39 +0000154 br label %final
Sanjoy Das04071082016-01-29 00:28:57 +0000155
156final: ; preds = %merge
Philip Reames8106a262015-04-10 22:58:39 +0000157; CHECK-LABEL: final:
158; CHECK-NEXT: @consume
159; CHECK-NEXT: ret i64 addrspace(1)* %.0
David Blaikie23af6482015-04-16 23:24:18 +0000160 call void (...) @consume(i64 addrspace(1)* %obj2a)
Philip Reames8106a262015-04-10 22:58:39 +0000161 ret i64 addrspace(1)* %obj
162}
163
164declare void @foo()
165