From 0e8671bf4acbd27f759c14e9cc0271b544979283 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Tue, 31 Jan 2006 23:19:54 +0000 Subject: [PATCH] Be smarter about whether to store the SSE return value in memory. If it is already available in memory, do a fld directly from there. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25859 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelLowering.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 9553994f6fa..1a60368bbb2 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -1912,20 +1912,27 @@ SDOperand X86TargetLowering::LowerOperation(SDOperand Op, SelectionDAG &DAG) { Ops.push_back(Op.getOperand(1)); Copy = DAG.getNode(X86ISD::FP_SET_RESULT, Tys, Ops); } else { - // Spill the value to memory and reload it into top of stack. - unsigned Size = MVT::getSizeInBits(ArgVT)/8; - MachineFunction &MF = DAG.getMachineFunction(); - int SSFI = MF.getFrameInfo()->CreateStackObject(Size, Size); - SDOperand StackSlot = DAG.getFrameIndex(SSFI, getPointerTy()); - SDOperand Chain = DAG.getNode(ISD::STORE, MVT::Other, Op.getOperand(0), - Op.getOperand(1), StackSlot, - DAG.getSrcValue(0)); + SDOperand MemLoc, Chain; + SDOperand Value = Op.getOperand(1); + + if (Value.getOpcode() == ISD::LOAD) { + Chain = Value.getOperand(0); + MemLoc = Value.getOperand(1); + } else { + // Spill the value to memory and reload it into top of stack. + unsigned Size = MVT::getSizeInBits(ArgVT)/8; + MachineFunction &MF = DAG.getMachineFunction(); + int SSFI = MF.getFrameInfo()->CreateStackObject(Size, Size); + MemLoc = DAG.getFrameIndex(SSFI, getPointerTy()); + Chain = DAG.getNode(ISD::STORE, MVT::Other, Op.getOperand(0), + Value, MemLoc, DAG.getSrcValue(0)); + } std::vector Tys; Tys.push_back(MVT::f64); Tys.push_back(MVT::Other); std::vector Ops; Ops.push_back(Chain); - Ops.push_back(StackSlot); + Ops.push_back(MemLoc); Ops.push_back(DAG.getValueType(ArgVT)); Copy = DAG.getNode(X86ISD::FLD, Tys, Ops); Tys.clear();