diff options
| author | Craig Topper <craig.topper@intel.com> | 2018-07-27 05:56:27 +0000 |
|---|---|---|
| committer | Craig Topper <craig.topper@intel.com> | 2018-07-27 05:56:27 +0000 |
| commit | 561e298e29b17123198396cda679d0e6c1ca021e (patch) | |
| tree | fe3a2c507f0b9d36ce985e5eb2e9895839ff7ef9 /llvm/lib/Target | |
| parent | eae4742d81ef598dc2000312ad2471c4632bcb83 (diff) | |
| download | bcm5719-llvm-561e298e29b17123198396cda679d0e6c1ca021e.tar.gz bcm5719-llvm-561e298e29b17123198396cda679d0e6c1ca021e.zip | |
[X86] Remove an unnecessary 'if' that prevented treating INT64_MAX and -INT64_MAX as power of 2 minus 1 in the multiply expansion code.
Not sure why they were being explicitly excluded, but I believe all the math inside the if works. I changed the absolute value to be uint64_t instead of int64_t so INT64_MIN+1 wouldn't be signed wrap.
llvm-svn: 338101
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 74 |
1 files changed, 36 insertions, 38 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index e827c5c35f1..7dcdb796705 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -33928,45 +33928,43 @@ static SDValue combineMul(SDNode *N, SelectionDAG &DAG, "Both cases that could cause potential overflows should have " "already been handled."); int64_t SignMulAmt = C->getSExtValue(); - if ((SignMulAmt != INT64_MIN) && (SignMulAmt != INT64_MAX) && - (SignMulAmt != -INT64_MAX)) { - int64_t AbsMulAmt = SignMulAmt < 0 ? -SignMulAmt : SignMulAmt; - if (isPowerOf2_64(AbsMulAmt - 1)) { - // (mul x, 2^N + 1) => (add (shl x, N), x) - NewMul = DAG.getNode( - ISD::ADD, DL, VT, N->getOperand(0), - DAG.getNode(ISD::SHL, DL, VT, N->getOperand(0), - DAG.getConstant(Log2_64(AbsMulAmt - 1), DL, - MVT::i8))); - // To negate, subtract the number from zero - if (SignMulAmt < 0) - NewMul = DAG.getNode(ISD::SUB, DL, VT, - DAG.getConstant(0, DL, VT), NewMul); - } else if (isPowerOf2_64(AbsMulAmt + 1)) { - // (mul x, 2^N - 1) => (sub (shl x, N), x) - NewMul = DAG.getNode(ISD::SHL, DL, VT, N->getOperand(0), - DAG.getConstant(Log2_64(AbsMulAmt + 1), - DL, MVT::i8)); - // To negate, reverse the operands of the subtract. - if (SignMulAmt < 0) - NewMul = DAG.getNode(ISD::SUB, DL, VT, N->getOperand(0), NewMul); - else - NewMul = DAG.getNode(ISD::SUB, DL, VT, NewMul, N->getOperand(0)); - } else if (SignMulAmt >= 0 && isPowerOf2_64(AbsMulAmt - 2)) { - // (mul x, 2^N + 2) => (add (add (shl x, N), x), x) - NewMul = DAG.getNode(ISD::SHL, DL, VT, N->getOperand(0), - DAG.getConstant(Log2_64(AbsMulAmt - 2), - DL, MVT::i8)); - NewMul = DAG.getNode(ISD::ADD, DL, VT, NewMul, N->getOperand(0)); - NewMul = DAG.getNode(ISD::ADD, DL, VT, NewMul, N->getOperand(0)); - } else if (SignMulAmt >= 0 && isPowerOf2_64(AbsMulAmt + 2)) { - // (mul x, 2^N - 2) => (sub (sub (shl x, N), x), x) - NewMul = DAG.getNode(ISD::SHL, DL, VT, N->getOperand(0), - DAG.getConstant(Log2_64(AbsMulAmt + 2), - DL, MVT::i8)); - NewMul = DAG.getNode(ISD::SUB, DL, VT, NewMul, N->getOperand(0)); + assert(SignMulAmt != INT64_MIN && "Int min should have been handled!"); + uint64_t AbsMulAmt = SignMulAmt < 0 ? -SignMulAmt : SignMulAmt; + if (isPowerOf2_64(AbsMulAmt - 1)) { + // (mul x, 2^N + 1) => (add (shl x, N), x) + NewMul = DAG.getNode( + ISD::ADD, DL, VT, N->getOperand(0), + DAG.getNode(ISD::SHL, DL, VT, N->getOperand(0), + DAG.getConstant(Log2_64(AbsMulAmt - 1), DL, + MVT::i8))); + // To negate, subtract the number from zero + if (SignMulAmt < 0) + NewMul = DAG.getNode(ISD::SUB, DL, VT, + DAG.getConstant(0, DL, VT), NewMul); + } else if (isPowerOf2_64(AbsMulAmt + 1)) { + // (mul x, 2^N - 1) => (sub (shl x, N), x) + NewMul = DAG.getNode(ISD::SHL, DL, VT, N->getOperand(0), + DAG.getConstant(Log2_64(AbsMulAmt + 1), + DL, MVT::i8)); + // To negate, reverse the operands of the subtract. + if (SignMulAmt < 0) + NewMul = DAG.getNode(ISD::SUB, DL, VT, N->getOperand(0), NewMul); + else NewMul = DAG.getNode(ISD::SUB, DL, VT, NewMul, N->getOperand(0)); - } + } else if (SignMulAmt >= 0 && isPowerOf2_64(AbsMulAmt - 2)) { + // (mul x, 2^N + 2) => (add (add (shl x, N), x), x) + NewMul = DAG.getNode(ISD::SHL, DL, VT, N->getOperand(0), + DAG.getConstant(Log2_64(AbsMulAmt - 2), + DL, MVT::i8)); + NewMul = DAG.getNode(ISD::ADD, DL, VT, NewMul, N->getOperand(0)); + NewMul = DAG.getNode(ISD::ADD, DL, VT, NewMul, N->getOperand(0)); + } else if (SignMulAmt >= 0 && isPowerOf2_64(AbsMulAmt + 2)) { + // (mul x, 2^N - 2) => (sub (sub (shl x, N), x), x) + NewMul = DAG.getNode(ISD::SHL, DL, VT, N->getOperand(0), + DAG.getConstant(Log2_64(AbsMulAmt + 2), + DL, MVT::i8)); + NewMul = DAG.getNode(ISD::SUB, DL, VT, NewMul, N->getOperand(0)); + NewMul = DAG.getNode(ISD::SUB, DL, VT, NewMul, N->getOperand(0)); } } |

