47 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=gvn -S -verify-loop-info %s | FileCheck %s3 4; Make sure we do not try to preserve loop-simplify form, if it would mean5; splitting blocks with indirectbr predecessors.6 7declare i1 @cond()8 9define i32 @foo(ptr %p1, ptr %p2, ptr %p3) {10; CHECK-LABEL: @foo(11; CHECK-NEXT: bb:12; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]13; CHECK: loop.header:14; CHECK-NEXT: store i32 0, ptr [[P3:%.*]], align 415; CHECK-NEXT: indirectbr ptr [[P1:%.*]], [label [[LOOP_LATCH1:%.*]], label %loop.latch2]16; CHECK: loop.latch1:17; CHECK-NEXT: [[C:%.*]] = call i1 @cond()18; CHECK-NEXT: br i1 [[C]], label [[LOOP_HEADER]], label [[LOOP_LATCH1_EXIT_CRIT_EDGE:%.*]]19; CHECK: loop.latch1.exit_crit_edge:20; CHECK-NEXT: [[X_PRE:%.*]] = load i32, ptr [[P3]], align 421; CHECK-NEXT: br label [[EXIT:%.*]]22; CHECK: loop.latch2:23; CHECK-NEXT: indirectbr ptr [[P2:%.*]], [label [[LOOP_HEADER]], label %exit]24; CHECK: exit:25; CHECK-NEXT: [[X:%.*]] = phi i32 [ [[X_PRE]], [[LOOP_LATCH1_EXIT_CRIT_EDGE]] ], [ 0, [[LOOP_LATCH2:%.*]] ]26; CHECK-NEXT: ret i32 [[X]]27;28bb:29 br label %loop.header30 31loop.header: ; preds = %loop.latch2, %loop.latch1, %bb32 store i32 0, ptr %p3, align 433 indirectbr ptr %p1, [label %loop.latch1, label %loop.latch2]34 35loop.latch1: ; preds = %loop.header36 %c = call i1 @cond()37 br i1 %c, label %loop.header, label %exit38 39loop.latch2: ; preds = %loop.header40 indirectbr ptr %p2, [label %loop.header, label %exit]41 42exit: ; preds = %loop.latch2, %loop.latch143 %x = load i32, ptr %p3, align 444 %y = add i32 %x, 045 ret i32 %y46}47