[X86] Fix a bug in WIN_FTOL_32/64 handling.

Duplicating an FP register "as itself" is a bad idea, since it violates the
invariant that every FP register is mapped to at most one FPU stack slot.
Use the scratch FP register instead.

This fixes PR23957.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241069 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Michael Kuperstein 2015-06-30 14:38:57 +00:00
parent e143a3abc2
commit f8b3b92eb8
2 changed files with 23 additions and 1 deletions

View File

@ -1530,7 +1530,7 @@ void FPS::handleSpecialFP(MachineBasicBlock::iterator &Inst) {
if (Op.isKill())
moveToTop(FPReg, Inst);
else
duplicateToTop(FPReg, FPReg, Inst);
duplicateToTop(FPReg, ScratchFPReg, Inst);
// Emit the call. This will pop the operand.
BuildMI(*MBB, Inst, MI->getDebugLoc(), TII->get(X86::CALLpcrel32))

View File

@ -142,3 +142,25 @@ define i64 @double_ui64_5(double %X) {
%tmp.1 = fptoui double %X to i64
ret i64 %tmp.1
}
define double @pr23957_32(double %A) {
; FTOL-LABEL: @pr23957_32
; FTOL: fldl
; FTOL-NEXT: fld %st(0)
; FTOL-NEXT: calll __ftol2
%B = fptoui double %A to i32
%C = uitofp i32 %B to double
%D = fsub double %C, %A
ret double %D
}
define double @pr23957_64(double %A) {
; FTOL-LABEL: @pr23957_64
; FTOL: fldl
; FTOL-NEXT: fld %st(0)
; FTOL-NEXT: calll __ftol2
%B = fptoui double %A to i64
%C = uitofp i64 %B to double
%D = fsub double %C, %A
ret double %D
}