1  /* Setting LOGICAL_OP_NON_SHORT_CIRCUIT to 0 inhibits the setcc
       2     optimizations that expose the VRP opportunity.  */
       3  /* { dg-do compile } */
       4  /* { dg-options "-O2 -fdump-tree-vrp1 -fdump-tree-dom2 -fdump-tree-vrp2 --param logical-op-non-short-circuit=1" } */
       5  /* { dg-additional-options "-march=i586" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
       6  
       7  int h(int x, int y)
       8  {
       9    if ((x >= 0 && x <= 1) && (y >= 0 && y <= 1))
      10      return x && y;
      11    else
      12      return -1;
      13  }
      14  
      15  int g(int x, int y)
      16  {
      17    if ((x >= 0 && x <= 1) && (y >= 0 && y <= 1))
      18      return x || y;
      19    else
      20      return -1;
      21  }
      22  
      23  int f(int x)
      24  {
      25    if (x != 0 && x != 1)
      26      return -2;
      27  
      28    else
      29      return !x;
      30  }
      31  
      32  /* Test that x and y are never compared to 0 -- they're always known to be
      33     0 or 1.  */
      34  /* { dg-final { scan-tree-dump-times "\[xy\]\[^ \]* !=" 0 "vrp1" } } */
      35  
      36  /* These two are fully simplified by VRP1.  */
      37  /* { dg-final { scan-tree-dump-times "x\[^ \]* \[|\] y" 1 "vrp1" } } */
      38  /* { dg-final { scan-tree-dump-times "x\[^ \]* \\^ 1" 1 "vrp1" } } */
      39  
      40  /* VRP2 gets rid of the remaining & 1 operations, x and y are always
      41     either 0 or 1.  */
      42  /* { dg-final { scan-tree-dump-times " & 1;" 0 "vrp2" } } */
      43