From b09916bdfbd7ffdc8fbadb5ee0c0b50567823f46 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 27 Feb 2008 05:57:41 +0000 Subject: [PATCH] Make X86TargetLowering::LowerSINT_TO_FP return without creating a dead stack slot and store if the SINT_TO_FP is actually legal. This allows us to compile: double a(double b) {return (unsigned)b;} to: _a: cvttsd2siq %xmm0, %rax movl %eax, %eax cvtsi2sdq %rax, %xmm0 ret instead of: _a: subq $8, %rsp cvttsd2siq %xmm0, %rax movl %eax, %eax cvtsi2sdq %rax, %xmm0 addq $8, %rsp ret crazy. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47660 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/README-X86-64.txt | 15 ----------- lib/Target/X86/X86ISelLowering.cpp | 26 +++++++++----------- test/CodeGen/X86/x86-64-dead-stack-adjust.ll | 10 ++++++++ 3 files changed, 22 insertions(+), 29 deletions(-) create mode 100644 test/CodeGen/X86/x86-64-dead-stack-adjust.ll diff --git a/lib/Target/X86/README-X86-64.txt b/lib/Target/X86/README-X86-64.txt index efe3b73da5b..359b83d01a6 100644 --- a/lib/Target/X86/README-X86-64.txt +++ b/lib/Target/X86/README-X86-64.txt @@ -236,18 +236,3 @@ on the result of the movb). //===---------------------------------------------------------------------===// -This function: -double a(double b) {return (unsigned)b;} -compiles to this code: - -_a: - subq $8, %rsp - cvttsd2siq %xmm0, %rax - movl %eax, %eax - cvtsi2sdq %rax, %xmm0 - addq $8, %rsp - ret - -note the dead rsp adjustments. - -//===---------------------------------------------------------------------===// diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index df30aa545ea..50014b31824 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -4148,12 +4148,17 @@ SDOperand X86TargetLowering::LowerShift(SDOperand Op, SelectionDAG &DAG) { } SDOperand X86TargetLowering::LowerSINT_TO_FP(SDOperand Op, SelectionDAG &DAG) { - assert(Op.getOperand(0).getValueType() <= MVT::i64 && - Op.getOperand(0).getValueType() >= MVT::i16 && - "Unknown SINT_TO_FP to lower!"); - - SDOperand Result; MVT::ValueType SrcVT = Op.getOperand(0).getValueType(); + assert(SrcVT <= MVT::i64 && SrcVT >= MVT::i16 && + "Unknown SINT_TO_FP to lower!"); + + // These are really Legal; caller falls through into that case. + if (SrcVT == MVT::i32 && isScalarFPTypeInSSEReg(Op.getValueType())) + return SDOperand(); + if (SrcVT == MVT::i64 && Op.getValueType() != MVT::f80 && + Subtarget->is64Bit()) + return SDOperand(); + unsigned Size = MVT::getSizeInBits(SrcVT)/8; MachineFunction &MF = DAG.getMachineFunction(); int SSFI = MF.getFrameInfo()->CreateStackObject(Size, Size); @@ -4163,13 +4168,6 @@ SDOperand X86TargetLowering::LowerSINT_TO_FP(SDOperand Op, SelectionDAG &DAG) { PseudoSourceValue::getFixedStack(), SSFI); - // These are really Legal; caller falls through into that case. - if (SrcVT == MVT::i32 && isScalarFPTypeInSSEReg(Op.getValueType())) - return Result; - if (SrcVT == MVT::i64 && Op.getValueType() != MVT::f80 && - Subtarget->is64Bit()) - return Result; - // Build the FILD SDVTList Tys; bool useSSE = isScalarFPTypeInSSEReg(Op.getValueType()); @@ -4181,8 +4179,8 @@ SDOperand X86TargetLowering::LowerSINT_TO_FP(SDOperand Op, SelectionDAG &DAG) { Ops.push_back(Chain); Ops.push_back(StackSlot); Ops.push_back(DAG.getValueType(SrcVT)); - Result = DAG.getNode(useSSE ? X86ISD::FILD_FLAG :X86ISD::FILD, - Tys, &Ops[0], Ops.size()); + SDOperand Result = DAG.getNode(useSSE ? X86ISD::FILD_FLAG : X86ISD::FILD, + Tys, &Ops[0], Ops.size()); if (useSSE) { Chain = Result.getValue(1); diff --git a/test/CodeGen/X86/x86-64-dead-stack-adjust.ll b/test/CodeGen/X86/x86-64-dead-stack-adjust.ll new file mode 100644 index 00000000000..9f95e4138bc --- /dev/null +++ b/test/CodeGen/X86/x86-64-dead-stack-adjust.ll @@ -0,0 +1,10 @@ +; RUN: llvm-as < %s | not grep rsp +target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128" +target triple = "x86_64-apple-darwin8" + +define double @a(double %b) nounwind { +entry: + %tmp12 = fptoui double %b to i32 ; [#uses=1] + %tmp123 = uitofp i32 %tmp12 to double ; [#uses=1] + ret double %tmp123 +} -- 2.34.1