1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00
llvm-mirror/test/Analysis/MemorySSA/pr40038.ll
Alina Sbirlea 58c46a9180 [MemorySSA & LoopPassManager] Resolve PR40038.
The correct edge being deleted is not to the unswitched exit block, but to the
original block before it was split. That's the key in the map, not the
value.
The insert is correct. The new edge is to the .split block.

The splitting turns OriginalBB into:
OriginalBB -> OriginalBB.split.
Assuming the orignal CFG edge: ParentBB->OriginalBB, we must now delete
ParentBB->OriginalBB, not ParentBB->OriginalBB.split.

llvm-svn: 354656
2019-02-22 07:18:37 +00:00

84 lines
3.0 KiB
LLVM

; REQUIRES: asserts
; RUN: opt -S -mtriple=systemz-unknown -mcpu=z13 -O3 -enable-mssa-loop-dependency -enable-simple-loop-unswitch -verify-memoryssa < %s | FileCheck %s
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_80 = external dso_local global i32, align 4
@g_1683 = external dso_local global i32, align 4
@0 = internal global [7 x i8] c"\00\EE\00\00\EE\00\00", align 2
; Function Attrs: nounwind
; CHECK-LABEL: @main
define dso_local void @main() #0 {
bb:
call void @func_1()
unreachable
}
; Function Attrs: nounwind
define dso_local void @func_1() #0 {
bb:
call void @func_2()
unreachable
}
; Function Attrs: nounwind
define dso_local void @func_2() #0 {
bb:
%tmp = alloca i32, align 4
store i32 0, i32* @g_80, align 4, !tbaa !1
br label %bb1
bb1: ; preds = %bb15, %bb
%tmp2 = load i32, i32* @g_80, align 4, !tbaa !1
%tmp3 = icmp sle i32 %tmp2, 6
br i1 %tmp3, label %bb4, label %bb18
bb4: ; preds = %bb1
%tmp5 = load i32, i32* @g_1683, align 4, !tbaa !1
%tmp6 = sext i32 %tmp5 to i64
%tmp7 = getelementptr inbounds [7 x i8], [7 x i8]* @0, i64 0, i64 %tmp6
%tmp8 = load i8, i8* %tmp7, align 1, !tbaa !5
%tmp9 = icmp ne i8 %tmp8, 0
br i1 %tmp9, label %bb10, label %bb11
bb10: ; preds = %bb4
store i32 82, i32* %tmp, align 4
br label %bb12
bb11: ; preds = %bb4
store i32 0, i32* %tmp, align 4
br label %bb12
bb12: ; preds = %bb11, %bb10
%tmp13 = load i32, i32* %tmp, align 4
%tmp14 = icmp ult i32 %tmp13, 1
br i1 %tmp14, label %bb15, label %bb18
bb15: ; preds = %bb12
%tmp16 = load i32, i32* @g_80, align 4, !tbaa !1
%tmp17 = add nsw i32 %tmp16, 1
store i32 %tmp17, i32* @g_80, align 4, !tbaa !1
br label %bb1
bb18: ; preds = %bb12, %bb1
call void @llvm.trap()
unreachable
}
; Function Attrs: cold noreturn nounwind
declare void @llvm.trap() #1
attributes #0 = { nounwind "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "min-legal-vector-width"="0" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="z13" "target-features"="+transactional-execution,+vector" "unsafe-fp-math"="false" "use-soft-float"="false" }
attributes #1 = { cold noreturn nounwind }
!llvm.ident = !{!0}
!0 = !{!"clang version 8.0.0 (http://llvm.org/git/clang.git a674a04e68bcf09f9a0423f3f589589596bc01a6) (http://llvm.org/git/llvm.git 1fe1ffe00e034128d1c5504254fdd4742f48bb9a)"}
!1 = !{!2, !2, i64 0}
!2 = !{!"int", !3, i64 0}
!3 = !{!"omnipotent char", !4, i64 0}
!4 = !{!"Simple C/C++ TBAA"}
!5 = !{!3, !3, i64 0}