r239638 - [CGCall] Fix potential invalid iterator decrement in findDominatingStoreToReturnValue.

Alexey Samsonov vonosmas at gmail.com
Fri Jun 12 14:05:33 PDT 2015


Author: samsonov
Date: Fri Jun 12 16:05:32 2015
New Revision: 239638

URL: http://llvm.org/viewvc/llvm-project?rev=239638&view=rev
Log:
[CGCall] Fix potential invalid iterator decrement in findDominatingStoreToReturnValue.

If llvm.lifetime.end turns out to be the first instruction in the last
basic block, we can decrement the iterator twice, going past rend.
At the moment, this can never happen because llvm.lifetime.end always
goes immediately after bitcast, but relying on this is very brittle.

Modified:
    cfe/trunk/lib/CodeGen/CGCall.cpp

Modified: cfe/trunk/lib/CodeGen/CGCall.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=239638&r1=239637&r2=239638&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGCall.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCall.cpp Fri Jun 12 16:05:32 2015
@@ -2271,11 +2271,10 @@ static llvm::StoreInst *findDominatingSt
         if (Intrinsic->getIntrinsicID() == llvm::Intrinsic::lifetime_end) {
           const llvm::Value *CastAddr = Intrinsic->getArgOperand(1);
           ++II;
-          if (isa<llvm::BitCastInst>(&*II)) {
-            if (CastAddr == &*II) {
-              continue;
-            }
-          }
+          if (II == IE)
+            break;
+          if (isa<llvm::BitCastInst>(&*II) && (CastAddr == &*II))
+            continue;
         }
       }
       I = &*II;





More information about the cfe-commits mailing list