575 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -passes=infer-alignment -S %s | FileCheck %s3 4target datalayout = "p1:64:64:64:32"5 6declare i1 @cond()7 8define void @recur_i8_128(ptr align 128 %dst) {9; CHECK-LABEL: define void @recur_i8_128(10; CHECK-SAME: ptr align 128 [[DST:%.*]]) {11; CHECK-NEXT: [[ENTRY:.*]]:12; CHECK-NEXT: br label %[[LOOP:.*]]13; CHECK: [[LOOP]]:14; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]15; CHECK-NEXT: store i64 0, ptr [[IV]], align 116; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i8, ptr [[IV]], i64 12817; CHECK-NEXT: [[C:%.*]] = call i1 @cond()18; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]19; CHECK: [[EXIT]]:20; CHECK-NEXT: ret void21;22entry:23 br label %loop24 25loop:26 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]27 store i64 0, ptr %iv, align 128 %iv.next = getelementptr nusw i8, ptr %iv, i64 12829 %c = call i1 @cond()30 br i1 %c, label %loop, label %exit31 32exit:33 ret void34}35 36define void @recur_i8_128_no_nusw(ptr align 128 %dst) {37; CHECK-LABEL: define void @recur_i8_128_no_nusw(38; CHECK-SAME: ptr align 128 [[DST:%.*]]) {39; CHECK-NEXT: [[ENTRY:.*]]:40; CHECK-NEXT: br label %[[LOOP:.*]]41; CHECK: [[LOOP]]:42; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]43; CHECK-NEXT: store i64 0, ptr [[IV]], align 144; CHECK-NEXT: [[IV_NEXT]] = getelementptr i8, ptr [[IV]], i64 12845; CHECK-NEXT: [[C:%.*]] = call i1 @cond()46; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]47; CHECK: [[EXIT]]:48; CHECK-NEXT: ret void49;50entry:51 br label %loop52 53loop:54 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]55 store i64 0, ptr %iv, align 156 %iv.next = getelementptr i8, ptr %iv, i64 12857 %c = call i1 @cond()58 br i1 %c, label %loop, label %exit59 60exit:61 ret void62}63 64define void @recur_i8_64(ptr align 128 %dst) {65; CHECK-LABEL: define void @recur_i8_64(66; CHECK-SAME: ptr align 128 [[DST:%.*]]) {67; CHECK-NEXT: [[ENTRY:.*]]:68; CHECK-NEXT: br label %[[LOOP:.*]]69; CHECK: [[LOOP]]:70; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]71; CHECK-NEXT: store i64 0, ptr [[IV]], align 172; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i8, ptr [[IV]], i64 6473; CHECK-NEXT: [[C:%.*]] = call i1 @cond()74; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]75; CHECK: [[EXIT]]:76; CHECK-NEXT: ret void77;78entry:79 br label %loop80 81loop:82 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]83 store i64 0, ptr %iv, align 184 %iv.next = getelementptr nusw i8, ptr %iv, i64 6485 %c = call i1 @cond()86 br i1 %c, label %loop, label %exit87 88exit:89 ret void90}91 92define void @recur_i8_63(ptr align 128 %dst) {93; CHECK-LABEL: define void @recur_i8_63(94; CHECK-SAME: ptr align 128 [[DST:%.*]]) {95; CHECK-NEXT: [[ENTRY:.*]]:96; CHECK-NEXT: br label %[[LOOP:.*]]97; CHECK: [[LOOP]]:98; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]99; CHECK-NEXT: store i64 0, ptr [[IV]], align 1100; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i8, ptr [[IV]], i64 63101; CHECK-NEXT: [[C:%.*]] = call i1 @cond()102; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]103; CHECK: [[EXIT]]:104; CHECK-NEXT: ret void105;106entry:107 br label %loop108 109loop:110 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]111 store i64 0, ptr %iv, align 1112 %iv.next = getelementptr nusw i8, ptr %iv, i64 63113 %c = call i1 @cond()114 br i1 %c, label %loop, label %exit115 116exit:117 ret void118}119 120define void @recur_i8_32(ptr align 128 %dst) {121; CHECK-LABEL: define void @recur_i8_32(122; CHECK-SAME: ptr align 128 [[DST:%.*]]) {123; CHECK-NEXT: [[ENTRY:.*]]:124; CHECK-NEXT: br label %[[LOOP:.*]]125; CHECK: [[LOOP]]:126; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]127; CHECK-NEXT: store i64 0, ptr [[IV]], align 1128; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i8, ptr [[IV]], i64 32129; CHECK-NEXT: [[C:%.*]] = call i1 @cond()130; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]131; CHECK: [[EXIT]]:132; CHECK-NEXT: ret void133;134entry:135 br label %loop136 137loop:138 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]139 store i64 0, ptr %iv, align 1140 %iv.next = getelementptr nusw i8, ptr %iv, i64 32141 %c = call i1 @cond()142 br i1 %c, label %loop, label %exit143 144exit:145 ret void146}147 148define void @recur_i8_16(ptr align 128 %dst) {149; CHECK-LABEL: define void @recur_i8_16(150; CHECK-SAME: ptr align 128 [[DST:%.*]]) {151; CHECK-NEXT: [[ENTRY:.*]]:152; CHECK-NEXT: br label %[[LOOP:.*]]153; CHECK: [[LOOP]]:154; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]155; CHECK-NEXT: store i64 0, ptr [[IV]], align 1156; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i8, ptr [[IV]], i64 16157; CHECK-NEXT: [[C:%.*]] = call i1 @cond()158; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]159; CHECK: [[EXIT]]:160; CHECK-NEXT: ret void161;162entry:163 br label %loop164 165loop:166 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]167 store i64 0, ptr %iv, align 1168 %iv.next = getelementptr nusw i8, ptr %iv, i64 16169 %c = call i1 @cond()170 br i1 %c, label %loop, label %exit171 172exit:173 ret void174}175 176define void @recur_i8_8(ptr align 128 %dst) {177; CHECK-LABEL: define void @recur_i8_8(178; CHECK-SAME: ptr align 128 [[DST:%.*]]) {179; CHECK-NEXT: [[ENTRY:.*]]:180; CHECK-NEXT: br label %[[LOOP:.*]]181; CHECK: [[LOOP]]:182; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]183; CHECK-NEXT: store i64 0, ptr [[IV]], align 1184; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i8, ptr [[IV]], i64 8185; CHECK-NEXT: [[C:%.*]] = call i1 @cond()186; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]187; CHECK: [[EXIT]]:188; CHECK-NEXT: ret void189;190entry:191 br label %loop192 193loop:194 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]195 store i64 0, ptr %iv, align 1196 %iv.next = getelementptr nusw i8, ptr %iv, i64 8197 %c = call i1 @cond()198 br i1 %c, label %loop, label %exit199 200exit:201 ret void202}203 204define void @recur_i8_4(ptr align 128 %dst) {205; CHECK-LABEL: define void @recur_i8_4(206; CHECK-SAME: ptr align 128 [[DST:%.*]]) {207; CHECK-NEXT: [[ENTRY:.*]]:208; CHECK-NEXT: br label %[[LOOP:.*]]209; CHECK: [[LOOP]]:210; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]211; CHECK-NEXT: store i64 0, ptr [[IV]], align 1212; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i8, ptr [[IV]], i64 4213; CHECK-NEXT: [[C:%.*]] = call i1 @cond()214; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]215; CHECK: [[EXIT]]:216; CHECK-NEXT: ret void217;218entry:219 br label %loop220 221loop:222 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]223 store i64 0, ptr %iv, align 1224 %iv.next = getelementptr nusw i8, ptr %iv, i64 4225 %c = call i1 @cond()226 br i1 %c, label %loop, label %exit227 228exit:229 ret void230}231 232define void @recur_i8_2(ptr align 128 %dst) {233; CHECK-LABEL: define void @recur_i8_2(234; CHECK-SAME: ptr align 128 [[DST:%.*]]) {235; CHECK-NEXT: [[ENTRY:.*]]:236; CHECK-NEXT: br label %[[LOOP:.*]]237; CHECK: [[LOOP]]:238; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]239; CHECK-NEXT: store i64 0, ptr [[IV]], align 1240; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i8, ptr [[IV]], i64 2241; CHECK-NEXT: [[C:%.*]] = call i1 @cond()242; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]243; CHECK: [[EXIT]]:244; CHECK-NEXT: ret void245;246entry:247 br label %loop248 249loop:250 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]251 store i64 0, ptr %iv, align 1252 %iv.next = getelementptr nusw i8, ptr %iv, i64 2253 %c = call i1 @cond()254 br i1 %c, label %loop, label %exit255 256exit:257 ret void258}259 260define void @recur_i8_1(ptr align 128 %dst) {261; CHECK-LABEL: define void @recur_i8_1(262; CHECK-SAME: ptr align 128 [[DST:%.*]]) {263; CHECK-NEXT: [[ENTRY:.*]]:264; CHECK-NEXT: br label %[[LOOP:.*]]265; CHECK: [[LOOP]]:266; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]267; CHECK-NEXT: store i64 0, ptr [[IV]], align 1268; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i8, ptr [[IV]], i64 1269; CHECK-NEXT: [[C:%.*]] = call i1 @cond()270; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]271; CHECK: [[EXIT]]:272; CHECK-NEXT: ret void273;274entry:275 br label %loop276 277loop:278 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]279 store i64 0, ptr %iv, align 1280 %iv.next = getelementptr nusw i8, ptr %iv, i64 1281 %c = call i1 @cond()282 br i1 %c, label %loop, label %exit283 284exit:285 ret void286}287 288define void @recur_i8_unknown_step(ptr align 128 %dst, i64 %off) {289; CHECK-LABEL: define void @recur_i8_unknown_step(290; CHECK-SAME: ptr align 128 [[DST:%.*]], i64 [[OFF:%.*]]) {291; CHECK-NEXT: [[ENTRY:.*]]:292; CHECK-NEXT: br label %[[LOOP:.*]]293; CHECK: [[LOOP]]:294; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]295; CHECK-NEXT: store i64 0, ptr [[IV]], align 1296; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i8, ptr [[IV]], i64 [[OFF]]297; CHECK-NEXT: [[C:%.*]] = call i1 @cond()298; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]299; CHECK: [[EXIT]]:300; CHECK-NEXT: ret void301;302entry:303 br label %loop304 305loop:306 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]307 store i64 0, ptr %iv, align 1308 %iv.next = getelementptr nusw i8, ptr %iv, i64 %off309 %c = call i1 @cond()310 br i1 %c, label %loop, label %exit311 312exit:313 ret void314}315 316define void @recur_i8_step_known_multiple(ptr align 128 %dst, i64 %off) {317; CHECK-LABEL: define void @recur_i8_step_known_multiple(318; CHECK-SAME: ptr align 128 [[DST:%.*]], i64 [[OFF:%.*]]) {319; CHECK-NEXT: [[ENTRY:.*]]:320; CHECK-NEXT: [[UREM:%.*]] = urem i64 [[OFF]], 128321; CHECK-NEXT: [[C_UREM:%.*]] = icmp eq i64 [[UREM]], 0322; CHECK-NEXT: [[C_POS:%.*]] = icmp sge i64 [[OFF]], 0323; CHECK-NEXT: [[AND:%.*]] = and i1 [[C_UREM]], [[C_POS]]324; CHECK-NEXT: br i1 [[AND]], label %[[LOOP:.*]], label %[[EXIT:.*]]325; CHECK: [[LOOP]]:326; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]327; CHECK-NEXT: store i64 0, ptr [[IV]], align 1328; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i8, ptr [[IV]], i64 [[OFF]]329; CHECK-NEXT: [[C:%.*]] = call i1 @cond()330; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT]]331; CHECK: [[EXIT]]:332; CHECK-NEXT: ret void333;334entry:335 %urem = urem i64 %off, 128336 %c.urem = icmp eq i64 %urem, 0337 %c.pos = icmp sge i64 %off, 0338 %and = and i1 %c.urem, %c.pos339 br i1 %and, label %loop, label %exit340 341loop:342 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]343 store i64 0, ptr %iv, align 1344 %iv.next = getelementptr nusw i8, ptr %iv, i64 %off345 %c = call i1 @cond()346 br i1 %c, label %loop, label %exit347 348exit:349 ret void350}351 352define void @recur_i8_i16_128(ptr align 128 %dst) {353; CHECK-LABEL: define void @recur_i8_i16_128(354; CHECK-SAME: ptr align 128 [[DST:%.*]]) {355; CHECK-NEXT: [[ENTRY:.*]]:356; CHECK-NEXT: br label %[[LOOP:.*]]357; CHECK: [[LOOP]]:358; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]359; CHECK-NEXT: store i64 0, ptr [[IV]], align 1360; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i8, ptr [[IV]], i16 128361; CHECK-NEXT: [[C:%.*]] = call i1 @cond()362; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]363; CHECK: [[EXIT]]:364; CHECK-NEXT: ret void365;366entry:367 br label %loop368 369loop:370 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]371 store i64 0, ptr %iv, align 1372 %iv.next = getelementptr nusw i8, ptr %iv, i16 128373 %c = call i1 @cond()374 br i1 %c, label %loop, label %exit375 376exit:377 ret void378}379 380define void @recur_i8_i8_132(ptr align 128 %dst) {381; CHECK-LABEL: define void @recur_i8_i8_132(382; CHECK-SAME: ptr align 128 [[DST:%.*]]) {383; CHECK-NEXT: [[ENTRY:.*]]:384; CHECK-NEXT: br label %[[LOOP:.*]]385; CHECK: [[LOOP]]:386; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]387; CHECK-NEXT: store i64 0, ptr [[IV]], align 1388; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i8, ptr [[IV]], i8 -124389; CHECK-NEXT: [[C:%.*]] = call i1 @cond()390; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]391; CHECK: [[EXIT]]:392; CHECK-NEXT: ret void393;394entry:395 br label %loop396 397loop:398 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]399 store i64 0, ptr %iv, align 1400 %iv.next = getelementptr nusw i8, ptr %iv, i8 132401 %c = call i1 @cond()402 br i1 %c, label %loop, label %exit403 404exit:405 ret void406}407 408define void @recur_i32_4(ptr align 128 %dst) {409; CHECK-LABEL: define void @recur_i32_4(410; CHECK-SAME: ptr align 128 [[DST:%.*]]) {411; CHECK-NEXT: [[ENTRY:.*]]:412; CHECK-NEXT: br label %[[LOOP:.*]]413; CHECK: [[LOOP]]:414; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]415; CHECK-NEXT: store i64 0, ptr [[IV]], align 1416; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i32, ptr [[IV]], i64 4417; CHECK-NEXT: [[C:%.*]] = call i1 @cond()418; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]419; CHECK: [[EXIT]]:420; CHECK-NEXT: ret void421;422entry:423 br label %loop424 425loop:426 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]427 store i64 0, ptr %iv, align 1428 %iv.next = getelementptr nusw i32, ptr %iv, i64 4429 %c = call i1 @cond()430 br i1 %c, label %loop, label %exit431 432exit:433 ret void434}435 436define void @recur_i32_3(ptr align 128 %dst) {437; CHECK-LABEL: define void @recur_i32_3(438; CHECK-SAME: ptr align 128 [[DST:%.*]]) {439; CHECK-NEXT: [[ENTRY:.*]]:440; CHECK-NEXT: br label %[[LOOP:.*]]441; CHECK: [[LOOP]]:442; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]443; CHECK-NEXT: store i64 0, ptr [[IV]], align 1444; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i32, ptr [[IV]], i64 4445; CHECK-NEXT: [[C:%.*]] = call i1 @cond()446; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]447; CHECK: [[EXIT]]:448; CHECK-NEXT: ret void449;450entry:451 br label %loop452 453loop:454 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]455 store i64 0, ptr %iv, align 1456 %iv.next = getelementptr nusw i32, ptr %iv, i64 4457 %c = call i1 @cond()458 br i1 %c, label %loop, label %exit459 460exit:461 ret void462}463 464define void @recur_i8_neg_128(ptr align 128 %dst) {465; CHECK-LABEL: define void @recur_i8_neg_128(466; CHECK-SAME: ptr align 128 [[DST:%.*]]) {467; CHECK-NEXT: [[ENTRY:.*]]:468; CHECK-NEXT: br label %[[LOOP:.*]]469; CHECK: [[LOOP]]:470; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]471; CHECK-NEXT: store i64 0, ptr [[IV]], align 1472; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i8, ptr [[IV]], i64 -128473; CHECK-NEXT: [[C:%.*]] = call i1 @cond()474; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]475; CHECK: [[EXIT]]:476; CHECK-NEXT: ret void477;478entry:479 br label %loop480 481loop:482 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]483 store i64 0, ptr %iv, align 1484 %iv.next = getelementptr nusw i8, ptr %iv, i64 -128485 %c = call i1 @cond()486 br i1 %c, label %loop, label %exit487 488exit:489 ret void490}491 492define void @recur_i8_neg64(ptr align 128 %dst) {493; CHECK-LABEL: define void @recur_i8_neg64(494; CHECK-SAME: ptr align 128 [[DST:%.*]]) {495; CHECK-NEXT: [[ENTRY:.*]]:496; CHECK-NEXT: br label %[[LOOP:.*]]497; CHECK: [[LOOP]]:498; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]499; CHECK-NEXT: store i64 0, ptr [[IV]], align 1500; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i8, ptr [[IV]], i64 -64501; CHECK-NEXT: [[C:%.*]] = call i1 @cond()502; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]503; CHECK: [[EXIT]]:504; CHECK-NEXT: ret void505;506entry:507 br label %loop508 509loop:510 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]511 store i64 0, ptr %iv, align 1512 %iv.next = getelementptr nusw i8, ptr %iv, i64 -64513 %c = call i1 @cond()514 br i1 %c, label %loop, label %exit515 516exit:517 ret void518}519 520define void @recur_i8_neg_63(ptr align 128 %dst) {521; CHECK-LABEL: define void @recur_i8_neg_63(522; CHECK-SAME: ptr align 128 [[DST:%.*]]) {523; CHECK-NEXT: [[ENTRY:.*]]:524; CHECK-NEXT: br label %[[LOOP:.*]]525; CHECK: [[LOOP]]:526; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]527; CHECK-NEXT: store i64 0, ptr [[IV]], align 1528; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i8, ptr [[IV]], i64 -63529; CHECK-NEXT: [[C:%.*]] = call i1 @cond()530; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]531; CHECK: [[EXIT]]:532; CHECK-NEXT: ret void533;534entry:535 br label %loop536 537loop:538 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]539 store i64 0, ptr %iv, align 1540 %iv.next = getelementptr nusw i8, ptr %iv, i64 -63541 %c = call i1 @cond()542 br i1 %c, label %loop, label %exit543 544exit:545 ret void546}547 548define void @recur_i8_neg_32(ptr align 128 %dst) {549; CHECK-LABEL: define void @recur_i8_neg_32(550; CHECK-SAME: ptr align 128 [[DST:%.*]]) {551; CHECK-NEXT: [[ENTRY:.*]]:552; CHECK-NEXT: br label %[[LOOP:.*]]553; CHECK: [[LOOP]]:554; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[DST]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]555; CHECK-NEXT: store i64 0, ptr [[IV]], align 1556; CHECK-NEXT: [[IV_NEXT]] = getelementptr nusw i8, ptr [[IV]], i64 -32557; CHECK-NEXT: [[C:%.*]] = call i1 @cond()558; CHECK-NEXT: br i1 [[C]], label %[[LOOP]], label %[[EXIT:.*]]559; CHECK: [[EXIT]]:560; CHECK-NEXT: ret void561;562entry:563 br label %loop564 565loop:566 %iv = phi ptr [ %dst, %entry ], [ %iv.next, %loop ]567 store i64 0, ptr %iv, align 1568 %iv.next = getelementptr nusw i8, ptr %iv, i64 -32569 %c = call i1 @cond()570 br i1 %c, label %loop, label %exit571 572exit:573 ret void574}575