brintos

brintos / llvm-project-archived public Read only

0
0
Text · 70.3 KiB · 6d0c55b Raw
1250 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 -p loop-vectorize -force-vector-width=2 -force-vector-interleave=1 -S %s | FileCheck --check-prefixes=VF2 %s3; RUN: opt -p loop-vectorize -force-vector-width=4 -force-vector-interleave=1 -S %s | FileCheck --check-prefixes=VF4 %s4 5target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"6target triple = "arm64-apple-macosx"7 8define void @test_2xi64_unary_op_load_interleave_group(ptr noalias %data, ptr noalias %factor) {9; VF2-LABEL: define void @test_2xi64_unary_op_load_interleave_group(10; VF2-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) {11; VF2-NEXT:  [[ENTRY:.*:]]12; VF2-NEXT:    br label %[[VECTOR_PH:.*]]13; VF2:       [[VECTOR_PH]]:14; VF2-NEXT:    br label %[[VECTOR_BODY:.*]]15; VF2:       [[VECTOR_BODY]]:16; VF2-NEXT:    [[TMP10:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]17; VF2-NEXT:    [[TMP12:%.*]] = shl nsw i64 [[TMP10]], 118; VF2-NEXT:    [[TMP5:%.*]] = getelementptr inbounds double, ptr [[DATA]], i64 [[TMP12]]19; VF2-NEXT:    [[WIDE_LOAD1:%.*]] = load <2 x double>, ptr [[TMP5]], align 820; VF2-NEXT:    [[TMP11:%.*]] = fneg <2 x double> [[WIDE_LOAD1]]21; VF2-NEXT:    store <2 x double> [[TMP11]], ptr [[TMP5]], align 822; VF2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP10]], 123; VF2-NEXT:    [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 10024; VF2-NEXT:    br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]25; VF2:       [[MIDDLE_BLOCK]]:26; VF2-NEXT:    br [[EXIT:label %.*]]27; VF2:       [[SCALAR_PH:.*:]]28;29; VF4-LABEL: define void @test_2xi64_unary_op_load_interleave_group(30; VF4-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) {31; VF4-NEXT:  [[ENTRY:.*:]]32; VF4-NEXT:    br label %[[VECTOR_PH:.*]]33; VF4:       [[VECTOR_PH]]:34; VF4-NEXT:    br label %[[VECTOR_BODY:.*]]35; VF4:       [[VECTOR_BODY]]:36; VF4-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]37; VF4-NEXT:    [[TMP1:%.*]] = shl nsw i64 [[INDEX]], 138; VF4-NEXT:    [[TMP2:%.*]] = getelementptr inbounds double, ptr [[DATA]], i64 [[TMP1]]39; VF4-NEXT:    [[WIDE_VEC:%.*]] = load <8 x double>, ptr [[TMP2]], align 840; VF4-NEXT:    [[STRIDED_VEC:%.*]] = shufflevector <8 x double> [[WIDE_VEC]], <8 x double> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>41; VF4-NEXT:    [[STRIDED_VEC1:%.*]] = shufflevector <8 x double> [[WIDE_VEC]], <8 x double> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>42; VF4-NEXT:    [[TMP3:%.*]] = fneg <4 x double> [[STRIDED_VEC]]43; VF4-NEXT:    [[TMP4:%.*]] = fneg <4 x double> [[STRIDED_VEC1]]44; VF4-NEXT:    [[TMP5:%.*]] = shufflevector <4 x double> [[TMP3]], <4 x double> [[TMP4]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>45; VF4-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <8 x double> [[TMP5]], <8 x double> poison, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>46; VF4-NEXT:    store <8 x double> [[INTERLEAVED_VEC]], ptr [[TMP2]], align 847; VF4-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 448; VF4-NEXT:    [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 10049; VF4-NEXT:    br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP0:![0-9]+]]50; VF4:       [[MIDDLE_BLOCK]]:51; VF4-NEXT:    br [[EXIT:label %.*]]52; VF4:       [[SCALAR_PH:.*:]]53;54entry:55  br label %loop56 57loop:58  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]59  %1 = shl nsw i64 %iv, 160  %data.0 = getelementptr inbounds double, ptr %data, i64 %161  %l.0 = load double, ptr %data.0, align 862  %neg.0 = fneg double %l.063  store double %neg.0, ptr %data.0, align 864  %3 = or disjoint i64 %1, 165  %data.1 = getelementptr inbounds double, ptr %data, i64 %366  %l.1 = load double, ptr %data.1, align 867  %neg.1 = fneg double %l.168  store double %neg.1, ptr %data.1, align 869  %iv.next = add nuw nsw i64 %iv, 170  %ec = icmp eq i64 %iv.next, 10071  br i1 %ec, label %exit, label %loop72 73exit:74  ret void75}76 77define void @test_2xi64_unary_op_wide_load(ptr noalias %data, ptr noalias %A, ptr noalias %B) {78; VF2-LABEL: define void @test_2xi64_unary_op_wide_load(79; VF2-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[A:%.*]], ptr noalias [[B:%.*]]) {80; VF2-NEXT:  [[ENTRY:.*:]]81; VF2-NEXT:    br label %[[VECTOR_PH:.*]]82; VF2:       [[VECTOR_PH]]:83; VF2-NEXT:    br label %[[VECTOR_BODY:.*]]84; VF2:       [[VECTOR_BODY]]:85; VF2-NEXT:    [[TMP14:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]86; VF2-NEXT:    [[TMP0:%.*]] = shl nsw i64 [[TMP14]], 187; VF2-NEXT:    [[TMP6:%.*]] = getelementptr inbounds double, ptr [[A]], i64 [[TMP14]]88; VF2-NEXT:    [[WIDE_LOAD3:%.*]] = load <2 x double>, ptr [[TMP6]], align 889; VF2-NEXT:    [[TMP15:%.*]] = fneg <2 x double> [[WIDE_LOAD3]]90; VF2-NEXT:    [[TMP20:%.*]] = getelementptr inbounds double, ptr [[DATA]], i64 [[TMP0]]91; VF2-NEXT:    [[TMP5:%.*]] = getelementptr inbounds double, ptr [[B]], i64 [[TMP14]]92; VF2-NEXT:    [[WIDE_LOAD1:%.*]] = load <2 x double>, ptr [[TMP5]], align 893; VF2-NEXT:    [[TMP9:%.*]] = fneg <2 x double> [[WIDE_LOAD1]]94; VF2-NEXT:    [[TMP17:%.*]] = shufflevector <2 x double> [[TMP15]], <2 x double> [[TMP9]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>95; VF2-NEXT:    [[INTERLEAVED_VEC4:%.*]] = shufflevector <4 x double> [[TMP17]], <4 x double> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>96; VF2-NEXT:    store <4 x double> [[INTERLEAVED_VEC4]], ptr [[TMP20]], align 897; VF2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP14]], 298; VF2-NEXT:    [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], 10099; VF2-NEXT:    br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]100; VF2:       [[MIDDLE_BLOCK]]:101; VF2-NEXT:    br [[EXIT:label %.*]]102; VF2:       [[SCALAR_PH:.*:]]103;104; VF4-LABEL: define void @test_2xi64_unary_op_wide_load(105; VF4-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[A:%.*]], ptr noalias [[B:%.*]]) {106; VF4-NEXT:  [[ENTRY:.*:]]107; VF4-NEXT:    br label %[[VECTOR_PH:.*]]108; VF4:       [[VECTOR_PH]]:109; VF4-NEXT:    br label %[[VECTOR_BODY:.*]]110; VF4:       [[VECTOR_BODY]]:111; VF4-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]112; VF4-NEXT:    [[TMP1:%.*]] = shl nsw i64 [[INDEX]], 1113; VF4-NEXT:    [[TMP2:%.*]] = getelementptr inbounds double, ptr [[A]], i64 [[INDEX]]114; VF4-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x double>, ptr [[TMP2]], align 8115; VF4-NEXT:    [[TMP4:%.*]] = fneg <4 x double> [[WIDE_LOAD]]116; VF4-NEXT:    [[TMP5:%.*]] = getelementptr inbounds double, ptr [[DATA]], i64 [[TMP1]]117; VF4-NEXT:    [[TMP6:%.*]] = getelementptr inbounds double, ptr [[B]], i64 [[INDEX]]118; VF4-NEXT:    [[WIDE_LOAD1:%.*]] = load <4 x double>, ptr [[TMP6]], align 8119; VF4-NEXT:    [[TMP8:%.*]] = fneg <4 x double> [[WIDE_LOAD1]]120; VF4-NEXT:    [[TMP9:%.*]] = shufflevector <4 x double> [[TMP4]], <4 x double> [[TMP8]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>121; VF4-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <8 x double> [[TMP9]], <8 x double> poison, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>122; VF4-NEXT:    store <8 x double> [[INTERLEAVED_VEC]], ptr [[TMP5]], align 8123; VF4-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4124; VF4-NEXT:    [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100125; VF4-NEXT:    br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]126; VF4:       [[MIDDLE_BLOCK]]:127; VF4-NEXT:    br [[EXIT:label %.*]]128; VF4:       [[SCALAR_PH:.*:]]129;130entry:131  br label %loop132 133loop:134  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]135  %1 = shl nsw i64 %iv, 1136  %A.0 = getelementptr inbounds double, ptr %A, i64 %iv137  %l.0 = load double, ptr %A.0, align 8138  %neg.0 = fneg double %l.0139  %data.0 = getelementptr inbounds double, ptr %data, i64 %1140  store double %neg.0, ptr %data.0, align 8141  %3 = or disjoint i64 %1, 1142  %B.0 = getelementptr inbounds double, ptr %B, i64 %iv143  %l.1 = load double, ptr %B.0, align 8144  %neg.1 = fneg double %l.1145  %data.1 = getelementptr inbounds double, ptr %data, i64 %3146  store double %neg.1, ptr %data.1, align 8147  %iv.next = add nuw nsw i64 %iv, 1148  %ec = icmp eq i64 %iv.next, 100149  br i1 %ec, label %exit, label %loop150 151exit:152  ret void153}154 155define void @test_2xi64(ptr noalias %data, ptr noalias %factor) {156; VF2-LABEL: define void @test_2xi64(157; VF2-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) {158; VF2-NEXT:  [[ENTRY:.*:]]159; VF2-NEXT:    br label %[[VECTOR_PH:.*]]160; VF2:       [[VECTOR_PH]]:161; VF2-NEXT:    br label %[[VECTOR_BODY:.*]]162; VF2:       [[VECTOR_BODY]]:163; VF2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]164; VF2-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[FACTOR]], i64 [[INDEX]]165; VF2-NEXT:    [[TMP3:%.*]] = load i64, ptr [[TMP1]], align 8166; VF2-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x i64> poison, i64 [[TMP3]], i64 0167; VF2-NEXT:    [[WIDE_LOAD:%.*]] = shufflevector <2 x i64> [[BROADCAST_SPLATINSERT]], <2 x i64> poison, <2 x i32> zeroinitializer168; VF2-NEXT:    [[TMP6:%.*]] = shl nsw i64 [[INDEX]], 1169; VF2-NEXT:    [[TMP7:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP6]]170; VF2-NEXT:    [[STRIDED_VEC1:%.*]] = load <2 x i64>, ptr [[TMP7]], align 8171; VF2-NEXT:    [[TMP8:%.*]] = mul <2 x i64> [[WIDE_LOAD]], [[STRIDED_VEC1]]172; VF2-NEXT:    store <2 x i64> [[TMP8]], ptr [[TMP7]], align 8173; VF2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 1174; VF2-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100175; VF2-NEXT:    br i1 [[TMP9]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]176; VF2:       [[MIDDLE_BLOCK]]:177; VF2-NEXT:    br [[EXIT:label %.*]]178; VF2:       [[SCALAR_PH:.*:]]179;180; VF4-LABEL: define void @test_2xi64(181; VF4-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) {182; VF4-NEXT:  [[ENTRY:.*:]]183; VF4-NEXT:    br label %[[VECTOR_PH:.*]]184; VF4:       [[VECTOR_PH]]:185; VF4-NEXT:    br label %[[VECTOR_BODY:.*]]186; VF4:       [[VECTOR_BODY]]:187; VF4-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]188; VF4-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[FACTOR]], i64 [[INDEX]]189; VF4-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP1]], align 8190; VF4-NEXT:    [[TMP10:%.*]] = shl nsw i64 [[INDEX]], 1191; VF4-NEXT:    [[TMP11:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP10]]192; VF4-NEXT:    [[WIDE_VEC:%.*]] = load <8 x i64>, ptr [[TMP11]], align 8193; VF4-NEXT:    [[TMP19:%.*]] = shufflevector <8 x i64> [[WIDE_VEC]], <8 x i64> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>194; VF4-NEXT:    [[TMP41:%.*]] = shufflevector <8 x i64> [[WIDE_VEC]], <8 x i64> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>195; VF4-NEXT:    [[TMP20:%.*]] = mul <4 x i64> [[WIDE_LOAD]], [[TMP19]]196; VF4-NEXT:    [[TMP42:%.*]] = mul <4 x i64> [[WIDE_LOAD]], [[TMP41]]197; VF4-NEXT:    [[TMP7:%.*]] = shufflevector <4 x i64> [[TMP20]], <4 x i64> [[TMP42]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>198; VF4-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <8 x i64> [[TMP7]], <8 x i64> poison, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>199; VF4-NEXT:    store <8 x i64> [[INTERLEAVED_VEC]], ptr [[TMP11]], align 8200; VF4-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4201; VF4-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100202; VF4-NEXT:    br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]203; VF4:       [[MIDDLE_BLOCK]]:204; VF4-NEXT:    br [[EXIT:label %.*]]205; VF4:       [[SCALAR_PH:.*:]]206;207entry:208  br label %loop209 210loop:211  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]212  %arrayidx = getelementptr inbounds i64, ptr %factor, i64 %iv213  %l.factor = load i64, ptr %arrayidx, align 8214  %1 = shl nsw i64 %iv, 1215  %data.0 = getelementptr inbounds i64, ptr %data, i64 %1216  %l.0 = load i64, ptr %data.0, align 8217  %mul.0 = mul i64 %l.factor, %l.0218  store i64 %mul.0, ptr %data.0, align 8219  %3 = or disjoint i64 %1, 1220  %data.1 = getelementptr inbounds i64, ptr %data, i64 %3221  %l.1 = load i64, ptr %data.1, align 8222  %mul.1 = mul i64 %l.factor, %l.1223  store i64 %mul.1, ptr %data.1, align 8224  %iv.next = add nuw nsw i64 %iv, 1225  %ec = icmp eq i64 %iv.next, 100226  br i1 %ec, label %exit, label %loop227 228exit:229  ret void230}231 232define void @test_2xi64_different_opcodes(ptr noalias %data, ptr noalias %factor) {233; VF2-LABEL: define void @test_2xi64_different_opcodes(234; VF2-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) {235; VF2-NEXT:  [[ENTRY:.*:]]236; VF2-NEXT:    br label %[[VECTOR_PH:.*]]237; VF2:       [[VECTOR_PH]]:238; VF2-NEXT:    br label %[[VECTOR_BODY:.*]]239; VF2:       [[VECTOR_BODY]]:240; VF2-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]241; VF2-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[FACTOR]], i64 [[TMP0]]242; VF2-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i64>, ptr [[TMP1]], align 8243; VF2-NEXT:    [[TMP3:%.*]] = shl nsw i64 [[TMP0]], 1244; VF2-NEXT:    [[TMP4:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP3]]245; VF2-NEXT:    [[WIDE_VEC:%.*]] = load <4 x i64>, ptr [[TMP4]], align 8246; VF2-NEXT:    [[STRIDED_VEC:%.*]] = shufflevector <4 x i64> [[WIDE_VEC]], <4 x i64> poison, <2 x i32> <i32 0, i32 2>247; VF2-NEXT:    [[STRIDED_VEC1:%.*]] = shufflevector <4 x i64> [[WIDE_VEC]], <4 x i64> poison, <2 x i32> <i32 1, i32 3>248; VF2-NEXT:    [[TMP5:%.*]] = mul <2 x i64> [[WIDE_LOAD]], [[STRIDED_VEC]]249; VF2-NEXT:    [[TMP6:%.*]] = add <2 x i64> [[WIDE_LOAD]], [[STRIDED_VEC1]]250; VF2-NEXT:    [[TMP7:%.*]] = shufflevector <2 x i64> [[TMP5]], <2 x i64> [[TMP6]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>251; VF2-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <4 x i64> [[TMP7]], <4 x i64> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>252; VF2-NEXT:    store <4 x i64> [[INTERLEAVED_VEC]], ptr [[TMP4]], align 8253; VF2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 2254; VF2-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100255; VF2-NEXT:    br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]256; VF2:       [[MIDDLE_BLOCK]]:257; VF2-NEXT:    br [[EXIT:label %.*]]258; VF2:       [[SCALAR_PH:.*:]]259;260; VF4-LABEL: define void @test_2xi64_different_opcodes(261; VF4-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) {262; VF4-NEXT:  [[ENTRY:.*:]]263; VF4-NEXT:    br label %[[VECTOR_PH:.*]]264; VF4:       [[VECTOR_PH]]:265; VF4-NEXT:    br label %[[VECTOR_BODY:.*]]266; VF4:       [[VECTOR_BODY]]:267; VF4-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]268; VF4-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[FACTOR]], i64 [[TMP0]]269; VF4-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP1]], align 8270; VF4-NEXT:    [[TMP3:%.*]] = shl nsw i64 [[TMP0]], 1271; VF4-NEXT:    [[TMP4:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP3]]272; VF4-NEXT:    [[WIDE_VEC:%.*]] = load <8 x i64>, ptr [[TMP4]], align 8273; VF4-NEXT:    [[STRIDED_VEC:%.*]] = shufflevector <8 x i64> [[WIDE_VEC]], <8 x i64> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>274; VF4-NEXT:    [[STRIDED_VEC1:%.*]] = shufflevector <8 x i64> [[WIDE_VEC]], <8 x i64> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>275; VF4-NEXT:    [[TMP5:%.*]] = mul <4 x i64> [[WIDE_LOAD]], [[STRIDED_VEC]]276; VF4-NEXT:    [[TMP6:%.*]] = add <4 x i64> [[WIDE_LOAD]], [[STRIDED_VEC1]]277; VF4-NEXT:    [[TMP7:%.*]] = shufflevector <4 x i64> [[TMP5]], <4 x i64> [[TMP6]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>278; VF4-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <8 x i64> [[TMP7]], <8 x i64> poison, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>279; VF4-NEXT:    store <8 x i64> [[INTERLEAVED_VEC]], ptr [[TMP4]], align 8280; VF4-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 4281; VF4-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100282; VF4-NEXT:    br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP5:![0-9]+]]283; VF4:       [[MIDDLE_BLOCK]]:284; VF4-NEXT:    br [[EXIT:label %.*]]285; VF4:       [[SCALAR_PH:.*:]]286;287entry:288  br label %loop289 290loop:291  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]292  %arrayidx = getelementptr inbounds i64, ptr %factor, i64 %iv293  %l.factor = load i64, ptr %arrayidx, align 8294  %1 = shl nsw i64 %iv, 1295  %data.0 = getelementptr inbounds i64, ptr %data, i64 %1296  %l.0 = load i64, ptr %data.0, align 8297  %mul.0 = mul i64 %l.factor, %l.0298  store i64 %mul.0, ptr %data.0, align 8299  %3 = or disjoint i64 %1, 1300  %data.1 = getelementptr inbounds i64, ptr %data, i64 %3301  %l.1 = load i64, ptr %data.1, align 8302  %add.1 = add i64 %l.factor, %l.1303  store i64 %add.1, ptr %data.1, align 8304  %iv.next = add nuw nsw i64 %iv, 1305  %ec = icmp eq i64 %iv.next, 100306  br i1 %ec, label %exit, label %loop307 308exit:309  ret void310}311 312define void @test_2xi64_interleave_loads_order_flipped(ptr noalias %data, ptr noalias %factor) {313; VF2-LABEL: define void @test_2xi64_interleave_loads_order_flipped(314; VF2-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) {315; VF2-NEXT:  [[ENTRY:.*:]]316; VF2-NEXT:    br label %[[VECTOR_PH:.*]]317; VF2:       [[VECTOR_PH]]:318; VF2-NEXT:    br label %[[VECTOR_BODY:.*]]319; VF2:       [[VECTOR_BODY]]:320; VF2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]321; VF2-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[FACTOR]], i64 [[INDEX]]322; VF2-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i64>, ptr [[TMP1]], align 8323; VF2-NEXT:    [[TMP15:%.*]] = shl nsw i64 [[INDEX]], 1324; VF2-NEXT:    [[TMP16:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP15]]325; VF2-NEXT:    [[WIDE_VEC:%.*]] = load <4 x i64>, ptr [[TMP16]], align 8326; VF2-NEXT:    [[TMP11:%.*]] = shufflevector <4 x i64> [[WIDE_VEC]], <4 x i64> poison, <2 x i32> <i32 0, i32 2>327; VF2-NEXT:    [[TMP20:%.*]] = shufflevector <4 x i64> [[WIDE_VEC]], <4 x i64> poison, <2 x i32> <i32 1, i32 3>328; VF2-NEXT:    [[TMP21:%.*]] = mul <2 x i64> [[WIDE_LOAD]], [[TMP20]]329; VF2-NEXT:    [[TMP24:%.*]] = mul <2 x i64> [[WIDE_LOAD]], [[TMP11]]330; VF2-NEXT:    [[TMP7:%.*]] = shufflevector <2 x i64> [[TMP21]], <2 x i64> [[TMP24]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>331; VF2-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <4 x i64> [[TMP7]], <4 x i64> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>332; VF2-NEXT:    store <4 x i64> [[INTERLEAVED_VEC]], ptr [[TMP16]], align 8333; VF2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2334; VF2-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100335; VF2-NEXT:    br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]336; VF2:       [[MIDDLE_BLOCK]]:337; VF2-NEXT:    br [[EXIT:label %.*]]338; VF2:       [[SCALAR_PH:.*:]]339;340; VF4-LABEL: define void @test_2xi64_interleave_loads_order_flipped(341; VF4-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) {342; VF4-NEXT:  [[ENTRY:.*:]]343; VF4-NEXT:    br label %[[VECTOR_PH:.*]]344; VF4:       [[VECTOR_PH]]:345; VF4-NEXT:    br label %[[VECTOR_BODY:.*]]346; VF4:       [[VECTOR_BODY]]:347; VF4-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]348; VF4-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[FACTOR]], i64 [[INDEX]]349; VF4-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP1]], align 8350; VF4-NEXT:    [[TMP27:%.*]] = shl nsw i64 [[INDEX]], 1351; VF4-NEXT:    [[TMP28:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP27]]352; VF4-NEXT:    [[WIDE_VEC:%.*]] = load <8 x i64>, ptr [[TMP28]], align 8353; VF4-NEXT:    [[TMP19:%.*]] = shufflevector <8 x i64> [[WIDE_VEC]], <8 x i64> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>354; VF4-NEXT:    [[TMP36:%.*]] = shufflevector <8 x i64> [[WIDE_VEC]], <8 x i64> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>355; VF4-NEXT:    [[TMP37:%.*]] = mul <4 x i64> [[WIDE_LOAD]], [[TMP36]]356; VF4-NEXT:    [[TMP42:%.*]] = mul <4 x i64> [[WIDE_LOAD]], [[TMP19]]357; VF4-NEXT:    [[TMP7:%.*]] = shufflevector <4 x i64> [[TMP37]], <4 x i64> [[TMP42]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>358; VF4-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <8 x i64> [[TMP7]], <8 x i64> poison, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>359; VF4-NEXT:    store <8 x i64> [[INTERLEAVED_VEC]], ptr [[TMP28]], align 8360; VF4-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4361; VF4-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100362; VF4-NEXT:    br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]363; VF4:       [[MIDDLE_BLOCK]]:364; VF4-NEXT:    br [[EXIT:label %.*]]365; VF4:       [[SCALAR_PH:.*:]]366;367entry:368  br label %loop369 370loop:371  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]372  %arrayidx = getelementptr inbounds i64, ptr %factor, i64 %iv373  %l.factor = load i64, ptr %arrayidx, align 8374  %1 = shl nsw i64 %iv, 1375  %data.0 = getelementptr inbounds i64, ptr %data, i64 %1376  %l.0 = load i64, ptr %data.0, align 8377  %3 = or disjoint i64 %1, 1378  %data.1 = getelementptr inbounds i64, ptr %data, i64 %3379  %l.1 = load i64, ptr %data.1, align 8380  %mul.0 = mul i64 %l.factor, %l.1381  store i64 %mul.0, ptr %data.0, align 8382  %mul.1 = mul i64 %l.factor, %l.0383  store i64 %mul.1, ptr %data.1, align 8384  %iv.next = add nuw nsw i64 %iv, 1385  %ec = icmp eq i64 %iv.next, 100386  br i1 %ec, label %exit, label %loop387 388exit:389  ret void390}391 392define void @test_2xi64_store_order_flipped_1(ptr noalias %data, ptr noalias %factor) {393; VF2-LABEL: define void @test_2xi64_store_order_flipped_1(394; VF2-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) {395; VF2-NEXT:  [[ENTRY:.*:]]396; VF2-NEXT:    br label %[[VECTOR_PH:.*]]397; VF2:       [[VECTOR_PH]]:398; VF2-NEXT:    br label %[[VECTOR_BODY:.*]]399; VF2:       [[VECTOR_BODY]]:400; VF2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]401; VF2-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[FACTOR]], i64 [[INDEX]]402; VF2-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i64>, ptr [[TMP1]], align 8403; VF2-NEXT:    [[TMP6:%.*]] = shl nsw i64 [[INDEX]], 1404; VF2-NEXT:    [[TMP7:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP6]]405; VF2-NEXT:    [[WIDE_VEC:%.*]] = load <4 x i64>, ptr [[TMP7]], align 8406; VF2-NEXT:    [[TMP11:%.*]] = shufflevector <4 x i64> [[WIDE_VEC]], <4 x i64> poison, <2 x i32> <i32 0, i32 2>407; VF2-NEXT:    [[TMP21:%.*]] = shufflevector <4 x i64> [[WIDE_VEC]], <4 x i64> poison, <2 x i32> <i32 1, i32 3>408; VF2-NEXT:    [[TMP12:%.*]] = mul <2 x i64> [[WIDE_LOAD]], [[TMP11]]409; VF2-NEXT:    [[TMP22:%.*]] = mul <2 x i64> [[WIDE_LOAD]], [[TMP21]]410; VF2-NEXT:    [[TMP8:%.*]] = shufflevector <2 x i64> [[TMP22]], <2 x i64> [[TMP12]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>411; VF2-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <4 x i64> [[TMP8]], <4 x i64> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>412; VF2-NEXT:    store <4 x i64> [[INTERLEAVED_VEC]], ptr [[TMP7]], align 8413; VF2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2414; VF2-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100415; VF2-NEXT:    br i1 [[TMP9]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]416; VF2:       [[MIDDLE_BLOCK]]:417; VF2-NEXT:    br [[EXIT:label %.*]]418; VF2:       [[SCALAR_PH:.*:]]419;420; VF4-LABEL: define void @test_2xi64_store_order_flipped_1(421; VF4-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) {422; VF4-NEXT:  [[ENTRY:.*:]]423; VF4-NEXT:    br label %[[VECTOR_PH:.*]]424; VF4:       [[VECTOR_PH]]:425; VF4-NEXT:    br label %[[VECTOR_BODY:.*]]426; VF4:       [[VECTOR_BODY]]:427; VF4-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]428; VF4-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[FACTOR]], i64 [[INDEX]]429; VF4-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP1]], align 8430; VF4-NEXT:    [[TMP10:%.*]] = shl nsw i64 [[INDEX]], 1431; VF4-NEXT:    [[TMP11:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP10]]432; VF4-NEXT:    [[WIDE_VEC:%.*]] = load <8 x i64>, ptr [[TMP11]], align 8433; VF4-NEXT:    [[TMP19:%.*]] = shufflevector <8 x i64> [[WIDE_VEC]], <8 x i64> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>434; VF4-NEXT:    [[TMP37:%.*]] = shufflevector <8 x i64> [[WIDE_VEC]], <8 x i64> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>435; VF4-NEXT:    [[TMP20:%.*]] = mul <4 x i64> [[WIDE_LOAD]], [[TMP19]]436; VF4-NEXT:    [[TMP38:%.*]] = mul <4 x i64> [[WIDE_LOAD]], [[TMP37]]437; VF4-NEXT:    [[TMP7:%.*]] = shufflevector <4 x i64> [[TMP38]], <4 x i64> [[TMP20]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>438; VF4-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <8 x i64> [[TMP7]], <8 x i64> poison, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>439; VF4-NEXT:    store <8 x i64> [[INTERLEAVED_VEC]], ptr [[TMP11]], align 8440; VF4-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4441; VF4-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100442; VF4-NEXT:    br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP7:![0-9]+]]443; VF4:       [[MIDDLE_BLOCK]]:444; VF4-NEXT:    br [[EXIT:label %.*]]445; VF4:       [[SCALAR_PH:.*:]]446;447entry:448  br label %loop449 450loop:451  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]452  %arrayidx = getelementptr inbounds i64, ptr %factor, i64 %iv453  %l.factor = load i64, ptr %arrayidx, align 8454  %1 = shl nsw i64 %iv, 1455  %data.0 = getelementptr inbounds i64, ptr %data, i64 %1456  %l.0 = load i64, ptr %data.0, align 8457  %mul.0 = mul i64 %l.factor, %l.0458  %3 = or disjoint i64 %1, 1459  %data.1 = getelementptr inbounds i64, ptr %data, i64 %3460  %l.1 = load i64, ptr %data.1, align 8461  %mul.1 = mul i64 %l.factor, %l.1462  store i64 %mul.1, ptr %data.0, align 8463  store i64 %mul.0, ptr %data.1, align 8464  %iv.next = add nuw nsw i64 %iv, 1465  %ec = icmp eq i64 %iv.next, 100466  br i1 %ec, label %exit, label %loop467 468exit:469  ret void470}471 472define void @test_2xi64_store_order_flipped_2(ptr noalias %data, ptr noalias %factor) {473; VF2-LABEL: define void @test_2xi64_store_order_flipped_2(474; VF2-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) {475; VF2-NEXT:  [[ENTRY:.*:]]476; VF2-NEXT:    br label %[[VECTOR_PH:.*]]477; VF2:       [[VECTOR_PH]]:478; VF2-NEXT:    br label %[[VECTOR_BODY:.*]]479; VF2:       [[VECTOR_BODY]]:480; VF2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]481; VF2-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[FACTOR]], i64 [[INDEX]]482; VF2-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i64>, ptr [[TMP1]], align 8483; VF2-NEXT:    [[TMP6:%.*]] = shl nsw i64 [[INDEX]], 1484; VF2-NEXT:    [[TMP7:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP6]]485; VF2-NEXT:    [[WIDE_VEC:%.*]] = load <4 x i64>, ptr [[TMP7]], align 8486; VF2-NEXT:    [[TMP11:%.*]] = shufflevector <4 x i64> [[WIDE_VEC]], <4 x i64> poison, <2 x i32> <i32 0, i32 2>487; VF2-NEXT:    [[TMP21:%.*]] = shufflevector <4 x i64> [[WIDE_VEC]], <4 x i64> poison, <2 x i32> <i32 1, i32 3>488; VF2-NEXT:    [[TMP12:%.*]] = mul <2 x i64> [[WIDE_LOAD]], [[TMP11]]489; VF2-NEXT:    [[TMP22:%.*]] = mul <2 x i64> [[WIDE_LOAD]], [[TMP21]]490; VF2-NEXT:    [[TMP8:%.*]] = shufflevector <2 x i64> [[TMP22]], <2 x i64> [[TMP12]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>491; VF2-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <4 x i64> [[TMP8]], <4 x i64> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>492; VF2-NEXT:    store <4 x i64> [[INTERLEAVED_VEC]], ptr [[TMP7]], align 8493; VF2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2494; VF2-NEXT:    [[TMP9:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100495; VF2-NEXT:    br i1 [[TMP9]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]496; VF2:       [[MIDDLE_BLOCK]]:497; VF2-NEXT:    br [[EXIT:label %.*]]498; VF2:       [[SCALAR_PH:.*:]]499;500; VF4-LABEL: define void @test_2xi64_store_order_flipped_2(501; VF4-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) {502; VF4-NEXT:  [[ENTRY:.*:]]503; VF4-NEXT:    br label %[[VECTOR_PH:.*]]504; VF4:       [[VECTOR_PH]]:505; VF4-NEXT:    br label %[[VECTOR_BODY:.*]]506; VF4:       [[VECTOR_BODY]]:507; VF4-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]508; VF4-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[FACTOR]], i64 [[INDEX]]509; VF4-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP1]], align 8510; VF4-NEXT:    [[TMP10:%.*]] = shl nsw i64 [[INDEX]], 1511; VF4-NEXT:    [[TMP11:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP10]]512; VF4-NEXT:    [[WIDE_VEC:%.*]] = load <8 x i64>, ptr [[TMP11]], align 8513; VF4-NEXT:    [[TMP19:%.*]] = shufflevector <8 x i64> [[WIDE_VEC]], <8 x i64> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>514; VF4-NEXT:    [[TMP37:%.*]] = shufflevector <8 x i64> [[WIDE_VEC]], <8 x i64> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>515; VF4-NEXT:    [[TMP20:%.*]] = mul <4 x i64> [[WIDE_LOAD]], [[TMP19]]516; VF4-NEXT:    [[TMP38:%.*]] = mul <4 x i64> [[WIDE_LOAD]], [[TMP37]]517; VF4-NEXT:    [[TMP7:%.*]] = shufflevector <4 x i64> [[TMP38]], <4 x i64> [[TMP20]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>518; VF4-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <8 x i64> [[TMP7]], <8 x i64> poison, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>519; VF4-NEXT:    store <8 x i64> [[INTERLEAVED_VEC]], ptr [[TMP11]], align 8520; VF4-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4521; VF4-NEXT:    [[TMP8:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100522; VF4-NEXT:    br i1 [[TMP8]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]523; VF4:       [[MIDDLE_BLOCK]]:524; VF4-NEXT:    br [[EXIT:label %.*]]525; VF4:       [[SCALAR_PH:.*:]]526;527entry:528  br label %loop529 530loop:531  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]532  %arrayidx = getelementptr inbounds i64, ptr %factor, i64 %iv533  %l.factor = load i64, ptr %arrayidx, align 8534  %1 = shl nsw i64 %iv, 1535  %data.0 = getelementptr inbounds i64, ptr %data, i64 %1536  %l.0 = load i64, ptr %data.0, align 8537  %mul.0 = mul i64 %l.factor, %l.0538  %3 = or disjoint i64 %1, 1539  %data.1 = getelementptr inbounds i64, ptr %data, i64 %3540  %l.1 = load i64, ptr %data.1, align 8541  %mul.1 = mul i64 %l.factor, %l.1542  store i64 %mul.0, ptr %data.1, align 8543  store i64 %mul.1, ptr %data.0, align 8544  %iv.next = add nuw nsw i64 %iv, 1545  %ec = icmp eq i64 %iv.next, 100546  br i1 %ec, label %exit, label %loop547 548exit:549  ret void550}551 552define void @test_2xi64_different_loads_feeding_fmul(ptr noalias %data, ptr noalias %src.0, ptr noalias %src.1) {553; VF2-LABEL: define void @test_2xi64_different_loads_feeding_fmul(554; VF2-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[SRC_0:%.*]], ptr noalias [[SRC_1:%.*]]) {555; VF2-NEXT:  [[ENTRY:.*:]]556; VF2-NEXT:    br label %[[VECTOR_PH:.*]]557; VF2:       [[VECTOR_PH]]:558; VF2-NEXT:    br label %[[VECTOR_BODY:.*]]559; VF2:       [[VECTOR_BODY]]:560; VF2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]561; VF2-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[SRC_0]], i64 [[INDEX]]562; VF2-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i64>, ptr [[TMP1]], align 8563; VF2-NEXT:    [[TMP6:%.*]] = shl nsw i64 [[INDEX]], 1564; VF2-NEXT:    [[TMP7:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP6]]565; VF2-NEXT:    [[WIDE_LOAD1:%.*]] = load <2 x i64>, ptr [[TMP1]], align 8566; VF2-NEXT:    [[TMP8:%.*]] = mul <2 x i64> [[WIDE_LOAD]], [[WIDE_LOAD1]]567; VF2-NEXT:    [[TMP14:%.*]] = or disjoint i64 [[TMP6]], 1568; VF2-NEXT:    [[TMP15:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP14]]569; VF2-NEXT:    [[WIDE_VEC:%.*]] = load <4 x i64>, ptr [[TMP15]], align 8570; VF2-NEXT:    [[TMP19:%.*]] = shufflevector <4 x i64> [[WIDE_VEC]], <4 x i64> poison, <2 x i32> <i32 0, i32 2>571; VF2-NEXT:    [[TMP20:%.*]] = getelementptr inbounds i64, ptr [[SRC_1]], i64 [[INDEX]]572; VF2-NEXT:    [[WIDE_LOAD2:%.*]] = load <2 x i64>, ptr [[TMP20]], align 8573; VF2-NEXT:    [[TMP22:%.*]] = mul <2 x i64> [[WIDE_LOAD2]], [[TMP19]]574; VF2-NEXT:    [[TMP13:%.*]] = shufflevector <2 x i64> [[TMP8]], <2 x i64> [[TMP22]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>575; VF2-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <4 x i64> [[TMP13]], <4 x i64> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>576; VF2-NEXT:    store <4 x i64> [[INTERLEAVED_VEC]], ptr [[TMP7]], align 8577; VF2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2578; VF2-NEXT:    [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], 98579; VF2-NEXT:    br i1 [[TMP11]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]580; VF2:       [[MIDDLE_BLOCK]]:581; VF2-NEXT:    br label %[[SCALAR_PH:.*]]582; VF2:       [[SCALAR_PH]]:583;584; VF4-LABEL: define void @test_2xi64_different_loads_feeding_fmul(585; VF4-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[SRC_0:%.*]], ptr noalias [[SRC_1:%.*]]) {586; VF4-NEXT:  [[ENTRY:.*:]]587; VF4-NEXT:    br label %[[VECTOR_PH:.*]]588; VF4:       [[VECTOR_PH]]:589; VF4-NEXT:    br label %[[VECTOR_BODY:.*]]590; VF4:       [[VECTOR_BODY]]:591; VF4-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]592; VF4-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[SRC_0]], i64 [[INDEX]]593; VF4-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP1]], align 8594; VF4-NEXT:    [[TMP10:%.*]] = shl nsw i64 [[INDEX]], 1595; VF4-NEXT:    [[TMP11:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP10]]596; VF4-NEXT:    [[WIDE_LOAD1:%.*]] = load <4 x i64>, ptr [[TMP1]], align 8597; VF4-NEXT:    [[TMP12:%.*]] = mul <4 x i64> [[WIDE_LOAD]], [[WIDE_LOAD1]]598; VF4-NEXT:    [[TMP24:%.*]] = or disjoint i64 [[TMP10]], 1599; VF4-NEXT:    [[TMP25:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP24]]600; VF4-NEXT:    [[WIDE_VEC:%.*]] = load <8 x i64>, ptr [[TMP25]], align 8601; VF4-NEXT:    [[TMP33:%.*]] = shufflevector <8 x i64> [[WIDE_VEC]], <8 x i64> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>602; VF4-NEXT:    [[TMP34:%.*]] = getelementptr inbounds i64, ptr [[SRC_1]], i64 [[INDEX]]603; VF4-NEXT:    [[WIDE_LOAD2:%.*]] = load <4 x i64>, ptr [[TMP34]], align 8604; VF4-NEXT:    [[TMP36:%.*]] = mul <4 x i64> [[WIDE_LOAD2]], [[TMP33]]605; VF4-NEXT:    [[TMP13:%.*]] = shufflevector <4 x i64> [[TMP12]], <4 x i64> [[TMP36]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>606; VF4-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <8 x i64> [[TMP13]], <8 x i64> poison, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>607; VF4-NEXT:    store <8 x i64> [[INTERLEAVED_VEC]], ptr [[TMP11]], align 8608; VF4-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4609; VF4-NEXT:    [[TMP14:%.*]] = icmp eq i64 [[INDEX_NEXT]], 96610; VF4-NEXT:    br i1 [[TMP14]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP9:![0-9]+]]611; VF4:       [[MIDDLE_BLOCK]]:612; VF4-NEXT:    br label %[[SCALAR_PH:.*]]613; VF4:       [[SCALAR_PH]]:614;615entry:616  br label %loop617 618loop:619  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]620  %gep.src.0 = getelementptr inbounds i64, ptr %src.0, i64 %iv621  %l.src.0 = load i64, ptr %gep.src.0, align 8622  %1 = shl nsw i64 %iv, 1623  %data.0 = getelementptr inbounds i64, ptr %data, i64 %1624  %l.0 = load i64, ptr %gep.src.0, align 8625  %mul.0 = mul i64 %l.src.0, %l.0626  store i64 %mul.0, ptr %data.0, align 8627  %3 = or disjoint i64 %1, 1628  %data.1 = getelementptr inbounds i64, ptr %data, i64 %3629  %l.1 = load i64, ptr %data.1, align 8630  %gep.src.1 = getelementptr inbounds i64, ptr %src.1, i64 %iv631  %l.src.1 = load i64, ptr %gep.src.1, align 8632  %mul.1 = mul i64 %l.src.1, %l.1633  store i64 %mul.1, ptr %data.1, align 8634  %iv.next = add nuw nsw i64 %iv, 1635  %ec = icmp eq i64 %iv.next, 100636  br i1 %ec, label %exit, label %loop637 638exit:639  ret void640}641 642define void @test_3xi64(ptr noalias %data, ptr noalias %factor) {643; VF2-LABEL: define void @test_3xi64(644; VF2-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) {645; VF2-NEXT:  [[ENTRY:.*:]]646; VF2-NEXT:    br label %[[VECTOR_PH:.*]]647; VF2:       [[VECTOR_PH]]:648; VF2-NEXT:    br label %[[VECTOR_BODY:.*]]649; VF2:       [[VECTOR_BODY]]:650; VF2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]651; VF2-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i64, ptr [[FACTOR]], i64 [[INDEX]]652; VF2-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i64>, ptr [[TMP2]], align 8653; VF2-NEXT:    [[TMP4:%.*]] = getelementptr inbounds { i64, i64, i64 }, ptr [[DATA]], i64 [[INDEX]], i32 0654; VF2-NEXT:    [[WIDE_VEC:%.*]] = load <6 x i64>, ptr [[TMP4]], align 8655; VF2-NEXT:    [[TMP9:%.*]] = shufflevector <6 x i64> [[WIDE_VEC]], <6 x i64> poison, <2 x i32> <i32 0, i32 3>656; VF2-NEXT:    [[TMP18:%.*]] = shufflevector <6 x i64> [[WIDE_VEC]], <6 x i64> poison, <2 x i32> <i32 1, i32 4>657; VF2-NEXT:    [[TMP27:%.*]] = shufflevector <6 x i64> [[WIDE_VEC]], <6 x i64> poison, <2 x i32> <i32 2, i32 5>658; VF2-NEXT:    [[TMP10:%.*]] = mul <2 x i64> [[WIDE_LOAD]], [[TMP9]]659; VF2-NEXT:    [[TMP19:%.*]] = mul <2 x i64> [[WIDE_LOAD]], [[TMP18]]660; VF2-NEXT:    [[TMP28:%.*]] = mul <2 x i64> [[WIDE_LOAD]], [[TMP27]]661; VF2-NEXT:    [[TMP7:%.*]] = shufflevector <2 x i64> [[TMP10]], <2 x i64> [[TMP19]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>662; VF2-NEXT:    [[TMP8:%.*]] = shufflevector <2 x i64> [[TMP28]], <2 x i64> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>663; VF2-NEXT:    [[TMP11:%.*]] = shufflevector <4 x i64> [[TMP7]], <4 x i64> [[TMP8]], <6 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5>664; VF2-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <6 x i64> [[TMP11]], <6 x i64> poison, <6 x i32> <i32 0, i32 2, i32 4, i32 1, i32 3, i32 5>665; VF2-NEXT:    store <6 x i64> [[INTERLEAVED_VEC]], ptr [[TMP4]], align 8666; VF2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2667; VF2-NEXT:    [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100668; VF2-NEXT:    br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]669; VF2:       [[MIDDLE_BLOCK]]:670; VF2-NEXT:    br [[EXIT:label %.*]]671; VF2:       [[SCALAR_PH:.*:]]672;673; VF4-LABEL: define void @test_3xi64(674; VF4-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) {675; VF4-NEXT:  [[ENTRY:.*:]]676; VF4-NEXT:    br label %[[VECTOR_PH:.*]]677; VF4:       [[VECTOR_PH]]:678; VF4-NEXT:    br label %[[VECTOR_BODY:.*]]679; VF4:       [[VECTOR_BODY]]:680; VF4-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]681; VF4-NEXT:    [[TMP4:%.*]] = getelementptr inbounds i64, ptr [[FACTOR]], i64 [[INDEX]]682; VF4-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP4]], align 8683; VF4-NEXT:    [[TMP6:%.*]] = getelementptr inbounds { i64, i64, i64 }, ptr [[DATA]], i64 [[INDEX]], i32 0684; VF4-NEXT:    [[WIDE_VEC:%.*]] = load <12 x i64>, ptr [[TMP6]], align 8685; VF4-NEXT:    [[TMP17:%.*]] = shufflevector <12 x i64> [[WIDE_VEC]], <12 x i64> poison, <4 x i32> <i32 0, i32 3, i32 6, i32 9>686; VF4-NEXT:    [[TMP34:%.*]] = shufflevector <12 x i64> [[WIDE_VEC]], <12 x i64> poison, <4 x i32> <i32 1, i32 4, i32 7, i32 10>687; VF4-NEXT:    [[TMP51:%.*]] = shufflevector <12 x i64> [[WIDE_VEC]], <12 x i64> poison, <4 x i32> <i32 2, i32 5, i32 8, i32 11>688; VF4-NEXT:    [[TMP18:%.*]] = mul <4 x i64> [[WIDE_LOAD]], [[TMP17]]689; VF4-NEXT:    [[TMP35:%.*]] = mul <4 x i64> [[WIDE_LOAD]], [[TMP34]]690; VF4-NEXT:    [[TMP52:%.*]] = mul <4 x i64> [[WIDE_LOAD]], [[TMP51]]691; VF4-NEXT:    [[TMP7:%.*]] = shufflevector <4 x i64> [[TMP18]], <4 x i64> [[TMP35]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>692; VF4-NEXT:    [[TMP8:%.*]] = shufflevector <4 x i64> [[TMP52]], <4 x i64> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>693; VF4-NEXT:    [[TMP9:%.*]] = shufflevector <8 x i64> [[TMP7]], <8 x i64> [[TMP8]], <12 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>694; VF4-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <12 x i64> [[TMP9]], <12 x i64> poison, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11>695; VF4-NEXT:    store <12 x i64> [[INTERLEAVED_VEC]], ptr [[TMP6]], align 8696; VF4-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4697; VF4-NEXT:    [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100698; VF4-NEXT:    br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP11:![0-9]+]]699; VF4:       [[MIDDLE_BLOCK]]:700; VF4-NEXT:    br [[EXIT:label %.*]]701; VF4:       [[SCALAR_PH:.*:]]702;703entry:704  br label %loop705 706loop:707  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]708  %arrayidx = getelementptr inbounds i64, ptr %factor, i64 %iv709  %l.factor = load i64, ptr %arrayidx, align 8710  %data.0 = getelementptr inbounds { i64 , i64, i64 }, ptr %data, i64 %iv, i32 0711  %l.0 = load i64, ptr %data.0, align 8712  %mul.0 = mul i64 %l.factor, %l.0713  store i64 %mul.0, ptr %data.0, align 8714  %data.1 = getelementptr inbounds { i64 , i64, i64 }, ptr %data, i64 %iv, i32 1715  %l.1 = load i64, ptr %data.1, align 8716  %mul.1 = mul i64 %l.factor, %l.1717  store i64 %mul.1, ptr %data.1, align 8718  %data.2 = getelementptr inbounds { i64 , i64, i64 }, ptr %data, i64 %iv, i32 2719  %l.2 = load i64, ptr %data.2, align 8720  %mul.2 = mul i64 %l.factor, %l.2721  store i64 %mul.2, ptr %data.2, align 8722  %iv.next = add nuw nsw i64 %iv, 1723  %ec = icmp eq i64 %iv.next, 100724  br i1 %ec, label %exit, label %loop725 726exit:727  ret void728}729 730define void @test_2xi32(ptr noalias %data, ptr noalias %factor) {731; VF2-LABEL: define void @test_2xi32(732; VF2-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) {733; VF2-NEXT:  [[ENTRY:.*:]]734; VF2-NEXT:    br label %[[VECTOR_PH:.*]]735; VF2:       [[VECTOR_PH]]:736; VF2-NEXT:    br label %[[VECTOR_BODY:.*]]737; VF2:       [[VECTOR_BODY]]:738; VF2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]739; VF2-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0740; VF2-NEXT:    [[TMP1:%.*]] = add i64 [[INDEX]], 1741; VF2-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i64, ptr [[FACTOR]], i64 [[TMP0]]742; VF2-NEXT:    [[WIDE_VEC:%.*]] = load <4 x i32>, ptr [[TMP2]], align 8743; VF2-NEXT:    [[TMP7:%.*]] = shufflevector <4 x i32> [[WIDE_VEC]], <4 x i32> poison, <2 x i32> <i32 0, i32 2>744; VF2-NEXT:    [[TMP8:%.*]] = getelementptr inbounds { i32, i32, i32 }, ptr [[DATA]], i64 [[TMP0]], i32 0745; VF2-NEXT:    [[TMP9:%.*]] = getelementptr inbounds { i32, i32, i32 }, ptr [[DATA]], i64 [[TMP1]], i32 0746; VF2-NEXT:    [[WIDE_VEC1:%.*]] = load <6 x i32>, ptr [[TMP8]], align 8747; VF2-NEXT:    [[TMP13:%.*]] = shufflevector <6 x i32> [[WIDE_VEC1]], <6 x i32> poison, <2 x i32> <i32 0, i32 3>748; VF2-NEXT:    [[TMP22:%.*]] = shufflevector <6 x i32> [[WIDE_VEC1]], <6 x i32> poison, <2 x i32> <i32 1, i32 4>749; VF2-NEXT:    [[TMP14:%.*]] = mul <2 x i32> [[TMP7]], [[TMP13]]750; VF2-NEXT:    [[TMP15:%.*]] = extractelement <2 x i32> [[TMP14]], i32 0751; VF2-NEXT:    [[TMP16:%.*]] = extractelement <2 x i32> [[TMP14]], i32 1752; VF2-NEXT:    store i32 [[TMP15]], ptr [[TMP8]], align 8753; VF2-NEXT:    store i32 [[TMP16]], ptr [[TMP9]], align 8754; VF2-NEXT:    [[TMP17:%.*]] = getelementptr inbounds { i32, i32, i32 }, ptr [[DATA]], i64 [[TMP0]], i32 1755; VF2-NEXT:    [[TMP18:%.*]] = getelementptr inbounds { i32, i32, i32 }, ptr [[DATA]], i64 [[TMP1]], i32 1756; VF2-NEXT:    [[TMP23:%.*]] = mul <2 x i32> [[TMP7]], [[TMP22]]757; VF2-NEXT:    [[TMP24:%.*]] = extractelement <2 x i32> [[TMP23]], i32 0758; VF2-NEXT:    [[TMP25:%.*]] = extractelement <2 x i32> [[TMP23]], i32 1759; VF2-NEXT:    store i32 [[TMP24]], ptr [[TMP17]], align 8760; VF2-NEXT:    store i32 [[TMP25]], ptr [[TMP18]], align 8761; VF2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2762; VF2-NEXT:    [[TMP19:%.*]] = icmp eq i64 [[INDEX_NEXT]], 98763; VF2-NEXT:    br i1 [[TMP19]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]764; VF2:       [[MIDDLE_BLOCK]]:765; VF2-NEXT:    br label %[[SCALAR_PH:.*]]766; VF2:       [[SCALAR_PH]]:767;768; VF4-LABEL: define void @test_2xi32(769; VF4-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) {770; VF4-NEXT:  [[ENTRY:.*:]]771; VF4-NEXT:    br label %[[VECTOR_PH:.*]]772; VF4:       [[VECTOR_PH]]:773; VF4-NEXT:    br label %[[VECTOR_BODY:.*]]774; VF4:       [[VECTOR_BODY]]:775; VF4-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]776; VF4-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0777; VF4-NEXT:    [[TMP1:%.*]] = add i64 [[INDEX]], 1778; VF4-NEXT:    [[TMP2:%.*]] = add i64 [[INDEX]], 2779; VF4-NEXT:    [[TMP3:%.*]] = add i64 [[INDEX]], 3780; VF4-NEXT:    [[TMP4:%.*]] = getelementptr inbounds i64, ptr [[FACTOR]], i64 [[TMP0]]781; VF4-NEXT:    [[WIDE_VEC:%.*]] = load <8 x i32>, ptr [[TMP4]], align 8782; VF4-NEXT:    [[TMP15:%.*]] = shufflevector <8 x i32> [[WIDE_VEC]], <8 x i32> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>783; VF4-NEXT:    [[TMP16:%.*]] = getelementptr inbounds { i32, i32, i32 }, ptr [[DATA]], i64 [[TMP0]], i32 0784; VF4-NEXT:    [[TMP17:%.*]] = getelementptr inbounds { i32, i32, i32 }, ptr [[DATA]], i64 [[TMP1]], i32 0785; VF4-NEXT:    [[TMP18:%.*]] = getelementptr inbounds { i32, i32, i32 }, ptr [[DATA]], i64 [[TMP2]], i32 0786; VF4-NEXT:    [[TMP19:%.*]] = getelementptr inbounds { i32, i32, i32 }, ptr [[DATA]], i64 [[TMP3]], i32 0787; VF4-NEXT:    [[WIDE_VEC1:%.*]] = load <12 x i32>, ptr [[TMP16]], align 8788; VF4-NEXT:    [[TMP27:%.*]] = shufflevector <12 x i32> [[WIDE_VEC1]], <12 x i32> poison, <4 x i32> <i32 0, i32 3, i32 6, i32 9>789; VF4-NEXT:    [[TMP44:%.*]] = shufflevector <12 x i32> [[WIDE_VEC1]], <12 x i32> poison, <4 x i32> <i32 1, i32 4, i32 7, i32 10>790; VF4-NEXT:    [[TMP28:%.*]] = mul <4 x i32> [[TMP15]], [[TMP27]]791; VF4-NEXT:    [[TMP29:%.*]] = extractelement <4 x i32> [[TMP28]], i32 0792; VF4-NEXT:    [[TMP30:%.*]] = extractelement <4 x i32> [[TMP28]], i32 1793; VF4-NEXT:    [[TMP31:%.*]] = extractelement <4 x i32> [[TMP28]], i32 2794; VF4-NEXT:    [[TMP32:%.*]] = extractelement <4 x i32> [[TMP28]], i32 3795; VF4-NEXT:    store i32 [[TMP29]], ptr [[TMP16]], align 8796; VF4-NEXT:    store i32 [[TMP30]], ptr [[TMP17]], align 8797; VF4-NEXT:    store i32 [[TMP31]], ptr [[TMP18]], align 8798; VF4-NEXT:    store i32 [[TMP32]], ptr [[TMP19]], align 8799; VF4-NEXT:    [[TMP33:%.*]] = getelementptr inbounds { i32, i32, i32 }, ptr [[DATA]], i64 [[TMP0]], i32 1800; VF4-NEXT:    [[TMP34:%.*]] = getelementptr inbounds { i32, i32, i32 }, ptr [[DATA]], i64 [[TMP1]], i32 1801; VF4-NEXT:    [[TMP35:%.*]] = getelementptr inbounds { i32, i32, i32 }, ptr [[DATA]], i64 [[TMP2]], i32 1802; VF4-NEXT:    [[TMP36:%.*]] = getelementptr inbounds { i32, i32, i32 }, ptr [[DATA]], i64 [[TMP3]], i32 1803; VF4-NEXT:    [[TMP45:%.*]] = mul <4 x i32> [[TMP15]], [[TMP44]]804; VF4-NEXT:    [[TMP46:%.*]] = extractelement <4 x i32> [[TMP45]], i32 0805; VF4-NEXT:    [[TMP47:%.*]] = extractelement <4 x i32> [[TMP45]], i32 1806; VF4-NEXT:    [[TMP48:%.*]] = extractelement <4 x i32> [[TMP45]], i32 2807; VF4-NEXT:    [[TMP49:%.*]] = extractelement <4 x i32> [[TMP45]], i32 3808; VF4-NEXT:    store i32 [[TMP46]], ptr [[TMP33]], align 8809; VF4-NEXT:    store i32 [[TMP47]], ptr [[TMP34]], align 8810; VF4-NEXT:    store i32 [[TMP48]], ptr [[TMP35]], align 8811; VF4-NEXT:    store i32 [[TMP49]], ptr [[TMP36]], align 8812; VF4-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4813; VF4-NEXT:    [[TMP23:%.*]] = icmp eq i64 [[INDEX_NEXT]], 96814; VF4-NEXT:    br i1 [[TMP23]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP12:![0-9]+]]815; VF4:       [[MIDDLE_BLOCK]]:816; VF4-NEXT:    br label %[[SCALAR_PH:.*]]817; VF4:       [[SCALAR_PH]]:818;819entry:820  br label %loop821 822loop:823  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]824  %arrayidx = getelementptr inbounds i64, ptr %factor, i64 %iv825  %l.factor = load i32 , ptr %arrayidx, align 8826  %data.0 = getelementptr inbounds { i32, i32, i32 }, ptr %data, i64 %iv, i32 0827  %l.0 = load i32, ptr %data.0, align 8828  %mul.0 = mul i32 %l.factor, %l.0829  store i32 %mul.0, ptr %data.0, align 8830  %data.1 = getelementptr inbounds { i32, i32, i32 }, ptr %data, i64 %iv, i32 1831  %l.1 = load i32, ptr %data.1, align 8832  %mul.1 = mul i32 %l.factor, %l.1833  store i32%mul.1, ptr %data.1, align 8834  %iv.next = add nuw nsw i64 %iv, 1835  %ec = icmp eq i64 %iv.next, 100836  br i1 %ec, label %exit, label %loop837 838exit:839  ret void840}841 842define void @test_3xi32(ptr noalias %data, ptr noalias %factor) {843; VF2-LABEL: define void @test_3xi32(844; VF2-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) {845; VF2-NEXT:  [[ENTRY:.*:]]846; VF2-NEXT:    br label %[[VECTOR_PH:.*]]847; VF2:       [[VECTOR_PH]]:848; VF2-NEXT:    br label %[[VECTOR_BODY:.*]]849; VF2:       [[VECTOR_BODY]]:850; VF2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]851; VF2-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i64, ptr [[FACTOR]], i64 [[INDEX]]852; VF2-NEXT:    [[WIDE_VEC:%.*]] = load <4 x i32>, ptr [[TMP3]], align 8853; VF2-NEXT:    [[TMP7:%.*]] = shufflevector <4 x i32> [[WIDE_VEC]], <4 x i32> poison, <2 x i32> <i32 0, i32 2>854; VF2-NEXT:    [[TMP9:%.*]] = getelementptr inbounds { i32, i32, i32 }, ptr [[DATA]], i64 [[INDEX]], i32 0855; VF2-NEXT:    [[WIDE_VEC1:%.*]] = load <6 x i32>, ptr [[TMP9]], align 8856; VF2-NEXT:    [[TMP13:%.*]] = shufflevector <6 x i32> [[WIDE_VEC1]], <6 x i32> poison, <2 x i32> <i32 0, i32 3>857; VF2-NEXT:    [[TMP22:%.*]] = shufflevector <6 x i32> [[WIDE_VEC1]], <6 x i32> poison, <2 x i32> <i32 1, i32 4>858; VF2-NEXT:    [[TMP31:%.*]] = shufflevector <6 x i32> [[WIDE_VEC1]], <6 x i32> poison, <2 x i32> <i32 2, i32 5>859; VF2-NEXT:    [[TMP14:%.*]] = mul <2 x i32> [[TMP7]], [[TMP13]]860; VF2-NEXT:    [[TMP23:%.*]] = mul <2 x i32> [[TMP7]], [[TMP22]]861; VF2-NEXT:    [[TMP32:%.*]] = mul <2 x i32> [[TMP7]], [[TMP31]]862; VF2-NEXT:    [[TMP8:%.*]] = shufflevector <2 x i32> [[TMP14]], <2 x i32> [[TMP23]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>863; VF2-NEXT:    [[TMP11:%.*]] = shufflevector <2 x i32> [[TMP32]], <2 x i32> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>864; VF2-NEXT:    [[TMP10:%.*]] = shufflevector <4 x i32> [[TMP8]], <4 x i32> [[TMP11]], <6 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5>865; VF2-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <6 x i32> [[TMP10]], <6 x i32> poison, <6 x i32> <i32 0, i32 2, i32 4, i32 1, i32 3, i32 5>866; VF2-NEXT:    store <6 x i32> [[INTERLEAVED_VEC]], ptr [[TMP9]], align 8867; VF2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2868; VF2-NEXT:    [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], 98869; VF2-NEXT:    br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]870; VF2:       [[MIDDLE_BLOCK]]:871; VF2-NEXT:    br label %[[SCALAR_PH:.*]]872; VF2:       [[SCALAR_PH]]:873;874; VF4-LABEL: define void @test_3xi32(875; VF4-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[FACTOR:%.*]]) {876; VF4-NEXT:  [[ENTRY:.*:]]877; VF4-NEXT:    br label %[[VECTOR_PH:.*]]878; VF4:       [[VECTOR_PH]]:879; VF4-NEXT:    br label %[[VECTOR_BODY:.*]]880; VF4:       [[VECTOR_BODY]]:881; VF4-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]882; VF4-NEXT:    [[TMP7:%.*]] = getelementptr inbounds i64, ptr [[FACTOR]], i64 [[INDEX]]883; VF4-NEXT:    [[WIDE_VEC:%.*]] = load <8 x i32>, ptr [[TMP7]], align 8884; VF4-NEXT:    [[TMP15:%.*]] = shufflevector <8 x i32> [[WIDE_VEC]], <8 x i32> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>885; VF4-NEXT:    [[TMP19:%.*]] = getelementptr inbounds { i32, i32, i32 }, ptr [[DATA]], i64 [[INDEX]], i32 0886; VF4-NEXT:    [[WIDE_VEC1:%.*]] = load <12 x i32>, ptr [[TMP19]], align 8887; VF4-NEXT:    [[TMP27:%.*]] = shufflevector <12 x i32> [[WIDE_VEC1]], <12 x i32> poison, <4 x i32> <i32 0, i32 3, i32 6, i32 9>888; VF4-NEXT:    [[TMP44:%.*]] = shufflevector <12 x i32> [[WIDE_VEC1]], <12 x i32> poison, <4 x i32> <i32 1, i32 4, i32 7, i32 10>889; VF4-NEXT:    [[TMP61:%.*]] = shufflevector <12 x i32> [[WIDE_VEC1]], <12 x i32> poison, <4 x i32> <i32 2, i32 5, i32 8, i32 11>890; VF4-NEXT:    [[TMP28:%.*]] = mul <4 x i32> [[TMP15]], [[TMP27]]891; VF4-NEXT:    [[TMP45:%.*]] = mul <4 x i32> [[TMP15]], [[TMP44]]892; VF4-NEXT:    [[TMP62:%.*]] = mul <4 x i32> [[TMP15]], [[TMP61]]893; VF4-NEXT:    [[TMP8:%.*]] = shufflevector <4 x i32> [[TMP28]], <4 x i32> [[TMP45]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>894; VF4-NEXT:    [[TMP9:%.*]] = shufflevector <4 x i32> [[TMP62]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 poison, i32 poison, i32 poison, i32 poison>895; VF4-NEXT:    [[TMP10:%.*]] = shufflevector <8 x i32> [[TMP8]], <8 x i32> [[TMP9]], <12 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11>896; VF4-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <12 x i32> [[TMP10]], <12 x i32> poison, <12 x i32> <i32 0, i32 4, i32 8, i32 1, i32 5, i32 9, i32 2, i32 6, i32 10, i32 3, i32 7, i32 11>897; VF4-NEXT:    store <12 x i32> [[INTERLEAVED_VEC]], ptr [[TMP19]], align 8898; VF4-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4899; VF4-NEXT:    [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], 96900; VF4-NEXT:    br i1 [[TMP11]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP14:![0-9]+]]901; VF4:       [[MIDDLE_BLOCK]]:902; VF4-NEXT:    br label %[[SCALAR_PH:.*]]903; VF4:       [[SCALAR_PH]]:904;905entry:906  br label %loop907 908loop:909  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]910  %arrayidx = getelementptr inbounds i64, ptr %factor, i64 %iv911  %l.factor = load i32 , ptr %arrayidx, align 8912  %data.0 = getelementptr inbounds { i32, i32, i32 }, ptr %data, i64 %iv, i32 0913  %l.0 = load i32, ptr %data.0, align 8914  %mul.0 = mul i32 %l.factor, %l.0915  store i32 %mul.0, ptr %data.0, align 8916  %data.1 = getelementptr inbounds { i32, i32, i32 }, ptr %data, i64 %iv, i32 1917  %l.1 = load i32, ptr %data.1, align 8918  %mul.1 = mul i32 %l.factor, %l.1919  store i32%mul.1, ptr %data.1, align 8920  %data.2 = getelementptr inbounds { i32, i32, i32 }, ptr %data, i64 %iv, i32 2921  %l.2 = load i32, ptr %data.2, align 8922  %mul.2 = mul i32 %l.factor, %l.2923  store i32 %mul.2, ptr %data.2, align 8924  %iv.next = add nuw nsw i64 %iv, 1925  %ec = icmp eq i64 %iv.next, 100926  br i1 %ec, label %exit, label %loop927 928exit:929  ret void930}931 932define void @test_2xi64_sub_of_wide_loads(ptr noalias %data, ptr noalias %A, ptr noalias %B) {933; VF2-LABEL: define void @test_2xi64_sub_of_wide_loads(934; VF2-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[A:%.*]], ptr noalias [[B:%.*]]) {935; VF2-NEXT:  [[ENTRY:.*:]]936; VF2-NEXT:    br label %[[VECTOR_PH:.*]]937; VF2:       [[VECTOR_PH]]:938; VF2-NEXT:    br label %[[VECTOR_BODY:.*]]939; VF2:       [[VECTOR_BODY]]:940; VF2-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[IV_NEXT:%.*]], %[[VECTOR_BODY]] ]941; VF2-NEXT:    [[TMP6:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP0]]942; VF2-NEXT:    [[TMP2:%.*]] = load i64, ptr [[TMP6]], align 8943; VF2-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x i64> poison, i64 [[TMP2]], i64 0944; VF2-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <2 x i64> [[BROADCAST_SPLATINSERT]], <2 x i64> poison, <2 x i32> zeroinitializer945; VF2-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i64, ptr [[B]], i64 [[TMP0]]946; VF2-NEXT:    [[TMP5:%.*]] = load i64, ptr [[TMP3]], align 8947; VF2-NEXT:    [[BROADCAST_SPLATINSERT1:%.*]] = insertelement <2 x i64> poison, i64 [[TMP5]], i64 0948; VF2-NEXT:    [[BROADCAST_SPLAT2:%.*]] = shufflevector <2 x i64> [[BROADCAST_SPLATINSERT1]], <2 x i64> poison, <2 x i32> zeroinitializer949; VF2-NEXT:    [[TMP13:%.*]] = sub <2 x i64> [[BROADCAST_SPLAT]], [[BROADCAST_SPLAT2]]950; VF2-NEXT:    [[TMP20:%.*]] = shl nsw i64 [[TMP0]], 1951; VF2-NEXT:    [[DATA_1:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP20]]952; VF2-NEXT:    store <2 x i64> [[TMP13]], ptr [[DATA_1]], align 8953; VF2-NEXT:    [[IV_NEXT]] = add nuw i64 [[TMP0]], 1954; VF2-NEXT:    [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], 100955; VF2-NEXT:    br i1 [[EC]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]]956; VF2:       [[MIDDLE_BLOCK]]:957; VF2-NEXT:    br [[EXIT:label %.*]]958; VF2:       [[SCALAR_PH:.*:]]959;960; VF4-LABEL: define void @test_2xi64_sub_of_wide_loads(961; VF4-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[A:%.*]], ptr noalias [[B:%.*]]) {962; VF4-NEXT:  [[ENTRY:.*:]]963; VF4-NEXT:    br label %[[VECTOR_PH:.*]]964; VF4:       [[VECTOR_PH]]:965; VF4-NEXT:    br label %[[VECTOR_BODY:.*]]966; VF4:       [[VECTOR_BODY]]:967; VF4-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]968; VF4-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP0]]969; VF4-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP1]], align 8970; VF4-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i64, ptr [[B]], i64 [[TMP0]]971; VF4-NEXT:    [[WIDE_LOAD1:%.*]] = load <4 x i64>, ptr [[TMP3]], align 8972; VF4-NEXT:    [[TMP5:%.*]] = sub <4 x i64> [[WIDE_LOAD]], [[WIDE_LOAD1]]973; VF4-NEXT:    [[TMP6:%.*]] = shl nsw i64 [[TMP0]], 1974; VF4-NEXT:    [[TMP7:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP6]]975; VF4-NEXT:    [[TMP9:%.*]] = shufflevector <4 x i64> [[TMP5]], <4 x i64> [[TMP5]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>976; VF4-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <8 x i64> [[TMP9]], <8 x i64> poison, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>977; VF4-NEXT:    store <8 x i64> [[INTERLEAVED_VEC]], ptr [[TMP7]], align 8978; VF4-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 4979; VF4-NEXT:    [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], 100980; VF4-NEXT:    br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP16:![0-9]+]]981; VF4:       [[MIDDLE_BLOCK]]:982; VF4-NEXT:    br [[EXIT:label %.*]]983; VF4:       [[SCALAR_PH:.*:]]984;985entry:986  br label %loop987 988loop:989  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]990  %gep.A = getelementptr inbounds i64, ptr %A, i64 %iv991  %l.A = load i64, ptr %gep.A, align 8992  %gep.B = getelementptr inbounds i64, ptr %B, i64 %iv993  %l.B = load i64, ptr %gep.B, align 8994  %sub.0 = sub i64 %l.A, %l.B995  %1 = shl nsw i64 %iv, 1996  %data.0 = getelementptr inbounds i64, ptr %data, i64 %1997  store i64 %sub.0, ptr %data.0, align 8998  %sub.1 = sub i64 %l.A, %l.B999  %3 = or disjoint i64 %1, 11000  %data.1 = getelementptr inbounds i64, ptr %data, i64 %31001  store i64 %sub.1, ptr %data.1, align 81002  %iv.next = add nuw nsw i64 %iv, 11003  %ec = icmp eq i64 %iv.next, 1001004  br i1 %ec, label %exit, label %loop1005 1006exit:1007  ret void1008}1009 1010define void @test_2xi64_sub_of_wide_loads_ops_swapped(ptr noalias %data, ptr noalias %A, ptr noalias %B) {1011; VF2-LABEL: define void @test_2xi64_sub_of_wide_loads_ops_swapped(1012; VF2-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[A:%.*]], ptr noalias [[B:%.*]]) {1013; VF2-NEXT:  [[ENTRY:.*:]]1014; VF2-NEXT:    br label %[[VECTOR_PH:.*]]1015; VF2:       [[VECTOR_PH]]:1016; VF2-NEXT:    br label %[[VECTOR_BODY:.*]]1017; VF2:       [[VECTOR_BODY]]:1018; VF2-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[IV_NEXT:%.*]], %[[VECTOR_BODY]] ]1019; VF2-NEXT:    [[TMP7:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP0]]1020; VF2-NEXT:    [[BROADCAST_SPLAT6:%.*]] = load <2 x i64>, ptr [[TMP7]], align 81021; VF2-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i64, ptr [[B]], i64 [[TMP0]]1022; VF2-NEXT:    [[WIDE_LOAD1:%.*]] = load <2 x i64>, ptr [[TMP2]], align 81023; VF2-NEXT:    [[TMP13:%.*]] = sub <2 x i64> [[BROADCAST_SPLAT6]], [[WIDE_LOAD1]]1024; VF2-NEXT:    [[TMP20:%.*]] = shl nsw i64 [[TMP0]], 11025; VF2-NEXT:    [[DATA_1:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP20]]1026; VF2-NEXT:    [[TMP15:%.*]] = sub <2 x i64> [[WIDE_LOAD1]], [[BROADCAST_SPLAT6]]1027; VF2-NEXT:    [[TMP17:%.*]] = shufflevector <2 x i64> [[TMP13]], <2 x i64> [[TMP15]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>1028; VF2-NEXT:    [[INTERLEAVED_VEC4:%.*]] = shufflevector <4 x i64> [[TMP17]], <4 x i64> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>1029; VF2-NEXT:    store <4 x i64> [[INTERLEAVED_VEC4]], ptr [[DATA_1]], align 81030; VF2-NEXT:    [[IV_NEXT]] = add nuw i64 [[TMP0]], 21031; VF2-NEXT:    [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], 1001032; VF2-NEXT:    br i1 [[EC]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]]1033; VF2:       [[MIDDLE_BLOCK]]:1034; VF2-NEXT:    br [[EXIT:label %.*]]1035; VF2:       [[SCALAR_PH:.*:]]1036;1037; VF4-LABEL: define void @test_2xi64_sub_of_wide_loads_ops_swapped(1038; VF4-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[A:%.*]], ptr noalias [[B:%.*]]) {1039; VF4-NEXT:  [[ENTRY:.*:]]1040; VF4-NEXT:    br label %[[VECTOR_PH:.*]]1041; VF4:       [[VECTOR_PH]]:1042; VF4-NEXT:    br label %[[VECTOR_BODY:.*]]1043; VF4:       [[VECTOR_BODY]]:1044; VF4-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1045; VF4-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP0]]1046; VF4-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP1]], align 81047; VF4-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i64, ptr [[B]], i64 [[TMP0]]1048; VF4-NEXT:    [[WIDE_LOAD1:%.*]] = load <4 x i64>, ptr [[TMP3]], align 81049; VF4-NEXT:    [[TMP5:%.*]] = sub <4 x i64> [[WIDE_LOAD]], [[WIDE_LOAD1]]1050; VF4-NEXT:    [[TMP6:%.*]] = shl nsw i64 [[TMP0]], 11051; VF4-NEXT:    [[TMP7:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP6]]1052; VF4-NEXT:    [[TMP8:%.*]] = sub <4 x i64> [[WIDE_LOAD1]], [[WIDE_LOAD]]1053; VF4-NEXT:    [[TMP9:%.*]] = shufflevector <4 x i64> [[TMP5]], <4 x i64> [[TMP8]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1054; VF4-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <8 x i64> [[TMP9]], <8 x i64> poison, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>1055; VF4-NEXT:    store <8 x i64> [[INTERLEAVED_VEC]], ptr [[TMP7]], align 81056; VF4-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 41057; VF4-NEXT:    [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1001058; VF4-NEXT:    br i1 [[TMP10]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP17:![0-9]+]]1059; VF4:       [[MIDDLE_BLOCK]]:1060; VF4-NEXT:    br [[EXIT:label %.*]]1061; VF4:       [[SCALAR_PH:.*:]]1062;1063entry:1064  br label %loop1065 1066loop:1067  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]1068  %gep.A = getelementptr inbounds i64, ptr %A, i64 %iv1069  %l.A = load i64, ptr %gep.A, align 81070  %gep.B = getelementptr inbounds i64, ptr %B, i64 %iv1071  %l.B = load i64, ptr %gep.B, align 81072  %sub.0 = sub i64 %l.A, %l.B1073  %1 = shl nsw i64 %iv, 11074  %data.0 = getelementptr inbounds i64, ptr %data, i64 %11075  store i64 %sub.0, ptr %data.0, align 81076  %sub.1 = sub i64 %l.B, %l.A1077  %3 = or disjoint i64 %1, 11078  %data.1 = getelementptr inbounds i64, ptr %data, i64 %31079  store i64 %sub.1, ptr %data.1, align 81080  %iv.next = add nuw nsw i64 %iv, 11081  %ec = icmp eq i64 %iv.next, 1001082  br i1 %ec, label %exit, label %loop1083 1084exit:1085  ret void1086}1087 1088define void @test_2xi64_sub_of_wide_loads_with_different_base_ptrs(ptr noalias %data, ptr noalias %A, ptr noalias %B, ptr noalias %C) {1089; VF2-LABEL: define void @test_2xi64_sub_of_wide_loads_with_different_base_ptrs(1090; VF2-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) {1091; VF2-NEXT:  [[ENTRY:.*:]]1092; VF2-NEXT:    br label %[[VECTOR_PH:.*]]1093; VF2:       [[VECTOR_PH]]:1094; VF2-NEXT:    br label %[[VECTOR_BODY:.*]]1095; VF2:       [[VECTOR_BODY]]:1096; VF2-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1097; VF2-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP0]]1098; VF2-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x i64>, ptr [[TMP1]], align 81099; VF2-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i64, ptr [[B]], i64 [[TMP0]]1100; VF2-NEXT:    [[WIDE_LOAD1:%.*]] = load <2 x i64>, ptr [[TMP3]], align 81101; VF2-NEXT:    [[TMP5:%.*]] = sub <2 x i64> [[WIDE_LOAD]], [[WIDE_LOAD1]]1102; VF2-NEXT:    [[TMP6:%.*]] = shl nsw i64 [[TMP0]], 11103; VF2-NEXT:    [[TMP7:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP6]]1104; VF2-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i64, ptr [[C]], i64 [[TMP0]]1105; VF2-NEXT:    [[WIDE_LOAD2:%.*]] = load <2 x i64>, ptr [[TMP8]], align 81106; VF2-NEXT:    [[TMP10:%.*]] = sub <2 x i64> [[WIDE_LOAD]], [[WIDE_LOAD2]]1107; VF2-NEXT:    [[TMP11:%.*]] = shufflevector <2 x i64> [[TMP5]], <2 x i64> [[TMP10]], <4 x i32> <i32 0, i32 1, i32 2, i32 3>1108; VF2-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <4 x i64> [[TMP11]], <4 x i64> poison, <4 x i32> <i32 0, i32 2, i32 1, i32 3>1109; VF2-NEXT:    store <4 x i64> [[INTERLEAVED_VEC]], ptr [[TMP7]], align 81110; VF2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 21111; VF2-NEXT:    [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1001112; VF2-NEXT:    br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP18:![0-9]+]]1113; VF2:       [[MIDDLE_BLOCK]]:1114; VF2-NEXT:    br [[EXIT:label %.*]]1115; VF2:       [[SCALAR_PH:.*:]]1116;1117; VF4-LABEL: define void @test_2xi64_sub_of_wide_loads_with_different_base_ptrs(1118; VF4-SAME: ptr noalias [[DATA:%.*]], ptr noalias [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) {1119; VF4-NEXT:  [[ENTRY:.*:]]1120; VF4-NEXT:    br label %[[VECTOR_PH:.*]]1121; VF4:       [[VECTOR_PH]]:1122; VF4-NEXT:    br label %[[VECTOR_BODY:.*]]1123; VF4:       [[VECTOR_BODY]]:1124; VF4-NEXT:    [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1125; VF4-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[A]], i64 [[TMP0]]1126; VF4-NEXT:    [[WIDE_LOAD:%.*]] = load <4 x i64>, ptr [[TMP1]], align 81127; VF4-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i64, ptr [[B]], i64 [[TMP0]]1128; VF4-NEXT:    [[WIDE_LOAD1:%.*]] = load <4 x i64>, ptr [[TMP3]], align 81129; VF4-NEXT:    [[TMP5:%.*]] = sub <4 x i64> [[WIDE_LOAD]], [[WIDE_LOAD1]]1130; VF4-NEXT:    [[TMP6:%.*]] = shl nsw i64 [[TMP0]], 11131; VF4-NEXT:    [[TMP7:%.*]] = getelementptr inbounds i64, ptr [[DATA]], i64 [[TMP6]]1132; VF4-NEXT:    [[TMP8:%.*]] = getelementptr inbounds i64, ptr [[C]], i64 [[TMP0]]1133; VF4-NEXT:    [[WIDE_LOAD2:%.*]] = load <4 x i64>, ptr [[TMP8]], align 81134; VF4-NEXT:    [[TMP10:%.*]] = sub <4 x i64> [[WIDE_LOAD]], [[WIDE_LOAD2]]1135; VF4-NEXT:    [[TMP11:%.*]] = shufflevector <4 x i64> [[TMP5]], <4 x i64> [[TMP10]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1136; VF4-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <8 x i64> [[TMP11]], <8 x i64> poison, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>1137; VF4-NEXT:    store <8 x i64> [[INTERLEAVED_VEC]], ptr [[TMP7]], align 81138; VF4-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 41139; VF4-NEXT:    [[TMP12:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1001140; VF4-NEXT:    br i1 [[TMP12]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP18:![0-9]+]]1141; VF4:       [[MIDDLE_BLOCK]]:1142; VF4-NEXT:    br [[EXIT:label %.*]]1143; VF4:       [[SCALAR_PH:.*:]]1144;1145entry:1146  br label %loop1147 1148loop:1149  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]1150  %gep.A = getelementptr inbounds i64, ptr %A, i64 %iv1151  %l.A = load i64, ptr %gep.A, align 81152  %gep.B = getelementptr inbounds i64, ptr %B, i64 %iv1153  %l.B = load i64, ptr %gep.B, align 81154  %sub.0 = sub i64 %l.A, %l.B1155  %1 = shl nsw i64 %iv, 11156  %data.0 = getelementptr inbounds i64, ptr %data, i64 %11157  store i64 %sub.0, ptr %data.0, align 81158  %gep.C = getelementptr inbounds i64, ptr %C, i64 %iv1159  %l.C = load i64, ptr %gep.C, align 81160  %sub.1 = sub i64 %l.A, %l.C1161  %3 = or disjoint i64 %1, 11162  %data.1 = getelementptr inbounds i64, ptr %data, i64 %31163  store i64 %sub.1, ptr %data.1, align 81164  %iv.next = add nuw nsw i64 %iv, 11165  %ec = icmp eq i64 %iv.next, 1001166  br i1 %ec, label %exit, label %loop1167 1168exit:1169  ret void1170}1171 1172; Make sure multiple uses of a narrowed op are handled correctly,1173; https://github.com/llvm/llvm-project/issues/156190.1174define void @multiple_store_groups_storing_same_wide_bin_op(ptr noalias %A, ptr noalias %B, ptr noalias %C) {1175; VF2-LABEL: define void @multiple_store_groups_storing_same_wide_bin_op(1176; VF2-SAME: ptr noalias [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) {1177; VF2-NEXT:  [[ENTRY:.*:]]1178; VF2-NEXT:    br label %[[VECTOR_PH:.*]]1179; VF2:       [[VECTOR_PH]]:1180; VF2-NEXT:    br label %[[VECTOR_BODY:.*]]1181; VF2:       [[VECTOR_BODY]]:1182; VF2-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1183; VF2-NEXT:    [[TMP0:%.*]] = getelementptr { double, double }, ptr [[A]], i64 [[INDEX]]1184; VF2-NEXT:    [[BROADCAST_SPLAT:%.*]] = load <2 x double>, ptr [[TMP0]], align 81185; VF2-NEXT:    [[TMP2:%.*]] = fadd contract <2 x double> [[BROADCAST_SPLAT]], splat (double 2.000000e+01)1186; VF2-NEXT:    [[TMP3:%.*]] = getelementptr { double, double }, ptr [[B]], i64 [[INDEX]]1187; VF2-NEXT:    store <2 x double> [[TMP2]], ptr [[TMP3]], align 81188; VF2-NEXT:    [[TMP4:%.*]] = getelementptr { double, double }, ptr [[C]], i64 [[INDEX]]1189; VF2-NEXT:    store <2 x double> [[TMP2]], ptr [[TMP4]], align 81190; VF2-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 11191; VF2-NEXT:    [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], 10001192; VF2-NEXT:    br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]]1193; VF2:       [[MIDDLE_BLOCK]]:1194; VF2-NEXT:    br [[EXIT:label %.*]]1195; VF2:       [[SCALAR_PH:.*:]]1196;1197; VF4-LABEL: define void @multiple_store_groups_storing_same_wide_bin_op(1198; VF4-SAME: ptr noalias [[A:%.*]], ptr noalias [[B:%.*]], ptr noalias [[C:%.*]]) {1199; VF4-NEXT:  [[ENTRY:.*:]]1200; VF4-NEXT:    br label %[[VECTOR_PH:.*]]1201; VF4:       [[VECTOR_PH]]:1202; VF4-NEXT:    br label %[[VECTOR_BODY:.*]]1203; VF4:       [[VECTOR_BODY]]:1204; VF4-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]1205; VF4-NEXT:    [[TMP0:%.*]] = getelementptr { double, double }, ptr [[A]], i64 [[INDEX]]1206; VF4-NEXT:    [[WIDE_VEC:%.*]] = load <8 x double>, ptr [[TMP0]], align 81207; VF4-NEXT:    [[STRIDED_VEC:%.*]] = shufflevector <8 x double> [[WIDE_VEC]], <8 x double> poison, <4 x i32> <i32 0, i32 2, i32 4, i32 6>1208; VF4-NEXT:    [[STRIDED_VEC1:%.*]] = shufflevector <8 x double> [[WIDE_VEC]], <8 x double> poison, <4 x i32> <i32 1, i32 3, i32 5, i32 7>1209; VF4-NEXT:    [[TMP1:%.*]] = fadd contract <4 x double> [[STRIDED_VEC]], splat (double 2.000000e+01)1210; VF4-NEXT:    [[TMP2:%.*]] = fadd contract <4 x double> [[STRIDED_VEC1]], splat (double 2.000000e+01)1211; VF4-NEXT:    [[TMP3:%.*]] = getelementptr { double, double }, ptr [[B]], i64 [[INDEX]]1212; VF4-NEXT:    [[TMP4:%.*]] = shufflevector <4 x double> [[TMP1]], <4 x double> [[TMP2]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>1213; VF4-NEXT:    [[INTERLEAVED_VEC:%.*]] = shufflevector <8 x double> [[TMP4]], <8 x double> poison, <8 x i32> <i32 0, i32 4, i32 1, i32 5, i32 2, i32 6, i32 3, i32 7>1214; VF4-NEXT:    store <8 x double> [[INTERLEAVED_VEC]], ptr [[TMP3]], align 81215; VF4-NEXT:    [[TMP5:%.*]] = getelementptr { double, double }, ptr [[C]], i64 [[INDEX]]1216; VF4-NEXT:    store <8 x double> [[INTERLEAVED_VEC]], ptr [[TMP5]], align 81217; VF4-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 41218; VF4-NEXT:    [[TMP6:%.*]] = icmp eq i64 [[INDEX_NEXT]], 10001219; VF4-NEXT:    br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], !llvm.loop [[LOOP19:![0-9]+]]1220; VF4:       [[MIDDLE_BLOCK]]:1221; VF4-NEXT:    br [[EXIT:label %.*]]1222; VF4:       [[SCALAR_PH:.*:]]1223;1224entry:1225  br label %loop1226 1227loop:1228  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]1229  %gep.A = getelementptr { double, double }, ptr %A, i64 %iv1230  %l.A.0 = load double, ptr %gep.A, align 81231  %gep.A.1 = getelementptr inbounds nuw i8, ptr %gep.A, i64 81232  %l.A.1 = load double, ptr %gep.A.1, align 81233  %add.0 = fadd contract double %l.A.0, 20.01234  %add.1 = fadd contract double %l.A.1, 20.01235  %gep.B = getelementptr { double, double }, ptr %B, i64 %iv1236  store double %add.0, ptr %gep.B, align 81237  %gep.B.1 = getelementptr inbounds nuw i8, ptr %gep.B, i64 81238  store double %add.1, ptr %gep.B.1, align 81239  %gep.C = getelementptr { double, double }, ptr %C, i64 %iv1240  %gep.C.1 = getelementptr inbounds nuw i8, ptr %gep.C, i64 81241  store double %add.0, ptr %gep.C, align 81242  store double %add.1, ptr %gep.C.1, align 81243  %iv.next = add nuw nsw i64 %iv, 11244  %.not = icmp eq i64 %iv.next, 10001245  br i1 %.not, label %exit, label %loop1246 1247exit:1248  ret void1249}1250