From 9055ccdb6b33607e32ac83a8e9289fba44d1989a Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Sat, 9 Apr 2011 06:55:46 +0000 Subject: [PATCH] PR9604; try to deal with RAUW updates correctly in the AST. I'm not convinced it's completely safe to cache the AST across LICM runs even with this fix, but this fix can't hurt. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@129198 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Analysis/AliasSetTracker.h | 1 + lib/Analysis/AliasSetTracker.cpp | 4 ++ test/Transforms/LICM/2011-04-09-RAUW-AST.ll | 49 +++++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 test/Transforms/LICM/2011-04-09-RAUW-AST.ll diff --git a/include/llvm/Analysis/AliasSetTracker.h b/include/llvm/Analysis/AliasSetTracker.h index 4efa3963b66..03149c662e8 100644 --- a/include/llvm/Analysis/AliasSetTracker.h +++ b/include/llvm/Analysis/AliasSetTracker.h @@ -284,6 +284,7 @@ class AliasSetTracker { class ASTCallbackVH : public CallbackVH { AliasSetTracker *AST; virtual void deleted(); + virtual void allUsesReplacedWith(Value *); public: ASTCallbackVH(Value *V, AliasSetTracker *AST = 0); ASTCallbackVH &operator=(Value *V); diff --git a/lib/Analysis/AliasSetTracker.cpp b/lib/Analysis/AliasSetTracker.cpp index 3a46976d66f..2ed69494121 100644 --- a/lib/Analysis/AliasSetTracker.cpp +++ b/lib/Analysis/AliasSetTracker.cpp @@ -602,6 +602,10 @@ void AliasSetTracker::ASTCallbackVH::deleted() { // this now dangles! } +void AliasSetTracker::ASTCallbackVH::allUsesReplacedWith(Value *V) { + AST->copyValue(getValPtr(), V); +} + AliasSetTracker::ASTCallbackVH::ASTCallbackVH(Value *V, AliasSetTracker *ast) : CallbackVH(V), AST(ast) {} diff --git a/test/Transforms/LICM/2011-04-09-RAUW-AST.ll b/test/Transforms/LICM/2011-04-09-RAUW-AST.ll new file mode 100644 index 00000000000..4285bd19e5f --- /dev/null +++ b/test/Transforms/LICM/2011-04-09-RAUW-AST.ll @@ -0,0 +1,49 @@ +; RUN: opt < %s -loop-rotate -licm -S | FileCheck %s +; PR9604 + +@g_3 = global i32 0, align 4 +@.str = private unnamed_addr constant [4 x i8] c"%d\0A\00" + +define i32 @main() nounwind { +entry: + %tmp = load i32* @g_3, align 4 + %tobool = icmp eq i32 %tmp, 0 + br i1 %tobool, label %for.cond, label %if.then + +if.then: ; preds = %entry + br label %for.cond + +for.cond: ; preds = %for.inc10, %if.then, %entry + %g.0 = phi i32* [ %g.0, %for.inc10 ], [ @g_3, %entry ], [ null, %if.then ] + %x.0 = phi i32 [ %inc12, %for.inc10 ], [ 0, %entry ], [ 0, %if.then ] + %cmp = icmp slt i32 %x.0, 5 + br i1 %cmp, label %for.cond4, label %for.end13 + +for.cond4: ; preds = %for.body7, %for.cond + %y.0 = phi i32 [ %inc, %for.body7 ], [ 0, %for.cond ] + %cmp6 = icmp slt i32 %y.0, 5 + br i1 %cmp6, label %for.body7, label %for.inc10 + +; CHECK: for.body7: +; CHECK-NEXT: phi +; CHECK-NEXT: store i32 0 +; CHECK-NEXT: store i32 1 + +for.body7: ; preds = %for.cond4 + store i32 0, i32* @g_3, align 4 + store i32 1, i32* %g.0, align 4 + %inc = add nsw i32 %y.0, 1 + br label %for.cond4 + +for.inc10: ; preds = %for.cond4 + %inc12 = add nsw i32 %x.0, 1 + br label %for.cond + +for.end13: ; preds = %for.cond + %tmp14 = load i32* @g_3, align 4 + %call = tail call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32 %tmp14) nounwind + ret i32 0 +} + +declare i32 @printf(i8* nocapture, ...) nounwind + -- 2.34.1