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

            Bug ID: 117423
           Summary: union not written to with particular layout
           Product: gcc
           Version: 14.2.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tpg+gcc at mutabah dot net
  Target Milestone: ---

Created attachment 59524
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=59524&action=edit
Preprocessed output of reproduction (2-20241102-TimeCodegenError.i) from
12.3.0-1ubuntu1~22.04

Found on ubuntu using 11.4.0-1ubuntu1~22.04, reproduced using
12.3.0-1ubuntu1~22.04, and then checked using godbolt to be present from 10.0
up to (latest) 14.2, but NOT on 9.5

Seen while debugging auto-generated code. When optimisations are enabled, a
particular union field isn't assigned - leading to use of uninitialised memory.

For the below code snippet (full source attached) the write of `var7` to
`rv.DATA.var_0._0` is not present in the final executable (as demonstrated by
the disassembly - and a runtime assertion failure).

>From my testing, the intermediate variable `var7` needs to exist, it needs to
be in a conditional branch, and the layout of the output union needs to have a
specific pattern.

```
#include <stdint.h>
#include <assert.h>

struct s_ZRG2cE18time0_3_29_H40000d4date4Date0g  {
        // /*@0*/struct s_ZRG3cE9core0_0_03num7nonzero10NonZeroI320g _0; //
::"core-0_0_0"::num::nonzero::NonZeroI32/*S*/
        /*@0*/int32_t _0; // i32
} ;

struct
s_ZRG2cE9core0_0_06resultG9ResultErr2gG2cE18time0_3_29_H40000d4date4Date0gG3c_D5error15component_range14ComponentRange0g
 {
        /*@0*/uint8_t _4; // bool
        /*@8*/int64_t _1; // i64
} ;

struct
e_ZRG2cE9core0_0_06result6Result2gG2cE18time0_3_29_H40000d4date4Date0gG3c_D5error15component_range14ComponentRange0g
{
        union { 
                struct
s_ZRG2cE9core0_0_06resultG8ResultOk2gG2cE18time0_3_29_H40000d4date4Date0gG3c_D5error15component_range14ComponentRange0g
 {
                        /*@0*/uint8_t _1; // u8
                        /*@4*/struct s_ZRG2cE18time0_3_29_H40000d4date4Date0g
_0; // Required!
                } var_0;
                struct
s_ZRG2cE9core0_0_06resultG9ResultErr2gG2cE18time0_3_29_H40000d4date4Date0gG3c_D5error15component_range14ComponentRange0g
var_1;
        } DATA;
};

__attribute__ ((noinline)) int
ZRIG2cI17deranged0_3_8_H8110ranged_i329RangedI320v2gV4_0989e2ffV4_2cfe51003new0g_OP(int32_t
arg0);
//{ return arg0 > 12345; }

struct s_ZRG2cE18time0_3_29_H40000d4date4Date0g 
ZRIG2cE18time0_3_29_H40000d4date4Date0g25from_julian_day_unchecked0g(int32_t
arg0);
//{ struct s_ZRG2cE18time0_3_29_H40000d4date4Date0g rv = { arg0 }; return rv; }

// <::"time-0_3_29_H40000d"::date::Date/*S*/ /*- */>::from_julian_day
struct
e_ZRG2cE9core0_0_06result6Result2gG2cE18time0_3_29_H40000d4date4Date0gG3c_D5error15component_range14ComponentRange0g
 ZRIG2cE18time0_3_29_H40000d4date4Date0g15from_julian_day0g(
                int32_t arg0 // i32
                ) // ->
::"core-0_0_0"::result::Result<::"time-0_3_29_H40000d"::date::Date/*S*/,::"time-0_3_29_H40000d"::error::component_range::ComponentRange/*S*/,>/*E*/

{
        struct
e_ZRG2cE9core0_0_06result6Result2gG2cE18time0_3_29_H40000d4date4Date0gG3c_D5error15component_range14ComponentRange0g
rv;
        struct
s_ZRG2cE9core0_0_06resultG9ResultErr2gG2cE18time0_3_29_H40000d4date4Date0gG3c_D5error15component_range14ComponentRange0g
var6 = {0};
        struct s_ZRG2cE18time0_3_29_H40000d4date4Date0g var7;

        if(
ZRIG2cI17deranged0_3_8_H8110ranged_i329RangedI320v2gV4_0989e2ffV4_2cfe51003new0g_OP(arg0)
) {
                rv.DATA.var_1 = var6;
                return rv;
        }
        else {  
                rv.DATA.var_0._1 = 2;
                // Intermetdiate variable needed.
                var7 =
ZRIG2cE18time0_3_29_H40000d4date4Date0g25from_julian_day_unchecked0g( arg0 );
                rv.DATA.var_0._0 = var7;
                return rv;
        }
}
```

```
000000000000115e <ZRIG2cE18time0_3_29_H40000d4date4Date0g15from_julian_day0g>:
    115e:       f3 0f 1e fa             endbr64
    1162:       53                      push   %rbx
    1163:       89 fb                   mov    %edi,%ebx
    1165:       e8 df ff ff ff          call   1149
<ZRIG2cI17deranged0_3_8_H8110ranged_i329RangedI320v2gV4_0989e2ffV4_2cfe51003new0g_OP>
    116a:       ba 00 00 00 00          mov    $0x0,%edx
    116f:       84 c0                   test   %al,%al
    1171:       74 0e                   je     1181
<ZRIG2cE18time0_3_29_H40000d4date4Date0g15from_julian_day0g+0x23>
    1173:       b8 00 00 00 00          mov    $0x0,%eax
    1178:       88 d0                   mov    %dl,%al
    117a:       ba 00 00 00 00          mov    $0x0,%edx
    117f:       5b                      pop    %rbx
    1180:       c3                      ret    
    1181:       89 df                   mov    %ebx,%edi
    1183:       e8 cf ff ff ff          call   1157
<ZRIG2cE18time0_3_29_H40000d4date4Date0g25from_julian_day_unchecked0g>
    1188:       ba 02 00 00 00          mov    $0x2,%edx
    118d:       eb e4                   jmp    1173
<ZRIG2cE18time0_3_29_H40000d4date4Date0g15from_julian_day0g+0x15>
```

Reply via email to