1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5 2; RUN: opt -passes='print<access-info>' -disable-output %s 2>&1 | FileCheck %s 3 4define void @all_exits_dominate_latch_countable_exits_at_most_500_iterations(ptr %A, ptr %B) { 5; CHECK-LABEL: 'all_exits_dominate_latch_countable_exits_at_most_500_iterations' 6; CHECK-NEXT: loop.header: 7; CHECK-NEXT: Memory dependences are safe with run-time checks 8; CHECK-NEXT: Dependences: 9; CHECK-NEXT: Run-time memory checks: 10; CHECK-NEXT: Check 0: 11; CHECK-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]): 12; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv 13; CHECK-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]): 14; CHECK-NEXT: %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv 15; CHECK-NEXT: Grouped accesses: 16; CHECK-NEXT: Group [[GRP1]]: 17; CHECK-NEXT: (Low: %B High: (2000 + %B)) 18; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop.header> 19; CHECK-NEXT: Group [[GRP2]]: 20; CHECK-NEXT: (Low: %A High: (2000 + %A)) 21; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop.header> 22; CHECK-EMPTY: 23; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 24; CHECK-NEXT: SCEV assumptions: 25; CHECK-EMPTY: 26; CHECK-NEXT: Expressions re-written: 27; 28entry: 29 br label %loop.header 30 31loop.header: 32 %iv = phi i64 [ 0, %entry ], [ %iv.next, %latch ] 33 %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv 34 %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv 35 %l = load i32, ptr %gep.A, align 4 36 store i32 0, ptr %gep.B, align 4 37 %cntable.c.1 = icmp ult i64 %iv, 1000 38 %iv.next = add nuw nsw i64 %iv, 1 39 br i1 %cntable.c.1, label %b2, label %e.1 40 41b2: 42 %uncntable.c.0 = icmp eq i32 %l, 0 43 br i1 %uncntable.c.0, label %e.2, label %b3 44 45b3: 46 %cntable.c.2 = icmp eq i64 %iv.next, 500 47 br i1 %cntable.c.2, label %cleanup4, label %latch 48 49latch: 50 br label %loop.header 51 52cleanup4: 53 ret void 54 55e.1: 56 ret void 57e.2: 58 ret void 59 60} 61 62 63 64define i32 @all_exits_dominate_latch_countable_exits_at_most_1000_iterations(ptr %A, ptr %B) { 65; CHECK-LABEL: 'all_exits_dominate_latch_countable_exits_at_most_1000_iterations' 66; CHECK-NEXT: loop.header: 67; CHECK-NEXT: Memory dependences are safe with run-time checks 68; CHECK-NEXT: Dependences: 69; CHECK-NEXT: Run-time memory checks: 70; CHECK-NEXT: Check 0: 71; CHECK-NEXT: Comparing group ([[GRP3:0x[0-9a-f]+]]): 72; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv 73; CHECK-NEXT: Against group ([[GRP4:0x[0-9a-f]+]]): 74; CHECK-NEXT: %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv 75; CHECK-NEXT: Grouped accesses: 76; CHECK-NEXT: Group [[GRP3]]: 77; CHECK-NEXT: (Low: %B High: (4004 + %B)) 78; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop.header> 79; CHECK-NEXT: Group [[GRP4]]: 80; CHECK-NEXT: (Low: %A High: (4004 + %A)) 81; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop.header> 82; CHECK-EMPTY: 83; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 84; CHECK-NEXT: SCEV assumptions: 85; CHECK-EMPTY: 86; CHECK-NEXT: Expressions re-written: 87; 88entry: 89 br label %loop.header 90 91loop.header: 92 %iv = phi i64 [ 0, %entry ], [ %iv.next, %latch ] 93 %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv 94 %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv 95 %l = load i32, ptr %gep.A, align 4 96 store i32 0, ptr %gep.B, align 4 97 %cntable.c.1 = icmp ult i64 %iv, 1000 98 br i1 %cntable.c.1, label %b2, label %e.1 99 100b2: 101 %uncntable.c.0 = icmp eq i32 %l, 0 102 br i1 %uncntable.c.0, label %e.2, label %b3 103 104b3: 105 %iv.next = add nuw nsw i64 %iv, 1 106 %cntable.c.2 = icmp eq i64 %iv.next, 2000 107 br i1 %cntable.c.2, label %e.0, label %latch 108 109latch: 110 br label %loop.header 111 112e.0: 113 ret i32 0 114 115e.1: 116 ret i32 1 117 118e.2: 119 ret i32 2 120} 121 122 123define i32 @not_all_exits_dominate_latch(ptr %A, ptr %B) { 124; CHECK-LABEL: 'not_all_exits_dominate_latch' 125; CHECK-NEXT: loop.header: 126; CHECK-NEXT: Report: could not determine number of loop iterations 127; CHECK-NEXT: Dependences: 128; CHECK-NEXT: Run-time memory checks: 129; CHECK-NEXT: Grouped accesses: 130; CHECK-EMPTY: 131; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 132; CHECK-NEXT: SCEV assumptions: 133; CHECK-EMPTY: 134; CHECK-NEXT: Expressions re-written: 135; 136entry: 137 br label %loop.header 138 139loop.header: 140 %iv = phi i64 [ 0, %entry ], [ %iv.next, %latch ] 141 %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv 142 %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv 143 %l = load i32, ptr %gep.A, align 4 144 store i32 0, ptr %gep.B, align 4 145 %cntable.c.1 = icmp ult i64 %iv, 1000 146 %iv.next = add nuw nsw i64 %iv, 1 147 br i1 %cntable.c.1, label %b2, label %latch 148 149b2: 150 %uncntable.c.0 = icmp eq i32 %l, 0 151 br i1 %uncntable.c.0, label %e.2, label %b3 152 153b3: 154 %cntable.c.2 = icmp eq i64 %iv.next, 2000 155 br i1 %cntable.c.2, label %e.0, label %latch 156 157latch: 158 br label %loop.header 159 160e.0: 161 ret i32 0 162 163e.2: 164 ret i32 1 165} 166 167define i32 @b3_does_not_dominate_latch(ptr %A, ptr %B) { 168; CHECK-LABEL: 'b3_does_not_dominate_latch' 169; CHECK-NEXT: loop.header: 170; CHECK-NEXT: Memory dependences are safe with run-time checks 171; CHECK-NEXT: Dependences: 172; CHECK-NEXT: Run-time memory checks: 173; CHECK-NEXT: Check 0: 174; CHECK-NEXT: Comparing group ([[GRP5:0x[0-9a-f]+]]): 175; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv 176; CHECK-NEXT: Against group ([[GRP6:0x[0-9a-f]+]]): 177; CHECK-NEXT: %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv 178; CHECK-NEXT: Grouped accesses: 179; CHECK-NEXT: Group [[GRP5]]: 180; CHECK-NEXT: (Low: %B High: (4004 + %B)) 181; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop.header> 182; CHECK-NEXT: Group [[GRP6]]: 183; CHECK-NEXT: (Low: %A High: (4004 + %A)) 184; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop.header> 185; CHECK-EMPTY: 186; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 187; CHECK-NEXT: SCEV assumptions: 188; CHECK-EMPTY: 189; CHECK-NEXT: Expressions re-written: 190; 191entry: 192 br label %loop.header 193 194loop.header: 195 %iv = phi i64 [ 0, %entry ], [ %iv.next, %latch ] 196 %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv 197 %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv 198 %l = load i32, ptr %gep.A, align 4 199 store i32 0, ptr %gep.B, align 4 200 %cntable.c.1 = icmp ult i64 %iv, 1000 201 %iv.next = add nuw nsw i64 %iv, 1 202 br i1 %cntable.c.1, label %b2, label %e.1 203 204b2: 205 %uncntable.c.0 = icmp eq i32 %l, 0 206 br i1 %uncntable.c.0, label %latch, label %b3 207 208b3: 209 %cntable.c.2 = icmp eq i64 %iv.next, 500 210 br i1 %cntable.c.2, label %e.0, label %latch 211 212latch: 213 br label %loop.header 214 215e.0: 216 ret i32 0 217 218e.1: 219 ret i32 1 220} 221