fix codegen of pre/post inc/dec of a pointer.

llvm-svn: 41425
This commit is contained in:
Chris Lattner 2007-08-26 05:10:16 +00:00
parent c7f06ca780
commit a01d898ff5
1 changed files with 14 additions and 9 deletions

View File

@ -314,19 +314,24 @@ Value *ScalarExprEmitter::VisitPrePostIncDec(const UnaryOperator *E,
bool isInc, bool isPre) {
LValue LV = EmitLValue(E->getSubExpr());
// FIXME: Handle volatile!
Value *InVal = CGF.EmitLoadOfLValue(LV/* false*/,
E->getSubExpr()->getType()).getVal();
Value *InVal = CGF.EmitLoadOfLValue(LV, // false
E->getSubExpr()->getType()).getVal();
int AmountVal = isInc ? 1 : -1;
Value *NextVal;
if (isa<llvm::IntegerType>(InVal->getType()))
NextVal = llvm::ConstantInt::get(InVal->getType(), AmountVal);
else
NextVal = llvm::ConstantFP::get(InVal->getType(), AmountVal);
// Add the inc/dec to the real part.
NextVal = Builder.CreateAdd(InVal, NextVal, isInc ? "inc" : "dec");
if (isa<llvm::PointerType>(InVal->getType())) {
// FIXME: This isn't right for VLAs.
NextVal = llvm::ConstantInt::get(llvm::Type::Int32Ty, AmountVal);
NextVal = Builder.CreateGEP(InVal, NextVal);
} else {
// Add the inc/dec to the real part.
if (isa<llvm::IntegerType>(InVal->getType()))
NextVal = llvm::ConstantInt::get(InVal->getType(), AmountVal);
else
NextVal = llvm::ConstantFP::get(InVal->getType(), AmountVal);
NextVal = Builder.CreateAdd(InVal, NextVal, isInc ? "inc" : "dec");
}
// Store the updated result through the lvalue.
CGF.EmitStoreThroughLValue(RValue::get(NextVal), LV,