Auto merge of #31545 - dotdash:no_noalias, r=alexcrichton
LLVM's memory dependence analysis doesn't properly account for calls that could unwind and thus effectively act as a branching point. This can lead to stores that are only visible when the call unwinds being removed, possibly leading to calls to drop() functions with b0rked memory contents. As there is no fix for this in LLVM yet and we want to keep compatibility to current LLVM versions anyways, we have to workaround this bug by omitting the noalias attribute on &mut function arguments. Benchmarks suggest that the performance loss by this change is very small. Thanks to @RalfJung for pushing me towards not removing too many noalias annotations and @alexcrichton for helping out with the test for this bug. Fixes #29485
This commit is contained in:
commit
98ec51a4dd
4 changed files with 58 additions and 4 deletions
26
src/test/auxiliary/issue-29485.rs
Normal file
26
src/test/auxiliary/issue-29485.rs
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
#![crate_name="a"]
|
||||
#![crate_type = "lib"]
|
||||
|
||||
pub struct X(pub u8);
|
||||
|
||||
impl Drop for X {
|
||||
fn drop(&mut self) {
|
||||
assert_eq!(self.0, 1)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn f(x: &mut X, g: fn()) {
|
||||
x.0 = 1;
|
||||
g();
|
||||
x.0 = 0;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue