From 794c15dc71061d7c3cc6028fbe64eb30d0cdbb66 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 2 Nov 2009 04:37:17 +0000 Subject: [PATCH] fix a bug exposed by moving SRoA earlier which caused a crash building kc++ git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85786 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Utils/PromoteMemoryToRegister.cpp | 7 +++++- test/Transforms/Mem2Reg/crash.ll | 23 ++++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/lib/Transforms/Utils/PromoteMemoryToRegister.cpp b/lib/Transforms/Utils/PromoteMemoryToRegister.cpp index b70276e255e..de6ad1dde58 100644 --- a/lib/Transforms/Utils/PromoteMemoryToRegister.cpp +++ b/lib/Transforms/Utils/PromoteMemoryToRegister.cpp @@ -749,7 +749,12 @@ void PromoteMem2Reg::RewriteSingleStoreAlloca(AllocaInst *AI, } // Otherwise, we *can* safely rewrite this load. - LI->replaceAllUsesWith(OnlyStore->getOperand(0)); + Value *ReplVal = OnlyStore->getOperand(0); + // If the replacement value is the load, this must occur in unreachable + // code. + if (ReplVal == LI) + ReplVal = UndefValue::get(LI->getType()); + LI->replaceAllUsesWith(ReplVal); if (AST && isa(LI->getType())) AST->deleteValue(LI); LI->eraseFromParent(); diff --git a/test/Transforms/Mem2Reg/crash.ll b/test/Transforms/Mem2Reg/crash.ll index ce795aaaca4..655549f7940 100644 --- a/test/Transforms/Mem2Reg/crash.ll +++ b/test/Transforms/Mem2Reg/crash.ll @@ -1,12 +1,12 @@ ; RUN: opt < %s -mem2reg -S ; PR5023 -declare i32 @bar() +declare i32 @test1f() -define i32 @foo() { +define i32 @test1() { entry: %whichFlag = alloca i32 - %A = invoke i32 @bar() + %A = invoke i32 @test1f() to label %invcont2 unwind label %lpad86 invcont2: @@ -22,3 +22,20 @@ lpad86: } + + +define i32 @test2() { +entry: + %whichFlag = alloca i32 + br label %bb15 + +bb15: + %B = load i32* %whichFlag + ret i32 %B + +invcont2: + %C = load i32* %whichFlag + store i32 %C, i32* %whichFlag + br label %bb15 +} + -- 2.34.1