/* In this snippet, there was a missed subc case:
	tst	#1,r0
	movt	r0
	neg	r0,r0

   which should be:
	tst	#1,r0
	subc	r0,r0
*/

/* { dg-do compile }  */
/* { dg-options "-O2" }  */

/* { dg-final { scan-assembler-times {tst	#1,r0} 1 } }  */
/* { dg-final { scan-assembler-times {subc	r} 1 } }  */

/* { dg-final { scan-assembler-not "movt|not\t|neg\t|movrt" } }  */


struct inode
{
  unsigned int i_gid;
};

struct iattr
{
  unsigned int ia_valid;
  unsigned int ia_gid;
};

struct task_struct
{
  unsigned long flags;
  unsigned int cap_effective;
};

extern int in_group_p (unsigned int);

static inline struct task_struct*
get_current (void)
{
  struct task_struct *current;
  return current;
}

static inline int
capable (int cap)
{
  if (((get_current()->cap_effective) & (1 << (cap))))
    {
      get_current()->flags |= 0x00000100;
      return 1;
    }
  return 0;
}

int
inode_change_ok (struct inode *inode, struct iattr *attr)
{
  int retval = -1;
  unsigned int ia_valid = attr->ia_valid;

  if (ia_valid & 512)
    goto fine;

  if ((ia_valid & 4)
      && (!in_group_p(attr->ia_gid) && attr->ia_gid != inode->i_gid)
      && !capable(0))
    goto error;

fine:
 retval = 0;
error:
 return retval;
}