This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] PR67305, tighten neon_vector_mem_operand on eliminable registers
- From: Jiong Wang <jiong dot wang at foss dot arm dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Ramana Radhakrishnan <ramana dot radhakrishnan at foss dot arm dot com>, Kyrill Tkachov <kyrylo dot tkachov at arm dot com>
- Date: Wed, 4 Nov 2015 09:45:12 +0000
- Subject: [PATCH] PR67305, tighten neon_vector_mem_operand on eliminable registers
- Authentication-results: sourceware.org; auth=none
As discussed at the bugzilla
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67305
neon_vector_mem_operand is broken. As the comments says
"/* Reject eliminable registers. */", the code block at the head
of this function which checks eliminable registers is designed to do
early reject only, there shouldn't be any early accept.
If this code hunk doesn't reject the incoming rtx, then the rtx pattern
should still go through all default checks below. All other similar
functions, thumb1_legitimate_address_p, arm_coproc_mem_operand,
neon_struct_mem_operand etc are exactly follow this check flow.
So as Jim Wilson commented on the bugzilla, instead of "return !strict",
we need to only do the check if strict be true, and only does rejection
which means return FALSE, for all other cases, we need to go through
those normal checks below.
neon_vector_mem_operand is only used by several misalign pattern, I
guess that's why this bug is not exposed for long time.
boostrap & regression OK on armv8 aarch32, ok for trunk?
2015-11-04 Jiong Wang <jiong.wang@arm.com>
Jim Wilson <wilson@gcc.gnu.org>
gcc/
PR target/67305
* config/arm/arm.md (neon_vector_mem_operand): Return FALSE if strict
be true and eliminable registers mentioned.
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index 87e55e9..7fbf897 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -12957,14 +12957,14 @@ neon_vector_mem_operand (rtx op, int type, bool strict)
rtx ind;
/* Reject eliminable registers. */
- if (! (reload_in_progress || reload_completed)
- && ( reg_mentioned_p (frame_pointer_rtx, op)
+ if (strict && ! (reload_in_progress || reload_completed)
+ && (reg_mentioned_p (frame_pointer_rtx, op)
|| reg_mentioned_p (arg_pointer_rtx, op)
|| reg_mentioned_p (virtual_incoming_args_rtx, op)
|| reg_mentioned_p (virtual_outgoing_args_rtx, op)
|| reg_mentioned_p (virtual_stack_dynamic_rtx, op)
|| reg_mentioned_p (virtual_stack_vars_rtx, op)))
- return !strict;
+ return FALSE;
/* Constants are converted into offsets from labels. */
if (!MEM_P (op))