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