On Fri, Apr 4, 2025 at 3:35 PM Richard Biener
<richard.guent...@gmail.com> wrote:
>
> On Fri, Apr 4, 2025 at 3:06 PM Robert Dubner <rdub...@symas.com> wrote:
> >
> > This program exhibits the behavior when compiled with -O2, -O3 and -OS
> >
> >         PROGRAM-ID.      PROG.
> >         PROCEDURE        DIVISION.
> >         MOVE 1 TO RETURN-CODE
> >         STOP RUN.
>
> Hmm, the call to exit() is still in the program.
>
>    0x000000000040114a <-358>:   movswl 0x250f(%rip),%edi        #
> 0x403660 <__gg__data_return_code>
>    0x0000000000401151 <-351>:   mov    %dx,(%rax)
> => 0x0000000000401154 <-348>:   call   0x4010b0 <exit@plt>
>
> $edi is 0 here.  It looks like the store to __gg__data_return_code via
> the move to (%rax)
> and the load from it got interchanged due to aliasing issues possibly.
>
> It works when compiling with -O2 -fno-strict-aliasing, so apparently
> your override
> which you said was present does not work.  I can't find it, after all.
>
> You want to implement the LANG_HOOKS_POST_OPTIONS hook and
> do
>
>     flag_strict_aliasing = 0;
>
> therein.

Oh, and the actual problem is of course

  *(unsigned short *) (__gg___11_return_code6.data + (unsigned long)
((sizetype) D.260 * 1)) = D.259;
  ..pssr_retval = (signed int) __gg__data_return_code;

where __gg__data_return_code is a global variable but
__gg___11_return_code6 is something
weird of type cblc_field_type_node and I nowhere see the .data field
of it stored to (but it maybe is,
via pointer arithmetic again - who knows - it's not mentioned anywhere
else in the .original dump,
so it's likely coming from libgcobol?  So is __gg__data_return_code it seems.

OK, so you are storing a short but reading from a unsigned char
declaration.  Since the
declaration __gg__data_return_code is just 1 byte the 2-byte store
cannot possibly alias it.

Richard.

> Richard.
>
> >
> > > -----Original Message-----
> > > From: Richard Biener <richard.guent...@gmail.com>
> > > Sent: Friday, April 4, 2025 03:02
> > > To: Robert Dubner <rdub...@symas.com>
> > > Cc: GCC Mailing List <gcc@gcc.gnu.org>
> > > Subject: Re: COBOL: Call to builtin_decl_explicit (BUILT_IN_EXIT), is
> > > optimized away.
> > >
> > > On Fri, Apr 4, 2025 at 12:17 AM Robert Dubner <rdub...@symas.com> wrote:
> > > >
> > > > The COBOL compiler has this routine:
> > > >
> > > > void
> > > > gg_exit(tree exit_code)
> > > >   {
> > > >   tree the_call =
> > > >       build_call_expr_loc(location_from_lineno(),
> > > >                           builtin_decl_explicit (BUILT_IN_EXIT),
> > > >                           1,
> > > >                           exit_code);
> > > >   gg_append_statement(the_call);
> > > >   }
> > > >
> > > > I have found that when GCOBOL is used with -O2, -O3, or -Os, the call to
> > > > gg_exit() is optimized away, and the intended exit value is lost, and I
> > > > end up with zero.
> > > >
> > > > By changing the routine to
> > > >
> > > > void
> > > > gg_exit(tree exit_code)
> > > >   {
> > > >   tree args[1] = {exit_code};
> > > >   tree function = gg_get_function_address(INT, "exit");
> > > >   tree the_call = build_call_array_loc (location_from_lineno(),
> > > >                                         VOID,
> > > >                                         function,
> > > >                                         1,
> > > >                                         args);
> > > >   gg_append_statement(the_call);
> > > >   }
> > > >
> > > > the call is not optimized away, and the generated executable behaves as
> > > > expected.
> > > >
> > > > How do I prevent the call to gg_exit() from being optimized away?
> > >
> > > I don't see anything wrong here, so the issue must be elsewhere.
> > > Do you have a COBOL testcase that shows the exit() being optimized?
> > >
> > > >
> > > > Thanks!
> > > >

Reply via email to