From 89a133960bff62fb90ce4226e2859c921da2cc6a Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Sat, 30 May 2015 04:14:10 +0000 Subject: [PATCH] [sdag] Add the helper I most want to the DAG -- building a bitcast around a value using its existing SDLoc. Start using this in just one function to save omg lines of code. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238638 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/SelectionDAG.h | 4 ++++ lib/CodeGen/SelectionDAG/SelectionDAG.cpp | 7 +++++++ lib/Target/X86/X86ISelLowering.cpp | 22 ++++++++-------------- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/include/llvm/CodeGen/SelectionDAG.h b/include/llvm/CodeGen/SelectionDAG.h index 89f9005b8b2..78fdd040773 100644 --- a/include/llvm/CodeGen/SelectionDAG.h +++ b/include/llvm/CodeGen/SelectionDAG.h @@ -878,6 +878,10 @@ public: /// Return an MDNodeSDNode which holds an MDNode. SDValue getMDNode(const MDNode *MD); + /// Return a bitcast using the SDLoc of the value operand, and casting to the + /// provided type. Use getNode to set a custom SDLoc. + SDValue getBitcast(EVT VT, SDValue V); + /// Return an AddrSpaceCastSDNode. SDValue getAddrSpaceCast(SDLoc dl, EVT VT, SDValue Ptr, unsigned SrcAS, unsigned DestAS); diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp index efd4bd9a4d8..b9eb8f0d0ff 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp @@ -1810,6 +1810,13 @@ SDValue SelectionDAG::getMDNode(const MDNode *MD) { return SDValue(N, 0); } +SDValue SelectionDAG::getBitcast(EVT VT, SDValue V) { + if (VT == V.getValueType()) + return V; + + return getNode(ISD::BITCAST, SDLoc(V), VT, V); +} + /// getAddrSpaceCast - Return an AddrSpaceCastSDNode. SDValue SelectionDAG::getAddrSpaceCast(SDLoc dl, EVT VT, SDValue Ptr, unsigned SrcAS, unsigned DestAS) { diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp index 6e37b7355fc..29adedbae55 100644 --- a/lib/Target/X86/X86ISelLowering.cpp +++ b/lib/Target/X86/X86ISelLowering.cpp @@ -17515,24 +17515,19 @@ static SDValue LowerVectorCTPOPBitmath(SDValue Op, SDLoc DL, SDValue V = Op; // v = v - ((v >> 1) & 0x55555555...) - SDValue Srl = DAG.getNode( - ISD::BITCAST, DL, VT, - GetShift(ISD::SRL, DAG.getNode(ISD::BITCAST, DL, SrlVT, V), 1)); + SDValue Srl = + DAG.getBitcast(VT, GetShift(ISD::SRL, DAG.getBitcast(SrlVT, V), 1)); SDValue And = GetMask(Srl, APInt::getSplat(Len, APInt(8, 0x55))); V = DAG.getNode(ISD::SUB, DL, VT, V, And); // v = (v & 0x33333333...) + ((v >> 2) & 0x33333333...) SDValue AndLHS = GetMask(V, APInt::getSplat(Len, APInt(8, 0x33))); - Srl = DAG.getNode( - ISD::BITCAST, DL, VT, - GetShift(ISD::SRL, DAG.getNode(ISD::BITCAST, DL, SrlVT, V), 2)); + Srl = DAG.getBitcast(VT, GetShift(ISD::SRL, DAG.getBitcast(SrlVT, V), 2)); SDValue AndRHS = GetMask(Srl, APInt::getSplat(Len, APInt(8, 0x33))); V = DAG.getNode(ISD::ADD, DL, VT, AndLHS, AndRHS); // v = (v + (v >> 4)) & 0x0F0F0F0F... - Srl = DAG.getNode( - ISD::BITCAST, DL, VT, - GetShift(ISD::SRL, DAG.getNode(ISD::BITCAST, DL, SrlVT, V), 4)); + Srl = DAG.getBitcast(VT, GetShift(ISD::SRL, DAG.getBitcast(SrlVT, V), 4)); SDValue Add = DAG.getNode(ISD::ADD, DL, VT, V, Srl); V = GetMask(Add, APInt::getSplat(Len, APInt(8, 0x0F))); @@ -17545,19 +17540,18 @@ static SDValue LowerVectorCTPOPBitmath(SDValue Op, SDLoc DL, // using the fastest of the two for each size. MVT ByteVT = MVT::getVectorVT(MVT::i8, VecSize / 8); MVT ShiftVT = MVT::getVectorVT(MVT::i64, VecSize / 64); - V = DAG.getNode(ISD::BITCAST, DL, ByteVT, V); + V = DAG.getBitcast(ByteVT, V); assert(Len <= 64 && "We don't support element sizes of more than 64 bits!"); assert(isPowerOf2_32(Len) && "Only power of two element sizes supported!"); for (int i = Len; i > 8; i /= 2) { - SDValue Shl = DAG.getNode( - ISD::BITCAST, DL, ByteVT, - GetShift(ISD::SHL, DAG.getNode(ISD::BITCAST, DL, ShiftVT, V), i / 2)); + SDValue Shl = DAG.getBitcast( + ByteVT, GetShift(ISD::SHL, DAG.getBitcast(ShiftVT, V), i / 2)); V = DAG.getNode(ISD::ADD, DL, ByteVT, V, Shl); } // The high byte now contains the sum of the element bytes. Shift it right // (if needed) to make it the low byte. - V = DAG.getNode(ISD::BITCAST, DL, VT, V); + V = DAG.getBitcast(VT, V); if (Len > 8) V = GetShift(ISD::SRL, V, Len - 8); -- 2.34.1