1; RUN: opt < %s -tbaa -basicaa -dse -S | FileCheck %s
2
3; DSE should make use of TBAA.
4
5; CHECK: @test0_yes
6; CHECK-NEXT: load i8* %b
7; CHECK-NEXT: store i8 1, i8* %a
8; CHECK-NEXT: ret i8 %y
9define i8 @test0_yes(i8* %a, i8* %b) nounwind {
10  store i8 0, i8* %a, !tbaa !1
11  %y = load i8* %b, !tbaa !2
12  store i8 1, i8* %a, !tbaa !1
13  ret i8 %y
14}
15
16; CHECK: @test0_no
17; CHECK-NEXT: store i8 0, i8* %a
18; CHECK-NEXT: load i8* %b
19; CHECK-NEXT: store i8 1, i8* %a
20; CHECK-NEXT: ret i8 %y
21define i8 @test0_no(i8* %a, i8* %b) nounwind {
22  store i8 0, i8* %a, !tbaa !3
23  %y = load i8* %b, !tbaa !4
24  store i8 1, i8* %a, !tbaa !3
25  ret i8 %y
26}
27
28; CHECK: @test1_yes
29; CHECK-NEXT: load i8* %b
30; CHECK-NEXT: store i8 1, i8* %a
31; CHECK-NEXT: ret i8 %y
32define i8 @test1_yes(i8* %a, i8* %b) nounwind {
33  store i8 0, i8* %a
34  %y = load i8* %b, !tbaa !5
35  store i8 1, i8* %a
36  ret i8 %y
37}
38
39; CHECK: @test1_no
40; CHECK-NEXT: store i8 0, i8* %a
41; CHECK-NEXT: load i8* %b
42; CHECK-NEXT: store i8 1, i8* %a
43; CHECK-NEXT: ret i8 %y
44define i8 @test1_no(i8* %a, i8* %b) nounwind {
45  store i8 0, i8* %a
46  %y = load i8* %b, !tbaa !6
47  store i8 1, i8* %a
48  ret i8 %y
49}
50
51; Root note.
52!0 = metadata !{ }
53; Some type.
54!1 = metadata !{metadata !7, metadata !7, i64 0}
55; Some other non-aliasing type.
56!2 = metadata !{metadata !8, metadata !8, i64 0}
57
58; Some type.
59!3 = metadata !{metadata !9, metadata !9, i64 0}
60; Some type in a different type system.
61!4 = metadata !{metadata !10, metadata !10, i64 0}
62
63; Invariant memory.
64!5 = metadata !{metadata !11, metadata !11, i64 0, i1 1}
65; Not invariant memory.
66!6 = metadata !{metadata !11, metadata !11, i64 0, i1 0}
67!7 = metadata !{ metadata !"foo", metadata !0 }
68!8 = metadata !{ metadata !"bar", metadata !0 }
69!9 = metadata !{ metadata !"foo", metadata !0 }
70!10 = metadata !{ metadata !"bar", metadata !"different" }
71!11 = metadata !{ metadata !"qux", metadata !0}
72