llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Vicky Nguyen (iamvickynguyen) <details> <summary>Changes</summary> Related to https://github.com/llvm/llvm-project/issues/185382 CIR lowering for store intrinsics (`vst1_*`/`vst1q_*`) (https://arm-software.github.io/acle/neon_intrinsics/advsimd.html#store) Port tests: - `clang/test/CodeGen/AArch64/neon-intrinsics.c` - `clang/test/CodeGen/AArch64/neon-ldst-one.c` - `clang/test/CodeGen/AArch64/poly64.c` to `clang/test/CodeGen/AArch64/neon/store.c` --- Patch is 94.47 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/209347.diff 5 Files Affected: - (modified) clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp (+48-3) - (modified) clang/test/CodeGen/AArch64/neon-intrinsics.c (-660) - (modified) clang/test/CodeGen/AArch64/neon-ldst-one.c (-381) - (added) clang/test/CodeGen/AArch64/neon/store.c (+923) - (modified) clang/test/CodeGen/AArch64/poly64.c (-24) ``````````diff diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp index 2608aaf780591..63e339b72f0dc 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltinAArch64.cpp @@ -1065,7 +1065,17 @@ static mlir::Value emitCommonNeonBuiltinExpr( case NEON::BI__builtin_neon_vst1_x3_v: case NEON::BI__builtin_neon_vst1q_x3_v: case NEON::BI__builtin_neon_vst1_x4_v: - case NEON::BI__builtin_neon_vst1q_x4_v: + case NEON::BI__builtin_neon_vst1q_x4_v: { + // The builtin call has the pointer first, but the AArch64 st1x2/3/4 + // intrinsics take the vector operands first and the pointer last. + std::rotate(ops.begin(), ops.begin() + 1, ops.end()); + llvm::SmallVector<mlir::Type> argTypes(ops.size() - 1, ty); + argTypes.push_back(cgf.getBuilder().getVoidPtrTy()); + llvm::StringRef llvmIntrName = getLLVMIntrNameNoPrefix( + static_cast<llvm::Intrinsic::ID>(llvmIntrinsic)); + return emitNeonCall(cgf.getCIRGenModule(), cgf.getBuilder(), argTypes, ops, + llvmIntrName, cgf.cgm.voidTy, loc); + } case NEON::BI__builtin_neon_vtrn_v: case NEON::BI__builtin_neon_vtrnq_v: case NEON::BI__builtin_neon_vtst_v: @@ -2345,6 +2355,11 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr, assert(error == ASTContext::GE_None && "Should not codegen an error"); llvm::SmallVector<mlir::Value> ops; + // Captures the pointer and its alignment for builtins that store/load + // directly through the first argument (set in the arg-gathering loop + // below, used later when lowering the store/load itself). + Address ptrOp0 = Address::invalid(); + // Skip extra arguments used to discriminate vector types and that are // intended for Sema checking. bool hasExtraArg = hasExtraNeonArgument(builtinID); @@ -2358,10 +2373,20 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr, case NEON::BI__builtin_neon_vld1q_dup_v: case NEON::BI__builtin_neon_vld1_lane_v: case NEON::BI__builtin_neon_vld1q_lane_v: + cgm.errorNYI( + expr->getSourceRange(), + std::string("unimplemented AArch64 builtin argument handling ") + + getContext().BuiltinInfo.getName(builtinID)); + break; case NEON::BI__builtin_neon_vst1_v: case NEON::BI__builtin_neon_vst1q_v: case NEON::BI__builtin_neon_vst1_lane_v: case NEON::BI__builtin_neon_vst1q_lane_v: + // Get the alignment for the argument in addition to the value; + // we'll use it later. + ptrOp0 = emitPointerWithAlignment(expr->getArg(0)); + ops.push_back(ptrOp0.getPointer()); + continue; case NEON::BI__builtin_neon_vldap1_lane_s64: case NEON::BI__builtin_neon_vldap1q_lane_s64: case NEON::BI__builtin_neon_vstl1_lane_s64: @@ -2372,6 +2397,7 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr, expr->getSourceRange(), std::string("unimplemented AArch64 builtin argument handling ") + getContext().BuiltinInfo.getName(builtinID)); + break; } } ops.push_back( @@ -3197,16 +3223,35 @@ CIRGenFunction::emitAArch64BuiltinExpr(unsigned builtinID, const CallExpr *expr, } case NEON::BI__builtin_neon_vld1_v: case NEON::BI__builtin_neon_vld1q_v: + cgm.errorNYI(expr->getSourceRange(), + std::string("unimplemented AArch64 builtin call: ") + + getContext().BuiltinInfo.getName(builtinID)); + return mlir::Value{}; case NEON::BI__builtin_neon_vst1_v: - case NEON::BI__builtin_neon_vst1q_v: + case NEON::BI__builtin_neon_vst1q_v: { + ops[1] = builder.createBitcast(ops[1], ty); + builder.createStore(loc, ops[1], ptrOp0.withElementType(builder, ty)); + return nullptr; + } case NEON::BI__builtin_neon_vld1_lane_v: case NEON::BI__builtin_neon_vld1q_lane_v: case NEON::BI__builtin_neon_vldap1_lane_s64: case NEON::BI__builtin_neon_vldap1q_lane_s64: case NEON::BI__builtin_neon_vld1_dup_v: case NEON::BI__builtin_neon_vld1q_dup_v: + cgm.errorNYI(expr->getSourceRange(), + std::string("unimplemented AArch64 builtin call: ") + + getContext().BuiltinInfo.getName(builtinID)); + return mlir::Value{}; case NEON::BI__builtin_neon_vst1_lane_v: - case NEON::BI__builtin_neon_vst1q_lane_v: + case NEON::BI__builtin_neon_vst1q_lane_v: { + ops[1] = builder.createBitcast(ops[1], ty); + mlir::Value scalar = builder.createExtractElement( + loc, ops[1], static_cast<uint64_t>(getIntValueFromConstOp(ops[2]))); + builder.createStore(loc, scalar, + ptrOp0.withElementType(builder, scalar.getType())); + return nullptr; + } case NEON::BI__builtin_neon_vstl1_lane_s64: case NEON::BI__builtin_neon_vstl1q_lane_s64: case NEON::BI__builtin_neon_vld2_v: diff --git a/clang/test/CodeGen/AArch64/neon-intrinsics.c b/clang/test/CodeGen/AArch64/neon-intrinsics.c index 883897a18cbf6..fe3428c02ba9c 100644 --- a/clang/test/CodeGen/AArch64/neon-intrinsics.c +++ b/clang/test/CodeGen/AArch64/neon-intrinsics.c @@ -8020,333 +8020,6 @@ poly16x4x4_t test_vld4_p16(poly16_t const *a) { return vld4_p16(a); } -// CHECK-LABEL: define dso_local void @test_vst1q_u8( -// CHECK-SAME: ptr noundef [[A:%.*]], <16 x i8> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: store <16 x i8> [[B]], ptr [[A]], align 1 -// CHECK-NEXT: ret void -// -void test_vst1q_u8(uint8_t *a, uint8x16_t b) { - vst1q_u8(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1q_u16( -// CHECK-SAME: ptr noundef [[A:%.*]], <8 x i16> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i16> [[B]] to <16 x i8> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16> -// CHECK-NEXT: store <8 x i16> [[TMP1]], ptr [[A]], align 2 -// CHECK-NEXT: ret void -// -void test_vst1q_u16(uint16_t *a, uint16x8_t b) { - vst1q_u16(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1q_u32( -// CHECK-SAME: ptr noundef [[A:%.*]], <4 x i32> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i32> [[B]] to <16 x i8> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32> -// CHECK-NEXT: store <4 x i32> [[TMP1]], ptr [[A]], align 4 -// CHECK-NEXT: ret void -// -void test_vst1q_u32(uint32_t *a, uint32x4_t b) { - vst1q_u32(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1q_u64( -// CHECK-SAME: ptr noundef [[A:%.*]], <2 x i64> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i64> [[B]] to <16 x i8> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <2 x i64> -// CHECK-NEXT: store <2 x i64> [[TMP1]], ptr [[A]], align 8 -// CHECK-NEXT: ret void -// -void test_vst1q_u64(uint64_t *a, uint64x2_t b) { - vst1q_u64(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1q_s8( -// CHECK-SAME: ptr noundef [[A:%.*]], <16 x i8> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: store <16 x i8> [[B]], ptr [[A]], align 1 -// CHECK-NEXT: ret void -// -void test_vst1q_s8(int8_t *a, int8x16_t b) { - vst1q_s8(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1q_s16( -// CHECK-SAME: ptr noundef [[A:%.*]], <8 x i16> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i16> [[B]] to <16 x i8> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16> -// CHECK-NEXT: store <8 x i16> [[TMP1]], ptr [[A]], align 2 -// CHECK-NEXT: ret void -// -void test_vst1q_s16(int16_t *a, int16x8_t b) { - vst1q_s16(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1q_s32( -// CHECK-SAME: ptr noundef [[A:%.*]], <4 x i32> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i32> [[B]] to <16 x i8> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <4 x i32> -// CHECK-NEXT: store <4 x i32> [[TMP1]], ptr [[A]], align 4 -// CHECK-NEXT: ret void -// -void test_vst1q_s32(int32_t *a, int32x4_t b) { - vst1q_s32(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1q_s64( -// CHECK-SAME: ptr noundef [[A:%.*]], <2 x i64> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i64> [[B]] to <16 x i8> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <2 x i64> -// CHECK-NEXT: store <2 x i64> [[TMP1]], ptr [[A]], align 8 -// CHECK-NEXT: ret void -// -void test_vst1q_s64(int64_t *a, int64x2_t b) { - vst1q_s64(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1q_mf8( -// CHECK-SAME: ptr noundef [[A:%.*]], <16 x i8> [[VAL:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: store <16 x i8> [[VAL]], ptr [[A]], align 1 -// CHECK-NEXT: ret void -// -void test_vst1q_mf8(mfloat8_t *a, mfloat8x16_t val) { - vst1q_mf8(a, val); -} - -// CHECK-LABEL: define dso_local void @test_vst1q_f16( -// CHECK-SAME: ptr noundef [[A:%.*]], <8 x half> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x half> [[B]] to <8 x i16> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i16> [[TMP0]] to <16 x i8> -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i8> [[TMP1]] to <8 x half> -// CHECK-NEXT: store <8 x half> [[TMP2]], ptr [[A]], align 2 -// CHECK-NEXT: ret void -// -void test_vst1q_f16(float16_t *a, float16x8_t b) { - vst1q_f16(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1q_f32( -// CHECK-SAME: ptr noundef [[A:%.*]], <4 x float> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x float> [[B]] to <4 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i32> [[TMP0]] to <16 x i8> -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i8> [[TMP1]] to <4 x float> -// CHECK-NEXT: store <4 x float> [[TMP2]], ptr [[A]], align 4 -// CHECK-NEXT: ret void -// -void test_vst1q_f32(float32_t *a, float32x4_t b) { - vst1q_f32(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1q_f64( -// CHECK-SAME: ptr noundef [[A:%.*]], <2 x double> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x double> [[B]] to <2 x i64> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i64> [[TMP0]] to <16 x i8> -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <16 x i8> [[TMP1]] to <2 x double> -// CHECK-NEXT: store <2 x double> [[TMP2]], ptr [[A]], align 8 -// CHECK-NEXT: ret void -// -void test_vst1q_f64(float64_t *a, float64x2_t b) { - vst1q_f64(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1q_p8( -// CHECK-SAME: ptr noundef [[A:%.*]], <16 x i8> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: store <16 x i8> [[B]], ptr [[A]], align 1 -// CHECK-NEXT: ret void -// -void test_vst1q_p8(poly8_t *a, poly8x16_t b) { - vst1q_p8(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1q_p16( -// CHECK-SAME: ptr noundef [[A:%.*]], <8 x i16> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <8 x i16> [[B]] to <16 x i8> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <16 x i8> [[TMP0]] to <8 x i16> -// CHECK-NEXT: store <8 x i16> [[TMP1]], ptr [[A]], align 2 -// CHECK-NEXT: ret void -// -void test_vst1q_p16(poly16_t *a, poly16x8_t b) { - vst1q_p16(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1_u8( -// CHECK-SAME: ptr noundef [[A:%.*]], <8 x i8> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: store <8 x i8> [[B]], ptr [[A]], align 1 -// CHECK-NEXT: ret void -// -void test_vst1_u8(uint8_t *a, uint8x8_t b) { - vst1_u8(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1_u16( -// CHECK-SAME: ptr noundef [[A:%.*]], <4 x i16> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i16> [[B]] to <8 x i8> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16> -// CHECK-NEXT: store <4 x i16> [[TMP1]], ptr [[A]], align 2 -// CHECK-NEXT: ret void -// -void test_vst1_u16(uint16_t *a, uint16x4_t b) { - vst1_u16(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1_u32( -// CHECK-SAME: ptr noundef [[A:%.*]], <2 x i32> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i32> [[B]] to <8 x i8> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32> -// CHECK-NEXT: store <2 x i32> [[TMP1]], ptr [[A]], align 4 -// CHECK-NEXT: ret void -// -void test_vst1_u32(uint32_t *a, uint32x2_t b) { - vst1_u32(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1_u64( -// CHECK-SAME: ptr noundef [[A:%.*]], <1 x i64> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <1 x i64> [[B]] to <8 x i8> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <1 x i64> -// CHECK-NEXT: store <1 x i64> [[TMP1]], ptr [[A]], align 8 -// CHECK-NEXT: ret void -// -void test_vst1_u64(uint64_t *a, uint64x1_t b) { - vst1_u64(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1_s8( -// CHECK-SAME: ptr noundef [[A:%.*]], <8 x i8> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: store <8 x i8> [[B]], ptr [[A]], align 1 -// CHECK-NEXT: ret void -// -void test_vst1_s8(int8_t *a, int8x8_t b) { - vst1_s8(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1_s16( -// CHECK-SAME: ptr noundef [[A:%.*]], <4 x i16> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i16> [[B]] to <8 x i8> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16> -// CHECK-NEXT: store <4 x i16> [[TMP1]], ptr [[A]], align 2 -// CHECK-NEXT: ret void -// -void test_vst1_s16(int16_t *a, int16x4_t b) { - vst1_s16(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1_s32( -// CHECK-SAME: ptr noundef [[A:%.*]], <2 x i32> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x i32> [[B]] to <8 x i8> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <2 x i32> -// CHECK-NEXT: store <2 x i32> [[TMP1]], ptr [[A]], align 4 -// CHECK-NEXT: ret void -// -void test_vst1_s32(int32_t *a, int32x2_t b) { - vst1_s32(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1_s64( -// CHECK-SAME: ptr noundef [[A:%.*]], <1 x i64> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <1 x i64> [[B]] to <8 x i8> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <1 x i64> -// CHECK-NEXT: store <1 x i64> [[TMP1]], ptr [[A]], align 8 -// CHECK-NEXT: ret void -// -void test_vst1_s64(int64_t *a, int64x1_t b) { - vst1_s64(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1_mf8( -// CHECK-SAME: ptr noundef [[A:%.*]], <8 x i8> [[VAL:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: store <8 x i8> [[VAL]], ptr [[A]], align 1 -// CHECK-NEXT: ret void -// -void test_vst1_mf8(mfloat8_t *a, mfloat8x8_t val) { - vst1_mf8(a, val); -} - -// CHECK-LABEL: define dso_local void @test_vst1_f16( -// CHECK-SAME: ptr noundef [[A:%.*]], <4 x half> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x half> [[B]] to <4 x i16> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i16> [[TMP0]] to <8 x i8> -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i8> [[TMP1]] to <4 x half> -// CHECK-NEXT: store <4 x half> [[TMP2]], ptr [[A]], align 2 -// CHECK-NEXT: ret void -// -void test_vst1_f16(float16_t *a, float16x4_t b) { - vst1_f16(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1_f32( -// CHECK-SAME: ptr noundef [[A:%.*]], <2 x float> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x float> [[B]] to <2 x i32> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x i32> [[TMP0]] to <8 x i8> -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i8> [[TMP1]] to <2 x float> -// CHECK-NEXT: store <2 x float> [[TMP2]], ptr [[A]], align 4 -// CHECK-NEXT: ret void -// -void test_vst1_f32(float32_t *a, float32x2_t b) { - vst1_f32(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1_f64( -// CHECK-SAME: ptr noundef [[A:%.*]], <1 x double> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <1 x double> [[B]] to i64 -// CHECK-NEXT: [[__S1_SROA_0_0_VEC_INSERT:%.*]] = insertelement <1 x i64> undef, i64 [[TMP0]], i64 0 -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <1 x i64> [[__S1_SROA_0_0_VEC_INSERT]] to <8 x i8> -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <8 x i8> [[TMP1]] to <1 x double> -// CHECK-NEXT: store <1 x double> [[TMP2]], ptr [[A]], align 8 -// CHECK-NEXT: ret void -// -void test_vst1_f64(float64_t *a, float64x1_t b) { - vst1_f64(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1_p8( -// CHECK-SAME: ptr noundef [[A:%.*]], <8 x i8> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: store <8 x i8> [[B]], ptr [[A]], align 1 -// CHECK-NEXT: ret void -// -void test_vst1_p8(poly8_t *a, poly8x8_t b) { - vst1_p8(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1_p16( -// CHECK-SAME: ptr noundef [[A:%.*]], <4 x i16> noundef [[B:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <4 x i16> [[B]] to <8 x i8> -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <8 x i8> [[TMP0]] to <4 x i16> -// CHECK-NEXT: store <4 x i16> [[TMP1]], ptr [[A]], align 2 -// CHECK-NEXT: ret void -// -void test_vst1_p16(poly16_t *a, poly16x4_t b) { - vst1_p16(a, b); -} - // CHECK-LABEL: define dso_local void @test_vst2q_u8( // CHECK-SAME: ptr noundef [[A:%.*]], [2 x <16 x i8>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] { // CHECK-NEXT: [[ENTRY:.*:]] @@ -10151,339 +9824,6 @@ poly64x1x4_t test_vld1_p64_x4(poly64_t const *a) { return vld1_p64_x4(a); } -// CHECK-LABEL: define dso_local void @test_vst1q_mf8_x2( -// CHECK-SAME: ptr noundef [[A:%.*]], [2 x <16 x i8>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [2 x <16 x i8>] [[B_COERCE]], 0 -// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [2 x <16 x i8>] [[B_COERCE]], 1 -// CHECK-NEXT: call void @llvm.aarch64.neon.st1x2.v16i8.p0(<16 x i8> [[B_COERCE_FCA_0_EXTRACT]], <16 x i8> [[B_COERCE_FCA_1_EXTRACT]], ptr [[A]]) -// CHECK-NEXT: ret void -// -void test_vst1q_mf8_x2(mfloat8_t *a, mfloat8x16x2_t b) { - vst1q_mf8_x2(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1q_f64_x2( -// CHECK-SAME: ptr noundef [[A:%.*]], [2 x <2 x double>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] { -// CHECK-NEXT: [[ENTRY:.*:]] -// CHECK-NEXT: [[B_COERCE_FCA_0_EXTRACT:%.*]] = extractvalue [2 x <2 x double>] [[B_COERCE]], 0 -// CHECK-NEXT: [[TMP0:%.*]] = bitcast <2 x double> [[B_COERCE_FCA_0_EXTRACT]] to <2 x i64> -// CHECK-NEXT: [[B_COERCE_FCA_1_EXTRACT:%.*]] = extractvalue [2 x <2 x double>] [[B_COERCE]], 1 -// CHECK-NEXT: [[TMP1:%.*]] = bitcast <2 x double> [[B_COERCE_FCA_1_EXTRACT]] to <2 x i64> -// CHECK-NEXT: [[TMP2:%.*]] = bitcast <2 x i64> [[TMP0]] to <16 x i8> -// CHECK-NEXT: [[TMP3:%.*]] = bitcast <2 x i64> [[TMP1]] to <16 x i8> -// CHECK-NEXT: [[TMP4:%.*]] = bitcast <16 x i8> [[TMP2]] to <2 x double> -// CHECK-NEXT: [[TMP5:%.*]] = bitcast <16 x i8> [[TMP3]] to <2 x double> -// CHECK-NEXT: call void @llvm.aarch64.neon.st1x2.v2f64.p0(<2 x double> [[TMP4]], <2 x double> [[TMP5]], ptr [[A]]) -// CHECK-NEXT: ret void -// -void test_vst1q_f64_x2(float64_t *a, float64x2x2_t b) { - vst1q_f64_x2(a, b); -} - -// CHECK-LABEL: define dso_local void @test_vst1q_p64_x2( -// CHECK-SAME: ptr noundef [[A:%.*]], [2 x <2 x i64>] alignstack(16) [[B_COERCE:%.*]]) #[[ATTR0]] { -// CHECK-NEX... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/209347 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
