brintos

brintos / llvm-project-archived public Read only

0
0
Text · 21.5 KiB · 00e04c7 Raw
463 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 52; RUN: opt -p loop-vectorize -force-vector-width=2 -prefer-predicate-over-epilogue=predicate-dont-vectorize -S %s | FileCheck %s3 4define void @canonical_small_tc_i8(ptr nocapture noundef writeonly %p) {5; CHECK-LABEL: define void @canonical_small_tc_i8(6; CHECK-SAME: ptr noundef writeonly captures(none) [[P:%.*]]) {7; CHECK-NEXT:  [[ENTRY:.*:]]8; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]9; CHECK:       [[VECTOR_PH]]:10; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]11; CHECK:       [[VECTOR_BODY]]:12; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE2:.*]] ]13; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i8> [ <i8 0, i8 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_STORE_CONTINUE2]] ]14; CHECK-NEXT:    [[TMP0:%.*]] = icmp ule <2 x i8> [[VEC_IND]], splat (i8 14)15; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i1> [[TMP0]], i32 016; CHECK-NEXT:    br i1 [[TMP1]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]17; CHECK:       [[PRED_STORE_IF]]:18; CHECK-NEXT:    [[TMP2:%.*]] = add i64 [[INDEX]], 019; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 [[TMP2]]20; CHECK-NEXT:    store i16 1, ptr [[TMP3]], align 221; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE]]22; CHECK:       [[PRED_STORE_CONTINUE]]:23; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i1> [[TMP0]], i32 124; CHECK-NEXT:    br i1 [[TMP4]], label %[[PRED_STORE_IF1:.*]], label %[[PRED_STORE_CONTINUE2]]25; CHECK:       [[PRED_STORE_IF1]]:26; CHECK-NEXT:    [[TMP5:%.*]] = add i64 [[INDEX]], 127; CHECK-NEXT:    [[TMP24:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 [[TMP5]]28; CHECK-NEXT:    store i16 1, ptr [[TMP24]], align 229; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE2]]30; CHECK:       [[PRED_STORE_CONTINUE2]]:31; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 232; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <2 x i8> [[VEC_IND]], splat (i8 2)33; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1634; CHECK-NEXT:    br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]35; CHECK:       [[MIDDLE_BLOCK]]:36; CHECK-NEXT:    br label %[[END:.*]]37; CHECK:       [[END]]:38; CHECK-NEXT:    ret void39;40entry:41  br label %loop42 43loop:44  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]45  %p.iv = getelementptr inbounds i16, ptr %p, i64 %iv46  store i16 1, ptr %p.iv, align 247  %iv.next = add nuw nsw i64 %iv, 148  %cond = icmp eq i64 %iv.next, 1549  br i1 %cond, label %end, label %loop50 51end:52  ret void53}54 55define void @canonical_upper_limit_i8(ptr nocapture noundef writeonly %p) {56; CHECK-LABEL: define void @canonical_upper_limit_i8(57; CHECK-SAME: ptr noundef writeonly captures(none) [[P:%.*]]) {58; CHECK-NEXT:  [[ENTRY:.*:]]59; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]60; CHECK:       [[VECTOR_PH]]:61; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]62; CHECK:       [[VECTOR_BODY]]:63; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE2:.*]] ]64; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i8> [ <i8 0, i8 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_STORE_CONTINUE2]] ]65; CHECK-NEXT:    [[TMP0:%.*]] = icmp ule <2 x i8> [[VEC_IND]], splat (i8 -2)66; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i1> [[TMP0]], i32 067; CHECK-NEXT:    br i1 [[TMP1]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]68; CHECK:       [[PRED_STORE_IF]]:69; CHECK-NEXT:    [[TMP2:%.*]] = add i64 [[INDEX]], 070; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 [[TMP2]]71; CHECK-NEXT:    store i16 1, ptr [[TMP3]], align 272; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE]]73; CHECK:       [[PRED_STORE_CONTINUE]]:74; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i1> [[TMP0]], i32 175; CHECK-NEXT:    br i1 [[TMP4]], label %[[PRED_STORE_IF1:.*]], label %[[PRED_STORE_CONTINUE2]]76; CHECK:       [[PRED_STORE_IF1]]:77; CHECK-NEXT:    [[TMP5:%.*]] = add i64 [[INDEX]], 178; CHECK-NEXT:    [[TMP24:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 [[TMP5]]79; CHECK-NEXT:    store i16 1, ptr [[TMP24]], align 280; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE2]]81; CHECK:       [[PRED_STORE_CONTINUE2]]:82; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 283; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <2 x i8> [[VEC_IND]], splat (i8 2)84; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], 25685; CHECK-NEXT:    br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]86; CHECK:       [[MIDDLE_BLOCK]]:87; CHECK-NEXT:    br label %[[END:.*]]88; CHECK:       [[END]]:89; CHECK-NEXT:    ret void90;91entry:92  br label %loop93 94loop:95  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]96  %p.iv = getelementptr inbounds i16, ptr %p, i64 %iv97  store i16 1, ptr %p.iv, align 298  %iv.next = add nuw nsw i64 %iv, 199  %cond = icmp eq i64 %iv.next, 255100  br i1 %cond, label %end, label %loop101 102end:103  ret void104}105 106define void @canonical_lower_limit_i16(ptr nocapture noundef writeonly %p) {107; CHECK-LABEL: define void @canonical_lower_limit_i16(108; CHECK-SAME: ptr noundef writeonly captures(none) [[P:%.*]]) {109; CHECK-NEXT:  [[ENTRY:.*:]]110; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]111; CHECK:       [[VECTOR_PH]]:112; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]113; CHECK:       [[VECTOR_BODY]]:114; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE2:.*]] ]115; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i16> [ <i16 0, i16 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_STORE_CONTINUE2]] ]116; CHECK-NEXT:    [[TMP0:%.*]] = icmp ule <2 x i16> [[VEC_IND]], splat (i16 256)117; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i1> [[TMP0]], i32 0118; CHECK-NEXT:    br i1 [[TMP1]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]119; CHECK:       [[PRED_STORE_IF]]:120; CHECK-NEXT:    [[TMP2:%.*]] = add i64 [[INDEX]], 0121; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 [[TMP2]]122; CHECK-NEXT:    store i16 1, ptr [[TMP3]], align 2123; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE]]124; CHECK:       [[PRED_STORE_CONTINUE]]:125; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i1> [[TMP0]], i32 1126; CHECK-NEXT:    br i1 [[TMP4]], label %[[PRED_STORE_IF1:.*]], label %[[PRED_STORE_CONTINUE2]]127; CHECK:       [[PRED_STORE_IF1]]:128; CHECK-NEXT:    [[TMP5:%.*]] = add i64 [[INDEX]], 1129; CHECK-NEXT:    [[TMP24:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 [[TMP5]]130; CHECK-NEXT:    store i16 1, ptr [[TMP24]], align 2131; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE2]]132; CHECK:       [[PRED_STORE_CONTINUE2]]:133; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2134; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <2 x i16> [[VEC_IND]], splat (i16 2)135; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], 258136; CHECK-NEXT:    br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]137; CHECK:       [[MIDDLE_BLOCK]]:138; CHECK-NEXT:    br label %[[END:.*]]139; CHECK:       [[END]]:140; CHECK-NEXT:    ret void141;142entry:143  br label %loop144 145loop:146  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]147  %p.iv = getelementptr inbounds i16, ptr %p, i64 %iv148  store i16 1, ptr %p.iv, align 2149  %iv.next = add nuw nsw i64 %iv, 1150  %cond = icmp eq i64 %iv.next, 257151  br i1 %cond, label %end, label %loop152 153end:154  ret void155}156 157define void @canonical_upper_limit_i16(ptr nocapture noundef writeonly %p) {158; CHECK-LABEL: define void @canonical_upper_limit_i16(159; CHECK-SAME: ptr noundef writeonly captures(none) [[P:%.*]]) {160; CHECK-NEXT:  [[ENTRY:.*:]]161; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]162; CHECK:       [[VECTOR_PH]]:163; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]164; CHECK:       [[VECTOR_BODY]]:165; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE2:.*]] ]166; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i16> [ <i16 0, i16 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_STORE_CONTINUE2]] ]167; CHECK-NEXT:    [[TMP0:%.*]] = icmp ule <2 x i16> [[VEC_IND]], splat (i16 -2)168; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i1> [[TMP0]], i32 0169; CHECK-NEXT:    br i1 [[TMP1]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]170; CHECK:       [[PRED_STORE_IF]]:171; CHECK-NEXT:    [[TMP2:%.*]] = add i64 [[INDEX]], 0172; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 [[TMP2]]173; CHECK-NEXT:    store i16 1, ptr [[TMP3]], align 2174; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE]]175; CHECK:       [[PRED_STORE_CONTINUE]]:176; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i1> [[TMP0]], i32 1177; CHECK-NEXT:    br i1 [[TMP4]], label %[[PRED_STORE_IF1:.*]], label %[[PRED_STORE_CONTINUE2]]178; CHECK:       [[PRED_STORE_IF1]]:179; CHECK-NEXT:    [[TMP5:%.*]] = add i64 [[INDEX]], 1180; CHECK-NEXT:    [[TMP24:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 [[TMP5]]181; CHECK-NEXT:    store i16 1, ptr [[TMP24]], align 2182; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE2]]183; CHECK:       [[PRED_STORE_CONTINUE2]]:184; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2185; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <2 x i16> [[VEC_IND]], splat (i16 2)186; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], 65536187; CHECK-NEXT:    br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]188; CHECK:       [[MIDDLE_BLOCK]]:189; CHECK-NEXT:    br label %[[END:.*]]190; CHECK:       [[END]]:191; CHECK-NEXT:    ret void192;193entry:194  br label %loop195 196loop:197  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]198  %p.iv = getelementptr inbounds i16, ptr %p, i64 %iv199  store i16 1, ptr %p.iv, align 2200  %iv.next = add nuw nsw i64 %iv, 1201  %cond = icmp eq i64 %iv.next, 65535202  br i1 %cond, label %end, label %loop203 204end:205  ret void206}207 208define void @canonical_lower_limit_i32(ptr nocapture noundef writeonly %p) {209; CHECK-LABEL: define void @canonical_lower_limit_i32(210; CHECK-SAME: ptr noundef writeonly captures(none) [[P:%.*]]) {211; CHECK-NEXT:  [[ENTRY:.*:]]212; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]213; CHECK:       [[VECTOR_PH]]:214; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]215; CHECK:       [[VECTOR_BODY]]:216; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE2:.*]] ]217; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i32> [ <i32 0, i32 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_STORE_CONTINUE2]] ]218; CHECK-NEXT:    [[TMP0:%.*]] = icmp ule <2 x i32> [[VEC_IND]], splat (i32 65536)219; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i1> [[TMP0]], i32 0220; CHECK-NEXT:    br i1 [[TMP1]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]221; CHECK:       [[PRED_STORE_IF]]:222; CHECK-NEXT:    [[TMP2:%.*]] = add i64 [[INDEX]], 0223; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 [[TMP2]]224; CHECK-NEXT:    store i16 1, ptr [[TMP3]], align 2225; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE]]226; CHECK:       [[PRED_STORE_CONTINUE]]:227; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i1> [[TMP0]], i32 1228; CHECK-NEXT:    br i1 [[TMP4]], label %[[PRED_STORE_IF1:.*]], label %[[PRED_STORE_CONTINUE2]]229; CHECK:       [[PRED_STORE_IF1]]:230; CHECK-NEXT:    [[TMP5:%.*]] = add i64 [[INDEX]], 1231; CHECK-NEXT:    [[TMP24:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 [[TMP5]]232; CHECK-NEXT:    store i16 1, ptr [[TMP24]], align 2233; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE2]]234; CHECK:       [[PRED_STORE_CONTINUE2]]:235; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2236; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <2 x i32> [[VEC_IND]], splat (i32 2)237; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], 65538238; CHECK-NEXT:    br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]239; CHECK:       [[MIDDLE_BLOCK]]:240; CHECK-NEXT:    br label %[[END:.*]]241; CHECK:       [[END]]:242; CHECK-NEXT:    ret void243;244entry:245  br label %loop246 247loop:248  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]249  %p.iv = getelementptr inbounds i16, ptr %p, i64 %iv250  store i16 1, ptr %p.iv, align 2251  %iv.next = add nuw nsw i64 %iv, 1252  %cond = icmp eq i64 %iv.next, 65537253  br i1 %cond, label %end, label %loop254 255end:256  ret void257}258 259define void @canonical_upper_limit_i32(ptr nocapture noundef writeonly %p) {260; CHECK-LABEL: define void @canonical_upper_limit_i32(261; CHECK-SAME: ptr noundef writeonly captures(none) [[P:%.*]]) {262; CHECK-NEXT:  [[ENTRY:.*:]]263; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]264; CHECK:       [[VECTOR_PH]]:265; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]266; CHECK:       [[VECTOR_BODY]]:267; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_STORE_CONTINUE2:.*]] ]268; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i32> [ <i32 0, i32 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_STORE_CONTINUE2]] ]269; CHECK-NEXT:    [[TMP0:%.*]] = icmp ule <2 x i32> [[VEC_IND]], splat (i32 -2)270; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i1> [[TMP0]], i32 0271; CHECK-NEXT:    br i1 [[TMP1]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]272; CHECK:       [[PRED_STORE_IF]]:273; CHECK-NEXT:    [[TMP2:%.*]] = add i64 [[INDEX]], 0274; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 [[TMP2]]275; CHECK-NEXT:    store i16 1, ptr [[TMP3]], align 2276; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE]]277; CHECK:       [[PRED_STORE_CONTINUE]]:278; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i1> [[TMP0]], i32 1279; CHECK-NEXT:    br i1 [[TMP4]], label %[[PRED_STORE_IF1:.*]], label %[[PRED_STORE_CONTINUE2]]280; CHECK:       [[PRED_STORE_IF1]]:281; CHECK-NEXT:    [[TMP5:%.*]] = add i64 [[INDEX]], 1282; CHECK-NEXT:    [[TMP24:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 [[TMP5]]283; CHECK-NEXT:    store i16 1, ptr [[TMP24]], align 2284; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE2]]285; CHECK:       [[PRED_STORE_CONTINUE2]]:286; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2287; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <2 x i32> [[VEC_IND]], splat (i32 2)288; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], 4294967296289; CHECK-NEXT:    br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]290; CHECK:       [[MIDDLE_BLOCK]]:291; CHECK-NEXT:    br label %[[END:.*]]292; CHECK:       [[END]]:293; CHECK-NEXT:    ret void294;295entry:296  br label %loop297 298loop:299  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]300  %p.iv = getelementptr inbounds i16, ptr %p, i64 %iv301  store i16 1, ptr %p.iv, align 2302  %iv.next = add nuw nsw i64 %iv, 1303  %cond = icmp eq i64 %iv.next, 4294967295304  br i1 %cond, label %end, label %loop305 306end:307  ret void308}309 310define void @canonical_lower_limit_i64(ptr nocapture noundef writeonly %p) {311; CHECK-LABEL: define void @canonical_lower_limit_i64(312; CHECK-SAME: ptr noundef writeonly captures(none) [[P:%.*]]) {313; CHECK-NEXT:  [[ENTRY:.*:]]314; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]315; CHECK:       [[VECTOR_PH]]:316; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]317; CHECK:       [[VECTOR_BODY]]:318; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[TMP8:%.*]], %[[PRED_STORE_CONTINUE2:.*]] ]319; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_STORE_CONTINUE2]] ]320; CHECK-NEXT:    [[TMP0:%.*]] = icmp ule <2 x i64> [[VEC_IND]], splat (i64 4294967296)321; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i1> [[TMP0]], i32 0322; CHECK-NEXT:    br i1 [[TMP1]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]323; CHECK:       [[PRED_STORE_IF]]:324; CHECK-NEXT:    [[TMP2:%.*]] = add i64 [[INDEX]], 0325; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 [[TMP2]]326; CHECK-NEXT:    store i16 1, ptr [[TMP3]], align 2327; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE]]328; CHECK:       [[PRED_STORE_CONTINUE]]:329; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i1> [[TMP0]], i32 1330; CHECK-NEXT:    br i1 [[TMP4]], label %[[PRED_STORE_IF1:.*]], label %[[PRED_STORE_CONTINUE2]]331; CHECK:       [[PRED_STORE_IF1]]:332; CHECK-NEXT:    [[TMP5:%.*]] = add i64 [[INDEX]], 1333; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 [[TMP5]]334; CHECK-NEXT:    store i16 1, ptr [[TMP6]], align 2335; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE2]]336; CHECK:       [[PRED_STORE_CONTINUE2]]:337; CHECK-NEXT:    [[TMP8]] = add i64 [[INDEX]], 2338; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <2 x i64> [[VEC_IND]], splat (i64 2)339; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[TMP8]], 4294967298340; CHECK-NEXT:    br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]341; CHECK:       [[MIDDLE_BLOCK]]:342; CHECK-NEXT:    br label %[[END:.*]]343; CHECK:       [[END]]:344; CHECK-NEXT:    ret void345;346entry:347  br label %loop348 349loop:350  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]351  %p.iv = getelementptr inbounds i16, ptr %p, i64 %iv352  store i16 1, ptr %p.iv, align 2353  %iv.next = add nuw nsw i64 %iv, 1354  %cond = icmp eq i64 %iv.next, 4294967297355  br i1 %cond, label %end, label %loop356 357end:358  ret void359}360 361define void @canonical_upper_limit_i64(ptr nocapture noundef writeonly %p) {362; CHECK-LABEL: define void @canonical_upper_limit_i64(363; CHECK-SAME: ptr noundef writeonly captures(none) [[P:%.*]]) {364; CHECK-NEXT:  [[ENTRY:.*:]]365; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]366; CHECK:       [[VECTOR_PH]]:367; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]368; CHECK:       [[VECTOR_BODY]]:369; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[TMP8:%.*]], %[[PRED_STORE_CONTINUE2:.*]] ]370; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_STORE_CONTINUE2]] ]371; CHECK-NEXT:    [[TMP0:%.*]] = icmp ule <2 x i64> [[VEC_IND]], splat (i64 -2)372; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i1> [[TMP0]], i32 0373; CHECK-NEXT:    br i1 [[TMP1]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]374; CHECK:       [[PRED_STORE_IF]]:375; CHECK-NEXT:    [[TMP2:%.*]] = add i64 [[INDEX]], 0376; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 [[TMP2]]377; CHECK-NEXT:    store i16 1, ptr [[TMP3]], align 2378; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE]]379; CHECK:       [[PRED_STORE_CONTINUE]]:380; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i1> [[TMP0]], i32 1381; CHECK-NEXT:    br i1 [[TMP4]], label %[[PRED_STORE_IF1:.*]], label %[[PRED_STORE_CONTINUE2]]382; CHECK:       [[PRED_STORE_IF1]]:383; CHECK-NEXT:    [[TMP5:%.*]] = add i64 [[INDEX]], 1384; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i16, ptr [[P]], i64 [[TMP5]]385; CHECK-NEXT:    store i16 1, ptr [[TMP6]], align 2386; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE2]]387; CHECK:       [[PRED_STORE_CONTINUE2]]:388; CHECK-NEXT:    [[TMP8]] = add i64 [[INDEX]], 2389; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <2 x i64> [[VEC_IND]], splat (i64 2)390; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[TMP8]], 0391; CHECK-NEXT:    br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]392; CHECK:       [[MIDDLE_BLOCK]]:393; CHECK-NEXT:    br label %[[END:.*]]394; CHECK:       [[END]]:395; CHECK-NEXT:    ret void396;397entry:398  br label %loop399 400loop:401  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]402  %p.iv = getelementptr inbounds i16, ptr %p, i64 %iv403  store i16 1, ptr %p.iv, align 2404  %iv.next = add nuw nsw i64 %iv, 1405  %cond = icmp eq i64 %iv.next, 18446744073709551615406  br i1 %cond, label %end, label %loop407 408end:409  ret void410}411 412define void @canonical_lower_limit_i128(ptr nocapture noundef writeonly %p) {413; CHECK-LABEL: define void @canonical_lower_limit_i128(414; CHECK-SAME: ptr noundef writeonly captures(none) [[P:%.*]]) {415; CHECK-NEXT:  [[ENTRY:.*:]]416; CHECK-NEXT:    br label %[[VECTOR_PH:.*]]417; CHECK:       [[VECTOR_PH]]:418; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]419; CHECK:       [[VECTOR_BODY]]:420; CHECK-NEXT:    [[INDEX:%.*]] = phi i256 [ 0, %[[VECTOR_PH]] ], [ [[TMP8:%.*]], %[[PRED_STORE_CONTINUE2:.*]] ]421; CHECK-NEXT:    [[VEC_IND:%.*]] = phi <2 x i128> [ <i128 0, i128 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_STORE_CONTINUE2]] ]422; CHECK-NEXT:    [[TMP0:%.*]] = icmp ule <2 x i128> [[VEC_IND]], splat (i128 18446744073709551616)423; CHECK-NEXT:    [[TMP1:%.*]] = extractelement <2 x i1> [[TMP0]], i32 0424; CHECK-NEXT:    br i1 [[TMP1]], label %[[PRED_STORE_IF:.*]], label %[[PRED_STORE_CONTINUE:.*]]425; CHECK:       [[PRED_STORE_IF]]:426; CHECK-NEXT:    [[TMP2:%.*]] = add i256 [[INDEX]], 0427; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i16, ptr [[P]], i256 [[TMP2]]428; CHECK-NEXT:    store i16 1, ptr [[TMP3]], align 2429; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE]]430; CHECK:       [[PRED_STORE_CONTINUE]]:431; CHECK-NEXT:    [[TMP4:%.*]] = extractelement <2 x i1> [[TMP0]], i32 1432; CHECK-NEXT:    br i1 [[TMP4]], label %[[PRED_STORE_IF1:.*]], label %[[PRED_STORE_CONTINUE2]]433; CHECK:       [[PRED_STORE_IF1]]:434; CHECK-NEXT:    [[TMP5:%.*]] = add i256 [[INDEX]], 1435; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i16, ptr [[P]], i256 [[TMP5]]436; CHECK-NEXT:    store i16 1, ptr [[TMP6]], align 2437; CHECK-NEXT:    br label %[[PRED_STORE_CONTINUE2]]438; CHECK:       [[PRED_STORE_CONTINUE2]]:439; CHECK-NEXT:    [[TMP8]] = add i256 [[INDEX]], 2440; CHECK-NEXT:    [[VEC_IND_NEXT]] = add <2 x i128> [[VEC_IND]], splat (i128 2)441; CHECK-NEXT:    [[TMP7:%.*]] = icmp eq i256 [[TMP8]], 18446744073709551618442; CHECK-NEXT:    br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP10:![0-9]+]]443; CHECK:       [[MIDDLE_BLOCK]]:444; CHECK-NEXT:    br label %[[END:.*]]445; CHECK:       [[END]]:446; CHECK-NEXT:    ret void447;448entry:449  br label %loop450 451loop:452  %iv = phi i256 [ 0, %entry ], [ %iv.next, %loop ]453  %p.iv = getelementptr inbounds i16, ptr %p, i256 %iv454  store i16 1, ptr %p.iv, align 2455  %iv.next = add nuw nsw i256 %iv, 1456  %cond = icmp eq i256 %iv.next, 18446744073709551617457  br i1 %cond, label %end, label %loop458 459end:460  ret void461}462 463