This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[committed] Drop TREE_ADDRESSABLE from BIT_FIELD_REF on lhs accessed vectors/complex
- From: Jakub Jelinek <jakub at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Thu, 13 Oct 2011 18:13:59 +0200
- Subject: [committed] Drop TREE_ADDRESSABLE from BIT_FIELD_REF on lhs accessed vectors/complex
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
I've noticed that
#define vector(elcount, type) \
__attribute__((vector_size((elcount)*sizeof(type)))) type
vector (4, int)
f1 (vector (4, int) a, int b)
{
((int *)&a)[0] = b;
return a;
}
as well as
vector (4, int)
f2 (vector (4, int) a, int b)
{
a[0] = b;
return a;
}
don't result in vec_set_optab being used, instead the argument is
forced in memory. The problem is that update_addresses_taken
wouldn't drop TREE_ADDRESSABLE from the vector when it is no
longer address taken. While it can't be turned into DECL_GIMPLE_REG_P,
TREE_ADDRESSABLE can go, it will still not be considered a gimple register,
but at least the expander will be free to generate better code for it.
Bootstrapped/regtested on x86_64-linux and i686-linux, preapproved by
richi on IRC, committed to trunk.
2011-10-13 Jakub Jelinek <jakub@redhat.com>
Richard Guenther <rguenther@suse.de>
* tree-ssa.c (maybe_optimize_var): Drop TREE_ADDRESSABLE
from vector or complex vars even if their DECL_UID is in not_reg_needs
bitmap.
--- gcc/tree-ssa.c.jj 2011-10-13 11:19:30.000000000 +0200
+++ gcc/tree-ssa.c 2011-10-13 14:27:02.000000000 +0200
@@ -1976,6 +1976,8 @@ maybe_optimize_var (tree var, bitmap add
a non-register. Otherwise we are confused and forget to
add virtual operands for it. */
&& (!is_gimple_reg_type (TREE_TYPE (var))
+ || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE
+ || TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE
|| !bitmap_bit_p (not_reg_needs, DECL_UID (var))))
{
TREE_ADDRESSABLE (var) = 0;
Jakub