static BinaryOperator *LowerNegateToMultiply(Instruction *Neg) {
assert((isa<UnaryOperator>(Neg) || isa<BinaryOperator>(Neg)) &&
"Expected a Negate!");
- // It's not safe to lower a unary FNeg into a FMul by -1.0. However,
- // we can only reach this function with fast flags set, so it's
- // safe to do with nnan.
- assert((!isa<FPMathOperator>(Neg) || Neg->isFast()) &&
- "Expecting FastMathFlags!");
+ // FIXME: It's not safe to lower a unary FNeg into a FMul by -1.0.
unsigned OpNo = isa<BinaryOperator>(Neg) ? 1 : 0;
Type *Ty = Neg->getType();
Constant *NegOne = Ty->isIntOrIntVectorTy() ?
--- /dev/null
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -reassociate -S | FileCheck %s
+
+define float @wibble(float %tmp6) #0 {
+; CHECK-LABEL: @wibble(
+; CHECK-NEXT: bb:
+; CHECK-NEXT: [[TMP7:%.*]] = fmul float [[TMP6:%.*]], -1.000000e+00
+; CHECK-NEXT: [[TMP0:%.*]] = fsub float -0.000000e+00, 0.000000e+00
+; CHECK-NEXT: [[TMP9:%.*]] = fmul fast float [[TMP6]], 0xFFF0000000000000
+; CHECK-NEXT: ret float [[TMP9]]
+;
+bb:
+ %tmp7 = fsub float -0.000000e+00, %tmp6
+ %tmp9 = fmul fast float %tmp7, 0x7FF0000000000000
+ ret float %tmp9
+}
+
+attributes #0 = { "use-soft-float"="false" }