1*142ba7d7SNikita Popov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2*142ba7d7SNikita Popov; RUN: opt -S -loop-rotate < %s | FileCheck %s 3*142ba7d7SNikita Popov 4*142ba7d7SNikita Popovdefine i64 @switch_multi_entry_known_entry() { 5*142ba7d7SNikita Popov; CHECK-LABEL: @switch_multi_entry_known_entry( 6*142ba7d7SNikita Popov; CHECK-NEXT: start: 7*142ba7d7SNikita Popov; CHECK-NEXT: br label [[HEADER:%.*]] 8*142ba7d7SNikita Popov; CHECK: header: 9*142ba7d7SNikita Popov; CHECK-NEXT: [[STATE:%.*]] = phi i8 [ 2, [[START:%.*]] ], [ [[NEXT_STATE:%.*]], [[LATCH:%.*]] ] 10*142ba7d7SNikita Popov; CHECK-NEXT: [[COUNT:%.*]] = phi i64 [ 0, [[START]] ], [ [[INC:%.*]], [[LATCH]] ] 11*142ba7d7SNikita Popov; CHECK-NEXT: switch i8 [[STATE]], label [[EXIT:%.*]] [ 12*142ba7d7SNikita Popov; CHECK-NEXT: i8 0, label [[LATCH]] 13*142ba7d7SNikita Popov; CHECK-NEXT: i8 2, label [[LATCH]] 14*142ba7d7SNikita Popov; CHECK-NEXT: ] 15*142ba7d7SNikita Popov; CHECK: latch: 16*142ba7d7SNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[COUNT]], 999 17*142ba7d7SNikita Popov; CHECK-NEXT: [[NEXT_STATE]] = zext i1 [[CMP]] to i8 18*142ba7d7SNikita Popov; CHECK-NEXT: [[INC]] = add i64 [[COUNT]], 1 19*142ba7d7SNikita Popov; CHECK-NEXT: br label [[HEADER]] 20*142ba7d7SNikita Popov; CHECK: exit: 21*142ba7d7SNikita Popov; CHECK-NEXT: [[COUNT_LCSSA:%.*]] = phi i64 [ [[COUNT]], [[HEADER]] ] 22*142ba7d7SNikita Popov; CHECK-NEXT: ret i64 [[COUNT_LCSSA]] 23*142ba7d7SNikita Popov; 24*142ba7d7SNikita Popovstart: 25*142ba7d7SNikita Popov br label %header 26*142ba7d7SNikita Popov 27*142ba7d7SNikita Popovheader: ; preds = %latch, %start 28*142ba7d7SNikita Popov %state = phi i8 [ 2, %start ], [ %next_state, %latch ] 29*142ba7d7SNikita Popov %count = phi i64 [ 0, %start ], [ %inc, %latch ] 30*142ba7d7SNikita Popov switch i8 %state, label %exit [ 31*142ba7d7SNikita Popov i8 0, label %latch 32*142ba7d7SNikita Popov i8 2, label %latch 33*142ba7d7SNikita Popov ] 34*142ba7d7SNikita Popov 35*142ba7d7SNikita Popovlatch: ; preds = %header, %header 36*142ba7d7SNikita Popov %cmp = icmp eq i64 %count, 999 37*142ba7d7SNikita Popov %next_state = zext i1 %cmp to i8 38*142ba7d7SNikita Popov %inc = add i64 %count, 1 39*142ba7d7SNikita Popov br label %header 40*142ba7d7SNikita Popov 41*142ba7d7SNikita Popovexit: ; preds = %header 42*142ba7d7SNikita Popov ret i64 %count 43*142ba7d7SNikita Popov} 44*142ba7d7SNikita Popov 45*142ba7d7SNikita Popovdefine i64 @switch_multi_entry_unknown_entry(i8 %start_state) { 46*142ba7d7SNikita Popov; CHECK-LABEL: @switch_multi_entry_unknown_entry( 47*142ba7d7SNikita Popov; CHECK-NEXT: start: 48*142ba7d7SNikita Popov; CHECK-NEXT: br label [[HEADER:%.*]] 49*142ba7d7SNikita Popov; CHECK: header: 50*142ba7d7SNikita Popov; CHECK-NEXT: [[STATE:%.*]] = phi i8 [ [[START_STATE:%.*]], [[START:%.*]] ], [ [[NEXT_STATE:%.*]], [[LATCH:%.*]] ] 51*142ba7d7SNikita Popov; CHECK-NEXT: [[COUNT:%.*]] = phi i64 [ 0, [[START]] ], [ [[INC:%.*]], [[LATCH]] ] 52*142ba7d7SNikita Popov; CHECK-NEXT: switch i8 [[STATE]], label [[EXIT:%.*]] [ 53*142ba7d7SNikita Popov; CHECK-NEXT: i8 0, label [[LATCH]] 54*142ba7d7SNikita Popov; CHECK-NEXT: i8 2, label [[LATCH]] 55*142ba7d7SNikita Popov; CHECK-NEXT: ] 56*142ba7d7SNikita Popov; CHECK: latch: 57*142ba7d7SNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[COUNT]], 999 58*142ba7d7SNikita Popov; CHECK-NEXT: [[NEXT_STATE]] = zext i1 [[CMP]] to i8 59*142ba7d7SNikita Popov; CHECK-NEXT: [[INC]] = add i64 [[COUNT]], 1 60*142ba7d7SNikita Popov; CHECK-NEXT: br label [[HEADER]] 61*142ba7d7SNikita Popov; CHECK: exit: 62*142ba7d7SNikita Popov; CHECK-NEXT: [[COUNT_LCSSA:%.*]] = phi i64 [ [[COUNT]], [[HEADER]] ] 63*142ba7d7SNikita Popov; CHECK-NEXT: ret i64 [[COUNT_LCSSA]] 64*142ba7d7SNikita Popov; 65*142ba7d7SNikita Popovstart: 66*142ba7d7SNikita Popov br label %header 67*142ba7d7SNikita Popov 68*142ba7d7SNikita Popovheader: ; preds = %latch, %start 69*142ba7d7SNikita Popov %state = phi i8 [ %start_state, %start ], [ %next_state, %latch ] 70*142ba7d7SNikita Popov %count = phi i64 [ 0, %start ], [ %inc, %latch ] 71*142ba7d7SNikita Popov switch i8 %state, label %exit [ 72*142ba7d7SNikita Popov i8 0, label %latch 73*142ba7d7SNikita Popov i8 2, label %latch 74*142ba7d7SNikita Popov ] 75*142ba7d7SNikita Popov 76*142ba7d7SNikita Popovlatch: ; preds = %header, %header 77*142ba7d7SNikita Popov %cmp = icmp eq i64 %count, 999 78*142ba7d7SNikita Popov %next_state = zext i1 %cmp to i8 79*142ba7d7SNikita Popov %inc = add i64 %count, 1 80*142ba7d7SNikita Popov br label %header 81*142ba7d7SNikita Popov 82*142ba7d7SNikita Popovexit: ; preds = %header 83*142ba7d7SNikita Popov ret i64 %count 84*142ba7d7SNikita Popov} 85*142ba7d7SNikita Popov 86*142ba7d7SNikita Popovdefine i64 @switch_multi_exit_known_entry() { 87*142ba7d7SNikita Popov; CHECK-LABEL: @switch_multi_exit_known_entry( 88*142ba7d7SNikita Popov; CHECK-NEXT: start: 89*142ba7d7SNikita Popov; CHECK-NEXT: br label [[HEADER:%.*]] 90*142ba7d7SNikita Popov; CHECK: header: 91*142ba7d7SNikita Popov; CHECK-NEXT: [[STATE:%.*]] = phi i8 [ 0, [[START:%.*]] ], [ [[NEXT_STATE:%.*]], [[LATCH:%.*]] ] 92*142ba7d7SNikita Popov; CHECK-NEXT: [[COUNT:%.*]] = phi i64 [ 0, [[START]] ], [ [[INC:%.*]], [[LATCH]] ] 93*142ba7d7SNikita Popov; CHECK-NEXT: switch i8 [[STATE]], label [[LATCH]] [ 94*142ba7d7SNikita Popov; CHECK-NEXT: i8 1, label [[EXIT:%.*]] 95*142ba7d7SNikita Popov; CHECK-NEXT: i8 2, label [[EXIT]] 96*142ba7d7SNikita Popov; CHECK-NEXT: ] 97*142ba7d7SNikita Popov; CHECK: latch: 98*142ba7d7SNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[COUNT]], 999 99*142ba7d7SNikita Popov; CHECK-NEXT: [[NEXT_STATE]] = zext i1 [[CMP]] to i8 100*142ba7d7SNikita Popov; CHECK-NEXT: [[INC]] = add i64 [[COUNT]], 1 101*142ba7d7SNikita Popov; CHECK-NEXT: br label [[HEADER]] 102*142ba7d7SNikita Popov; CHECK: exit: 103*142ba7d7SNikita Popov; CHECK-NEXT: [[COUNT_LCSSA:%.*]] = phi i64 [ [[COUNT]], [[HEADER]] ], [ [[COUNT]], [[HEADER]] ] 104*142ba7d7SNikita Popov; CHECK-NEXT: ret i64 [[COUNT_LCSSA]] 105*142ba7d7SNikita Popov; 106*142ba7d7SNikita Popovstart: 107*142ba7d7SNikita Popov br label %header 108*142ba7d7SNikita Popov 109*142ba7d7SNikita Popovheader: ; preds = %latch, %start 110*142ba7d7SNikita Popov %state = phi i8 [ 0, %start ], [ %next_state, %latch ] 111*142ba7d7SNikita Popov %count = phi i64 [ 0, %start ], [ %inc, %latch ] 112*142ba7d7SNikita Popov switch i8 %state, label %latch [ 113*142ba7d7SNikita Popov i8 1, label %exit 114*142ba7d7SNikita Popov i8 2, label %exit 115*142ba7d7SNikita Popov ] 116*142ba7d7SNikita Popov 117*142ba7d7SNikita Popovlatch: ; preds = %header, %header 118*142ba7d7SNikita Popov %cmp = icmp eq i64 %count, 999 119*142ba7d7SNikita Popov %next_state = zext i1 %cmp to i8 120*142ba7d7SNikita Popov %inc = add i64 %count, 1 121*142ba7d7SNikita Popov br label %header 122*142ba7d7SNikita Popov 123*142ba7d7SNikita Popovexit: ; preds = %header 124*142ba7d7SNikita Popov ret i64 %count 125*142ba7d7SNikita Popov} 126*142ba7d7SNikita Popov 127*142ba7d7SNikita Popovdefine i64 @switch_multi_exit_unknown_entry(i8 %start_state) { 128*142ba7d7SNikita Popov; CHECK-LABEL: @switch_multi_exit_unknown_entry( 129*142ba7d7SNikita Popov; CHECK-NEXT: start: 130*142ba7d7SNikita Popov; CHECK-NEXT: br label [[HEADER:%.*]] 131*142ba7d7SNikita Popov; CHECK: header: 132*142ba7d7SNikita Popov; CHECK-NEXT: [[STATE:%.*]] = phi i8 [ [[START_STATE:%.*]], [[START:%.*]] ], [ [[NEXT_STATE:%.*]], [[LATCH:%.*]] ] 133*142ba7d7SNikita Popov; CHECK-NEXT: [[COUNT:%.*]] = phi i64 [ 0, [[START]] ], [ [[INC:%.*]], [[LATCH]] ] 134*142ba7d7SNikita Popov; CHECK-NEXT: switch i8 [[STATE]], label [[LATCH]] [ 135*142ba7d7SNikita Popov; CHECK-NEXT: i8 1, label [[EXIT:%.*]] 136*142ba7d7SNikita Popov; CHECK-NEXT: i8 2, label [[EXIT]] 137*142ba7d7SNikita Popov; CHECK-NEXT: ] 138*142ba7d7SNikita Popov; CHECK: latch: 139*142ba7d7SNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[COUNT]], 999 140*142ba7d7SNikita Popov; CHECK-NEXT: [[NEXT_STATE]] = zext i1 [[CMP]] to i8 141*142ba7d7SNikita Popov; CHECK-NEXT: [[INC]] = add i64 [[COUNT]], 1 142*142ba7d7SNikita Popov; CHECK-NEXT: br label [[HEADER]] 143*142ba7d7SNikita Popov; CHECK: exit: 144*142ba7d7SNikita Popov; CHECK-NEXT: [[COUNT_LCSSA:%.*]] = phi i64 [ [[COUNT]], [[HEADER]] ], [ [[COUNT]], [[HEADER]] ] 145*142ba7d7SNikita Popov; CHECK-NEXT: ret i64 [[COUNT_LCSSA]] 146*142ba7d7SNikita Popov; 147*142ba7d7SNikita Popovstart: 148*142ba7d7SNikita Popov br label %header 149*142ba7d7SNikita Popov 150*142ba7d7SNikita Popovheader: ; preds = %latch, %start 151*142ba7d7SNikita Popov %state = phi i8 [ %start_state, %start ], [ %next_state, %latch ] 152*142ba7d7SNikita Popov %count = phi i64 [ 0, %start ], [ %inc, %latch ] 153*142ba7d7SNikita Popov switch i8 %state, label %latch [ 154*142ba7d7SNikita Popov i8 1, label %exit 155*142ba7d7SNikita Popov i8 2, label %exit 156*142ba7d7SNikita Popov ] 157*142ba7d7SNikita Popov 158*142ba7d7SNikita Popovlatch: ; preds = %header, %header 159*142ba7d7SNikita Popov %cmp = icmp eq i64 %count, 999 160*142ba7d7SNikita Popov %next_state = zext i1 %cmp to i8 161*142ba7d7SNikita Popov %inc = add i64 %count, 1 162*142ba7d7SNikita Popov br label %header 163*142ba7d7SNikita Popov 164*142ba7d7SNikita Popovexit: ; preds = %header 165*142ba7d7SNikita Popov ret i64 %count 166*142ba7d7SNikita Popov} 167