121 lines · plain
1; RUN: llc -mtriple=i686-linux < %s | FileCheck %s2 3; Don't rotate the loop if the number of fall through to exit is not larger4; than the number of fall through to header.5define void @no_rotate() {6; CHECK-LABEL: no_rotate7; CHECK: %entry8; CHECK: %header9; CHECK: %middle10; CHECK: %latch111; CHECK: %latch212; CHECK: %end13entry:14 br label %header15 16header:17 %val1 = call i1 @foo()18 br i1 %val1, label %middle, label %end19 20middle:21 %val2 = call i1 @foo()22 br i1 %val2, label %latch1, label %end23 24latch1:25 %val3 = call i1 @foo()26 br i1 %val3, label %latch2, label %header27 28latch2:29 %val4 = call i1 @foo()30 br label %header31 32end:33 ret void34}35 36define void @do_rotate() {37; CHECK-LABEL: do_rotate38; CHECK: %entry39; CHECK: %then40; CHECK: %else41; CHECK: %latch142; CHECK: %latch243; CHECK: %header44; CHECK: %end45entry:46 %val0 = call i1 @foo()47 br i1 %val0, label %then, label %else48 49then:50 call void @a()51 br label %header52 53else:54 call void @b()55 br label %header56 57header:58 %val1 = call i1 @foo()59 br i1 %val1, label %latch1, label %end60 61latch1:62 %val3 = call i1 @foo()63 br i1 %val3, label %latch2, label %header64 65latch2:66 %val4 = call i1 @foo()67 br label %header68 69end:70 ret void71}72 73; The loop structure is same as in @no_rotate, but the loop header's predecessor74; doesn't fall through to it, so it should be rotated to get exit fall through.75define void @do_rotate2() {76; CHECK-LABEL: do_rotate277; CHECK: %entry78; CHECK: %then79; CHECK: %middle80; CHECK: %latch181; CHECK: %latch282; CHECK: %header83; CHECK: %exit84entry:85 %val0 = call i1 @foo()86 br i1 %val0, label %then, label %header, !prof !187 88then:89 call void @a()90 br label %end91 92header:93 %val1 = call i1 @foo()94 br i1 %val1, label %middle, label %exit95 96middle:97 %val2 = call i1 @foo()98 br i1 %val2, label %latch1, label %exit99 100latch1:101 %val3 = call i1 @foo()102 br i1 %val3, label %latch2, label %header103 104latch2:105 %val4 = call i1 @foo()106 br label %header107 108exit:109 call void @b()110 br label %end111 112end:113 ret void114}115 116declare i1 @foo()117declare void @a()118declare void @b()119 120!1 = !{!"branch_weights", i32 10, i32 1}121