From: Chris Lattner Date: Sun, 26 Aug 2007 05:10:16 +0000 (+0000) Subject: fix codegen of pre/post inc/dec of a pointer. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e936cc8890b94e83f530453c8c9167fb5de9b5fa;p=clang fix codegen of pre/post inc/dec of a pointer. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@41425 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/CodeGen/CGExprScalar.cpp b/CodeGen/CGExprScalar.cpp index 889842e1c8..91e76aaf84 100644 --- a/CodeGen/CGExprScalar.cpp +++ b/CodeGen/CGExprScalar.cpp @@ -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(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(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(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,