On 9/6/19 12:02 AM, Bernd Edlinger wrote:
> Hi,
>
>
> as discussed already I propose this little refactoring as a follow-up
> which is not supposed to be doing any change to the code generation.
>
> I tried to get the description of ALT_RTL right, since it changed
> quite a lot recently what this weird parameter does, and nobody
> cared to update the comments :-/
>
> I stared a while at the VCE expansion, and I kind of think that
> there is probably still something not quite right there,
> since we expand
>
> orig_op0
> = expand_expr_real (tem,
> (TREE_CODE (TREE_TYPE (tem)) == UNION_TYPE
> && (TREE_CODE (TYPE_SIZE (TREE_TYPE (tem)))
> != INTEGER_CST)
> && modifier != EXPAND_STACK_PARM
> ? target : NULL_RTX),
> VOIDmode,
> modifier == EXPAND_SUM ? EXPAND_NORMAL :
> modifier,
> NULL, true);
>
> so inner_reference_p = true we want the memory address, maybe unaligned.
> But later op0 is used in a context where it needs to be aligned:
>
> else if (INTEGRAL_TYPE_P (type) && INTEGRAL_TYPE_P (TREE_TYPE
> (treeop0)))
> op0 = convert_modes (mode, GET_MODE (op0), op0,
> TYPE_UNSIGNED (TREE_TYPE (treeop0)));
>
> and especially this:
>
> if (modifier != EXPAND_WRITE
> && modifier != EXPAND_MEMORY
> && !inner_reference_p
> && mode != BLKmode
> && MEM_ALIGN (op0) < GET_MODE_ALIGNMENT (mode))
> {
> [...]
> if (GET_MODE (op0) == BLKmode)
> {
> rtx size_rtx = gen_int_mode (mode_size, Pmode);
> emit_block_move (new_with_op0_mode, op0, size_rtx,
> (modifier == EXPAND_STACK_PARM
> ? BLOCK_OP_CALL_PARM
> : BLOCK_OP_NORMAL));
> }
> else
> emit_move_insn (new_with_op0_mode, op0);
>
> ?
>
> I think this kind of stuff happens more often in Ada, but at least in the Ada
> test suite there was nothing triggering any of the sanitation assertions.
>
> But time will tell.
>
>
> Bootstrapped and reg-tested on x86_64-pc-linux-gnu.
> Is it OK for trunk?
>
>
> Thanks
> Bernd.
>
>
> patch-expand-misalign.diff
>
> 2019-09-04 Bernd Edlinger <[email protected]>
>
> * expmed.c (extract_bit_field): Update function comment
> regarding alt_rtl.
> * expr.c (expand_expr_real): Update function comment
> regarding alt_rtl.
> (expand_misaligned_mem_ref): New helper function.
> (expand_expr_real_2): Use expand_misaligned_mem_ref.
> Remove duplicate assignment to "base" at case MEM_REF.
> Remove a shadowed variable "unsignedp" at case VCE.
>
OK
jeff