21
21
; CHECK-NEXT: br label %L3
22
22
23
23
; CHECK: L3:
24
- define void @preserve_branches (i8* %fptr , i1 %b , i1 %b2 ) {
25
- %pgcstack = call {}*** @julia.get_pgcstack ()
26
- %ptls = call {}*** @julia.ptls_states ()
27
- %ptls_i8 = bitcast {}*** %ptls to i8*
24
+ define void @preserve_branches (ptr %fptr , i1 %b , i1 %b2 ) {
25
+ %pgcstack = call ptr @julia.get_pgcstack ()
26
+ %ptls = call ptr @julia.ptls_states ()
27
+ %ptls_i8 = bitcast ptr %ptls to ptr
28
28
br i1 %b , label %L1 , label %L3
29
29
30
- L1:
31
- %v = call noalias {} addrspace (10 )* @julia.gc_alloc_obj (i8* %ptls_i8 , i64 8 , {} addrspace (10 )* @tag )
32
- %tok = call token (...) @llvm.julia.gc_preserve_begin ({} addrspace (10 )* nonnull %v )
30
+ L1: ; preds = %0
31
+ %v = call noalias ptr addrspace (10 ) @julia.gc_alloc_obj (ptr %ptls_i8 , i64 8 , ptr addrspace (10 ) @tag )
32
+ %tok = call token (...) @llvm.julia.gc_preserve_begin (ptr addrspace (10 ) nonnull %v )
33
33
call void @external_function ()
34
34
br i1 %b2 , label %L2 , label %L3
35
35
36
- L2:
36
+ L2: ; preds = %L1
37
37
call void @external_function ()
38
38
br label %L3
39
39
40
- L3:
40
+ L3: ; preds = %L2, %L1, %0
41
41
ret void
42
42
}
43
43
; CHECK-LABEL: }{{$}}
56
56
; CHECK-NEXT: br label %L3
57
57
58
58
; CHECK: L3:
59
- define void @preserve_branches2 (i8* %fptr , i1 %b , i1 %b2 ) {
60
- %pgcstack = call {}*** @julia.get_pgcstack ()
61
- %ptls = call {}*** @julia.ptls_states ()
62
- %ptls_i8 = bitcast {}*** %ptls to i8*
63
- %v2 = call {} addrspace (10 )* @external_function2 ()
59
+ define void @preserve_branches2 (ptr %fptr , i1 %b , i1 %b2 ) {
60
+ %pgcstack = call ptr @julia.get_pgcstack ()
61
+ %ptls = call ptr @julia.ptls_states ()
62
+ %ptls_i8 = bitcast ptr %ptls to ptr
63
+ %v2 = call ptr addrspace (10 ) @external_function2 ()
64
64
br i1 %b , label %L1 , label %L3
65
65
66
- L1:
67
- %v = call noalias {} addrspace (10 )* @julia.gc_alloc_obj (i8* %ptls_i8 , i64 8 , {} addrspace (10 )* @tag )
68
- %tok = call token (...) @llvm.julia.gc_preserve_begin ({} addrspace (10 )* %v , {} addrspace (10 )* nonnull %v2 )
66
+ L1: ; preds = %0
67
+ %v = call noalias ptr addrspace (10 ) @julia.gc_alloc_obj (ptr %ptls_i8 , i64 8 , ptr addrspace (10 ) @tag )
68
+ %tok = call token (...) @llvm.julia.gc_preserve_begin (ptr addrspace (10 ) %v , ptr addrspace (10 ) nonnull %v2 )
69
69
call void @external_function ()
70
70
br i1 %b2 , label %L2 , label %L3
71
71
72
- L2:
72
+ L2: ; preds = %L1
73
73
call void @external_function ()
74
74
br label %L3
75
75
76
- L3:
76
+ L3: ; preds = %L2, %L1, %0
77
77
ret void
78
78
}
79
79
; CHECK-LABEL: }{{$}}
84
84
; CHECK: store [12 x i8] zeroinitializer,
85
85
; CHECK: ret void
86
86
define void @legal_int_types () {
87
- %pgcstack = call {}*** @julia.get_pgcstack ()
88
- %ptls = call {}*** @julia.ptls_states ()
89
- %ptls_i8 = bitcast {}*** %ptls to i8*
90
- %var1 = call {} addrspace (10 )* @julia.gc_alloc_obj (i8* %ptls_i8 , i64 12 , {} addrspace (10 )* @tag )
91
- %var2 = addrspacecast {} addrspace (10 )* %var1 to {} addrspace (11 )*
92
- %var3 = call {}* @julia.pointer_from_objref ({} addrspace (11 )* %var2 )
87
+ %pgcstack = call ptr @julia.get_pgcstack ()
88
+ %ptls = call ptr @julia.ptls_states ()
89
+ %ptls_i8 = bitcast ptr %ptls to ptr
90
+ %var1 = call ptr addrspace (10 ) @julia.gc_alloc_obj (ptr %ptls_i8 , i64 12 , ptr addrspace (10 ) @tag )
91
+ %var2 = addrspacecast ptr addrspace (10 ) %var1 to ptr addrspace (11 )
92
+ %var3 = call ptr @julia.pointer_from_objref (ptr addrspace (11 ) %var2 )
93
93
ret void
94
94
}
95
95
; CHECK-LABEL: }{{$}}
96
96
97
-
98
97
declare void @external_function ()
99
- declare {} addrspace (10 )* @external_function2 ()
100
- declare {}*** @julia.ptls_states ()
101
- declare {}*** @julia.get_pgcstack ()
102
- declare noalias {} addrspace (10 )* @julia.gc_alloc_obj (i8* , i64 , {} addrspace (10 )*)
103
- declare {}* @julia.pointer_from_objref ({} addrspace (11 )*)
104
- declare void @llvm.memcpy.p11i8.p0i8.i64 (i8 addrspace (11 )* nocapture writeonly , i8* nocapture readonly , i64 , i32 , i1 )
105
- declare void @llvm.memcpy.p0i8.p0i8.i64 (i8* nocapture writeonly , i8* nocapture readonly , i64 , i1 )
98
+
99
+ declare ptr addrspace (10 ) @external_function2 ()
100
+
101
+ declare ptr @julia.ptls_states ()
102
+
103
+ declare ptr @julia.get_pgcstack ()
104
+
105
+ declare noalias ptr addrspace (10 ) @julia.gc_alloc_obj (ptr , i64 , ptr addrspace (10 ))
106
+
107
+ declare ptr @julia.pointer_from_objref (ptr addrspace (11 ))
108
+
106
109
declare token @llvm.julia.gc_preserve_begin (...)
110
+
107
111
declare void @llvm.julia.gc_preserve_end (token)
108
112
109
113
; CHECK-LABEL: @memref_collision
@@ -120,24 +124,25 @@ declare void @llvm.julia.gc_preserve_end(token)
120
124
; CHECK: L2:
121
125
; CHECK: load i
122
126
define void @memref_collision (i64 %x ) {
123
- %pgcstack = call {}*** @julia.get_pgcstack ()
124
- %ptls = call {}*** @julia.ptls_states ()
125
- %ptls_i8 = bitcast {}*** %ptls to i8*
126
- %v = call noalias {} addrspace (10 )* @julia.gc_alloc_obj (i8* %ptls_i8 , i64 8 , {} addrspace (10 )* @tag )
127
- %v_p = bitcast {} addrspace (10 )* %v to i64 addrspace (10 )*
128
- store i64 %x , i64 addrspace (10 )* %v_p
129
- br i1 0 , label %L1 , label %L2
130
-
131
- L1:
132
- %v1 = bitcast {} addrspace (10 )* %v to {} addrspace (10 )* addrspace ( 10 )*
133
- %v1_x = load {} addrspace (10 )*, {} addrspace (10 )* addrspace ( 10 )* %v1
127
+ %pgcstack = call ptr @julia.get_pgcstack ()
128
+ %ptls = call ptr @julia.ptls_states ()
129
+ %ptls_i8 = bitcast ptr %ptls to ptr
130
+ %v = call noalias ptr addrspace (10 ) @julia.gc_alloc_obj (ptr %ptls_i8 , i64 8 , ptr addrspace (10 ) @tag )
131
+ %v_p = bitcast ptr addrspace (10 ) %v to ptr addrspace (10 )
132
+ store i64 %x , ptr addrspace (10 ) %v_p , align 4
133
+ br i1 false , label %L1 , label %L2
134
+
135
+ L1: ; preds = %0
136
+ %v1 = bitcast ptr addrspace (10 ) %v to ptr addrspace (10 )
137
+ %v1_x = load ptr addrspace (10 ), ptr addrspace (10 ) %v1 , align 8
134
138
ret void
135
139
136
- L2:
137
- %v2 = bitcast {} addrspace (10 )* %v to i64 addrspace (10 )*
138
- %v2_x = load i64 , i64 addrspace (10 )* %v2
140
+ L2: ; preds = %0
141
+ %v2 = bitcast ptr addrspace (10 ) %v to ptr addrspace (10 )
142
+ %v2_x = load i64 , ptr addrspace (10 ) %v2 , align 4
139
143
ret void
140
144
}
145
+
141
146
; CHECK-LABEL: }{{$}}
142
147
143
148
; CHECK-LABEL: @lifetime_no_preserve_end
@@ -146,19 +151,19 @@ L2:
146
151
; CHECK: call void @llvm.lifetime.start
147
152
; CHECK: store [8 x i8] zeroinitializer,
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: }{{$}}
@@ -175,26 +180,49 @@ define void @lifetime_no_preserve_end({}* noalias nocapture noundef nonnull sret
175
180
; CHECK-NOT: zeroinitializer
176
181
; CHECK: ret void
177
182
define void @initializers () {
178
- %pgcstack = call {}*** @julia.get_pgcstack ()
179
- %ptls = call {}*** @julia.ptls_states ()
180
- %ptls_i8 = bitcast {}*** %ptls to i8*
181
-
182
- %var1 = call {} addrspace (10 )* @julia.gc_alloc_obj (i8* %ptls_i8 , i64 1 , {} addrspace (10 )* @tag ) #0
183
- %var2 = addrspacecast {} addrspace (10 )* %var1 to {} addrspace (11 )*
184
- %var3 = call {}* @julia.pointer_from_objref ({} addrspace (11 )* %var2 )
185
-
186
- %var4 = call {} addrspace (10 )* @julia.gc_alloc_obj (i8* %ptls_i8 , i64 2 , {} addrspace (10 )* @tag ) #1
187
- %var5 = addrspacecast {} addrspace (10 )* %var4 to {} addrspace (11 )*
188
- %var6 = call {}* @julia.pointer_from_objref ({} addrspace (11 )* %var5 )
189
-
190
- %var7 = call {} addrspace (10 )* @julia.gc_alloc_obj (i8* %ptls_i8 , i64 3 , {} addrspace (10 )* @tag ) #2
191
- %var8 = addrspacecast {} addrspace (10 )* %var7 to {} addrspace (11 )*
192
- %var9 = call {}* @julia.pointer_from_objref ({} addrspace (11 )* %var8 )
193
-
183
+ %pgcstack = call ptr @julia.get_pgcstack ()
184
+ %ptls = call ptr @julia.ptls_states ()
185
+ %ptls_i8 = bitcast ptr %ptls to ptr
186
+ %var1 = call ptr addrspace (10 ) @julia.gc_alloc_obj (ptr %ptls_i8 , i64 1 , ptr addrspace (10 ) @tag ) #1
187
+ %var2 = addrspacecast ptr addrspace (10 ) %var1 to ptr addrspace (11 )
188
+ %var3 = call ptr @julia.pointer_from_objref (ptr addrspace (11 ) %var2 )
189
+ %var4 = call ptr addrspace (10 ) @julia.gc_alloc_obj (ptr %ptls_i8 , i64 2 , ptr addrspace (10 ) @tag ) #2
190
+ %var5 = addrspacecast ptr addrspace (10 ) %var4 to ptr addrspace (11 )
191
+ %var6 = call ptr @julia.pointer_from_objref (ptr addrspace (11 ) %var5 )
192
+ %var7 = call ptr addrspace (10 ) @julia.gc_alloc_obj (ptr %ptls_i8 , i64 3 , ptr addrspace (10 ) @tag ) #3
193
+ %var8 = addrspacecast ptr addrspace (10 ) %var7 to ptr addrspace (11 )
194
+ %var9 = call ptr @julia.pointer_from_objref (ptr addrspace (11 ) %var8 )
194
195
ret void
195
196
}
196
197
; CHECK-LABEL: }{{$}}
197
198
198
- attributes #0 = { allockind("alloc" ) }
199
- attributes #1 = { allockind("alloc,uninitialized" ) }
200
- attributes #2 = { allockind("alloc,zeroed" ) }
199
+ ; Test that the pass handles dead basic blocks with references to the allocation
200
+ ; CHECK-LABEL: @nopreds
201
+ ; CHECK: alloca i8, i64 0, align 1
202
+ ; CHECK: call void @llvm.lifetime.start
203
+ define swiftcc { ptr addrspace (10 ), i8 } @nopreds () {
204
+ top:
205
+ %0 = call ptr addrspace (10 ) @julia.gc_alloc_obj (ptr null , i64 0 , ptr addrspace (10 ) null )
206
+ %1 = addrspacecast ptr addrspace (10 ) %0 to ptr addrspace (11 )
207
+ br label %common.ret
208
+
209
+ common .ret: ; preds = %union_move9, %top
210
+ ret { ptr addrspace (10 ), i8 } zeroinitializer
211
+
212
+ union_move9: ; No predecessors!
213
+ call void @llvm.memcpy.p0.p11.i64 (ptr null , ptr addrspace (11 ) %1 , i64 0 , i1 false )
214
+ br label %common.ret
215
+ }
216
+ ; CHECK-LABEL: }{{$}}
217
+
218
+ ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
219
+ declare void @llvm.memcpy.p11.p0.i64 (ptr addrspace (11 ) noalias nocapture writeonly , ptr noalias nocapture readonly , i64 , i1 immarg) #0
220
+ ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
221
+ declare void @llvm.memcpy.p0.p11.i64 (ptr noalias nocapture writeonly , ptr addrspace (11 ) noalias nocapture readonly , i64 , i1 immarg) #0
222
+ ; Function Attrs: nocallback nofree nounwind willreturn memory(argmem: readwrite)
223
+ declare void @llvm.memcpy.p0.p0.i64 (ptr noalias nocapture writeonly , ptr noalias nocapture readonly , i64 , i1 immarg) #0
224
+
225
+ attributes #0 = { nocallback nofree nounwind willreturn memory(argmem: readwrite) }
226
+ attributes #1 = { allockind("alloc" ) }
227
+ attributes #2 = { allockind("alloc,uninitialized" ) }
228
+ attributes #3 = { allockind("alloc,zeroed" ) }
0 commit comments