1; RUN: llc -mtriple=i686-linux < %s | FileCheck %s 2 3; Don't rotate the loop if the number of fall through to exit is not larger 4; than the number of fall through to header. 5define void @no_rotate() { 6; CHECK-LABEL: no_rotate 7; CHECK: %entry 8; CHECK: %header 9; CHECK: %middle 10; CHECK: %latch1 11; CHECK: %latch2 12; CHECK: %end 13entry: 14 br label %header 15 16header: 17 %val1 = call i1 @foo() 18 br i1 %val1, label %middle, label %end 19 20middle: 21 %val2 = call i1 @foo() 22 br i1 %val2, label %latch1, label %end 23 24latch1: 25 %val3 = call i1 @foo() 26 br i1 %val3, label %latch2, label %header 27 28latch2: 29 %val4 = call i1 @foo() 30 br label %header 31 32end: 33 ret void 34} 35 36define void @do_rotate() { 37; CHECK-LABEL: do_rotate 38; CHECK: %entry 39; CHECK: %then 40; CHECK: %else 41; CHECK: %latch1 42; CHECK: %latch2 43; CHECK: %header 44; CHECK: %end 45entry: 46 %val0 = call i1 @foo() 47 br i1 %val0, label %then, label %else 48 49then: 50 call void @a() 51 br label %header 52 53else: 54 call void @b() 55 br label %header 56 57header: 58 %val1 = call i1 @foo() 59 br i1 %val1, label %latch1, label %end 60 61latch1: 62 %val3 = call i1 @foo() 63 br i1 %val3, label %latch2, label %header 64 65latch2: 66 %val4 = call i1 @foo() 67 br label %header 68 69end: 70 ret void 71} 72 73; The loop structure is same as in @no_rotate, but the loop header's predecessor 74; doesn't fall through to it, so it should be rotated to get exit fall through. 75define void @do_rotate2() { 76; CHECK-LABEL: do_rotate2 77; CHECK: %entry 78; CHECK: %then 79; CHECK: %middle 80; CHECK: %latch1 81; CHECK: %latch2 82; CHECK: %header 83; CHECK: %exit 84entry: 85 %val0 = call i1 @foo() 86 br i1 %val0, label %then, label %header, !prof !1 87 88then: 89 call void @a() 90 br label %end 91 92header: 93 %val1 = call i1 @foo() 94 br i1 %val1, label %middle, label %exit 95 96middle: 97 %val2 = call i1 @foo() 98 br i1 %val2, label %latch1, label %exit 99 100latch1: 101 %val3 = call i1 @foo() 102 br i1 %val3, label %latch2, label %header 103 104latch2: 105 %val4 = call i1 @foo() 106 br label %header 107 108exit: 109 call void @b() 110 br label %end 111 112end: 113 ret void 114} 115 116declare i1 @foo() 117declare void @a() 118declare void @b() 119 120!1 = !{!"branch_weights", i32 10, i32 1} 121