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

--- Comment #16 from John David Anglin <danglin at gcc dot gnu.org> 2010-10-11 
19:09:48 UTC ---
At -O0, the operation is handled as a COMPONENT_REF.  At -O1,
we have a MEM_REF.  We get to this point in expand_expr_real_1:

        if (mode != BLKmode
            && (unsigned) align < GET_MODE_ALIGNMENT (mode)
            /* If the target does not have special handling for unaligned
               loads of mode then it can use regular moves for them.  */
            && ((icode = optab_handler (movmisalign_optab, mode))
                != CODE_FOR_nothing))
          {
            rtx reg, insn;

            /* We've already validated the memory, and we're creating a
               new pseudo destination.  The predicates really can't fail.  */
            reg = gen_reg_rtx (mode);

            /* Nor can the insn generator.  */
            insn = GEN_FCN (icode) (reg, temp);
            emit_insn (insn);

            return reg;
          }
        return temp;

As far as I know, there isn't a requirement for target backends to handle
unaligned loads and stores when STRICT_ALIGNMENT is defined.

Further, it's not clear that the code understands that we have an unaligned
load at this point:

(gdb) p debug_tree (exp)
 <mem_ref 0x402aea00
    type <integer_type 0x40216300 unsigned int sizes-gimplified asm_written
public unsigned SI
        size <integer_cst 0x402092b8 constant 32>
        unit size <integer_cst 0x402090f0 constant 4>
        align 32 symtab 1076433952 alias set -1 canonical type 0x40216300
precision 32 min <integer_cst 0x402092d0 0> max <integer_cst 0x402092a0
4294967295>
        pointer_to_this <pointer_type 0x40222360>>

    arg 0 <addr_expr 0x402ae9e0
        type <pointer_type 0x4028f8a0 type <record_type 0x4028f120 B>
            unsigned SI size <integer_cst 0x402092b8 32> unit size <integer_cst
0x402090f0 4>
            align 32 symtab 0 alias set -1 canonical type 0x4028f8a0>
        constant
        arg 0 <var_decl 0x4028f420 sB type <record_type 0x4028f120 B>
            addressable used public static common BLK file pr45722-2.c line 18
col 10
            size <integer_cst 0x402899f0 constant 48>
            unit size <integer_cst 0x40289a20 constant 6>
            align 8 context <translation_unit_decl 0x4021de70 D.1226>
            (mem/s/c:BLK (symbol_ref:SI ("sB") [flags 0x200] <var_decl
0x4028f420 sB>) [0 sB+0 S6 A8]) chain <function_decl 0x40282700 retitB>>>
    arg 1 <integer_cst 0x402ad540 type <pointer_type 0x4028f8a0> constant 2>
    pr45722-2.c:48:5>
$1 = void
(gdb) p align
$2 = 32
(gdb) p mode
$3 = SImode

align is not less than the mode alignment for SImode, so even if we had
movmisalign patterns, they wouldn't be used in this case.

Reply via email to