1/* Copyright (C) 2003 Free Software Foundation. 2 3 Verify that built-in math function constant folding doesn't break 4 anything and produces the expected results. 5 6 Written by Roger Sayle, 8th June 2003. */ 7 8/* { dg-do link } */ 9/* { dg-options "-O2 -ffast-math" } */ 10/* { dg-add-options c99_runtime } */ 11 12#include "builtins-config.h" 13 14extern double cos (double); 15extern double sin (double); 16extern double tan (double); 17extern double fabs (double); 18extern double atan2 (double, double); 19extern double copysign (double, double); 20extern double fmin (double, double); 21extern double fmax (double, double); 22extern double hypot (double, double); 23extern double pure (double) __attribute__ ((__pure__)); 24extern double carg (__complex__ double); 25extern __complex__ double ccos (__complex__ double); 26extern __complex__ double ctan (__complex__ double); 27extern float cosf (float); 28extern float sinf (float); 29extern float tanf (float); 30extern float fabsf (float); 31extern float atan2f (float, float); 32extern float copysignf (float, float); 33extern float fminf (float, float); 34extern float fmaxf (float, float); 35extern float hypotf (float, float); 36extern float puref (float) __attribute__ ((__pure__)); 37extern float cargf (__complex__ float); 38extern __complex__ float ccosf (__complex__ float); 39extern __complex__ float ctanf (__complex__ float); 40extern long double cosl (long double); 41extern long double sinl (long double); 42extern long double tanl (long double); 43extern long double fabsl (long double); 44extern long double atan2l (long double, long double); 45extern long double copysignl (long double, long double); 46extern long double fminl (long double, long double); 47extern long double fmaxl (long double, long double); 48extern long double hypotl (long double, long double); 49extern long double purel (long double) __attribute__ ((__pure__)); 50extern long double cargl (__complex__ long double); 51extern __complex__ long double ccosl (__complex__ long double); 52extern __complex__ long double ctanl (__complex__ long double); 53 54extern void link_error(void); 55 56void test1(double x) 57{ 58 if (cos(x) != cos(-x)) 59 link_error (); 60 61 if (cos(x) != cos(fabs(x))) 62 link_error (); 63 64 if (cos(x) != cos(-fabs(x))) 65 link_error (); 66 67 if (cos(tan(x)) != cos(tan(-fabs(x)))) 68 link_error (); 69 70 if (sin(x)/cos(x) != tan(x)) 71 link_error (); 72 73 if (cos(x)/sin(x) != 1.0/tan(x)) 74 link_error (); 75 76 if (tan(x)*cos(x) != sin(x)) 77 link_error (); 78 79 if (cos(x)*tan(x) != sin(x)) 80 link_error (); 81 82 if (sin(x)/tan(x) != cos(x)) 83 link_error (); 84 85 if (tan(x)/sin(x) != 1.0/cos(x)) 86 link_error (); 87} 88 89void test2(double x, double y) 90{ 91 if (-tan(x-y) != tan(y-x)) 92 link_error (); 93 94 if (-sin(x-y) != sin(y-x)) 95 link_error (); 96 97 if (cos(-x*y) != cos(x*y)) 98 link_error (); 99 100 if (cos(x*-y) != cos(x*y)) 101 link_error (); 102 103 if (cos(-x/y) != cos(x/y)) 104 link_error (); 105 106 if (cos(x/-y) != cos(x/y)) 107 link_error (); 108 109 if (cos(-fabs(tan(x/-y))) != cos(tan(x/y))) 110 link_error (); 111 112 if (cos(y<10 ? -x : y) != cos(y<10 ? x : y)) 113 link_error (); 114 115 if (cos(y<10 ? x : -y) != cos(y<10 ? x : y)) 116 link_error (); 117 118 if (cos(y<10 ? -fabs(x) : tan(x<20 ? -x : -fabs(y))) 119 != cos(y<10 ? x : tan(x<20 ? x : y))) 120 link_error (); 121 122 if (cos((y*=3, -x)) != cos((y*=3,x))) 123 link_error (); 124 125 if (cos((y*=2, -fabs(tan(x/-y)))) != cos((y*=2,tan(x/y)))) 126 link_error (); 127 128 if (cos(copysign(x,y)) != cos(x)) 129 link_error (); 130 131 if (cos(copysign(-fabs(x),y*=2)) != cos((y*=2,x))) 132 link_error (); 133 134 if (hypot (x, 0) != fabs(x)) 135 link_error (); 136 137 if (hypot (0, x) != fabs(x)) 138 link_error (); 139 140 if (hypot (x, x) != fabs(x) * __builtin_sqrt(2)) 141 link_error (); 142 143 if (hypot (-x, y) != hypot (x, y)) 144 link_error (); 145 146 if (hypot (x, -y) != hypot (x, y)) 147 link_error (); 148 149 if (hypot (-x, -y) != hypot (x, y)) 150 link_error (); 151 152 if (hypot (fabs(x), y) != hypot (x, y)) 153 link_error (); 154 155 if (hypot (x, fabs(y)) != hypot (x, y)) 156 link_error (); 157 158 if (hypot (fabs(x), fabs(y)) != hypot (x, y)) 159 link_error (); 160 161 if (hypot (-fabs(-x), -fabs(fabs(fabs(-y)))) != hypot (x, y)) 162 link_error (); 163 164 if (hypot (-x, 0) != fabs(x)) 165 link_error (); 166 167 if (hypot (-x, x) != fabs(x) * __builtin_sqrt(2)) 168 link_error (); 169 170 if (hypot (pure(x), -pure(x)) != fabs(pure(x)) * __builtin_sqrt(2)) 171 link_error (); 172 173 if (hypot (tan(-x), tan(-fabs(y))) != hypot (tan(x), tan(y))) 174 link_error (); 175 176 if (fmin (fmax(x,y),y) != y) 177 link_error (); 178 179 if (fmin (fmax(y,x),y) != y) 180 link_error (); 181 182 if (fmin (x,fmax(x,y)) != x) 183 link_error (); 184 185 if (fmin (x,fmax(y,x)) != x) 186 link_error (); 187 188 if (fmax (fmin(x,y),y) != y) 189 link_error (); 190 191 if (fmax (fmin(y,x),y) != y) 192 link_error (); 193 194 if (fmax (x,fmin(x,y)) != x) 195 link_error (); 196 197 if (fmax (x,fmin(y,x)) != x) 198 link_error (); 199 200 if ((__complex__ double) x != -(__complex__ double) (-x)) 201 link_error (); 202 203 if (x*1i != -(-x*1i)) 204 link_error (); 205 206 if (x+(x-y)*1i != -(-x+(y-x)*1i)) 207 link_error (); 208 209 if (x+(x-y)*1i != -(-x-(x-y)*1i)) 210 link_error (); 211 212 if (ccos(tan(x)+sin(y)*1i) != ccos(-tan(-x)+-sin(-y)*1i)) 213 link_error (); 214 215 if (ccos(tan(x)+sin(x-y)*1i) != ccos(-tan(-x)-sin(y-x)*1i)) 216 link_error (); 217 218 if (-5+x*1i != -~(5+x*1i)) 219 link_error (); 220 221 if (tan(x)+tan(y)*1i != -~(tan(-x)+tan(y)*1i)) 222 link_error (); 223} 224 225void test3(__complex__ double x, __complex__ double y, int i) 226{ 227 if (carg(x) != atan2(__imag__ x, __real__ x)) 228 link_error (); 229 230 if (ccos(x) != ccos(-x)) 231 link_error(); 232 233 if (ccos(ctan(x)) != ccos(ctan(-x))) 234 link_error(); 235 236 if (ctan(x-y) != -ctan(y-x)) 237 link_error(); 238 239 if (ccos(x/y) != ccos(-x/y)) 240 link_error(); 241 242 if (ccos(x/y) != ccos(x/-y)) 243 link_error(); 244 245 if (ccos(x/ctan(y)) != ccos(-x/ctan(-y))) 246 link_error(); 247 248 if (ccos(x*y) != ccos(-x*y)) 249 link_error(); 250 251 if (ccos(x*y) != ccos(x*-y)) 252 link_error(); 253 254 if (ccos(ctan(x)*y) != ccos(ctan(-x)*-y)) 255 link_error(); 256 257 if (ccos(ctan(x/y)) != ccos(-ctan(x/-y))) 258 link_error(); 259 260 if (ccos(i ? x : y) != ccos(i ? -x : y)) 261 link_error(); 262 263 if (ccos(i ? x : y) != ccos(i ? x : -y)) 264 link_error(); 265 266 if (ccos(i ? x : ctan(y/x)) != ccos(i ? -x : -ctan(-y/x))) 267 link_error(); 268 269 if (~x != -~-x) 270 link_error(); 271 272 if (ccos(~x) != ccos(-~-x)) 273 link_error(); 274 275 if (ctan(~(x-y)) != -ctan(~(y-x))) 276 link_error(); 277 278 if (ctan(~(x/y)) != -ctan(~(x/-y))) 279 link_error(); 280} 281 282void test1f(float x) 283{ 284 if (cosf(x) != cosf(-x)) 285 link_error (); 286 287 if (cosf(x) != cosf(fabsf(x))) 288 link_error (); 289 290 if (cosf(x) != cosf(-fabsf(x))) 291 link_error (); 292 293 if (cosf(tanf(x)) != cosf(tanf(-fabsf(x)))) 294 link_error (); 295 296#ifdef HAVE_C99_RUNTIME 297 if (sinf(x)/cosf(x) != tanf(x)) 298 link_error (); 299 300 if (cosf(x)/sinf(x) != 1.0f/tanf(x)) 301 link_error (); 302 303 if (tanf(x)*cosf(x) != sinf(x)) 304 link_error (); 305 306 if (cosf(x)*tanf(x) != sinf(x)) 307 link_error (); 308 309 if (sinf(x)/tanf(x) != cosf(x)) 310 link_error (); 311 312 if (tanf(x)/sinf(x) != 1.0f/cosf(x)) 313 link_error (); 314#endif 315} 316 317void test2f(float x, float y) 318{ 319 if (-tanf(x-y) != tanf(y-x)) 320 link_error (); 321 322 if (-sinf(x-y) != sinf(y-x)) 323 link_error (); 324 325 if (cosf(-x*y) != cosf(x*y)) 326 link_error (); 327 328 if (cosf(x*-y) != cosf(x*y)) 329 link_error (); 330 331 if (cosf(-x/y) != cosf(x/y)) 332 link_error (); 333 334 if (cosf(x/-y) != cosf(x/y)) 335 link_error (); 336 337 if (cosf(-fabsf(tanf(x/-y))) != cosf(tanf(x/y))) 338 link_error (); 339 340 if (cosf(y<10 ? -x : y) != cosf(y<10 ? x : y)) 341 link_error (); 342 343 if (cosf(y<10 ? x : -y) != cosf(y<10 ? x : y)) 344 link_error (); 345 346 if (cosf(y<10 ? -fabsf(x) : tanf(x<20 ? -x : -fabsf(y))) 347 != cosf(y<10 ? x : tanf(x<20 ? x : y))) 348 link_error (); 349 350 if (cosf((y*=3, -x)) != cosf((y*=3,x))) 351 link_error (); 352 353 if (cosf((y*=2, -fabsf(tanf(x/-y)))) != cosf((y*=2,tanf(x/y)))) 354 link_error (); 355 356 if (cosf(copysignf(x,y)) != cosf(x)) 357 link_error (); 358 359 if (cosf(copysignf(-fabsf(x),y*=2)) != cosf((y*=2,x))) 360 link_error (); 361 362 if (hypotf (x, 0) != fabsf(x)) 363 link_error (); 364 365 if (hypotf (0, x) != fabsf(x)) 366 link_error (); 367 368 if (hypotf (x, x) != fabsf(x) * __builtin_sqrtf(2)) 369 link_error (); 370 371 if (hypotf (-x, y) != hypotf (x, y)) 372 link_error (); 373 374 if (hypotf (x, -y) != hypotf (x, y)) 375 link_error (); 376 377 if (hypotf (-x, -y) != hypotf (x, y)) 378 link_error (); 379 380 if (hypotf (fabsf(x), y) != hypotf (x, y)) 381 link_error (); 382 383 if (hypotf (x, fabsf(y)) != hypotf (x, y)) 384 link_error (); 385 386 if (hypotf (fabsf(x), fabsf(y)) != hypotf (x, y)) 387 link_error (); 388 389 if (hypotf (-fabsf(-x), -fabsf(fabsf(fabsf(-y)))) != hypotf (x, y)) 390 link_error (); 391 392 if (hypotf (-x, 0) != fabsf(x)) 393 link_error (); 394 395 if (hypotf (-x, x) != fabsf(x) * __builtin_sqrtf(2)) 396 link_error (); 397 398 if (hypotf (puref(x), -puref(x)) != fabsf(puref(x)) * __builtin_sqrtf(2)) 399 link_error (); 400 401 if (hypotf (tanf(-x), tanf(-fabsf(y))) != hypotf (tanf(x), tanf(y))) 402 link_error (); 403 404 if (fminf (fmaxf(x,y),y) != y) 405 link_error (); 406 407 if (fminf (fmaxf(y,x),y) != y) 408 link_error (); 409 410 if (fminf (x,fmaxf(x,y)) != x) 411 link_error (); 412 413 if (fminf (x,fmaxf(y,x)) != x) 414 link_error (); 415 416 if (fmaxf (fminf(x,y),y) != y) 417 link_error (); 418 419 if (fmaxf (fminf(y,x),y) != y) 420 link_error (); 421 422 if (fmaxf (x,fminf(x,y)) != x) 423 link_error (); 424 425 if (fmaxf (x,fminf(y,x)) != x) 426 link_error (); 427 428 if ((__complex__ float) x != -(__complex__ float) (-x)) 429 link_error (); 430 431 if (x+(x-y)*1i != -(-x+(y-x)*1i)) 432 link_error (); 433 434 if (x+(x-y)*1i != -(-x-(x-y)*1i)) 435 link_error (); 436 437 if (ccosf(tanf(x)+sinf(y)*1i) != ccosf(-tanf(-x)+-sinf(-y)*1i)) 438 link_error (); 439 440 if (ccosf(tanf(x)+sinf(x-y)*1i) != ccosf(-tanf(-x)-sinf(y-x)*1i)) 441 link_error (); 442 443 if (-5+x*1i != -~(5+x*1i)) 444 link_error (); 445 446 if (tanf(x)+tanf(y)*1i != -~(tanf(-x)+tanf(y)*1i)) 447 link_error (); 448} 449 450void test3f(__complex__ float x, __complex__ float y, int i) 451{ 452 if (ccosf(x) != ccosf(-x)) 453 link_error(); 454 455 if (ccosf(ctanf(x)) != ccosf(ctanf(-x))) 456 link_error(); 457 458 if (ctanf(x-y) != -ctanf(y-x)) 459 link_error(); 460 461 if (ccosf(x/y) != ccosf(-x/y)) 462 link_error(); 463 464 if (ccosf(x/y) != ccosf(x/-y)) 465 link_error(); 466 467 if (ccosf(x/ctanf(y)) != ccosf(-x/ctanf(-y))) 468 link_error(); 469 470 if (ccosf(x*y) != ccosf(-x*y)) 471 link_error(); 472 473 if (ccosf(x*y) != ccosf(x*-y)) 474 link_error(); 475 476 if (ccosf(ctanf(x)*y) != ccosf(ctanf(-x)*-y)) 477 link_error(); 478 479 if (ccosf(ctanf(x/y)) != ccosf(-ctanf(x/-y))) 480 link_error(); 481 482 if (ccosf(i ? x : y) != ccosf(i ? -x : y)) 483 link_error(); 484 485 if (ccosf(i ? x : y) != ccosf(i ? x : -y)) 486 link_error(); 487 488 if (ccosf(i ? x : ctanf(y/x)) != ccosf(i ? -x : -ctanf(-y/x))) 489 link_error(); 490 491 if (~x != -~-x) 492 link_error(); 493 494 if (ccosf(~x) != ccosf(-~-x)) 495 link_error(); 496 497 if (ctanf(~(x-y)) != -ctanf(~(y-x))) 498 link_error(); 499 500 if (ctanf(~(x/y)) != -ctanf(~(x/-y))) 501 link_error(); 502 503#ifdef HAVE_C99_RUNTIME 504 if (cargf(x) != atan2f(__imag__ x, __real__ x)) 505 link_error (); 506#endif 507} 508 509void test1l(long double x) 510{ 511 if (cosl(x) != cosl(-x)) 512 link_error (); 513 514 if (cosl(x) != cosl(fabsl(x))) 515 link_error (); 516 517 if (cosl(x) != cosl(-fabsl(x))) 518 link_error (); 519 520 if (cosl(tanl(x)) != cosl(tanl(-fabsl(x)))) 521 link_error (); 522 523#ifdef HAVE_C99_RUNTIME 524 if (sinl(x)/cosl(x) != tanl(x)) 525 link_error (); 526 527 if (cosl(x)/sinl(x) != 1.0l/tanl(x)) 528 link_error (); 529 530 if (tanl(x)*cosl(x) != sinl(x)) 531 link_error (); 532 533 if (cosl(x)*tanl(x) != sinl(x)) 534 link_error (); 535 536 if (sinl(x)/tanl(x) != cosl(x)) 537 link_error (); 538 539 if (tanl(x)/sinl(x) != 1.0l/cosl(x)) 540 link_error (); 541#endif 542} 543 544void test2l(long double x, long double y) 545{ 546 if (-tanl(x-y) != tanl(y-x)) 547 link_error (); 548 549 if (-sinl(x-y) != sinl(y-x)) 550 link_error (); 551 552 if (cosl(-x*y) != cosl(x*y)) 553 link_error (); 554 555 if (cosl(x*-y) != cosl(x*y)) 556 link_error (); 557 558 if (cosl(-x/y) != cosl(x/y)) 559 link_error (); 560 561 if (cosl(x/-y) != cosl(x/y)) 562 link_error (); 563 564 if (cosl(-fabsl(tanl(x/-y))) != cosl(tanl(x/y))) 565 link_error (); 566 567 if (cosl(y<10 ? -x : y) != cosl(y<10 ? x : y)) 568 link_error (); 569 570 if (cosl(y<10 ? x : -y) != cosl(y<10 ? x : y)) 571 link_error (); 572 573 if (cosl(y<10 ? -fabsl(x) : tanl(x<20 ? -x : -fabsl(y))) 574 != cosl(y<10 ? x : tanl(x<20 ? x : y))) 575 link_error (); 576 577 if (cosl((y*=3, -x)) != cosl((y*=3,x))) 578 link_error (); 579 580 if (cosl((y*=2, -fabsl(tanl(x/-y)))) != cosl((y*=2,tanl(x/y)))) 581 link_error (); 582 583 if (cosl(copysignl(x,y)) != cosl(x)) 584 link_error (); 585 586 if (cosl(copysignl(-fabsl(x),y*=2)) != cosl((y*=2,x))) 587 link_error (); 588 589 if (hypotl (x, 0) != fabsl(x)) 590 link_error (); 591 592 if (hypotl (0, x) != fabsl(x)) 593 link_error (); 594 595 if (hypotl (x, x) != fabsl(x) * __builtin_sqrtl(2)) 596 link_error (); 597 598 if (hypotl (-x, y) != hypotl (x, y)) 599 link_error (); 600 601 if (hypotl (x, -y) != hypotl (x, y)) 602 link_error (); 603 604 if (hypotl (-x, -y) != hypotl (x, y)) 605 link_error (); 606 607 if (hypotl (fabsl(x), y) != hypotl (x, y)) 608 link_error (); 609 610 if (hypotl (x, fabsl(y)) != hypotl (x, y)) 611 link_error (); 612 613 if (hypotl (fabsl(x), fabsl(y)) != hypotl (x, y)) 614 link_error (); 615 616 if (hypotl (-fabsl(-x), -fabsl(fabsl(fabsl(-y)))) != hypotl (x, y)) 617 link_error (); 618 619 if (hypotl (-x, 0) != fabsl(x)) 620 link_error (); 621 622 if (hypotl (-x, x) != fabsl(x) * __builtin_sqrtl(2)) 623 link_error (); 624 625 if (hypotl (purel(x), -purel(x)) != fabsl(purel(x)) * __builtin_sqrtl(2)) 626 link_error (); 627 628 if (hypotl (tanl(-x), tanl(-fabsl(y))) != hypotl (tanl(x), tanl(y))) 629 link_error (); 630 631 if (fminl (fmaxl(x,y),y) != y) 632 link_error (); 633 634 if (fminl (fmaxl(y,x),y) != y) 635 link_error (); 636 637 if (fminl (x,fmaxl(x,y)) != x) 638 link_error (); 639 640 if (fminl (x,fmaxl(y,x)) != x) 641 link_error (); 642 643 if (fmaxl (fminl(x,y),y) != y) 644 link_error (); 645 646 if (fmaxl (fminl(y,x),y) != y) 647 link_error (); 648 649 if (fmaxl (x,fminl(x,y)) != x) 650 link_error (); 651 652 if (fmaxl (x,fminl(y,x)) != x) 653 link_error (); 654 655 if ((__complex__ long double) x != -(__complex__ long double) (-x)) 656 link_error (); 657 658 if (x+(x-y)*1i != -(-x+(y-x)*1i)) 659 link_error (); 660 661 if (x+(x-y)*1i != -(-x-(x-y)*1i)) 662 link_error (); 663 664 if (ccosl(tanl(x)+sinl(y)*1i) != ccosl(-tanl(-x)+-sinl(-y)*1i)) 665 link_error (); 666 667 if (ccosl(tanl(x)+sinl(x-y)*1i) != ccosl(-tanl(-x)-sinl(y-x)*1i)) 668 link_error (); 669 670 if (-5+x*1i != -~(5+x*1i)) 671 link_error (); 672 673 if (tanl(x)+tanl(y)*1i != -~(tanl(-x)+tanl(y)*1i)) 674 link_error (); 675} 676 677void test3l(__complex__ long double x, __complex__ long double y, int i) 678{ 679 if (ccosl(x) != ccosl(-x)) 680 link_error(); 681 682 if (ccosl(ctanl(x)) != ccosl(ctanl(-x))) 683 link_error(); 684 685 if (ctanl(x-y) != -ctanl(y-x)) 686 link_error(); 687 688 if (ccosl(x/y) != ccosl(-x/y)) 689 link_error(); 690 691 if (ccosl(x/y) != ccosl(x/-y)) 692 link_error(); 693 694 if (ccosl(x/ctanl(y)) != ccosl(-x/ctanl(-y))) 695 link_error(); 696 697 if (ccosl(x*y) != ccosl(-x*y)) 698 link_error(); 699 700 if (ccosl(x*y) != ccosl(x*-y)) 701 link_error(); 702 703 if (ccosl(ctanl(x)*y) != ccosl(ctanl(-x)*-y)) 704 link_error(); 705 706 if (ccosl(ctanl(x/y)) != ccosl(-ctanl(x/-y))) 707 link_error(); 708 709 if (ccosl(i ? x : y) != ccosl(i ? -x : y)) 710 link_error(); 711 712 if (ccosl(i ? x : y) != ccosl(i ? x : -y)) 713 link_error(); 714 715 if (ccosl(i ? x : ctanl(y/x)) != ccosl(i ? -x : -ctanl(-y/x))) 716 link_error(); 717 718 if (~x != -~-x) 719 link_error(); 720 721 if (ccosl(~x) != ccosl(-~-x)) 722 link_error(); 723 724 if (ctanl(~(x-y)) != -ctanl(~(y-x))) 725 link_error(); 726 727 if (ctanl(~(x/y)) != -ctanl(~(x/-y))) 728 link_error(); 729 730#ifdef HAVE_C99_RUNTIME 731 if (cargl(x) != atan2l(__imag__ x, __real__ x)) 732 link_error (); 733#endif 734} 735 736int main() 737{ 738 test1 (1.0); 739 test2 (1.0, 2.0); 740 741 test1f (1.0f); 742 test2f (1.0f, 2.0f); 743 744 test1l (1.0l); 745 test2l (1.0l, 2.0l); 746 747 return 0; 748} 749 750