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 889842e..91e76aa 100644
--- a/CodeGen/CGExprScalar.cpp
+++ b/CodeGen/CGExprScalar.cpp
@@ -314,19 +314,24 @@
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,