289 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 52; RUN: opt -passes="print<access-info>" -disable-output %s 2>&1 | FileCheck %s3 4define i32 @completely_before_or_after_true_dep_different_size(ptr %d) {5; CHECK-LABEL: 'completely_before_or_after_true_dep_different_size'6; CHECK-NEXT: loop:7; CHECK-NEXT: Memory dependences are safe8; CHECK-NEXT: Dependences:9; CHECK-NEXT: Run-time memory checks:10; CHECK-NEXT: Grouped accesses:11; CHECK-EMPTY:12; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.13; CHECK-NEXT: SCEV assumptions:14; CHECK-EMPTY:15; CHECK-NEXT: Expressions re-written:16;17entry:18 %gep.128 = getelementptr i8, ptr %d, i64 12819 br label %loop20 21loop:22 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]23 %gep.128.iv = getelementptr i64, ptr %gep.128, i64 %iv24 store i64 0, ptr %gep.128.iv, align 825 %gep.iv = getelementptr i32, ptr %d, i64 %iv26 %l = load i32, ptr %gep.iv, align 427 %iv.next = add i64 %iv, 128 %ec = icmp eq i64 %iv.next, 3229 br i1 %ec, label %exit, label %loop30 31exit:32 ret i32 %l33}34 35define i32 @may_overlap_true_dep_different_size(ptr %d) {36; CHECK-LABEL: 'may_overlap_true_dep_different_size'37; CHECK-NEXT: loop:38; CHECK-NEXT: Memory dependences are safe with run-time checks39; CHECK-NEXT: Dependences:40; CHECK-NEXT: Run-time memory checks:41; CHECK-NEXT: Check 0:42; CHECK-NEXT: Comparing group GRP0:43; CHECK-NEXT: %gep.128.iv = getelementptr i64, ptr %gep.128, i64 %iv44; CHECK-NEXT: Against group GRP1:45; CHECK-NEXT: %gep.iv = getelementptr i32, ptr %d, i64 %iv46; CHECK-NEXT: Grouped accesses:47; CHECK-NEXT: Group GRP0:48; CHECK-NEXT: (Low: (127 + %d) High: (383 + %d))49; CHECK-NEXT: Member: {(127 + %d),+,8}<nw><%loop>50; CHECK-NEXT: Group GRP1:51; CHECK-NEXT: (Low: %d High: (128 + %d))52; CHECK-NEXT: Member: {%d,+,4}<nw><%loop>53; CHECK-EMPTY:54; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.55; CHECK-NEXT: SCEV assumptions:56; CHECK-EMPTY:57; CHECK-NEXT: Expressions re-written:58;59entry:60 %gep.128 = getelementptr i8, ptr %d, i64 12761 br label %loop62 63loop:64 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]65 %gep.128.iv = getelementptr i64, ptr %gep.128, i64 %iv66 store i64 0, ptr %gep.128.iv, align 867 %gep.iv= getelementptr i32, ptr %d, i64 %iv68 %l = load i32, ptr %gep.iv, align 469 %iv.next = add i64 %iv, 170 %ec = icmp eq i64 %iv.next, 3271 br i1 %ec, label %exit, label %loop72 73exit:74 ret i32 %l75}76 77define void @completely_after_stores_with_different_sizes(ptr %dst) {78; CHECK-LABEL: 'completely_after_stores_with_different_sizes'79; CHECK-NEXT: loop:80; CHECK-NEXT: Memory dependences are safe81; CHECK-NEXT: Dependences:82; CHECK-NEXT: Run-time memory checks:83; CHECK-NEXT: Grouped accesses:84; CHECK-EMPTY:85; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.86; CHECK-NEXT: SCEV assumptions:87; CHECK-EMPTY:88; CHECK-NEXT: Expressions re-written:89;90entry:91 %gep.dst.128 = getelementptr nuw i8, ptr %dst, i64 12892 br label %loop93 94loop:95 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]96 %gep.iv = getelementptr i16, ptr %dst, i64 %iv97 store i16 0, ptr %gep.iv, align 298 %gep.dst.128.iv = getelementptr i8, ptr %gep.dst.128, i64 %iv99 store i8 0, ptr %gep.dst.128.iv, align 1100 %iv.next = add i64 %iv, 1101 %ec = icmp eq i64 %iv.next, 64102 br i1 %ec, label %exit, label %loop103 104exit:105 ret void106}107 108 109define void @may_overlap_stores_with_different_sizes(ptr %dst) {110; CHECK-LABEL: 'may_overlap_stores_with_different_sizes'111; CHECK-NEXT: loop:112; CHECK-NEXT: Memory dependences are safe with run-time checks113; CHECK-NEXT: Dependences:114; CHECK-NEXT: Run-time memory checks:115; CHECK-NEXT: Check 0:116; CHECK-NEXT: Comparing group GRP0:117; CHECK-NEXT: %gep.iv = getelementptr i16, ptr %dst, i64 %iv118; CHECK-NEXT: Against group GRP1:119; CHECK-NEXT: %gep.dst.128.iv = getelementptr i8, ptr %gep.dst.128, i64 %iv120; CHECK-NEXT: Grouped accesses:121; CHECK-NEXT: Group GRP0:122; CHECK-NEXT: (Low: %dst High: (130 + %dst))123; CHECK-NEXT: Member: {%dst,+,2}<nw><%loop>124; CHECK-NEXT: Group GRP1:125; CHECK-NEXT: (Low: (128 + %dst)<nuw> High: (193 + %dst))126; CHECK-NEXT: Member: {(128 + %dst)<nuw>,+,1}<nw><%loop>127; CHECK-EMPTY:128; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.129; CHECK-NEXT: SCEV assumptions:130; CHECK-EMPTY:131; CHECK-NEXT: Expressions re-written:132;133entry:134 %gep.dst.128 = getelementptr nuw i8, ptr %dst, i64 128135 br label %loop136 137loop:138 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]139 %gep.iv = getelementptr i16, ptr %dst, i64 %iv140 store i16 0, ptr %gep.iv, align 2141 %gep.dst.128.iv = getelementptr i8, ptr %gep.dst.128, i64 %iv142 store i8 0, ptr %gep.dst.128.iv, align 1143 %iv.next = add i64 %iv, 1144 %ec = icmp eq i64 %iv.next, 65145 br i1 %ec, label %exit, label %loop146 147exit: ; preds = %loop148 ret void149}150 151define void @completely_before_or_after_non_const_distance(ptr %dst) {152; CHECK-LABEL: 'completely_before_or_after_non_const_distance'153; CHECK-NEXT: loop:154; CHECK-NEXT: Memory dependences are safe155; CHECK-NEXT: Dependences:156; CHECK-NEXT: Run-time memory checks:157; CHECK-NEXT: Grouped accesses:158; CHECK-EMPTY:159; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.160; CHECK-NEXT: SCEV assumptions:161; CHECK-EMPTY:162; CHECK-NEXT: Expressions re-written:163;164entry:165 %gep.off = getelementptr i8, ptr %dst, i64 576166 br label %loop167 168loop:169 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]170 %iv.mul = mul i64 %iv, 84171 %gep.404 = getelementptr i8, ptr %dst, i64 404172 %gep.iv.mul = getelementptr i8, ptr %gep.404, i64 %iv.mul173 store i32 0, ptr %gep.iv.mul, align 4174 %gep.off.iv = getelementptr i32, ptr %gep.off, i64 %iv175 store i32 0, ptr %gep.off.iv, align 4176 %iv.next = add i64 %iv, 1177 %ec = icmp eq i64 %iv.next, 3178 br i1 %ec, label %exit, label %loop179 180exit:181 ret void182}183 184define void @overlap_non_const_distance(ptr %dst) {185; CHECK-LABEL: 'overlap_non_const_distance'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 loop188; CHECK-NEXT: Unknown data dependence.189; CHECK-NEXT: Dependences:190; CHECK-NEXT: Unknown:191; CHECK-NEXT: store i32 0, ptr %gep.iv.mul, align 4 ->192; CHECK-NEXT: store i32 0, ptr %gep.off.iv, align 4193; 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 %gep.off = getelementptr i8, ptr %dst, i64 575204 br label %loop205 206loop:207 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]208 %iv.mul = mul i64 %iv, 84209 %gep.404 = getelementptr i8, ptr %dst, i64 404210 %gep.iv.mul = getelementptr i8, ptr %gep.404, i64 %iv.mul211 store i32 0, ptr %gep.iv.mul, align 4212 %gep.off.iv = getelementptr i32, ptr %gep.off, i64 %iv213 store i32 0, ptr %gep.off.iv, align 4214 %iv.next = add i64 %iv, 1215 %ec = icmp eq i64 %iv.next, 3216 br i1 %ec, label %exit, label %loop217 218exit:219 ret void220}221 222define void @accesses_completely_before_or_after_instead_backwards_vectorizable(ptr dereferenceable(800) %dst) {223; CHECK-LABEL: 'accesses_completely_before_or_after_instead_backwards_vectorizable'224; CHECK-NEXT: loop:225; CHECK-NEXT: Memory dependences are safe226; CHECK-NEXT: Dependences:227; CHECK-NEXT: Run-time memory checks:228; CHECK-NEXT: Grouped accesses:229; CHECK-EMPTY:230; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.231; CHECK-NEXT: SCEV assumptions:232; CHECK-EMPTY:233; CHECK-NEXT: Expressions re-written:234;235entry:236 br label %loop237 238loop:239 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]240 %mul.2 = shl i64 %iv, 1241 %gep.mul.2 = getelementptr i16, ptr %dst, i64 %mul.2242 store i16 0, ptr %gep.mul.2, align 2243 %iv.32 = add i64 %iv, 32244 %gep.iv.32 = getelementptr i16, ptr %dst, i64 %iv.32245 store i16 0, ptr %gep.iv.32, align 2246 %iv.next = add i64 %iv, 1247 %ec = icmp eq i64 %iv, 15248 br i1 %ec, label %exit, label %loop249 250exit:251 ret void252}253 254define void @accesses_may_overlap_backwards_vectorizable(ptr dereferenceable(800) %dst) {255; CHECK-LABEL: 'accesses_may_overlap_backwards_vectorizable'256; CHECK-NEXT: loop:257; CHECK-NEXT: Memory dependences are safe with a maximum safe vector width of 128 bits258; CHECK-NEXT: Dependences:259; CHECK-NEXT: BackwardVectorizable:260; CHECK-NEXT: store i16 0, ptr %gep.mul.2, align 2 ->261; CHECK-NEXT: store i16 0, ptr %gep.iv.32, align 2262; CHECK-EMPTY:263; CHECK-NEXT: Run-time memory checks:264; CHECK-NEXT: Grouped accesses:265; CHECK-EMPTY:266; CHECK-NEXT: Non vectorizable stores to invariant address were not found in loop.267; CHECK-NEXT: SCEV assumptions:268; CHECK-EMPTY:269; CHECK-NEXT: Expressions re-written:270;271entry:272 br label %loop273 274loop:275 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]276 %mul.2 = shl i64 %iv, 1277 %gep.mul.2 = getelementptr i16, ptr %dst, i64 %mul.2278 store i16 0, ptr %gep.mul.2, align 2279 %iv.32 = add i64 %iv, 32280 %gep.iv.32 = getelementptr i16, ptr %dst, i64 %iv.32281 store i16 0, ptr %gep.iv.32, align 2282 %iv.next = add i64 %iv, 1283 %ec = icmp eq i64 %iv, 16284 br i1 %ec, label %exit, label %loop285 286exit:287 ret void288}289