Clear the SCEVExpander's insertion point after making deletions,
authorDan Gohman <gohman@apple.com>
Sat, 20 Mar 2010 03:53:53 +0000 (03:53 +0000)
committerDan Gohman <gohman@apple.com>
Sat, 20 Mar 2010 03:53:53 +0000 (03:53 +0000)
so that the SCEVExpander doesn't retain a dangling pointer as its
insert position. The dangling pointer in this case wasn't ever used
to insert new instructions, but it was causing trouble with
SCEVExpander's code for automatically advancing its insert position
past debug intrinsics.

This fixes use-after-free errors that valgrind noticed in
test/Transforms/IndVarSimplify/2007-06-06-DeleteDanglesPtr.ll and
test/Transforms/IndVarSimplify/exit_value_tests.ll.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99036 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/ScalarEvolutionExpander.h
lib/Transforms/Scalar/IndVarSimplify.cpp

index 828709404b105446d7279773f1dc39c50ec59156..dc9b73bd566d73d6539f76ee1d3d14f0bfea76ae 100644 (file)
@@ -104,6 +104,13 @@ namespace llvm {
     /// is useful for late optimization passes.
     void disableCanonicalMode() { CanonicalMode = false; }
 
+    /// clearInsertPoint - Clear the current insertion point. This is useful
+    /// if the instruction that had been serving as the insertion point may
+    /// have been deleted.
+    void clearInsertPoint() {
+      Builder.ClearInsertionPoint();
+    }
+
   private:
     LLVMContext &getContext() const { return SE.getContext(); }
 
index de93e9f621fe38a745ef74db4f0202258a890ec2..eb04d9401fbb6f81cdd6a7caa764b02fc5aa471c 100644 (file)
@@ -307,6 +307,10 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L,
       }
     }
   }
+
+  // The insertion point instruction may have been deleted; clear it out
+  // so that the rewriter doesn't trip over it later.
+  Rewriter.clearInsertPoint();
 }
 
 void IndVarSimplify::RewriteNonIntegerIVs(Loop *L) {