[llvm-commits] CVS: llvm/lib/Analysis/ScalarEvolution.cpp
Chris Lattner
clattner at apple.com
Tue Dec 5 12:07:14 PST 2006
On Dec 5, 2006, at 11:58 AM, Reid Spencer wrote:
> On Tue, 2006-12-05 at 11:52 -0800, Chris Lattner wrote:
>>> SCEVHandle SCEVTruncateExpr::get(const SCEVHandle &Op, const Type
>>> *Ty) {
>>> if (SCEVConstant *SC = dyn_cast<SCEVConstant>(Op))
>>> - return SCEVUnknown::get(ConstantExpr::getCast(SC->getValue(),
>>> Ty));
>>> + return SCEVUnknown::get(
>>> + ConstantExpr::getTruncOrBitCast(SC->getValue(), Ty));
>>
>> Shouldn't this one always bit a truncate?
>
> No, they could be the same size.
How? The two call sites are:
if (SrcTy->getPrimitiveSize() > Ty->getPrimitiveSize())
return SCEVTruncateExpr::get(V, Ty);
and:
case Instruction::Trunc:
if (I->getType()->isInteger() && I->getOperand(0)->getType()-
>isInteger())
return SCEVTruncateExpr::get(getSCEV(I->getOperand(0)),
I->getType()->getUnsignedVersion
());
The first can't be the same size, obviously. The second can't be the
same size because it's coming from a trunc instruction. Further, the
'I->getOperand(0)->getType()->isInteger()' in the second code is also
redundant with 'truncness'.
>>
>>> SCEVHandle SCEVZeroExtendExpr::get(const SCEVHandle &Op, const
>>> Type *Ty) {
>>> if (SCEVConstant *SC = dyn_cast<SCEVConstant>(Op))
>>> - return SCEVUnknown::get(ConstantExpr::getCast(SC->getValue(),
>>> Ty));
>>> + return SCEVUnknown::get(
>>> + ConstantExpr::getZExtOrBitCast(SC->getValue(), Ty));
>>
>> Likewise, always a zext?
>
> No, they could be the same size.
This is called in two places very similar to trunc.
If you believe that these can be called with srcsize=destsize, please
explain how.
>>
>>> @@ -998,11 +1000,10 @@
>>> Constant *LHSCV = LHSC->getValue();
>>> Constant *RHSCV = RHSC->getValue();
>>> if (LHSCV->getType()->isUnsigned())
>>> - LHSCV = ConstantExpr::getInferredCast(
>>> - LHSCV, false, LHSCV->getType()->getSignedVersion(),
>>> true);
>>> + LHSCV = ConstantExpr::getBitCast(LHSCV,
>>> + LHSCV->getType()-
>>>> getSignedVersion());
>>> if (RHSCV->getType()->isUnsigned())
>>> - RHSCV = ConstantExpr::getInferredCast(
>>> - RHSCV, false, LHSCV->getType(), true);
>>> + RHSCV = ConstantExpr::getBitCast(RHSCV, LHSCV->getType());
>>> return SCEVUnknown::get(ConstantExpr::getSDiv(LHSCV, RHSCV));
>>> }
>>> }
>>
>> As I mentioned before, these casts can all go away. sdiv is signless
>> now.
>
> One thing at a time. This patch is getting rid of getInferredCast and
> no more.
Fair enough, please make sure it happens at some point though.
-Chris
More information about the llvm-commits
mailing list