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