/* PR tree-optimization/111015 */
/* { dg-do run { target int128 } } */
/* { dg-options "-O2" } */

struct S { unsigned a : 4, b : 4; unsigned __int128 c : 70; } d;

__attribute__((noipa)) void
foo (unsigned __int128 x, unsigned char y, unsigned char z)
{
  d.a = y;
  d.b = z;
  d.c = x;
}

int
main ()
{
  foo (-1, 12, 5);
  if (d.a != 12
      || d.b != 5
      || d.c != (-1ULL | (((unsigned __int128) 0x3f) << 64)))
    __builtin_abort ();
  foo (0x123456789abcdef0ULL | (((unsigned __int128) 26) << 64), 7, 11);
  if (d.a != 7
      || d.b != 11
      || d.c != (0x123456789abcdef0ULL | (((unsigned __int128) 26) << 64)))
    __builtin_abort ();
}