1  /* { dg-do run }  */
       2  /* { dg-options -O2 }  */
       3  
       4  extern void abort (void);
       5  extern void link_error (void);
       6  
       7  int
       8  foo_div (int i, int j)
       9  {
      10    int k;
      11  
      12    /* [-INF, -1] / [1, +INF] should not give [-1, -1].  */
      13    if (i <= -1)
      14      if (j >= 1)
      15        {
      16  	k = i / j;
      17  	if (k == -1)
      18  	  abort ();
      19  
      20  	return k;
      21        }
      22  
      23    /* [-20, -10] / [2, 10] should give [-10, -1].  */
      24    if (i >= -20)
      25      if (i <= -10)
      26        if (j >= 2)
      27  	if (j <= 10)
      28  	  {
      29  	    k = i / j;
      30  	    if (k < -10)
      31  	      link_error ();
      32  	    if (k > -1)
      33  	      link_error ();
      34  
      35  	    return k;
      36  	  }
      37  
      38    /* [-20, -10] / [-10, -2] should give [1, 10].  */
      39    if (i >= -20)
      40      if (i <= -10)
      41        if (j >= -10)
      42  	if (j <= -2)
      43  	  {
      44  	    k = i / j;
      45  	    if (k < 1)
      46  	      link_error ();
      47  	    if (k > 10)
      48  	      link_error ();
      49  
      50  	    return k;
      51  	  }
      52  
      53    /* [-20, 10] / [2, 10] should give [-10, 5].  */
      54    if (i >= -20)
      55      if (i <= 10)
      56        if (j >= 2)
      57  	if (j <= 10)
      58  	  {
      59  	    k = i / j;
      60  	    if (k < -10)
      61  	      link_error ();
      62  	    if (k > 5)
      63  	      link_error ();
      64  
      65  	    return k;
      66  	  }
      67  
      68    /* [-20, 10] / [-10, -2] should give [-5, 10].  */
      69    if (i >= -20)
      70      if (i <= 10)
      71        if (j >= -10)
      72  	if (j <= -2)
      73  	  {
      74  	    k = i / j;
      75  	    if (k < -5)
      76  	      link_error ();
      77  	    if (k > 10)
      78  	      link_error ();
      79  
      80  	    return k;
      81  	  }
      82  
      83    /* [10, 20] / [2, 10] should give [1, 10].  */
      84    if (i >= 10)
      85      if (i <= 20)
      86        if (j >= 2)
      87  	if (j <= 10)
      88  	  {
      89  	    k = i / j;
      90  	    if (k < 1)
      91  	      link_error ();
      92  	    if (k > 10)
      93  	      link_error ();
      94  
      95  	    return k;
      96  	  }
      97  
      98    /* [10, 20] / [-10, -2] should give [-10, -1].  */
      99    if (i >= 10)
     100      if (i <= 20)
     101        if (j >= -10)
     102  	if (j <= -2)
     103  	  {
     104  	    k = i / j;
     105  	    if (k > -1)
     106  	      link_error ();
     107  	    if (k < -10)
     108  	      link_error ();
     109  
     110  	    return k;
     111  	  }
     112  
     113    abort ();
     114  }
     115  
     116  int
     117  foo_mult (int i, int j)
     118  {
     119    int k;
     120  
     121    /* [-20, -10] * [2, 10] should give [-200, -20].  */
     122    if (i >= -20)
     123      if (i <= -10)
     124        if (j >= 2)
     125  	if (j <= 10)
     126  	  {
     127  	    k = i * j;
     128  	    if (k < -200)
     129  	      link_error ();
     130  	    if (k > -20)
     131  	      link_error ();
     132  
     133  	    return k;
     134  	  }
     135  
     136    /* [-20, -10] * [-10, -2] should give [20, 200].  */
     137    if (i >= -20)
     138      if (i <= -10)
     139        if (j >= -10)
     140  	if (j <= -2)
     141  	  {
     142  	    k = i * j;
     143  	    if (k < 20)
     144  	      link_error ();
     145  	    if (k > 200)
     146  	      link_error ();
     147  
     148  	    return k;
     149  	  }
     150  
     151    /* [-20, 10] * [2, 10] should give [-200, 100].  */
     152    if (i >= -20)
     153      if (i <= 10)
     154        if (j >= 2)
     155  	if (j <= 10)
     156  	  {
     157  	    k = i * j;
     158  	    if (k < -200)
     159  	      link_error ();
     160  	    if (k > 100)
     161  	      link_error ();
     162  
     163  	    return k;
     164  	  }
     165  
     166    /* [-20, 10] * [-10, -2] should give [-100, 200].  */
     167    if (i >= -20)
     168      if (i <= 10)
     169        if (j >= -10)
     170  	if (j <= -2)
     171  	  {
     172  	    k = i * j;
     173  	    if (k < -100)
     174  	      link_error ();
     175  	    if (k > 200)
     176  	      link_error ();
     177  
     178  	    return k;
     179  	  }
     180  
     181    /* [10, 20] * [2, 10] should give [20, 200].  */
     182    if (i >= 10)
     183      if (i <= 20)
     184        if (j >= 2)
     185  	if (j <= 10)
     186  	  {
     187  	    k = i * j;
     188  	    if (k < 20)
     189  	      link_error ();
     190  	    if (k > 200)
     191  	      link_error ();
     192  
     193  	    return k;
     194  	  }
     195  
     196    /* [10, 20] * [-10, -2] should give [-200, -20].  */
     197    if (i >= 10)
     198      if (i <= 20)
     199        if (j >= -10)
     200  	if (j <= -2)
     201  	  {
     202  	    k = i * j;
     203  	    if (k < -200)
     204  	      link_error ();
     205  	    if (k > -20)
     206  	      link_error ();
     207  
     208  	    return k;
     209  	  }
     210  
     211    abort ();
     212  }
     213  
     214  int
     215  main()
     216  {
     217    if (foo_div (-10, 5) != -2)
     218      abort ();
     219  
     220    if (foo_div (-16, 4) != -4)
     221      abort ();
     222  
     223    if (foo_div (-15, -5) != 3)
     224      abort ();
     225  
     226    if (foo_div (8, 2) != 4)
     227      abort ();
     228  
     229    if (foo_div (10, -2) != -5)
     230      abort ();
     231  
     232    if (foo_div (20, 5) != 4)
     233      abort ();
     234  
     235    if (foo_div (15, -3) != -5)
     236      abort ();
     237  
     238    if (foo_mult (-10, 5) != -50)
     239      abort ();
     240  
     241    if (foo_mult (-16, 4) != -64)
     242      abort ();
     243  
     244    if (foo_mult (-15, -5) != 75)
     245      abort ();
     246  
     247    if (foo_mult (8, 2) != 16)
     248      abort ();
     249  
     250    if (foo_mult (10, -2) != -20)
     251      abort ();
     252  
     253    if (foo_mult (20, 5) != 100)
     254      abort ();
     255  
     256    if (foo_mult (15, -3) != -45)
     257      abort ();
     258  
     259    return 0;
     260  }