From c99a0d8586cd1b3f6d3b13bb839205e22375235d Mon Sep 17 00:00:00 2001
From: Chandler Carruth <chandlerc@gmail.com>
Date: Sun, 25 Aug 2013 10:46:39 +0000
Subject: [PATCH] Fix a bug where we would corrupt the offset when evaluating a
 non-constant GEP.

I don't have any test case that demonstrates this, Nadav (indirectly)
pointed this out in code review. I'm not sure how possible it is to
contrive a test case for the current users of this code that triggers
the bad issue sadly.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@189188 91177308-0d34-0410-b5e6-96231b3b80d8
---
 lib/IR/Value.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/lib/IR/Value.cpp b/lib/IR/Value.cpp
index afa9291c9ef..6698f832b25 100644
--- a/lib/IR/Value.cpp
+++ b/lib/IR/Value.cpp
@@ -411,8 +411,10 @@ Value *Value::stripAndAccumulateInBoundsConstantOffsets(const DataLayout &DL,
     if (GEPOperator *GEP = dyn_cast<GEPOperator>(V)) {
       if (!GEP->isInBounds())
         return V;
-      if (!GEP->accumulateConstantOffset(DL, Offset))
+      APInt GEPOffset(Offset);
+      if (!GEP->accumulateConstantOffset(DL, GEPOffset))
         return V;
+      Offset = GEPOffset;
       V = GEP->getPointerOperand();
     } else if (Operator::getOpcode(V) == Instruction::BitCast) {
       V = cast<Operator>(V)->getOperand(0);