[llvm] r241069 - [X86] Fix a bug in WIN_FTOL_32/64 handling.
Michael Kuperstein
michael.m.kuperstein at intel.com
Tue Jun 30 07:38:57 PDT 2015
Author: mkuper
Date: Tue Jun 30 09:38:57 2015
New Revision: 241069
URL: http://llvm.org/viewvc/llvm-project?rev=241069&view=rev
Log:
[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.
Modified:
llvm/trunk/lib/Target/X86/X86FloatingPoint.cpp
llvm/trunk/test/CodeGen/X86/win_ftol2.ll
Modified: llvm/trunk/lib/Target/X86/X86FloatingPoint.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FloatingPoint.cpp?rev=241069&r1=241068&r2=241069&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86FloatingPoint.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86FloatingPoint.cpp Tue Jun 30 09:38:57 2015
@@ -1530,7 +1530,7 @@ void FPS::handleSpecialFP(MachineBasicBl
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))
Modified: llvm/trunk/test/CodeGen/X86/win_ftol2.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/win_ftol2.ll?rev=241069&r1=241068&r2=241069&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/win_ftol2.ll (original)
+++ llvm/trunk/test/CodeGen/X86/win_ftol2.ll Tue Jun 30 09:38:57 2015
@@ -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
+}
More information about the llvm-commits
mailing list