; RUN: llc -mtriple=i686-linux < %s | FileCheck %s ; Don't rotate the loop if the number of fall through to exit is not larger ; than the number of fall through to header. define void @no_rotate() { ; CHECK-LABEL: no_rotate ; CHECK: %entry ; CHECK: %header ; CHECK: %middle ; CHECK: %latch1 ; CHECK: %latch2 ; CHECK: %end entry: br label %header header: %val1 = call i1 @foo() br i1 %val1, label %middle, label %end middle: %val2 = call i1 @foo() br i1 %val2, label %latch1, label %end latch1: %val3 = call i1 @foo() br i1 %val3, label %latch2, label %header latch2: %val4 = call i1 @foo() br label %header end: ret void } define void @do_rotate() { ; CHECK-LABEL: do_rotate ; CHECK: %entry ; CHECK: %then ; CHECK: %else ; CHECK: %latch1 ; CHECK: %latch2 ; CHECK: %header ; CHECK: %end entry: %val0 = call i1 @foo() br i1 %val0, label %then, label %else then: call void @a() br label %header else: call void @b() br label %header header: %val1 = call i1 @foo() br i1 %val1, label %latch1, label %end latch1: %val3 = call i1 @foo() br i1 %val3, label %latch2, label %header latch2: %val4 = call i1 @foo() br label %header end: ret void } ; The loop structure is same as in @no_rotate, but the loop header's predecessor ; doesn't fall through to it, so it should be rotated to get exit fall through. define void @do_rotate2() { ; CHECK-LABEL: do_rotate2 ; CHECK: %entry ; CHECK: %then ; CHECK: %middle ; CHECK: %latch1 ; CHECK: %latch2 ; CHECK: %header ; CHECK: %exit entry: %val0 = call i1 @foo() br i1 %val0, label %then, label %header, !prof !1 then: call void @a() br label %end header: %val1 = call i1 @foo() br i1 %val1, label %middle, label %exit middle: %val2 = call i1 @foo() br i1 %val2, label %latch1, label %exit latch1: %val3 = call i1 @foo() br i1 %val3, label %latch2, label %header latch2: %val4 = call i1 @foo() br label %header exit: call void @b() br label %end end: ret void } declare i1 @foo() declare void @a() declare void @b() !1 = !{!"branch_weights", i32 10, i32 1}