diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -886,15 +886,14 @@ case Intrinsic::powi: if (ConstantInt *Power = dyn_cast(II->getArgOperand(1))) { // 0 and 1 are handled in instsimplify - // powi(x, -1) -> 1/x if (Power->isMinusOne()) - return BinaryOperator::CreateFDiv(ConstantFP::get(CI.getType(), 1.0), - II->getArgOperand(0)); + return BinaryOperator::CreateFDivFMF(ConstantFP::get(CI.getType(), 1.0), + II->getArgOperand(0), II); // powi(x, 2) -> x*x if (Power->equalsInt(2)) - return BinaryOperator::CreateFMul(II->getArgOperand(0), - II->getArgOperand(0)); + return BinaryOperator::CreateFMulFMF(II->getArgOperand(0), + II->getArgOperand(0), II); } break; diff --git a/llvm/test/Transforms/InstCombine/intrinsics.ll b/llvm/test/Transforms/InstCombine/intrinsics.ll --- a/llvm/test/Transforms/InstCombine/intrinsics.ll +++ b/llvm/test/Transforms/InstCombine/intrinsics.ll @@ -28,9 +28,9 @@ store volatile double %D, double* %P ret void ; CHECK-LABEL: @powi( -; CHECK: %A = fdiv double 1.0{{.*}}, %V +; CHECK: %A = fdiv fast double 1.0{{.*}}, %V ; CHECK: store volatile double %A, -; CHECK: %D = fmul double %V, %V +; CHECK: %D = fmul fast double %V, %V ; CHECK: store volatile double %D }