diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-02-19 17:37:55 +0000 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-02-19 17:37:55 +0000 |
commit | 04e45e93114bfb1210b053e07f74c622de7a74ce (patch) | |
tree | fc5f44e9a29269f9aac7bc441019c1a93a066fc9 /llvm/lib/CodeGen | |
parent | dce9c2a8119c7eb3dd34bc8178e54dd609e6d785 (diff) | |
download | bcm5719-llvm-04e45e93114bfb1210b053e07f74c622de7a74ce.tar.gz bcm5719-llvm-04e45e93114bfb1210b053e07f74c622de7a74ce.zip |
[SDAG] Use shift amount type in MULO promotion; NFC
Directly use the correct shift amount type if it is possible, and
future-proof the code against vectors. The added test makes sure that
bitwidths that do not fit into the shift amount type do not assert.
Split out from D57997.
llvm-svn: 354359
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp index aee4194b86e..e664e06ccfd 100644 --- a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp @@ -952,9 +952,11 @@ SDValue DAGTypeLegalizer::PromoteIntRes_XMULO(SDNode *N, unsigned ResNo) { SDValue Overflow; if (N->getOpcode() == ISD::UMULO) { // Unsigned overflow occurred if the high part is non-zero. + unsigned Shift = SmallVT.getScalarSizeInBits(); + EVT ShiftTy = getShiftAmountTyForConstant(Shift, Mul.getValueType(), + TLI, DAG); SDValue Hi = DAG.getNode(ISD::SRL, DL, Mul.getValueType(), Mul, - DAG.getIntPtrConstant(SmallVT.getSizeInBits(), - DL)); + DAG.getConstant(Shift, DL, ShiftTy)); Overflow = DAG.getSetCC(DL, N->getValueType(1), Hi, DAG.getConstant(0, DL, Hi.getValueType()), ISD::SETNE); |