Rollup merge of #62828 - nikic:fadd-mul-reductions, r=eddyb
Remove vector fadd/fmul reduction workarounds The bugs that this was working around have been fixed in LLVM 9. r? @gnzlbg
This commit is contained in:
@@ -1153,11 +1153,14 @@ impl Builder<'a, 'll, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn vector_reduce_fadd(&mut self, acc: &'ll Value, src: &'ll Value) -> &'ll Value {
|
||||
unsafe { llvm::LLVMRustBuildVectorReduceFAdd(self.llbuilder, acc, src) }
|
||||
}
|
||||
pub fn vector_reduce_fmul(&mut self, acc: &'ll Value, src: &'ll Value) -> &'ll Value {
|
||||
unsafe { llvm::LLVMRustBuildVectorReduceFMul(self.llbuilder, acc, src) }
|
||||
}
|
||||
pub fn vector_reduce_fadd_fast(&mut self, acc: &'ll Value, src: &'ll Value) -> &'ll Value {
|
||||
unsafe {
|
||||
// FIXME: add a non-fast math version once
|
||||
// https://bugs.llvm.org/show_bug.cgi?id=36732
|
||||
// is fixed.
|
||||
let instr = llvm::LLVMRustBuildVectorReduceFAdd(self.llbuilder, acc, src);
|
||||
llvm::LLVMRustSetHasUnsafeAlgebra(instr);
|
||||
instr
|
||||
@@ -1165,9 +1168,6 @@ impl Builder<'a, 'll, 'tcx> {
|
||||
}
|
||||
pub fn vector_reduce_fmul_fast(&mut self, acc: &'ll Value, src: &'ll Value) -> &'ll Value {
|
||||
unsafe {
|
||||
// FIXME: add a non-fast math version once
|
||||
// https://bugs.llvm.org/show_bug.cgi?id=36732
|
||||
// is fixed.
|
||||
let instr = llvm::LLVMRustBuildVectorReduceFMul(self.llbuilder, acc, src);
|
||||
llvm::LLVMRustSetHasUnsafeAlgebra(instr);
|
||||
instr
|
||||
|
||||
@@ -166,25 +166,6 @@ impl CodegenCx<'ll, 'tcx> {
|
||||
r
|
||||
}
|
||||
}
|
||||
|
||||
pub fn const_get_real(&self, v: &'ll Value) -> Option<(f64, bool)> {
|
||||
unsafe {
|
||||
if self.is_const_real(v) {
|
||||
let mut loses_info: llvm::Bool = 0;
|
||||
let r = llvm::LLVMConstRealGetDouble(v, &mut loses_info);
|
||||
let loses_info = if loses_info == 1 { true } else { false };
|
||||
Some((r, loses_info))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn is_const_real(&self, v: &'ll Value) -> bool {
|
||||
unsafe {
|
||||
llvm::LLVMIsAConstantFP(v).is_some()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ConstMethods<'tcx> for CodegenCx<'ll, 'tcx> {
|
||||
|
||||
@@ -1640,29 +1640,11 @@ fn generic_simd_intrinsic(
|
||||
}
|
||||
},
|
||||
ty::Float(f) => {
|
||||
// ordered arithmetic reductions take an accumulator
|
||||
let acc = if $ordered {
|
||||
let acc = args[1].immediate();
|
||||
// FIXME: https://bugs.llvm.org/show_bug.cgi?id=36734
|
||||
// * if the accumulator of the fadd isn't 0, incorrect
|
||||
// code is generated
|
||||
// * if the accumulator of the fmul isn't 1, incorrect
|
||||
// code is generated
|
||||
match bx.const_get_real(acc) {
|
||||
None => return_error!("accumulator of {} is not a constant", $name),
|
||||
Some((v, loses_info)) => {
|
||||
if $name.contains("mul") && v != 1.0_f64 {
|
||||
return_error!("accumulator of {} is not 1.0", $name);
|
||||
} else if $name.contains("add") && v != 0.0_f64 {
|
||||
return_error!("accumulator of {} is not 0.0", $name);
|
||||
} else if loses_info {
|
||||
return_error!("accumulator of {} loses information", $name);
|
||||
}
|
||||
}
|
||||
}
|
||||
acc
|
||||
// ordered arithmetic reductions take an accumulator
|
||||
args[1].immediate()
|
||||
} else {
|
||||
// unordered arithmetic reductions do not:
|
||||
// unordered arithmetic reductions use the identity accumulator
|
||||
let identity_acc = if $name.contains("mul") { 1.0 } else { 0.0 };
|
||||
match f.bit_width() {
|
||||
32 => bx.const_real(bx.type_f32(), identity_acc),
|
||||
@@ -1688,8 +1670,8 @@ unsupported {} from `{}` with element `{}` of size `{}` to `{}`"#,
|
||||
}
|
||||
}
|
||||
|
||||
arith_red!("simd_reduce_add_ordered": vector_reduce_add, vector_reduce_fadd_fast, true);
|
||||
arith_red!("simd_reduce_mul_ordered": vector_reduce_mul, vector_reduce_fmul_fast, true);
|
||||
arith_red!("simd_reduce_add_ordered": vector_reduce_add, vector_reduce_fadd, true);
|
||||
arith_red!("simd_reduce_mul_ordered": vector_reduce_mul, vector_reduce_fmul, true);
|
||||
arith_red!("simd_reduce_add_unordered": vector_reduce_add, vector_reduce_fadd_fast, false);
|
||||
arith_red!("simd_reduce_mul_unordered": vector_reduce_mul, vector_reduce_fmul_fast, false);
|
||||
|
||||
|
||||
@@ -719,7 +719,6 @@ extern "C" {
|
||||
pub fn LLVMConstIntGetZExtValue(ConstantVal: &Value) -> c_ulonglong;
|
||||
pub fn LLVMRustConstInt128Get(ConstantVal: &Value, SExt: bool,
|
||||
high: &mut u64, low: &mut u64) -> bool;
|
||||
pub fn LLVMConstRealGetDouble (ConstantVal: &Value, losesInfo: &mut Bool) -> f64;
|
||||
|
||||
|
||||
// Operations on composite constants
|
||||
@@ -1663,7 +1662,6 @@ extern "C" {
|
||||
pub fn LLVMRustWriteValueToString(value_ref: &Value, s: &RustString);
|
||||
|
||||
pub fn LLVMIsAConstantInt(value_ref: &Value) -> Option<&Value>;
|
||||
pub fn LLVMIsAConstantFP(value_ref: &Value) -> Option<&Value>;
|
||||
|
||||
pub fn LLVMRustPassKind(Pass: &Pass) -> PassKind;
|
||||
pub fn LLVMRustFindAndCreatePass(Pass: *const c_char) -> Option<&'static mut Pass>;
|
||||
|
||||
Reference in New Issue
Block a user