@@ -154,8 +154,6 @@ fn call_simple_intrinsic<'ll, 'tcx>(
154
154
sym:: roundf64 => ( "llvm.round" , & [ bx. type_f64 ( ) ] ) ,
155
155
sym:: roundf128 => ( "llvm.round" , & [ bx. type_f128 ( ) ] ) ,
156
156
157
- sym:: ptr_mask => ( "llvm.ptrmask" , & [ bx. type_ptr ( ) , bx. type_isize ( ) ] ) ,
158
-
159
157
_ => return None ,
160
158
} ;
161
159
Some ( bx. call_intrinsic (
@@ -181,6 +179,14 @@ impl<'ll, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'_, 'll, 'tcx> {
181
179
let simple = call_simple_intrinsic ( self , name, args) ;
182
180
let llval = match name {
183
181
_ if simple. is_some ( ) => simple. unwrap ( ) ,
182
+ sym:: ptr_mask => {
183
+ let ptr = args[ 0 ] . immediate ( ) ;
184
+ self . call_intrinsic (
185
+ "llvm.ptrmask" ,
186
+ & [ self . val_ty ( ptr) , self . type_isize ( ) ] ,
187
+ & [ ptr, args[ 1 ] . immediate ( ) ] ,
188
+ )
189
+ }
184
190
sym:: is_val_statically_known => {
185
191
if let OperandValue :: Immediate ( imm) = args[ 0 ] . val {
186
192
self . call_intrinsic (
@@ -232,11 +238,14 @@ impl<'ll, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'_, 'll, 'tcx> {
232
238
return Ok ( ( ) ) ;
233
239
}
234
240
sym:: breakpoint => self . call_intrinsic ( "llvm.debugtrap" , & [ ] , & [ ] ) ,
235
- sym:: va_copy => self . call_intrinsic (
236
- "llvm.va_copy" ,
237
- & [ self . type_ptr ( ) ] ,
238
- & [ args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) ] ,
239
- ) ,
241
+ sym:: va_copy => {
242
+ let dest = args[ 0 ] . immediate ( ) ;
243
+ self . call_intrinsic (
244
+ "llvm.va_copy" ,
245
+ & [ self . val_ty ( dest) ] ,
246
+ & [ dest, args[ 1 ] . immediate ( ) ] ,
247
+ )
248
+ }
240
249
sym:: va_arg => {
241
250
match result. layout . backend_repr {
242
251
BackendRepr :: Scalar ( scalar) => {
@@ -309,15 +318,11 @@ impl<'ll, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'_, 'll, 'tcx> {
309
318
sym:: prefetch_write_instruction => ( 1 , 0 ) ,
310
319
_ => bug ! ( ) ,
311
320
} ;
321
+ let ptr = args[ 0 ] . immediate ( ) ;
312
322
self . call_intrinsic (
313
323
"llvm.prefetch" ,
314
- & [ self . type_ptr ( ) ] ,
315
- & [
316
- args[ 0 ] . immediate ( ) ,
317
- self . const_i32 ( rw) ,
318
- args[ 1 ] . immediate ( ) ,
319
- self . const_i32 ( cache_type) ,
320
- ] ,
324
+ & [ self . val_ty ( ptr) ] ,
325
+ & [ ptr, self . const_i32 ( rw) , args[ 1 ] . immediate ( ) , self . const_i32 ( cache_type) ] ,
321
326
)
322
327
}
323
328
sym:: carrying_mul_add => {
@@ -637,11 +642,11 @@ impl<'ll, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'_, 'll, 'tcx> {
637
642
}
638
643
639
644
fn va_start ( & mut self , va_list : & ' ll Value ) -> & ' ll Value {
640
- self . call_intrinsic ( "llvm.va_start" , & [ self . type_ptr ( ) ] , & [ va_list] )
645
+ self . call_intrinsic ( "llvm.va_start" , & [ self . val_ty ( va_list ) ] , & [ va_list] )
641
646
}
642
647
643
648
fn va_end ( & mut self , va_list : & ' ll Value ) -> & ' ll Value {
644
- self . call_intrinsic ( "llvm.va_end" , & [ self . type_ptr ( ) ] , & [ va_list] )
649
+ self . call_intrinsic ( "llvm.va_end" , & [ self . val_ty ( va_list ) ] , & [ va_list] )
645
650
}
646
651
}
647
652
@@ -1018,7 +1023,7 @@ fn codegen_emcc_try<'ll, 'tcx>(
1018
1023
let selector = bx. extract_value ( vals, 1 ) ;
1019
1024
1020
1025
// Check if the typeid we got is the one for a Rust panic.
1021
- let rust_typeid = bx. call_intrinsic ( "llvm.eh.typeid.for" , & [ bx. type_ptr ( ) ] , & [ tydesc] ) ;
1026
+ let rust_typeid = bx. call_intrinsic ( "llvm.eh.typeid.for" , & [ bx. val_ty ( tydesc ) ] , & [ tydesc] ) ;
1022
1027
let is_rust_panic = bx. icmp ( IntPredicate :: IntEQ , selector, rust_typeid) ;
1023
1028
let is_rust_panic = bx. zext ( is_rust_panic, bx. type_bool ( ) ) ;
1024
1029
0 commit comments