1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-26 12:43:36 +01:00
llvm-mirror/test/Analysis/MemorySSA/pr42940.ll
Alina Sbirlea ec066ddf96 [MemorySSA] Avoid adding Phis in the presence of unreachable blocks.
Summary:
If a block has all incoming values with the same MemoryAccess (ignoring
incoming values from unreachable blocks), then use that incoming
MemoryAccess and do not create a Phi in the first place.

Revert IDF work-around added in rL372673; it should not be required unless
the Def inserted is the first in its block.

The patch also cleans up a series of tests, added during the many
iterations on insertDef.

The patch also fixes PR43438.
The same issue that occurs in insertDef with "adding phis, hence the IDF of
Phis is needed", can also occur in fixupDefs: the `getPreviousRecursive`
call only adds Phis walking on the predecessor edges, which means there
may be the case of a Phi added walking the CFG "backwards" which
triggers the needs for an additional Phi in successor blocks.
Such Phis are added during fixupDefs only in the presence of unreachable
blocks.
Hence this highlights the need to avoid adding Phis in blocks with
unreachable predecessors in the first place.

Reviewers: george.burgess.iv

Subscribers: Prazek, sanjoy.google, llvm-commits

Tags: #llvm

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

llvm-svn: 372932
2019-09-25 23:24:39 +00:00

190 lines
4.9 KiB
LLVM

; RUN: opt -licm -enable-mssa-loop-dependency -verify-memoryssa -S %s | FileCheck %s
; REQUIRES: asserts
target datalayout = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-v128:64-a:8:16-n32:64"
target triple = "s390x-ibm-linux"
@g_77 = external dso_local global i16, align 2
; CHECK-LABEL: @f1()
define void @f1() {
entry:
store i16 undef, i16* @g_77, align 2
br label %loop_pre
unreachablelabel: ; No predecessors
br label %loop_pre
loop_pre:
br label %for.cond.header
for.cond.header:
store i32 0, i32* undef, align 4
br i1 undef, label %for.body, label %for.end
for.body:
%tmp1 = load volatile i16, i16* undef, align 2
br label %for.end
for.end:
br i1 undef, label %func.exit, label %for.cond.header
func.exit:
ret void
}
@g_159 = external dso_local global i32, align 4
; CHECK-LABEL: @f2()
define void @f2() {
entry:
br label %for.header.first
for.header.first:
br label %for.body.first
for.body.first:
store i32 0, i32* @g_159, align 4
br i1 undef, label %for.body.first, label %for.end.first
for.end.first:
br i1 undef, label %lor.end, label %for.header.first
lor.end:
br label %for.pre
unreachablelabel: ; No predecessors
br label %for.pre
for.pre:
br label %for.header.second
for.header.second:
store i32 undef, i32* undef, align 4
br label %for.header.second
}
@g_271 = external dso_local global i8, align 2
@g_427 = external dso_local unnamed_addr global [9 x i16], align 2
; CHECK-LABEL: @f3()
define void @f3() {
entry:
br label %for.preheader
for.preheader:
store volatile i8 undef, i8* @g_271, align 2
br i1 undef, label %for.preheader, label %for.end
for.end:
br label %lbl_1058.i
unreachablelabel: ; No predecessors
br label %lbl_1058.i
lbl_1058.i:
br label %for.cond3.preheader.i
for.cond3.preheader.i:
%tmp1 = load i16, i16* getelementptr inbounds ([9 x i16], [9 x i16]* @g_427, i64 0, i64 2), align 2
%conv620.i129 = zext i16 %tmp1 to i32
%cmp621.i130 = icmp ugt i32 undef, %conv620.i129
%conv622.i131 = zext i1 %cmp621.i130 to i32
store i32 %conv622.i131, i32* undef, align 4
br i1 undef, label %func.exit, label %for.cond3.preheader.i
func.exit:
ret void
}
@g_6 = external dso_local unnamed_addr global [3 x i32], align 4
@g_244 = external dso_local global i64, align 8
@g_1164 = external dso_local global i64, align 8
; CHECK-LABEL: @f4()
define void @f4() {
entry:
br label %for.cond8.preheader
for.cond8.preheader:
store i32 0, i32* getelementptr inbounds ([3 x i32], [3 x i32]* @g_6, i64 0, i64 2), align 4
br i1 undef, label %if.end, label %for.cond8.preheader
if.end:
br i1 undef, label %cleanup1270, label %for.cond504.preheader
for.cond504.preheader:
store i64 undef, i64* @g_244, align 8
br label %cleanup1270
for.cond559.preheader:
store i64 undef, i64* @g_1164, align 8
br i1 undef, label %for.cond559.preheader, label %cleanup1270
cleanup1270:
ret void
}
@g_1504 = external dso_local local_unnamed_addr global i16****, align 8
define void @f5() {
bb:
tail call fastcc void @f21()
br label %bb12.outer
bb12.outer.loopexit: ; No predecessors!
br label %bb12.outer
bb12.outer: ; preds = %bb12.outer.loopexit, %bb
br i1 undef, label %bb12.outer.split.us, label %bb12.preheader
bb12.preheader: ; preds = %bb12.outer
br label %bb12
bb12.outer.split.us: ; preds = %bb12.outer
br label %bb16.us.us
bb16.us.us: ; preds = %bb16.us.us, %bb12.outer.split.us
br label %bb16.us.us
bb12: ; preds = %bb77.1, %bb12.preheader
br i1 undef, label %bb25.preheader, label %bb77
bb25.preheader: ; preds = %bb12.1, %bb12
br label %bb25
bb25: ; preds = %l0, %bb25.preheader
br i1 undef, label %bb62, label %bb71.thread
bb62: ; preds = %bb25
br i1 undef, label %bb92.loopexit, label %l0
l0: ; preds = %bb62
br label %bb25
bb71.thread: ; preds = %bb25
br label %bb92
bb77: ; preds = %bb12
%tmp78 = load i16****, i16***** @g_1504, align 8
%tmp79 = load volatile i16***, i16**** %tmp78, align 8
br i1 undef, label %bb91, label %bb12.1
bb91: ; preds = %bb77.1, %bb77
unreachable
bb92.loopexit: ; preds = %bb62
br label %bb92
bb92: ; preds = %bb92.loopexit, %bb71.thread
ret void
bb12.1: ; preds = %bb77
br i1 undef, label %bb25.preheader, label %bb77.1
bb77.1: ; preds = %bb12.1
br i1 undef, label %bb91, label %bb12
}
declare void @f21()