re PR middle-end/49923 (__attribute__((packed)) on ARM is sometimes dropped)
authorMartin Jambor <mjambor@suse.cz>
Mon, 8 Aug 2011 17:53:55 +0000 (19:53 +0200)
committerMartin Jambor <jamborm@gcc.gnu.org>
Mon, 8 Aug 2011 17:53:55 +0000 (19:53 +0200)
2011-08-08  Martin Jambor  <mjambor@suse.cz>

PR middle-end/49923
* tree-sra.c (access_precludes_ipa_sra_p): Also check access
memory alignment.

* testsuite/gcc.dg/tree-ssa/pr49923.c: New test.

From-SVN: r177572

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr49923.c [new file with mode: 0644]
gcc/tree-sra.c

index b1776f59f48def2df77a88e4a3601e94a1757518..fc23fcb4a40259c3c23de65cedefcc53ac0568ec 100644 (file)
@@ -1,3 +1,9 @@
+2011-08-08  Martin Jambor  <mjambor@suse.cz>
+
+       PR middle-end/49923
+       * tree-sra.c (access_precludes_ipa_sra_p): Also check access
+       memory alignment.
+
 2011-08-08   Diego Novillo  <dnovillo@google.com>
 
        * Makefile.in (LTO_STREAMER_H): Add DIAGNOSTIC_H.
index 4ce23b79764aa63fdddf2bda478a8085668a1655..347975d70910e8b0ea0b5201a255554661659bff 100644 (file)
@@ -1,3 +1,8 @@
+2011-08-08  Martin Jambor  <mjambor@suse.cz>
+
+       PR middle-end/49923
+       * gcc.dg/tree-ssa/pr49923.c: New test.
+
 2011-08-08  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR target/49781
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr49923.c b/gcc/testsuite/gcc.dg/tree-ssa/pr49923.c
new file mode 100644 (file)
index 0000000..83113f8
--- /dev/null
@@ -0,0 +1,55 @@
+/* { dg-do run } */
+/* { dg-options "-O3" } */
+
+#define PACKED __attribute__(( packed ))
+
+struct PACKED aostk_point_u8 {
+  unsigned char x;
+  unsigned char y;
+};
+
+struct PACKED aostk_size_u8 {
+  unsigned char width;
+  unsigned char height;
+};
+
+struct PACKED aostk_glyph {
+       unsigned short i;
+       struct aostk_size_u8 size;
+       char top;
+       struct aostk_point_u8 advance;
+       unsigned char pitch;
+       unsigned char* data;
+       char left;
+};
+
+
+struct PACKED aostk_font {
+       unsigned short numglyphs;
+       unsigned char height;
+       struct aostk_glyph* glyphs;
+};
+
+struct aostk_font glob_font;
+
+static struct aostk_glyph* aostk_get_glyph(struct aostk_font* f, unsigned int c) {
+       return f->glyphs;
+}
+
+int aostk_font_strwidth(struct aostk_font* font, const char* str) {
+       struct aostk_glyph* g = aostk_get_glyph(font, 0);
+       return (g != 0);
+}
+
+struct aostk_font*
+__attribute__ ((noinline, noclone))
+get_some_font (void)
+{
+  return &glob_font;
+}
+
+int main (int argc, char *argv[])
+{
+  return (int) aostk_font_strwidth (get_some_font (), "sth");
+  
+}
index cc5cd36123f5030c3386bad00074d593c4f49f08..ab60748c9709007132d9bffda10c1224b2d4aa97 100644 (file)
@@ -3688,6 +3688,9 @@ access_precludes_ipa_sra_p (struct access *access)
          || gimple_code (access->stmt) == GIMPLE_ASM))
     return true;
 
+  if (tree_non_mode_aligned_mem_p (access->expr))
+    return true;
+
   return false;
 }