Index: llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp =================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp +++ llvm/trunk/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp @@ -1996,14 +1996,15 @@ Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext()); Entry.Node = Op; Entry.Ty = ArgTy; - Entry.IsSExt = isSigned; - Entry.IsZExt = !isSigned; + Entry.IsSExt = TLI.shouldSignExtendTypeInLibCall(ArgVT, isSigned); + Entry.IsZExt = !TLI.shouldSignExtendTypeInLibCall(ArgVT, isSigned); Args.push_back(Entry); } SDValue Callee = DAG.getExternalSymbol(TLI.getLibcallName(LC), TLI.getPointerTy(DAG.getDataLayout())); - Type *RetTy = Node->getValueType(0).getTypeForEVT(*DAG.getContext()); + EVT RetVT = Node->getValueType(0); + Type *RetTy = RetVT.getTypeForEVT(*DAG.getContext()); // By default, the input chain to this libcall is the entry node of the // function. If the libcall is going to be emitted as a tail call then @@ -2022,13 +2023,14 @@ InChain = TCChain; TargetLowering::CallLoweringInfo CLI(DAG); + bool signExtend = TLI.shouldSignExtendTypeInLibCall(RetVT, isSigned); CLI.setDebugLoc(SDLoc(Node)) .setChain(InChain) .setLibCallee(TLI.getLibcallCallingConv(LC), RetTy, Callee, std::move(Args)) .setTailCall(isTailCall) - .setSExtResult(isSigned) - .setZExtResult(!isSigned) + .setSExtResult(signExtend) + .setZExtResult(!signExtend) .setIsPostTypeLegalization(true); std::pair CallInfo = TLI.LowerCallTo(CLI); Index: llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp =================================================================== --- llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp +++ llvm/trunk/lib/Target/Mips/MipsISelLowering.cpp @@ -3507,10 +3507,9 @@ bool MipsTargetLowering::shouldSignExtendTypeInLibCall(EVT Type, bool IsSigned) const { - if (Subtarget.hasMips3() && Subtarget.useSoftFloat()) { - if (Type == MVT::i32) + if ((ABI.IsN32() || ABI.IsN64()) && Type == MVT::i32) return true; - } + return IsSigned; } Index: llvm/trunk/test/CodeGen/Mips/pr36061.ll =================================================================== --- llvm/trunk/test/CodeGen/Mips/pr36061.ll +++ llvm/trunk/test/CodeGen/Mips/pr36061.ll @@ -0,0 +1,65 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc < %s -mtriple=mips64el-unknown-linux-gnu -target-abi n64 | FileCheck %s --check-prefix=MIPSN64 +; RUN: llc < %s -mtriple=mips64el-unknown-linux-gnu -target-abi n32 | FileCheck %s --check-prefix=MIPSN32 + +; Test that powi has its integer argument sign extended on mips64. + +declare double @llvm.powi.f64(double, i32) + +define double @powi(double %value, i32 %power) { +; MIPSN64-LABEL: powi: +; MIPSN64: # %bb.0: +; MIPSN64-NEXT: daddiu $sp, $sp, -16 +; MIPSN64-NEXT: .cfi_def_cfa_offset 16 +; MIPSN64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill +; MIPSN64-NEXT: .cfi_offset 31, -8 +; MIPSN64-NEXT: jal __powidf2 +; MIPSN64-NEXT: sll $5, $5, 0 +; MIPSN64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload +; MIPSN64-NEXT: jr $ra +; MIPSN64-NEXT: daddiu $sp, $sp, 16 +; +; MIPSN32-LABEL: powi: +; MIPSN32: # %bb.0: +; MIPSN32-NEXT: addiu $sp, $sp, -16 +; MIPSN32-NEXT: .cfi_def_cfa_offset 16 +; MIPSN32-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill +; MIPSN32-NEXT: .cfi_offset 31, -8 +; MIPSN32-NEXT: jal __powidf2 +; MIPSN32-NEXT: sll $5, $5, 0 +; MIPSN32-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload +; MIPSN32-NEXT: jr $ra +; MIPSN32-NEXT: addiu $sp, $sp, 16 + %1 = tail call double @llvm.powi.f64(double %value, i32 %power) + ret double %1 +} + +declare float @llvm.powi.f32(float, i32) + +define float @powfi(float %value, i32 %power) { +; MIPSN64-LABEL: powfi: +; MIPSN64: # %bb.0: +; MIPSN64-NEXT: daddiu $sp, $sp, -16 +; MIPSN64-NEXT: .cfi_def_cfa_offset 16 +; MIPSN64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill +; MIPSN64-NEXT: .cfi_offset 31, -8 +; MIPSN64-NEXT: jal __powisf2 +; MIPSN64-NEXT: sll $5, $5, 0 +; MIPSN64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload +; MIPSN64-NEXT: jr $ra +; MIPSN64-NEXT: daddiu $sp, $sp, 16 +; +; MIPSN32-LABEL: powfi: +; MIPSN32: # %bb.0: +; MIPSN32-NEXT: addiu $sp, $sp, -16 +; MIPSN32-NEXT: .cfi_def_cfa_offset 16 +; MIPSN32-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill +; MIPSN32-NEXT: .cfi_offset 31, -8 +; MIPSN32-NEXT: jal __powisf2 +; MIPSN32-NEXT: sll $5, $5, 0 +; MIPSN32-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload +; MIPSN32-NEXT: jr $ra +; MIPSN32-NEXT: addiu $sp, $sp, 16 + %1 = tail call float @llvm.powi.f32(float %value, i32 %power) + ret float %1 +}