re PR middle-end/49545 (New C++ test failures)
authorRichard Sandiford <richard.sandiford@linaro.org>
Wed, 29 Jun 2011 09:42:42 +0000 (09:42 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Wed, 29 Jun 2011 09:42:42 +0000 (09:42 +0000)
gcc/
PR tree-optimization/49545
* builtins.c (get_object_alignment_1): Update function comment.
Do not use DECL_ALIGN for functions, but test
TARGET_PTRMEMFUNC_VBIT_LOCATION instead.
* fold-const.c (get_pointer_modulus_and_residue): Don't check
for functions here.
* tree-ssa-ccp.c (get_value_from_alignment): Likewise.

gcc/testsuite/
* gcc.dg/torture/pr49169.c: Restrict to ARM and MIPS targets.

From-SVN: r175627

gcc/ChangeLog
gcc/builtins.c
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr49169.c
gcc/tree-ssa-ccp.c

index 91c23f2a20c6297500d80184a7add3ceb4a770f0..0a87e3c69215b2dd6fe26e3e4b12989404bc96b5 100644 (file)
@@ -1,3 +1,13 @@
+2011-06-29  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       PR tree-optimization/49545
+       * builtins.c (get_object_alignment_1): Update function comment.
+       Do not use DECL_ALIGN for functions, but test
+       TARGET_PTRMEMFUNC_VBIT_LOCATION instead.
+       * fold-const.c (get_pointer_modulus_and_residue): Don't check
+       for functions here.
+       * tree-ssa-ccp.c (get_value_from_alignment): Likewise.
+
 2011-06-29  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/49567
index 0747e04a3af1bba85e294161023ebcc205ad3c50..1ee8cf80001db3ed90af651c65fbebf27cfda7d5 100644 (file)
@@ -264,8 +264,15 @@ called_as_built_in (tree node)
   return is_builtin_name (name);
 }
 
-/* Return the alignment in bits of EXP, an object.
-   Don't return more than MAX_ALIGN no matter what.  */
+/* Compute values M and N such that M divides (address of EXP - N) and
+   such that N < M.  Store N in *BITPOSP and return M.
+
+   Note that the address (and thus the alignment) computed here is based
+   on the address to which a symbol resolves, whereas DECL_ALIGN is based
+   on the address at which an object is actually located.  These two
+   addresses are not always the same.  For example, on ARM targets,
+   the address &foo of a Thumb function foo() has the lowest bit set,
+   whereas foo() itself starts on an even address.  */
 
 unsigned int
 get_object_alignment_1 (tree exp, unsigned HOST_WIDE_INT *bitposp)
@@ -287,7 +294,21 @@ get_object_alignment_1 (tree exp, unsigned HOST_WIDE_INT *bitposp)
     exp = DECL_INITIAL (exp);
   if (DECL_P (exp)
       && TREE_CODE (exp) != LABEL_DECL)
-    align = DECL_ALIGN (exp);
+    {
+      if (TREE_CODE (exp) == FUNCTION_DECL)
+       {
+         /* Function addresses can encode extra information besides their
+            alignment.  However, if TARGET_PTRMEMFUNC_VBIT_LOCATION
+            allows the low bit to be used as a virtual bit, we know
+            that the address itself must be 2-byte aligned.  */
+         if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn)
+           align = 2 * BITS_PER_UNIT;
+         else
+           align = BITS_PER_UNIT;
+       }
+      else
+       align = DECL_ALIGN (exp);
+    }
   else if (CONSTANT_CLASS_P (exp))
     {
       align = TYPE_ALIGN (TREE_TYPE (exp));
index 9428c11e4ac4db637f4f175c489f8cff30727451..e48aae9f4ce19a2ed7538194524b091603bff87e 100644 (file)
@@ -9216,8 +9216,7 @@ get_pointer_modulus_and_residue (tree expr, unsigned HOST_WIDE_INT *residue,
   *residue = 0;
 
   code = TREE_CODE (expr);
-  if (code == ADDR_EXPR
-      && TREE_CODE (TREE_OPERAND (expr, 0)) != FUNCTION_DECL)
+  if (code == ADDR_EXPR)
     {
       unsigned int bitalign;
       bitalign = get_object_alignment_1 (TREE_OPERAND (expr, 0), residue);
index f0b9eb10377bf8fb6e653a20d162acc5d15ad909..ee7274790fd91099457a9d40f3d5998ac37c44c7 100644 (file)
@@ -1,3 +1,7 @@
+2011-06-29  Richard Sandiford  <richard.sandiford@linaro.org>
+
+       * gcc.dg/torture/pr49169.c: Restrict to ARM and MIPS targets.
+
 2011-06-29  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * gcc.dg/inline_1.c: Remove dg-excess-errors.
index 721b2ac64355737302385b152aa1b0e006f87296..c7800bb753686abc6b09dfbb8d6452862048877d 100644 (file)
@@ -1,3 +1,5 @@
+/* { dg-do compile { target { arm*-*-* || mips*-*-* } } } */
+
 #include <stdlib.h>
 #include <stdint.h>
 
index 78724de286beb73c317dbc8e34bfd60c86968fd2..94a09e0bbc943f130d9fdd14fe9f2965e8c3f784 100644 (file)
@@ -520,10 +520,6 @@ get_value_from_alignment (tree expr)
     val = bit_value_binop (PLUS_EXPR, TREE_TYPE (expr),
                           TREE_OPERAND (base, 0), TREE_OPERAND (base, 1));
   else if (base
-          /* ???  While function decls have DECL_ALIGN their addresses
-             may encode extra information in the lower bits on some
-             targets (PR47239).  Simply punt for function decls for now.  */
-          && TREE_CODE (base) != FUNCTION_DECL
           && ((align = get_object_alignment (base, BIGGEST_ALIGNMENT))
                > BITS_PER_UNIT))
     {