about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2016-03-19 15:41:42 -0700
committerbors <bors@rust-lang.org>2016-03-19 15:41:42 -0700
commit02310fd313cf3eed11fe5ac11921b73cc3b648d4 (patch)
tree1993add0adf2c378c5071eff9f57dde930de0b76
parent8eeb5062d115b846a66685e73ce29697f7eeee11 (diff)
parentba89b255e86817e0a2f43198a6b802dafbc6ae9e (diff)
downloadrust-02310fd313cf3eed11fe5ac11921b73cc3b648d4.tar.gz
rust-02310fd313cf3eed11fe5ac11921b73cc3b648d4.zip
Auto merge of #32362 - bluss:float-fast-math, r=eddyb
Fix floating point fast-math intrinsics

The implementation did not handle the case where both operands were constants, which caused an llvm assertion:

```
rustc: //buildslave//rust-buildbot//slave//nightly-dist-rustc-musl-linux//build//src//llvm//include/llvm/Support/Casting.h:237:
typename llvm::cast_retty<X, Y*>::ret_type llvm::cast(Y*) [with X = llvm::Instruction; Y = llvm::Value; typename llvm::cast_retty<X, Y*>::ret_type = llvm::Instruction*]:
Assertion `isa<X>(Val) && "cast<Ty>() argument of incompatible type!"' failed.
```
-rw-r--r--src/rustllvm/RustWrapper.cpp6
-rw-r--r--src/test/run-pass/float_math.rs18
2 files changed, 16 insertions, 8 deletions
diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp
index f488a517b23..33174c1e9df 100644
--- a/src/rustllvm/RustWrapper.cpp
+++ b/src/rustllvm/RustWrapper.cpp
@@ -165,8 +165,10 @@ extern "C" void LLVMRemoveFunctionAttrString(LLVMValueRef fn, unsigned index, co
 }
 
 // enable fpmath flag UnsafeAlgebra
-extern "C" void LLVMRustSetHasUnsafeAlgebra(LLVMValueRef Instr) {
-    unwrap<Instruction>(Instr)->setHasUnsafeAlgebra(true);
+extern "C" void LLVMRustSetHasUnsafeAlgebra(LLVMValueRef V) {
+    if (auto I = dyn_cast<Instruction>(unwrap<Value>(V))) {
+        I->setHasUnsafeAlgebra(true);
+    }
 }
 
 extern "C" LLVMValueRef LLVMBuildAtomicLoad(LLVMBuilderRef B,
diff --git a/src/test/run-pass/float_math.rs b/src/test/run-pass/float_math.rs
index 396b7321f45..c1b4b55bd37 100644
--- a/src/test/run-pass/float_math.rs
+++ b/src/test/run-pass/float_math.rs
@@ -12,13 +12,19 @@
 
 use std::intrinsics::{fadd_fast, fsub_fast, fmul_fast, fdiv_fast, frem_fast};
 
-fn main() {
+#[inline(never)]
+pub fn test_operations(a: f64, b: f64) {
     // make sure they all map to the correct operation
     unsafe {
-        assert_eq!(fadd_fast(1., 2.), 1. + 2.);
-        assert_eq!(fsub_fast(1., 2.), 1. - 2.);
-        assert_eq!(fmul_fast(2., 3.), 2. * 3.);
-        assert_eq!(fdiv_fast(10., 5.), 10. / 5.);
-        assert_eq!(frem_fast(10., 5.), 10. % 5.);
+        assert_eq!(fadd_fast(a, b), a + b);
+        assert_eq!(fsub_fast(a, b), a - b);
+        assert_eq!(fmul_fast(a, b), a * b);
+        assert_eq!(fdiv_fast(a, b), a / b);
+        assert_eq!(frem_fast(a, b), a % b);
     }
 }
+
+fn main() {
+    test_operations(1., 2.);
+    test_operations(10., 5.);
+}