summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2015-05-30 04:14:10 +0000
committerChandler Carruth <chandlerc@gmail.com>2015-05-30 04:14:10 +0000
commit502b23a7a965ddd46a8fe3d79ddbd26e274f7c6d (patch)
tree5be1accbcbc883942addca90a4660552cd450060 /llvm/lib
parent2599da3cfd519ed59a574d446cd7b25bf543be74 (diff)
downloadbcm5719-llvm-502b23a7a965ddd46a8fe3d79ddbd26e274f7c6d.tar.gz
bcm5719-llvm-502b23a7a965ddd46a8fe3d79ddbd26e274f7c6d.zip
[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. llvm-svn: 238638
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp7
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp22
2 files changed, 15 insertions, 14 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index efd4bd9a4d8..b9eb8f0d0ff 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/llvm/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/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 6e37b7355fc..29adedbae55 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/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);
OpenPOWER on IntegriCloud