1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4 2; RUN: opt -passes='print<access-info>' -disable-output < %s 2>&1 | FileCheck %s 3 4define void @forward_dist_7(ptr %A, ptr noalias %B) { 5; CHECK-LABEL: 'forward_dist_7' 6; CHECK-NEXT: loop: 7; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 8; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding. 9; CHECK-NEXT: Dependences: 10; CHECK-NEXT: ForwardButPreventsForwarding: 11; CHECK-NEXT: store i32 0, ptr %gep.2, align 4 -> 12; CHECK-NEXT: %l = load i32, ptr %gep.1, align 4 13; CHECK-EMPTY: 14; CHECK-NEXT: Run-time memory checks: 15; CHECK-NEXT: Grouped accesses: 16; CHECK-EMPTY: 17; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 18; CHECK-NEXT: SCEV assumptions: 19; CHECK-EMPTY: 20; CHECK-NEXT: Expressions re-written: 21; 22entry: 23 br label %loop 24 25loop: 26 %iv = phi i64 [ 0, %entry ], [ %next, %loop ] 27 %gep.1 = getelementptr i32, ptr %A, i64 %iv 28 %gep.2 = getelementptr i32, ptr %gep.1, i64 7 29 store i32 0, ptr %gep.2, align 4 30 %l = load i32, ptr %gep.1 31 store i32 %l, ptr %B 32 %next = add nuw nsw i64 %iv, 1 33 %ec = icmp eq i64 %iv, 1000 34 br i1 %ec, label %exit, label %loop 35 36exit: 37 ret void 38} 39 40define void @forward_dist_9(ptr %A, ptr noalias %B) { 41; CHECK-LABEL: 'forward_dist_9' 42; CHECK-NEXT: loop: 43; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 44; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding. 45; CHECK-NEXT: Dependences: 46; CHECK-NEXT: ForwardButPreventsForwarding: 47; CHECK-NEXT: store i32 0, ptr %gep.2, align 4 -> 48; CHECK-NEXT: %l = load i32, ptr %gep.1, align 4 49; CHECK-EMPTY: 50; CHECK-NEXT: Run-time memory checks: 51; CHECK-NEXT: Grouped accesses: 52; CHECK-EMPTY: 53; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 54; CHECK-NEXT: SCEV assumptions: 55; CHECK-EMPTY: 56; CHECK-NEXT: Expressions re-written: 57; 58entry: 59 br label %loop 60 61loop: 62 %iv = phi i64 [ 0, %entry ], [ %next, %loop ] 63 %gep.1 = getelementptr i32, ptr %A, i64 %iv 64 %gep.2 = getelementptr i32, ptr %gep.1, i64 9 65 store i32 0, ptr %gep.2, align 4 66 %l = load i32, ptr %gep.1 67 store i32 %l, ptr %B 68 %next = add nuw nsw i64 %iv, 1 69 %ec = icmp eq i64 %iv, 1000 70 br i1 %ec, label %exit, label %loop 71 72exit: 73 ret void 74} 75 76define void @forward_dist_11(ptr %A, ptr noalias %B) { 77; CHECK-LABEL: 'forward_dist_11' 78; CHECK-NEXT: loop: 79; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 80; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding. 81; CHECK-NEXT: Dependences: 82; CHECK-NEXT: ForwardButPreventsForwarding: 83; CHECK-NEXT: store i32 0, ptr %gep.2, align 4 -> 84; CHECK-NEXT: %l = load i32, ptr %gep.1, align 4 85; CHECK-EMPTY: 86; CHECK-NEXT: Run-time memory checks: 87; CHECK-NEXT: Grouped accesses: 88; CHECK-EMPTY: 89; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 90; CHECK-NEXT: SCEV assumptions: 91; CHECK-EMPTY: 92; CHECK-NEXT: Expressions re-written: 93; 94entry: 95 br label %loop 96 97loop: 98 %iv = phi i64 [ 0, %entry ], [ %next, %loop ] 99 %gep.1 = getelementptr i32, ptr %A, i64 %iv 100 %gep.2 = getelementptr i32, ptr %gep.1, i64 9 101 store i32 0, ptr %gep.2, align 4 102 %l = load i32, ptr %gep.1 103 store i32 %l, ptr %B 104 %next = add nuw nsw i64 %iv, 1 105 %ec = icmp eq i64 %iv, 1000 106 br i1 %ec, label %exit, label %loop 107 108exit: 109 ret void 110} 111 112define void @forward_dist_13(ptr %A, ptr noalias %B) { 113; CHECK-LABEL: 'forward_dist_13' 114; CHECK-NEXT: loop: 115; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 116; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding. 117; CHECK-NEXT: Dependences: 118; CHECK-NEXT: ForwardButPreventsForwarding: 119; CHECK-NEXT: store i32 0, ptr %gep.2, align 4 -> 120; CHECK-NEXT: %l = load i32, ptr %gep.1, align 4 121; CHECK-EMPTY: 122; CHECK-NEXT: Run-time memory checks: 123; CHECK-NEXT: Grouped accesses: 124; CHECK-EMPTY: 125; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 126; CHECK-NEXT: SCEV assumptions: 127; CHECK-EMPTY: 128; CHECK-NEXT: Expressions re-written: 129; 130entry: 131 br label %loop 132 133loop: 134 %iv = phi i64 [ 0, %entry ], [ %next, %loop ] 135 %gep.1 = getelementptr i32, ptr %A, i64 %iv 136 %gep.2 = getelementptr i32, ptr %gep.1, i64 13 137 store i32 0, ptr %gep.2, align 4 138 %l = load i32, ptr %gep.1 139 store i32 %l, ptr %B 140 %next = add nuw nsw i64 %iv, 1 141 %ec = icmp eq i64 %iv, 1000 142 br i1 %ec, label %exit, label %loop 143 144exit: 145 ret void 146} 147 148define void @forward_dist_15(ptr %A, ptr noalias %B) { 149; CHECK-LABEL: 'forward_dist_15' 150; CHECK-NEXT: loop: 151; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 152; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding. 153; CHECK-NEXT: Dependences: 154; CHECK-NEXT: ForwardButPreventsForwarding: 155; CHECK-NEXT: store i32 0, ptr %gep.2, align 4 -> 156; CHECK-NEXT: %l = load i32, ptr %gep.1, align 4 157; CHECK-EMPTY: 158; CHECK-NEXT: Run-time memory checks: 159; CHECK-NEXT: Grouped accesses: 160; CHECK-EMPTY: 161; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 162; CHECK-NEXT: SCEV assumptions: 163; CHECK-EMPTY: 164; CHECK-NEXT: Expressions re-written: 165; 166entry: 167 br label %loop 168 169loop: 170 %iv = phi i64 [ 0, %entry ], [ %next, %loop ] 171 %gep.1 = getelementptr i32, ptr %A, i64 %iv 172 %gep.2 = getelementptr i32, ptr %gep.1, i64 13 173 store i32 0, ptr %gep.2, align 4 174 %l = load i32, ptr %gep.1 175 store i32 %l, ptr %B 176 %next = add nuw nsw i64 %iv, 1 177 %ec = icmp eq i64 %iv, 1000 178 br i1 %ec, label %exit, label %loop 179 180exit: 181 ret void 182} 183 184define void @forward_dist_17(ptr %A, ptr noalias %B) { 185; CHECK-LABEL: 'forward_dist_17' 186; CHECK-NEXT: loop: 187; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 188; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding. 189; CHECK-NEXT: Dependences: 190; CHECK-NEXT: ForwardButPreventsForwarding: 191; CHECK-NEXT: store i32 0, ptr %gep.2, align 4 -> 192; CHECK-NEXT: %l = load i32, ptr %gep.1, align 4 193; CHECK-EMPTY: 194; CHECK-NEXT: Run-time memory checks: 195; CHECK-NEXT: Grouped accesses: 196; CHECK-EMPTY: 197; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 198; CHECK-NEXT: SCEV assumptions: 199; CHECK-EMPTY: 200; CHECK-NEXT: Expressions re-written: 201; 202entry: 203 br label %loop 204 205loop: 206 %iv = phi i64 [ 0, %entry ], [ %next, %loop ] 207 %gep.1 = getelementptr i32, ptr %A, i64 %iv 208 %gep.2 = getelementptr i32, ptr %gep.1, i64 17 209 store i32 0, ptr %gep.2, align 4 210 %l = load i32, ptr %gep.1 211 store i32 %l, ptr %B 212 %next = add nuw nsw i64 %iv, 1 213 %ec = icmp eq i64 %iv, 1000 214 br i1 %ec, label %exit, label %loop 215 216exit: 217 ret void 218} 219 220define void @forward_dist_19(ptr %A, ptr noalias %B) { 221; CHECK-LABEL: 'forward_dist_19' 222; CHECK-NEXT: loop: 223; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 224; CHECK-NEXT: Forward loop carried data dependence that prevents store-to-load forwarding. 225; CHECK-NEXT: Dependences: 226; CHECK-NEXT: ForwardButPreventsForwarding: 227; CHECK-NEXT: store i32 0, ptr %gep.2, align 4 -> 228; CHECK-NEXT: %l = load i32, ptr %gep.1, align 4 229; CHECK-EMPTY: 230; CHECK-NEXT: Run-time memory checks: 231; CHECK-NEXT: Grouped accesses: 232; CHECK-EMPTY: 233; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 234; CHECK-NEXT: SCEV assumptions: 235; CHECK-EMPTY: 236; CHECK-NEXT: Expressions re-written: 237; 238entry: 239 br label %loop 240 241loop: 242 %iv = phi i64 [ 0, %entry ], [ %next, %loop ] 243 %gep.1 = getelementptr i32, ptr %A, i64 %iv 244 %gep.2 = getelementptr i32, ptr %gep.1, i64 19 245 store i32 0, ptr %gep.2, align 4 246 %l = load i32, ptr %gep.1 247 store i32 %l, ptr %B 248 %next = add nuw nsw i64 %iv, 1 249 %ec = icmp eq i64 %iv, 1000 250 br i1 %ec, label %exit, label %loop 251 252exit: 253 ret void 254} 255 256@A = global [37 x [37 x double]] zeroinitializer, align 8 257 258define void @unknown_loop_bounds(i64 %x, i64 %y) { 259; CHECK-LABEL: 'unknown_loop_bounds' 260; CHECK-NEXT: inner: 261; CHECK-NEXT: Report: unsafe dependent memory operations in loop. Use #pragma clang loop distribute(enable) to allow loop distribution to attempt to isolate the offending operations into a separate loop 262; CHECK-NEXT: Backward loop carried data dependence that prevents store-to-load forwarding. 263; CHECK-NEXT: Dependences: 264; CHECK-NEXT: BackwardVectorizableButPreventsForwarding: 265; CHECK-NEXT: %l = load double, ptr %gep.0, align 8 -> 266; CHECK-NEXT: store double %l, ptr %gep.1, align 8 267; CHECK-EMPTY: 268; CHECK-NEXT: Run-time memory checks: 269; CHECK-NEXT: Grouped accesses: 270; CHECK-EMPTY: 271; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 272; CHECK-NEXT: SCEV assumptions: 273; CHECK-EMPTY: 274; CHECK-NEXT: Expressions re-written: 275; CHECK-NEXT: outer.header: 276; CHECK-NEXT: Report: loop is not the innermost loop 277; CHECK-NEXT: Dependences: 278; CHECK-NEXT: Run-time memory checks: 279; CHECK-NEXT: Grouped accesses: 280; CHECK-EMPTY: 281; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop. 282; CHECK-NEXT: SCEV assumptions: 283; CHECK-EMPTY: 284; CHECK-NEXT: Expressions re-written: 285; 286entry: 287 br label %outer.header 288 289outer.header: 290 %outer.iv = phi i64 [ 0, %entry ], [ %outer.iv.next, %outer.latch ] 291 %outer.iv.next = add nuw nsw i64 %outer.iv, 1 292 br label %inner 293 294inner: 295 %inner.iv = phi i64 [ 0, %outer.header ], [ %inner.iv.next, %inner ] 296 %gep.0 = getelementptr inbounds [37 x [37 x double]], ptr @A, i64 0, i64 %outer.iv, i64 %inner.iv 297 %l = load double, ptr %gep.0, align 8 298 %gep.1 = getelementptr inbounds [37 x [37 x double]], ptr @A, i64 0, i64 %outer.iv.next, i64 %inner.iv 299 store double %l, ptr %gep.1, align 8 300 %inner.iv.next = add nuw nsw i64 %inner.iv, 1 301 %inner.ec = icmp eq i64 %inner.iv.next, %y 302 br i1 %inner.ec, label %outer.latch, label %inner 303 304outer.latch: 305 %outer.ec = icmp eq i64 %outer.iv.next, %x 306 br i1 %outer.ec, label %exit, label %outer.header 307 308exit: 309 ret void 310} 311