Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp =================================================================== --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -4096,17 +4096,18 @@ case ISD::STRICT_FPOWI: { RTLIB::Libcall LC = RTLIB::getPOWI(Node->getSimpleValueType(0)); assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected fpowi."); + unsigned Offset = Node->isStrictFPOpcode() ? 1 : 0; if (!TLI.getLibcallName(LC)) { // Some targets don't have a powi libcall; use pow instead. SDValue Exponent = DAG.getNode(ISD::SINT_TO_FP, SDLoc(Node), Node->getValueType(0), - Node->getOperand(1)); + Node->getOperand(1 + Offset)); Results.push_back(DAG.getNode(ISD::FPOW, SDLoc(Node), - Node->getValueType(0), Node->getOperand(0), + Node->getValueType(0), + Node->getOperand(Offset), Exponent)); break; } - unsigned Offset = Node->isStrictFPOpcode() ? 1 : 0; bool ExponentHasSizeOfInt = DAG.getLibInfo().getIntSize() == Node->getOperand(1 + Offset).getValueType().getSizeInBits(); Index: llvm/test/CodeGen/X86/float-strict-powi-convert.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/X86/float-strict-powi-convert.ll @@ -0,0 +1,21 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc -mtriple=x86_64-pc-windows-msvc -disable-strictnode-mutation %s -o - | FileCheck %s -check-prefix=WIN +; RUN: llc -mtriple=x86_64-pc-linux -disable-strictnode-mutation %s -o -| FileCheck %s -check-prefix=UNIX + +declare float @llvm.experimental.constrained.powi.f32.i32(float, i32, metadata, metadata) + +define float @powi_f64(float %a, i32 %b) nounwind strictfp { +; WIN-LABEL: powi_f64: +; WIN: # %bb.0: +; WIN-NEXT: cvtsi2ss %edx, %xmm1 +; WIN-NEXT: jmp powf # TAILCALL +; +; UNIX-LABEL: powi_f64: +; UNIX: # %bb.0: +; UNIX-NEXT: pushq %rax +; UNIX-NEXT: callq __powisf2@PLT +; UNIX-NEXT: popq %rax +; UNIX-NEXT: retq + %1 = call float @llvm.experimental.constrained.powi.f32.i32(float %a, i32 %b, metadata !"round.tonearest", metadata !"fpexcept.ignore") strictfp + ret float %1 +}