[PATCH] D74766: [ARM] Fixing range checks for Neon's vqdmulhq_lane and vqrdmulhq_lane intrinsics
Lucas Prates via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Feb 18 06:42:57 PST 2020
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 {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D74766.245149.patch
Type: text/x-patch
Size: 2910 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200218/50f90e11/attachment.bin>
More information about the cfe-commits
mailing list