From 38a74cfe54cc7d777d2b601a88df256e879d6cf3 Mon Sep 17 00:00:00 2001 From: Wei Mi Date: Thu, 22 Dec 2016 19:38:22 +0000 Subject: [PATCH] Change the interface of TLI.isMultiStoresCheaperThanBitsMerge. This is for splitMergedValStore in DAG Combine to share the target query interface with similar logic in CodeGenPrepare. Differential Revision: https://reviews.llvm.org/D24707 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@290363 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Target/TargetLowering.h | 2 +- lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 11 +++++++++-- lib/Target/X86/X86ISelLowering.h | 12 ++++-------- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/include/llvm/Target/TargetLowering.h b/include/llvm/Target/TargetLowering.h index bb3e415f85b..fb43ef19a64 100644 --- a/include/llvm/Target/TargetLowering.h +++ b/include/llvm/Target/TargetLowering.h @@ -372,7 +372,7 @@ public: /// \brief Return true if it is cheaper to split the store of a merged int val /// from a pair of smaller values into multiple stores. - virtual bool isMultiStoresCheaperThanBitsMerge(SDValue Lo, SDValue Hi) const { + virtual bool isMultiStoresCheaperThanBitsMerge(EVT LTy, EVT HTy) const { return false; } diff --git a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index a91e727130d..1d28124ce7a 100644 --- a/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -12435,8 +12435,15 @@ SDValue DAGCombiner::splitMergedValStore(StoreSDNode *ST) { Hi.getOperand(0).getValueSizeInBits() > HalfValBitSize) return SDValue(); - if (!TLI.isMultiStoresCheaperThanBitsMerge(Lo.getOperand(0), - Hi.getOperand(0))) + // Use the EVT of low and high parts before bitcast as the input + // of target query. + EVT LowTy = (Lo.getOperand(0).getOpcode() == ISD::BITCAST) + ? Lo.getOperand(0).getValueType() + : Lo.getValueType(); + EVT HighTy = (Hi.getOperand(0).getOpcode() == ISD::BITCAST) + ? Hi.getOperand(0).getValueType() + : Hi.getValueType(); + if (!TLI.isMultiStoresCheaperThanBitsMerge(LowTy, HighTy)) return SDValue(); // Start to split store. diff --git a/lib/Target/X86/X86ISelLowering.h b/lib/Target/X86/X86ISelLowering.h index ceba14ed654..37f9353042b 100644 --- a/lib/Target/X86/X86ISelLowering.h +++ b/lib/Target/X86/X86ISelLowering.h @@ -790,19 +790,15 @@ namespace llvm { return VT == MVT::f32 || VT == MVT::f64 || VT.isVector(); } - bool isMultiStoresCheaperThanBitsMerge(SDValue Lo, - SDValue Hi) const override { + bool isMultiStoresCheaperThanBitsMerge(EVT LTy, EVT HTy) const override { // If the pair to store is a mixture of float and int values, we will // save two bitwise instructions and one float-to-int instruction and // increase one store instruction. There is potentially a more // significant benefit because it avoids the float->int domain switch // for input value. So It is more likely a win. - if (Lo.getOpcode() == ISD::BITCAST || Hi.getOpcode() == ISD::BITCAST) { - SDValue Opd = (Lo.getOpcode() == ISD::BITCAST) ? Lo.getOperand(0) - : Hi.getOperand(0); - if (Opd.getValueType().isFloatingPoint()) - return true; - } + if ((LTy.isFloatingPoint() && HTy.isInteger()) || + (LTy.isInteger() && HTy.isFloatingPoint())) + return true; // If the pair only contains int values, we will save two bitwise // instructions and increase one store instruction (costing one more // store buffer). Since the benefit is more blurred so we leave -- 2.11.0