public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug middle-end/94387] New: Excess read instructions are generated in case of writing to fields of volatile + packed type (structure)
@ 2020-03-29 14:23 petro.karashchenko at gmail dot com
  2020-03-29 14:28 ` [Bug middle-end/94387] " petro.karashchenko at gmail dot com
                   ` (6 more replies)
  0 siblings, 7 replies; 8+ messages in thread
From: petro.karashchenko at gmail dot com @ 2020-03-29 14:23 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94387

            Bug ID: 94387
           Summary: Excess read instructions are generated in case of
                    writing to fields of volatile + packed type
                    (structure)
           Product: gcc
           Version: 9.3.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: petro.karashchenko at gmail dot com
  Target Milestone: ---

Created attachment 48140
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=48140&action=edit
preprocessed file

Excess read instructions are generated when access members of volatile + packed
types (structures):
test.c:
----------
#include <stdint.h>

typedef volatile struct type1_s {
    uint32_t a1;
    uint8_t a2;
    uint8_t a3;
    uint8_t a4;
    uint8_t a5;
} __attribute__((packed)) type1_t;

typedef volatile struct {
    uint32_t b1;
    uint32_t b2;
} __attribute__((packed)) type2_t;

typedef volatile struct type3_s {
    type1_t h1;
    volatile union {
        uint8_t b[24];
        type2_t c1;
    } __attribute__((packed)) h2;
} __attribute__((packed)) type3_t;

typedef volatile struct type4_s {
    uint32_t x1;
    uint8_t x2;
    uint16_t x3;
    uint8_t x4;
    uint8_t x5;
    uint8_t x6;
} __attribute__((packed)) type4_t;

static void my_func2(type3_t *p0, type4_t *p1) ;

int my_func1(uint8_t *p0, uint8_t *p1)
{
    type3_t *i = (type3_t *)p0;
    type4_t *o = (type4_t *)p1;

    my_func2(i, o);

    return 0;
}

static void my_func2(type3_t *p0, type4_t *p1)
{
    p1->x1 = 0xFFFFFF01;
    p1->x6 = 1;
    p1->x2 = 2;
    p1->x4 = p0->h1.a3;
    p1->x5 = p0->h1.a4;
    p1->x3 = 0;
}
----------
arceb-elf32-gcc -save-temps -Wall -Wextra -c -mcpu=arc600 -mtune=arc600
-mbig-endian -mmul64 test.c -Os
----------
Disassembly:
        .global my_func1
        .type   my_func1, @function
my_func1:
        ldb_s r2,[r1]
        mov     r2,-1   ;6
        stb_s r2,[r1]
        ldb_s r3,[r1,1]
        stb_s r2,[r1,1]
        ldb_s r3,[r1,2]
        stb_s r2,[r1,2]
        ldb_s r2,[r1,3]
        mov_s   r3,1    ;0
        stb_s r3,[r1,3]
        stb_s r3,[r1,9]
        mov_s r3,2
        stb_s r3,[r1,4]
        ldb_s r3,[r0,5]
        mov_s   r2,0    ;0
        stb_s r3,[r1,7]
        ldb_s r0,[r0,6]
        stb_s r0,[r1,8]
        ldb_s r0,[r1,5]
        stb_s r2,[r1,5]
        ldb_s r0,[r1,6]
        stb_s r2,[r1,6]
        mov_s   r0,0    ;0
        j_s     [blink]
        .size   my_func1, .-my_func1
----------
Expected disassembly:
        .global my_func1
        .type   my_func1, @function
my_func1:
        mov     r2,-1   ;6
        stb_s r2,[r1]
        stb_s r2,[r1,1]
        stb_s r2,[r1,2]
        mov_s   r3,1    ;0
        stb_s r3,[r1,3]
        stb_s r3,[r1,9]
        mov_s r3,2
        stb_s r3,[r1,4]
        ldb_s r3,[r0,5]
        mov_s   r2,0    ;0
        stb_s r3,[r1,7]
        ldb_s r0,[r0,6]
        stb_s r0,[r1,8]
        stb_s r2,[r1,5]
        stb_s r2,[r1,6]
        mov_s   r0,0    ;0
        j_s     [blink]
        .size   my_func1, .-my_func1
----------
I have checked same code compilation with:
arm-none-eabi-gcc -save-temps -Wall -Wextra -c -mcpu=arm7tdmi -mthumb test.c
-Os
The result is pretty much the same, so it is not architecture dependent bug.

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2020-04-19 20:16 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-03-29 14:23 [Bug middle-end/94387] New: Excess read instructions are generated in case of writing to fields of volatile + packed type (structure) petro.karashchenko at gmail dot com
2020-03-29 14:28 ` [Bug middle-end/94387] " petro.karashchenko at gmail dot com
2020-03-29 22:41 ` pinskia at gcc dot gnu.org
2020-03-29 22:43 ` pinskia at gcc dot gnu.org
2020-03-30  5:44 ` petro.karashchenko at gmail dot com
2020-03-30  8:17 ` rguenth at gcc dot gnu.org
2020-03-30  8:44 ` petro.karashchenko at gmail dot com
2020-04-19 20:16 ` petro.karashchenko at gmail dot com

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).