Fold shift x, [sz]ext(y) -> shift x, y
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21262 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
index 613d098..3128946 100644
--- a/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
+++ b/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
@@ -911,6 +911,14 @@
if (N2.getOpcode() == ISD::FNEG) // (A- (-B) -> A+B
return getNode(ISD::ADD, VT, N1, N2.getOperand(0));
break;
+ case ISD::SHL:
+ case ISD::SRL:
+ case ISD::SRA:
+ if (N2.getOpcode() == ISD::ZERO_EXTEND_INREG ||
+ N2.getOpcode() == ISD::SIGN_EXTEND_INREG) {
+ return getNode(Opcode, VT, N1, N2.getOperand(0));
+ }
+ break;
}
SDNode *&N = BinaryOps[std::make_pair(Opcode, std::make_pair(N1, N2))];
@@ -1002,6 +1010,14 @@
else
return N1; // Never-taken branch
break;
+ case ISD::SRA_PARTS:
+ case ISD::SRL_PARTS:
+ case ISD::SHL_PARTS:
+ if (N3.getOpcode() == ISD::ZERO_EXTEND_INREG ||
+ N3.getOpcode() == ISD::SIGN_EXTEND_INREG) {
+ return getNode(Opcode, VT, N1, N2, N3.getOperand(0));
+ }
+ break;
}
SDNode *N = new SDNode(Opcode, N1, N2, N3);