|  | //@ compile-flags: -Copt-level=3 | 
|  | #![crate_type = "lib"] | 
|  |  | 
|  | // This test checks that we can inline drop_in_place in | 
|  | // unwind landing pads. | 
|  |  | 
|  | // Without inlining, the box pointers escape via the call to drop_in_place, | 
|  | // and LLVM will not optimize out the pointer comparison. | 
|  | // With inlining, everything should be optimized out. | 
|  | // See https://github.com/rust-lang/rust/issues/46515 | 
|  | // CHECK-LABEL: @check_no_escape_in_landingpad | 
|  | // CHECK: start: | 
|  | // CHECK-NEXT: ; call __rustc::__rust_no_alloc_shim_is_unstable_v2 | 
|  | // CHECK-NEXT: tail call void @[[NO_ALLOC_SHIM:_R.+__rust_no_alloc_shim_is_unstable_v2]]() | 
|  | // CHECK-NEXT: ; call __rustc::__rust_no_alloc_shim_is_unstable_v2 | 
|  | // CHECK-NEXT: tail call void @[[NO_ALLOC_SHIM]]() | 
|  | // CHECK-NEXT: ret void | 
|  | #[no_mangle] | 
|  | pub fn check_no_escape_in_landingpad(f: fn()) { | 
|  | let x = &*Box::new(0); | 
|  | let y = &*Box::new(0); | 
|  |  | 
|  | if x as *const _ == y as *const _ { | 
|  | f(); | 
|  | } | 
|  | } | 
|  |  | 
|  | // Without inlining, the compiler can't tell that | 
|  | // dropping an empty string (in a landing pad) does nothing. | 
|  | // With inlining, the landing pad should be optimized out. | 
|  | // See https://github.com/rust-lang/rust/issues/87055 | 
|  | // CHECK-LABEL: @check_eliminate_noop_drop | 
|  | // CHECK: call void %g() | 
|  | // CHECK-NEXT: ret void | 
|  | #[no_mangle] | 
|  | pub fn check_eliminate_noop_drop(g: fn()) { | 
|  | let _var = String::new(); | 
|  | g(); | 
|  | } |