@@ -7354,67 +7354,66 @@ static void setLimitsForBinOp(const BinaryOperator &BO, APInt &Lower,
7354
7354
}
7355
7355
}
7356
7356
7357
- static void setLimitsForIntrinsic (const IntrinsicInst &II, APInt &Lower,
7358
- APInt &Upper) {
7359
- unsigned Width = Lower.getBitWidth ();
7357
+ static ConstantRange getRangeForIntrinsic (const IntrinsicInst &II) {
7358
+ unsigned Width = II.getType ()->getScalarSizeInBits ();
7360
7359
const APInt *C;
7361
7360
switch (II.getIntrinsicID ()) {
7362
7361
case Intrinsic::ctpop:
7363
7362
case Intrinsic::ctlz:
7364
7363
case Intrinsic::cttz:
7365
7364
// Maximum of set/clear bits is the bit width.
7366
- assert (Lower == 0 && " Expected lower bound to be zero" );
7367
- Upper = Width + 1 ;
7368
- break ;
7365
+ return ConstantRange (APInt::getZero (Width), APInt (Width, Width + 1 ));
7369
7366
case Intrinsic::uadd_sat:
7370
7367
// uadd.sat(x, C) produces [C, UINT_MAX].
7371
7368
if (match (II.getOperand (0 ), m_APInt (C)) ||
7372
7369
match (II.getOperand (1 ), m_APInt (C)))
7373
- Lower = *C ;
7370
+ return ConstantRange::getNonEmpty (*C, APInt::getZero (Width)) ;
7374
7371
break ;
7375
7372
case Intrinsic::sadd_sat:
7376
7373
if (match (II.getOperand (0 ), m_APInt (C)) ||
7377
7374
match (II.getOperand (1 ), m_APInt (C))) {
7378
- if (C->isNegative ()) {
7375
+ if (C->isNegative ())
7379
7376
// sadd.sat(x, -C) produces [SINT_MIN, SINT_MAX + (-C)].
7380
- Lower = APInt::getSignedMinValue (Width);
7381
- Upper = APInt::getSignedMaxValue (Width) + *C + 1 ;
7382
- } else {
7383
- // sadd.sat(x, +C) produces [SINT_MIN + C, SINT_MAX].
7384
- Lower = APInt::getSignedMinValue (Width) + *C;
7385
- Upper = APInt::getSignedMaxValue (Width) + 1 ;
7386
- }
7377
+ return ConstantRange::getNonEmpty ( APInt::getSignedMinValue (Width),
7378
+ APInt::getSignedMaxValue (Width) + *C +
7379
+ 1 );
7380
+
7381
+ // sadd.sat(x, +C) produces [SINT_MIN + C, SINT_MAX].
7382
+ return ConstantRange::getNonEmpty ( APInt::getSignedMinValue (Width) + *C,
7383
+ APInt::getSignedMaxValue (Width) + 1 );
7387
7384
}
7388
7385
break ;
7389
7386
case Intrinsic::usub_sat:
7390
7387
// usub.sat(C, x) produces [0, C].
7391
7388
if (match (II.getOperand (0 ), m_APInt (C)))
7392
- Upper = *C + 1 ;
7389
+ return ConstantRange::getNonEmpty (APInt::getZero (Width), *C + 1 );
7390
+
7393
7391
// usub.sat(x, C) produces [0, UINT_MAX - C].
7394
- else if (match (II.getOperand (1 ), m_APInt (C)))
7395
- Upper = APInt::getMaxValue (Width) - *C + 1 ;
7392
+ if (match (II.getOperand (1 ), m_APInt (C)))
7393
+ return ConstantRange::getNonEmpty (APInt::getZero (Width),
7394
+ APInt::getMaxValue (Width) - *C + 1 );
7396
7395
break ;
7397
7396
case Intrinsic::ssub_sat:
7398
7397
if (match (II.getOperand (0 ), m_APInt (C))) {
7399
- if (C->isNegative ()) {
7398
+ if (C->isNegative ())
7400
7399
// ssub.sat(-C, x) produces [SINT_MIN, -SINT_MIN + (-C)].
7401
- Lower = APInt::getSignedMinValue (Width);
7402
- Upper = *C - APInt::getSignedMinValue (Width) + 1 ;
7403
- } else {
7404
- // ssub.sat(+C, x) produces [-SINT_MAX + C, SINT_MAX].
7405
- Lower = *C - APInt::getSignedMaxValue (Width);
7406
- Upper = APInt::getSignedMaxValue (Width) + 1 ;
7407
- }
7400
+ return ConstantRange::getNonEmpty ( APInt::getSignedMinValue (Width),
7401
+ *C - APInt::getSignedMinValue (Width) +
7402
+ 1 );
7403
+
7404
+ // ssub.sat(+C, x) produces [-SINT_MAX + C, SINT_MAX].
7405
+ return ConstantRange::getNonEmpty (*C - APInt::getSignedMaxValue (Width),
7406
+ APInt::getSignedMaxValue (Width) + 1 );
7408
7407
} else if (match (II.getOperand (1 ), m_APInt (C))) {
7409
- if (C->isNegative ()) {
7408
+ if (C->isNegative ())
7410
7409
// ssub.sat(x, -C) produces [SINT_MIN - (-C), SINT_MAX]:
7411
- Lower = APInt::getSignedMinValue (Width) - *C;
7412
- Upper = APInt::getSignedMaxValue (Width) + 1 ;
7413
- } else {
7414
- // ssub.sat(x, +C) produces [SINT_MIN, SINT_MAX - C].
7415
- Lower = APInt::getSignedMinValue (Width);
7416
- Upper = APInt::getSignedMaxValue (Width) - *C + 1 ;
7417
- }
7410
+ return ConstantRange::getNonEmpty ( APInt::getSignedMinValue (Width) - *C,
7411
+ APInt::getSignedMaxValue (Width) + 1 ) ;
7412
+
7413
+ // ssub.sat(x, +C) produces [SINT_MIN, SINT_MAX - C].
7414
+ return ConstantRange::getNonEmpty ( APInt::getSignedMinValue (Width),
7415
+ APInt::getSignedMaxValue (Width) - *C +
7416
+ 1 );
7418
7417
}
7419
7418
break ;
7420
7419
case Intrinsic::umin:
@@ -7427,19 +7426,15 @@ static void setLimitsForIntrinsic(const IntrinsicInst &II, APInt &Lower,
7427
7426
7428
7427
switch (II.getIntrinsicID ()) {
7429
7428
case Intrinsic::umin:
7430
- Upper = *C + 1 ;
7431
- break ;
7429
+ return ConstantRange::getNonEmpty (APInt::getZero (Width), *C + 1 );
7432
7430
case Intrinsic::umax:
7433
- Lower = *C;
7434
- break ;
7431
+ return ConstantRange::getNonEmpty (*C, APInt::getZero (Width));
7435
7432
case Intrinsic::smin:
7436
- Lower = APInt::getSignedMinValue (Width);
7437
- Upper = *C + 1 ;
7438
- break ;
7433
+ return ConstantRange::getNonEmpty (APInt::getSignedMinValue (Width),
7434
+ *C + 1 );
7439
7435
case Intrinsic::smax:
7440
- Lower = *C;
7441
- Upper = APInt::getSignedMaxValue (Width) + 1 ;
7442
- break ;
7436
+ return ConstantRange::getNonEmpty (*C,
7437
+ APInt::getSignedMaxValue (Width) + 1 );
7443
7438
default :
7444
7439
llvm_unreachable (" Must be min/max intrinsic" );
7445
7440
}
@@ -7448,13 +7443,16 @@ static void setLimitsForIntrinsic(const IntrinsicInst &II, APInt &Lower,
7448
7443
// If abs of SIGNED_MIN is poison, then the result is [0..SIGNED_MAX],
7449
7444
// otherwise it is [0..SIGNED_MIN], as -SIGNED_MIN == SIGNED_MIN.
7450
7445
if (match (II.getOperand (1 ), m_One ()))
7451
- Upper = APInt::getSignedMaxValue (Width) + 1 ;
7452
- else
7453
- Upper = APInt::getSignedMinValue (Width) + 1 ;
7454
- break ;
7446
+ return ConstantRange (APInt::getZero (Width),
7447
+ APInt::getSignedMaxValue (Width) + 1 );
7448
+
7449
+ return ConstantRange (APInt::getZero (Width),
7450
+ APInt::getSignedMinValue (Width) + 1 );
7455
7451
default :
7456
7452
break ;
7457
7453
}
7454
+
7455
+ return ConstantRange::getFull (Width);
7458
7456
}
7459
7457
7460
7458
static void setLimitsForSelectPattern (const SelectInst &SI, APInt &Lower,
@@ -7543,18 +7541,28 @@ ConstantRange llvm::computeConstantRange(const Value *V, bool ForSigned,
7543
7541
7544
7542
InstrInfoQuery IIQ (UseInstrInfo);
7545
7543
unsigned BitWidth = V->getType ()->getScalarSizeInBits ();
7546
- APInt Lower = APInt (BitWidth, 0 );
7547
- APInt Upper = APInt (BitWidth, 0 );
7548
- if (auto *BO = dyn_cast<BinaryOperator>(V))
7544
+ ConstantRange CR = ConstantRange::getFull (BitWidth);
7545
+ if (auto *BO = dyn_cast<BinaryOperator>(V)) {
7546
+ APInt Lower = APInt (BitWidth, 0 );
7547
+ APInt Upper = APInt (BitWidth, 0 );
7548
+ // TODO: Return ConstantRange.
7549
7549
setLimitsForBinOp (*BO, Lower, Upper, IIQ, ForSigned);
7550
- else if (auto *II = dyn_cast<IntrinsicInst>(V))
7551
- setLimitsForIntrinsic (*II, Lower, Upper);
7552
- else if (auto *SI = dyn_cast<SelectInst>(V))
7550
+ CR = ConstantRange::getNonEmpty (Lower, Upper);
7551
+ } else if (auto *II = dyn_cast<IntrinsicInst>(V))
7552
+ CR = getRangeForIntrinsic (*II);
7553
+ else if (auto *SI = dyn_cast<SelectInst>(V)) {
7554
+ APInt Lower = APInt (BitWidth, 0 );
7555
+ APInt Upper = APInt (BitWidth, 0 );
7556
+ // TODO: Return ConstantRange.
7553
7557
setLimitsForSelectPattern (*SI, Lower, Upper, IIQ);
7554
- else if (isa<FPToUIInst>(V) || isa<FPToSIInst>(V))
7558
+ CR = ConstantRange::getNonEmpty (Lower, Upper);
7559
+ } else if (isa<FPToUIInst>(V) || isa<FPToSIInst>(V)) {
7560
+ APInt Lower = APInt (BitWidth, 0 );
7561
+ APInt Upper = APInt (BitWidth, 0 );
7562
+ // TODO: Return ConstantRange.
7555
7563
setLimitForFPToI (cast<Instruction>(V), Lower, Upper);
7556
-
7557
- ConstantRange CR = ConstantRange::getNonEmpty (Lower, Upper);
7564
+ CR = ConstantRange::getNonEmpty (Lower, Upper);
7565
+ }
7558
7566
7559
7567
if (auto *I = dyn_cast<Instruction>(V))
7560
7568
if (auto *Range = IIQ.getMetadata (I, LLVMContext::MD_range))
0 commit comments