1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=hexagon -O3 -hexagon-instsimplify=0 < %s | FileCheck %s 3 4define void @f0(ptr nocapture %a0, i32 %a1, i32 %a2) #0 { 5; CHECK-LABEL: f0: 6; CHECK: // %bb.0: // %b0 7; CHECK-NEXT: { 8; CHECK-NEXT: loop0(.LBB0_1,#3) 9; CHECK-NEXT: } 10; CHECK-NEXT: .p2align 4 11; CHECK-NEXT: .LBB0_1: // Block address taken 12; CHECK-NEXT: // %b2 13; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 14; CHECK-NEXT: { 15; CHECK-NEXT: nop 16; CHECK-NEXT: nop 17; CHECK-NEXT: } :endloop0 18; CHECK-NEXT: // %bb.2: // %b3 19; CHECK-NEXT: { 20; CHECK-NEXT: jumpr r31 21; CHECK-NEXT: } 22b0: 23 br label %b1 24 25b1: ; preds = %b0 26 br label %b2 27 28b2: ; preds = %b2, %b1 29 %v0 = phi i32 [ 0, %b1 ], [ %v1, %b2 ] 30 %v1 = add nsw i32 %v0, 1 31 %v2 = icmp slt i32 %v1, 3 32 br i1 %v2, label %b2, label %b3 33 34b3: ; preds = %b2 35 ret void 36} 37 38define void @f1(ptr nocapture %a0, i32 %a1, i32 %a2) #0 { 39; CHECK-LABEL: f1: 40; CHECK: // %bb.0: // %b0 41; CHECK-NEXT: { 42; CHECK-NEXT: loop0(.LBB1_1,#2) 43; CHECK-NEXT: } 44; CHECK-NEXT: .p2align 4 45; CHECK-NEXT: .LBB1_1: // Block address taken 46; CHECK-NEXT: // %b2 47; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 48; CHECK-NEXT: { 49; CHECK-NEXT: nop 50; CHECK-NEXT: nop 51; CHECK-NEXT: } :endloop0 52; CHECK-NEXT: // %bb.2: // %b3 53; CHECK-NEXT: { 54; CHECK-NEXT: jumpr r31 55; CHECK-NEXT: } 56b0: 57 br label %b1 58 59b1: ; preds = %b0 60 br label %b2 61 62b2: ; preds = %b2, %b1 63 %v0 = phi i32 [ 0, %b1 ], [ %v1, %b2 ] 64 %v1 = add nsw i32 %v0, 2 65 %v2 = icmp slt i32 %v1, 3 66 br i1 %v2, label %b2, label %b3 67 68b3: ; preds = %b2 69 ret void 70} 71 72define void @f2(ptr nocapture %a0, i32 %a1, i32 %a2) #0 { 73; CHECK-LABEL: f2: 74; CHECK: // %bb.0: // %b0 75; CHECK-NEXT: { 76; CHECK-NEXT: loop0(.LBB2_1,#1) 77; CHECK-NEXT: } 78; CHECK-NEXT: .p2align 4 79; CHECK-NEXT: .LBB2_1: // Block address taken 80; CHECK-NEXT: // %b2 81; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 82; CHECK-NEXT: { 83; CHECK-NEXT: nop 84; CHECK-NEXT: nop 85; CHECK-NEXT: } :endloop0 86; CHECK-NEXT: // %bb.2: // %b3 87; CHECK-NEXT: { 88; CHECK-NEXT: jumpr r31 89; CHECK-NEXT: } 90b0: 91 br label %b1 92 93b1: ; preds = %b0 94 br label %b2 95 96b2: ; preds = %b2, %b1 97 %v0 = phi i32 [ 0, %b1 ], [ %v1, %b2 ] 98 %v1 = add nsw i32 %v0, 3 99 %v2 = icmp slt i32 %v1, 3 100 br i1 %v2, label %b2, label %b3 101 102b3: ; preds = %b2 103 ret void 104} 105 106define void @f3(ptr nocapture %a0, i32 %a1, i32 %a2) #0 { 107; CHECK-LABEL: f3: 108; CHECK: // %bb.0: // %b0 109; CHECK-NEXT: { 110; CHECK-NEXT: loop0(.LBB3_1,#4) 111; CHECK-NEXT: } 112; CHECK-NEXT: .p2align 4 113; CHECK-NEXT: .LBB3_1: // Block address taken 114; CHECK-NEXT: // %b2 115; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 116; CHECK-NEXT: { 117; CHECK-NEXT: nop 118; CHECK-NEXT: nop 119; CHECK-NEXT: } :endloop0 120; CHECK-NEXT: // %bb.2: // %b3 121; CHECK-NEXT: { 122; CHECK-NEXT: jumpr r31 123; CHECK-NEXT: } 124b0: 125 br label %b1 126 127b1: ; preds = %b0 128 br label %b2 129 130b2: ; preds = %b2, %b1 131 %v0 = phi i32 [ 0, %b1 ], [ %v1, %b2 ] 132 %v1 = add nsw i32 %v0, 1 133 %v2 = icmp sle i32 %v1, 3 134 br i1 %v2, label %b2, label %b3 135 136b3: ; preds = %b2 137 ret void 138} 139 140define void @f4(ptr nocapture %a0, i32 %a1, i32 %a2) #0 { 141; CHECK-LABEL: f4: 142; CHECK: // %bb.0: // %b0 143; CHECK-NEXT: { 144; CHECK-NEXT: loop0(.LBB4_1,#2) 145; CHECK-NEXT: } 146; CHECK-NEXT: .p2align 4 147; CHECK-NEXT: .LBB4_1: // Block address taken 148; CHECK-NEXT: // %b2 149; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 150; CHECK-NEXT: { 151; CHECK-NEXT: nop 152; CHECK-NEXT: nop 153; CHECK-NEXT: } :endloop0 154; CHECK-NEXT: // %bb.2: // %b3 155; CHECK-NEXT: { 156; CHECK-NEXT: jumpr r31 157; CHECK-NEXT: } 158b0: 159 br label %b1 160 161b1: ; preds = %b0 162 br label %b2 163 164b2: ; preds = %b2, %b1 165 %v0 = phi i32 [ 0, %b1 ], [ %v1, %b2 ] 166 %v1 = add nsw i32 %v0, 2 167 %v2 = icmp sle i32 %v1, 3 168 br i1 %v2, label %b2, label %b3 169 170b3: ; preds = %b2 171 ret void 172} 173 174define void @f5(ptr nocapture %a0, i32 %a1, i32 %a2) #0 { 175; CHECK-LABEL: f5: 176; CHECK: // %bb.0: // %b0 177; CHECK-NEXT: { 178; CHECK-NEXT: loop0(.LBB5_1,#2) 179; CHECK-NEXT: } 180; CHECK-NEXT: .p2align 4 181; CHECK-NEXT: .LBB5_1: // Block address taken 182; CHECK-NEXT: // %b2 183; CHECK-NEXT: // =>This Inner Loop Header: Depth=1 184; CHECK-NEXT: { 185; CHECK-NEXT: nop 186; CHECK-NEXT: nop 187; CHECK-NEXT: } :endloop0 188; CHECK-NEXT: // %bb.2: // %b3 189; CHECK-NEXT: { 190; CHECK-NEXT: jumpr r31 191; CHECK-NEXT: } 192b0: 193 br label %b1 194 195b1: ; preds = %b0 196 br label %b2 197 198b2: ; preds = %b2, %b1 199 %v0 = phi i32 [ 0, %b1 ], [ %v1, %b2 ] 200 %v1 = add nsw i32 %v0, 3 201 %v2 = icmp sle i32 %v1, 3 202 br i1 %v2, label %b2, label %b3 203 204b3: ; preds = %b2 205 ret void 206} 207 208attributes #0 = { nounwind } 209