pratlucas created this revision. Herald added subscribers: cfe-commits, kristof.beyls. Herald added a project: clang.
The range checks performed for the vqrdmulh_lane and vqrdmulh_lane Neon intrinsics were incorrectly using their return type as the base type for the range check performed on their 'lane' argument. This patch updates those intrisics to use the type of the proper reference argument to perform the range checks. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D74766 Files: clang/include/clang/Basic/arm_neon.td clang/lib/CodeGen/CGBuiltin.cpp clang/test/CodeGen/arm-neon-range-checks.c Index: clang/test/CodeGen/arm-neon-range-checks.c =================================================================== --- clang/test/CodeGen/arm-neon-range-checks.c +++ clang/test/CodeGen/arm-neon-range-checks.c @@ -280,6 +280,13 @@ vqdmulh_lane_s32(a, b, 1); } +void test_vqdmulhq_lane(int32x4_t a, int32x2_t b) { + vqdmulhq_lane_s32(a, b, -1); // expected-error {{argument value -1 is outside the valid range}} + vqdmulhq_lane_s32(a, b, 2); // expected-error {{argument value 2 is outside the valid range}} + vqdmulhq_lane_s32(a, b, 0); + vqdmulhq_lane_s32(a, b, 1); +} + #if defined(__aarch64__) void test_vqdmulh_laneq(int32x2_t a, int32x4_t b) { vqdmulh_laneq_s32(a, b, -1); // expected-error {{argument value -1 is outside the valid range}} @@ -393,6 +400,13 @@ vqrdmulh_lane_s32(a, v, 1); } +void test_vqrdmulhq_lane(int32x4_t a, int32x2_t v) { + vqrdmulhq_lane_s32(a, v, -1); // expected-error {{argument value -1 is outside the valid range}} + vqrdmulhq_lane_s32(a, v, 2); // expected-error {{argument value 2 is outside the valid range}} + vqrdmulhq_lane_s32(a, v, 0); + vqrdmulhq_lane_s32(a, v, 1); +} + #if defined(__aarch64__) void test_vqrdmulh_laneq(int32x2_t a, int32x4_t v) { vqrdmulh_laneq_s32(a, v, -1); // expected-error {{argument value -1 is outside the valid range}} Index: clang/lib/CodeGen/CGBuiltin.cpp =================================================================== --- clang/lib/CodeGen/CGBuiltin.cpp +++ clang/lib/CodeGen/CGBuiltin.cpp @@ -5802,8 +5802,12 @@ case NEON::BI__builtin_neon_vqdmulh_lane_v: case NEON::BI__builtin_neon_vqrdmulhq_lane_v: case NEON::BI__builtin_neon_vqrdmulh_lane_v: { + llvm::Type* RTy = Ty; + if (BuiltinID == NEON::BI__builtin_neon_vqdmulhq_lane_v || + BuiltinID == NEON::BI__builtin_neon_vqrdmulhq_lane_v) + RTy = llvm::VectorType::get(Ty->getVectorElementType(), Ty->getVectorNumElements() * 2); llvm::Type *Tys[2] = { - Ty, GetNeonType(this, NeonTypeFlags(Type.getEltType(), false, + RTy, GetNeonType(this, NeonTypeFlags(Type.getEltType(), false, /*isQuad*/ false))}; return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, NameHint); } Index: clang/include/clang/Basic/arm_neon.td =================================================================== --- clang/include/clang/Basic/arm_neon.td +++ clang/include/clang/Basic/arm_neon.td @@ -547,8 +547,8 @@ def VQRDMULH_LANE : SOpInst<"vqrdmulh_lane", "..qI", "siQsQi", OP_QRDMULH_LN>; } let ArchGuard = "defined(__aarch64__)" in { -def A64_VQDMULH_LANE : SInst<"vqdmulh_lane", "..qI", "siQsQi">; -def A64_VQRDMULH_LANE : SInst<"vqrdmulh_lane", "..qI", "siQsQi">; +def A64_VQDMULH_LANE : SInst<"vqdmulh_lane", "..(!q)I", "siQsQi">; +def A64_VQRDMULH_LANE : SInst<"vqrdmulh_lane", "..(!q)I", "siQsQi">; } let ArchGuard = "defined(__ARM_FEATURE_QRDMX)" in {
Index: clang/test/CodeGen/arm-neon-range-checks.c =================================================================== --- clang/test/CodeGen/arm-neon-range-checks.c +++ clang/test/CodeGen/arm-neon-range-checks.c @@ -280,6 +280,13 @@ vqdmulh_lane_s32(a, b, 1); } +void test_vqdmulhq_lane(int32x4_t a, int32x2_t b) { + vqdmulhq_lane_s32(a, b, -1); // expected-error {{argument value -1 is outside the valid range}} + vqdmulhq_lane_s32(a, b, 2); // expected-error {{argument value 2 is outside the valid range}} + vqdmulhq_lane_s32(a, b, 0); + vqdmulhq_lane_s32(a, b, 1); +} + #if defined(__aarch64__) void test_vqdmulh_laneq(int32x2_t a, int32x4_t b) { vqdmulh_laneq_s32(a, b, -1); // expected-error {{argument value -1 is outside the valid range}} @@ -393,6 +400,13 @@ vqrdmulh_lane_s32(a, v, 1); } +void test_vqrdmulhq_lane(int32x4_t a, int32x2_t v) { + vqrdmulhq_lane_s32(a, v, -1); // expected-error {{argument value -1 is outside the valid range}} + vqrdmulhq_lane_s32(a, v, 2); // expected-error {{argument value 2 is outside the valid range}} + vqrdmulhq_lane_s32(a, v, 0); + vqrdmulhq_lane_s32(a, v, 1); +} + #if defined(__aarch64__) void test_vqrdmulh_laneq(int32x2_t a, int32x4_t v) { vqrdmulh_laneq_s32(a, v, -1); // expected-error {{argument value -1 is outside the valid range}} Index: clang/lib/CodeGen/CGBuiltin.cpp =================================================================== --- clang/lib/CodeGen/CGBuiltin.cpp +++ clang/lib/CodeGen/CGBuiltin.cpp @@ -5802,8 +5802,12 @@ case NEON::BI__builtin_neon_vqdmulh_lane_v: case NEON::BI__builtin_neon_vqrdmulhq_lane_v: case NEON::BI__builtin_neon_vqrdmulh_lane_v: { + llvm::Type* RTy = Ty; + if (BuiltinID == NEON::BI__builtin_neon_vqdmulhq_lane_v || + BuiltinID == NEON::BI__builtin_neon_vqrdmulhq_lane_v) + RTy = llvm::VectorType::get(Ty->getVectorElementType(), Ty->getVectorNumElements() * 2); llvm::Type *Tys[2] = { - Ty, GetNeonType(this, NeonTypeFlags(Type.getEltType(), false, + RTy, GetNeonType(this, NeonTypeFlags(Type.getEltType(), false, /*isQuad*/ false))}; return EmitNeonCall(CGM.getIntrinsic(Int, Tys), Ops, NameHint); } Index: clang/include/clang/Basic/arm_neon.td =================================================================== --- clang/include/clang/Basic/arm_neon.td +++ clang/include/clang/Basic/arm_neon.td @@ -547,8 +547,8 @@ def VQRDMULH_LANE : SOpInst<"vqrdmulh_lane", "..qI", "siQsQi", OP_QRDMULH_LN>; } let ArchGuard = "defined(__aarch64__)" in { -def A64_VQDMULH_LANE : SInst<"vqdmulh_lane", "..qI", "siQsQi">; -def A64_VQRDMULH_LANE : SInst<"vqrdmulh_lane", "..qI", "siQsQi">; +def A64_VQDMULH_LANE : SInst<"vqdmulh_lane", "..(!q)I", "siQsQi">; +def A64_VQRDMULH_LANE : SInst<"vqrdmulh_lane", "..(!q)I", "siQsQi">; } let ArchGuard = "defined(__ARM_FEATURE_QRDMX)" in {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits