Possible bug: Unaligned bit-field address when predictive commoning.
Claudiu Zissulescu
claziss@gmail.com
Thu May 12 11:00:00 GMT 2016
On 12/05/16 12:37, Richard Biener wrote:
> On Thu, May 12, 2016 at 12:17 PM, Richard Biener
> <richard.guenther@gmail.com> wrote:
>> On Thu, May 12, 2016 at 12:10 PM, Claudiu Zissulescu
>> <Claudiu.Zissulescu@synopsys.com> wrote:
>>> Hi,
>>>
>>> I've been trying the following simple test case on latest gcc, and it seems to produce unwanted unaligned accesses for bit-fields.
>>>
>>> Test cases:
>>>
>>> struct lock_chain {
>>> unsigned int irq_context: 2,
>>> depth: 6,
>>> base: 24;
>>> };
>>>
>>> struct lock_chain * foo (struct lock_chain *chain)
>>> {
>>> int i;
>>> for (i = 0; i < 100; i++)
>>> {
>>> chain[i+1].base = chain[i].base;
>>> }
>>> return chain;
>>> }
>>>
>>> GCC options -O3 (we need predictive commoning to kick in).
>>>
>>> The result for ARM:
>>>
>>> .cpu arm926ej-s
>>> .eabi_attribute 20, 1
>>> .eabi_attribute 21, 1
>>> .eabi_attribute 23, 3
>>> .eabi_attribute 24, 1
>>> .eabi_attribute 25, 1
>>> .eabi_attribute 26, 1
>>> .eabi_attribute 30, 2
>>> .eabi_attribute 34, 0
>>> .eabi_attribute 18, 4
>>> .file "t01.c"
>>> .text
>>> .align 2
>>> .global foo
>>> .syntax unified
>>> .arm
>>> .fpu softvfp
>>> .type foo, %function
>>> foo:
>>> @ args = 0, pretend = 0, frame = 0
>>> @ frame_needed = 0, uses_anonymous_args = 0
>>> @ link register save eliminated.
>>> ldr r1, [r0, #1] <<<<<<<<<<<< Unaligned access
>>> add r3, r0, #4
>>> lsl r1, r1, #8
>>> add ip, r0, #404
>>> .L2:
>>> ldrb r2, [r3] @ zero_extendqisi2
>>> orr r2, r1, r2
>>> str r2, [r3], #4
>>> cmp r3, ip
>>> bne .L2
>>> bx lr
>>> .size foo, .-foo
>>> .ident "GCC: (GNU) 7.0.0 20160502 (experimental)"
>>>
>>> Please observe the ldr instruction will access an unaligned address.
>>>
>>> I observed this issue for ARC processor, but because the ARM is more popular, I've use it for this case.
>>>
>>> Is this expected behavior or do I miss something?
>>
>> Looks like a bug - please file a bugreport.
>
> Try
>
> Index: gcc/tree-predcom.c
> ===================================================================
> --- gcc/tree-predcom.c (revision 236159)
> +++ gcc/tree-predcom.c (working copy)
> @@ -1391,9 +1395,10 @@ ref_at_iteration (data_reference_p dr, i
> && DECL_BIT_FIELD (TREE_OPERAND (DR_REF (dr), 1)))
> {
> tree field = TREE_OPERAND (DR_REF (dr), 1);
> + tree type = build_aligned_type (DECL_BIT_FIELD_TYPE (field),
> + BITS_PER_UNIT);
> return build3 (BIT_FIELD_REF, TREE_TYPE (DR_REF (dr)),
> - build2 (MEM_REF, DECL_BIT_FIELD_TYPE (field),
> - addr, alias_ptr),
> + build2 (MEM_REF, type, addr, alias_ptr),
> DECL_SIZE (field), bitsize_zero_node);
> }
> else
>
>
> Richard.
>
>> Richard.
>>
>>> Thank you,
>>> Claudiu
It looks better. For ARC I need to optimize this type of access as it
uses three loads, and it can do with two. Anyhow the bug id is: 71083
Thank you,
Claudiu
More information about the Gcc
mailing list