[Mem2Reg] Avoid replacing load with itself in promoteSingleBlockAlloca.

We do the same thing in rewriteSingleStoreAlloca.

Fixes PR37632.

Reviewers: chandlerc, davide, efriedma

Reviewed By: davide

Differential Revision: https://reviews.llvm.org/D47825

llvm-svn: 334187
This commit is contained in:
Florian Hahn 2018-06-07 11:09:05 +00:00
parent ce21e1b000
commit fff954c47e
2 changed files with 25 additions and 0 deletions

View File

@ -511,6 +511,11 @@ static bool promoteSingleBlockAlloca(AllocaInst *AI, const AllocaInfo &Info,
!isKnownNonZero(ReplVal, DL, 0, AC, LI, &DT))
addAssumeNonNull(AC, LI);
// If the replacement value is the load, this must occur in unreachable
// code.
if (ReplVal == LI)
ReplVal = UndefValue::get(LI->getType());
LI->replaceAllUsesWith(ReplVal);
}

View File

@ -0,0 +1,20 @@
; RUN: opt -mem2reg < %s -S | FileCheck %s
; CHECK-LABEL: void @patatino()
; CHECK-NEXT: ret void
; CHECK-LABEL: cantreachme:
; CHECK-NEXT: %dec = add nsw i32 undef, -1
; CHECK-NEXT: br label %cantreachme
define void @patatino() {
%a = alloca i32, align 4
ret void
cantreachme:
%dec = add nsw i32 %tmp, -1
store i32 %dec, i32* %a
store i32 %tmp, i32* %a
%tmp = load i32, i32* %a
br label %cantreachme
}