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

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Schrodinger ZHU Yifan from comment #2)
> (In reply to Richard Biener from comment #1)
> > The 'GIMPLE' doesn't look like GIMPLE.  
> 
> The GIMPLE is the unmodified GIMPLE obtained from GCCJIT’s
> dump_initial_gimple option. The variable name such %x are just named using
> unmangled special character direction from upper level language.
> 
> > What is bitcast()?
> 
> It is obtained via gcc_jit_context_new_bitcast API.

I see.

> > Can you show the
> > -fdump-tree-X-gimple output with 'X' being the point after GIMPLE 
> > generation?
> 
> Not sure I can pass that as a driver argument or not but I can try playing
> with it and also other gimple dumping options provided by gccjit.

It looks like the dump_initial_gimple doesn't dump GIMPLE as "replayed",
but some internal JIT IL?  I see playback::context::new_bitcast will
turn it into a VIEW_CONVERT_EXPR.  It's also not clear what in the JITs
IL is a register and what an aggregate.

In particular

  %5 = %4.A:17;
  %6 = %4.B:5;
  %7 = %4.C:10;
  %8 = %5 == %1;

on GIMPLE you'd have %5 a int:17 but %1 is int, so the comparison would
compare two incompatible things.  That means

            %5 = gccjit.access_field %4[0] : !bitfields -> !int

is possibly wrong on your side and you'd need a promotion to int unless
the JIT does C promotion rules here?

The C program

struct Int
{
  int A:17;
  int B:5;
  int C:10;
};

void foo (int arg0, int arg1, int arg2, int arg3)
{
  struct Int I;
  I = *(struct Int *)&arg0;
  if (I.A == arg1 && I.B == arg2 && I.C == arg3)
    return;
  __builtin_trap ();
}

is compiled to GIMPLE

  __BB(2):
  _1 = &arg0;
  I = __MEM <struct Int> ((struct Int *)_1);
  _2 = I.A;
  _3 = (int) _2;
  if (arg1 == _3)
    goto __BB3;
  else
    goto __BB6;

  __BB(3):
  _4 = I.B;
  _5 = (int) _4;
  if (arg2 == _5)
    goto __BB4;
  else
    goto __BB6;

  __BB(4):
  _6 = I.C;
  _7 = (int) _6;
  if (arg3 == _7)
    goto __BB5;
  else
    goto __BB6;

  __BB(5):
  // predicted unlikely by early return (on trees) predictor.
  I = _Literal (struct Int) {CLOBBER(eos)};
  return;

Reply via email to