/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-dse1 -Wno-psabi" } */

typedef int v4si __attribute__((vector_size(16)));

/* Generic */
__attribute__((noipa)) int 
t1 (int a, int b)
{
  return (~a | b) ^ a;
}

__attribute__((noipa)) unsigned int 
t2 (int a, int b)
{
  return a ^ (~a | (unsigned int) b);
}

__attribute__((noipa)) signed char
t3 (signed char a, signed char b)
{
  return (b | ~a) ^ a;
}

__attribute__((noipa)) unsigned char
t4 (signed char a, signed char b)
{
  return ((unsigned char) a) ^ (b | ~a);
}

__attribute__((noipa)) short
t5 (short a, short b)
{
  return a ^ (b | ~a);
}

__attribute__((noipa)) unsigned short
t6 (short a, short b)
{
  return ((unsigned short) a) ^ (b | ~a);
}

__attribute__((noipa)) long
t7 (long a, long b)
{
  return a ^ (b | ~a);
}

__attribute__((noipa)) unsigned long
t8 (long a, long b)
{
  return ((unsigned long) a) ^ (b | ~a);
}

__attribute__((noipa)) long long
t9 (long long a, long long b)
{
  return a ^ (b | ~a);
}

__attribute__((noipa)) unsigned long long
t10 (long long a, long long b)
{
  return ((unsigned long long) a) ^ (b | ~a);
}

__attribute__((noipa)) v4si
t21 (v4si a, v4si b)
{
  return a ^ (b | ~a);
}

/* Gimple */
__attribute__((noipa)) int 
t11 (int a, int b)
{
  int t1 = ~a;
  int t2 = t1 | b;
  int t3 = t2 ^ a;
  return t3;
}

__attribute__((noipa)) unsigned int
t12 (int a, unsigned int b)
{
  int t1 = ~a;
  unsigned int t2 = t1 | b;
  unsigned int t3 = a ^ t2;
  return t3;
}

__attribute__((noipa)) signed char
t13 (signed char a, signed char b)
{
  signed char t1 = ~a;
  signed char t2 = b | t1;
  signed char t3 = t2 ^ a;
  return t3;
}

__attribute__((noipa)) unsigned char
t14 (unsigned char a, signed char b)
{
  unsigned char t1 = ~a;
  signed char t2 = b | t1;
  unsigned char t3 = a ^ t2;
  return t3;
}

__attribute__((noipa)) short 
t15 (short a, short b)
{
  short t1 = ~a;
  short t2 = t1 | b;
  short t3 = t2 ^ a;
  return t3;
}

__attribute__((noipa)) unsigned short 
t16 (unsigned short a, short b)
{
  short t1 = ~a;
  short t2 = t1 | b;
  unsigned short t3 = t2 ^ a;
  return t3;
}

__attribute__((noipa)) long 
t17 (long a, long b)
{
  long t1 = ~a;
  long t2 = t1 | b;
  long t3 = t2 ^ a;
  return t3;
}

__attribute__((noipa)) unsigned long 
t18 (long a, unsigned long b)
{
  long t1 = ~a;
  unsigned long t2 = t1 | b;
  unsigned long t3 = t2 ^ a;
  return t3;
}

__attribute__((noipa)) long long 
t19 (long long a, long long b)
{
  long long t1 = ~a;
  long long t2 = t1 | b;
  long long t3 = t2 ^ a;
  return t3;
}

__attribute__((noipa)) unsigned long long 
t20 (long long a, long long b)
{
  long long t1 = ~a;
  long long t2 = t1 | b;
  unsigned long long t3 = a ^ t2;
  return t3;
}

__attribute__((noipa)) v4si
t22 (v4si a, v4si b)
{
  v4si t1 = ~a;
  v4si t2 = t1 | b;
  v4si t3 = a ^ t2;
  return t3;
}

/* { dg-final { scan-tree-dump-not " \\\| " "dse1" } } */
/* { dg-final { scan-tree-dump-not " \\\^ " "dse1" } } */
/* { dg-final { scan-tree-dump-times " ~" 22 "dse1" } } */
/* { dg-final { scan-tree-dump-times " & " 22 "dse1" } } */