1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes='loop(indvars),loop-vectorize' -S %s | FileCheck %s 3 4target triple = "x86_64-unknown-linux-gnu" 5 6; After indvars, the backedge taken count for %loop2 becomes 1, but SCEV 7; retains the cached original BTC, as the loop is in dead code. Make sure 8; LV does not crash when trying to select an interleave count for a loop with zero cost. 9define void @pr54413(i64* %ptr.base) { 10; CHECK-LABEL: @pr54413( 11; CHECK-NEXT: entry: 12; CHECK-NEXT: br label [[LOOP1:%.*]] 13; CHECK: loop1: 14; CHECK-NEXT: br i1 true, label [[LOOP1_LATCH:%.*]], label [[LOOP2_PREHEADER:%.*]] 15; CHECK: loop2.preheader: 16; CHECK-NEXT: br label [[LOOP2:%.*]] 17; CHECK: loop2: 18; CHECK-NEXT: [[PTR:%.*]] = phi i64* [ [[PTR_BASE:%.*]], [[LOOP2_PREHEADER]] ], [ [[PTR_NEXT:%.*]], [[LOOP2]] ] 19; CHECK-NEXT: [[PTR_NEXT]] = getelementptr inbounds i64, i64* [[PTR]], i64 1 20; CHECK-NEXT: br i1 true, label [[LOOP2_EXIT:%.*]], label [[LOOP2]] 21; CHECK: loop2.exit: 22; CHECK-NEXT: [[PTR_NEXT_LCSSA:%.*]] = phi i64* [ [[PTR_NEXT]], [[LOOP2]] ] 23; CHECK-NEXT: br label [[LOOP1_LATCH]] 24; CHECK: loop1.latch: 25; CHECK-NEXT: br label [[LOOP1]] 26; 27entry: 28 br label %loop1 29 30loop1: 31 br i1 true, label %loop1.latch, label %loop2.preheader 32 33loop2.preheader: 34 br label %loop2 35 36loop2: 37 %iv = phi i64 [ 0, %loop2.preheader ], [ %iv.next, %loop2 ] 38 %ptr = phi i64* [ %ptr.base, %loop2.preheader ], [ %ptr.next, %loop2 ] 39 %iv.next = add nuw nsw i64 %iv, 1 40 %ptr.next = getelementptr inbounds i64, i64* %ptr, i64 1 41 %cmp = icmp eq i64 %iv, 1024 42 br i1 %cmp, label %loop2.exit, label %loop2 43 44loop2.exit: 45 %ptr.next.lcssa = phi i64* [ %ptr.next, %loop2 ] 46 br label %loop1.latch 47 48loop1.latch: 49 br label %loop1 50} 51