mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-10 02:36:06 +00:00
Use APInt's umul_ov instead of rolling our own overflow detection.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128380 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
6208610fd6
commit
d655e6e9dc
@ -487,14 +487,15 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
|
||||
APInt RHSKnownOne(BitWidth, 0);
|
||||
ComputeMaskedBits(RHS, Mask, RHSKnownZero, RHSKnownOne);
|
||||
|
||||
// Get the largest possible values for each operand, extended to be large
|
||||
// enough so that every possible product of two BitWidth-sized ints fits.
|
||||
APInt LHSMax = (~LHSKnownZero).zext(BitWidth*2);
|
||||
APInt RHSMax = (~RHSKnownZero).zext(BitWidth*2);
|
||||
// Get the largest possible values for each operand.
|
||||
APInt LHSMax = ~LHSKnownZero;
|
||||
APInt RHSMax = ~RHSKnownZero;
|
||||
|
||||
// If multiplying the maximum values does not overflow then we can turn
|
||||
// this into a plain NUW mul.
|
||||
if ((LHSMax * RHSMax).getActiveBits() <= BitWidth) {
|
||||
bool Overflow;
|
||||
LHSMax.umul_ov(RHSMax, Overflow);
|
||||
if (!Overflow) {
|
||||
Value *Mul = Builder->CreateNUWMul(LHS, RHS, "umul_with_overflow");
|
||||
Constant *V[] = {
|
||||
UndefValue::get(LHS->getType()),
|
||||
|
Loading…
x
Reference in New Issue
Block a user