llvm-6502/test/Transforms/LICM/PR21582.ll
David Majnemer a32748ff23 Merging r222338:
------------------------------------------------------------------------
r222338 | majnemer | 2014-11-19 01:41:05 -0800 (Wed, 19 Nov 2014) | 16 lines

AliasSetTracker: UnknownInsts should contribute to the refcount

AliasSetTracker::addUnknown may create an AliasSet devoid of pointers
just to contain an instruction if no suitable AliasSet already exists.
It will then AliasSet::addUnknownInst and we will be done.

However, it's possible for addUnknown to choose an existing AliasSet to
addUnknownInst.
If this were to occur, we are in a bit of a pickle: removing pointers
from the AliasSet can cause the entire AliasSet to become destroyed,
taking our unknown instructions out with them.

Instead, keep track whether or not our AliasSet has any unknown
instructions.

This fixes PR21582.
------------------------------------------------------------------------


git-svn-id: https://llvm.org/svn/llvm-project/llvm/branches/release_35@223627 91177308-0d34-0410-b5e6-96231b3b80d8
2014-12-08 08:48:09 +00:00

41 lines
1.3 KiB
LLVM

; RUN: opt < %s -basicaa -licm -S | FileCheck %s
@b = external global i32, align 4
@fn3.i = external global i32, align 4
declare i32 @g() nounwind
define i32 @f() {
entry:
br label %for.cond
for.cond: ; preds = %for.end, %entry
; CHECK-LABEL: for.cond:
; CHECK: store i32 0, i32* @b
store i32 0, i32* @b, align 4
br i1 true, label %for.body.preheader, label %for.end
for.body.preheader: ; preds = %for.cond
br label %for.body
for.body: ; preds = %for.body, %for.body.preheader
%g.15 = phi i32 [ undef, %for.body ], [ 0, %for.body.preheader ]
%arrayidx2 = getelementptr inbounds i32* @fn3.i, i64 0
%0 = load i32* %arrayidx2, align 4
%call = call i32 @g()
br i1 false, label %for.body, label %for.end.loopexit
for.end.loopexit: ; preds = %for.body
br label %for.end
for.end: ; preds = %for.end.loopexit, %for.cond
%whatever = phi i32 [ %call, %for.end.loopexit ], [ undef, %for.cond ]
br i1 false, label %for.cond, label %if.then
if.then: ; preds = %for.end
; CHECK-LABEL: if.then:
; CHECK: phi i32 [ {{.*}}, %for.end ]
; CHECK-NOT: store i32 0, i32* @b
; CHECK: ret i32
ret i32 %whatever
}