@@ -5535,6 +5535,9 @@ ScalarEvolution::getRangeRef(const SCEV *S,
5535
5535
DenseMap<const SCEV *, ConstantRange> &Cache =
5536
5536
SignHint == ScalarEvolution::HINT_RANGE_UNSIGNED ? UnsignedRanges
5537
5537
: SignedRanges;
5538
+ ConstantRange::PreferredRangeType RangeType =
5539
+ SignHint == ScalarEvolution::HINT_RANGE_UNSIGNED
5540
+ ? ConstantRange::Unsigned : ConstantRange::Signed;
5538
5541
5539
5542
// See if we've computed this range already.
5540
5543
DenseMap<const SCEV *, ConstantRange>::iterator I = Cache.find (S);
@@ -5565,53 +5568,60 @@ ScalarEvolution::getRangeRef(const SCEV *S,
5565
5568
ConstantRange X = getRangeRef (Add->getOperand (0 ), SignHint);
5566
5569
for (unsigned i = 1 , e = Add->getNumOperands (); i != e; ++i)
5567
5570
X = X.add (getRangeRef (Add->getOperand (i), SignHint));
5568
- return setRange (Add, SignHint, ConservativeResult.intersectWith (X));
5571
+ return setRange (Add, SignHint,
5572
+ ConservativeResult.intersectWith (X, RangeType));
5569
5573
}
5570
5574
5571
5575
if (const SCEVMulExpr *Mul = dyn_cast<SCEVMulExpr>(S)) {
5572
5576
ConstantRange X = getRangeRef (Mul->getOperand (0 ), SignHint);
5573
5577
for (unsigned i = 1 , e = Mul->getNumOperands (); i != e; ++i)
5574
5578
X = X.multiply (getRangeRef (Mul->getOperand (i), SignHint));
5575
- return setRange (Mul, SignHint, ConservativeResult.intersectWith (X));
5579
+ return setRange (Mul, SignHint,
5580
+ ConservativeResult.intersectWith (X, RangeType));
5576
5581
}
5577
5582
5578
5583
if (const SCEVSMaxExpr *SMax = dyn_cast<SCEVSMaxExpr>(S)) {
5579
5584
ConstantRange X = getRangeRef (SMax->getOperand (0 ), SignHint);
5580
5585
for (unsigned i = 1 , e = SMax->getNumOperands (); i != e; ++i)
5581
5586
X = X.smax (getRangeRef (SMax->getOperand (i), SignHint));
5582
- return setRange (SMax, SignHint, ConservativeResult.intersectWith (X));
5587
+ return setRange (SMax, SignHint,
5588
+ ConservativeResult.intersectWith (X, RangeType));
5583
5589
}
5584
5590
5585
5591
if (const SCEVUMaxExpr *UMax = dyn_cast<SCEVUMaxExpr>(S)) {
5586
5592
ConstantRange X = getRangeRef (UMax->getOperand (0 ), SignHint);
5587
5593
for (unsigned i = 1 , e = UMax->getNumOperands (); i != e; ++i)
5588
5594
X = X.umax (getRangeRef (UMax->getOperand (i), SignHint));
5589
- return setRange (UMax, SignHint, ConservativeResult.intersectWith (X));
5595
+ return setRange (UMax, SignHint,
5596
+ ConservativeResult.intersectWith (X, RangeType));
5590
5597
}
5591
5598
5592
5599
if (const SCEVUDivExpr *UDiv = dyn_cast<SCEVUDivExpr>(S)) {
5593
5600
ConstantRange X = getRangeRef (UDiv->getLHS (), SignHint);
5594
5601
ConstantRange Y = getRangeRef (UDiv->getRHS (), SignHint);
5595
5602
return setRange (UDiv, SignHint,
5596
- ConservativeResult.intersectWith (X.udiv (Y)));
5603
+ ConservativeResult.intersectWith (X.udiv (Y), RangeType ));
5597
5604
}
5598
5605
5599
5606
if (const SCEVZeroExtendExpr *ZExt = dyn_cast<SCEVZeroExtendExpr>(S)) {
5600
5607
ConstantRange X = getRangeRef (ZExt->getOperand (), SignHint);
5601
5608
return setRange (ZExt, SignHint,
5602
- ConservativeResult.intersectWith (X.zeroExtend (BitWidth)));
5609
+ ConservativeResult.intersectWith (X.zeroExtend (BitWidth),
5610
+ RangeType));
5603
5611
}
5604
5612
5605
5613
if (const SCEVSignExtendExpr *SExt = dyn_cast<SCEVSignExtendExpr>(S)) {
5606
5614
ConstantRange X = getRangeRef (SExt->getOperand (), SignHint);
5607
5615
return setRange (SExt, SignHint,
5608
- ConservativeResult.intersectWith (X.signExtend (BitWidth)));
5616
+ ConservativeResult.intersectWith (X.signExtend (BitWidth),
5617
+ RangeType));
5609
5618
}
5610
5619
5611
5620
if (const SCEVTruncateExpr *Trunc = dyn_cast<SCEVTruncateExpr>(S)) {
5612
5621
ConstantRange X = getRangeRef (Trunc->getOperand (), SignHint);
5613
5622
return setRange (Trunc, SignHint,
5614
- ConservativeResult.intersectWith (X.truncate (BitWidth)));
5623
+ ConservativeResult.intersectWith (X.truncate (BitWidth),
5624
+ RangeType));
5615
5625
}
5616
5626
5617
5627
if (const SCEVAddRecExpr *AddRec = dyn_cast<SCEVAddRecExpr>(S)) {
@@ -5621,7 +5631,7 @@ ScalarEvolution::getRangeRef(const SCEV *S,
5621
5631
if (const SCEVConstant *C = dyn_cast<SCEVConstant>(AddRec->getStart ()))
5622
5632
if (!C->getValue ()->isZero ())
5623
5633
ConservativeResult = ConservativeResult.intersectWith (
5624
- ConstantRange (C->getAPInt (), APInt (BitWidth, 0 )));
5634
+ ConstantRange (C->getAPInt (), APInt (BitWidth, 0 )), RangeType );
5625
5635
5626
5636
// If there's no signed wrap, and all the operands have the same sign or
5627
5637
// zero, the value won't ever change sign.
@@ -5635,11 +5645,11 @@ ScalarEvolution::getRangeRef(const SCEV *S,
5635
5645
if (AllNonNeg)
5636
5646
ConservativeResult = ConservativeResult.intersectWith (
5637
5647
ConstantRange (APInt (BitWidth, 0 ),
5638
- APInt::getSignedMinValue (BitWidth)));
5648
+ APInt::getSignedMinValue (BitWidth)), RangeType );
5639
5649
else if (AllNonPos)
5640
5650
ConservativeResult = ConservativeResult.intersectWith (
5641
5651
ConstantRange (APInt::getSignedMinValue (BitWidth),
5642
- APInt (BitWidth, 1 )));
5652
+ APInt (BitWidth, 1 )), RangeType );
5643
5653
}
5644
5654
5645
5655
// TODO: non-affine addrec
@@ -5652,14 +5662,14 @@ ScalarEvolution::getRangeRef(const SCEV *S,
5652
5662
BitWidth);
5653
5663
if (!RangeFromAffine.isFullSet ())
5654
5664
ConservativeResult =
5655
- ConservativeResult.intersectWith (RangeFromAffine);
5665
+ ConservativeResult.intersectWith (RangeFromAffine, RangeType );
5656
5666
5657
5667
auto RangeFromFactoring = getRangeViaFactoring (
5658
5668
AddRec->getStart (), AddRec->getStepRecurrence (*this ), MaxBECount,
5659
5669
BitWidth);
5660
5670
if (!RangeFromFactoring.isFullSet ())
5661
5671
ConservativeResult =
5662
- ConservativeResult.intersectWith (RangeFromFactoring);
5672
+ ConservativeResult.intersectWith (RangeFromFactoring, RangeType );
5663
5673
}
5664
5674
}
5665
5675
@@ -5670,7 +5680,8 @@ ScalarEvolution::getRangeRef(const SCEV *S,
5670
5680
// Check if the IR explicitly contains !range metadata.
5671
5681
Optional<ConstantRange> MDRange = GetRangeFromMetadata (U->getValue ());
5672
5682
if (MDRange.hasValue ())
5673
- ConservativeResult = ConservativeResult.intersectWith (MDRange.getValue ());
5683
+ ConservativeResult = ConservativeResult.intersectWith (MDRange.getValue (),
5684
+ RangeType);
5674
5685
5675
5686
// Split here to avoid paying the compile-time cost of calling both
5676
5687
// computeKnownBits and ComputeNumSignBits. This restriction can be lifted
@@ -5681,16 +5692,17 @@ ScalarEvolution::getRangeRef(const SCEV *S,
5681
5692
KnownBits Known = computeKnownBits (U->getValue (), DL, 0 , &AC, nullptr , &DT);
5682
5693
if (Known.One != ~Known.Zero + 1 )
5683
5694
ConservativeResult =
5684
- ConservativeResult.intersectWith (ConstantRange (Known. One ,
5685
- ~Known.Zero + 1 ));
5695
+ ConservativeResult.intersectWith (
5696
+ ConstantRange (Known. One , ~Known.Zero + 1 ), RangeType );
5686
5697
} else {
5687
5698
assert (SignHint == ScalarEvolution::HINT_RANGE_SIGNED &&
5688
5699
" generalize as needed!" );
5689
5700
unsigned NS = ComputeNumSignBits (U->getValue (), DL, 0 , &AC, nullptr , &DT);
5690
5701
if (NS > 1 )
5691
5702
ConservativeResult = ConservativeResult.intersectWith (
5692
5703
ConstantRange (APInt::getSignedMinValue (BitWidth).ashr (NS - 1 ),
5693
- APInt::getSignedMaxValue (BitWidth).ashr (NS - 1 ) + 1 ));
5704
+ APInt::getSignedMaxValue (BitWidth).ashr (NS - 1 ) + 1 ),
5705
+ RangeType);
5694
5706
}
5695
5707
5696
5708
// A range of Phi is a subset of union of all ranges of its input.
@@ -5705,7 +5717,8 @@ ScalarEvolution::getRangeRef(const SCEV *S,
5705
5717
if (RangeFromOps.isFullSet ())
5706
5718
break ;
5707
5719
}
5708
- ConservativeResult = ConservativeResult.intersectWith (RangeFromOps);
5720
+ ConservativeResult =
5721
+ ConservativeResult.intersectWith (RangeFromOps, RangeType);
5709
5722
bool Erased = PendingPhiRanges.erase (Phi);
5710
5723
assert (Erased && " Failed to erase Phi properly?" );
5711
5724
(void ) Erased;
@@ -5812,7 +5825,7 @@ ConstantRange ScalarEvolution::getRangeForAffineAR(const SCEV *Start,
5812
5825
MaxBECountValue, BitWidth, /* Signed = */ false );
5813
5826
5814
5827
// Finally, intersect signed and unsigned ranges.
5815
- return SR.intersectWith (UR);
5828
+ return SR.intersectWith (UR, ConstantRange::Smallest );
5816
5829
}
5817
5830
5818
5831
ConstantRange ScalarEvolution::getRangeViaFactoring (const SCEV *Start,
0 commit comments