diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-10-18 16:36:00 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-10-18 16:36:00 +0000 |
commit | 25e9628978fcfed189f9de2e559d0845155b21ae (patch) | |
tree | bdef981a7e9c2a5a50caaf7f49f4e975b01a2334 /llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | |
parent | 919bdf1d4fe2032ed9cbdcd9c2c419980bd75c9b (diff) | |
download | bcm5719-llvm-25e9628978fcfed189f9de2e559d0845155b21ae.tar.gz bcm5719-llvm-25e9628978fcfed189f9de2e559d0845155b21ae.zip |
[DAGCombiner] Add splatted vector support to (udiv x, (shl pow2, y)) -> x >>u (log2(pow2)+y)
llvm-svn: 284491
Diffstat (limited to 'llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp index 65ce923e2e3..aa63889a7d7 100644 --- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp @@ -2387,6 +2387,7 @@ SDValue DAGCombiner::visitUDIV(SDNode *N) { if (SDValue Folded = DAG.FoldConstantArithmetic(ISD::UDIV, DL, VT, N0C, N1C)) return Folded; + // fold (udiv x, (1 << c)) -> x >>u c if (N1C && !N1C->isOpaque() && N1C->getAPIntValue().isPowerOf2()) return DAG.getNode(ISD::SRL, DL, VT, N0, @@ -2395,8 +2396,8 @@ SDValue DAGCombiner::visitUDIV(SDNode *N) { // fold (udiv x, (shl c, y)) -> x >>u (log2(c)+y) iff c is power of 2 if (N1.getOpcode() == ISD::SHL) { - if (ConstantSDNode *SHC = getAsNonOpaqueConstant(N1.getOperand(0))) { - if (SHC->getAPIntValue().isPowerOf2()) { + if (ConstantSDNode *SHC = isConstOrConstSplat(N1.getOperand(0))) { + if (!SHC->isOpaque() && SHC->getAPIntValue().isPowerOf2()) { EVT ADDVT = N1.getOperand(1).getValueType(); SDValue Add = DAG.getNode(ISD::ADD, DL, ADDVT, N1.getOperand(1), |