342 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --filter-out-after "^scalar.ph" --version 52; RUN: opt -S -passes=loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -enable-interleaved-mem-accesses=true %s | FileCheck %s3 4%struct.i32.pair = type { i32, i32 }5 6define void @nusw_preservation(ptr noalias %A, ptr %B) {7; CHECK-LABEL: define void @nusw_preservation(8; CHECK-SAME: ptr noalias [[A:%.*]], ptr [[B:%.*]]) {9; CHECK-NEXT: [[ENTRY:.*:]]10; CHECK-NEXT: br label %[[VECTOR_PH:.*]]11; CHECK: [[VECTOR_PH]]:12; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]13; CHECK: [[VECTOR_BODY]]:14; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]15; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 1023, i32 1022, i32 1021, i32 1020>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]16; CHECK-NEXT: [[OFFSET_IDX:%.*]] = sub i64 1023, [[INDEX]]17; CHECK-NEXT: [[TMP0:%.*]] = getelementptr nusw [[STRUCT_I32_PAIR:%.*]], ptr [[A]], i64 [[OFFSET_IDX]], i32 018; CHECK-NEXT: [[TMP1:%.*]] = getelementptr nusw i32, ptr [[TMP0]], i64 019; CHECK-NEXT: [[TMP2:%.*]] = getelementptr nusw i32, ptr [[TMP1]], i64 -620; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <8 x i32>, ptr [[TMP2]], align 421; CHECK-NEXT: [[STRIDED_VEC:%.*]] = shufflevector <8 x i32> [[WIDE_VEC]], <8 x i32> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>22; CHECK-NEXT: [[REVERSE:%.*]] = shufflevector <4 x i32> [[STRIDED_VEC]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>23; CHECK-NEXT: [[STRIDED_VEC1:%.*]] = shufflevector <8 x i32> [[WIDE_VEC]], <8 x i32> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>24; CHECK-NEXT: [[REVERSE2:%.*]] = shufflevector <4 x i32> [[STRIDED_VEC1]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>25; CHECK-NEXT: [[TMP3:%.*]] = add nsw <4 x i32> [[REVERSE]], [[VEC_IND]]26; CHECK-NEXT: [[TMP4:%.*]] = sub nsw <4 x i32> [[REVERSE2]], [[VEC_IND]]27; CHECK-NEXT: [[TMP5:%.*]] = getelementptr nusw [[STRUCT_I32_PAIR]], ptr [[B]], i64 [[OFFSET_IDX]], i32 028; CHECK-NEXT: [[TMP6:%.*]] = getelementptr nusw i32, ptr [[TMP5]], i64 029; CHECK-NEXT: [[TMP7:%.*]] = getelementptr nusw i32, ptr [[TMP6]], i64 -630; CHECK-NEXT: [[REVERSE3:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>31; CHECK-NEXT: [[REVERSE4:%.*]] = shufflevector <4 x i32> [[TMP4]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>32; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <4 x i32> [[REVERSE3]], <4 x i32> [[REVERSE4]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>33; CHECK-NEXT: [[INTERLEAVED_VEC:%.*]] = shufflevector <8 x i32> [[TMP8]], <8 x i32> poison, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>34; CHECK-NEXT: store <8 x i32> [[INTERLEAVED_VEC]], ptr [[TMP7]], align 435; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 436; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], splat (i32 -4)37; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], 102438; CHECK-NEXT: br i1 [[TMP9]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]39; CHECK: [[MIDDLE_BLOCK]]:40; CHECK-NEXT: br label %[[EXIT:.*]]41; CHECK: [[EXIT]]:42; CHECK-NEXT: ret void43;44entry:45 br label %loop46 47loop:48 %iv = phi i64 [ 1023, %entry ], [ %iv.next, %loop ]49 %x = getelementptr nusw %struct.i32.pair, ptr %A, i64 %iv, i32 050 %load.x = load i32, ptr %x, align 451 %trunc = trunc i64 %iv to i3252 %add = add nsw i32 %load.x, %trunc53 %y = getelementptr nusw %struct.i32.pair, ptr %A, i64 %iv, i32 154 %load.y = load i32, ptr %y, align 455 %sub = sub nsw i32 %load.y, %trunc56 %gep.B.iv.0 = getelementptr nusw %struct.i32.pair, ptr %B, i64 %iv, i32 057 store i32 %add, ptr %gep.B.iv.0, align 458 %gep.B.iv.1 = getelementptr nusw %struct.i32.pair, ptr %B, i64 %iv, i32 159 store i32 %sub, ptr %gep.B.iv.1, align 460 %iv.next = add nsw i64 %iv, -161 %exit.cond = icmp sgt i64 %iv, 062 br i1 %exit.cond, label %loop, label %exit63 64exit:65 ret void66}67 68define void @inbounds_preservation(ptr noalias %A, ptr %B) {69; CHECK-LABEL: define void @inbounds_preservation(70; CHECK-SAME: ptr noalias [[A:%.*]], ptr [[B:%.*]]) {71; CHECK-NEXT: [[ENTRY:.*:]]72; CHECK-NEXT: br label %[[VECTOR_PH:.*]]73; CHECK: [[VECTOR_PH]]:74; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]75; CHECK: [[VECTOR_BODY]]:76; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]77; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 1023, i32 1022, i32 1021, i32 1020>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]78; CHECK-NEXT: [[OFFSET_IDX:%.*]] = sub i64 1023, [[INDEX]]79; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds [[STRUCT_I32_PAIR:%.*]], ptr [[A]], i64 [[OFFSET_IDX]], i32 080; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i32, ptr [[TMP0]], i64 081; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[TMP1]], i64 -682; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <8 x i32>, ptr [[TMP2]], align 483; CHECK-NEXT: [[STRIDED_VEC:%.*]] = shufflevector <8 x i32> [[WIDE_VEC]], <8 x i32> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>84; CHECK-NEXT: [[REVERSE:%.*]] = shufflevector <4 x i32> [[STRIDED_VEC]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>85; CHECK-NEXT: [[STRIDED_VEC1:%.*]] = shufflevector <8 x i32> [[WIDE_VEC]], <8 x i32> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>86; CHECK-NEXT: [[REVERSE2:%.*]] = shufflevector <4 x i32> [[STRIDED_VEC1]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>87; CHECK-NEXT: [[TMP3:%.*]] = add nsw <4 x i32> [[REVERSE]], [[VEC_IND]]88; CHECK-NEXT: [[TMP4:%.*]] = sub nsw <4 x i32> [[REVERSE2]], [[VEC_IND]]89; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds [[STRUCT_I32_PAIR]], ptr [[B]], i64 [[OFFSET_IDX]], i32 090; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[TMP5]], i64 091; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i32, ptr [[TMP6]], i64 -692; CHECK-NEXT: [[REVERSE3:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>93; CHECK-NEXT: [[REVERSE4:%.*]] = shufflevector <4 x i32> [[TMP4]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>94; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <4 x i32> [[REVERSE3]], <4 x i32> [[REVERSE4]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>95; CHECK-NEXT: [[INTERLEAVED_VEC:%.*]] = shufflevector <8 x i32> [[TMP8]], <8 x i32> poison, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>96; CHECK-NEXT: store <8 x i32> [[INTERLEAVED_VEC]], ptr [[TMP7]], align 497; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 498; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], splat (i32 -4)99; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024100; CHECK-NEXT: br i1 [[TMP9]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]101; CHECK: [[MIDDLE_BLOCK]]:102; CHECK-NEXT: br label %[[EXIT:.*]]103; CHECK: [[EXIT]]:104; CHECK-NEXT: ret void105;106entry:107 br label %loop108 109loop:110 %iv = phi i64 [ 1023, %entry ], [ %iv.next, %loop ]111 %x = getelementptr inbounds %struct.i32.pair, ptr %A, i64 %iv, i32 0112 %load.x = load i32, ptr %x, align 4113 %trunc = trunc i64 %iv to i32114 %add = add nsw i32 %load.x, %trunc115 %y = getelementptr inbounds %struct.i32.pair, ptr %A, i64 %iv, i32 1116 %load.y = load i32, ptr %y, align 4117 %sub = sub nsw i32 %load.y, %trunc118 %gep.B.iv.0 = getelementptr inbounds %struct.i32.pair, ptr %B, i64 %iv, i32 0119 store i32 %add, ptr %gep.B.iv.0, align 4120 %gep.B.iv.1 = getelementptr inbounds %struct.i32.pair, ptr %B, i64 %iv, i32 1121 store i32 %sub, ptr %gep.B.iv.1, align 4122 %iv.next = add nsw i64 %iv, -1123 %exit.cond = icmp sgt i64 %iv, 0124 br i1 %exit.cond, label %loop, label %exit125 126exit:127 ret void128}129 130define void @nuw_drop(ptr noalias %A, ptr %B) {131; CHECK-LABEL: define void @nuw_drop(132; CHECK-SAME: ptr noalias [[A:%.*]], ptr [[B:%.*]]) {133; CHECK-NEXT: [[ENTRY:.*:]]134; CHECK-NEXT: br label %[[VECTOR_PH:.*]]135; CHECK: [[VECTOR_PH]]:136; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]137; CHECK: [[VECTOR_BODY]]:138; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]139; CHECK-NEXT: [[VEC_IND:%.*]] = phi <4 x i32> [ <i32 1023, i32 1022, i32 1021, i32 1020>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]140; CHECK-NEXT: [[OFFSET_IDX:%.*]] = sub i64 1023, [[INDEX]]141; CHECK-NEXT: [[TMP0:%.*]] = getelementptr nuw [[STRUCT_I32_PAIR:%.*]], ptr [[A]], i64 [[OFFSET_IDX]], i32 0142; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i32, ptr [[TMP0]], i64 0143; CHECK-NEXT: [[TMP2:%.*]] = getelementptr i32, ptr [[TMP1]], i64 -6144; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <8 x i32>, ptr [[TMP2]], align 4145; CHECK-NEXT: [[STRIDED_VEC:%.*]] = shufflevector <8 x i32> [[WIDE_VEC]], <8 x i32> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>146; CHECK-NEXT: [[REVERSE:%.*]] = shufflevector <4 x i32> [[STRIDED_VEC]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>147; CHECK-NEXT: [[STRIDED_VEC1:%.*]] = shufflevector <8 x i32> [[WIDE_VEC]], <8 x i32> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>148; CHECK-NEXT: [[REVERSE2:%.*]] = shufflevector <4 x i32> [[STRIDED_VEC1]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>149; CHECK-NEXT: [[TMP3:%.*]] = add nsw <4 x i32> [[REVERSE]], [[VEC_IND]]150; CHECK-NEXT: [[TMP4:%.*]] = sub nsw <4 x i32> [[REVERSE2]], [[VEC_IND]]151; CHECK-NEXT: [[TMP5:%.*]] = getelementptr nuw [[STRUCT_I32_PAIR]], ptr [[B]], i64 [[OFFSET_IDX]], i32 0152; CHECK-NEXT: [[TMP6:%.*]] = getelementptr i32, ptr [[TMP5]], i64 0153; CHECK-NEXT: [[TMP7:%.*]] = getelementptr i32, ptr [[TMP6]], i64 -6154; CHECK-NEXT: [[REVERSE3:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>155; CHECK-NEXT: [[REVERSE4:%.*]] = shufflevector <4 x i32> [[TMP4]], <4 x i32> poison, <4 x i32> <i32 3, i32 2, i32 1, i32 0>156; CHECK-NEXT: [[TMP8:%.*]] = shufflevector <4 x i32> [[REVERSE3]], <4 x i32> [[REVERSE4]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>157; CHECK-NEXT: [[INTERLEAVED_VEC:%.*]] = shufflevector <8 x i32> [[TMP8]], <8 x i32> poison, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>158; CHECK-NEXT: store <8 x i32> [[INTERLEAVED_VEC]], ptr [[TMP7]], align 4159; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4160; CHECK-NEXT: [[VEC_IND_NEXT]] = add <4 x i32> [[VEC_IND]], splat (i32 -4)161; CHECK-NEXT: [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024162; CHECK-NEXT: br i1 [[TMP9]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]163; CHECK: [[MIDDLE_BLOCK]]:164; CHECK-NEXT: br label %[[EXIT:.*]]165; CHECK: [[EXIT]]:166; CHECK-NEXT: ret void167;168entry:169 br label %loop170 171loop:172 %iv = phi i64 [ 1023, %entry ], [ %iv.next, %loop ]173 %x = getelementptr nuw %struct.i32.pair, ptr %A, i64 %iv, i32 0174 %load.x = load i32, ptr %x, align 4175 %trunc = trunc i64 %iv to i32176 %add = add nsw i32 %load.x, %trunc177 %y = getelementptr nuw %struct.i32.pair, ptr %A, i64 %iv, i32 1178 %load.y = load i32, ptr %y, align 4179 %sub = sub nsw i32 %load.y, %trunc180 %gep.B.iv.0 = getelementptr nuw %struct.i32.pair, ptr %B, i64 %iv, i32 0181 store i32 %add, ptr %gep.B.iv.0, align 4182 %gep.B.iv.1 = getelementptr nuw %struct.i32.pair, ptr %B, i64 %iv, i32 1183 store i32 %sub, ptr %gep.B.iv.1, align 4184 %iv.next = add nsw i64 %iv, -1185 %exit.cond = icmp sgt i64 %iv, 0186 br i1 %exit.cond, label %loop, label %exit187 188exit:189 ret void190}191 192define void @nusw_preservation_2(ptr %src, ptr noalias %dst) {193; CHECK-LABEL: define void @nusw_preservation_2(194; CHECK-SAME: ptr [[SRC:%.*]], ptr noalias [[DST:%.*]]) {195; CHECK-NEXT: [[ENTRY:.*:]]196; CHECK-NEXT: br label %[[VECTOR_PH:.*]]197; CHECK: [[VECTOR_PH]]:198; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]199; CHECK: [[VECTOR_BODY]]:200; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]201; CHECK-NEXT: [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], 2202; CHECK-NEXT: [[TMP0:%.*]] = or disjoint i64 [[OFFSET_IDX]], 1203; CHECK-NEXT: [[TMP1:%.*]] = getelementptr nusw i8, ptr [[SRC]], i64 [[TMP0]]204; CHECK-NEXT: [[TMP2:%.*]] = getelementptr nusw i8, ptr [[TMP1]], i32 -1205; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <8 x i8>, ptr [[TMP2]], align 1206; CHECK-NEXT: [[STRIDED_VEC:%.*]] = shufflevector <8 x i8> [[WIDE_VEC]], <8 x i8> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>207; CHECK-NEXT: [[STRIDED_VEC1:%.*]] = shufflevector <8 x i8> [[WIDE_VEC]], <8 x i8> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>208; CHECK-NEXT: [[TMP3:%.*]] = add <4 x i8> [[STRIDED_VEC1]], [[STRIDED_VEC]]209; CHECK-NEXT: [[TMP4:%.*]] = getelementptr nusw i8, ptr [[DST]], i64 [[INDEX]]210; CHECK-NEXT: store <4 x i8> [[TMP3]], ptr [[TMP4]], align 1211; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4212; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100213; CHECK-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]214; CHECK: [[MIDDLE_BLOCK]]:215; CHECK-NEXT: br label %[[EXIT:.*]]216; CHECK: [[EXIT]]:217; CHECK-NEXT: ret void218;219entry:220 br label %loop221 222loop: ; preds = %loop, %entry223 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]224 %iv2 = phi i64 [ 0, %entry ], [ %iv2.next, %loop ]225 %or.1 = or disjoint i64 %iv2, 1226 %gep.src.or.1 = getelementptr nusw i8, ptr %src, i64 %or.1227 %load.src.1 = load i8, ptr %gep.src.or.1, align 1228 %gep.src.iv2 = getelementptr nusw i8, ptr %src, i64 %iv2229 %load.src.2 = load i8, ptr %gep.src.iv2, align 1230 %add = add i8 %load.src.1, %load.src.2231 %gep.dst.iv = getelementptr nusw i8, ptr %dst, i64 %iv232 store i8 %add, ptr %gep.dst.iv, align 1233 %iv2.next = add i64 %iv2, 2234 %iv.next = add i64 %iv, 1235 %exit.cond = icmp eq i64 %iv.next, 100236 br i1 %exit.cond, label %exit, label %loop237 238exit:239 ret void240}241 242define void @inbounds_preservation_2(ptr %src, ptr noalias %dst) {243; CHECK-LABEL: define void @inbounds_preservation_2(244; CHECK-SAME: ptr [[SRC:%.*]], ptr noalias [[DST:%.*]]) {245; CHECK-NEXT: [[ENTRY:.*:]]246; CHECK-NEXT: br label %[[VECTOR_PH:.*]]247; CHECK: [[VECTOR_PH]]:248; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]249; CHECK: [[VECTOR_BODY]]:250; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]251; CHECK-NEXT: [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], 2252; CHECK-NEXT: [[TMP0:%.*]] = or disjoint i64 [[OFFSET_IDX]], 1253; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds i8, ptr [[SRC]], i64 [[TMP0]]254; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[TMP1]], i32 -1255; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <8 x i8>, ptr [[TMP2]], align 1256; CHECK-NEXT: [[STRIDED_VEC:%.*]] = shufflevector <8 x i8> [[WIDE_VEC]], <8 x i8> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>257; CHECK-NEXT: [[STRIDED_VEC1:%.*]] = shufflevector <8 x i8> [[WIDE_VEC]], <8 x i8> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>258; CHECK-NEXT: [[TMP3:%.*]] = add <4 x i8> [[STRIDED_VEC1]], [[STRIDED_VEC]]259; CHECK-NEXT: [[TMP4:%.*]] = getelementptr inbounds i8, ptr [[DST]], i64 [[INDEX]]260; CHECK-NEXT: store <4 x i8> [[TMP3]], ptr [[TMP4]], align 1261; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4262; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100263; CHECK-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]264; CHECK: [[MIDDLE_BLOCK]]:265; CHECK-NEXT: br label %[[EXIT:.*]]266; CHECK: [[EXIT]]:267; CHECK-NEXT: ret void268;269entry:270 br label %loop271 272loop: ; preds = %loop, %entry273 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]274 %iv2 = phi i64 [ 0, %entry ], [ %iv2.next, %loop ]275 %or.1 = or disjoint i64 %iv2, 1276 %gep.src.or.1 = getelementptr inbounds i8, ptr %src, i64 %or.1277 %load.src.1 = load i8, ptr %gep.src.or.1, align 1278 %gep.src.iv2 = getelementptr inbounds i8, ptr %src, i64 %iv2279 %load.src.2 = load i8, ptr %gep.src.iv2, align 1280 %add = add i8 %load.src.1, %load.src.2281 %gep.dst.iv = getelementptr inbounds i8, ptr %dst, i64 %iv282 store i8 %add, ptr %gep.dst.iv, align 1283 %iv2.next = add i64 %iv2, 2284 %iv.next = add i64 %iv, 1285 %exit.cond = icmp eq i64 %iv.next, 100286 br i1 %exit.cond, label %exit, label %loop287 288exit:289 ret void290}291 292define void @nuw_drop_2(ptr %src, ptr noalias %dst) {293; CHECK-LABEL: define void @nuw_drop_2(294; CHECK-SAME: ptr [[SRC:%.*]], ptr noalias [[DST:%.*]]) {295; CHECK-NEXT: [[ENTRY:.*:]]296; CHECK-NEXT: br label %[[VECTOR_PH:.*]]297; CHECK: [[VECTOR_PH]]:298; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]299; CHECK: [[VECTOR_BODY]]:300; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]301; CHECK-NEXT: [[OFFSET_IDX:%.*]] = mul i64 [[INDEX]], 2302; CHECK-NEXT: [[TMP0:%.*]] = or disjoint i64 [[OFFSET_IDX]], 1303; CHECK-NEXT: [[TMP1:%.*]] = getelementptr nuw i8, ptr [[SRC]], i64 [[TMP0]]304; CHECK-NEXT: [[TMP2:%.*]] = getelementptr i8, ptr [[TMP1]], i32 -1305; CHECK-NEXT: [[WIDE_VEC:%.*]] = load <8 x i8>, ptr [[TMP2]], align 1306; CHECK-NEXT: [[STRIDED_VEC:%.*]] = shufflevector <8 x i8> [[WIDE_VEC]], <8 x i8> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>307; CHECK-NEXT: [[STRIDED_VEC1:%.*]] = shufflevector <8 x i8> [[WIDE_VEC]], <8 x i8> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>308; CHECK-NEXT: [[TMP3:%.*]] = add <4 x i8> [[STRIDED_VEC1]], [[STRIDED_VEC]]309; CHECK-NEXT: [[TMP4:%.*]] = getelementptr nuw i8, ptr [[DST]], i64 [[INDEX]]310; CHECK-NEXT: store <4 x i8> [[TMP3]], ptr [[TMP4]], align 1311; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4312; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100313; CHECK-NEXT: br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]314; CHECK: [[MIDDLE_BLOCK]]:315; CHECK-NEXT: br label %[[EXIT:.*]]316; CHECK: [[EXIT]]:317; CHECK-NEXT: ret void318;319entry:320 br label %loop321 322loop: ; preds = %loop, %entry323 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]324 %iv2 = phi i64 [ 0, %entry ], [ %iv2.next, %loop ]325 %or.1 = or disjoint i64 %iv2, 1326 %gep.src.or.1 = getelementptr nuw i8, ptr %src, i64 %or.1327 %load.src.1 = load i8, ptr %gep.src.or.1, align 1328 %gep.src.iv2 = getelementptr nuw i8, ptr %src, i64 %iv2329 %load.src.2 = load i8, ptr %gep.src.iv2, align 1330 %add = add i8 %load.src.1, %load.src.2331 %gep.dst.iv = getelementptr nuw i8, ptr %dst, i64 %iv332 store i8 %add, ptr %gep.dst.iv, align 1333 %iv2.next = add i64 %iv2, 2334 %iv.next = add i64 %iv, 1335 %exit.cond = icmp eq i64 %iv.next, 100336 br i1 %exit.cond, label %exit, label %loop337 338exit:339 ret void340}341 342