From 87c8935fd55f3177e787e192b5ed4686b6073c61 Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Mon, 15 Oct 2007 20:11:21 +0000 Subject: [PATCH] LowerFP_TO_SINT must not create a stack object if it's not needed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@43004 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86ISelLowering.cpp | 12 ++++++------ test/CodeGen/X86/fp2sint.ll | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 test/CodeGen/X86/fp2sint.ll diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index bac658f85ec..8726c587caf 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -3895,13 +3895,7 @@ SDOperand X86TargetLowering::LowerSINT_TO_FP(SDOperand Op, SelectionDAG &DAG) { SDOperand X86TargetLowering::LowerFP_TO_SINT(SDOperand Op, SelectionDAG &DAG) { assert(Op.getValueType() <= MVT::i64 && Op.getValueType() >= MVT::i16 && "Unknown FP_TO_SINT to lower!"); - // We lower FP->sint64 into FISTP64, followed by a load, all to a temporary - // stack slot. SDOperand Result; - MachineFunction &MF = DAG.getMachineFunction(); - unsigned MemSize = MVT::getSizeInBits(Op.getValueType())/8; - int SSFI = MF.getFrameInfo()->CreateStackObject(MemSize, MemSize); - SDOperand StackSlot = DAG.getFrameIndex(SSFI, getPointerTy()); // These are really Legal. if (Op.getValueType() == MVT::i32 && @@ -3915,6 +3909,12 @@ SDOperand X86TargetLowering::LowerFP_TO_SINT(SDOperand Op, SelectionDAG &DAG) { Op.getOperand(0).getValueType() != MVT::f80) return Result; + // We lower FP->sint64 into FISTP64, followed by a load, all to a temporary + // stack slot. + MachineFunction &MF = DAG.getMachineFunction(); + unsigned MemSize = MVT::getSizeInBits(Op.getValueType())/8; + int SSFI = MF.getFrameInfo()->CreateStackObject(MemSize, MemSize); + SDOperand StackSlot = DAG.getFrameIndex(SSFI, getPointerTy()); unsigned Opc; switch (Op.getValueType()) { default: assert(0 && "Invalid FP_TO_SINT to lower!"); diff --git a/test/CodeGen/X86/fp2sint.ll b/test/CodeGen/X86/fp2sint.ll new file mode 100644 index 00000000000..80f7efbe4de --- /dev/null +++ b/test/CodeGen/X86/fp2sint.ll @@ -0,0 +1,18 @@ +;; LowerFP_TO_SINT should not create a stack object if it's not needed. + +; RUN: llvm-as < %s | llc -march=x86 -mattr=+sse2 | not grep add + +define i32 @main(i32 %argc, i8** %argv) { +cond_false.i.i.i: ; preds = %bb.i5 + %tmp35.i = load double* null, align 8 ; [#uses=1] + %tmp3536.i = fptosi double %tmp35.i to i32 ; [#uses=1] + %tmp3536140.i = zext i32 %tmp3536.i to i64 ; [#uses=1] + %tmp39.i = load double* null, align 4 ; [#uses=1] + %tmp3940.i = fptosi double %tmp39.i to i32 ; [#uses=1] + %tmp3940137.i = zext i32 %tmp3940.i to i64 ; [#uses=1] + %tmp3940137138.i = shl i64 %tmp3940137.i, 32 ; [#uses=1] + %tmp3940137138.ins.i = or i64 %tmp3940137138.i, %tmp3536140.i ; [#uses=1] + %tmp95.i.i = trunc i64 %tmp3940137138.ins.i to i32 ; [#uses=1] + store i32 %tmp95.i.i, i32* null, align 4 + ret i32 0 +} -- 2.34.1