diff --git a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/old-pass-regressions-inseltpoison.ll b/llvm/test/Transforms/InferAddressSpaces/AMDGPU/old-pass-regressions-inseltpoison.ll deleted file mode 100644 index 5a2244b9796e8..0000000000000 --- a/llvm/test/Transforms/InferAddressSpaces/AMDGPU/old-pass-regressions-inseltpoison.ll +++ /dev/null @@ -1,138 +0,0 @@ -; RUN: opt -data-layout=A5 -S -mtriple=amdgcn-amd-amdhsa -passes=infer-address-spaces %s | FileCheck %s - -; Regression tests from old HSAIL addrspacecast optimization pass - -@data = internal addrspace(1) global [100 x double] [double 0.00, double 1.000000e-01, double 2.000000e-01, double 3.000000e-01, double 4.000000e-01, double 5.000000e-01, double 6.000000e-01, double 7.000000e-01, double 8.000000e-01, double 9.000000e-01, double 1.00, double 1.10, double 1.20, double 1.30, double 1.40, double 1.50, double 1.60, double 1.70, double 1.80, double 1.90, double 2.00, double 2.10, double 2.20, double 2.30, double 2.40, double 2.50, double 2.60, double 2.70, double 2.80, double 2.90, double 3.00, double 3.10, double 3.20, double 3.30, double 3.40, double 3.50, double 3.60, double 3.70, double 3.80, double 3.90, double 4.00, double 4.10, double 4.20, double 4.30, double 4.40, double 4.50, double 4.60, double 4.70, double 4.80, double 4.90, double 5.00, double 5.10, double 5.20, double 5.30, double 5.40, double 5.50, double 5.60, double 5.70, double 5.80, double 5.90, double 6.00, double 6.10, double 6.20, double 6.30, double 6.40, double 6.50, double 6.60, double 6.70, double 6.80, double 6.90, double 7.00, double 7.10, double 7.20, double 7.30, double 7.40, double 7.50, double 7.60, double 7.70, double 7.80, double 7.90, double 8.00, double 8.10, double 8.20, double 8.30, double 8.40, double 8.50, double 8.60, double 8.70, double 8.80, double 8.90, double 9.00, double 9.10, double 9.20, double 9.30, double 9.40, double 9.50, double 9.60, double 9.70, double 9.80, double 9.90], align 8 - - -; Should generate flat load - -; CHECK-LABEL: @generic_address_bitcast_const( -; CHECK: %vecload1 = load <2 x double>, ptr addrspace(1) getelementptr ([100 x double], ptr addrspace(1) @data, i64 0, i64 4), align 8 -define amdgpu_kernel void @generic_address_bitcast_const(i64 %arg0, ptr addrspace(1) nocapture %results) #0 { -entry: - %tmp1 = call i32 @llvm.amdgcn.workitem.id.x() - %tmp2 = zext i32 %tmp1 to i64 - %tmp3 = add i64 %tmp2, %arg0 - %vecload1 = load <2 x double>, ptr bitcast (ptr getelementptr ([100 x double], ptr addrspacecast (ptr addrspace(1) @data to ptr), i64 0, i64 4) to ptr), align 8 - %cmp = fcmp ord <2 x double> %vecload1, zeroinitializer - %sext = sext <2 x i1> %cmp to <2 x i64> - %tmp4 = extractelement <2 x i64> %sext, i64 0 - %tmp5 = extractelement <2 x i64> %sext, i64 1 - %tmp6 = and i64 %tmp4, %tmp5 - %tmp7 = lshr i64 %tmp6, 63 - %tmp8 = trunc i64 %tmp7 to i32 - %idxprom = and i64 %tmp3, 4294967295 - %arrayidx = getelementptr inbounds i32, ptr addrspace(1) %results, i64 %idxprom - store i32 %tmp8, ptr addrspace(1) %arrayidx, align 4 - ret void -} - -@generic_address_bug9749.val = internal addrspace(1) global float 0.0, align 4 - -declare i32 @_Z9get_fencePv(ptr) -%opencl.pipe_t = type opaque - -; This is a compile time assert bug, but we still want to check optimization -; is performed to generate ld_global. -; CHECK-LABEL: @generic_address_pipe_bug9673( -; CHECK: %add.ptr = getelementptr inbounds i32, ptr addrspace(3) %in_pipe, i32 2 -; CHECK: %tmp2 = load i32, ptr addrspace(3) %add.ptr, align 4 -define amdgpu_kernel void @generic_address_pipe_bug9673(ptr addrspace(3) nocapture %in_pipe, ptr addrspace(1) nocapture %dst) #0 { -entry: - %tmp = call i32 @llvm.amdgcn.workitem.id.x() - %add.ptr = getelementptr inbounds i32, ptr addrspace(3) %in_pipe, i32 2 - %tmp2 = load i32, ptr addrspace(3) %add.ptr, align 4 - %arrayidx = getelementptr inbounds i32, ptr addrspace(1) %dst, i32 %tmp - store i32 %tmp2, ptr addrspace(1) %arrayidx, align 4 - ret void -} - -; Should generate flat load -; CHECK-LABEL: @generic_address_bug9749( -; CHECK: br i1 -; CHECK: load float, ptr -; CHECK: br label -define amdgpu_kernel void @generic_address_bug9749(ptr addrspace(1) nocapture %results) #0 { -entry: - %ptr = alloca ptr, align 8, addrspace(5) - %tmp = call i32 @llvm.amdgcn.workitem.id.x() - %tmp1 = zext i32 %tmp to i64 - store float 0x3FB99999A0000000, ptr addrspace(1) @generic_address_bug9749.val, align 4 - store volatile ptr addrspacecast (ptr addrspace(1) @generic_address_bug9749.val to ptr), ptr addrspace(5) %ptr, align 8 - %tmp2 = load volatile ptr, ptr addrspace(5) %ptr, align 8 - %tmp3 = load float, ptr addrspace(1) @generic_address_bug9749.val, align 4 - %call.i = call i32 @_Z9get_fencePv(ptr %tmp2) #1 - %switch.i.i = icmp ult i32 %call.i, 4 - br i1 %switch.i.i, label %if.end.i, label %helperFunction.exit - -if.end.i: ; preds = %entry - %tmp5 = load float, ptr %tmp2, align 4 - %not.cmp.i = fcmp oeq float %tmp5, %tmp3 - %phitmp = zext i1 %not.cmp.i to i32 - br label %helperFunction.exit - -helperFunction.exit: ; preds = %if.end.i, %entry - %retval.0.i = phi i32 [ 0, %entry ], [ %phitmp, %if.end.i ] - %arrayidx = getelementptr inbounds i32, ptr addrspace(1) %results, i64 %tmp1 - store i32 %retval.0.i, ptr addrspace(1) %arrayidx, align 4 - ret void -} - -; CHECK-LABEL: @generic_address_opt_phi_bug9776_simple_phi_kernel( -; CHECK: phi ptr addrspace(3) -; CHECK: store i32 %i.03, ptr addrspace(3) % -define amdgpu_kernel void @generic_address_opt_phi_bug9776_simple_phi_kernel(ptr addrspace(3) nocapture %in, i32 %numElems) #0 { -entry: - %cmp1 = icmp eq i32 %numElems, 0 - br i1 %cmp1, label %for.end, label %for.body.lr.ph - -for.body.lr.ph: ; preds = %entry - %tmp = addrspacecast ptr addrspace(3) %in to ptr - br label %for.body - -for.body: ; preds = %for.body, %for.body.lr.ph - %i.03 = phi i32 [ 0, %for.body.lr.ph ], [ %inc, %for.body ] - %ptr.02 = phi ptr [ %tmp, %for.body.lr.ph ], [ %add.ptr, %for.body ] - store i32 %i.03, ptr %ptr.02, align 4 - %add.ptr = getelementptr inbounds i32, ptr %ptr.02, i64 4 - %inc = add nuw i32 %i.03, 1 - %exitcond = icmp eq i32 %inc, %numElems - br i1 %exitcond, label %for.end, label %for.body - -for.end: ; preds = %for.body, %entry - ret void -} - -; CHECK-LABEL: @generic_address_bug9899( -; CHECK: %vecload = load <2 x i32>, ptr addrspace(3) -; CHECK: store <2 x i32> %tmp16, ptr addrspace(3) -define amdgpu_kernel void @generic_address_bug9899(i64 %arg0, ptr addrspace(3) nocapture %sourceA, ptr addrspace(3) nocapture %destValues) #0 { -entry: - %tmp1 = call i32 @llvm.amdgcn.workitem.id.x() - %tmp2 = zext i32 %tmp1 to i64 - %tmp3 = add i64 %tmp2, %arg0 - %sext = shl i64 %tmp3, 32 - %tmp4 = addrspacecast ptr addrspace(3) %destValues to ptr - %tmp5 = addrspacecast ptr addrspace(3) %sourceA to ptr - %tmp6 = ashr exact i64 %sext, 31 - %tmp7 = getelementptr inbounds i32, ptr %tmp5, i64 %tmp6 - %vecload = load <2 x i32>, ptr %tmp7, align 4 - %tmp8 = extractelement <2 x i32> %vecload, i32 0 - %tmp9 = extractelement <2 x i32> %vecload, i32 1 - %tmp10 = icmp eq i32 %tmp8, 0 - %tmp11 = select i1 %tmp10, i32 32, i32 %tmp8 - %tmp12 = icmp eq i32 %tmp9, 0 - %tmp13 = select i1 %tmp12, i32 32, i32 %tmp9 - %tmp14 = getelementptr inbounds i32, ptr %tmp4, i64 %tmp6 - %tmp15 = insertelement <2 x i32> poison, i32 %tmp11, i32 0 - %tmp16 = insertelement <2 x i32> %tmp15, i32 %tmp13, i32 1 - store <2 x i32> %tmp16, ptr %tmp14, align 4 - ret void -} - -declare i32 @llvm.amdgcn.workitem.id.x() #2 - -attributes #0 = { nounwind } -attributes #1 = { nounwind readonly } -attributes #2 = { nounwind readnone } diff --git a/llvm/test/Transforms/InterleavedAccess/AArch64/interleaved-accesses-inseltpoison.ll b/llvm/test/Transforms/InterleavedAccess/AArch64/interleaved-accesses-inseltpoison.ll deleted file mode 100644 index 14986d9eb85c5..0000000000000 --- a/llvm/test/Transforms/InterleavedAccess/AArch64/interleaved-accesses-inseltpoison.ll +++ /dev/null @@ -1,755 +0,0 @@ -; RUN: opt < %s -interleaved-access -S | FileCheck %s -check-prefix=NEON -; RUN: opt < %s -mattr=-neon -interleaved-access -S | FileCheck %s -check-prefix=NO_NEON -; RUN: opt < %s -passes=interleaved-access -S | FileCheck %s -check-prefix=NEON -; RUN: opt < %s -mattr=-neon -passes=interleaved-access -S | FileCheck %s -check-prefix=NO_NEON - -target datalayout = "e-m:e-i64:64-i128:128-n32:64-S128" -target triple = "aarch64--linux-gnu" - -define void @load_factor2(ptr %ptr) { -; NEON-LABEL: @load_factor2( -; NEON-NEXT: [[LDN:%.*]] = call { <8 x i8>, <8 x i8> } @llvm.aarch64.neon.ld2.v8i8.p0(ptr %ptr) -; NEON-NEXT: [[TMP2:%.*]] = extractvalue { <8 x i8>, <8 x i8> } [[LDN]], 1 -; NEON-NEXT: [[TMP3:%.*]] = extractvalue { <8 x i8>, <8 x i8> } [[LDN]], 0 -; NEON-NEXT: ret void -; NO_NEON-LABEL: @load_factor2( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = load <16 x i8>, ptr %ptr, align 4 - %v0 = shufflevector <16 x i8> %interleaved.vec, <16 x i8> poison, <8 x i32> - %v1 = shufflevector <16 x i8> %interleaved.vec, <16 x i8> poison, <8 x i32> - ret void -} - -define void @load_factor3(ptr %ptr) { -; NEON-LABEL: @load_factor3( -; NEON-NEXT: [[LDN:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3.v4i32.p0(ptr %ptr) -; NEON-NEXT: [[TMP2:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 2 -; NEON-NEXT: [[TMP3:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 1 -; NEON-NEXT: [[TMP4:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 0 -; NEON-NEXT: ret void -; NO_NEON-LABEL: @load_factor3( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = load <12 x i32>, ptr %ptr, align 4 - %v0 = shufflevector <12 x i32> %interleaved.vec, <12 x i32> poison, <4 x i32> - %v1 = shufflevector <12 x i32> %interleaved.vec, <12 x i32> poison, <4 x i32> - %v2 = shufflevector <12 x i32> %interleaved.vec, <12 x i32> poison, <4 x i32> - ret void -} - -define void @load_factor4(ptr %ptr) { -; NEON-LABEL: @load_factor4( -; NEON-NEXT: [[LDN:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4.v4i32.p0(ptr %ptr) -; NEON-NEXT: [[TMP2:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 3 -; NEON-NEXT: [[TMP3:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 2 -; NEON-NEXT: [[TMP4:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 1 -; NEON-NEXT: [[TMP5:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 0 -; NEON-NEXT: ret void -; NO_NEON-LABEL: @load_factor4( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = load <16 x i32>, ptr %ptr, align 4 - %v0 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <4 x i32> - %v1 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <4 x i32> - %v2 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <4 x i32> - %v3 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <4 x i32> - ret void -} - -define void @store_factor2(ptr %ptr, <8 x i8> %v0, <8 x i8> %v1) { -; NEON-LABEL: @store_factor2( -; NEON-NEXT: [[TMP1:%.*]] = shufflevector <8 x i8> %v0, <8 x i8> %v1, <8 x i32> -; NEON-NEXT: [[TMP2:%.*]] = shufflevector <8 x i8> %v0, <8 x i8> %v1, <8 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st2.v8i8.p0(<8 x i8> [[TMP1]], <8 x i8> [[TMP2]], ptr %ptr) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_factor2( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = shufflevector <8 x i8> %v0, <8 x i8> %v1, <16 x i32> - store <16 x i8> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @store_factor3(ptr %ptr, <4 x i32> %v0, <4 x i32> %v1, <4 x i32> %v2) { -; NEON-LABEL: @store_factor3( -; NEON: [[TMP1:%.*]] = shufflevector <8 x i32> %s0, <8 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> %s0, <8 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> %s0, <8 x i32> %s1, <4 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st3.v4i32.p0(<4 x i32> [[TMP1]], <4 x i32> [[TMP2]], <4 x i32> [[TMP3]], ptr %ptr) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_factor3( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %s0 = shufflevector <4 x i32> %v0, <4 x i32> %v1, <8 x i32> - %s1 = shufflevector <4 x i32> %v2, <4 x i32> poison, <8 x i32> - %interleaved.vec = shufflevector <8 x i32> %s0, <8 x i32> %s1, <12 x i32> - store <12 x i32> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @store_factor4(ptr %ptr, <4 x i32> %v0, <4 x i32> %v1, <4 x i32> %v2, <4 x i32> %v3) { -; NEON-LABEL: @store_factor4( -; NEON: [[TMP1:%.*]] = shufflevector <8 x i32> %s0, <8 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> %s0, <8 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> %s0, <8 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP4:%.*]] = shufflevector <8 x i32> %s0, <8 x i32> %s1, <4 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st4.v4i32.p0(<4 x i32> [[TMP1]], <4 x i32> [[TMP2]], <4 x i32> [[TMP3]], <4 x i32> [[TMP4]], ptr %ptr) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_factor4( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %s0 = shufflevector <4 x i32> %v0, <4 x i32> %v1, <8 x i32> - %s1 = shufflevector <4 x i32> %v2, <4 x i32> %v3, <8 x i32> - %interleaved.vec = shufflevector <8 x i32> %s0, <8 x i32> %s1, <16 x i32> - store <16 x i32> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @load_ptrvec_factor2(ptr %ptr) { -; NEON-LABEL: @load_ptrvec_factor2( -; NEON-NEXT: [[LDN:%.*]] = call { <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld2.v2i64.p0(ptr %ptr) -; NEON-NEXT: [[TMP2:%.*]] = extractvalue { <2 x i64>, <2 x i64> } [[LDN]], 1 -; NEON-NEXT: [[TMP3:%.*]] = inttoptr <2 x i64> [[TMP2]] to <2 x ptr> -; NEON-NEXT: [[TMP4:%.*]] = extractvalue { <2 x i64>, <2 x i64> } [[LDN]], 0 -; NEON-NEXT: [[TMP5:%.*]] = inttoptr <2 x i64> [[TMP4]] to <2 x ptr> -; NEON-NEXT: ret void -; NO_NEON-LABEL: @load_ptrvec_factor2( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = load <4 x ptr>, ptr %ptr, align 4 - %v0 = shufflevector <4 x ptr> %interleaved.vec, <4 x ptr> poison, <2 x i32> - %v1 = shufflevector <4 x ptr> %interleaved.vec, <4 x ptr> poison, <2 x i32> - ret void -} - -define void @load_ptrvec_factor3(ptr %ptr) { -; NEON-LABEL: @load_ptrvec_factor3( -; NEON-NEXT: [[LDN:%.*]] = call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3.v2i64.p0(ptr %ptr) -; NEON-NEXT: [[TMP2:%.*]] = extractvalue { <2 x i64>, <2 x i64>, <2 x i64> } [[LDN]], 2 -; NEON-NEXT: [[TMP3:%.*]] = inttoptr <2 x i64> [[TMP2]] to <2 x ptr> -; NEON-NEXT: [[TMP4:%.*]] = extractvalue { <2 x i64>, <2 x i64>, <2 x i64> } [[LDN]], 1 -; NEON-NEXT: [[TMP5:%.*]] = inttoptr <2 x i64> [[TMP4]] to <2 x ptr> -; NEON-NEXT: [[TMP6:%.*]] = extractvalue { <2 x i64>, <2 x i64>, <2 x i64> } [[LDN]], 0 -; NEON-NEXT: [[TMP7:%.*]] = inttoptr <2 x i64> [[TMP6]] to <2 x ptr> -; NEON-NEXT: ret void -; NO_NEON-LABEL: @load_ptrvec_factor3( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = load <6 x ptr>, ptr %ptr, align 4 - %v0 = shufflevector <6 x ptr> %interleaved.vec, <6 x ptr> poison, <2 x i32> - %v1 = shufflevector <6 x ptr> %interleaved.vec, <6 x ptr> poison, <2 x i32> - %v2 = shufflevector <6 x ptr> %interleaved.vec, <6 x ptr> poison, <2 x i32> - ret void -} - -define void @load_ptrvec_factor4(ptr %ptr) { -; NEON-LABEL: @load_ptrvec_factor4( -; NEON-NEXT: [[LDN:%.*]] = call { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld4.v2i64.p0(ptr %ptr) -; NEON-NEXT: [[TMP2:%.*]] = extractvalue { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[LDN]], 3 -; NEON-NEXT: [[TMP3:%.*]] = inttoptr <2 x i64> [[TMP2]] to <2 x ptr> -; NEON-NEXT: [[TMP4:%.*]] = extractvalue { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[LDN]], 2 -; NEON-NEXT: [[TMP5:%.*]] = inttoptr <2 x i64> [[TMP4]] to <2 x ptr> -; NEON-NEXT: [[TMP6:%.*]] = extractvalue { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[LDN]], 1 -; NEON-NEXT: [[TMP7:%.*]] = inttoptr <2 x i64> [[TMP6]] to <2 x ptr> -; NEON-NEXT: [[TMP8:%.*]] = extractvalue { <2 x i64>, <2 x i64>, <2 x i64>, <2 x i64> } [[LDN]], 0 -; NEON-NEXT: [[TMP9:%.*]] = inttoptr <2 x i64> [[TMP8]] to <2 x ptr> -; NEON-NEXT: ret void -; NO_NEON-LABEL: @load_ptrvec_factor4( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = load <8 x ptr>, ptr %ptr, align 4 - %v0 = shufflevector <8 x ptr> %interleaved.vec, <8 x ptr> poison, <2 x i32> - %v1 = shufflevector <8 x ptr> %interleaved.vec, <8 x ptr> poison, <2 x i32> - %v2 = shufflevector <8 x ptr> %interleaved.vec, <8 x ptr> poison, <2 x i32> - %v3 = shufflevector <8 x ptr> %interleaved.vec, <8 x ptr> poison, <2 x i32> - ret void -} - -define void @store_ptrvec_factor2(ptr %ptr, <2 x ptr> %v0, <2 x ptr> %v1) { -; NEON-LABEL: @store_ptrvec_factor2( -; NEON-NEXT: [[TMP1:%.*]] = ptrtoint <2 x ptr> %v0 to <2 x i64> -; NEON-NEXT: [[TMP2:%.*]] = ptrtoint <2 x ptr> %v1 to <2 x i64> -; NEON-NEXT: [[TMP3:%.*]] = shufflevector <2 x i64> [[TMP1]], <2 x i64> [[TMP2]], <2 x i32> -; NEON-NEXT: [[TMP4:%.*]] = shufflevector <2 x i64> [[TMP1]], <2 x i64> [[TMP2]], <2 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st2.v2i64.p0(<2 x i64> [[TMP3]], <2 x i64> [[TMP4]], ptr %ptr) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_ptrvec_factor2( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = shufflevector <2 x ptr> %v0, <2 x ptr> %v1, <4 x i32> - store <4 x ptr> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @store_ptrvec_factor3(ptr %ptr, <2 x ptr> %v0, <2 x ptr> %v1, <2 x ptr> %v2) { -; NEON-LABEL: @store_ptrvec_factor3( -; NEON: [[TMP1:%.*]] = ptrtoint <4 x ptr> %s0 to <4 x i64> -; NEON-NEXT: [[TMP2:%.*]] = ptrtoint <4 x ptr> %s1 to <4 x i64> -; NEON-NEXT: [[TMP3:%.*]] = shufflevector <4 x i64> [[TMP1]], <4 x i64> [[TMP2]], <2 x i32> -; NEON-NEXT: [[TMP4:%.*]] = shufflevector <4 x i64> [[TMP1]], <4 x i64> [[TMP2]], <2 x i32> -; NEON-NEXT: [[TMP5:%.*]] = shufflevector <4 x i64> [[TMP1]], <4 x i64> [[TMP2]], <2 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st3.v2i64.p0(<2 x i64> [[TMP3]], <2 x i64> [[TMP4]], <2 x i64> [[TMP5]], ptr %ptr) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_ptrvec_factor3( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %s0 = shufflevector <2 x ptr> %v0, <2 x ptr> %v1, <4 x i32> - %s1 = shufflevector <2 x ptr> %v2, <2 x ptr> poison, <4 x i32> - %interleaved.vec = shufflevector <4 x ptr> %s0, <4 x ptr> %s1, <6 x i32> - store <6 x ptr> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @store_ptrvec_factor4(ptr %ptr, <2 x ptr> %v0, <2 x ptr> %v1, <2 x ptr> %v2, <2 x ptr> %v3) { -; NEON-LABEL: @store_ptrvec_factor4( -; NEON: [[TMP1:%.*]] = ptrtoint <4 x ptr> %s0 to <4 x i64> -; NEON-NEXT: [[TMP2:%.*]] = ptrtoint <4 x ptr> %s1 to <4 x i64> -; NEON-NEXT: [[TMP3:%.*]] = shufflevector <4 x i64> [[TMP1]], <4 x i64> [[TMP2]], <2 x i32> -; NEON-NEXT: [[TMP4:%.*]] = shufflevector <4 x i64> [[TMP1]], <4 x i64> [[TMP2]], <2 x i32> -; NEON-NEXT: [[TMP5:%.*]] = shufflevector <4 x i64> [[TMP1]], <4 x i64> [[TMP2]], <2 x i32> -; NEON-NEXT: [[TMP6:%.*]] = shufflevector <4 x i64> [[TMP1]], <4 x i64> [[TMP2]], <2 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st4.v2i64.p0(<2 x i64> [[TMP3]], <2 x i64> [[TMP4]], <2 x i64> [[TMP5]], <2 x i64> [[TMP6]], ptr %ptr) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_ptrvec_factor4( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %s0 = shufflevector <2 x ptr> %v0, <2 x ptr> %v1, <4 x i32> - %s1 = shufflevector <2 x ptr> %v2, <2 x ptr> %v3, <4 x i32> - %interleaved.vec = shufflevector <4 x ptr> %s0, <4 x ptr> %s1, <8 x i32> - store <8 x ptr> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @load_undef_mask_factor2(ptr %ptr) { -; NEON-LABEL: @load_undef_mask_factor2( -; NEON-NEXT: [[LDN:%.*]] = call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2.v4i32.p0(ptr %ptr) -; NEON-NEXT: [[TMP2:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[LDN]], 1 -; NEON-NEXT: [[TMP3:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[LDN]], 0 -; NEON-NEXT: ret void -; NO_NEON-LABEL: @load_undef_mask_factor2( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = load <8 x i32>, ptr %ptr, align 4 - %v0 = shufflevector <8 x i32> %interleaved.vec, <8 x i32> poison, <4 x i32> - %v1 = shufflevector <8 x i32> %interleaved.vec, <8 x i32> poison, <4 x i32> - ret void -} - -define void @load_undef_mask_factor3(ptr %ptr) { -; NEON-LABEL: @load_undef_mask_factor3( -; NEON-NEXT: [[LDN:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3.v4i32.p0(ptr %ptr) -; NEON-NEXT: [[TMP2:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 2 -; NEON-NEXT: [[TMP3:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 1 -; NEON-NEXT: [[TMP4:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 0 -; NEON-NEXT: ret void -; NO_NEON-LABEL: @load_undef_mask_factor3( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = load <12 x i32>, ptr %ptr, align 4 - %v0 = shufflevector <12 x i32> %interleaved.vec, <12 x i32> poison, <4 x i32> - %v1 = shufflevector <12 x i32> %interleaved.vec, <12 x i32> poison, <4 x i32> - %v2 = shufflevector <12 x i32> %interleaved.vec, <12 x i32> poison, <4 x i32> - ret void -} - -define void @load_undef_mask_factor4(ptr %ptr) { -; NEON-LABEL: @load_undef_mask_factor4( -; NEON-NEXT: [[LDN:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4.v4i32.p0(ptr %ptr) -; NEON-NEXT: [[TMP2:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 3 -; NEON-NEXT: [[TMP3:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 2 -; NEON-NEXT: [[TMP4:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 1 -; NEON-NEXT: [[TMP5:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 0 -; NEON-NEXT: ret void -; NO_NEON-LABEL: @load_undef_mask_factor4( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = load <16 x i32>, ptr %ptr, align 4 - %v0 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <4 x i32> - %v1 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <4 x i32> - %v2 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <4 x i32> - %v3 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <4 x i32> - ret void -} - -define void @store_undef_mask_factor2(ptr %ptr, <4 x i32> %v0, <4 x i32> %v1) { -; NEON-LABEL: @store_undef_mask_factor2( -; NEON-NEXT: [[TMP1:%.*]] = shufflevector <4 x i32> %v0, <4 x i32> %v1, <4 x i32> -; NEON-NEXT: [[TMP2:%.*]] = shufflevector <4 x i32> %v0, <4 x i32> %v1, <4 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st2.v4i32.p0(<4 x i32> [[TMP1]], <4 x i32> [[TMP2]], ptr %ptr) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_undef_mask_factor2( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = shufflevector <4 x i32> %v0, <4 x i32> %v1, <8 x i32> - store <8 x i32> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @store_undef_mask_factor3(ptr %ptr, <4 x i32> %v0, <4 x i32> %v1, <4 x i32> %v2) { -; NEON-LABEL: @store_undef_mask_factor3( -; NEON: [[TMP1:%.*]] = shufflevector <8 x i32> %s0, <8 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> %s0, <8 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> %s0, <8 x i32> %s1, <4 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st3.v4i32.p0(<4 x i32> [[TMP1]], <4 x i32> [[TMP2]], <4 x i32> [[TMP3]], ptr %ptr) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_undef_mask_factor3( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %s0 = shufflevector <4 x i32> %v0, <4 x i32> %v1, <8 x i32> - %s1 = shufflevector <4 x i32> %v2, <4 x i32> poison, <8 x i32> - %interleaved.vec = shufflevector <8 x i32> %s0, <8 x i32> %s1, <12 x i32> - store <12 x i32> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @store_undef_mask_factor4(ptr %ptr, <4 x i32> %v0, <4 x i32> %v1, <4 x i32> %v2, <4 x i32> %v3) { -; NEON-LABEL: @store_undef_mask_factor4( -; NEON: [[TMP1:%.*]] = shufflevector <8 x i32> %s0, <8 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> %s0, <8 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> %s0, <8 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP4:%.*]] = shufflevector <8 x i32> %s0, <8 x i32> %s1, <4 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st4.v4i32.p0(<4 x i32> [[TMP1]], <4 x i32> [[TMP2]], <4 x i32> [[TMP3]], <4 x i32> [[TMP4]], ptr %ptr) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_undef_mask_factor4( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %s0 = shufflevector <4 x i32> %v0, <4 x i32> %v1, <8 x i32> - %s1 = shufflevector <4 x i32> %v2, <4 x i32> %v3, <8 x i32> - %interleaved.vec = shufflevector <8 x i32> %s0, <8 x i32> %s1, <16 x i32> - store <16 x i32> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @load_illegal_factor2(ptr %ptr) nounwind { -; NEON-LABEL: @load_illegal_factor2( -; NEON-NOT: @llvm.aarch64.neon -; NEON: ret void -; NO_NEON-LABEL: @load_illegal_factor2( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = load <3 x float>, ptr %ptr, align 16 - %v0 = shufflevector <3 x float> %interleaved.vec, <3 x float> poison, <3 x i32> - ret void -} - -define void @store_illegal_factor2(ptr %ptr, <3 x float> %v0) nounwind { -; NEON-LABEL: @store_illegal_factor2( -; NEON-NOT: @llvm.aarch64.neon -; NEON: ret void -; NO_NEON-LABEL: @store_illegal_factor2( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = shufflevector <3 x float> %v0, <3 x float> poison, <3 x i32> - store <3 x float> %interleaved.vec, ptr %ptr, align 16 - ret void -} - -define void @store_general_mask_factor4(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { -; NEON-LABEL: @store_general_mask_factor4( -; NEON-NEXT: [[TMP1:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: [[TMP2:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: [[TMP3:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: [[TMP4:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st4.v2i32.p0(<2 x i32> [[TMP1]], <2 x i32> [[TMP2]], <2 x i32> [[TMP3]], <2 x i32> [[TMP4]], ptr %ptr) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_general_mask_factor4( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <8 x i32> - store <8 x i32> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @store_general_mask_factor4_undefbeg(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { -; NEON-LABEL: @store_general_mask_factor4_undefbeg( -; NEON-NEXT: [[TMP1:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: [[TMP2:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: [[TMP3:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: [[TMP4:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st4.v2i32.p0(<2 x i32> [[TMP1]], <2 x i32> [[TMP2]], <2 x i32> [[TMP3]], <2 x i32> [[TMP4]], ptr %ptr) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_general_mask_factor4_undefbeg( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <8 x i32> - store <8 x i32> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @store_general_mask_factor4_undefend(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { -; NEON-LABEL: @store_general_mask_factor4_undefend( -; NEON-NEXT: [[TMP1:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: [[TMP2:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: [[TMP3:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: [[TMP4:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st4.v2i32.p0(<2 x i32> [[TMP1]], <2 x i32> [[TMP2]], <2 x i32> [[TMP3]], <2 x i32> [[TMP4]], ptr %ptr) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_general_mask_factor4_undefend( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <8 x i32> - store <8 x i32> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @store_general_mask_factor4_undefmid(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { -; NEON-LABEL: @store_general_mask_factor4_undefmid( -; NEON-NEXT: [[TMP1:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: [[TMP2:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: [[TMP3:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: [[TMP4:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st4.v2i32.p0(<2 x i32> [[TMP1]], <2 x i32> [[TMP2]], <2 x i32> [[TMP3]], <2 x i32> [[TMP4]], ptr %ptr) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_general_mask_factor4_undefmid( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <8 x i32> - store <8 x i32> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @store_general_mask_factor4_undefmulti(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { -; NEON-LABEL: @store_general_mask_factor4_undefmulti( -; NEON-NEXT: [[TMP1:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: [[TMP2:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: [[TMP3:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: [[TMP4:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <2 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st4.v2i32.p0(<2 x i32> [[TMP1]], <2 x i32> [[TMP2]], <2 x i32> [[TMP3]], <2 x i32> [[TMP4]], ptr %ptr) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_general_mask_factor4_undefmulti( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <8 x i32> - store <8 x i32> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @store_general_mask_factor3(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { -; NEON-LABEL: @store_general_mask_factor3( -; NEON-NEXT: [[TMP1:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <4 x i32> -; NEON-NEXT: [[TMP2:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <4 x i32> -; NEON-NEXT: [[TMP3:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <4 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st3.v4i32.p0(<4 x i32> [[TMP1]], <4 x i32> [[TMP2]], <4 x i32> [[TMP3]], ptr %ptr) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_general_mask_factor3( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <12 x i32> - store <12 x i32> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @store_general_mask_factor3_undefmultimid(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { -; NEON-LABEL: @store_general_mask_factor3_undefmultimid( -; NEON-NEXT: [[TMP1:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <4 x i32> -; NEON-NEXT: [[TMP2:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <4 x i32> -; NEON-NEXT: [[TMP3:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <4 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st3.v4i32.p0(<4 x i32> [[TMP1]], <4 x i32> [[TMP2]], <4 x i32> [[TMP3]], ptr %ptr) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_general_mask_factor3_undefmultimid( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <12 x i32> - store <12 x i32> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @store_general_mask_factor3_undef_fail(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { -; NEON-LABEL: @store_general_mask_factor3_undef_fail( -; NEON-NOT: @llvm.aarch64.neon -; NEON: ret void -; NO_NEON-LABEL: @store_general_mask_factor3_undef_fail( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <12 x i32> - store <12 x i32> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @store_general_mask_factor3_undeflane(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { -; NEON-LABEL: @store_general_mask_factor3_undeflane( -; NEON-NEXT: [[TMP1:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <4 x i32> -; NEON-NEXT: [[TMP2:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <4 x i32> -; NEON-NEXT: [[TMP3:%.*]] = shufflevector <32 x i32> %v0, <32 x i32> %v1, <4 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st3.v4i32.p0(<4 x i32> [[TMP1]], <4 x i32> [[TMP2]], <4 x i32> [[TMP3]], ptr %ptr) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_general_mask_factor3_undeflane( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <12 x i32> - store <12 x i32> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @store_general_mask_factor3_negativestart(ptr %ptr, <32 x i32> %v0, <32 x i32> %v1) { -; NEON-LABEL: @store_general_mask_factor3_negativestart( -; NEON-NOT: @llvm.aarch64.neon -; NEON: ret void -; NO_NEON-LABEL: @store_general_mask_factor3_negativestart( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = shufflevector <32 x i32> %v0, <32 x i32> %v1, <12 x i32> - store <12 x i32> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -@g = external global <4 x float> - -; The following does not give a valid interleaved store -; NEON-LABEL: define void @no_interleave -; NEON-NOT: call void @llvm.aarch64.neon.st2 -; NEON: shufflevector -; NEON: store -; NEON: ret void -; NO_NEON-LABEL: define void @no_interleave -; NO_NEON: shufflevector -; NO_NEON: store -; NO_NEON: ret void -define void @no_interleave(<4 x float> %a0) { - %v0 = shufflevector <4 x float> %a0, <4 x float> %a0, <4 x i32> - store <4 x float> %v0, ptr @g, align 16 - ret void -} - -define void @load_factor2_wide2(ptr %ptr) { -; NEON-LABEL: @load_factor2_wide2( -; NEON-NEXT: [[LDN:%.*]] = call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2.v4i32.p0(ptr %ptr) -; NEON-NEXT: [[TMP3:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[LDN]], 1 -; NEON-NEXT: [[TMP4:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[LDN]], 0 -; NEON-NEXT: [[TMP5:%.*]] = getelementptr i32, ptr %ptr, i32 8 -; NEON-NEXT: [[LDN1:%.*]] = call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2.v4i32.p0(ptr [[TMP5]]) -; NEON-NEXT: [[TMP7:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[LDN1]], 1 -; NEON-NEXT: [[TMP8:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[LDN1]], 0 -; NEON-NEXT: [[TMP9:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> [[TMP7]], <8 x i32> -; NEON-NEXT: [[TMP10:%.*]] = shufflevector <4 x i32> [[TMP4]], <4 x i32> [[TMP8]], <8 x i32> -; NEON-NEXT: ret void -; NO_NEON-LABEL: @load_factor2_wide2( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = load <16 x i32>, ptr %ptr, align 4 - %v0 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <8 x i32> - %v1 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <8 x i32> - ret void -} - -define void @load_factor2_wide3(ptr %ptr) { -; NEON-LABEL: @load_factor2_wide3( -; NEON-NEXT: [[LDN:%.*]] = call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2.v4i32.p0(ptr [[PTR:%.*]]) -; NEON-NEXT: [[TMP3:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[LDN]], 1 -; NEON-NEXT: [[TMP4:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[LDN]], 0 -; NEON-NEXT: [[TMP5:%.*]] = getelementptr i32, ptr [[PTR]], i32 8 -; NEON-NEXT: [[LDN1:%.*]] = call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2.v4i32.p0(ptr [[TMP5]]) -; NEON-NEXT: [[TMP7:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[LDN1]], 1 -; NEON-NEXT: [[TMP8:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[LDN1]], 0 -; NEON-NEXT: [[TMP9:%.*]] = getelementptr i32, ptr [[TMP5]], i32 8 -; NEON-NEXT: [[LDN2:%.*]] = call { <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld2.v4i32.p0(ptr [[TMP9]]) -; NEON-NEXT: [[TMP11:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[LDN2]], 1 -; NEON-NEXT: [[TMP12:%.*]] = extractvalue { <4 x i32>, <4 x i32> } [[LDN2]], 0 -; NEON-NEXT: [[TMP13:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> [[TMP7]], <8 x i32> -; NEON-NEXT: [[TMP14:%.*]] = shufflevector <4 x i32> [[TMP11]], <4 x i32> poison, <8 x i32> -; NEON-NEXT: [[TMP15:%.*]] = shufflevector <8 x i32> [[TMP13]], <8 x i32> [[TMP14]], <12 x i32> -; NEON-NEXT: [[TMP16:%.*]] = shufflevector <4 x i32> [[TMP4]], <4 x i32> [[TMP8]], <8 x i32> -; NEON-NEXT: [[TMP17:%.*]] = shufflevector <4 x i32> [[TMP12]], <4 x i32> poison, <8 x i32> -; NEON-NEXT: [[TMP18:%.*]] = shufflevector <8 x i32> [[TMP16]], <8 x i32> [[TMP17]], <12 x i32> -; NEON-NEXT: ret void -; NO_NEON-LABEL: @load_factor2_wide3( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = load <24 x i32>, ptr %ptr, align 4 - %v0 = shufflevector <24 x i32> %interleaved.vec, <24 x i32> poison, <12 x i32> - %v1 = shufflevector <24 x i32> %interleaved.vec, <24 x i32> poison, <12 x i32> - ret void -} - -define void @load_factor3_wide(ptr %ptr) { -; NEON-LABEL: @load_factor3_wide( -; NEON-NEXT: [[LDN:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3.v4i32.p0(ptr %ptr) -; NEON-NEXT: [[TMP3:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 2 -; NEON-NEXT: [[TMP4:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 1 -; NEON-NEXT: [[TMP5:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 0 -; NEON-NEXT: [[TMP6:%.*]] = getelementptr i32, ptr %ptr, i32 12 -; NEON-NEXT: [[LDN1:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld3.v4i32.p0(ptr [[TMP6]]) -; NEON-NEXT: [[TMP8:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32> } [[LDN1]], 2 -; NEON-NEXT: [[TMP9:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32> } [[LDN1]], 1 -; NEON-NEXT: [[TMP10:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32> } [[LDN1]], 0 -; NEON-NEXT: [[TMP11:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> [[TMP8]], <8 x i32> -; NEON-NEXT: [[TMP12:%.*]] = shufflevector <4 x i32> [[TMP4]], <4 x i32> [[TMP9]], <8 x i32> -; NEON-NEXT: [[TMP13:%.*]] = shufflevector <4 x i32> [[TMP5]], <4 x i32> [[TMP10]], <8 x i32> -; NEON-NEXT: ret void -; NO_NEON-LABEL: @load_factor3_wide( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = load <24 x i32>, ptr %ptr, align 4 - %v0 = shufflevector <24 x i32> %interleaved.vec, <24 x i32> poison, <8 x i32> - %v1 = shufflevector <24 x i32> %interleaved.vec, <24 x i32> poison, <8 x i32> - %v2 = shufflevector <24 x i32> %interleaved.vec, <24 x i32> poison, <8 x i32> - ret void -} - -define void @load_factor4_wide(ptr %ptr) { -; NEON-LABEL: @load_factor4_wide( -; NEON-NEXT: [[LDN:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4.v4i32.p0(ptr %ptr) -; NEON-NEXT: [[TMP3:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 3 -; NEON-NEXT: [[TMP4:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 2 -; NEON-NEXT: [[TMP5:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 1 -; NEON-NEXT: [[TMP6:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[LDN]], 0 -; NEON-NEXT: [[TMP7:%.*]] = getelementptr i32, ptr %ptr, i32 16 -; NEON-NEXT: [[LDN1:%.*]] = call { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } @llvm.aarch64.neon.ld4.v4i32.p0(ptr [[TMP7]]) -; NEON-NEXT: [[TMP9:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[LDN1]], 3 -; NEON-NEXT: [[TMP10:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[LDN1]], 2 -; NEON-NEXT: [[TMP11:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[LDN1]], 1 -; NEON-NEXT: [[TMP12:%.*]] = extractvalue { <4 x i32>, <4 x i32>, <4 x i32>, <4 x i32> } [[LDN1]], 0 -; NEON-NEXT: [[TMP13:%.*]] = shufflevector <4 x i32> [[TMP3]], <4 x i32> [[TMP9]], <8 x i32> -; NEON-NEXT: [[TMP14:%.*]] = shufflevector <4 x i32> [[TMP4]], <4 x i32> [[TMP10]], <8 x i32> -; NEON-NEXT: [[TMP15:%.*]] = shufflevector <4 x i32> [[TMP5]], <4 x i32> [[TMP11]], <8 x i32> -; NEON-NEXT: [[TMP16:%.*]] = shufflevector <4 x i32> [[TMP6]], <4 x i32> [[TMP12]], <8 x i32> -; NEON-NEXT: ret void -; NO_NEON-LABEL: @load_factor4_wide( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = load <32 x i32>, ptr %ptr, align 4 - %v0 = shufflevector <32 x i32> %interleaved.vec, <32 x i32> poison, <8 x i32> - %v1 = shufflevector <32 x i32> %interleaved.vec, <32 x i32> poison, <8 x i32> - %v2 = shufflevector <32 x i32> %interleaved.vec, <32 x i32> poison, <8 x i32> - %v3 = shufflevector <32 x i32> %interleaved.vec, <32 x i32> poison, <8 x i32> - ret void -} - -define void @store_factor2_wide(ptr %ptr, <8 x i32> %v0, <8 x i32> %v1) { -; NEON-LABEL: @store_factor2_wide( -; NEON-NEXT: [[TMP2:%.*]] = shufflevector <8 x i32> %v0, <8 x i32> %v1, <4 x i32> -; NEON-NEXT: [[TMP3:%.*]] = shufflevector <8 x i32> %v0, <8 x i32> %v1, <4 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st2.v4i32.p0(<4 x i32> [[TMP2]], <4 x i32> [[TMP3]], ptr %ptr) -; NEON-NEXT: [[TMP5:%.*]] = shufflevector <8 x i32> %v0, <8 x i32> %v1, <4 x i32> -; NEON-NEXT: [[TMP6:%.*]] = shufflevector <8 x i32> %v0, <8 x i32> %v1, <4 x i32> -; NEON-NEXT: [[TMP7:%.*]] = getelementptr i32, ptr %ptr, i32 8 -; NEON-NEXT: call void @llvm.aarch64.neon.st2.v4i32.p0(<4 x i32> [[TMP5]], <4 x i32> [[TMP6]], ptr [[TMP7]]) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_factor2_wide( -; NO_NEON: ret void -; - %interleaved.vec = shufflevector <8 x i32> %v0, <8 x i32> %v1, <16 x i32> - store <16 x i32> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @store_factor3_wide(ptr %ptr, <8 x i32> %v0, <8 x i32> %v1, <8 x i32> %v2) { -; NEON-LABEL: @store_factor3_wide( -; NEON: [[TMP2:%.*]] = shufflevector <16 x i32> %s0, <16 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP3:%.*]] = shufflevector <16 x i32> %s0, <16 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP4:%.*]] = shufflevector <16 x i32> %s0, <16 x i32> %s1, <4 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st3.v4i32.p0(<4 x i32> [[TMP2]], <4 x i32> [[TMP3]], <4 x i32> [[TMP4]], ptr %ptr) -; NEON-NEXT: [[TMP6:%.*]] = shufflevector <16 x i32> %s0, <16 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP7:%.*]] = shufflevector <16 x i32> %s0, <16 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP8:%.*]] = shufflevector <16 x i32> %s0, <16 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP9:%.*]] = getelementptr i32, ptr %ptr, i32 12 -; NEON-NEXT: call void @llvm.aarch64.neon.st3.v4i32.p0(<4 x i32> [[TMP6]], <4 x i32> [[TMP7]], <4 x i32> [[TMP8]], ptr [[TMP9]]) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_factor3_wide( -; NO_NEON: ret void -; - %s0 = shufflevector <8 x i32> %v0, <8 x i32> %v1, <16 x i32> - %s1 = shufflevector <8 x i32> %v2, <8 x i32> poison, <16 x i32> - %interleaved.vec = shufflevector <16 x i32> %s0, <16 x i32> %s1, <24 x i32> - store <24 x i32> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @store_factor4_wide(ptr %ptr, <8 x i32> %v0, <8 x i32> %v1, <8 x i32> %v2, <8 x i32> %v3) { -; NEON-LABEL: @store_factor4_wide( -; NEON: [[TMP2:%.*]] = shufflevector <16 x i32> %s0, <16 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP3:%.*]] = shufflevector <16 x i32> %s0, <16 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP4:%.*]] = shufflevector <16 x i32> %s0, <16 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP5:%.*]] = shufflevector <16 x i32> %s0, <16 x i32> %s1, <4 x i32> -; NEON-NEXT: call void @llvm.aarch64.neon.st4.v4i32.p0(<4 x i32> [[TMP2]], <4 x i32> [[TMP3]], <4 x i32> [[TMP4]], <4 x i32> [[TMP5]], ptr %ptr) -; NEON-NEXT: [[TMP7:%.*]] = shufflevector <16 x i32> %s0, <16 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP8:%.*]] = shufflevector <16 x i32> %s0, <16 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP9:%.*]] = shufflevector <16 x i32> %s0, <16 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP10:%.*]] = shufflevector <16 x i32> %s0, <16 x i32> %s1, <4 x i32> -; NEON-NEXT: [[TMP11:%.*]] = getelementptr i32, ptr %ptr, i32 16 -; NEON-NEXT: call void @llvm.aarch64.neon.st4.v4i32.p0(<4 x i32> [[TMP7]], <4 x i32> [[TMP8]], <4 x i32> [[TMP9]], <4 x i32> [[TMP10]], ptr [[TMP11]]) -; NEON-NEXT: ret void -; NO_NEON-LABEL: @store_factor4_wide( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %s0 = shufflevector <8 x i32> %v0, <8 x i32> %v1, <16 x i32> - %s1 = shufflevector <8 x i32> %v2, <8 x i32> %v3, <16 x i32> - %interleaved.vec = shufflevector <16 x i32> %s0, <16 x i32> %s1, <32 x i32> - store <32 x i32> %interleaved.vec, ptr %ptr, align 4 - ret void -} - -define void @load_factor2_fp128(ptr %ptr) { -; NEON-LABEL: @load_factor2_fp128( -; NEON-NOT: @llvm.aarch64.neon -; NEON: ret void -; NO_NEON-LABEL: @load_factor2_fp128( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret void -; - %interleaved.vec = load <4 x fp128>, ptr %ptr, align 16 - %v0 = shufflevector <4 x fp128> %interleaved.vec, <4 x fp128> poison, <2 x i32> - %v1 = shufflevector <4 x fp128> %interleaved.vec, <4 x fp128> poison, <2 x i32> - ret void -} - -define <4 x i1> @load_large_vector(ptr %p) { -; NEON-LABEL: @load_large_vector( -; NEON: [[LDN:%.*]] = call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3.v2i64.p0(ptr -; NEON-NEXT: [[TMP1:%.*]] = extractvalue { <2 x i64>, <2 x i64>, <2 x i64> } [[LDN]], 1 -; NEON-NEXT: [[TMP2:%.*]] = inttoptr <2 x i64> [[TMP1]] to <2 x ptr> -; NEON-NEXT: [[TMP3:%.*]] = extractvalue { <2 x i64>, <2 x i64>, <2 x i64> } [[LDN]], 0 -; NEON-NEXT: [[TMP4:%.*]] = inttoptr <2 x i64> [[TMP3]] to <2 x ptr> -; NEON: [[LDN1:%.*]] = call { <2 x i64>, <2 x i64>, <2 x i64> } @llvm.aarch64.neon.ld3.v2i64.p0(ptr -; NEON-NEXT: [[TMP5:%.*]] = extractvalue { <2 x i64>, <2 x i64>, <2 x i64> } [[LDN1]], 1 -; NEON-NEXT: [[TMP6:%.*]] = inttoptr <2 x i64> [[TMP5]] to <2 x ptr> -; NEON-NEXT: [[TMP7:%.*]] = extractvalue { <2 x i64>, <2 x i64>, <2 x i64> } [[LDN1]], 0 -; NEON-NEXT: [[TMP8:%.*]] = inttoptr <2 x i64> [[TMP7]] to <2 x ptr> -; NEON-NEXT: shufflevector <2 x ptr> [[TMP2]], <2 x ptr> [[TMP6]], <4 x i32> -; NEON-NEXT: shufflevector <2 x ptr> [[TMP4]], <2 x ptr> [[TMP8]], <4 x i32> -; NO_NEON-LABEL: @load_large_vector( -; NO_NEON-NOT: @llvm.aarch64.neon -; NO_NEON: ret -; - %l = load <12 x ptr>, ptr %p - %s1 = shufflevector <12 x ptr> %l, <12 x ptr> poison, <4 x i32> - %s2 = shufflevector <12 x ptr> %l, <12 x ptr> poison, <4 x i32> - %ret = icmp ne <4 x ptr> %s1, %s2 - ret <4 x i1> %ret -}