1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt -passes='loop(indvars,loop-deletion)' -S %s | FileCheck %s 3 4; Make sure indvarsimplify properly forgets the exit value %p.2.lcssa phi after 5; modifying it. Loop deletion is required to show the incorrect use of the cached 6; SCEV value. 7 8define void @test(i1 %c) { 9; CHECK-LABEL: @test( 10; CHECK-NEXT: entry: 11; CHECK-NEXT: br label [[HEADER_1:%.*]] 12; CHECK: header.1.loopexit: 13; CHECK-NEXT: br label [[HEADER_1_BACKEDGE:%.*]] 14; CHECK: header.1: 15; CHECK-NEXT: br label [[HEADER_2:%.*]] 16; CHECK: header.2: 17; CHECK-NEXT: br i1 [[C:%.*]], label [[LATCH_1:%.*]], label [[LATCH_2:%.*]] 18; CHECK: latch.1: 19; CHECK-NEXT: br label [[HEADER_1_LOOPEXIT:%.*]] 20; CHECK: latch.2: 21; CHECK-NEXT: br label [[HEADER_1_BACKEDGE]] 22; CHECK: header.1.backedge: 23; CHECK-NEXT: br label [[HEADER_1]] 24; 25entry: 26 br label %header.1 27 28header.1: 29 %p.1 = phi i32 [ 0, %entry ], [ %p.2.lcssa, %latch.2 ], [ 0, %latch.1 ] 30 br label %header.2 31 32header.2: 33 %p.2 = phi i32 [ %p.1, %header.1 ], [ %p.2.next, %latch.1 ] 34 br i1 %c, label %latch.1, label %latch.2 35 36latch.1: 37 %p.2.next = add i32 %p.2, 1 38 br i1 false, label %header.2, label %header.1 39 40latch.2: 41 %p.2.lcssa = phi i32 [ %p.2, %header.2 ] 42 br label %header.1 43} 44 45define i8 @test_pr52023(i1 %c.1, i1 %c.2) { 46; CHECK-LABEL: @test_pr52023( 47; CHECK-NEXT: entry: 48; CHECK-NEXT: br label [[LOOP_1:%.*]] 49; CHECK: loop.1: 50; CHECK-NEXT: [[INC79:%.*]] = phi i8 [ [[TMP0:%.*]], [[LOOP_1_LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ] 51; CHECK-NEXT: [[TMP0]] = add i8 [[INC79]], 1 52; CHECK-NEXT: br label [[LOOP_2:%.*]] 53; CHECK: loop.2: 54; CHECK-NEXT: br i1 [[C_1:%.*]], label [[LOOP_2_LATCH:%.*]], label [[LOOP_1_LATCH]] 55; CHECK: loop.2.latch: 56; CHECK-NEXT: br label [[LOOP_1_LATCH]] 57; CHECK: loop.1.latch: 58; CHECK-NEXT: br i1 [[C_2:%.*]], label [[EXIT:%.*]], label [[LOOP_1]] 59; CHECK: exit: 60; CHECK-NEXT: [[INC_LCSSA_LCSSA:%.*]] = phi i8 [ [[TMP0]], [[LOOP_1_LATCH]] ] 61; CHECK-NEXT: ret i8 [[INC_LCSSA_LCSSA]] 62; 63entry: 64 br label %loop.1 65 66loop.1: 67 %inc79 = phi i8 [ %inc.lcssa, %loop.1.latch ], [ 0, %entry ] 68 br label %loop.2 69 70loop.2: 71 %inc6 = phi i8 [ %inc79, %loop.1 ], [ %inc, %loop.2.latch ] 72 %inc = add i8 %inc6, 1 73 br i1 %c.1, label %loop.2.latch , label %loop.1.latch 74 75loop.2.latch: 76 br i1 false, label %loop.2, label %loop.1.latch 77 78loop.1.latch: 79 %inc.lcssa = phi i8 [ %inc, %loop.2.latch ], [ undef, %loop.2 ] 80 br i1 %c.2, label %exit, label %loop.1 81 82exit: 83 %inc.lcssa.lcssa = phi i8 [ %inc.lcssa, %loop.1.latch ] 84 ret i8 %inc.lcssa.lcssa 85} 86