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