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

            Bug ID: 79002
           Summary: Weird c++ assembly code generated for tail call
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vogt at linux dot vnet.ibm.com
  Target Milestone: ---
            Target: s390x

G++ (r244001) generates some pretty weird assembly code on s390x for this test
case.  (Note that j is not initialised and I couldn't find a variant of this
test case where it is).

-- test.C --
int g;
unsigned char *p;
void r1()
{
  int i;
  int j;
  i = *p;
  if (j <= g || (i) != 1) // <---- note: parentheses around (i)
    r1();
}
------------

$ gcc -O3 -march=z10 -mzarch -m64 -S test.C
$ cat test.s

--
_Z2r1v:
        lgrl    %r2,p      <-- r2 := &p
        lrl     %r1,g      <-- r1 := &g
        llc     %r2,0(%r2) <-- r2 := *r2
.L5:
        cijlh   %r2,1,.L2  <-- compare with immediate and jump if !=
.L4:
        cijhe   %r1,0,.L11 <-- ... if >=
.L1:
        br      %r14
.L11:
        cijl    %r1,0,.L1  <-- ... if <
        cijl    %r1,0,.L1
        cijhe   %r1,0,.L4
        br      %r14
.L2:
        cijl    %r1,0,.L5
        cijl    %r1,0,.L5
        j       .L2
--

If the parentheses are removed from "(i)", the result is sane:

  ...
  if (j <= g || i != 1) // <---- note: no parentheses around i
  ...

--
_Z2r1v:
        lgrl    %r2,p
        lrl     %r1,g
        llc     %r2,0(%r2)
.L2:
        cijhe   %r1,0,.L2
        cijlh   %r2,1,.L2
        br      %r14
--

Not tested on other targets, but to me it looks like a general C++ problem
(does not happen with the C compiler, at least not with this test case).  While
the generated code is valid, this effect makes reducing test cases from the
Spec2006 suite harder (there are variants of the code that result in even more
unnecessary labels and assembly code).  It might be possible to trigger this
without relying on undefined variables.

Reply via email to