23
23
; CHECK-NEXT: br label %L3
24
24
25
25
; CHECK: L3:
26
- define void @preserve_branches (i8* %fptr , i1 %b , i1 %b2 ) {
27
- %pgcstack = call {}*** @julia.get_pgcstack ()
28
- %ptls = call {}*** @julia.ptls_states ()
29
- %ptls_i8 = bitcast {}*** %ptls to i8*
26
+ define void @preserve_branches (ptr %fptr , i1 %b , i1 %b2 ) {
27
+ %pgcstack = call ptr @julia.get_pgcstack ()
28
+ %ptls = call ptr @julia.ptls_states ()
29
+ %ptls_i8 = bitcast ptr %ptls to ptr
30
30
br i1 %b , label %L1 , label %L3
31
31
32
- L1:
33
- %v = call noalias {} addrspace (10 )* @julia.gc_alloc_obj (i8* %ptls_i8 , i64 8 , {} addrspace (10 )* @tag )
34
- %tok = call token (...) @llvm.julia.gc_preserve_begin ({} addrspace (10 )* nonnull %v )
32
+ L1: ; preds = %0
33
+ %v = call noalias ptr addrspace (10 ) @julia.gc_alloc_obj (ptr %ptls_i8 , i64 8 , ptr addrspace (10 ) @tag )
34
+ %tok = call token (...) @llvm.julia.gc_preserve_begin (ptr addrspace (10 ) nonnull %v )
35
35
call void @external_function ()
36
36
br i1 %b2 , label %L2 , label %L3
37
37
38
- L2:
38
+ L2: ; preds = %L1
39
39
call void @external_function ()
40
40
br label %L3
41
41
42
- L3:
42
+ L3: ; preds = %L2, %L1, %0
43
43
ret void
44
44
}
45
45
; CHECK-LABEL: }{{$}}
58
58
; CHECK-NEXT: br label %L3
59
59
60
60
; CHECK: L3:
61
- define void @preserve_branches2 (i8* %fptr , i1 %b , i1 %b2 ) {
62
- %pgcstack = call {}*** @julia.get_pgcstack ()
63
- %ptls = call {}*** @julia.ptls_states ()
64
- %ptls_i8 = bitcast {}*** %ptls to i8*
65
- %v2 = call {} addrspace (10 )* @external_function2 ()
61
+ define void @preserve_branches2 (ptr %fptr , i1 %b , i1 %b2 ) {
62
+ %pgcstack = call ptr @julia.get_pgcstack ()
63
+ %ptls = call ptr @julia.ptls_states ()
64
+ %ptls_i8 = bitcast ptr %ptls to ptr
65
+ %v2 = call ptr addrspace (10 ) @external_function2 ()
66
66
br i1 %b , label %L1 , label %L3
67
67
68
- L1:
69
- %v = call noalias {} addrspace (10 )* @julia.gc_alloc_obj (i8* %ptls_i8 , i64 8 , {} addrspace (10 )* @tag )
70
- %tok = call token (...) @llvm.julia.gc_preserve_begin ({} addrspace (10 )* %v , {} addrspace (10 )* nonnull %v2 )
68
+ L1: ; preds = %0
69
+ %v = call noalias ptr addrspace (10 ) @julia.gc_alloc_obj (ptr %ptls_i8 , i64 8 , ptr addrspace (10 ) @tag )
70
+ %tok = call token (...) @llvm.julia.gc_preserve_begin (ptr addrspace (10 ) %v , ptr addrspace (10 ) nonnull %v2 )
71
71
call void @external_function ()
72
72
br i1 %b2 , label %L2 , label %L3
73
73
74
- L2:
74
+ L2: ; preds = %L1
75
75
call void @external_function ()
76
76
br label %L3
77
77
78
- L3:
78
+ L3: ; preds = %L2, %L1, %0
79
79
ret void
80
80
}
81
81
; CHECK-LABEL: }{{$}}
85
85
; CHECK-NOT: alloca i96
86
86
; CHECK: ret void
87
87
define void @legal_int_types () {
88
- %pgcstack = call {}*** @julia.get_pgcstack ()
89
- %ptls = call {}*** @julia.ptls_states ()
90
- %ptls_i8 = bitcast {}*** %ptls to i8*
91
- %var1 = call {} addrspace (10 )* @julia.gc_alloc_obj (i8* %ptls_i8 , i64 12 , {} addrspace (10 )* @tag )
92
- %var2 = addrspacecast {} addrspace (10 )* %var1 to {} addrspace (11 )*
93
- %var3 = call {}* @julia.pointer_from_objref ({} addrspace (11 )* %var2 )
88
+ %pgcstack = call ptr @julia.get_pgcstack ()
89
+ %ptls = call ptr @julia.ptls_states ()
90
+ %ptls_i8 = bitcast ptr %ptls to ptr
91
+ %var1 = call ptr addrspace (10 ) @julia.gc_alloc_obj (ptr %ptls_i8 , i64 12 , ptr addrspace (10 ) @tag )
92
+ %var2 = addrspacecast ptr addrspace (10 ) %var1 to ptr addrspace (11 )
93
+ %var3 = call ptr @julia.pointer_from_objref (ptr addrspace (11 ) %var2 )
94
94
ret void
95
95
}
96
96
; CHECK-LABEL: }{{$}}
97
97
98
-
99
98
declare void @external_function ()
100
- declare {} addrspace (10 )* @external_function2 ()
101
- declare {}*** @julia.ptls_states ()
102
- declare {}*** @julia.get_pgcstack ()
103
- declare noalias {} addrspace (10 )* @julia.gc_alloc_obj (i8* , i64 , {} addrspace (10 )*)
104
- declare {}* @julia.pointer_from_objref ({} addrspace (11 )*)
105
- declare void @llvm.memcpy.p11i8.p0i8.i64 (i8 addrspace (11 )* nocapture writeonly , i8* nocapture readonly , i64 , i32 , i1 )
106
- declare void @llvm.memcpy.p0i8.p0i8.i64 (i8* nocapture writeonly , i8* nocapture readonly , i64 , i1 )
99
+
100
+ declare ptr addrspace (10 ) @external_function2 ()
101
+
102
+ declare ptr @julia.ptls_states ()
103
+
104
+ declare ptr @julia.get_pgcstack ()
105
+
106
+ declare noalias ptr addrspace (10 ) @julia.gc_alloc_obj (ptr , i64 , ptr addrspace (10 ))
107
+
108
+ declare ptr @julia.pointer_from_objref (ptr addrspace (11 ))
109
+
107
110
declare token @llvm.julia.gc_preserve_begin (...)
111
+
108
112
declare void @llvm.julia.gc_preserve_end (token)
109
113
110
114
; CHECK-LABEL: @memref_collision
@@ -121,44 +125,76 @@ declare void @llvm.julia.gc_preserve_end(token)
121
125
; CHECK: L2:
122
126
; CHECK: load i
123
127
define void @memref_collision (i64 %x ) {
124
- %pgcstack = call {}*** @julia.get_pgcstack ()
125
- %ptls = call {}*** @julia.ptls_states ()
126
- %ptls_i8 = bitcast {}*** %ptls to i8*
127
- %v = call noalias {} addrspace (10 )* @julia.gc_alloc_obj (i8* %ptls_i8 , i64 8 , {} addrspace (10 )* @tag )
128
- %v_p = bitcast {} addrspace (10 )* %v to i64 addrspace (10 )*
129
- store i64 %x , i64 addrspace (10 )* %v_p
130
- br i1 0 , label %L1 , label %L2
131
-
132
- L1:
133
- %v1 = bitcast {} addrspace (10 )* %v to {} addrspace (10 )* addrspace ( 10 )*
134
- %v1_x = load {} addrspace (10 )*, {} addrspace (10 )* addrspace ( 10 )* %v1
128
+ %pgcstack = call ptr @julia.get_pgcstack ()
129
+ %ptls = call ptr @julia.ptls_states ()
130
+ %ptls_i8 = bitcast ptr %ptls to ptr
131
+ %v = call noalias ptr addrspace (10 ) @julia.gc_alloc_obj (ptr %ptls_i8 , i64 8 , ptr addrspace (10 ) @tag )
132
+ %v_p = bitcast ptr addrspace (10 ) %v to ptr addrspace (10 )
133
+ store i64 %x , ptr addrspace (10 ) %v_p , align 4
134
+ br i1 false , label %L1 , label %L2
135
+
136
+ L1: ; preds = %0
137
+ %v1 = bitcast ptr addrspace (10 ) %v to ptr addrspace (10 )
138
+ %v1_x = load ptr addrspace (10 ), ptr addrspace (10 ) %v1 , align 8
135
139
ret void
136
140
137
- L2:
138
- %v2 = bitcast {} addrspace (10 )* %v to i64 addrspace (10 )*
139
- %v2_x = load i64 , i64 addrspace (10 )* %v2
141
+ L2: ; preds = %0
142
+ %v2 = bitcast ptr addrspace (10 ) %v to ptr addrspace (10 )
143
+ %v2_x = load i64 , ptr addrspace (10 ) %v2 , align 4
140
144
ret void
141
145
}
146
+
142
147
; CHECK-LABEL: }{{$}}
143
148
144
149
; CHECK-LABEL: @lifetime_no_preserve_end
145
150
; CHECK: alloca
146
151
; CHECK-NOT: call token(...) @llvm.julia.gc_preserve_begin
147
152
; CHECK: call void @llvm.lifetime.start
148
153
; CHECK-NOT: call void @llvm.lifetime.end
149
- define void @lifetime_no_preserve_end ({}* noalias nocapture noundef nonnull sret ({}) %0 ) {
150
- %pgcstack = call {}*** @julia.get_pgcstack ()
151
- %ptls = call {}*** @julia.ptls_states ()
152
- %ptls_i8 = bitcast {}*** %ptls to i8*
153
- %v = call noalias {} addrspace (10 )* @julia.gc_alloc_obj (i8* %ptls_i8 , i64 8 , {} addrspace (10 )* @tag )
154
- %token = call token (...) @llvm.julia.gc_preserve_begin ({} addrspace (10 )* %v )
155
- %v_derived = addrspacecast {} addrspace (10 )* %v to {} addrspace (11 )*
156
- %ptr = call nonnull {}* @julia.pointer_from_objref ({} addrspace (11 )* %v_derived )
157
- %ptr_raw = bitcast {}* %ptr to i8*
158
- call void @external_function () ; safepoint
159
- %ret_raw = bitcast {}* %0 to i8*
160
- call void @llvm.memcpy.p0i8.p0i8 .i64 (i8* align 8 %ret_raw , i8 * align 8 %ptr_raw , i64 0 , i1 false )
161
- %ret_raw2 = bitcast {}* %0 to i8*
154
+ define void @lifetime_no_preserve_end (ptr noalias nocapture noundef nonnull sret ({}) %0 ) {
155
+ %pgcstack = call ptr @julia.get_pgcstack ()
156
+ %ptls = call ptr @julia.ptls_states ()
157
+ %ptls_i8 = bitcast ptr %ptls to ptr
158
+ %v = call noalias ptr addrspace (10 ) @julia.gc_alloc_obj (ptr %ptls_i8 , i64 8 , ptr addrspace (10 ) @tag )
159
+ %token = call token (...) @llvm.julia.gc_preserve_begin (ptr addrspace (10 ) %v )
160
+ %v_derived = addrspacecast ptr addrspace (10 ) %v to ptr addrspace (11 )
161
+ %ptr = call nonnull ptr @julia.pointer_from_objref (ptr addrspace (11 ) %v_derived )
162
+ %ptr_raw = bitcast ptr %ptr to ptr
163
+ call void @external_function ()
164
+ %ret_raw = bitcast ptr %0 to ptr
165
+ call void @llvm.memcpy.p0.p0 .i64 (ptr align 8 %ret_raw , ptr align 8 %ptr_raw , i64 0 , i1 false )
166
+ %ret_raw2 = bitcast ptr %0 to ptr
162
167
ret void
163
168
}
164
169
; CHECK-LABEL: }{{$}}
170
+
171
+ ; Test that the pass handles dead basic blocks with references to the allocation
172
+ ; CHECK-LABEL: @nopreds
173
+ ; CHECK: alloca i8, i64 0, align 1
174
+ ; CHECK: call void @llvm.lifetime.start
175
+ define swiftcc { ptr addrspace (10 ), i8 } @nopreds () {
176
+ top:
177
+ %0 = call ptr addrspace (10 ) @julia.gc_alloc_obj (ptr null , i64 0 , ptr addrspace (10 ) null )
178
+ %1 = addrspacecast ptr addrspace (10 ) %0 to ptr addrspace (11 )
179
+ br label %common.ret
180
+
181
+ common .ret: ; preds = %union_move9, %top
182
+ ret { ptr addrspace (10 ), i8 } zeroinitializer
183
+
184
+ union_move9: ; No predecessors!
185
+ call void @llvm.memcpy.p0.p11.i64 (ptr null , ptr addrspace (11 ) %1 , i64 0 , i1 false )
186
+ br label %common.ret
187
+ }
188
+ ; CHECK-LABEL: }{{$}}
189
+
190
+ ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
191
+ declare void @llvm.memcpy.p11.p0.i64 (ptr addrspace (11 ) noalias nocapture writeonly , ptr noalias nocapture readonly , i64 , i1 immarg) #0
192
+ ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
193
+ declare void @llvm.memcpy.p0.p11.i64 (ptr noalias nocapture writeonly , ptr addrspace (11 ) noalias nocapture readonly , i64 , i1 immarg) #0
194
+ ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
195
+ declare void @llvm.memcpy.p0.p0.i64 (ptr noalias nocapture writeonly , ptr noalias nocapture readonly , i64 , i1 immarg) #0
196
+
197
+ attributes #0 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
198
+ attributes #1 = { allockind("alloc" ) }
199
+ attributes #2 = { allockind("alloc,uninitialized" ) }
200
+ attributes #3 = { allockind("alloc,zeroed" ) }
0 commit comments