diff options
author | Richard Guenther <rguenther@suse.de> | 2006-03-14 09:53:36 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2006-03-14 09:53:36 +0000 |
commit | 7de805590acbbcce1968a6552950b189946d852f (patch) | |
tree | 9a2cee1d5a79a77eaca1ea1e706b53609422971d /gcc/builtins.c | |
parent | 2f96b75442ec3b2c211d1b4d37d3de16cd12d4f1 (diff) | |
download | gcc-7de805590acbbcce1968a6552950b189946d852f.zip gcc-7de805590acbbcce1968a6552950b189946d852f.tar.gz gcc-7de805590acbbcce1968a6552950b189946d852f.tar.bz2 |
re PR middle-end/26659 (gcc.target/powerpc/ppc-vector-memset.c fails on the mainline)
2006-03-14 Richard Guenther <rguenther@suse.de>
PR middle-end/26659
* builtins.c (get_pointer_alignment): Prefer alignment
information from decls over that from types.
From-SVN: r112048
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 13 |
1 files changed, 8 insertions, 5 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index 1ce6083..a628342 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -275,21 +275,24 @@ get_pointer_alignment (tree exp, unsigned int max_align) case ADDR_EXPR: /* See what we are pointing at and look at its alignment. */ exp = TREE_OPERAND (exp, 0); + inner = max_align; while (handled_component_p (exp)) { if (TREE_CODE (exp) == COMPONENT_REF) - align = MIN (align, DECL_ALIGN (TREE_OPERAND (exp, 1))); + inner = MIN (inner, DECL_ALIGN (TREE_OPERAND (exp, 1))); exp = TREE_OPERAND (exp, 0); } if (TREE_CODE (exp) == FUNCTION_DECL) - align = MIN (align, FUNCTION_BOUNDARY); + align = FUNCTION_BOUNDARY; else if (DECL_P (exp)) - align = MIN (align, DECL_ALIGN (exp)); + align = MIN (inner, DECL_ALIGN (exp)); #ifdef CONSTANT_ALIGNMENT else if (CONSTANT_CLASS_P (exp)) - align = MIN (align, (unsigned)CONSTANT_ALIGNMENT (exp, align)); + align = CONSTANT_ALIGNMENT (exp, align); #endif - return align; + else + align = MIN (align, inner); + return MIN (align, max_align); default: return align; |