1 /* { dg-do run }  */
2 /* { dg-options -O2 }  */
3 
4 extern void abort (void);
5 extern void link_error (void);
6 
7 int
foo_div(int i,int j)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
foo_mult(int i,int j)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
main()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 }
261