1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5 2; RUN: opt < %s -disable-output "-passes=print<da>" \ 3; RUN: "-aa-pipeline=basic-aa,tbaa" 2>&1 | FileCheck %s 4 5define void @test_no_noalias(ptr %A, ptr %B) { 6; CHECK-LABEL: 'test_no_noalias' 7; CHECK-NEXT: Src: store i32 1, ptr %A, align 4 --> Dst: store i32 1, ptr %A, align 4 8; CHECK-NEXT: da analyze - none! 9; CHECK-NEXT: Src: store i32 1, ptr %A, align 4 --> Dst: store i32 2, ptr %B, align 4 10; CHECK-NEXT: da analyze - confused! 11; CHECK-NEXT: Src: store i32 2, ptr %B, align 4 --> Dst: store i32 2, ptr %B, align 4 12; CHECK-NEXT: da analyze - none! 13; 14 store i32 1, ptr %A 15 store i32 2, ptr %B 16 ret void 17} 18 19define void @test_one_noalias(ptr noalias %A, ptr %B) { 20; CHECK-LABEL: 'test_one_noalias' 21; CHECK-NEXT: Src: store i32 1, ptr %A, align 4 --> Dst: store i32 1, ptr %A, align 4 22; CHECK-NEXT: da analyze - none! 23; CHECK-NEXT: Src: store i32 1, ptr %A, align 4 --> Dst: store i32 2, ptr %B, align 4 24; CHECK-NEXT: da analyze - none! 25; CHECK-NEXT: Src: store i32 2, ptr %B, align 4 --> Dst: store i32 2, ptr %B, align 4 26; CHECK-NEXT: da analyze - none! 27; 28 store i32 1, ptr %A 29 store i32 2, ptr %B 30 ret void 31} 32 33define void @test_two_noalias(ptr noalias %A, ptr noalias %B) { 34; CHECK-LABEL: 'test_two_noalias' 35; CHECK-NEXT: Src: store i32 1, ptr %A, align 4 --> Dst: store i32 1, ptr %A, align 4 36; CHECK-NEXT: da analyze - none! 37; CHECK-NEXT: Src: store i32 1, ptr %A, align 4 --> Dst: store i32 2, ptr %B, align 4 38; CHECK-NEXT: da analyze - none! 39; CHECK-NEXT: Src: store i32 2, ptr %B, align 4 --> Dst: store i32 2, ptr %B, align 4 40; CHECK-NEXT: da analyze - none! 41; 42 store i32 1, ptr %A 43 store i32 2, ptr %B 44 ret void 45} 46 47@g = global i32 5 48define void @test_global_alias(ptr %A) { 49; CHECK-LABEL: 'test_global_alias' 50; CHECK-NEXT: Src: store i32 1, ptr %A, align 4 --> Dst: store i32 1, ptr %A, align 4 51; CHECK-NEXT: da analyze - none! 52; CHECK-NEXT: Src: store i32 1, ptr %A, align 4 --> Dst: store i32 2, ptr @g, align 4 53; CHECK-NEXT: da analyze - confused! 54; CHECK-NEXT: Src: store i32 2, ptr @g, align 4 --> Dst: store i32 2, ptr @g, align 4 55; CHECK-NEXT: da analyze - none! 56; 57 store i32 1, ptr %A 58 store i32 2, ptr @g 59 ret void 60} 61 62define void @test_global_noalias(ptr noalias %A) { 63; CHECK-LABEL: 'test_global_noalias' 64; CHECK-NEXT: Src: store i32 1, ptr %A, align 4 --> Dst: store i32 1, ptr %A, align 4 65; CHECK-NEXT: da analyze - none! 66; CHECK-NEXT: Src: store i32 1, ptr %A, align 4 --> Dst: store i32 2, ptr @g, align 4 67; CHECK-NEXT: da analyze - none! 68; CHECK-NEXT: Src: store i32 2, ptr @g, align 4 --> Dst: store i32 2, ptr @g, align 4 69; CHECK-NEXT: da analyze - none! 70; 71 store i32 1, ptr %A 72 store i32 2, ptr @g 73 ret void 74} 75 76 77@a = global i16 5, align 2 78@b = global ptr @a, align 4 79define void @test_global_size() { 80; CHECK-LABEL: 'test_global_size' 81; CHECK-NEXT: Src: %l0 = load ptr, ptr @b, align 4 --> Dst: %l0 = load ptr, ptr @b, align 4 82; CHECK-NEXT: da analyze - none! 83; CHECK-NEXT: Src: %l0 = load ptr, ptr @b, align 4 --> Dst: %l1 = load i16, ptr %l0, align 2 84; CHECK-NEXT: da analyze - confused! 85; CHECK-NEXT: Src: %l0 = load ptr, ptr @b, align 4 --> Dst: store i16 1, ptr @a, align 2 86; CHECK-NEXT: da analyze - none! 87; CHECK-NEXT: Src: %l1 = load i16, ptr %l0, align 2 --> Dst: %l1 = load i16, ptr %l0, align 2 88; CHECK-NEXT: da analyze - none! 89; CHECK-NEXT: Src: %l1 = load i16, ptr %l0, align 2 --> Dst: store i16 1, ptr @a, align 2 90; CHECK-NEXT: da analyze - confused! 91; CHECK-NEXT: Src: store i16 1, ptr @a, align 2 --> Dst: store i16 1, ptr @a, align 2 92; CHECK-NEXT: da analyze - none! 93; 94 %l0 = load ptr, ptr @b, align 4 95 %l1 = load i16, ptr %l0, align 2 96 store i16 1, ptr @a, align 2 97 ret void 98} 99 100define void @test_tbaa_same(ptr %A, ptr %B) { 101; CHECK-LABEL: 'test_tbaa_same' 102; CHECK-NEXT: Src: store i32 1, ptr %A, align 4, !tbaa !0 --> Dst: store i32 1, ptr %A, align 4, !tbaa !0 103; CHECK-NEXT: da analyze - none! 104; CHECK-NEXT: Src: store i32 1, ptr %A, align 4, !tbaa !0 --> Dst: store i32 2, ptr %B, align 4, !tbaa !0 105; CHECK-NEXT: da analyze - confused! 106; CHECK-NEXT: Src: store i32 2, ptr %B, align 4, !tbaa !0 --> Dst: store i32 2, ptr %B, align 4, !tbaa !0 107; CHECK-NEXT: da analyze - none! 108; 109 store i32 1, ptr %A, !tbaa !5 110 store i32 2, ptr %B, !tbaa !5 111 ret void 112} 113 114define void @test_tbaa_diff(ptr %A, ptr %B) { 115; CHECK-LABEL: 'test_tbaa_diff' 116; CHECK-NEXT: Src: store i32 1, ptr %A, align 4, !tbaa !0 --> Dst: store i32 1, ptr %A, align 4, !tbaa !0 117; CHECK-NEXT: da analyze - none! 118; CHECK-NEXT: Src: store i32 1, ptr %A, align 4, !tbaa !0 --> Dst: store i16 2, ptr %B, align 2, !tbaa !4 119; CHECK-NEXT: da analyze - none! 120; CHECK-NEXT: Src: store i16 2, ptr %B, align 2, !tbaa !4 --> Dst: store i16 2, ptr %B, align 2, !tbaa !4 121; CHECK-NEXT: da analyze - none! 122; 123 store i32 1, ptr %A, !tbaa !5 124 store i16 2, ptr %B, !tbaa !9 125 ret void 126} 127 128define void @tbaa_loop(i32 %I, i32 %J, ptr nocapture %A, ptr nocapture readonly %B) { 129; CHECK-LABEL: 'tbaa_loop' 130; CHECK-NEXT: Src: %0 = load i16, ptr %arrayidx.us, align 4, !tbaa !0 --> Dst: %0 = load i16, ptr %arrayidx.us, align 4, !tbaa !0 131; CHECK-NEXT: da analyze - input [* *]! 132; CHECK-NEXT: Src: %0 = load i16, ptr %arrayidx.us, align 4, !tbaa !0 --> Dst: store i32 %add.us.lcssa, ptr %arrayidx6.us, align 4, !tbaa !4 133; CHECK-NEXT: da analyze - none! 134; CHECK-NEXT: Src: store i32 %add.us.lcssa, ptr %arrayidx6.us, align 4, !tbaa !4 --> Dst: store i32 %add.us.lcssa, ptr %arrayidx6.us, align 4, !tbaa !4 135; CHECK-NEXT: da analyze - output [*]! 136; 137entry: 138 %cmp = icmp ne i32 %J, 0 139 %cmp122 = icmp ne i32 %I, 0 140 %or.cond = and i1 %cmp, %cmp122 141 br i1 %or.cond, label %for.outer.preheader, label %for.end 142 143for.outer.preheader: 144 br label %for.outer 145 146for.outer: 147 %i.us = phi i32 [ %add8.us, %for.latch ], [ 0, %for.outer.preheader ] 148 br label %for.inner 149 150for.inner: 151 %j.us = phi i32 [ 0, %for.outer ], [ %inc.us, %for.inner ] 152 %sum1.us = phi i32 [ 0, %for.outer ], [ %add.us, %for.inner ] 153 %arrayidx.us = getelementptr inbounds i16, ptr %B, i32 %j.us 154 %0 = load i16, ptr %arrayidx.us, align 4, !tbaa !9 155 %sext = sext i16 %0 to i32 156 %add.us = add i32 %sext, %sum1.us 157 %inc.us = add nuw i32 %j.us, 1 158 %exitcond = icmp eq i32 %inc.us, %J 159 br i1 %exitcond, label %for.latch, label %for.inner 160 161for.latch: 162 %add.us.lcssa = phi i32 [ %add.us, %for.inner ] 163 %arrayidx6.us = getelementptr inbounds i32, ptr %A, i32 %i.us 164 store i32 %add.us.lcssa, ptr %arrayidx6.us, align 4, !tbaa !5 165 %add8.us = add nuw i32 %i.us, 1 166 %exitcond25 = icmp eq i32 %add8.us, %I 167 br i1 %exitcond25, label %for.end.loopexit, label %for.outer 168 169for.end.loopexit: 170 br label %for.end 171 172for.end: 173 ret void 174} 175 176!5 = !{!6, !6, i64 0} 177!6 = !{!"int", !7, i64 0} 178!7 = !{!"omnipotent char", !8, i64 0} 179!8 = !{!"Simple C/C++ TBAA"} 180!9 = !{!10, !10, i64 0} 181!10 = !{!"short", !7, i64 0} 182