Fix PR4485.
Avoid unnecessary duplication of operand 0 of X86::FpSET_ST0_80. This duplication would
cause one register to remain on the stack at the function return.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@74534 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/X86/X86FloatingPoint.cpp b/lib/Target/X86/X86FloatingPoint.cpp
index c282dc0..37027ee 100644
--- a/lib/Target/X86/X86FloatingPoint.cpp
+++ b/lib/Target/X86/X86FloatingPoint.cpp
@@ -991,13 +991,16 @@
case X86::FpSET_ST0_32:
case X86::FpSET_ST0_64:
case X86::FpSET_ST0_80: {
- unsigned RegOnTop = getStackEntry(0);
+ unsigned Op0 = getFPReg(MI->getOperand(0));
+
// FpSET_ST0_80 is generated by copyRegToReg for both function return
// and inline assembly with the "st" constrain. In the latter case,
// it is possible for ST(0) to be alive after this instruction.
- if (!MI->killsRegister(X86::FP0 + RegOnTop)) {
- // Duplicate ST0
+ if (!MI->killsRegister(X86::FP0 + Op0)) {
+ // Duplicate Op0
duplicateToTop(0, 7 /*temp register*/, I);
+ } else {
+ moveToTop(Op0, I);
}
--StackTop; // "Forget" we have something on the top of stack!
break;