// We've determined this is (i+constant) and it won't overflow.
if (isa<SExtInst>(UInst->use_begin())) {
SExtInst* oldSext = dyn_cast<SExtInst>(UInst->use_begin());
+ uint64_t truncSize = oldSext->getType()->getPrimitiveSizeInBits();
Value *TruncIndVar = getSignExtendedTruncVar(AR, SE, LargestType,
L, oldSext->getType(), Rewriter,
InsertPt);
- APInt APcopy = APInt(AddRHS->getValue());
- ConstantInt* newAddRHS =ConstantInt::get(APcopy.sext(newBitSize));
+ APInt APnewAddRHS = APInt(AddRHS->getValue()).sext(newBitSize);
+ if (newBitSize > truncSize)
+ APnewAddRHS = APnewAddRHS.trunc(truncSize);
+ ConstantInt* newAddRHS =ConstantInt::get(APnewAddRHS);
Value *NewAdd =
BinaryOperator::CreateAdd(TruncIndVar, newAddRHS,
UInst->getName()+".nosex", UInst);
if (!RHS->getValue().isNegative()) {
uint64_t newBitSize = LargestType->getPrimitiveSizeInBits();
SExtInst* oldSext = dyn_cast<SExtInst>(UInst->use_begin());
+ uint64_t truncSize = oldSext->getType()->getPrimitiveSizeInBits();
Value *TruncIndVar = getSignExtendedTruncVar(AR, SE, LargestType,
L, oldSext->getType(), Rewriter,
InsertPt);
- APInt APcopy = APInt(RHS->getValue());
- ConstantInt* newRHS =ConstantInt::get(APcopy.sext(newBitSize));
- Value *NewAdd =
- BinaryOperator::CreateOr(TruncIndVar, newRHS,
+ APInt APnewOrRHS = APInt(RHS->getValue()).sext(newBitSize);
+ if (newBitSize > truncSize)
+ APnewOrRHS = APnewOrRHS.trunc(truncSize);
+ ConstantInt* newOrRHS =ConstantInt::get(APnewOrRHS);
+ Value *NewOr =
+ BinaryOperator::CreateOr(TruncIndVar, newOrRHS,
UInst->getName()+".nosex", UInst);
for (Value::use_iterator UI2 = UInst->use_begin(),
UE2 = UInst->use_end(); UI2 != UE2; ++UI2) {
Instruction *II = dyn_cast<Instruction>(UI2);
- II->replaceAllUsesWith(NewAdd);
+ II->replaceAllUsesWith(NewOr);
DeadInsts.insert(II);
}
DeadInsts.insert(UInst);
uint64_t newBitSize = LargestType->getPrimitiveSizeInBits();
ConstantInt* AndRHS = dyn_cast<ConstantInt>(UInst->getOperand(1));
ZExtInst* oldZext = dyn_cast<ZExtInst>(UInst->use_begin());
+ uint64_t truncSize = oldZext->getType()->getPrimitiveSizeInBits();
Value *TruncIndVar = getSignExtendedTruncVar(AR, SE, LargestType,
L, oldZext->getType(), Rewriter, InsertPt);
- APInt APcopy = APInt(AndRHS->getValue());
- ConstantInt* newAndRHS = ConstantInt::get(APcopy.zext(newBitSize));
+ APInt APnewAndRHS = APInt(AndRHS->getValue()).zext(newBitSize);
+ if (newBitSize > truncSize)
+ APnewAndRHS = APnewAndRHS.trunc(truncSize);
+ ConstantInt* newAndRHS = ConstantInt::get(APnewAndRHS);
Value *NewAnd =
BinaryOperator::CreateAnd(TruncIndVar, newAndRHS,
UInst->getName()+".nozex", UInst);
allUsesAreSameTyped(Instruction::ZExt, UInst2) &&
isa<ConstantInt>(UInst2->getOperand(1))) {
ZExtInst* oldZext = dyn_cast<ZExtInst>(UInst2->use_begin());
+ uint64_t truncSize = oldZext->getType()->getPrimitiveSizeInBits();
Value *TruncIndVar = getSignExtendedTruncVar(AR, SE, LargestType,
L, oldZext->getType(), Rewriter, InsertPt);
ConstantInt* AndRHS = dyn_cast<ConstantInt>(UInst2->getOperand(1));
- APInt APcopy = APInt(AddRHS->getValue());
- ConstantInt* newAddRHS = ConstantInt::get(APcopy.zext(newBitSize));
+ APInt APnewAddRHS = APInt(AddRHS->getValue()).zext(newBitSize);
+ if (newBitSize > truncSize)
+ APnewAddRHS = APnewAddRHS.trunc(truncSize);
+ ConstantInt* newAddRHS = ConstantInt::get(APnewAddRHS);
Value *NewAdd = ((UInst->getOpcode()==Instruction::Add) ?
BinaryOperator::CreateAdd(TruncIndVar, newAddRHS,
UInst->getName()+".nozex", UInst2) :