http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52450

--- Comment #11 from dave.anglin at bell dot net 2012-03-13 14:41:57 UTC ---
On 3/12/2012 5:58 AM, rguenther at suse dot de wrote:
> Btw, alignof () of a packed struct type is 1 (it could be nested
> in another packed struct).

At -O0, the reference passed to foo is misaligned but the struct is 
copied in
foo with memcpy.;; Function foo (foo)

foo (struct T t)
{
   v4si D.1253;
   struct T t.0;

   # BLOCK 2
   # PRED: ENTRY (fallthru)
   t.0 = t;
   D.1253_1 = t.0.i[0];
<retval> = D.1253_1;
   return <retval>;
   # SUCC: EXIT

}

;; t.0 = t;

(insn 7 6 8 (set (reg/f:SI 99)
         (reg/f:SI 91 virtual-stack-vars)) 
/test/gnu/gcc/gcc/gcc/testsuite/gcc.dg
/torture/pr52402.c:10 -1
      (nil))

(insn 8 7 9 (set (reg/f:SI 100)
         (reg/v/f:SI 98)) 
/test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/torture/pr52402.
c:10 -1
      (nil))

(insn 9 8 10 (set (reg:SI 101)
         (const_int 36 [0x24])) 
/test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/torture/pr
52402.c:10 -1
      (nil))

(insn 10 9 11 (set (reg:SI 26 %r26)
         (reg/f:SI 99)) 
/test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/torture/pr52402.c:10 -1
      (nil))

(insn 11 10 12 (set (reg:SI 25 %r25)
         (reg/f:SI 100)) 
/test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/torture/pr52402.c:10 -1
      (nil))

(insn 12 11 13 (set (reg:SI 24 %r24)
         (reg:SI 101)) 
/test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/torture/pr52402.c:10 -1
      (nil))

(call_insn 13 12 14 (parallel [
             (set (reg:SI 28 %r28)
                 (call (mem:SI (symbol_ref/v:SI ("@memcpy") [flags 0x41] 
<function_decl 7af9ee00 memcpy>) [0 S4 A32])
                     (const_int 16 [0x10])))
             (clobber (reg:SI 1 %r1))
             (clobber (reg:SI 2 %r2))
             (use (const_int 0 [0]))
         ]) /test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/torture/pr52402.c:10 -1
      (expr_list:REG_EH_REGION (const_int 0 [0])
         (nil))
     (expr_list:REG_DEP_TRUE (use (reg:SI 24 %r24))
         (expr_list:REG_DEP_TRUE (use (reg:SI 25 %r25))
             (expr_list:REG_DEP_TRUE (use (reg:SI 26 %r26))
                 (nil)))))

(insn 14 13 0 (set (reg:SI 102)
         (reg:SI 28 %r28)) 
/test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/torture/pr52402.c:10 -1
      (nil))


At -O1, there is no copy.

foo (struct T t)
{
   v4si SR.1;

   # BLOCK 2 freq:10000
   # PRED: ENTRY [100.0%]  (fallthru,exec)
   SR.1_5 = MEM[(struct T *)&t];
<retval> = SR.1_5;
   return <retval>;
   # SUCC: EXIT [100.0%]

}

;; <retval> = SR.1_5;

(insn 7 6 8 (set (reg:SI 99)
         (mem/c:SI (reg/v/f:SI 98) [0 MEM[(struct T *)&t]+0 S4 A8])) 
/test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/torture/pr52402.c:12 -1
      (nil))

(insn 8 7 9 (set (mem/c/i:SI (reg/f:SI 97) [0 <retval>+0 S4 A128])
         (reg:SI 99)) 
/test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/torture/pr52402.c:12 -1
      (nil))

(insn 9 8 10 (set (reg:SI 100)
         (mem/c:SI (plus:SI (reg/v/f:SI 98)
                 (const_int 4 [0x4])) [0 MEM[(struct T *)&t]+4 S4 A8])) 
/test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/torture/pr52402.c:12 -1
      (nil))

(insn 10 9 11 (set (mem/c/i:SI (plus:SI (reg/f:SI 97)
                 (const_int 4 [0x4])) [0 <retval>+4 S4 A32])
         (reg:SI 100)) 
/test/gnu/gcc/gcc/gcc/testsuite/gcc.dg/torture/pr52402.c:12 -1
      (nil))

The alignment of the mem's in insns 7 and 9 is inconsistent with the 
alignment for the mode.

Dave

Reply via email to