Do not put noalias annotations by default
This will be re-enabled sooner or later depending on results of further investigation. Fixes #54462
This commit is contained in:
parent
80e6e3e582
commit
9c62193fec
3 changed files with 48 additions and 10 deletions
|
|
@ -10,11 +10,9 @@
|
|||
|
||||
use abi::{FnType, FnTypeExt};
|
||||
use common::*;
|
||||
use llvm;
|
||||
use rustc::hir;
|
||||
use rustc::ty::{self, Ty, TypeFoldable};
|
||||
use rustc::ty::layout::{self, Align, LayoutOf, Size, TyLayout};
|
||||
use rustc_target::spec::PanicStrategy;
|
||||
use rustc_target::abi::FloatTy;
|
||||
use rustc_mir::monomorphize::item::DefPathBasedNames;
|
||||
use type_::Type;
|
||||
|
|
@ -433,12 +431,19 @@ impl<'tcx> LayoutLlvmExt<'tcx> for TyLayout<'tcx> {
|
|||
PointerKind::Shared
|
||||
},
|
||||
hir::MutMutable => {
|
||||
// Only emit noalias annotations for LLVM >= 6 or in panic=abort
|
||||
// mode, as prior versions had many bugs in conjunction with
|
||||
// unwinding. See also issue #31681.
|
||||
// Previously we would only emit noalias annotations for LLVM >= 6 or in
|
||||
// panic=abort mode. That was deemed right, as prior versions had many bugs
|
||||
// in conjunction with unwinding, but later versions didn’t seem to have
|
||||
// said issues. See issue #31681.
|
||||
//
|
||||
// Alas, later on we encountered a case where noalias would generate wrong
|
||||
// code altogether even with recent versions of LLVM in *safe* code with no
|
||||
// unwinding involved. See #54462.
|
||||
//
|
||||
// For now, do not enable mutable_noalias by default at all, while the
|
||||
// issue is being figured out.
|
||||
let mutable_noalias = cx.tcx.sess.opts.debugging_opts.mutable_noalias
|
||||
.unwrap_or(unsafe { llvm::LLVMRustVersionMajor() >= 6 }
|
||||
|| cx.tcx.sess.panic_strategy() == PanicStrategy::Abort);
|
||||
.unwrap_or(false);
|
||||
if mutable_noalias {
|
||||
PointerKind::UniqueBorrowed
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -53,13 +53,13 @@ pub fn named_borrow<'r>(_: &'r i32) {
|
|||
pub fn unsafe_borrow(_: &UnsafeInner) {
|
||||
}
|
||||
|
||||
// CHECK: @mutable_unsafe_borrow(i16* noalias dereferenceable(2) %arg0)
|
||||
// CHECK: @mutable_unsafe_borrow(i16* dereferenceable(2) %arg0)
|
||||
// ... unless this is a mutable borrow, those never alias
|
||||
#[no_mangle]
|
||||
pub fn mutable_unsafe_borrow(_: &mut UnsafeInner) {
|
||||
}
|
||||
|
||||
// CHECK: @mutable_borrow(i32* noalias dereferenceable(4) %arg0)
|
||||
// CHECK: @mutable_borrow(i32* dereferenceable(4) %arg0)
|
||||
// FIXME #25759 This should also have `nocapture`
|
||||
#[no_mangle]
|
||||
pub fn mutable_borrow(_: &mut i32) {
|
||||
|
|
@ -102,7 +102,7 @@ pub fn helper(_: usize) {
|
|||
pub fn slice(_: &[u8]) {
|
||||
}
|
||||
|
||||
// CHECK: @mutable_slice([0 x i8]* noalias nonnull %arg0.0, [[USIZE]] %arg0.1)
|
||||
// CHECK: @mutable_slice([0 x i8]* nonnull %arg0.0, [[USIZE]] %arg0.1)
|
||||
// FIXME #25759 This should also have `nocapture`
|
||||
#[no_mangle]
|
||||
pub fn mutable_slice(_: &mut [u8]) {
|
||||
|
|
|
|||
33
src/test/run-pass/issue-54462-mutable-noalias-correctness.rs
Normal file
33
src/test/run-pass/issue-54462-mutable-noalias-correctness.rs
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
// Copyright 2018 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.
|
||||
//
|
||||
// compile-flags: -Ccodegen-units=1 -O
|
||||
|
||||
fn linidx(row: usize, col: usize) -> usize {
|
||||
row * 1 + col * 3
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let mut mat = [1.0f32, 5.0, 9.0, 2.0, 6.0, 10.0, 3.0, 7.0, 11.0, 4.0, 8.0, 12.0];
|
||||
|
||||
for i in 0..2 {
|
||||
for j in i+1..3 {
|
||||
if mat[linidx(j, 3)] > mat[linidx(i, 3)] {
|
||||
for k in 0..4 {
|
||||
let (x, rest) = mat.split_at_mut(linidx(i, k) + 1);
|
||||
let a = x.last_mut().unwrap();
|
||||
let b = rest.get_mut(linidx(j, k) - linidx(i, k) - 1).unwrap();
|
||||
::std::mem::swap(a, b);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
assert_eq!([9.0, 5.0, 1.0, 10.0, 6.0, 2.0, 11.0, 7.0, 3.0, 12.0, 8.0, 4.0], mat);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue