Sadly I don't think so. I think that this was around primarily for `free(malloc(size))` to get optimized away.

```rust
pub struct c_void { wut: u8 }

extern {
    fn malloc(s: uint) -> *mut c_void;
    fn free(s: *mut c_void);
}

fn main() {
    unsafe {
        let a = malloc(4);
        free(a);
    }
}
```

```
$ rustc foo.rs --emit=ir -o - -O      
; ModuleID = '-.rs'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-apple-darwin"

%struct.c_void = type { i8 }

; Function Attrs: nounwind
declare noalias %struct.c_void* @malloc(i64) unnamed_addr #0

; Function Attrs: nounwind
declare void @free(%struct.c_void* nocapture) unnamed_addr #0

; Function Attrs: nounwind uwtable
define internal void @_ZN4main20h1284b3d9a92c1d91yaa4v0.0E() unnamed_addr #1 {
entry-block:
  %0 = tail call %struct.c_void* @malloc(i64 4)
  tail call void @free(%struct.c_void* %0)
  ret void
}

define i64 @main(i64, i8**) unnamed_addr {
top:
  %2 = tail call i64 @_ZN10lang_start20he5bbdca974ae42c3eqd9v0.11.preE(i8* bitcast (void ()* @_ZN4main20h1284b3d9a92c1d91yaa4v0.0E to i8*), i64 %0, i8** %1)
  ret i64 %2
}

declare i64 @_ZN10lang_start20he5bbdca974ae42c3eqd9v0.11.preE(i8*, i64, i8**) unnamed_addr

attributes #0 = { nounwind }
attributes #1 = { nounwind uwtable }
```