brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.6 KiB · 309fcec Raw
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