1/* Simplify intrinsic functions at compile-time. 2 Copyright (C) 2000-2022 Free Software Foundation, Inc. 3 Contributed by Andy Vaught & Katherine Holcomb 4 5This file is part of GCC. 6 7GCC is free software; you can redistribute it and/or modify it under 8the terms of the GNU General Public License as published by the Free 9Software Foundation; either version 3, or (at your option) any later 10version. 11 12GCC is distributed in the hope that it will be useful, but WITHOUT ANY 13WARRANTY; without even the implied warranty of MERCHANTABILITY or 14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 15for more details. 16 17You should have received a copy of the GNU General Public License 18along with GCC; see the file COPYING3. If not see 19<http://www.gnu.org/licenses/>. */ 20 21#include "config.h" 22#include "system.h" 23#include "coretypes.h" 24#include "tm.h" /* For BITS_PER_UNIT. */ 25#include "gfortran.h" 26#include "arith.h" 27#include "intrinsic.h" 28#include "match.h" 29#include "target-memory.h" 30#include "constructor.h" 31#include "version.h" /* For version_string. */ 32 33/* Prototypes. */ 34 35static int min_max_choose (gfc_expr *, gfc_expr *, int, bool back_val = false); 36 37gfc_expr gfc_bad_expr; 38 39static gfc_expr *simplify_size (gfc_expr *, gfc_expr *, int); 40 41 42/* Note that 'simplification' is not just transforming expressions. 43 For functions that are not simplified at compile time, range 44 checking is done if possible. 45 46 The return convention is that each simplification function returns: 47 48 A new expression node corresponding to the simplified arguments. 49 The original arguments are destroyed by the caller, and must not 50 be a part of the new expression. 51 52 NULL pointer indicating that no simplification was possible and 53 the original expression should remain intact. 54 55 An expression pointer to gfc_bad_expr (a static placeholder) 56 indicating that some error has prevented simplification. The 57 error is generated within the function and should be propagated 58 upwards 59 60 By the time a simplification function gets control, it has been 61 decided that the function call is really supposed to be the 62 intrinsic. No type checking is strictly necessary, since only 63 valid types will be passed on. On the other hand, a simplification 64 subroutine may have to look at the type of an argument as part of 65 its processing. 66 67 Array arguments are only passed to these subroutines that implement 68 the simplification of transformational intrinsics. 69 70 The functions in this file don't have much comment with them, but 71 everything is reasonably straight-forward. The Standard, chapter 13 72 is the best comment you'll find for this file anyway. */ 73 74/* Range checks an expression node. If all goes well, returns the 75 node, otherwise returns &gfc_bad_expr and frees the node. */ 76 77static gfc_expr * 78range_check (gfc_expr *result, const char *name) 79{ 80 if (result == NULL) 81 return &gfc_bad_expr; 82 83 if (result->expr_type != EXPR_CONSTANT) 84 return result; 85 86 switch (gfc_range_check (result)) 87 { 88 case ARITH_OK: 89 return result; 90 91 case ARITH_OVERFLOW: 92 gfc_error ("Result of %s overflows its kind at %L", name, 93 &result->where); 94 break; 95 96 case ARITH_UNDERFLOW: 97 gfc_error ("Result of %s underflows its kind at %L", name, 98 &result->where); 99 break; 100 101 case ARITH_NAN: 102 gfc_error ("Result of %s is NaN at %L", name, &result->where); 103 break; 104 105 default: 106 gfc_error ("Result of %s gives range error for its kind at %L", name, 107 &result->where); 108 break; 109 } 110 111 gfc_free_expr (result); 112 return &gfc_bad_expr; 113} 114 115 116/* A helper function that gets an optional and possibly missing 117 kind parameter. Returns the kind, -1 if something went wrong. */ 118 119static int 120get_kind (bt type, gfc_expr *k, const char *name, int default_kind) 121{ 122 int kind; 123 124 if (k == NULL) 125 return default_kind; 126 127 if (k->expr_type != EXPR_CONSTANT) 128 { 129 gfc_error ("KIND parameter of %s at %L must be an initialization " 130 "expression", name, &k->where); 131 return -1; 132 } 133 134 if (gfc_extract_int (k, &kind) 135 || gfc_validate_kind (type, kind, true) < 0) 136 { 137 gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where); 138 return -1; 139 } 140 141 return kind; 142} 143 144 145/* Converts an mpz_t signed variable into an unsigned one, assuming 146 two's complement representations and a binary width of bitsize. 147 The conversion is a no-op unless x is negative; otherwise, it can 148 be accomplished by masking out the high bits. */ 149 150static void 151convert_mpz_to_unsigned (mpz_t x, int bitsize) 152{ 153 mpz_t mask; 154 155 if (mpz_sgn (x) < 0) 156 { 157 /* Confirm that no bits above the signed range are unset if we 158 are doing range checking. */ 159 if (flag_range_check != 0) 160 gcc_assert (mpz_scan0 (x, bitsize-1) == ULONG_MAX); 161 162 mpz_init_set_ui (mask, 1); 163 mpz_mul_2exp (mask, mask, bitsize); 164 mpz_sub_ui (mask, mask, 1); 165 166 mpz_and (x, x, mask); 167 168 mpz_clear (mask); 169 } 170 else 171 { 172 /* Confirm that no bits above the signed range are set if we 173 are doing range checking. */ 174 if (flag_range_check != 0) 175 gcc_assert (mpz_scan1 (x, bitsize-1) == ULONG_MAX); 176 } 177} 178 179 180/* Converts an mpz_t unsigned variable into a signed one, assuming 181 two's complement representations and a binary width of bitsize. 182 If the bitsize-1 bit is set, this is taken as a sign bit and 183 the number is converted to the corresponding negative number. */ 184 185void 186gfc_convert_mpz_to_signed (mpz_t x, int bitsize) 187{ 188 mpz_t mask; 189 190 /* Confirm that no bits above the unsigned range are set if we are 191 doing range checking. */ 192 if (flag_range_check != 0) 193 gcc_assert (mpz_scan1 (x, bitsize) == ULONG_MAX); 194 195 if (mpz_tstbit (x, bitsize - 1) == 1) 196 { 197 mpz_init_set_ui (mask, 1); 198 mpz_mul_2exp (mask, mask, bitsize); 199 mpz_sub_ui (mask, mask, 1); 200 201 /* We negate the number by hand, zeroing the high bits, that is 202 make it the corresponding positive number, and then have it 203 negated by GMP, giving the correct representation of the 204 negative number. */ 205 mpz_com (x, x); 206 mpz_add_ui (x, x, 1); 207 mpz_and (x, x, mask); 208 209 mpz_neg (x, x); 210 211 mpz_clear (mask); 212 } 213} 214 215 216/* Test that the expression is a constant array, simplifying if 217 we are dealing with a parameter array. */ 218 219static bool 220is_constant_array_expr (gfc_expr *e) 221{ 222 gfc_constructor *c; 223 bool array_OK = true; 224 mpz_t size; 225 226 if (e == NULL) 227 return true; 228 229 if (e->expr_type == EXPR_VARIABLE && e->rank > 0 230 && e->symtree->n.sym->attr.flavor == FL_PARAMETER) 231 gfc_simplify_expr (e, 1); 232 233 if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e)) 234 return false; 235 236 for (c = gfc_constructor_first (e->value.constructor); 237 c; c = gfc_constructor_next (c)) 238 if (c->expr->expr_type != EXPR_CONSTANT 239 && c->expr->expr_type != EXPR_STRUCTURE) 240 { 241 array_OK = false; 242 break; 243 } 244 245 /* Check and expand the constructor. */ 246 if (!array_OK && gfc_init_expr_flag && e->rank == 1) 247 { 248 array_OK = gfc_reduce_init_expr (e); 249 /* gfc_reduce_init_expr resets the flag. */ 250 gfc_init_expr_flag = true; 251 } 252 else 253 return array_OK; 254 255 /* Recheck to make sure that any EXPR_ARRAYs have gone. */ 256 for (c = gfc_constructor_first (e->value.constructor); 257 c; c = gfc_constructor_next (c)) 258 if (c->expr->expr_type != EXPR_CONSTANT 259 && c->expr->expr_type != EXPR_STRUCTURE) 260 return false; 261 262 /* Make sure that the array has a valid shape. */ 263 if (e->shape == NULL && e->rank == 1) 264 { 265 if (!gfc_array_size(e, &size)) 266 return false; 267 e->shape = gfc_get_shape (1); 268 mpz_init_set (e->shape[0], size); 269 mpz_clear (size); 270 } 271 272 return array_OK; 273} 274 275/* Test for a size zero array. */ 276bool 277gfc_is_size_zero_array (gfc_expr *array) 278{ 279 280 if (array->rank == 0) 281 return false; 282 283 if (array->expr_type == EXPR_VARIABLE && array->rank > 0 284 && array->symtree->n.sym->attr.flavor == FL_PARAMETER 285 && array->shape != NULL) 286 { 287 for (int i = 0; i < array->rank; i++) 288 if (mpz_cmp_si (array->shape[i], 0) <= 0) 289 return true; 290 291 return false; 292 } 293 294 if (array->expr_type == EXPR_ARRAY) 295 return array->value.constructor == NULL; 296 297 return false; 298} 299 300 301/* Initialize a transformational result expression with a given value. */ 302 303static void 304init_result_expr (gfc_expr *e, int init, gfc_expr *array) 305{ 306 if (e && e->expr_type == EXPR_ARRAY) 307 { 308 gfc_constructor *ctor = gfc_constructor_first (e->value.constructor); 309 while (ctor) 310 { 311 init_result_expr (ctor->expr, init, array); 312 ctor = gfc_constructor_next (ctor); 313 } 314 } 315 else if (e && e->expr_type == EXPR_CONSTANT) 316 { 317 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false); 318 HOST_WIDE_INT length; 319 gfc_char_t *string; 320 321 switch (e->ts.type) 322 { 323 case BT_LOGICAL: 324 e->value.logical = (init ? 1 : 0); 325 break; 326 327 case BT_INTEGER: 328 if (init == INT_MIN) 329 mpz_set (e->value.integer, gfc_integer_kinds[i].min_int); 330 else if (init == INT_MAX) 331 mpz_set (e->value.integer, gfc_integer_kinds[i].huge); 332 else 333 mpz_set_si (e->value.integer, init); 334 break; 335 336 case BT_REAL: 337 if (init == INT_MIN) 338 { 339 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE); 340 mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE); 341 } 342 else if (init == INT_MAX) 343 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE); 344 else 345 mpfr_set_si (e->value.real, init, GFC_RND_MODE); 346 break; 347 348 case BT_COMPLEX: 349 mpc_set_si (e->value.complex, init, GFC_MPC_RND_MODE); 350 break; 351 352 case BT_CHARACTER: 353 if (init == INT_MIN) 354 { 355 gfc_expr *len = gfc_simplify_len (array, NULL); 356 gfc_extract_hwi (len, &length); 357 string = gfc_get_wide_string (length + 1); 358 gfc_wide_memset (string, 0, length); 359 } 360 else if (init == INT_MAX) 361 { 362 gfc_expr *len = gfc_simplify_len (array, NULL); 363 gfc_extract_hwi (len, &length); 364 string = gfc_get_wide_string (length + 1); 365 gfc_wide_memset (string, 255, length); 366 } 367 else 368 { 369 length = 0; 370 string = gfc_get_wide_string (1); 371 } 372 373 string[length] = '\0'; 374 e->value.character.length = length; 375 e->value.character.string = string; 376 break; 377 378 default: 379 gcc_unreachable(); 380 } 381 } 382 else 383 gcc_unreachable(); 384} 385 386 387/* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul; 388 if conj_a is true, the matrix_a is complex conjugated. */ 389 390static gfc_expr * 391compute_dot_product (gfc_expr *matrix_a, int stride_a, int offset_a, 392 gfc_expr *matrix_b, int stride_b, int offset_b, 393 bool conj_a) 394{ 395 gfc_expr *result, *a, *b, *c; 396 397 /* Set result to an INTEGER(1) 0 for numeric types and .false. for 398 LOGICAL. Mixed-mode math in the loop will promote result to the 399 correct type and kind. */ 400 if (matrix_a->ts.type == BT_LOGICAL) 401 result = gfc_get_logical_expr (gfc_default_logical_kind, NULL, false); 402 else 403 result = gfc_get_int_expr (1, NULL, 0); 404 result->where = matrix_a->where; 405 406 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a); 407 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b); 408 while (a && b) 409 { 410 /* Copying of expressions is required as operands are free'd 411 by the gfc_arith routines. */ 412 switch (result->ts.type) 413 { 414 case BT_LOGICAL: 415 result = gfc_or (result, 416 gfc_and (gfc_copy_expr (a), 417 gfc_copy_expr (b))); 418 break; 419 420 case BT_INTEGER: 421 case BT_REAL: 422 case BT_COMPLEX: 423 if (conj_a && a->ts.type == BT_COMPLEX) 424 c = gfc_simplify_conjg (a); 425 else 426 c = gfc_copy_expr (a); 427 result = gfc_add (result, gfc_multiply (c, gfc_copy_expr (b))); 428 break; 429 430 default: 431 gcc_unreachable(); 432 } 433 434 offset_a += stride_a; 435 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a); 436 437 offset_b += stride_b; 438 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b); 439 } 440 441 return result; 442} 443 444 445/* Build a result expression for transformational intrinsics, 446 depending on DIM. */ 447 448static gfc_expr * 449transformational_result (gfc_expr *array, gfc_expr *dim, bt type, 450 int kind, locus* where) 451{ 452 gfc_expr *result; 453 int i, nelem; 454 455 if (!dim || array->rank == 1) 456 return gfc_get_constant_expr (type, kind, where); 457 458 result = gfc_get_array_expr (type, kind, where); 459 result->shape = gfc_copy_shape_excluding (array->shape, array->rank, dim); 460 result->rank = array->rank - 1; 461 462 /* gfc_array_size() would count the number of elements in the constructor, 463 we have not built those yet. */ 464 nelem = 1; 465 for (i = 0; i < result->rank; ++i) 466 nelem *= mpz_get_ui (result->shape[i]); 467 468 for (i = 0; i < nelem; ++i) 469 { 470 gfc_constructor_append_expr (&result->value.constructor, 471 gfc_get_constant_expr (type, kind, where), 472 NULL); 473 } 474 475 return result; 476} 477 478 479typedef gfc_expr* (*transformational_op)(gfc_expr*, gfc_expr*); 480 481/* Wrapper function, implements 'op1 += 1'. Only called if MASK 482 of COUNT intrinsic is .TRUE.. 483 484 Interface and implementation mimics arith functions as 485 gfc_add, gfc_multiply, etc. */ 486 487static gfc_expr * 488gfc_count (gfc_expr *op1, gfc_expr *op2) 489{ 490 gfc_expr *result; 491 492 gcc_assert (op1->ts.type == BT_INTEGER); 493 gcc_assert (op2->ts.type == BT_LOGICAL); 494 gcc_assert (op2->value.logical); 495 496 result = gfc_copy_expr (op1); 497 mpz_add_ui (result->value.integer, result->value.integer, 1); 498 499 gfc_free_expr (op1); 500 gfc_free_expr (op2); 501 return result; 502} 503 504 505/* Transforms an ARRAY with operation OP, according to MASK, to a 506 scalar RESULT. E.g. called if 507 508 REAL, PARAMETER :: array(n, m) = ... 509 REAL, PARAMETER :: s = SUM(array) 510 511 where OP == gfc_add(). */ 512 513static gfc_expr * 514simplify_transformation_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *mask, 515 transformational_op op) 516{ 517 gfc_expr *a, *m; 518 gfc_constructor *array_ctor, *mask_ctor; 519 520 /* Shortcut for constant .FALSE. MASK. */ 521 if (mask 522 && mask->expr_type == EXPR_CONSTANT 523 && !mask->value.logical) 524 return result; 525 526 array_ctor = gfc_constructor_first (array->value.constructor); 527 mask_ctor = NULL; 528 if (mask && mask->expr_type == EXPR_ARRAY) 529 mask_ctor = gfc_constructor_first (mask->value.constructor); 530 531 while (array_ctor) 532 { 533 a = array_ctor->expr; 534 array_ctor = gfc_constructor_next (array_ctor); 535 536 /* A constant MASK equals .TRUE. here and can be ignored. */ 537 if (mask_ctor) 538 { 539 m = mask_ctor->expr; 540 mask_ctor = gfc_constructor_next (mask_ctor); 541 if (!m->value.logical) 542 continue; 543 } 544 545 result = op (result, gfc_copy_expr (a)); 546 if (!result) 547 return result; 548 } 549 550 return result; 551} 552 553/* Transforms an ARRAY with operation OP, according to MASK, to an 554 array RESULT. E.g. called if 555 556 REAL, PARAMETER :: array(n, m) = ... 557 REAL, PARAMETER :: s(n) = PROD(array, DIM=1) 558 559 where OP == gfc_multiply(). 560 The result might be post processed using post_op. */ 561 562static gfc_expr * 563simplify_transformation_to_array (gfc_expr *result, gfc_expr *array, gfc_expr *dim, 564 gfc_expr *mask, transformational_op op, 565 transformational_op post_op) 566{ 567 mpz_t size; 568 int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride; 569 gfc_expr **arrayvec, **resultvec, **base, **src, **dest; 570 gfc_constructor *array_ctor, *mask_ctor, *result_ctor; 571 572 int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS], 573 sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS], 574 tmpstride[GFC_MAX_DIMENSIONS]; 575 576 /* Shortcut for constant .FALSE. MASK. */ 577 if (mask 578 && mask->expr_type == EXPR_CONSTANT 579 && !mask->value.logical) 580 return result; 581 582 /* Build an indexed table for array element expressions to minimize 583 linked-list traversal. Masked elements are set to NULL. */ 584 gfc_array_size (array, &size); 585 arraysize = mpz_get_ui (size); 586 mpz_clear (size); 587 588 arrayvec = XCNEWVEC (gfc_expr*, arraysize); 589 590 array_ctor = gfc_constructor_first (array->value.constructor); 591 mask_ctor = NULL; 592 if (mask && mask->expr_type == EXPR_ARRAY) 593 mask_ctor = gfc_constructor_first (mask->value.constructor); 594 595 for (i = 0; i < arraysize; ++i) 596 { 597 arrayvec[i] = array_ctor->expr; 598 array_ctor = gfc_constructor_next (array_ctor); 599 600 if (mask_ctor) 601 { 602 if (!mask_ctor->expr->value.logical) 603 arrayvec[i] = NULL; 604 605 mask_ctor = gfc_constructor_next (mask_ctor); 606 } 607 } 608 609 /* Same for the result expression. */ 610 gfc_array_size (result, &size); 611 resultsize = mpz_get_ui (size); 612 mpz_clear (size); 613 614 resultvec = XCNEWVEC (gfc_expr*, resultsize); 615 result_ctor = gfc_constructor_first (result->value.constructor); 616 for (i = 0; i < resultsize; ++i) 617 { 618 resultvec[i] = result_ctor->expr; 619 result_ctor = gfc_constructor_next (result_ctor); 620 } 621 622 gfc_extract_int (dim, &dim_index); 623 dim_index -= 1; /* zero-base index */ 624 dim_extent = 0; 625 dim_stride = 0; 626 627 for (i = 0, n = 0; i < array->rank; ++i) 628 { 629 count[i] = 0; 630 tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]); 631 if (i == dim_index) 632 { 633 dim_extent = mpz_get_si (array->shape[i]); 634 dim_stride = tmpstride[i]; 635 continue; 636 } 637 638 extent[n] = mpz_get_si (array->shape[i]); 639 sstride[n] = tmpstride[i]; 640 dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1]; 641 n += 1; 642 } 643 644 done = resultsize <= 0; 645 base = arrayvec; 646 dest = resultvec; 647 while (!done) 648 { 649 for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n) 650 if (*src) 651 *dest = op (*dest, gfc_copy_expr (*src)); 652 653 if (post_op) 654 *dest = post_op (*dest, *dest); 655 656 count[0]++; 657 base += sstride[0]; 658 dest += dstride[0]; 659 660 n = 0; 661 while (!done && count[n] == extent[n]) 662 { 663 count[n] = 0; 664 base -= sstride[n] * extent[n]; 665 dest -= dstride[n] * extent[n]; 666 667 n++; 668 if (n < result->rank) 669 { 670 /* If the nested loop is unrolled GFC_MAX_DIMENSIONS 671 times, we'd warn for the last iteration, because the 672 array index will have already been incremented to the 673 array sizes, and we can't tell that this must make 674 the test against result->rank false, because ranks 675 must not exceed GFC_MAX_DIMENSIONS. */ 676 GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray-bounds) 677 count[n]++; 678 base += sstride[n]; 679 dest += dstride[n]; 680 GCC_DIAGNOSTIC_POP 681 } 682 else 683 done = true; 684 } 685 } 686 687 /* Place updated expression in result constructor. */ 688 result_ctor = gfc_constructor_first (result->value.constructor); 689 for (i = 0; i < resultsize; ++i) 690 { 691 result_ctor->expr = resultvec[i]; 692 result_ctor = gfc_constructor_next (result_ctor); 693 } 694 695 free (arrayvec); 696 free (resultvec); 697 return result; 698} 699 700 701static gfc_expr * 702simplify_transformation (gfc_expr *array, gfc_expr *dim, gfc_expr *mask, 703 int init_val, transformational_op op) 704{ 705 gfc_expr *result; 706 bool size_zero; 707 708 size_zero = gfc_is_size_zero_array (array); 709 710 if (!(is_constant_array_expr (array) || size_zero) 711 || array->shape == NULL 712 || !gfc_is_constant_expr (dim)) 713 return NULL; 714 715 if (mask 716 && !is_constant_array_expr (mask) 717 && mask->expr_type != EXPR_CONSTANT) 718 return NULL; 719 720 result = transformational_result (array, dim, array->ts.type, 721 array->ts.kind, &array->where); 722 init_result_expr (result, init_val, array); 723 724 if (size_zero) 725 return result; 726 727 return !dim || array->rank == 1 ? 728 simplify_transformation_to_scalar (result, array, mask, op) : 729 simplify_transformation_to_array (result, array, dim, mask, op, NULL); 730} 731 732 733/********************** Simplification functions *****************************/ 734 735gfc_expr * 736gfc_simplify_abs (gfc_expr *e) 737{ 738 gfc_expr *result; 739 740 if (e->expr_type != EXPR_CONSTANT) 741 return NULL; 742 743 switch (e->ts.type) 744 { 745 case BT_INTEGER: 746 result = gfc_get_constant_expr (BT_INTEGER, e->ts.kind, &e->where); 747 mpz_abs (result->value.integer, e->value.integer); 748 return range_check (result, "IABS"); 749 750 case BT_REAL: 751 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where); 752 mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE); 753 return range_check (result, "ABS"); 754 755 case BT_COMPLEX: 756 gfc_set_model_kind (e->ts.kind); 757 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where); 758 mpc_abs (result->value.real, e->value.complex, GFC_RND_MODE); 759 return range_check (result, "CABS"); 760 761 default: 762 gfc_internal_error ("gfc_simplify_abs(): Bad type"); 763 } 764} 765 766 767static gfc_expr * 768simplify_achar_char (gfc_expr *e, gfc_expr *k, const char *name, bool ascii) 769{ 770 gfc_expr *result; 771 int kind; 772 bool too_large = false; 773 774 if (e->expr_type != EXPR_CONSTANT) 775 return NULL; 776 777 kind = get_kind (BT_CHARACTER, k, name, gfc_default_character_kind); 778 if (kind == -1) 779 return &gfc_bad_expr; 780 781 if (mpz_cmp_si (e->value.integer, 0) < 0) 782 { 783 gfc_error ("Argument of %s function at %L is negative", name, 784 &e->where); 785 return &gfc_bad_expr; 786 } 787 788 if (ascii && warn_surprising && mpz_cmp_si (e->value.integer, 127) > 0) 789 gfc_warning (OPT_Wsurprising, 790 "Argument of %s function at %L outside of range [0,127]", 791 name, &e->where); 792 793 if (kind == 1 && mpz_cmp_si (e->value.integer, 255) > 0) 794 too_large = true; 795 else if (kind == 4) 796 { 797 mpz_t t; 798 mpz_init_set_ui (t, 2); 799 mpz_pow_ui (t, t, 32); 800 mpz_sub_ui (t, t, 1); 801 if (mpz_cmp (e->value.integer, t) > 0) 802 too_large = true; 803 mpz_clear (t); 804 } 805 806 if (too_large) 807 { 808 gfc_error ("Argument of %s function at %L is too large for the " 809 "collating sequence of kind %d", name, &e->where, kind); 810 return &gfc_bad_expr; 811 } 812 813 result = gfc_get_character_expr (kind, &e->where, NULL, 1); 814 result->value.character.string[0] = mpz_get_ui (e->value.integer); 815 816 return result; 817} 818 819 820 821/* We use the processor's collating sequence, because all 822 systems that gfortran currently works on are ASCII. */ 823 824gfc_expr * 825gfc_simplify_achar (gfc_expr *e, gfc_expr *k) 826{ 827 return simplify_achar_char (e, k, "ACHAR", true); 828} 829 830 831gfc_expr * 832gfc_simplify_acos (gfc_expr *x) 833{ 834 gfc_expr *result; 835 836 if (x->expr_type != EXPR_CONSTANT) 837 return NULL; 838 839 switch (x->ts.type) 840 { 841 case BT_REAL: 842 if (mpfr_cmp_si (x->value.real, 1) > 0 843 || mpfr_cmp_si (x->value.real, -1) < 0) 844 { 845 gfc_error ("Argument of ACOS at %L must be between -1 and 1", 846 &x->where); 847 return &gfc_bad_expr; 848 } 849 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 850 mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE); 851 break; 852 853 case BT_COMPLEX: 854 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 855 mpc_acos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE); 856 break; 857 858 default: 859 gfc_internal_error ("in gfc_simplify_acos(): Bad type"); 860 } 861 862 return range_check (result, "ACOS"); 863} 864 865gfc_expr * 866gfc_simplify_acosh (gfc_expr *x) 867{ 868 gfc_expr *result; 869 870 if (x->expr_type != EXPR_CONSTANT) 871 return NULL; 872 873 switch (x->ts.type) 874 { 875 case BT_REAL: 876 if (mpfr_cmp_si (x->value.real, 1) < 0) 877 { 878 gfc_error ("Argument of ACOSH at %L must not be less than 1", 879 &x->where); 880 return &gfc_bad_expr; 881 } 882 883 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 884 mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE); 885 break; 886 887 case BT_COMPLEX: 888 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 889 mpc_acosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE); 890 break; 891 892 default: 893 gfc_internal_error ("in gfc_simplify_acosh(): Bad type"); 894 } 895 896 return range_check (result, "ACOSH"); 897} 898 899gfc_expr * 900gfc_simplify_adjustl (gfc_expr *e) 901{ 902 gfc_expr *result; 903 int count, i, len; 904 gfc_char_t ch; 905 906 if (e->expr_type != EXPR_CONSTANT) 907 return NULL; 908 909 len = e->value.character.length; 910 911 for (count = 0, i = 0; i < len; ++i) 912 { 913 ch = e->value.character.string[i]; 914 if (ch != ' ') 915 break; 916 ++count; 917 } 918 919 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len); 920 for (i = 0; i < len - count; ++i) 921 result->value.character.string[i] = e->value.character.string[count + i]; 922 923 return result; 924} 925 926 927gfc_expr * 928gfc_simplify_adjustr (gfc_expr *e) 929{ 930 gfc_expr *result; 931 int count, i, len; 932 gfc_char_t ch; 933 934 if (e->expr_type != EXPR_CONSTANT) 935 return NULL; 936 937 len = e->value.character.length; 938 939 for (count = 0, i = len - 1; i >= 0; --i) 940 { 941 ch = e->value.character.string[i]; 942 if (ch != ' ') 943 break; 944 ++count; 945 } 946 947 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len); 948 for (i = 0; i < count; ++i) 949 result->value.character.string[i] = ' '; 950 951 for (i = count; i < len; ++i) 952 result->value.character.string[i] = e->value.character.string[i - count]; 953 954 return result; 955} 956 957 958gfc_expr * 959gfc_simplify_aimag (gfc_expr *e) 960{ 961 gfc_expr *result; 962 963 if (e->expr_type != EXPR_CONSTANT) 964 return NULL; 965 966 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where); 967 mpfr_set (result->value.real, mpc_imagref (e->value.complex), GFC_RND_MODE); 968 969 return range_check (result, "AIMAG"); 970} 971 972 973gfc_expr * 974gfc_simplify_aint (gfc_expr *e, gfc_expr *k) 975{ 976 gfc_expr *rtrunc, *result; 977 int kind; 978 979 kind = get_kind (BT_REAL, k, "AINT", e->ts.kind); 980 if (kind == -1) 981 return &gfc_bad_expr; 982 983 if (e->expr_type != EXPR_CONSTANT) 984 return NULL; 985 986 rtrunc = gfc_copy_expr (e); 987 mpfr_trunc (rtrunc->value.real, e->value.real); 988 989 result = gfc_real2real (rtrunc, kind); 990 991 gfc_free_expr (rtrunc); 992 993 return range_check (result, "AINT"); 994} 995 996 997gfc_expr * 998gfc_simplify_all (gfc_expr *mask, gfc_expr *dim) 999{ 1000 return simplify_transformation (mask, dim, NULL, true, gfc_and); 1001} 1002 1003 1004gfc_expr * 1005gfc_simplify_dint (gfc_expr *e) 1006{ 1007 gfc_expr *rtrunc, *result; 1008 1009 if (e->expr_type != EXPR_CONSTANT) 1010 return NULL; 1011 1012 rtrunc = gfc_copy_expr (e); 1013 mpfr_trunc (rtrunc->value.real, e->value.real); 1014 1015 result = gfc_real2real (rtrunc, gfc_default_double_kind); 1016 1017 gfc_free_expr (rtrunc); 1018 1019 return range_check (result, "DINT"); 1020} 1021 1022 1023gfc_expr * 1024gfc_simplify_dreal (gfc_expr *e) 1025{ 1026 gfc_expr *result = NULL; 1027 1028 if (e->expr_type != EXPR_CONSTANT) 1029 return NULL; 1030 1031 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where); 1032 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE); 1033 1034 return range_check (result, "DREAL"); 1035} 1036 1037 1038gfc_expr * 1039gfc_simplify_anint (gfc_expr *e, gfc_expr *k) 1040{ 1041 gfc_expr *result; 1042 int kind; 1043 1044 kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind); 1045 if (kind == -1) 1046 return &gfc_bad_expr; 1047 1048 if (e->expr_type != EXPR_CONSTANT) 1049 return NULL; 1050 1051 result = gfc_get_constant_expr (e->ts.type, kind, &e->where); 1052 mpfr_round (result->value.real, e->value.real); 1053 1054 return range_check (result, "ANINT"); 1055} 1056 1057 1058gfc_expr * 1059gfc_simplify_and (gfc_expr *x, gfc_expr *y) 1060{ 1061 gfc_expr *result; 1062 int kind; 1063 1064 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT) 1065 return NULL; 1066 1067 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind; 1068 1069 switch (x->ts.type) 1070 { 1071 case BT_INTEGER: 1072 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where); 1073 mpz_and (result->value.integer, x->value.integer, y->value.integer); 1074 return range_check (result, "AND"); 1075 1076 case BT_LOGICAL: 1077 return gfc_get_logical_expr (kind, &x->where, 1078 x->value.logical && y->value.logical); 1079 1080 default: 1081 gcc_unreachable (); 1082 } 1083} 1084 1085 1086gfc_expr * 1087gfc_simplify_any (gfc_expr *mask, gfc_expr *dim) 1088{ 1089 return simplify_transformation (mask, dim, NULL, false, gfc_or); 1090} 1091 1092 1093gfc_expr * 1094gfc_simplify_dnint (gfc_expr *e) 1095{ 1096 gfc_expr *result; 1097 1098 if (e->expr_type != EXPR_CONSTANT) 1099 return NULL; 1100 1101 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &e->where); 1102 mpfr_round (result->value.real, e->value.real); 1103 1104 return range_check (result, "DNINT"); 1105} 1106 1107 1108gfc_expr * 1109gfc_simplify_asin (gfc_expr *x) 1110{ 1111 gfc_expr *result; 1112 1113 if (x->expr_type != EXPR_CONSTANT) 1114 return NULL; 1115 1116 switch (x->ts.type) 1117 { 1118 case BT_REAL: 1119 if (mpfr_cmp_si (x->value.real, 1) > 0 1120 || mpfr_cmp_si (x->value.real, -1) < 0) 1121 { 1122 gfc_error ("Argument of ASIN at %L must be between -1 and 1", 1123 &x->where); 1124 return &gfc_bad_expr; 1125 } 1126 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1127 mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE); 1128 break; 1129 1130 case BT_COMPLEX: 1131 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1132 mpc_asin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE); 1133 break; 1134 1135 default: 1136 gfc_internal_error ("in gfc_simplify_asin(): Bad type"); 1137 } 1138 1139 return range_check (result, "ASIN"); 1140} 1141 1142 1143/* Convert radians to degrees, i.e., x * 180 / pi. */ 1144 1145static void 1146rad2deg (mpfr_t x) 1147{ 1148 mpfr_t tmp; 1149 1150 mpfr_init (tmp); 1151 mpfr_const_pi (tmp, GFC_RND_MODE); 1152 mpfr_mul_ui (x, x, 180, GFC_RND_MODE); 1153 mpfr_div (x, x, tmp, GFC_RND_MODE); 1154 mpfr_clear (tmp); 1155} 1156 1157 1158/* Simplify ACOSD(X) where the returned value has units of degree. */ 1159 1160gfc_expr * 1161gfc_simplify_acosd (gfc_expr *x) 1162{ 1163 gfc_expr *result; 1164 1165 if (x->expr_type != EXPR_CONSTANT) 1166 return NULL; 1167 1168 if (mpfr_cmp_si (x->value.real, 1) > 0 1169 || mpfr_cmp_si (x->value.real, -1) < 0) 1170 { 1171 gfc_error ("Argument of ACOSD at %L must be between -1 and 1", 1172 &x->where); 1173 return &gfc_bad_expr; 1174 } 1175 1176 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1177 mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE); 1178 rad2deg (result->value.real); 1179 1180 return range_check (result, "ACOSD"); 1181} 1182 1183 1184/* Simplify asind (x) where the returned value has units of degree. */ 1185 1186gfc_expr * 1187gfc_simplify_asind (gfc_expr *x) 1188{ 1189 gfc_expr *result; 1190 1191 if (x->expr_type != EXPR_CONSTANT) 1192 return NULL; 1193 1194 if (mpfr_cmp_si (x->value.real, 1) > 0 1195 || mpfr_cmp_si (x->value.real, -1) < 0) 1196 { 1197 gfc_error ("Argument of ASIND at %L must be between -1 and 1", 1198 &x->where); 1199 return &gfc_bad_expr; 1200 } 1201 1202 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1203 mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE); 1204 rad2deg (result->value.real); 1205 1206 return range_check (result, "ASIND"); 1207} 1208 1209 1210/* Simplify atand (x) where the returned value has units of degree. */ 1211 1212gfc_expr * 1213gfc_simplify_atand (gfc_expr *x) 1214{ 1215 gfc_expr *result; 1216 1217 if (x->expr_type != EXPR_CONSTANT) 1218 return NULL; 1219 1220 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1221 mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE); 1222 rad2deg (result->value.real); 1223 1224 return range_check (result, "ATAND"); 1225} 1226 1227 1228gfc_expr * 1229gfc_simplify_asinh (gfc_expr *x) 1230{ 1231 gfc_expr *result; 1232 1233 if (x->expr_type != EXPR_CONSTANT) 1234 return NULL; 1235 1236 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1237 1238 switch (x->ts.type) 1239 { 1240 case BT_REAL: 1241 mpfr_asinh (result->value.real, x->value.real, GFC_RND_MODE); 1242 break; 1243 1244 case BT_COMPLEX: 1245 mpc_asinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE); 1246 break; 1247 1248 default: 1249 gfc_internal_error ("in gfc_simplify_asinh(): Bad type"); 1250 } 1251 1252 return range_check (result, "ASINH"); 1253} 1254 1255 1256gfc_expr * 1257gfc_simplify_atan (gfc_expr *x) 1258{ 1259 gfc_expr *result; 1260 1261 if (x->expr_type != EXPR_CONSTANT) 1262 return NULL; 1263 1264 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1265 1266 switch (x->ts.type) 1267 { 1268 case BT_REAL: 1269 mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE); 1270 break; 1271 1272 case BT_COMPLEX: 1273 mpc_atan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE); 1274 break; 1275 1276 default: 1277 gfc_internal_error ("in gfc_simplify_atan(): Bad type"); 1278 } 1279 1280 return range_check (result, "ATAN"); 1281} 1282 1283 1284gfc_expr * 1285gfc_simplify_atanh (gfc_expr *x) 1286{ 1287 gfc_expr *result; 1288 1289 if (x->expr_type != EXPR_CONSTANT) 1290 return NULL; 1291 1292 switch (x->ts.type) 1293 { 1294 case BT_REAL: 1295 if (mpfr_cmp_si (x->value.real, 1) >= 0 1296 || mpfr_cmp_si (x->value.real, -1) <= 0) 1297 { 1298 gfc_error ("Argument of ATANH at %L must be inside the range -1 " 1299 "to 1", &x->where); 1300 return &gfc_bad_expr; 1301 } 1302 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1303 mpfr_atanh (result->value.real, x->value.real, GFC_RND_MODE); 1304 break; 1305 1306 case BT_COMPLEX: 1307 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1308 mpc_atanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE); 1309 break; 1310 1311 default: 1312 gfc_internal_error ("in gfc_simplify_atanh(): Bad type"); 1313 } 1314 1315 return range_check (result, "ATANH"); 1316} 1317 1318 1319gfc_expr * 1320gfc_simplify_atan2 (gfc_expr *y, gfc_expr *x) 1321{ 1322 gfc_expr *result; 1323 1324 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT) 1325 return NULL; 1326 1327 if (mpfr_zero_p (y->value.real) && mpfr_zero_p (x->value.real)) 1328 { 1329 gfc_error ("If first argument of ATAN2 at %L is zero, then the " 1330 "second argument must not be zero", &y->where); 1331 return &gfc_bad_expr; 1332 } 1333 1334 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1335 mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE); 1336 1337 return range_check (result, "ATAN2"); 1338} 1339 1340 1341gfc_expr * 1342gfc_simplify_bessel_j0 (gfc_expr *x) 1343{ 1344 gfc_expr *result; 1345 1346 if (x->expr_type != EXPR_CONSTANT) 1347 return NULL; 1348 1349 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1350 mpfr_j0 (result->value.real, x->value.real, GFC_RND_MODE); 1351 1352 return range_check (result, "BESSEL_J0"); 1353} 1354 1355 1356gfc_expr * 1357gfc_simplify_bessel_j1 (gfc_expr *x) 1358{ 1359 gfc_expr *result; 1360 1361 if (x->expr_type != EXPR_CONSTANT) 1362 return NULL; 1363 1364 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1365 mpfr_j1 (result->value.real, x->value.real, GFC_RND_MODE); 1366 1367 return range_check (result, "BESSEL_J1"); 1368} 1369 1370 1371gfc_expr * 1372gfc_simplify_bessel_jn (gfc_expr *order, gfc_expr *x) 1373{ 1374 gfc_expr *result; 1375 long n; 1376 1377 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT) 1378 return NULL; 1379 1380 n = mpz_get_si (order->value.integer); 1381 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1382 mpfr_jn (result->value.real, n, x->value.real, GFC_RND_MODE); 1383 1384 return range_check (result, "BESSEL_JN"); 1385} 1386 1387 1388/* Simplify transformational form of JN and YN. */ 1389 1390static gfc_expr * 1391gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x, 1392 bool jn) 1393{ 1394 gfc_expr *result; 1395 gfc_expr *e; 1396 long n1, n2; 1397 int i; 1398 mpfr_t x2rev, last1, last2; 1399 1400 if (x->expr_type != EXPR_CONSTANT || order1->expr_type != EXPR_CONSTANT 1401 || order2->expr_type != EXPR_CONSTANT) 1402 return NULL; 1403 1404 n1 = mpz_get_si (order1->value.integer); 1405 n2 = mpz_get_si (order2->value.integer); 1406 result = gfc_get_array_expr (x->ts.type, x->ts.kind, &x->where); 1407 result->rank = 1; 1408 result->shape = gfc_get_shape (1); 1409 mpz_init_set_ui (result->shape[0], MAX (n2-n1+1, 0)); 1410 1411 if (n2 < n1) 1412 return result; 1413 1414 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and 1415 YN(N, 0.0) = -Inf. */ 1416 1417 if (mpfr_cmp_ui (x->value.real, 0.0) == 0) 1418 { 1419 if (!jn && flag_range_check) 1420 { 1421 gfc_error ("Result of BESSEL_YN is -INF at %L", &result->where); 1422 gfc_free_expr (result); 1423 return &gfc_bad_expr; 1424 } 1425 1426 if (jn && n1 == 0) 1427 { 1428 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1429 mpfr_set_ui (e->value.real, 1, GFC_RND_MODE); 1430 gfc_constructor_append_expr (&result->value.constructor, e, 1431 &x->where); 1432 n1++; 1433 } 1434 1435 for (i = n1; i <= n2; i++) 1436 { 1437 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1438 if (jn) 1439 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE); 1440 else 1441 mpfr_set_inf (e->value.real, -1); 1442 gfc_constructor_append_expr (&result->value.constructor, e, 1443 &x->where); 1444 } 1445 1446 return result; 1447 } 1448 1449 /* Use the faster but more verbose recurrence algorithm. Bessel functions 1450 are stable for downward recursion and Neumann functions are stable 1451 for upward recursion. It is 1452 x2rev = 2.0/x, 1453 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x), 1454 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x). 1455 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */ 1456 1457 gfc_set_model_kind (x->ts.kind); 1458 1459 /* Get first recursion anchor. */ 1460 1461 mpfr_init (last1); 1462 if (jn) 1463 mpfr_jn (last1, n2, x->value.real, GFC_RND_MODE); 1464 else 1465 mpfr_yn (last1, n1, x->value.real, GFC_RND_MODE); 1466 1467 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1468 mpfr_set (e->value.real, last1, GFC_RND_MODE); 1469 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr) 1470 { 1471 mpfr_clear (last1); 1472 gfc_free_expr (e); 1473 gfc_free_expr (result); 1474 return &gfc_bad_expr; 1475 } 1476 gfc_constructor_append_expr (&result->value.constructor, e, &x->where); 1477 1478 if (n1 == n2) 1479 { 1480 mpfr_clear (last1); 1481 return result; 1482 } 1483 1484 /* Get second recursion anchor. */ 1485 1486 mpfr_init (last2); 1487 if (jn) 1488 mpfr_jn (last2, n2-1, x->value.real, GFC_RND_MODE); 1489 else 1490 mpfr_yn (last2, n1+1, x->value.real, GFC_RND_MODE); 1491 1492 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1493 mpfr_set (e->value.real, last2, GFC_RND_MODE); 1494 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr) 1495 { 1496 mpfr_clear (last1); 1497 mpfr_clear (last2); 1498 gfc_free_expr (e); 1499 gfc_free_expr (result); 1500 return &gfc_bad_expr; 1501 } 1502 if (jn) 1503 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where, -2); 1504 else 1505 gfc_constructor_append_expr (&result->value.constructor, e, &x->where); 1506 1507 if (n1 + 1 == n2) 1508 { 1509 mpfr_clear (last1); 1510 mpfr_clear (last2); 1511 return result; 1512 } 1513 1514 /* Start actual recursion. */ 1515 1516 mpfr_init (x2rev); 1517 mpfr_ui_div (x2rev, 2, x->value.real, GFC_RND_MODE); 1518 1519 for (i = 2; i <= n2-n1; i++) 1520 { 1521 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1522 1523 /* Special case: For YN, if the previous N gave -INF, set 1524 also N+1 to -INF. */ 1525 if (!jn && !flag_range_check && mpfr_inf_p (last2)) 1526 { 1527 mpfr_set_inf (e->value.real, -1); 1528 gfc_constructor_append_expr (&result->value.constructor, e, 1529 &x->where); 1530 continue; 1531 } 1532 1533 mpfr_mul_si (e->value.real, x2rev, jn ? (n2-i+1) : (n1+i-1), 1534 GFC_RND_MODE); 1535 mpfr_mul (e->value.real, e->value.real, last2, GFC_RND_MODE); 1536 mpfr_sub (e->value.real, e->value.real, last1, GFC_RND_MODE); 1537 1538 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr) 1539 { 1540 /* Range_check frees "e" in that case. */ 1541 e = NULL; 1542 goto error; 1543 } 1544 1545 if (jn) 1546 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where, 1547 -i-1); 1548 else 1549 gfc_constructor_append_expr (&result->value.constructor, e, &x->where); 1550 1551 mpfr_set (last1, last2, GFC_RND_MODE); 1552 mpfr_set (last2, e->value.real, GFC_RND_MODE); 1553 } 1554 1555 mpfr_clear (last1); 1556 mpfr_clear (last2); 1557 mpfr_clear (x2rev); 1558 return result; 1559 1560error: 1561 mpfr_clear (last1); 1562 mpfr_clear (last2); 1563 mpfr_clear (x2rev); 1564 gfc_free_expr (e); 1565 gfc_free_expr (result); 1566 return &gfc_bad_expr; 1567} 1568 1569 1570gfc_expr * 1571gfc_simplify_bessel_jn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x) 1572{ 1573 return gfc_simplify_bessel_n2 (order1, order2, x, true); 1574} 1575 1576 1577gfc_expr * 1578gfc_simplify_bessel_y0 (gfc_expr *x) 1579{ 1580 gfc_expr *result; 1581 1582 if (x->expr_type != EXPR_CONSTANT) 1583 return NULL; 1584 1585 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1586 mpfr_y0 (result->value.real, x->value.real, GFC_RND_MODE); 1587 1588 return range_check (result, "BESSEL_Y0"); 1589} 1590 1591 1592gfc_expr * 1593gfc_simplify_bessel_y1 (gfc_expr *x) 1594{ 1595 gfc_expr *result; 1596 1597 if (x->expr_type != EXPR_CONSTANT) 1598 return NULL; 1599 1600 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1601 mpfr_y1 (result->value.real, x->value.real, GFC_RND_MODE); 1602 1603 return range_check (result, "BESSEL_Y1"); 1604} 1605 1606 1607gfc_expr * 1608gfc_simplify_bessel_yn (gfc_expr *order, gfc_expr *x) 1609{ 1610 gfc_expr *result; 1611 long n; 1612 1613 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT) 1614 return NULL; 1615 1616 n = mpz_get_si (order->value.integer); 1617 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1618 mpfr_yn (result->value.real, n, x->value.real, GFC_RND_MODE); 1619 1620 return range_check (result, "BESSEL_YN"); 1621} 1622 1623 1624gfc_expr * 1625gfc_simplify_bessel_yn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x) 1626{ 1627 return gfc_simplify_bessel_n2 (order1, order2, x, false); 1628} 1629 1630 1631gfc_expr * 1632gfc_simplify_bit_size (gfc_expr *e) 1633{ 1634 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false); 1635 return gfc_get_int_expr (e->ts.kind, &e->where, 1636 gfc_integer_kinds[i].bit_size); 1637} 1638 1639 1640gfc_expr * 1641gfc_simplify_btest (gfc_expr *e, gfc_expr *bit) 1642{ 1643 int b; 1644 1645 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT) 1646 return NULL; 1647 1648 if (gfc_extract_int (bit, &b) || b < 0) 1649 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where, false); 1650 1651 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where, 1652 mpz_tstbit (e->value.integer, b)); 1653} 1654 1655 1656static int 1657compare_bitwise (gfc_expr *i, gfc_expr *j) 1658{ 1659 mpz_t x, y; 1660 int k, res; 1661 1662 gcc_assert (i->ts.type == BT_INTEGER); 1663 gcc_assert (j->ts.type == BT_INTEGER); 1664 1665 mpz_init_set (x, i->value.integer); 1666 k = gfc_validate_kind (i->ts.type, i->ts.kind, false); 1667 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size); 1668 1669 mpz_init_set (y, j->value.integer); 1670 k = gfc_validate_kind (j->ts.type, j->ts.kind, false); 1671 convert_mpz_to_unsigned (y, gfc_integer_kinds[k].bit_size); 1672 1673 res = mpz_cmp (x, y); 1674 mpz_clear (x); 1675 mpz_clear (y); 1676 return res; 1677} 1678 1679 1680gfc_expr * 1681gfc_simplify_bge (gfc_expr *i, gfc_expr *j) 1682{ 1683 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT) 1684 return NULL; 1685 1686 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where, 1687 compare_bitwise (i, j) >= 0); 1688} 1689 1690 1691gfc_expr * 1692gfc_simplify_bgt (gfc_expr *i, gfc_expr *j) 1693{ 1694 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT) 1695 return NULL; 1696 1697 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where, 1698 compare_bitwise (i, j) > 0); 1699} 1700 1701 1702gfc_expr * 1703gfc_simplify_ble (gfc_expr *i, gfc_expr *j) 1704{ 1705 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT) 1706 return NULL; 1707 1708 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where, 1709 compare_bitwise (i, j) <= 0); 1710} 1711 1712 1713gfc_expr * 1714gfc_simplify_blt (gfc_expr *i, gfc_expr *j) 1715{ 1716 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT) 1717 return NULL; 1718 1719 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where, 1720 compare_bitwise (i, j) < 0); 1721} 1722 1723 1724gfc_expr * 1725gfc_simplify_ceiling (gfc_expr *e, gfc_expr *k) 1726{ 1727 gfc_expr *ceil, *result; 1728 int kind; 1729 1730 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind); 1731 if (kind == -1) 1732 return &gfc_bad_expr; 1733 1734 if (e->expr_type != EXPR_CONSTANT) 1735 return NULL; 1736 1737 ceil = gfc_copy_expr (e); 1738 mpfr_ceil (ceil->value.real, e->value.real); 1739 1740 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where); 1741 gfc_mpfr_to_mpz (result->value.integer, ceil->value.real, &e->where); 1742 1743 gfc_free_expr (ceil); 1744 1745 return range_check (result, "CEILING"); 1746} 1747 1748 1749gfc_expr * 1750gfc_simplify_char (gfc_expr *e, gfc_expr *k) 1751{ 1752 return simplify_achar_char (e, k, "CHAR", false); 1753} 1754 1755 1756/* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */ 1757 1758static gfc_expr * 1759simplify_cmplx (const char *name, gfc_expr *x, gfc_expr *y, int kind) 1760{ 1761 gfc_expr *result; 1762 1763 if (x->expr_type != EXPR_CONSTANT 1764 || (y != NULL && y->expr_type != EXPR_CONSTANT)) 1765 return NULL; 1766 1767 result = gfc_get_constant_expr (BT_COMPLEX, kind, &x->where); 1768 1769 switch (x->ts.type) 1770 { 1771 case BT_INTEGER: 1772 mpc_set_z (result->value.complex, x->value.integer, GFC_MPC_RND_MODE); 1773 break; 1774 1775 case BT_REAL: 1776 mpc_set_fr (result->value.complex, x->value.real, GFC_RND_MODE); 1777 break; 1778 1779 case BT_COMPLEX: 1780 mpc_set (result->value.complex, x->value.complex, GFC_MPC_RND_MODE); 1781 break; 1782 1783 default: 1784 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)"); 1785 } 1786 1787 if (!y) 1788 return range_check (result, name); 1789 1790 switch (y->ts.type) 1791 { 1792 case BT_INTEGER: 1793 mpfr_set_z (mpc_imagref (result->value.complex), 1794 y->value.integer, GFC_RND_MODE); 1795 break; 1796 1797 case BT_REAL: 1798 mpfr_set (mpc_imagref (result->value.complex), 1799 y->value.real, GFC_RND_MODE); 1800 break; 1801 1802 default: 1803 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)"); 1804 } 1805 1806 return range_check (result, name); 1807} 1808 1809 1810gfc_expr * 1811gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k) 1812{ 1813 int kind; 1814 1815 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_complex_kind); 1816 if (kind == -1) 1817 return &gfc_bad_expr; 1818 1819 return simplify_cmplx ("CMPLX", x, y, kind); 1820} 1821 1822 1823gfc_expr * 1824gfc_simplify_complex (gfc_expr *x, gfc_expr *y) 1825{ 1826 int kind; 1827 1828 if (x->ts.type == BT_INTEGER && y->ts.type == BT_INTEGER) 1829 kind = gfc_default_complex_kind; 1830 else if (x->ts.type == BT_REAL || y->ts.type == BT_INTEGER) 1831 kind = x->ts.kind; 1832 else if (x->ts.type == BT_INTEGER || y->ts.type == BT_REAL) 1833 kind = y->ts.kind; 1834 else if (x->ts.type == BT_REAL && y->ts.type == BT_REAL) 1835 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind; 1836 else 1837 gcc_unreachable (); 1838 1839 return simplify_cmplx ("COMPLEX", x, y, kind); 1840} 1841 1842 1843gfc_expr * 1844gfc_simplify_conjg (gfc_expr *e) 1845{ 1846 gfc_expr *result; 1847 1848 if (e->expr_type != EXPR_CONSTANT) 1849 return NULL; 1850 1851 result = gfc_copy_expr (e); 1852 mpc_conj (result->value.complex, result->value.complex, GFC_MPC_RND_MODE); 1853 1854 return range_check (result, "CONJG"); 1855} 1856 1857 1858/* Simplify atan2d (x) where the unit is degree. */ 1859 1860gfc_expr * 1861gfc_simplify_atan2d (gfc_expr *y, gfc_expr *x) 1862{ 1863 gfc_expr *result; 1864 1865 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT) 1866 return NULL; 1867 1868 if (mpfr_zero_p (y->value.real) && mpfr_zero_p (x->value.real)) 1869 { 1870 gfc_error ("If first argument of ATAN2D at %L is zero, then the " 1871 "second argument must not be zero", &y->where); 1872 return &gfc_bad_expr; 1873 } 1874 1875 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1876 mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE); 1877 rad2deg (result->value.real); 1878 1879 return range_check (result, "ATAN2D"); 1880} 1881 1882 1883gfc_expr * 1884gfc_simplify_cos (gfc_expr *x) 1885{ 1886 gfc_expr *result; 1887 1888 if (x->expr_type != EXPR_CONSTANT) 1889 return NULL; 1890 1891 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1892 1893 switch (x->ts.type) 1894 { 1895 case BT_REAL: 1896 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE); 1897 break; 1898 1899 case BT_COMPLEX: 1900 gfc_set_model_kind (x->ts.kind); 1901 mpc_cos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE); 1902 break; 1903 1904 default: 1905 gfc_internal_error ("in gfc_simplify_cos(): Bad type"); 1906 } 1907 1908 return range_check (result, "COS"); 1909} 1910 1911 1912static void 1913deg2rad (mpfr_t x) 1914{ 1915 mpfr_t d2r; 1916 1917 mpfr_init (d2r); 1918 mpfr_const_pi (d2r, GFC_RND_MODE); 1919 mpfr_div_ui (d2r, d2r, 180, GFC_RND_MODE); 1920 mpfr_mul (x, x, d2r, GFC_RND_MODE); 1921 mpfr_clear (d2r); 1922} 1923 1924 1925/* Simplification routines for SIND, COSD, TAND. */ 1926#include "trigd_fe.inc" 1927 1928 1929/* Simplify COSD(X) where X has the unit of degree. */ 1930 1931gfc_expr * 1932gfc_simplify_cosd (gfc_expr *x) 1933{ 1934 gfc_expr *result; 1935 1936 if (x->expr_type != EXPR_CONSTANT) 1937 return NULL; 1938 1939 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1940 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE); 1941 simplify_cosd (result->value.real); 1942 1943 return range_check (result, "COSD"); 1944} 1945 1946 1947/* Simplify SIND(X) where X has the unit of degree. */ 1948 1949gfc_expr * 1950gfc_simplify_sind (gfc_expr *x) 1951{ 1952 gfc_expr *result; 1953 1954 if (x->expr_type != EXPR_CONSTANT) 1955 return NULL; 1956 1957 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1958 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE); 1959 simplify_sind (result->value.real); 1960 1961 return range_check (result, "SIND"); 1962} 1963 1964 1965/* Simplify TAND(X) where X has the unit of degree. */ 1966 1967gfc_expr * 1968gfc_simplify_tand (gfc_expr *x) 1969{ 1970 gfc_expr *result; 1971 1972 if (x->expr_type != EXPR_CONSTANT) 1973 return NULL; 1974 1975 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1976 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE); 1977 simplify_tand (result->value.real); 1978 1979 return range_check (result, "TAND"); 1980} 1981 1982 1983/* Simplify COTAND(X) where X has the unit of degree. */ 1984 1985gfc_expr * 1986gfc_simplify_cotand (gfc_expr *x) 1987{ 1988 gfc_expr *result; 1989 1990 if (x->expr_type != EXPR_CONSTANT) 1991 return NULL; 1992 1993 /* Implement COTAND = -TAND(x+90). 1994 TAND offers correct exact values for multiples of 30 degrees. 1995 This implementation is also compatible with the behavior of some legacy 1996 compilers. Keep this consistent with gfc_conv_intrinsic_cotand. */ 1997 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 1998 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE); 1999 mpfr_add_ui (result->value.real, result->value.real, 90, GFC_RND_MODE); 2000 simplify_tand (result->value.real); 2001 mpfr_neg (result->value.real, result->value.real, GFC_RND_MODE); 2002 2003 return range_check (result, "COTAND"); 2004} 2005 2006 2007gfc_expr * 2008gfc_simplify_cosh (gfc_expr *x) 2009{ 2010 gfc_expr *result; 2011 2012 if (x->expr_type != EXPR_CONSTANT) 2013 return NULL; 2014 2015 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 2016 2017 switch (x->ts.type) 2018 { 2019 case BT_REAL: 2020 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE); 2021 break; 2022 2023 case BT_COMPLEX: 2024 mpc_cosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE); 2025 break; 2026 2027 default: 2028 gcc_unreachable (); 2029 } 2030 2031 return range_check (result, "COSH"); 2032} 2033 2034 2035gfc_expr * 2036gfc_simplify_count (gfc_expr *mask, gfc_expr *dim, gfc_expr *kind) 2037{ 2038 gfc_expr *result; 2039 bool size_zero; 2040 2041 size_zero = gfc_is_size_zero_array (mask); 2042 2043 if (!(is_constant_array_expr (mask) || size_zero) 2044 || !gfc_is_constant_expr (dim) 2045 || !gfc_is_constant_expr (kind)) 2046 return NULL; 2047 2048 result = transformational_result (mask, dim, 2049 BT_INTEGER, 2050 get_kind (BT_INTEGER, kind, "COUNT", 2051 gfc_default_integer_kind), 2052 &mask->where); 2053 2054 init_result_expr (result, 0, NULL); 2055 2056 if (size_zero) 2057 return result; 2058 2059 /* Passing MASK twice, once as data array, once as mask. 2060 Whenever gfc_count is called, '1' is added to the result. */ 2061 return !dim || mask->rank == 1 ? 2062 simplify_transformation_to_scalar (result, mask, mask, gfc_count) : 2063 simplify_transformation_to_array (result, mask, dim, mask, gfc_count, NULL); 2064} 2065 2066/* Simplification routine for cshift. This works by copying the array 2067 expressions into a one-dimensional array, shuffling the values into another 2068 one-dimensional array and creating the new array expression from this. The 2069 shuffling part is basically taken from the library routine. */ 2070 2071gfc_expr * 2072gfc_simplify_cshift (gfc_expr *array, gfc_expr *shift, gfc_expr *dim) 2073{ 2074 gfc_expr *result; 2075 int which; 2076 gfc_expr **arrayvec, **resultvec; 2077 gfc_expr **rptr, **sptr; 2078 mpz_t size; 2079 size_t arraysize, shiftsize, i; 2080 gfc_constructor *array_ctor, *shift_ctor; 2081 ssize_t *shiftvec, *hptr; 2082 ssize_t shift_val, len; 2083 ssize_t count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS], 2084 hs_ex[GFC_MAX_DIMENSIONS + 1], 2085 hstride[GFC_MAX_DIMENSIONS], sstride[GFC_MAX_DIMENSIONS], 2086 a_extent[GFC_MAX_DIMENSIONS], a_stride[GFC_MAX_DIMENSIONS], 2087 h_extent[GFC_MAX_DIMENSIONS], 2088 ss_ex[GFC_MAX_DIMENSIONS + 1]; 2089 ssize_t rsoffset; 2090 int d, n; 2091 bool continue_loop; 2092 gfc_expr **src, **dest; 2093 2094 if (!is_constant_array_expr (array)) 2095 return NULL; 2096 2097 if (shift->rank > 0) 2098 gfc_simplify_expr (shift, 1); 2099 2100 if (!gfc_is_constant_expr (shift)) 2101 return NULL; 2102 2103 /* Make dim zero-based. */ 2104 if (dim) 2105 { 2106 if (!gfc_is_constant_expr (dim)) 2107 return NULL; 2108 which = mpz_get_si (dim->value.integer) - 1; 2109 } 2110 else 2111 which = 0; 2112 2113 if (array->shape == NULL) 2114 return NULL; 2115 2116 gfc_array_size (array, &size); 2117 arraysize = mpz_get_ui (size); 2118 mpz_clear (size); 2119 2120 result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where); 2121 result->shape = gfc_copy_shape (array->shape, array->rank); 2122 result->rank = array->rank; 2123 result->ts.u.derived = array->ts.u.derived; 2124 2125 if (arraysize == 0) 2126 return result; 2127 2128 arrayvec = XCNEWVEC (gfc_expr *, arraysize); 2129 array_ctor = gfc_constructor_first (array->value.constructor); 2130 for (i = 0; i < arraysize; i++) 2131 { 2132 arrayvec[i] = array_ctor->expr; 2133 array_ctor = gfc_constructor_next (array_ctor); 2134 } 2135 2136 resultvec = XCNEWVEC (gfc_expr *, arraysize); 2137 2138 sstride[0] = 0; 2139 extent[0] = 1; 2140 count[0] = 0; 2141 2142 for (d=0; d < array->rank; d++) 2143 { 2144 a_extent[d] = mpz_get_si (array->shape[d]); 2145 a_stride[d] = d == 0 ? 1 : a_stride[d-1] * a_extent[d-1]; 2146 } 2147 2148 if (shift->rank > 0) 2149 { 2150 gfc_array_size (shift, &size); 2151 shiftsize = mpz_get_ui (size); 2152 mpz_clear (size); 2153 shiftvec = XCNEWVEC (ssize_t, shiftsize); 2154 shift_ctor = gfc_constructor_first (shift->value.constructor); 2155 for (d = 0; d < shift->rank; d++) 2156 { 2157 h_extent[d] = mpz_get_si (shift->shape[d]); 2158 hstride[d] = d == 0 ? 1 : hstride[d-1] * h_extent[d-1]; 2159 } 2160 } 2161 else 2162 shiftvec = NULL; 2163 2164 /* Shut up compiler */ 2165 len = 1; 2166 rsoffset = 1; 2167 2168 n = 0; 2169 for (d=0; d < array->rank; d++) 2170 { 2171 if (d == which) 2172 { 2173 rsoffset = a_stride[d]; 2174 len = a_extent[d]; 2175 } 2176 else 2177 { 2178 count[n] = 0; 2179 extent[n] = a_extent[d]; 2180 sstride[n] = a_stride[d]; 2181 ss_ex[n] = sstride[n] * extent[n]; 2182 if (shiftvec) 2183 hs_ex[n] = hstride[n] * extent[n]; 2184 n++; 2185 } 2186 } 2187 ss_ex[n] = 0; 2188 hs_ex[n] = 0; 2189 2190 if (shiftvec) 2191 { 2192 for (i = 0; i < shiftsize; i++) 2193 { 2194 ssize_t val; 2195 val = mpz_get_si (shift_ctor->expr->value.integer); 2196 val = val % len; 2197 if (val < 0) 2198 val += len; 2199 shiftvec[i] = val; 2200 shift_ctor = gfc_constructor_next (shift_ctor); 2201 } 2202 shift_val = 0; 2203 } 2204 else 2205 { 2206 shift_val = mpz_get_si (shift->value.integer); 2207 shift_val = shift_val % len; 2208 if (shift_val < 0) 2209 shift_val += len; 2210 } 2211 2212 continue_loop = true; 2213 d = array->rank; 2214 rptr = resultvec; 2215 sptr = arrayvec; 2216 hptr = shiftvec; 2217 2218 while (continue_loop) 2219 { 2220 ssize_t sh; 2221 if (shiftvec) 2222 sh = *hptr; 2223 else 2224 sh = shift_val; 2225 2226 src = &sptr[sh * rsoffset]; 2227 dest = rptr; 2228 for (n = 0; n < len - sh; n++) 2229 { 2230 *dest = *src; 2231 dest += rsoffset; 2232 src += rsoffset; 2233 } 2234 src = sptr; 2235 for ( n = 0; n < sh; n++) 2236 { 2237 *dest = *src; 2238 dest += rsoffset; 2239 src += rsoffset; 2240 } 2241 rptr += sstride[0]; 2242 sptr += sstride[0]; 2243 if (shiftvec) 2244 hptr += hstride[0]; 2245 count[0]++; 2246 n = 0; 2247 while (count[n] == extent[n]) 2248 { 2249 count[n] = 0; 2250 rptr -= ss_ex[n]; 2251 sptr -= ss_ex[n]; 2252 if (shiftvec) 2253 hptr -= hs_ex[n]; 2254 n++; 2255 if (n >= d - 1) 2256 { 2257 continue_loop = false; 2258 break; 2259 } 2260 else 2261 { 2262 count[n]++; 2263 rptr += sstride[n]; 2264 sptr += sstride[n]; 2265 if (shiftvec) 2266 hptr += hstride[n]; 2267 } 2268 } 2269 } 2270 2271 for (i = 0; i < arraysize; i++) 2272 { 2273 gfc_constructor_append_expr (&result->value.constructor, 2274 gfc_copy_expr (resultvec[i]), 2275 NULL); 2276 } 2277 return result; 2278} 2279 2280 2281gfc_expr * 2282gfc_simplify_dcmplx (gfc_expr *x, gfc_expr *y) 2283{ 2284 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind); 2285} 2286 2287 2288gfc_expr * 2289gfc_simplify_dble (gfc_expr *e) 2290{ 2291 gfc_expr *result = NULL; 2292 int tmp1, tmp2; 2293 2294 if (e->expr_type != EXPR_CONSTANT) 2295 return NULL; 2296 2297 /* For explicit conversion, turn off -Wconversion and -Wconversion-extra 2298 warnings. */ 2299 tmp1 = warn_conversion; 2300 tmp2 = warn_conversion_extra; 2301 warn_conversion = warn_conversion_extra = 0; 2302 2303 result = gfc_convert_constant (e, BT_REAL, gfc_default_double_kind); 2304 2305 warn_conversion = tmp1; 2306 warn_conversion_extra = tmp2; 2307 2308 if (result == &gfc_bad_expr) 2309 return &gfc_bad_expr; 2310 2311 return range_check (result, "DBLE"); 2312} 2313 2314 2315gfc_expr * 2316gfc_simplify_digits (gfc_expr *x) 2317{ 2318 int i, digits; 2319 2320 i = gfc_validate_kind (x->ts.type, x->ts.kind, false); 2321 2322 switch (x->ts.type) 2323 { 2324 case BT_INTEGER: 2325 digits = gfc_integer_kinds[i].digits; 2326 break; 2327 2328 case BT_REAL: 2329 case BT_COMPLEX: 2330 digits = gfc_real_kinds[i].digits; 2331 break; 2332 2333 default: 2334 gcc_unreachable (); 2335 } 2336 2337 return gfc_get_int_expr (gfc_default_integer_kind, NULL, digits); 2338} 2339 2340 2341gfc_expr * 2342gfc_simplify_dim (gfc_expr *x, gfc_expr *y) 2343{ 2344 gfc_expr *result; 2345 int kind; 2346 2347 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT) 2348 return NULL; 2349 2350 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind; 2351 result = gfc_get_constant_expr (x->ts.type, kind, &x->where); 2352 2353 switch (x->ts.type) 2354 { 2355 case BT_INTEGER: 2356 if (mpz_cmp (x->value.integer, y->value.integer) > 0) 2357 mpz_sub (result->value.integer, x->value.integer, y->value.integer); 2358 else 2359 mpz_set_ui (result->value.integer, 0); 2360 2361 break; 2362 2363 case BT_REAL: 2364 if (mpfr_cmp (x->value.real, y->value.real) > 0) 2365 mpfr_sub (result->value.real, x->value.real, y->value.real, 2366 GFC_RND_MODE); 2367 else 2368 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE); 2369 2370 break; 2371 2372 default: 2373 gfc_internal_error ("gfc_simplify_dim(): Bad type"); 2374 } 2375 2376 return range_check (result, "DIM"); 2377} 2378 2379 2380gfc_expr* 2381gfc_simplify_dot_product (gfc_expr *vector_a, gfc_expr *vector_b) 2382{ 2383 /* If vector_a is a zero-sized array, the result is 0 for INTEGER, 2384 REAL, and COMPLEX types and .false. for LOGICAL. */ 2385 if (vector_a->shape && mpz_get_si (vector_a->shape[0]) == 0) 2386 { 2387 if (vector_a->ts.type == BT_LOGICAL) 2388 return gfc_get_logical_expr (gfc_default_logical_kind, NULL, false); 2389 else 2390 return gfc_get_int_expr (gfc_default_integer_kind, NULL, 0); 2391 } 2392 2393 if (!is_constant_array_expr (vector_a) 2394 || !is_constant_array_expr (vector_b)) 2395 return NULL; 2396 2397 return compute_dot_product (vector_a, 1, 0, vector_b, 1, 0, true); 2398} 2399 2400 2401gfc_expr * 2402gfc_simplify_dprod (gfc_expr *x, gfc_expr *y) 2403{ 2404 gfc_expr *a1, *a2, *result; 2405 2406 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT) 2407 return NULL; 2408 2409 a1 = gfc_real2real (x, gfc_default_double_kind); 2410 a2 = gfc_real2real (y, gfc_default_double_kind); 2411 2412 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &x->where); 2413 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE); 2414 2415 gfc_free_expr (a2); 2416 gfc_free_expr (a1); 2417 2418 return range_check (result, "DPROD"); 2419} 2420 2421 2422static gfc_expr * 2423simplify_dshift (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg, 2424 bool right) 2425{ 2426 gfc_expr *result; 2427 int i, k, size, shift; 2428 2429 if (arg1->expr_type != EXPR_CONSTANT || arg2->expr_type != EXPR_CONSTANT 2430 || shiftarg->expr_type != EXPR_CONSTANT) 2431 return NULL; 2432 2433 k = gfc_validate_kind (BT_INTEGER, arg1->ts.kind, false); 2434 size = gfc_integer_kinds[k].bit_size; 2435 2436 gfc_extract_int (shiftarg, &shift); 2437 2438 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */ 2439 if (right) 2440 shift = size - shift; 2441 2442 result = gfc_get_constant_expr (BT_INTEGER, arg1->ts.kind, &arg1->where); 2443 mpz_set_ui (result->value.integer, 0); 2444 2445 for (i = 0; i < shift; i++) 2446 if (mpz_tstbit (arg2->value.integer, size - shift + i)) 2447 mpz_setbit (result->value.integer, i); 2448 2449 for (i = 0; i < size - shift; i++) 2450 if (mpz_tstbit (arg1->value.integer, i)) 2451 mpz_setbit (result->value.integer, shift + i); 2452 2453 /* Convert to a signed value. */ 2454 gfc_convert_mpz_to_signed (result->value.integer, size); 2455 2456 return result; 2457} 2458 2459 2460gfc_expr * 2461gfc_simplify_dshiftr (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg) 2462{ 2463 return simplify_dshift (arg1, arg2, shiftarg, true); 2464} 2465 2466 2467gfc_expr * 2468gfc_simplify_dshiftl (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg) 2469{ 2470 return simplify_dshift (arg1, arg2, shiftarg, false); 2471} 2472 2473 2474gfc_expr * 2475gfc_simplify_eoshift (gfc_expr *array, gfc_expr *shift, gfc_expr *boundary, 2476 gfc_expr *dim) 2477{ 2478 bool temp_boundary; 2479 gfc_expr *bnd; 2480 gfc_expr *result; 2481 int which; 2482 gfc_expr **arrayvec, **resultvec; 2483 gfc_expr **rptr, **sptr; 2484 mpz_t size; 2485 size_t arraysize, i; 2486 gfc_constructor *array_ctor, *shift_ctor, *bnd_ctor; 2487 ssize_t shift_val, len; 2488 ssize_t count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS], 2489 sstride[GFC_MAX_DIMENSIONS], a_extent[GFC_MAX_DIMENSIONS], 2490 a_stride[GFC_MAX_DIMENSIONS], ss_ex[GFC_MAX_DIMENSIONS + 1]; 2491 ssize_t rsoffset; 2492 int d, n; 2493 bool continue_loop; 2494 gfc_expr **src, **dest; 2495 size_t s_len; 2496 2497 if (!is_constant_array_expr (array)) 2498 return NULL; 2499 2500 if (shift->rank > 0) 2501 gfc_simplify_expr (shift, 1); 2502 2503 if (!gfc_is_constant_expr (shift)) 2504 return NULL; 2505 2506 if (boundary) 2507 { 2508 if (boundary->rank > 0) 2509 gfc_simplify_expr (boundary, 1); 2510 2511 if (!gfc_is_constant_expr (boundary)) 2512 return NULL; 2513 } 2514 2515 if (dim) 2516 { 2517 if (!gfc_is_constant_expr (dim)) 2518 return NULL; 2519 which = mpz_get_si (dim->value.integer) - 1; 2520 } 2521 else 2522 which = 0; 2523 2524 s_len = 0; 2525 if (boundary == NULL) 2526 { 2527 temp_boundary = true; 2528 switch (array->ts.type) 2529 { 2530 2531 case BT_INTEGER: 2532 bnd = gfc_get_int_expr (array->ts.kind, NULL, 0); 2533 break; 2534 2535 case BT_LOGICAL: 2536 bnd = gfc_get_logical_expr (array->ts.kind, NULL, 0); 2537 break; 2538 2539 case BT_REAL: 2540 bnd = gfc_get_constant_expr (array->ts.type, array->ts.kind, &gfc_current_locus); 2541 mpfr_set_ui (bnd->value.real, 0, GFC_RND_MODE); 2542 break; 2543 2544 case BT_COMPLEX: 2545 bnd = gfc_get_constant_expr (array->ts.type, array->ts.kind, &gfc_current_locus); 2546 mpc_set_ui (bnd->value.complex, 0, GFC_RND_MODE); 2547 break; 2548 2549 case BT_CHARACTER: 2550 s_len = mpz_get_ui (array->ts.u.cl->length->value.integer); 2551 bnd = gfc_get_character_expr (array->ts.kind, &gfc_current_locus, NULL, s_len); 2552 break; 2553 2554 default: 2555 gcc_unreachable(); 2556 2557 } 2558 } 2559 else 2560 { 2561 temp_boundary = false; 2562 bnd = boundary; 2563 } 2564 2565 gfc_array_size (array, &size); 2566 arraysize = mpz_get_ui (size); 2567 mpz_clear (size); 2568 2569 result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where); 2570 result->shape = gfc_copy_shape (array->shape, array->rank); 2571 result->rank = array->rank; 2572 result->ts = array->ts; 2573 2574 if (arraysize == 0) 2575 goto final; 2576 2577 if (array->shape == NULL) 2578 goto final; 2579 2580 arrayvec = XCNEWVEC (gfc_expr *, arraysize); 2581 array_ctor = gfc_constructor_first (array->value.constructor); 2582 for (i = 0; i < arraysize; i++) 2583 { 2584 arrayvec[i] = array_ctor->expr; 2585 array_ctor = gfc_constructor_next (array_ctor); 2586 } 2587 2588 resultvec = XCNEWVEC (gfc_expr *, arraysize); 2589 2590 extent[0] = 1; 2591 count[0] = 0; 2592 2593 for (d=0; d < array->rank; d++) 2594 { 2595 a_extent[d] = mpz_get_si (array->shape[d]); 2596 a_stride[d] = d == 0 ? 1 : a_stride[d-1] * a_extent[d-1]; 2597 } 2598 2599 if (shift->rank > 0) 2600 { 2601 shift_ctor = gfc_constructor_first (shift->value.constructor); 2602 shift_val = 0; 2603 } 2604 else 2605 { 2606 shift_ctor = NULL; 2607 shift_val = mpz_get_si (shift->value.integer); 2608 } 2609 2610 if (bnd->rank > 0) 2611 bnd_ctor = gfc_constructor_first (bnd->value.constructor); 2612 else 2613 bnd_ctor = NULL; 2614 2615 /* Shut up compiler */ 2616 len = 1; 2617 rsoffset = 1; 2618 2619 n = 0; 2620 for (d=0; d < array->rank; d++) 2621 { 2622 if (d == which) 2623 { 2624 rsoffset = a_stride[d]; 2625 len = a_extent[d]; 2626 } 2627 else 2628 { 2629 count[n] = 0; 2630 extent[n] = a_extent[d]; 2631 sstride[n] = a_stride[d]; 2632 ss_ex[n] = sstride[n] * extent[n]; 2633 n++; 2634 } 2635 } 2636 ss_ex[n] = 0; 2637 2638 continue_loop = true; 2639 d = array->rank; 2640 rptr = resultvec; 2641 sptr = arrayvec; 2642 2643 while (continue_loop) 2644 { 2645 ssize_t sh, delta; 2646 2647 if (shift_ctor) 2648 sh = mpz_get_si (shift_ctor->expr->value.integer); 2649 else 2650 sh = shift_val; 2651 2652 if (( sh >= 0 ? sh : -sh ) > len) 2653 { 2654 delta = len; 2655 sh = len; 2656 } 2657 else 2658 delta = (sh >= 0) ? sh: -sh; 2659 2660 if (sh > 0) 2661 { 2662 src = &sptr[delta * rsoffset]; 2663 dest = rptr; 2664 } 2665 else 2666 { 2667 src = sptr; 2668 dest = &rptr[delta * rsoffset]; 2669 } 2670 2671 for (n = 0; n < len - delta; n++) 2672 { 2673 *dest = *src; 2674 dest += rsoffset; 2675 src += rsoffset; 2676 } 2677 2678 if (sh < 0) 2679 dest = rptr; 2680 2681 n = delta; 2682 2683 if (bnd_ctor) 2684 { 2685 while (n--) 2686 { 2687 *dest = gfc_copy_expr (bnd_ctor->expr); 2688 dest += rsoffset; 2689 } 2690 } 2691 else 2692 { 2693 while (n--) 2694 { 2695 *dest = gfc_copy_expr (bnd); 2696 dest += rsoffset; 2697 } 2698 } 2699 rptr += sstride[0]; 2700 sptr += sstride[0]; 2701 if (shift_ctor) 2702 shift_ctor = gfc_constructor_next (shift_ctor); 2703 2704 if (bnd_ctor) 2705 bnd_ctor = gfc_constructor_next (bnd_ctor); 2706 2707 count[0]++; 2708 n = 0; 2709 while (count[n] == extent[n]) 2710 { 2711 count[n] = 0; 2712 rptr -= ss_ex[n]; 2713 sptr -= ss_ex[n]; 2714 n++; 2715 if (n >= d - 1) 2716 { 2717 continue_loop = false; 2718 break; 2719 } 2720 else 2721 { 2722 count[n]++; 2723 rptr += sstride[n]; 2724 sptr += sstride[n]; 2725 } 2726 } 2727 } 2728 2729 for (i = 0; i < arraysize; i++) 2730 { 2731 gfc_constructor_append_expr (&result->value.constructor, 2732 gfc_copy_expr (resultvec[i]), 2733 NULL); 2734 } 2735 2736 final: 2737 if (temp_boundary) 2738 gfc_free_expr (bnd); 2739 2740 return result; 2741} 2742 2743gfc_expr * 2744gfc_simplify_erf (gfc_expr *x) 2745{ 2746 gfc_expr *result; 2747 2748 if (x->expr_type != EXPR_CONSTANT) 2749 return NULL; 2750 2751 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 2752 mpfr_erf (result->value.real, x->value.real, GFC_RND_MODE); 2753 2754 return range_check (result, "ERF"); 2755} 2756 2757 2758gfc_expr * 2759gfc_simplify_erfc (gfc_expr *x) 2760{ 2761 gfc_expr *result; 2762 2763 if (x->expr_type != EXPR_CONSTANT) 2764 return NULL; 2765 2766 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 2767 mpfr_erfc (result->value.real, x->value.real, GFC_RND_MODE); 2768 2769 return range_check (result, "ERFC"); 2770} 2771 2772 2773/* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */ 2774 2775#define MAX_ITER 200 2776#define ARG_LIMIT 12 2777 2778/* Calculate ERFC_SCALED directly by its definition: 2779 2780 ERFC_SCALED(x) = ERFC(x) * EXP(X**2) 2781 2782 using a large precision for intermediate results. This is used for all 2783 but large values of the argument. */ 2784static void 2785fullprec_erfc_scaled (mpfr_t res, mpfr_t arg) 2786{ 2787 mpfr_prec_t prec; 2788 mpfr_t a, b; 2789 2790 prec = mpfr_get_default_prec (); 2791 mpfr_set_default_prec (10 * prec); 2792 2793 mpfr_init (a); 2794 mpfr_init (b); 2795 2796 mpfr_set (a, arg, GFC_RND_MODE); 2797 mpfr_sqr (b, a, GFC_RND_MODE); 2798 mpfr_exp (b, b, GFC_RND_MODE); 2799 mpfr_erfc (a, a, GFC_RND_MODE); 2800 mpfr_mul (a, a, b, GFC_RND_MODE); 2801 2802 mpfr_set (res, a, GFC_RND_MODE); 2803 mpfr_set_default_prec (prec); 2804 2805 mpfr_clear (a); 2806 mpfr_clear (b); 2807} 2808 2809/* Calculate ERFC_SCALED using a power series expansion in 1/arg: 2810 2811 ERFC_SCALED(x) = 1 / (x * sqrt(pi)) 2812 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1)) 2813 / (2 * x**2)**n) 2814 2815 This is used for large values of the argument. Intermediate calculations 2816 are performed with twice the precision. We don't do a fixed number of 2817 iterations of the sum, but stop when it has converged to the required 2818 precision. */ 2819static void 2820asympt_erfc_scaled (mpfr_t res, mpfr_t arg) 2821{ 2822 mpfr_t sum, x, u, v, w, oldsum, sumtrunc; 2823 mpz_t num; 2824 mpfr_prec_t prec; 2825 unsigned i; 2826 2827 prec = mpfr_get_default_prec (); 2828 mpfr_set_default_prec (2 * prec); 2829 2830 mpfr_init (sum); 2831 mpfr_init (x); 2832 mpfr_init (u); 2833 mpfr_init (v); 2834 mpfr_init (w); 2835 mpz_init (num); 2836 2837 mpfr_init (oldsum); 2838 mpfr_init (sumtrunc); 2839 mpfr_set_prec (oldsum, prec); 2840 mpfr_set_prec (sumtrunc, prec); 2841 2842 mpfr_set (x, arg, GFC_RND_MODE); 2843 mpfr_set_ui (sum, 1, GFC_RND_MODE); 2844 mpz_set_ui (num, 1); 2845 2846 mpfr_set (u, x, GFC_RND_MODE); 2847 mpfr_sqr (u, u, GFC_RND_MODE); 2848 mpfr_mul_ui (u, u, 2, GFC_RND_MODE); 2849 mpfr_pow_si (u, u, -1, GFC_RND_MODE); 2850 2851 for (i = 1; i < MAX_ITER; i++) 2852 { 2853 mpfr_set (oldsum, sum, GFC_RND_MODE); 2854 2855 mpz_mul_ui (num, num, 2 * i - 1); 2856 mpz_neg (num, num); 2857 2858 mpfr_set (w, u, GFC_RND_MODE); 2859 mpfr_pow_ui (w, w, i, GFC_RND_MODE); 2860 2861 mpfr_set_z (v, num, GFC_RND_MODE); 2862 mpfr_mul (v, v, w, GFC_RND_MODE); 2863 2864 mpfr_add (sum, sum, v, GFC_RND_MODE); 2865 2866 mpfr_set (sumtrunc, sum, GFC_RND_MODE); 2867 if (mpfr_cmp (sumtrunc, oldsum) == 0) 2868 break; 2869 } 2870 2871 /* We should have converged by now; otherwise, ARG_LIMIT is probably 2872 set too low. */ 2873 gcc_assert (i < MAX_ITER); 2874 2875 /* Divide by x * sqrt(Pi). */ 2876 mpfr_const_pi (u, GFC_RND_MODE); 2877 mpfr_sqrt (u, u, GFC_RND_MODE); 2878 mpfr_mul (u, u, x, GFC_RND_MODE); 2879 mpfr_div (sum, sum, u, GFC_RND_MODE); 2880 2881 mpfr_set (res, sum, GFC_RND_MODE); 2882 mpfr_set_default_prec (prec); 2883 2884 mpfr_clears (sum, x, u, v, w, oldsum, sumtrunc, NULL); 2885 mpz_clear (num); 2886} 2887 2888 2889gfc_expr * 2890gfc_simplify_erfc_scaled (gfc_expr *x) 2891{ 2892 gfc_expr *result; 2893 2894 if (x->expr_type != EXPR_CONSTANT) 2895 return NULL; 2896 2897 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 2898 if (mpfr_cmp_d (x->value.real, ARG_LIMIT) >= 0) 2899 asympt_erfc_scaled (result->value.real, x->value.real); 2900 else 2901 fullprec_erfc_scaled (result->value.real, x->value.real); 2902 2903 return range_check (result, "ERFC_SCALED"); 2904} 2905 2906#undef MAX_ITER 2907#undef ARG_LIMIT 2908 2909 2910gfc_expr * 2911gfc_simplify_epsilon (gfc_expr *e) 2912{ 2913 gfc_expr *result; 2914 int i; 2915 2916 i = gfc_validate_kind (e->ts.type, e->ts.kind, false); 2917 2918 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where); 2919 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE); 2920 2921 return range_check (result, "EPSILON"); 2922} 2923 2924 2925gfc_expr * 2926gfc_simplify_exp (gfc_expr *x) 2927{ 2928 gfc_expr *result; 2929 2930 if (x->expr_type != EXPR_CONSTANT) 2931 return NULL; 2932 2933 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 2934 2935 switch (x->ts.type) 2936 { 2937 case BT_REAL: 2938 mpfr_exp (result->value.real, x->value.real, GFC_RND_MODE); 2939 break; 2940 2941 case BT_COMPLEX: 2942 gfc_set_model_kind (x->ts.kind); 2943 mpc_exp (result->value.complex, x->value.complex, GFC_MPC_RND_MODE); 2944 break; 2945 2946 default: 2947 gfc_internal_error ("in gfc_simplify_exp(): Bad type"); 2948 } 2949 2950 return range_check (result, "EXP"); 2951} 2952 2953 2954gfc_expr * 2955gfc_simplify_exponent (gfc_expr *x) 2956{ 2957 long int val; 2958 gfc_expr *result; 2959 2960 if (x->expr_type != EXPR_CONSTANT) 2961 return NULL; 2962 2963 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind, 2964 &x->where); 2965 2966 /* EXPONENT(inf) = EXPONENT(nan) = HUGE(0) */ 2967 if (mpfr_inf_p (x->value.real) || mpfr_nan_p (x->value.real)) 2968 { 2969 int i = gfc_validate_kind (BT_INTEGER, gfc_default_integer_kind, false); 2970 mpz_set (result->value.integer, gfc_integer_kinds[i].huge); 2971 return result; 2972 } 2973 2974 /* EXPONENT(+/- 0.0) = 0 */ 2975 if (mpfr_zero_p (x->value.real)) 2976 { 2977 mpz_set_ui (result->value.integer, 0); 2978 return result; 2979 } 2980 2981 gfc_set_model (x->value.real); 2982 2983 val = (long int) mpfr_get_exp (x->value.real); 2984 mpz_set_si (result->value.integer, val); 2985 2986 return range_check (result, "EXPONENT"); 2987} 2988 2989 2990gfc_expr * 2991gfc_simplify_failed_or_stopped_images (gfc_expr *team ATTRIBUTE_UNUSED, 2992 gfc_expr *kind) 2993{ 2994 if (flag_coarray == GFC_FCOARRAY_NONE) 2995 { 2996 gfc_current_locus = *gfc_current_intrinsic_where; 2997 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable"); 2998 return &gfc_bad_expr; 2999 } 3000 3001 if (flag_coarray == GFC_FCOARRAY_SINGLE) 3002 { 3003 gfc_expr *result; 3004 int actual_kind; 3005 if (kind) 3006 gfc_extract_int (kind, &actual_kind); 3007 else 3008 actual_kind = gfc_default_integer_kind; 3009 3010 result = gfc_get_array_expr (BT_INTEGER, actual_kind, &gfc_current_locus); 3011 result->rank = 1; 3012 return result; 3013 } 3014 3015 /* For fcoarray = lib no simplification is possible, because it is not known 3016 what images failed or are stopped at compile time. */ 3017 return NULL; 3018} 3019 3020 3021gfc_expr * 3022gfc_simplify_get_team (gfc_expr *level ATTRIBUTE_UNUSED) 3023{ 3024 if (flag_coarray == GFC_FCOARRAY_NONE) 3025 { 3026 gfc_current_locus = *gfc_current_intrinsic_where; 3027 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable"); 3028 return &gfc_bad_expr; 3029 } 3030 3031 if (flag_coarray == GFC_FCOARRAY_SINGLE) 3032 { 3033 gfc_expr *result; 3034 result = gfc_get_array_expr (BT_INTEGER, gfc_default_integer_kind, &gfc_current_locus); 3035 result->rank = 0; 3036 return result; 3037 } 3038 3039 /* For fcoarray = lib no simplification is possible, because it is not known 3040 what images failed or are stopped at compile time. */ 3041 return NULL; 3042} 3043 3044 3045gfc_expr * 3046gfc_simplify_float (gfc_expr *a) 3047{ 3048 gfc_expr *result; 3049 3050 if (a->expr_type != EXPR_CONSTANT) 3051 return NULL; 3052 3053 result = gfc_int2real (a, gfc_default_real_kind); 3054 3055 return range_check (result, "FLOAT"); 3056} 3057 3058 3059static bool 3060is_last_ref_vtab (gfc_expr *e) 3061{ 3062 gfc_ref *ref; 3063 gfc_component *comp = NULL; 3064 3065 if (e->expr_type != EXPR_VARIABLE) 3066 return false; 3067 3068 for (ref = e->ref; ref; ref = ref->next) 3069 if (ref->type == REF_COMPONENT) 3070 comp = ref->u.c.component; 3071 3072 if (!e->ref || !comp) 3073 return e->symtree->n.sym->attr.vtab; 3074 3075 if (comp->name[0] == '_' && strcmp (comp->name, "_vptr") == 0) 3076 return true; 3077 3078 return false; 3079} 3080 3081 3082gfc_expr * 3083gfc_simplify_extends_type_of (gfc_expr *a, gfc_expr *mold) 3084{ 3085 /* Avoid simplification of resolved symbols. */ 3086 if (is_last_ref_vtab (a) || is_last_ref_vtab (mold)) 3087 return NULL; 3088 3089 if (a->ts.type == BT_DERIVED && mold->ts.type == BT_DERIVED) 3090 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, 3091 gfc_type_is_extension_of (mold->ts.u.derived, 3092 a->ts.u.derived)); 3093 3094 if (UNLIMITED_POLY (a) || UNLIMITED_POLY (mold)) 3095 return NULL; 3096 3097 if ((a->ts.type == BT_CLASS && !gfc_expr_attr (a).class_ok) 3098 || (mold->ts.type == BT_CLASS && !gfc_expr_attr (mold).class_ok)) 3099 return NULL; 3100 3101 /* Return .false. if the dynamic type can never be an extension. */ 3102 if ((a->ts.type == BT_CLASS && mold->ts.type == BT_CLASS 3103 && !gfc_type_is_extension_of 3104 (mold->ts.u.derived->components->ts.u.derived, 3105 a->ts.u.derived->components->ts.u.derived) 3106 && !gfc_type_is_extension_of 3107 (a->ts.u.derived->components->ts.u.derived, 3108 mold->ts.u.derived->components->ts.u.derived)) 3109 || (a->ts.type == BT_DERIVED && mold->ts.type == BT_CLASS 3110 && !gfc_type_is_extension_of 3111 (mold->ts.u.derived->components->ts.u.derived, 3112 a->ts.u.derived)) 3113 || (a->ts.type == BT_CLASS && mold->ts.type == BT_DERIVED 3114 && !gfc_type_is_extension_of 3115 (mold->ts.u.derived, 3116 a->ts.u.derived->components->ts.u.derived) 3117 && !gfc_type_is_extension_of 3118 (a->ts.u.derived->components->ts.u.derived, 3119 mold->ts.u.derived))) 3120 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false); 3121 3122 /* Return .true. if the dynamic type is guaranteed to be an extension. */ 3123 if (a->ts.type == BT_CLASS && mold->ts.type == BT_DERIVED 3124 && gfc_type_is_extension_of (mold->ts.u.derived, 3125 a->ts.u.derived->components->ts.u.derived)) 3126 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, true); 3127 3128 return NULL; 3129} 3130 3131 3132gfc_expr * 3133gfc_simplify_same_type_as (gfc_expr *a, gfc_expr *b) 3134{ 3135 /* Avoid simplification of resolved symbols. */ 3136 if (is_last_ref_vtab (a) || is_last_ref_vtab (b)) 3137 return NULL; 3138 3139 /* Return .false. if the dynamic type can never be the 3140 same. */ 3141 if (((a->ts.type == BT_CLASS && gfc_expr_attr (a).class_ok) 3142 || (b->ts.type == BT_CLASS && gfc_expr_attr (b).class_ok)) 3143 && !gfc_type_compatible (&a->ts, &b->ts) 3144 && !gfc_type_compatible (&b->ts, &a->ts)) 3145 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false); 3146 3147 if (a->ts.type != BT_DERIVED || b->ts.type != BT_DERIVED) 3148 return NULL; 3149 3150 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, 3151 gfc_compare_derived_types (a->ts.u.derived, 3152 b->ts.u.derived)); 3153} 3154 3155 3156gfc_expr * 3157gfc_simplify_floor (gfc_expr *e, gfc_expr *k) 3158{ 3159 gfc_expr *result; 3160 mpfr_t floor; 3161 int kind; 3162 3163 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind); 3164 if (kind == -1) 3165 gfc_internal_error ("gfc_simplify_floor(): Bad kind"); 3166 3167 if (e->expr_type != EXPR_CONSTANT) 3168 return NULL; 3169 3170 mpfr_init2 (floor, mpfr_get_prec (e->value.real)); 3171 mpfr_floor (floor, e->value.real); 3172 3173 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where); 3174 gfc_mpfr_to_mpz (result->value.integer, floor, &e->where); 3175 3176 mpfr_clear (floor); 3177 3178 return range_check (result, "FLOOR"); 3179} 3180 3181 3182gfc_expr * 3183gfc_simplify_fraction (gfc_expr *x) 3184{ 3185 gfc_expr *result; 3186 mpfr_exp_t e; 3187 3188 if (x->expr_type != EXPR_CONSTANT) 3189 return NULL; 3190 3191 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where); 3192 3193 /* FRACTION(inf) = NaN. */ 3194 if (mpfr_inf_p (x->value.real)) 3195 { 3196 mpfr_set_nan (result->value.real); 3197 return result; 3198 } 3199 3200 /* mpfr_frexp() correctly handles zeros and NaNs. */ 3201 mpfr_frexp (&e, result->value.real, x->value.real, GFC_RND_MODE); 3202 3203 return range_check (result, "FRACTION"); 3204} 3205 3206 3207gfc_expr * 3208gfc_simplify_gamma (gfc_expr *x) 3209{ 3210 gfc_expr *result; 3211 3212 if (x->expr_type != EXPR_CONSTANT) 3213 return NULL; 3214 3215 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 3216 mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE); 3217 3218 return range_check (result, "GAMMA"); 3219} 3220 3221 3222gfc_expr * 3223gfc_simplify_huge (gfc_expr *e) 3224{ 3225 gfc_expr *result; 3226 int i; 3227 3228 i = gfc_validate_kind (e->ts.type, e->ts.kind, false); 3229 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where); 3230 3231 switch (e->ts.type) 3232 { 3233 case BT_INTEGER: 3234 mpz_set (result->value.integer, gfc_integer_kinds[i].huge); 3235 break; 3236 3237 case BT_REAL: 3238 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE); 3239 break; 3240 3241 default: 3242 gcc_unreachable (); 3243 } 3244 3245 return result; 3246} 3247 3248 3249gfc_expr * 3250gfc_simplify_hypot (gfc_expr *x, gfc_expr *y) 3251{ 3252 gfc_expr *result; 3253 3254 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT) 3255 return NULL; 3256 3257 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 3258 mpfr_hypot (result->value.real, x->value.real, y->value.real, GFC_RND_MODE); 3259 return range_check (result, "HYPOT"); 3260} 3261 3262 3263/* We use the processor's collating sequence, because all 3264 systems that gfortran currently works on are ASCII. */ 3265 3266gfc_expr * 3267gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind) 3268{ 3269 gfc_expr *result; 3270 gfc_char_t index; 3271 int k; 3272 3273 if (e->expr_type != EXPR_CONSTANT) 3274 return NULL; 3275 3276 if (e->value.character.length != 1) 3277 { 3278 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where); 3279 return &gfc_bad_expr; 3280 } 3281 3282 index = e->value.character.string[0]; 3283 3284 if (warn_surprising && index > 127) 3285 gfc_warning (OPT_Wsurprising, 3286 "Argument of IACHAR function at %L outside of range 0..127", 3287 &e->where); 3288 3289 k = get_kind (BT_INTEGER, kind, "IACHAR", gfc_default_integer_kind); 3290 if (k == -1) 3291 return &gfc_bad_expr; 3292 3293 result = gfc_get_int_expr (k, &e->where, index); 3294 3295 return range_check (result, "IACHAR"); 3296} 3297 3298 3299static gfc_expr * 3300do_bit_and (gfc_expr *result, gfc_expr *e) 3301{ 3302 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT); 3303 gcc_assert (result->ts.type == BT_INTEGER 3304 && result->expr_type == EXPR_CONSTANT); 3305 3306 mpz_and (result->value.integer, result->value.integer, e->value.integer); 3307 return result; 3308} 3309 3310 3311gfc_expr * 3312gfc_simplify_iall (gfc_expr *array, gfc_expr *dim, gfc_expr *mask) 3313{ 3314 return simplify_transformation (array, dim, mask, -1, do_bit_and); 3315} 3316 3317 3318static gfc_expr * 3319do_bit_ior (gfc_expr *result, gfc_expr *e) 3320{ 3321 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT); 3322 gcc_assert (result->ts.type == BT_INTEGER 3323 && result->expr_type == EXPR_CONSTANT); 3324 3325 mpz_ior (result->value.integer, result->value.integer, e->value.integer); 3326 return result; 3327} 3328 3329 3330gfc_expr * 3331gfc_simplify_iany (gfc_expr *array, gfc_expr *dim, gfc_expr *mask) 3332{ 3333 return simplify_transformation (array, dim, mask, 0, do_bit_ior); 3334} 3335 3336 3337gfc_expr * 3338gfc_simplify_iand (gfc_expr *x, gfc_expr *y) 3339{ 3340 gfc_expr *result; 3341 3342 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT) 3343 return NULL; 3344 3345 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where); 3346 mpz_and (result->value.integer, x->value.integer, y->value.integer); 3347 3348 return range_check (result, "IAND"); 3349} 3350 3351 3352gfc_expr * 3353gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y) 3354{ 3355 gfc_expr *result; 3356 int k, pos; 3357 3358 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT) 3359 return NULL; 3360 3361 gfc_extract_int (y, &pos); 3362 3363 k = gfc_validate_kind (x->ts.type, x->ts.kind, false); 3364 3365 result = gfc_copy_expr (x); 3366 3367 convert_mpz_to_unsigned (result->value.integer, 3368 gfc_integer_kinds[k].bit_size); 3369 3370 mpz_clrbit (result->value.integer, pos); 3371 3372 gfc_convert_mpz_to_signed (result->value.integer, 3373 gfc_integer_kinds[k].bit_size); 3374 3375 return result; 3376} 3377 3378 3379gfc_expr * 3380gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z) 3381{ 3382 gfc_expr *result; 3383 int pos, len; 3384 int i, k, bitsize; 3385 int *bits; 3386 3387 if (x->expr_type != EXPR_CONSTANT 3388 || y->expr_type != EXPR_CONSTANT 3389 || z->expr_type != EXPR_CONSTANT) 3390 return NULL; 3391 3392 gfc_extract_int (y, &pos); 3393 gfc_extract_int (z, &len); 3394 3395 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false); 3396 3397 bitsize = gfc_integer_kinds[k].bit_size; 3398 3399 if (pos + len > bitsize) 3400 { 3401 gfc_error ("Sum of second and third arguments of IBITS exceeds " 3402 "bit size at %L", &y->where); 3403 return &gfc_bad_expr; 3404 } 3405 3406 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 3407 convert_mpz_to_unsigned (result->value.integer, 3408 gfc_integer_kinds[k].bit_size); 3409 3410 bits = XCNEWVEC (int, bitsize); 3411 3412 for (i = 0; i < bitsize; i++) 3413 bits[i] = 0; 3414 3415 for (i = 0; i < len; i++) 3416 bits[i] = mpz_tstbit (x->value.integer, i + pos); 3417 3418 for (i = 0; i < bitsize; i++) 3419 { 3420 if (bits[i] == 0) 3421 mpz_clrbit (result->value.integer, i); 3422 else if (bits[i] == 1) 3423 mpz_setbit (result->value.integer, i); 3424 else 3425 gfc_internal_error ("IBITS: Bad bit"); 3426 } 3427 3428 free (bits); 3429 3430 gfc_convert_mpz_to_signed (result->value.integer, 3431 gfc_integer_kinds[k].bit_size); 3432 3433 return result; 3434} 3435 3436 3437gfc_expr * 3438gfc_simplify_ibset (gfc_expr *x, gfc_expr *y) 3439{ 3440 gfc_expr *result; 3441 int k, pos; 3442 3443 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT) 3444 return NULL; 3445 3446 gfc_extract_int (y, &pos); 3447 3448 k = gfc_validate_kind (x->ts.type, x->ts.kind, false); 3449 3450 result = gfc_copy_expr (x); 3451 3452 convert_mpz_to_unsigned (result->value.integer, 3453 gfc_integer_kinds[k].bit_size); 3454 3455 mpz_setbit (result->value.integer, pos); 3456 3457 gfc_convert_mpz_to_signed (result->value.integer, 3458 gfc_integer_kinds[k].bit_size); 3459 3460 return result; 3461} 3462 3463 3464gfc_expr * 3465gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind) 3466{ 3467 gfc_expr *result; 3468 gfc_char_t index; 3469 int k; 3470 3471 if (e->expr_type != EXPR_CONSTANT) 3472 return NULL; 3473 3474 if (e->value.character.length != 1) 3475 { 3476 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where); 3477 return &gfc_bad_expr; 3478 } 3479 3480 index = e->value.character.string[0]; 3481 3482 k = get_kind (BT_INTEGER, kind, "ICHAR", gfc_default_integer_kind); 3483 if (k == -1) 3484 return &gfc_bad_expr; 3485 3486 result = gfc_get_int_expr (k, &e->where, index); 3487 3488 return range_check (result, "ICHAR"); 3489} 3490 3491 3492gfc_expr * 3493gfc_simplify_ieor (gfc_expr *x, gfc_expr *y) 3494{ 3495 gfc_expr *result; 3496 3497 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT) 3498 return NULL; 3499 3500 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where); 3501 mpz_xor (result->value.integer, x->value.integer, y->value.integer); 3502 3503 return range_check (result, "IEOR"); 3504} 3505 3506 3507gfc_expr * 3508gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind) 3509{ 3510 gfc_expr *result; 3511 bool back; 3512 HOST_WIDE_INT len, lensub, start, last, i, index = 0; 3513 int k, delta; 3514 3515 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT 3516 || ( b != NULL && b->expr_type != EXPR_CONSTANT)) 3517 return NULL; 3518 3519 back = (b != NULL && b->value.logical != 0); 3520 3521 k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind); 3522 if (k == -1) 3523 return &gfc_bad_expr; 3524 3525 result = gfc_get_constant_expr (BT_INTEGER, k, &x->where); 3526 3527 len = x->value.character.length; 3528 lensub = y->value.character.length; 3529 3530 if (len < lensub) 3531 { 3532 mpz_set_si (result->value.integer, 0); 3533 return result; 3534 } 3535 3536 if (lensub == 0) 3537 { 3538 if (back) 3539 index = len + 1; 3540 else 3541 index = 1; 3542 goto done; 3543 } 3544 3545 if (!back) 3546 { 3547 last = len + 1 - lensub; 3548 start = 0; 3549 delta = 1; 3550 } 3551 else 3552 { 3553 last = -1; 3554 start = len - lensub; 3555 delta = -1; 3556 } 3557 3558 for (; start != last; start += delta) 3559 { 3560 for (i = 0; i < lensub; i++) 3561 { 3562 if (x->value.character.string[start + i] 3563 != y->value.character.string[i]) 3564 break; 3565 } 3566 if (i == lensub) 3567 { 3568 index = start + 1; 3569 goto done; 3570 } 3571 } 3572 3573done: 3574 mpz_set_si (result->value.integer, index); 3575 return range_check (result, "INDEX"); 3576} 3577 3578 3579static gfc_expr * 3580simplify_intconv (gfc_expr *e, int kind, const char *name) 3581{ 3582 gfc_expr *result = NULL; 3583 int tmp1, tmp2; 3584 3585 /* Convert BOZ to integer, and return without range checking. */ 3586 if (e->ts.type == BT_BOZ) 3587 { 3588 if (!gfc_boz2int (e, kind)) 3589 return NULL; 3590 result = gfc_copy_expr (e); 3591 return result; 3592 } 3593 3594 if (e->expr_type != EXPR_CONSTANT) 3595 return NULL; 3596 3597 /* For explicit conversion, turn off -Wconversion and -Wconversion-extra 3598 warnings. */ 3599 tmp1 = warn_conversion; 3600 tmp2 = warn_conversion_extra; 3601 warn_conversion = warn_conversion_extra = 0; 3602 3603 result = gfc_convert_constant (e, BT_INTEGER, kind); 3604 3605 warn_conversion = tmp1; 3606 warn_conversion_extra = tmp2; 3607 3608 if (result == &gfc_bad_expr) 3609 return &gfc_bad_expr; 3610 3611 return range_check (result, name); 3612} 3613 3614 3615gfc_expr * 3616gfc_simplify_int (gfc_expr *e, gfc_expr *k) 3617{ 3618 int kind; 3619 3620 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind); 3621 if (kind == -1) 3622 return &gfc_bad_expr; 3623 3624 return simplify_intconv (e, kind, "INT"); 3625} 3626 3627gfc_expr * 3628gfc_simplify_int2 (gfc_expr *e) 3629{ 3630 return simplify_intconv (e, 2, "INT2"); 3631} 3632 3633 3634gfc_expr * 3635gfc_simplify_int8 (gfc_expr *e) 3636{ 3637 return simplify_intconv (e, 8, "INT8"); 3638} 3639 3640 3641gfc_expr * 3642gfc_simplify_long (gfc_expr *e) 3643{ 3644 return simplify_intconv (e, 4, "LONG"); 3645} 3646 3647 3648gfc_expr * 3649gfc_simplify_ifix (gfc_expr *e) 3650{ 3651 gfc_expr *rtrunc, *result; 3652 3653 if (e->expr_type != EXPR_CONSTANT) 3654 return NULL; 3655 3656 rtrunc = gfc_copy_expr (e); 3657 mpfr_trunc (rtrunc->value.real, e->value.real); 3658 3659 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind, 3660 &e->where); 3661 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where); 3662 3663 gfc_free_expr (rtrunc); 3664 3665 return range_check (result, "IFIX"); 3666} 3667 3668 3669gfc_expr * 3670gfc_simplify_idint (gfc_expr *e) 3671{ 3672 gfc_expr *rtrunc, *result; 3673 3674 if (e->expr_type != EXPR_CONSTANT) 3675 return NULL; 3676 3677 rtrunc = gfc_copy_expr (e); 3678 mpfr_trunc (rtrunc->value.real, e->value.real); 3679 3680 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind, 3681 &e->where); 3682 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where); 3683 3684 gfc_free_expr (rtrunc); 3685 3686 return range_check (result, "IDINT"); 3687} 3688 3689 3690gfc_expr * 3691gfc_simplify_ior (gfc_expr *x, gfc_expr *y) 3692{ 3693 gfc_expr *result; 3694 3695 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT) 3696 return NULL; 3697 3698 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where); 3699 mpz_ior (result->value.integer, x->value.integer, y->value.integer); 3700 3701 return range_check (result, "IOR"); 3702} 3703 3704 3705static gfc_expr * 3706do_bit_xor (gfc_expr *result, gfc_expr *e) 3707{ 3708 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT); 3709 gcc_assert (result->ts.type == BT_INTEGER 3710 && result->expr_type == EXPR_CONSTANT); 3711 3712 mpz_xor (result->value.integer, result->value.integer, e->value.integer); 3713 return result; 3714} 3715 3716 3717gfc_expr * 3718gfc_simplify_iparity (gfc_expr *array, gfc_expr *dim, gfc_expr *mask) 3719{ 3720 return simplify_transformation (array, dim, mask, 0, do_bit_xor); 3721} 3722 3723 3724gfc_expr * 3725gfc_simplify_is_iostat_end (gfc_expr *x) 3726{ 3727 if (x->expr_type != EXPR_CONSTANT) 3728 return NULL; 3729 3730 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where, 3731 mpz_cmp_si (x->value.integer, 3732 LIBERROR_END) == 0); 3733} 3734 3735 3736gfc_expr * 3737gfc_simplify_is_iostat_eor (gfc_expr *x) 3738{ 3739 if (x->expr_type != EXPR_CONSTANT) 3740 return NULL; 3741 3742 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where, 3743 mpz_cmp_si (x->value.integer, 3744 LIBERROR_EOR) == 0); 3745} 3746 3747 3748gfc_expr * 3749gfc_simplify_isnan (gfc_expr *x) 3750{ 3751 if (x->expr_type != EXPR_CONSTANT) 3752 return NULL; 3753 3754 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where, 3755 mpfr_nan_p (x->value.real)); 3756} 3757 3758 3759/* Performs a shift on its first argument. Depending on the last 3760 argument, the shift can be arithmetic, i.e. with filling from the 3761 left like in the SHIFTA intrinsic. */ 3762static gfc_expr * 3763simplify_shift (gfc_expr *e, gfc_expr *s, const char *name, 3764 bool arithmetic, int direction) 3765{ 3766 gfc_expr *result; 3767 int ashift, *bits, i, k, bitsize, shift; 3768 3769 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT) 3770 return NULL; 3771 3772 gfc_extract_int (s, &shift); 3773 3774 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false); 3775 bitsize = gfc_integer_kinds[k].bit_size; 3776 3777 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where); 3778 3779 if (shift == 0) 3780 { 3781 mpz_set (result->value.integer, e->value.integer); 3782 return result; 3783 } 3784 3785 if (direction > 0 && shift < 0) 3786 { 3787 /* Left shift, as in SHIFTL. */ 3788 gfc_error ("Second argument of %s is negative at %L", name, &e->where); 3789 return &gfc_bad_expr; 3790 } 3791 else if (direction < 0) 3792 { 3793 /* Right shift, as in SHIFTR or SHIFTA. */ 3794 if (shift < 0) 3795 { 3796 gfc_error ("Second argument of %s is negative at %L", 3797 name, &e->where); 3798 return &gfc_bad_expr; 3799 } 3800 3801 shift = -shift; 3802 } 3803 3804 ashift = (shift >= 0 ? shift : -shift); 3805 3806 if (ashift > bitsize) 3807 { 3808 gfc_error ("Magnitude of second argument of %s exceeds bit size " 3809 "at %L", name, &e->where); 3810 return &gfc_bad_expr; 3811 } 3812 3813 bits = XCNEWVEC (int, bitsize); 3814 3815 for (i = 0; i < bitsize; i++) 3816 bits[i] = mpz_tstbit (e->value.integer, i); 3817 3818 if (shift > 0) 3819 { 3820 /* Left shift. */ 3821 for (i = 0; i < shift; i++) 3822 mpz_clrbit (result->value.integer, i); 3823 3824 for (i = 0; i < bitsize - shift; i++) 3825 { 3826 if (bits[i] == 0) 3827 mpz_clrbit (result->value.integer, i + shift); 3828 else 3829 mpz_setbit (result->value.integer, i + shift); 3830 } 3831 } 3832 else 3833 { 3834 /* Right shift. */ 3835 if (arithmetic && bits[bitsize - 1]) 3836 for (i = bitsize - 1; i >= bitsize - ashift; i--) 3837 mpz_setbit (result->value.integer, i); 3838 else 3839 for (i = bitsize - 1; i >= bitsize - ashift; i--) 3840 mpz_clrbit (result->value.integer, i); 3841 3842 for (i = bitsize - 1; i >= ashift; i--) 3843 { 3844 if (bits[i] == 0) 3845 mpz_clrbit (result->value.integer, i - ashift); 3846 else 3847 mpz_setbit (result->value.integer, i - ashift); 3848 } 3849 } 3850 3851 gfc_convert_mpz_to_signed (result->value.integer, bitsize); 3852 free (bits); 3853 3854 return result; 3855} 3856 3857 3858gfc_expr * 3859gfc_simplify_ishft (gfc_expr *e, gfc_expr *s) 3860{ 3861 return simplify_shift (e, s, "ISHFT", false, 0); 3862} 3863 3864 3865gfc_expr * 3866gfc_simplify_lshift (gfc_expr *e, gfc_expr *s) 3867{ 3868 return simplify_shift (e, s, "LSHIFT", false, 1); 3869} 3870 3871 3872gfc_expr * 3873gfc_simplify_rshift (gfc_expr *e, gfc_expr *s) 3874{ 3875 return simplify_shift (e, s, "RSHIFT", true, -1); 3876} 3877 3878 3879gfc_expr * 3880gfc_simplify_shifta (gfc_expr *e, gfc_expr *s) 3881{ 3882 return simplify_shift (e, s, "SHIFTA", true, -1); 3883} 3884 3885 3886gfc_expr * 3887gfc_simplify_shiftl (gfc_expr *e, gfc_expr *s) 3888{ 3889 return simplify_shift (e, s, "SHIFTL", false, 1); 3890} 3891 3892 3893gfc_expr * 3894gfc_simplify_shiftr (gfc_expr *e, gfc_expr *s) 3895{ 3896 return simplify_shift (e, s, "SHIFTR", false, -1); 3897} 3898 3899 3900gfc_expr * 3901gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz) 3902{ 3903 gfc_expr *result; 3904 int shift, ashift, isize, ssize, delta, k; 3905 int i, *bits; 3906 3907 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT) 3908 return NULL; 3909 3910 gfc_extract_int (s, &shift); 3911 3912 k = gfc_validate_kind (e->ts.type, e->ts.kind, false); 3913 isize = gfc_integer_kinds[k].bit_size; 3914 3915 if (sz != NULL) 3916 { 3917 if (sz->expr_type != EXPR_CONSTANT) 3918 return NULL; 3919 3920 gfc_extract_int (sz, &ssize); 3921 } 3922 else 3923 ssize = isize; 3924 3925 if (shift >= 0) 3926 ashift = shift; 3927 else 3928 ashift = -shift; 3929 3930 if (ashift > ssize) 3931 { 3932 if (sz == NULL) 3933 gfc_error ("Magnitude of second argument of ISHFTC exceeds " 3934 "BIT_SIZE of first argument at %C"); 3935 else 3936 gfc_error ("Absolute value of SHIFT shall be less than or equal " 3937 "to SIZE at %C"); 3938 return &gfc_bad_expr; 3939 } 3940 3941 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where); 3942 3943 mpz_set (result->value.integer, e->value.integer); 3944 3945 if (shift == 0) 3946 return result; 3947 3948 convert_mpz_to_unsigned (result->value.integer, isize); 3949 3950 bits = XCNEWVEC (int, ssize); 3951 3952 for (i = 0; i < ssize; i++) 3953 bits[i] = mpz_tstbit (e->value.integer, i); 3954 3955 delta = ssize - ashift; 3956 3957 if (shift > 0) 3958 { 3959 for (i = 0; i < delta; i++) 3960 { 3961 if (bits[i] == 0) 3962 mpz_clrbit (result->value.integer, i + shift); 3963 else 3964 mpz_setbit (result->value.integer, i + shift); 3965 } 3966 3967 for (i = delta; i < ssize; i++) 3968 { 3969 if (bits[i] == 0) 3970 mpz_clrbit (result->value.integer, i - delta); 3971 else 3972 mpz_setbit (result->value.integer, i - delta); 3973 } 3974 } 3975 else 3976 { 3977 for (i = 0; i < ashift; i++) 3978 { 3979 if (bits[i] == 0) 3980 mpz_clrbit (result->value.integer, i + delta); 3981 else 3982 mpz_setbit (result->value.integer, i + delta); 3983 } 3984 3985 for (i = ashift; i < ssize; i++) 3986 { 3987 if (bits[i] == 0) 3988 mpz_clrbit (result->value.integer, i + shift); 3989 else 3990 mpz_setbit (result->value.integer, i + shift); 3991 } 3992 } 3993 3994 gfc_convert_mpz_to_signed (result->value.integer, isize); 3995 3996 free (bits); 3997 return result; 3998} 3999 4000 4001gfc_expr * 4002gfc_simplify_kind (gfc_expr *e) 4003{ 4004 return gfc_get_int_expr (gfc_default_integer_kind, NULL, e->ts.kind); 4005} 4006 4007 4008static gfc_expr * 4009simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper, 4010 gfc_array_spec *as, gfc_ref *ref, bool coarray) 4011{ 4012 gfc_expr *l, *u, *result; 4013 int k; 4014 4015 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND", 4016 gfc_default_integer_kind); 4017 if (k == -1) 4018 return &gfc_bad_expr; 4019 4020 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where); 4021 4022 /* For non-variables, LBOUND(expr, DIM=n) = 1 and 4023 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */ 4024 if (!coarray && array->expr_type != EXPR_VARIABLE) 4025 { 4026 if (upper) 4027 { 4028 gfc_expr* dim = result; 4029 mpz_set_si (dim->value.integer, d); 4030 4031 result = simplify_size (array, dim, k); 4032 gfc_free_expr (dim); 4033 if (!result) 4034 goto returnNull; 4035 } 4036 else 4037 mpz_set_si (result->value.integer, 1); 4038 4039 goto done; 4040 } 4041 4042 /* Otherwise, we have a variable expression. */ 4043 gcc_assert (array->expr_type == EXPR_VARIABLE); 4044 gcc_assert (as); 4045 4046 if (!gfc_resolve_array_spec (as, 0)) 4047 return NULL; 4048 4049 /* The last dimension of an assumed-size array is special. */ 4050 if ((!coarray && d == as->rank && as->type == AS_ASSUMED_SIZE && !upper) 4051 || (coarray && d == as->rank + as->corank 4052 && (!upper || flag_coarray == GFC_FCOARRAY_SINGLE))) 4053 { 4054 if (as->lower[d-1] && as->lower[d-1]->expr_type == EXPR_CONSTANT) 4055 { 4056 gfc_free_expr (result); 4057 return gfc_copy_expr (as->lower[d-1]); 4058 } 4059 4060 goto returnNull; 4061 } 4062 4063 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where); 4064 4065 /* Then, we need to know the extent of the given dimension. */ 4066 if (coarray || (ref->u.ar.type == AR_FULL && !ref->next)) 4067 { 4068 gfc_expr *declared_bound; 4069 int empty_bound; 4070 bool constant_lbound, constant_ubound; 4071 4072 l = as->lower[d-1]; 4073 u = as->upper[d-1]; 4074 4075 gcc_assert (l != NULL); 4076 4077 constant_lbound = l->expr_type == EXPR_CONSTANT; 4078 constant_ubound = u && u->expr_type == EXPR_CONSTANT; 4079 4080 empty_bound = upper ? 0 : 1; 4081 declared_bound = upper ? u : l; 4082 4083 if ((!upper && !constant_lbound) 4084 || (upper && !constant_ubound)) 4085 goto returnNull; 4086 4087 if (!coarray) 4088 { 4089 /* For {L,U}BOUND, the value depends on whether the array 4090 is empty. We can nevertheless simplify if the declared bound 4091 has the same value as that of an empty array, in which case 4092 the result isn't dependent on the array emptyness. */ 4093 if (mpz_cmp_si (declared_bound->value.integer, empty_bound) == 0) 4094 mpz_set_si (result->value.integer, empty_bound); 4095 else if (!constant_lbound || !constant_ubound) 4096 /* Array emptyness can't be determined, we can't simplify. */ 4097 goto returnNull; 4098 else if (mpz_cmp (l->value.integer, u->value.integer) > 0) 4099 mpz_set_si (result->value.integer, empty_bound); 4100 else 4101 mpz_set (result->value.integer, declared_bound->value.integer); 4102 } 4103 else 4104 mpz_set (result->value.integer, declared_bound->value.integer); 4105 } 4106 else 4107 { 4108 if (upper) 4109 { 4110 int d2 = 0, cnt = 0; 4111 for (int idx = 0; idx < ref->u.ar.dimen; ++idx) 4112 { 4113 if (ref->u.ar.dimen_type[idx] == DIMEN_ELEMENT) 4114 d2++; 4115 else if (cnt < d - 1) 4116 cnt++; 4117 else 4118 break; 4119 } 4120 if (!gfc_ref_dimen_size (&ref->u.ar, d2 + d - 1, &result->value.integer, NULL)) 4121 goto returnNull; 4122 } 4123 else 4124 mpz_set_si (result->value.integer, (long int) 1); 4125 } 4126 4127done: 4128 return range_check (result, upper ? "UBOUND" : "LBOUND"); 4129 4130returnNull: 4131 gfc_free_expr (result); 4132 return NULL; 4133} 4134 4135 4136static gfc_expr * 4137simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper) 4138{ 4139 gfc_ref *ref; 4140 gfc_array_spec *as; 4141 ar_type type = AR_UNKNOWN; 4142 int d; 4143 4144 if (array->ts.type == BT_CLASS) 4145 return NULL; 4146 4147 if (array->expr_type != EXPR_VARIABLE) 4148 { 4149 as = NULL; 4150 ref = NULL; 4151 goto done; 4152 } 4153 4154 /* Do not attempt to resolve if error has already been issued. */ 4155 if (array->symtree->n.sym->error) 4156 return NULL; 4157 4158 /* Follow any component references. */ 4159 as = array->symtree->n.sym->as; 4160 for (ref = array->ref; ref; ref = ref->next) 4161 { 4162 switch (ref->type) 4163 { 4164 case REF_ARRAY: 4165 type = ref->u.ar.type; 4166 switch (ref->u.ar.type) 4167 { 4168 case AR_ELEMENT: 4169 as = NULL; 4170 continue; 4171 4172 case AR_FULL: 4173 /* We're done because 'as' has already been set in the 4174 previous iteration. */ 4175 goto done; 4176 4177 case AR_UNKNOWN: 4178 return NULL; 4179 4180 case AR_SECTION: 4181 as = ref->u.ar.as; 4182 goto done; 4183 } 4184 4185 gcc_unreachable (); 4186 4187 case REF_COMPONENT: 4188 as = ref->u.c.component->as; 4189 continue; 4190 4191 case REF_SUBSTRING: 4192 case REF_INQUIRY: 4193 continue; 4194 } 4195 } 4196 4197 gcc_unreachable (); 4198 4199 done: 4200 4201 if (as && (as->type == AS_DEFERRED || as->type == AS_ASSUMED_RANK 4202 || (as->type == AS_ASSUMED_SHAPE && upper))) 4203 return NULL; 4204 4205 /* 'array' shall not be an unallocated allocatable variable or a pointer that 4206 is not associated. */ 4207 if (array->expr_type == EXPR_VARIABLE 4208 && (gfc_expr_attr (array).allocatable || gfc_expr_attr (array).pointer)) 4209 return NULL; 4210 4211 gcc_assert (!as 4212 || (as->type != AS_DEFERRED 4213 && array->expr_type == EXPR_VARIABLE 4214 && !gfc_expr_attr (array).allocatable 4215 && !gfc_expr_attr (array).pointer)); 4216 4217 if (dim == NULL) 4218 { 4219 /* Multi-dimensional bounds. */ 4220 gfc_expr *bounds[GFC_MAX_DIMENSIONS]; 4221 gfc_expr *e; 4222 int k; 4223 4224 /* UBOUND(ARRAY) is not valid for an assumed-size array. */ 4225 if (upper && type == AR_FULL && as && as->type == AS_ASSUMED_SIZE) 4226 { 4227 /* An error message will be emitted in 4228 check_assumed_size_reference (resolve.cc). */ 4229 return &gfc_bad_expr; 4230 } 4231 4232 /* Simplify the bounds for each dimension. */ 4233 for (d = 0; d < array->rank; d++) 4234 { 4235 bounds[d] = simplify_bound_dim (array, kind, d + 1, upper, as, ref, 4236 false); 4237 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr) 4238 { 4239 int j; 4240 4241 for (j = 0; j < d; j++) 4242 gfc_free_expr (bounds[j]); 4243 4244 if (gfc_seen_div0) 4245 return &gfc_bad_expr; 4246 else 4247 return bounds[d]; 4248 } 4249 } 4250 4251 /* Allocate the result expression. */ 4252 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND", 4253 gfc_default_integer_kind); 4254 if (k == -1) 4255 return &gfc_bad_expr; 4256 4257 e = gfc_get_array_expr (BT_INTEGER, k, &array->where); 4258 4259 /* The result is a rank 1 array; its size is the rank of the first 4260 argument to {L,U}BOUND. */ 4261 e->rank = 1; 4262 e->shape = gfc_get_shape (1); 4263 mpz_init_set_ui (e->shape[0], array->rank); 4264 4265 /* Create the constructor for this array. */ 4266 for (d = 0; d < array->rank; d++) 4267 gfc_constructor_append_expr (&e->value.constructor, 4268 bounds[d], &e->where); 4269 4270 return e; 4271 } 4272 else 4273 { 4274 /* A DIM argument is specified. */ 4275 if (dim->expr_type != EXPR_CONSTANT) 4276 return NULL; 4277 4278 d = mpz_get_si (dim->value.integer); 4279 4280 if ((d < 1 || d > array->rank) 4281 || (d == array->rank && as && as->type == AS_ASSUMED_SIZE && upper)) 4282 { 4283 gfc_error ("DIM argument at %L is out of bounds", &dim->where); 4284 return &gfc_bad_expr; 4285 } 4286 4287 if (as && as->type == AS_ASSUMED_RANK) 4288 return NULL; 4289 4290 return simplify_bound_dim (array, kind, d, upper, as, ref, false); 4291 } 4292} 4293 4294 4295static gfc_expr * 4296simplify_cobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper) 4297{ 4298 gfc_ref *ref; 4299 gfc_array_spec *as; 4300 int d; 4301 4302 if (array->expr_type != EXPR_VARIABLE) 4303 return NULL; 4304 4305 /* Follow any component references. */ 4306 as = (array->ts.type == BT_CLASS && array->ts.u.derived->components) 4307 ? array->ts.u.derived->components->as 4308 : array->symtree->n.sym->as; 4309 for (ref = array->ref; ref; ref = ref->next) 4310 { 4311 switch (ref->type) 4312 { 4313 case REF_ARRAY: 4314 switch (ref->u.ar.type) 4315 { 4316 case AR_ELEMENT: 4317 if (ref->u.ar.as->corank > 0) 4318 { 4319 gcc_assert (as == ref->u.ar.as); 4320 goto done; 4321 } 4322 as = NULL; 4323 continue; 4324 4325 case AR_FULL: 4326 /* We're done because 'as' has already been set in the 4327 previous iteration. */ 4328 goto done; 4329 4330 case AR_UNKNOWN: 4331 return NULL; 4332 4333 case AR_SECTION: 4334 as = ref->u.ar.as; 4335 goto done; 4336 } 4337 4338 gcc_unreachable (); 4339 4340 case REF_COMPONENT: 4341 as = ref->u.c.component->as; 4342 continue; 4343 4344 case REF_SUBSTRING: 4345 case REF_INQUIRY: 4346 continue; 4347 } 4348 } 4349 4350 if (!as) 4351 gcc_unreachable (); 4352 4353 done: 4354 4355 if (as->cotype == AS_DEFERRED || as->cotype == AS_ASSUMED_SHAPE) 4356 return NULL; 4357 4358 if (dim == NULL) 4359 { 4360 /* Multi-dimensional cobounds. */ 4361 gfc_expr *bounds[GFC_MAX_DIMENSIONS]; 4362 gfc_expr *e; 4363 int k; 4364 4365 /* Simplify the cobounds for each dimension. */ 4366 for (d = 0; d < as->corank; d++) 4367 { 4368 bounds[d] = simplify_bound_dim (array, kind, d + 1 + as->rank, 4369 upper, as, ref, true); 4370 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr) 4371 { 4372 int j; 4373 4374 for (j = 0; j < d; j++) 4375 gfc_free_expr (bounds[j]); 4376 return bounds[d]; 4377 } 4378 } 4379 4380 /* Allocate the result expression. */ 4381 e = gfc_get_expr (); 4382 e->where = array->where; 4383 e->expr_type = EXPR_ARRAY; 4384 e->ts.type = BT_INTEGER; 4385 k = get_kind (BT_INTEGER, kind, upper ? "UCOBOUND" : "LCOBOUND", 4386 gfc_default_integer_kind); 4387 if (k == -1) 4388 { 4389 gfc_free_expr (e); 4390 return &gfc_bad_expr; 4391 } 4392 e->ts.kind = k; 4393 4394 /* The result is a rank 1 array; its size is the rank of the first 4395 argument to {L,U}COBOUND. */ 4396 e->rank = 1; 4397 e->shape = gfc_get_shape (1); 4398 mpz_init_set_ui (e->shape[0], as->corank); 4399 4400 /* Create the constructor for this array. */ 4401 for (d = 0; d < as->corank; d++) 4402 gfc_constructor_append_expr (&e->value.constructor, 4403 bounds[d], &e->where); 4404 return e; 4405 } 4406 else 4407 { 4408 /* A DIM argument is specified. */ 4409 if (dim->expr_type != EXPR_CONSTANT) 4410 return NULL; 4411 4412 d = mpz_get_si (dim->value.integer); 4413 4414 if (d < 1 || d > as->corank) 4415 { 4416 gfc_error ("DIM argument at %L is out of bounds", &dim->where); 4417 return &gfc_bad_expr; 4418 } 4419 4420 return simplify_bound_dim (array, kind, d+as->rank, upper, as, ref, true); 4421 } 4422} 4423 4424 4425gfc_expr * 4426gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind) 4427{ 4428 return simplify_bound (array, dim, kind, 0); 4429} 4430 4431 4432gfc_expr * 4433gfc_simplify_lcobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind) 4434{ 4435 return simplify_cobound (array, dim, kind, 0); 4436} 4437 4438gfc_expr * 4439gfc_simplify_leadz (gfc_expr *e) 4440{ 4441 unsigned long lz, bs; 4442 int i; 4443 4444 if (e->expr_type != EXPR_CONSTANT) 4445 return NULL; 4446 4447 i = gfc_validate_kind (e->ts.type, e->ts.kind, false); 4448 bs = gfc_integer_kinds[i].bit_size; 4449 if (mpz_cmp_si (e->value.integer, 0) == 0) 4450 lz = bs; 4451 else if (mpz_cmp_si (e->value.integer, 0) < 0) 4452 lz = 0; 4453 else 4454 lz = bs - mpz_sizeinbase (e->value.integer, 2); 4455 4456 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, lz); 4457} 4458 4459 4460/* Check for constant length of a substring. */ 4461 4462static bool 4463substring_has_constant_len (gfc_expr *e) 4464{ 4465 gfc_ref *ref; 4466 HOST_WIDE_INT istart, iend, length; 4467 bool equal_length = false; 4468 4469 if (e->ts.type != BT_CHARACTER) 4470 return false; 4471 4472 for (ref = e->ref; ref; ref = ref->next) 4473 if (ref->type != REF_COMPONENT && ref->type != REF_ARRAY) 4474 break; 4475 4476 if (!ref 4477 || ref->type != REF_SUBSTRING 4478 || !ref->u.ss.start 4479 || ref->u.ss.start->expr_type != EXPR_CONSTANT 4480 || !ref->u.ss.end 4481 || ref->u.ss.end->expr_type != EXPR_CONSTANT) 4482 return false; 4483 4484 /* Basic checks on substring starting and ending indices. */ 4485 if (!gfc_resolve_substring (ref, &equal_length)) 4486 return false; 4487 4488 istart = gfc_mpz_get_hwi (ref->u.ss.start->value.integer); 4489 iend = gfc_mpz_get_hwi (ref->u.ss.end->value.integer); 4490 4491 if (istart <= iend) 4492 length = iend - istart + 1; 4493 else 4494 length = 0; 4495 4496 /* Fix substring length. */ 4497 e->value.character.length = length; 4498 4499 return true; 4500} 4501 4502 4503gfc_expr * 4504gfc_simplify_len (gfc_expr *e, gfc_expr *kind) 4505{ 4506 gfc_expr *result; 4507 int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind); 4508 4509 if (k == -1) 4510 return &gfc_bad_expr; 4511 4512 if (e->expr_type == EXPR_CONSTANT 4513 || substring_has_constant_len (e)) 4514 { 4515 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where); 4516 mpz_set_si (result->value.integer, e->value.character.length); 4517 return range_check (result, "LEN"); 4518 } 4519 else if (e->ts.u.cl != NULL && e->ts.u.cl->length != NULL 4520 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT 4521 && e->ts.u.cl->length->ts.type == BT_INTEGER) 4522 { 4523 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where); 4524 mpz_set (result->value.integer, e->ts.u.cl->length->value.integer); 4525 return range_check (result, "LEN"); 4526 } 4527 else if (e->expr_type == EXPR_VARIABLE && e->ts.type == BT_CHARACTER 4528 && e->symtree->n.sym 4529 && e->symtree->n.sym->ts.type != BT_DERIVED 4530 && e->symtree->n.sym->assoc && e->symtree->n.sym->assoc->target 4531 && e->symtree->n.sym->assoc->target->ts.type == BT_DERIVED 4532 && e->symtree->n.sym->assoc->target->symtree->n.sym 4533 && UNLIMITED_POLY (e->symtree->n.sym->assoc->target->symtree->n.sym)) 4534 4535 /* The expression in assoc->target points to a ref to the _data component 4536 of the unlimited polymorphic entity. To get the _len component the last 4537 _data ref needs to be stripped and a ref to the _len component added. */ 4538 return gfc_get_len_component (e->symtree->n.sym->assoc->target, k); 4539 else 4540 return NULL; 4541} 4542 4543 4544gfc_expr * 4545gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind) 4546{ 4547 gfc_expr *result; 4548 size_t count, len, i; 4549 int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind); 4550 4551 if (k == -1) 4552 return &gfc_bad_expr; 4553 4554 if (e->expr_type != EXPR_CONSTANT) 4555 return NULL; 4556 4557 len = e->value.character.length; 4558 for (count = 0, i = 1; i <= len; i++) 4559 if (e->value.character.string[len - i] == ' ') 4560 count++; 4561 else 4562 break; 4563 4564 result = gfc_get_int_expr (k, &e->where, len - count); 4565 return range_check (result, "LEN_TRIM"); 4566} 4567 4568gfc_expr * 4569gfc_simplify_lgamma (gfc_expr *x) 4570{ 4571 gfc_expr *result; 4572 int sg; 4573 4574 if (x->expr_type != EXPR_CONSTANT) 4575 return NULL; 4576 4577 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 4578 mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE); 4579 4580 return range_check (result, "LGAMMA"); 4581} 4582 4583 4584gfc_expr * 4585gfc_simplify_lge (gfc_expr *a, gfc_expr *b) 4586{ 4587 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT) 4588 return NULL; 4589 4590 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, 4591 gfc_compare_string (a, b) >= 0); 4592} 4593 4594 4595gfc_expr * 4596gfc_simplify_lgt (gfc_expr *a, gfc_expr *b) 4597{ 4598 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT) 4599 return NULL; 4600 4601 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, 4602 gfc_compare_string (a, b) > 0); 4603} 4604 4605 4606gfc_expr * 4607gfc_simplify_lle (gfc_expr *a, gfc_expr *b) 4608{ 4609 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT) 4610 return NULL; 4611 4612 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, 4613 gfc_compare_string (a, b) <= 0); 4614} 4615 4616 4617gfc_expr * 4618gfc_simplify_llt (gfc_expr *a, gfc_expr *b) 4619{ 4620 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT) 4621 return NULL; 4622 4623 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, 4624 gfc_compare_string (a, b) < 0); 4625} 4626 4627 4628gfc_expr * 4629gfc_simplify_log (gfc_expr *x) 4630{ 4631 gfc_expr *result; 4632 4633 if (x->expr_type != EXPR_CONSTANT) 4634 return NULL; 4635 4636 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 4637 4638 switch (x->ts.type) 4639 { 4640 case BT_REAL: 4641 if (mpfr_sgn (x->value.real) <= 0) 4642 { 4643 gfc_error ("Argument of LOG at %L cannot be less than or equal " 4644 "to zero", &x->where); 4645 gfc_free_expr (result); 4646 return &gfc_bad_expr; 4647 } 4648 4649 mpfr_log (result->value.real, x->value.real, GFC_RND_MODE); 4650 break; 4651 4652 case BT_COMPLEX: 4653 if (mpfr_zero_p (mpc_realref (x->value.complex)) 4654 && mpfr_zero_p (mpc_imagref (x->value.complex))) 4655 { 4656 gfc_error ("Complex argument of LOG at %L cannot be zero", 4657 &x->where); 4658 gfc_free_expr (result); 4659 return &gfc_bad_expr; 4660 } 4661 4662 gfc_set_model_kind (x->ts.kind); 4663 mpc_log (result->value.complex, x->value.complex, GFC_MPC_RND_MODE); 4664 break; 4665 4666 default: 4667 gfc_internal_error ("gfc_simplify_log: bad type"); 4668 } 4669 4670 return range_check (result, "LOG"); 4671} 4672 4673 4674gfc_expr * 4675gfc_simplify_log10 (gfc_expr *x) 4676{ 4677 gfc_expr *result; 4678 4679 if (x->expr_type != EXPR_CONSTANT) 4680 return NULL; 4681 4682 if (mpfr_sgn (x->value.real) <= 0) 4683 { 4684 gfc_error ("Argument of LOG10 at %L cannot be less than or equal " 4685 "to zero", &x->where); 4686 return &gfc_bad_expr; 4687 } 4688 4689 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 4690 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE); 4691 4692 return range_check (result, "LOG10"); 4693} 4694 4695 4696gfc_expr * 4697gfc_simplify_logical (gfc_expr *e, gfc_expr *k) 4698{ 4699 int kind; 4700 4701 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind); 4702 if (kind < 0) 4703 return &gfc_bad_expr; 4704 4705 if (e->expr_type != EXPR_CONSTANT) 4706 return NULL; 4707 4708 return gfc_get_logical_expr (kind, &e->where, e->value.logical); 4709} 4710 4711 4712gfc_expr* 4713gfc_simplify_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b) 4714{ 4715 gfc_expr *result; 4716 int row, result_rows, col, result_columns; 4717 int stride_a, offset_a, stride_b, offset_b; 4718 4719 if (!is_constant_array_expr (matrix_a) 4720 || !is_constant_array_expr (matrix_b)) 4721 return NULL; 4722 4723 /* MATMUL should do mixed-mode arithmetic. Set the result type. */ 4724 if (matrix_a->ts.type != matrix_b->ts.type) 4725 { 4726 gfc_expr e; 4727 e.expr_type = EXPR_OP; 4728 gfc_clear_ts (&e.ts); 4729 e.value.op.op = INTRINSIC_NONE; 4730 e.value.op.op1 = matrix_a; 4731 e.value.op.op2 = matrix_b; 4732 gfc_type_convert_binary (&e, 1); 4733 result = gfc_get_array_expr (e.ts.type, e.ts.kind, &matrix_a->where); 4734 } 4735 else 4736 { 4737 result = gfc_get_array_expr (matrix_a->ts.type, matrix_a->ts.kind, 4738 &matrix_a->where); 4739 } 4740 4741 if (matrix_a->rank == 1 && matrix_b->rank == 2) 4742 { 4743 result_rows = 1; 4744 result_columns = mpz_get_si (matrix_b->shape[1]); 4745 stride_a = 1; 4746 stride_b = mpz_get_si (matrix_b->shape[0]); 4747 4748 result->rank = 1; 4749 result->shape = gfc_get_shape (result->rank); 4750 mpz_init_set_si (result->shape[0], result_columns); 4751 } 4752 else if (matrix_a->rank == 2 && matrix_b->rank == 1) 4753 { 4754 result_rows = mpz_get_si (matrix_a->shape[0]); 4755 result_columns = 1; 4756 stride_a = mpz_get_si (matrix_a->shape[0]); 4757 stride_b = 1; 4758 4759 result->rank = 1; 4760 result->shape = gfc_get_shape (result->rank); 4761 mpz_init_set_si (result->shape[0], result_rows); 4762 } 4763 else if (matrix_a->rank == 2 && matrix_b->rank == 2) 4764 { 4765 result_rows = mpz_get_si (matrix_a->shape[0]); 4766 result_columns = mpz_get_si (matrix_b->shape[1]); 4767 stride_a = mpz_get_si (matrix_a->shape[0]); 4768 stride_b = mpz_get_si (matrix_b->shape[0]); 4769 4770 result->rank = 2; 4771 result->shape = gfc_get_shape (result->rank); 4772 mpz_init_set_si (result->shape[0], result_rows); 4773 mpz_init_set_si (result->shape[1], result_columns); 4774 } 4775 else 4776 gcc_unreachable(); 4777 4778 offset_b = 0; 4779 for (col = 0; col < result_columns; ++col) 4780 { 4781 offset_a = 0; 4782 4783 for (row = 0; row < result_rows; ++row) 4784 { 4785 gfc_expr *e = compute_dot_product (matrix_a, stride_a, offset_a, 4786 matrix_b, 1, offset_b, false); 4787 gfc_constructor_append_expr (&result->value.constructor, 4788 e, NULL); 4789 4790 offset_a += 1; 4791 } 4792 4793 offset_b += stride_b; 4794 } 4795 4796 return result; 4797} 4798 4799 4800gfc_expr * 4801gfc_simplify_maskr (gfc_expr *i, gfc_expr *kind_arg) 4802{ 4803 gfc_expr *result; 4804 int kind, arg, k; 4805 4806 if (i->expr_type != EXPR_CONSTANT) 4807 return NULL; 4808 4809 kind = get_kind (BT_INTEGER, kind_arg, "MASKR", gfc_default_integer_kind); 4810 if (kind == -1) 4811 return &gfc_bad_expr; 4812 k = gfc_validate_kind (BT_INTEGER, kind, false); 4813 4814 bool fail = gfc_extract_int (i, &arg); 4815 gcc_assert (!fail); 4816 4817 if (!gfc_check_mask (i, kind_arg)) 4818 return &gfc_bad_expr; 4819 4820 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where); 4821 4822 /* MASKR(n) = 2^n - 1 */ 4823 mpz_set_ui (result->value.integer, 1); 4824 mpz_mul_2exp (result->value.integer, result->value.integer, arg); 4825 mpz_sub_ui (result->value.integer, result->value.integer, 1); 4826 4827 gfc_convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size); 4828 4829 return result; 4830} 4831 4832 4833gfc_expr * 4834gfc_simplify_maskl (gfc_expr *i, gfc_expr *kind_arg) 4835{ 4836 gfc_expr *result; 4837 int kind, arg, k; 4838 mpz_t z; 4839 4840 if (i->expr_type != EXPR_CONSTANT) 4841 return NULL; 4842 4843 kind = get_kind (BT_INTEGER, kind_arg, "MASKL", gfc_default_integer_kind); 4844 if (kind == -1) 4845 return &gfc_bad_expr; 4846 k = gfc_validate_kind (BT_INTEGER, kind, false); 4847 4848 bool fail = gfc_extract_int (i, &arg); 4849 gcc_assert (!fail); 4850 4851 if (!gfc_check_mask (i, kind_arg)) 4852 return &gfc_bad_expr; 4853 4854 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where); 4855 4856 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */ 4857 mpz_init_set_ui (z, 1); 4858 mpz_mul_2exp (z, z, gfc_integer_kinds[k].bit_size); 4859 mpz_set_ui (result->value.integer, 1); 4860 mpz_mul_2exp (result->value.integer, result->value.integer, 4861 gfc_integer_kinds[k].bit_size - arg); 4862 mpz_sub (result->value.integer, z, result->value.integer); 4863 mpz_clear (z); 4864 4865 gfc_convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size); 4866 4867 return result; 4868} 4869 4870 4871gfc_expr * 4872gfc_simplify_merge (gfc_expr *tsource, gfc_expr *fsource, gfc_expr *mask) 4873{ 4874 gfc_expr * result; 4875 gfc_constructor *tsource_ctor, *fsource_ctor, *mask_ctor; 4876 4877 if (mask->expr_type == EXPR_CONSTANT) 4878 { 4879 result = gfc_copy_expr (mask->value.logical ? tsource : fsource); 4880 /* Parenthesis is needed to get lower bounds of 1. */ 4881 result = gfc_get_parentheses (result); 4882 gfc_simplify_expr (result, 1); 4883 return result; 4884 } 4885 4886 if (!mask->rank || !is_constant_array_expr (mask) 4887 || !is_constant_array_expr (tsource) || !is_constant_array_expr (fsource)) 4888 return NULL; 4889 4890 result = gfc_get_array_expr (tsource->ts.type, tsource->ts.kind, 4891 &tsource->where); 4892 if (tsource->ts.type == BT_DERIVED) 4893 result->ts.u.derived = tsource->ts.u.derived; 4894 else if (tsource->ts.type == BT_CHARACTER) 4895 result->ts.u.cl = tsource->ts.u.cl; 4896 4897 tsource_ctor = gfc_constructor_first (tsource->value.constructor); 4898 fsource_ctor = gfc_constructor_first (fsource->value.constructor); 4899 mask_ctor = gfc_constructor_first (mask->value.constructor); 4900 4901 while (mask_ctor) 4902 { 4903 if (mask_ctor->expr->value.logical) 4904 gfc_constructor_append_expr (&result->value.constructor, 4905 gfc_copy_expr (tsource_ctor->expr), 4906 NULL); 4907 else 4908 gfc_constructor_append_expr (&result->value.constructor, 4909 gfc_copy_expr (fsource_ctor->expr), 4910 NULL); 4911 tsource_ctor = gfc_constructor_next (tsource_ctor); 4912 fsource_ctor = gfc_constructor_next (fsource_ctor); 4913 mask_ctor = gfc_constructor_next (mask_ctor); 4914 } 4915 4916 result->shape = gfc_get_shape (1); 4917 gfc_array_size (result, &result->shape[0]); 4918 4919 return result; 4920} 4921 4922 4923gfc_expr * 4924gfc_simplify_merge_bits (gfc_expr *i, gfc_expr *j, gfc_expr *mask_expr) 4925{ 4926 mpz_t arg1, arg2, mask; 4927 gfc_expr *result; 4928 4929 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT 4930 || mask_expr->expr_type != EXPR_CONSTANT) 4931 return NULL; 4932 4933 result = gfc_get_constant_expr (BT_INTEGER, i->ts.kind, &i->where); 4934 4935 /* Convert all argument to unsigned. */ 4936 mpz_init_set (arg1, i->value.integer); 4937 mpz_init_set (arg2, j->value.integer); 4938 mpz_init_set (mask, mask_expr->value.integer); 4939 4940 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */ 4941 mpz_and (arg1, arg1, mask); 4942 mpz_com (mask, mask); 4943 mpz_and (arg2, arg2, mask); 4944 mpz_ior (result->value.integer, arg1, arg2); 4945 4946 mpz_clear (arg1); 4947 mpz_clear (arg2); 4948 mpz_clear (mask); 4949 4950 return result; 4951} 4952 4953 4954/* Selects between current value and extremum for simplify_min_max 4955 and simplify_minval_maxval. */ 4956static int 4957min_max_choose (gfc_expr *arg, gfc_expr *extremum, int sign, bool back_val) 4958{ 4959 int ret; 4960 4961 switch (arg->ts.type) 4962 { 4963 case BT_INTEGER: 4964 if (extremum->ts.kind < arg->ts.kind) 4965 extremum->ts.kind = arg->ts.kind; 4966 ret = mpz_cmp (arg->value.integer, 4967 extremum->value.integer) * sign; 4968 if (ret > 0) 4969 mpz_set (extremum->value.integer, arg->value.integer); 4970 break; 4971 4972 case BT_REAL: 4973 if (extremum->ts.kind < arg->ts.kind) 4974 extremum->ts.kind = arg->ts.kind; 4975 if (mpfr_nan_p (extremum->value.real)) 4976 { 4977 ret = 1; 4978 mpfr_set (extremum->value.real, arg->value.real, GFC_RND_MODE); 4979 } 4980 else if (mpfr_nan_p (arg->value.real)) 4981 ret = -1; 4982 else 4983 { 4984 ret = mpfr_cmp (arg->value.real, extremum->value.real) * sign; 4985 if (ret > 0) 4986 mpfr_set (extremum->value.real, arg->value.real, GFC_RND_MODE); 4987 } 4988 break; 4989 4990 case BT_CHARACTER: 4991#define LENGTH(x) ((x)->value.character.length) 4992#define STRING(x) ((x)->value.character.string) 4993 if (LENGTH (extremum) < LENGTH(arg)) 4994 { 4995 gfc_char_t *tmp = STRING(extremum); 4996 4997 STRING(extremum) = gfc_get_wide_string (LENGTH(arg) + 1); 4998 memcpy (STRING(extremum), tmp, 4999 LENGTH(extremum) * sizeof (gfc_char_t)); 5000 gfc_wide_memset (&STRING(extremum)[LENGTH(extremum)], ' ', 5001 LENGTH(arg) - LENGTH(extremum)); 5002 STRING(extremum)[LENGTH(arg)] = '\0'; /* For debugger */ 5003 LENGTH(extremum) = LENGTH(arg); 5004 free (tmp); 5005 } 5006 ret = gfc_compare_string (arg, extremum) * sign; 5007 if (ret > 0) 5008 { 5009 free (STRING(extremum)); 5010 STRING(extremum) = gfc_get_wide_string (LENGTH(extremum) + 1); 5011 memcpy (STRING(extremum), STRING(arg), 5012 LENGTH(arg) * sizeof (gfc_char_t)); 5013 gfc_wide_memset (&STRING(extremum)[LENGTH(arg)], ' ', 5014 LENGTH(extremum) - LENGTH(arg)); 5015 STRING(extremum)[LENGTH(extremum)] = '\0'; /* For debugger */ 5016 } 5017#undef LENGTH 5018#undef STRING 5019 break; 5020 5021 default: 5022 gfc_internal_error ("simplify_min_max(): Bad type in arglist"); 5023 } 5024 if (back_val && ret == 0) 5025 ret = 1; 5026 5027 return ret; 5028} 5029 5030 5031/* This function is special since MAX() can take any number of 5032 arguments. The simplified expression is a rewritten version of the 5033 argument list containing at most one constant element. Other 5034 constant elements are deleted. Because the argument list has 5035 already been checked, this function always succeeds. sign is 1 for 5036 MAX(), -1 for MIN(). */ 5037 5038static gfc_expr * 5039simplify_min_max (gfc_expr *expr, int sign) 5040{ 5041 int tmp1, tmp2; 5042 gfc_actual_arglist *arg, *last, *extremum; 5043 gfc_expr *tmp, *ret; 5044 const char *fname; 5045 5046 last = NULL; 5047 extremum = NULL; 5048 5049 arg = expr->value.function.actual; 5050 5051 for (; arg; last = arg, arg = arg->next) 5052 { 5053 if (arg->expr->expr_type != EXPR_CONSTANT) 5054 continue; 5055 5056 if (extremum == NULL) 5057 { 5058 extremum = arg; 5059 continue; 5060 } 5061 5062 min_max_choose (arg->expr, extremum->expr, sign); 5063 5064 /* Delete the extra constant argument. */ 5065 last->next = arg->next; 5066 5067 arg->next = NULL; 5068 gfc_free_actual_arglist (arg); 5069 arg = last; 5070 } 5071 5072 /* If there is one value left, replace the function call with the 5073 expression. */ 5074 if (expr->value.function.actual->next != NULL) 5075 return NULL; 5076 5077 /* Handle special cases of specific functions (min|max)1 and 5078 a(min|max)0. */ 5079 5080 tmp = expr->value.function.actual->expr; 5081 fname = expr->value.function.isym->name; 5082 5083 if ((tmp->ts.type != BT_INTEGER || tmp->ts.kind != gfc_integer_4_kind) 5084 && (strcmp (fname, "min1") == 0 || strcmp (fname, "max1") == 0)) 5085 { 5086 /* Explicit conversion, turn off -Wconversion and -Wconversion-extra 5087 warnings. */ 5088 tmp1 = warn_conversion; 5089 tmp2 = warn_conversion_extra; 5090 warn_conversion = warn_conversion_extra = 0; 5091 5092 ret = gfc_convert_constant (tmp, BT_INTEGER, gfc_integer_4_kind); 5093 5094 warn_conversion = tmp1; 5095 warn_conversion_extra = tmp2; 5096 } 5097 else if ((tmp->ts.type != BT_REAL || tmp->ts.kind != gfc_real_4_kind) 5098 && (strcmp (fname, "amin0") == 0 || strcmp (fname, "amax0") == 0)) 5099 { 5100 ret = gfc_convert_constant (tmp, BT_REAL, gfc_real_4_kind); 5101 } 5102 else 5103 ret = gfc_copy_expr (tmp); 5104 5105 return ret; 5106 5107} 5108 5109 5110gfc_expr * 5111gfc_simplify_min (gfc_expr *e) 5112{ 5113 return simplify_min_max (e, -1); 5114} 5115 5116 5117gfc_expr * 5118gfc_simplify_max (gfc_expr *e) 5119{ 5120 return simplify_min_max (e, 1); 5121} 5122 5123/* Helper function for gfc_simplify_minval. */ 5124 5125static gfc_expr * 5126gfc_min (gfc_expr *op1, gfc_expr *op2) 5127{ 5128 min_max_choose (op1, op2, -1); 5129 gfc_free_expr (op1); 5130 return op2; 5131} 5132 5133/* Simplify minval for constant arrays. */ 5134 5135gfc_expr * 5136gfc_simplify_minval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask) 5137{ 5138 return simplify_transformation (array, dim, mask, INT_MAX, gfc_min); 5139} 5140 5141/* Helper function for gfc_simplify_maxval. */ 5142 5143static gfc_expr * 5144gfc_max (gfc_expr *op1, gfc_expr *op2) 5145{ 5146 min_max_choose (op1, op2, 1); 5147 gfc_free_expr (op1); 5148 return op2; 5149} 5150 5151 5152/* Simplify maxval for constant arrays. */ 5153 5154gfc_expr * 5155gfc_simplify_maxval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask) 5156{ 5157 return simplify_transformation (array, dim, mask, INT_MIN, gfc_max); 5158} 5159 5160 5161/* Transform minloc or maxloc of an array, according to MASK, 5162 to the scalar result. This code is mostly identical to 5163 simplify_transformation_to_scalar. */ 5164 5165static gfc_expr * 5166simplify_minmaxloc_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *mask, 5167 gfc_expr *extremum, int sign, bool back_val) 5168{ 5169 gfc_expr *a, *m; 5170 gfc_constructor *array_ctor, *mask_ctor; 5171 mpz_t count; 5172 5173 mpz_set_si (result->value.integer, 0); 5174 5175 5176 /* Shortcut for constant .FALSE. MASK. */ 5177 if (mask 5178 && mask->expr_type == EXPR_CONSTANT 5179 && !mask->value.logical) 5180 return result; 5181 5182 array_ctor = gfc_constructor_first (array->value.constructor); 5183 if (mask && mask->expr_type == EXPR_ARRAY) 5184 mask_ctor = gfc_constructor_first (mask->value.constructor); 5185 else 5186 mask_ctor = NULL; 5187 5188 mpz_init_set_si (count, 0); 5189 while (array_ctor) 5190 { 5191 mpz_add_ui (count, count, 1); 5192 a = array_ctor->expr; 5193 array_ctor = gfc_constructor_next (array_ctor); 5194 /* A constant MASK equals .TRUE. here and can be ignored. */ 5195 if (mask_ctor) 5196 { 5197 m = mask_ctor->expr; 5198 mask_ctor = gfc_constructor_next (mask_ctor); 5199 if (!m->value.logical) 5200 continue; 5201 } 5202 if (min_max_choose (a, extremum, sign, back_val) > 0) 5203 mpz_set (result->value.integer, count); 5204 } 5205 mpz_clear (count); 5206 gfc_free_expr (extremum); 5207 return result; 5208} 5209 5210/* Simplify minloc / maxloc in the absence of a dim argument. */ 5211 5212static gfc_expr * 5213simplify_minmaxloc_nodim (gfc_expr *result, gfc_expr *extremum, 5214 gfc_expr *array, gfc_expr *mask, int sign, 5215 bool back_val) 5216{ 5217 ssize_t res[GFC_MAX_DIMENSIONS]; 5218 int i, n; 5219 gfc_constructor *result_ctor, *array_ctor, *mask_ctor; 5220 ssize_t count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS], 5221 sstride[GFC_MAX_DIMENSIONS]; 5222 gfc_expr *a, *m; 5223 bool continue_loop; 5224 bool ma; 5225 5226 for (i = 0; i<array->rank; i++) 5227 res[i] = -1; 5228 5229 /* Shortcut for constant .FALSE. MASK. */ 5230 if (mask 5231 && mask->expr_type == EXPR_CONSTANT 5232 && !mask->value.logical) 5233 goto finish; 5234 5235 if (array->shape == NULL) 5236 goto finish; 5237 5238 for (i = 0; i < array->rank; i++) 5239 { 5240 count[i] = 0; 5241 sstride[i] = (i == 0) ? 1 : sstride[i-1] * mpz_get_si (array->shape[i-1]); 5242 extent[i] = mpz_get_si (array->shape[i]); 5243 if (extent[i] <= 0) 5244 goto finish; 5245 } 5246 5247 continue_loop = true; 5248 array_ctor = gfc_constructor_first (array->value.constructor); 5249 if (mask && mask->rank > 0) 5250 mask_ctor = gfc_constructor_first (mask->value.constructor); 5251 else 5252 mask_ctor = NULL; 5253 5254 /* Loop over the array elements (and mask), keeping track of 5255 the indices to return. */ 5256 while (continue_loop) 5257 { 5258 do 5259 { 5260 a = array_ctor->expr; 5261 if (mask_ctor) 5262 { 5263 m = mask_ctor->expr; 5264 ma = m->value.logical; 5265 mask_ctor = gfc_constructor_next (mask_ctor); 5266 } 5267 else 5268 ma = true; 5269 5270 if (ma && min_max_choose (a, extremum, sign, back_val) > 0) 5271 { 5272 for (i = 0; i<array->rank; i++) 5273 res[i] = count[i]; 5274 } 5275 array_ctor = gfc_constructor_next (array_ctor); 5276 count[0] ++; 5277 } while (count[0] != extent[0]); 5278 n = 0; 5279 do 5280 { 5281 /* When we get to the end of a dimension, reset it and increment 5282 the next dimension. */ 5283 count[n] = 0; 5284 n++; 5285 if (n >= array->rank) 5286 { 5287 continue_loop = false; 5288 break; 5289 } 5290 else 5291 count[n] ++; 5292 } while (count[n] == extent[n]); 5293 } 5294 5295 finish: 5296 gfc_free_expr (extremum); 5297 result_ctor = gfc_constructor_first (result->value.constructor); 5298 for (i = 0; i<array->rank; i++) 5299 { 5300 gfc_expr *r_expr; 5301 r_expr = result_ctor->expr; 5302 mpz_set_si (r_expr->value.integer, res[i] + 1); 5303 result_ctor = gfc_constructor_next (result_ctor); 5304 } 5305 return result; 5306} 5307 5308/* Helper function for gfc_simplify_minmaxloc - build an array 5309 expression with n elements. */ 5310 5311static gfc_expr * 5312new_array (bt type, int kind, int n, locus *where) 5313{ 5314 gfc_expr *result; 5315 int i; 5316 5317 result = gfc_get_array_expr (type, kind, where); 5318 result->rank = 1; 5319 result->shape = gfc_get_shape(1); 5320 mpz_init_set_si (result->shape[0], n); 5321 for (i = 0; i < n; i++) 5322 { 5323 gfc_constructor_append_expr (&result->value.constructor, 5324 gfc_get_constant_expr (type, kind, where), 5325 NULL); 5326 } 5327 5328 return result; 5329} 5330 5331/* Simplify minloc and maxloc. This code is mostly identical to 5332 simplify_transformation_to_array. */ 5333 5334static gfc_expr * 5335simplify_minmaxloc_to_array (gfc_expr *result, gfc_expr *array, 5336 gfc_expr *dim, gfc_expr *mask, 5337 gfc_expr *extremum, int sign, bool back_val) 5338{ 5339 mpz_t size; 5340 int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride; 5341 gfc_expr **arrayvec, **resultvec, **base, **src, **dest; 5342 gfc_constructor *array_ctor, *mask_ctor, *result_ctor; 5343 5344 int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS], 5345 sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS], 5346 tmpstride[GFC_MAX_DIMENSIONS]; 5347 5348 /* Shortcut for constant .FALSE. MASK. */ 5349 if (mask 5350 && mask->expr_type == EXPR_CONSTANT 5351 && !mask->value.logical) 5352 return result; 5353 5354 /* Build an indexed table for array element expressions to minimize 5355 linked-list traversal. Masked elements are set to NULL. */ 5356 gfc_array_size (array, &size); 5357 arraysize = mpz_get_ui (size); 5358 mpz_clear (size); 5359 5360 arrayvec = XCNEWVEC (gfc_expr*, arraysize); 5361 5362 array_ctor = gfc_constructor_first (array->value.constructor); 5363 mask_ctor = NULL; 5364 if (mask && mask->expr_type == EXPR_ARRAY) 5365 mask_ctor = gfc_constructor_first (mask->value.constructor); 5366 5367 for (i = 0; i < arraysize; ++i) 5368 { 5369 arrayvec[i] = array_ctor->expr; 5370 array_ctor = gfc_constructor_next (array_ctor); 5371 5372 if (mask_ctor) 5373 { 5374 if (!mask_ctor->expr->value.logical) 5375 arrayvec[i] = NULL; 5376 5377 mask_ctor = gfc_constructor_next (mask_ctor); 5378 } 5379 } 5380 5381 /* Same for the result expression. */ 5382 gfc_array_size (result, &size); 5383 resultsize = mpz_get_ui (size); 5384 mpz_clear (size); 5385 5386 resultvec = XCNEWVEC (gfc_expr*, resultsize); 5387 result_ctor = gfc_constructor_first (result->value.constructor); 5388 for (i = 0; i < resultsize; ++i) 5389 { 5390 resultvec[i] = result_ctor->expr; 5391 result_ctor = gfc_constructor_next (result_ctor); 5392 } 5393 5394 gfc_extract_int (dim, &dim_index); 5395 dim_index -= 1; /* zero-base index */ 5396 dim_extent = 0; 5397 dim_stride = 0; 5398 5399 for (i = 0, n = 0; i < array->rank; ++i) 5400 { 5401 count[i] = 0; 5402 tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]); 5403 if (i == dim_index) 5404 { 5405 dim_extent = mpz_get_si (array->shape[i]); 5406 dim_stride = tmpstride[i]; 5407 continue; 5408 } 5409 5410 extent[n] = mpz_get_si (array->shape[i]); 5411 sstride[n] = tmpstride[i]; 5412 dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1]; 5413 n += 1; 5414 } 5415 5416 done = resultsize <= 0; 5417 base = arrayvec; 5418 dest = resultvec; 5419 while (!done) 5420 { 5421 gfc_expr *ex; 5422 ex = gfc_copy_expr (extremum); 5423 for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n) 5424 { 5425 if (*src && min_max_choose (*src, ex, sign, back_val) > 0) 5426 mpz_set_si ((*dest)->value.integer, n + 1); 5427 } 5428 5429 count[0]++; 5430 base += sstride[0]; 5431 dest += dstride[0]; 5432 gfc_free_expr (ex); 5433 5434 n = 0; 5435 while (!done && count[n] == extent[n]) 5436 { 5437 count[n] = 0; 5438 base -= sstride[n] * extent[n]; 5439 dest -= dstride[n] * extent[n]; 5440 5441 n++; 5442 if (n < result->rank) 5443 { 5444 /* If the nested loop is unrolled GFC_MAX_DIMENSIONS 5445 times, we'd warn for the last iteration, because the 5446 array index will have already been incremented to the 5447 array sizes, and we can't tell that this must make 5448 the test against result->rank false, because ranks 5449 must not exceed GFC_MAX_DIMENSIONS. */ 5450 GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray-bounds) 5451 count[n]++; 5452 base += sstride[n]; 5453 dest += dstride[n]; 5454 GCC_DIAGNOSTIC_POP 5455 } 5456 else 5457 done = true; 5458 } 5459 } 5460 5461 /* Place updated expression in result constructor. */ 5462 result_ctor = gfc_constructor_first (result->value.constructor); 5463 for (i = 0; i < resultsize; ++i) 5464 { 5465 result_ctor->expr = resultvec[i]; 5466 result_ctor = gfc_constructor_next (result_ctor); 5467 } 5468 5469 free (arrayvec); 5470 free (resultvec); 5471 free (extremum); 5472 return result; 5473} 5474 5475/* Simplify minloc and maxloc for constant arrays. */ 5476 5477static gfc_expr * 5478gfc_simplify_minmaxloc (gfc_expr *array, gfc_expr *dim, gfc_expr *mask, 5479 gfc_expr *kind, gfc_expr *back, int sign) 5480{ 5481 gfc_expr *result; 5482 gfc_expr *extremum; 5483 int ikind; 5484 int init_val; 5485 bool back_val = false; 5486 5487 if (!is_constant_array_expr (array) 5488 || !gfc_is_constant_expr (dim)) 5489 return NULL; 5490 5491 if (mask 5492 && !is_constant_array_expr (mask) 5493 && mask->expr_type != EXPR_CONSTANT) 5494 return NULL; 5495 5496 if (kind) 5497 { 5498 if (gfc_extract_int (kind, &ikind, -1)) 5499 return NULL; 5500 } 5501 else 5502 ikind = gfc_default_integer_kind; 5503 5504 if (back) 5505 { 5506 if (back->expr_type != EXPR_CONSTANT) 5507 return NULL; 5508 5509 back_val = back->value.logical; 5510 } 5511 5512 if (sign < 0) 5513 init_val = INT_MAX; 5514 else if (sign > 0) 5515 init_val = INT_MIN; 5516 else 5517 gcc_unreachable(); 5518 5519 extremum = gfc_get_constant_expr (array->ts.type, array->ts.kind, &array->where); 5520 init_result_expr (extremum, init_val, array); 5521 5522 if (dim) 5523 { 5524 result = transformational_result (array, dim, BT_INTEGER, 5525 ikind, &array->where); 5526 init_result_expr (result, 0, array); 5527 5528 if (array->rank == 1) 5529 return simplify_minmaxloc_to_scalar (result, array, mask, extremum, 5530 sign, back_val); 5531 else 5532 return simplify_minmaxloc_to_array (result, array, dim, mask, extremum, 5533 sign, back_val); 5534 } 5535 else 5536 { 5537 result = new_array (BT_INTEGER, ikind, array->rank, &array->where); 5538 return simplify_minmaxloc_nodim (result, extremum, array, mask, 5539 sign, back_val); 5540 } 5541} 5542 5543gfc_expr * 5544gfc_simplify_minloc (gfc_expr *array, gfc_expr *dim, gfc_expr *mask, gfc_expr *kind, 5545 gfc_expr *back) 5546{ 5547 return gfc_simplify_minmaxloc (array, dim, mask, kind, back, -1); 5548} 5549 5550gfc_expr * 5551gfc_simplify_maxloc (gfc_expr *array, gfc_expr *dim, gfc_expr *mask, gfc_expr *kind, 5552 gfc_expr *back) 5553{ 5554 return gfc_simplify_minmaxloc (array, dim, mask, kind, back, 1); 5555} 5556 5557/* Simplify findloc to scalar. Similar to 5558 simplify_minmaxloc_to_scalar. */ 5559 5560static gfc_expr * 5561simplify_findloc_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *value, 5562 gfc_expr *mask, int back_val) 5563{ 5564 gfc_expr *a, *m; 5565 gfc_constructor *array_ctor, *mask_ctor; 5566 mpz_t count; 5567 5568 mpz_set_si (result->value.integer, 0); 5569 5570 /* Shortcut for constant .FALSE. MASK. */ 5571 if (mask 5572 && mask->expr_type == EXPR_CONSTANT 5573 && !mask->value.logical) 5574 return result; 5575 5576 array_ctor = gfc_constructor_first (array->value.constructor); 5577 if (mask && mask->expr_type == EXPR_ARRAY) 5578 mask_ctor = gfc_constructor_first (mask->value.constructor); 5579 else 5580 mask_ctor = NULL; 5581 5582 mpz_init_set_si (count, 0); 5583 while (array_ctor) 5584 { 5585 mpz_add_ui (count, count, 1); 5586 a = array_ctor->expr; 5587 array_ctor = gfc_constructor_next (array_ctor); 5588 /* A constant MASK equals .TRUE. here and can be ignored. */ 5589 if (mask_ctor) 5590 { 5591 m = mask_ctor->expr; 5592 mask_ctor = gfc_constructor_next (mask_ctor); 5593 if (!m->value.logical) 5594 continue; 5595 } 5596 if (gfc_compare_expr (a, value, INTRINSIC_EQ) == 0) 5597 { 5598 /* We have a match. If BACK is true, continue so we find 5599 the last one. */ 5600 mpz_set (result->value.integer, count); 5601 if (!back_val) 5602 break; 5603 } 5604 } 5605 mpz_clear (count); 5606 return result; 5607} 5608 5609/* Simplify findloc in the absence of a dim argument. Similar to 5610 simplify_minmaxloc_nodim. */ 5611 5612static gfc_expr * 5613simplify_findloc_nodim (gfc_expr *result, gfc_expr *value, gfc_expr *array, 5614 gfc_expr *mask, bool back_val) 5615{ 5616 ssize_t res[GFC_MAX_DIMENSIONS]; 5617 int i, n; 5618 gfc_constructor *result_ctor, *array_ctor, *mask_ctor; 5619 ssize_t count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS], 5620 sstride[GFC_MAX_DIMENSIONS]; 5621 gfc_expr *a, *m; 5622 bool continue_loop; 5623 bool ma; 5624 5625 for (i = 0; i < array->rank; i++) 5626 res[i] = -1; 5627 5628 /* Shortcut for constant .FALSE. MASK. */ 5629 if (mask 5630 && mask->expr_type == EXPR_CONSTANT 5631 && !mask->value.logical) 5632 goto finish; 5633 5634 for (i = 0; i < array->rank; i++) 5635 { 5636 count[i] = 0; 5637 sstride[i] = (i == 0) ? 1 : sstride[i-1] * mpz_get_si (array->shape[i-1]); 5638 extent[i] = mpz_get_si (array->shape[i]); 5639 if (extent[i] <= 0) 5640 goto finish; 5641 } 5642 5643 continue_loop = true; 5644 array_ctor = gfc_constructor_first (array->value.constructor); 5645 if (mask && mask->rank > 0) 5646 mask_ctor = gfc_constructor_first (mask->value.constructor); 5647 else 5648 mask_ctor = NULL; 5649 5650 /* Loop over the array elements (and mask), keeping track of 5651 the indices to return. */ 5652 while (continue_loop) 5653 { 5654 do 5655 { 5656 a = array_ctor->expr; 5657 if (mask_ctor) 5658 { 5659 m = mask_ctor->expr; 5660 ma = m->value.logical; 5661 mask_ctor = gfc_constructor_next (mask_ctor); 5662 } 5663 else 5664 ma = true; 5665 5666 if (ma && gfc_compare_expr (a, value, INTRINSIC_EQ) == 0) 5667 { 5668 for (i = 0; i < array->rank; i++) 5669 res[i] = count[i]; 5670 if (!back_val) 5671 goto finish; 5672 } 5673 array_ctor = gfc_constructor_next (array_ctor); 5674 count[0] ++; 5675 } while (count[0] != extent[0]); 5676 n = 0; 5677 do 5678 { 5679 /* When we get to the end of a dimension, reset it and increment 5680 the next dimension. */ 5681 count[n] = 0; 5682 n++; 5683 if (n >= array->rank) 5684 { 5685 continue_loop = false; 5686 break; 5687 } 5688 else 5689 count[n] ++; 5690 } while (count[n] == extent[n]); 5691 } 5692 5693finish: 5694 result_ctor = gfc_constructor_first (result->value.constructor); 5695 for (i = 0; i < array->rank; i++) 5696 { 5697 gfc_expr *r_expr; 5698 r_expr = result_ctor->expr; 5699 mpz_set_si (r_expr->value.integer, res[i] + 1); 5700 result_ctor = gfc_constructor_next (result_ctor); 5701 } 5702 return result; 5703} 5704 5705 5706/* Simplify findloc to an array. Similar to 5707 simplify_minmaxloc_to_array. */ 5708 5709static gfc_expr * 5710simplify_findloc_to_array (gfc_expr *result, gfc_expr *array, gfc_expr *value, 5711 gfc_expr *dim, gfc_expr *mask, bool back_val) 5712{ 5713 mpz_t size; 5714 int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride; 5715 gfc_expr **arrayvec, **resultvec, **base, **src, **dest; 5716 gfc_constructor *array_ctor, *mask_ctor, *result_ctor; 5717 5718 int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS], 5719 sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS], 5720 tmpstride[GFC_MAX_DIMENSIONS]; 5721 5722 /* Shortcut for constant .FALSE. MASK. */ 5723 if (mask 5724 && mask->expr_type == EXPR_CONSTANT 5725 && !mask->value.logical) 5726 return result; 5727 5728 /* Build an indexed table for array element expressions to minimize 5729 linked-list traversal. Masked elements are set to NULL. */ 5730 gfc_array_size (array, &size); 5731 arraysize = mpz_get_ui (size); 5732 mpz_clear (size); 5733 5734 arrayvec = XCNEWVEC (gfc_expr*, arraysize); 5735 5736 array_ctor = gfc_constructor_first (array->value.constructor); 5737 mask_ctor = NULL; 5738 if (mask && mask->expr_type == EXPR_ARRAY) 5739 mask_ctor = gfc_constructor_first (mask->value.constructor); 5740 5741 for (i = 0; i < arraysize; ++i) 5742 { 5743 arrayvec[i] = array_ctor->expr; 5744 array_ctor = gfc_constructor_next (array_ctor); 5745 5746 if (mask_ctor) 5747 { 5748 if (!mask_ctor->expr->value.logical) 5749 arrayvec[i] = NULL; 5750 5751 mask_ctor = gfc_constructor_next (mask_ctor); 5752 } 5753 } 5754 5755 /* Same for the result expression. */ 5756 gfc_array_size (result, &size); 5757 resultsize = mpz_get_ui (size); 5758 mpz_clear (size); 5759 5760 resultvec = XCNEWVEC (gfc_expr*, resultsize); 5761 result_ctor = gfc_constructor_first (result->value.constructor); 5762 for (i = 0; i < resultsize; ++i) 5763 { 5764 resultvec[i] = result_ctor->expr; 5765 result_ctor = gfc_constructor_next (result_ctor); 5766 } 5767 5768 gfc_extract_int (dim, &dim_index); 5769 5770 dim_index -= 1; /* Zero-base index. */ 5771 dim_extent = 0; 5772 dim_stride = 0; 5773 5774 for (i = 0, n = 0; i < array->rank; ++i) 5775 { 5776 count[i] = 0; 5777 tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]); 5778 if (i == dim_index) 5779 { 5780 dim_extent = mpz_get_si (array->shape[i]); 5781 dim_stride = tmpstride[i]; 5782 continue; 5783 } 5784 5785 extent[n] = mpz_get_si (array->shape[i]); 5786 sstride[n] = tmpstride[i]; 5787 dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1]; 5788 n += 1; 5789 } 5790 5791 done = resultsize <= 0; 5792 base = arrayvec; 5793 dest = resultvec; 5794 while (!done) 5795 { 5796 for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n) 5797 { 5798 if (*src && gfc_compare_expr (*src, value, INTRINSIC_EQ) == 0) 5799 { 5800 mpz_set_si ((*dest)->value.integer, n + 1); 5801 if (!back_val) 5802 break; 5803 } 5804 } 5805 5806 count[0]++; 5807 base += sstride[0]; 5808 dest += dstride[0]; 5809 5810 n = 0; 5811 while (!done && count[n] == extent[n]) 5812 { 5813 count[n] = 0; 5814 base -= sstride[n] * extent[n]; 5815 dest -= dstride[n] * extent[n]; 5816 5817 n++; 5818 if (n < result->rank) 5819 { 5820 /* If the nested loop is unrolled GFC_MAX_DIMENSIONS 5821 times, we'd warn for the last iteration, because the 5822 array index will have already been incremented to the 5823 array sizes, and we can't tell that this must make 5824 the test against result->rank false, because ranks 5825 must not exceed GFC_MAX_DIMENSIONS. */ 5826 GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray-bounds) 5827 count[n]++; 5828 base += sstride[n]; 5829 dest += dstride[n]; 5830 GCC_DIAGNOSTIC_POP 5831 } 5832 else 5833 done = true; 5834 } 5835 } 5836 5837 /* Place updated expression in result constructor. */ 5838 result_ctor = gfc_constructor_first (result->value.constructor); 5839 for (i = 0; i < resultsize; ++i) 5840 { 5841 result_ctor->expr = resultvec[i]; 5842 result_ctor = gfc_constructor_next (result_ctor); 5843 } 5844 5845 free (arrayvec); 5846 free (resultvec); 5847 return result; 5848} 5849 5850/* Simplify findloc. */ 5851 5852gfc_expr * 5853gfc_simplify_findloc (gfc_expr *array, gfc_expr *value, gfc_expr *dim, 5854 gfc_expr *mask, gfc_expr *kind, gfc_expr *back) 5855{ 5856 gfc_expr *result; 5857 int ikind; 5858 bool back_val = false; 5859 5860 if (!is_constant_array_expr (array) 5861 || array->shape == NULL 5862 || !gfc_is_constant_expr (dim)) 5863 return NULL; 5864 5865 if (! gfc_is_constant_expr (value)) 5866 return 0; 5867 5868 if (mask 5869 && !is_constant_array_expr (mask) 5870 && mask->expr_type != EXPR_CONSTANT) 5871 return NULL; 5872 5873 if (kind) 5874 { 5875 if (gfc_extract_int (kind, &ikind, -1)) 5876 return NULL; 5877 } 5878 else 5879 ikind = gfc_default_integer_kind; 5880 5881 if (back) 5882 { 5883 if (back->expr_type != EXPR_CONSTANT) 5884 return NULL; 5885 5886 back_val = back->value.logical; 5887 } 5888 5889 if (dim) 5890 { 5891 result = transformational_result (array, dim, BT_INTEGER, 5892 ikind, &array->where); 5893 init_result_expr (result, 0, array); 5894 5895 if (array->rank == 1) 5896 return simplify_findloc_to_scalar (result, array, value, mask, 5897 back_val); 5898 else 5899 return simplify_findloc_to_array (result, array, value, dim, mask, 5900 back_val); 5901 } 5902 else 5903 { 5904 result = new_array (BT_INTEGER, ikind, array->rank, &array->where); 5905 return simplify_findloc_nodim (result, value, array, mask, back_val); 5906 } 5907 return NULL; 5908} 5909 5910gfc_expr * 5911gfc_simplify_maxexponent (gfc_expr *x) 5912{ 5913 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false); 5914 return gfc_get_int_expr (gfc_default_integer_kind, &x->where, 5915 gfc_real_kinds[i].max_exponent); 5916} 5917 5918 5919gfc_expr * 5920gfc_simplify_minexponent (gfc_expr *x) 5921{ 5922 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false); 5923 return gfc_get_int_expr (gfc_default_integer_kind, &x->where, 5924 gfc_real_kinds[i].min_exponent); 5925} 5926 5927 5928gfc_expr * 5929gfc_simplify_mod (gfc_expr *a, gfc_expr *p) 5930{ 5931 gfc_expr *result; 5932 int kind; 5933 5934 /* First check p. */ 5935 if (p->expr_type != EXPR_CONSTANT) 5936 return NULL; 5937 5938 /* p shall not be 0. */ 5939 switch (p->ts.type) 5940 { 5941 case BT_INTEGER: 5942 if (mpz_cmp_ui (p->value.integer, 0) == 0) 5943 { 5944 gfc_error ("Argument %qs of MOD at %L shall not be zero", 5945 "P", &p->where); 5946 return &gfc_bad_expr; 5947 } 5948 break; 5949 case BT_REAL: 5950 if (mpfr_cmp_ui (p->value.real, 0) == 0) 5951 { 5952 gfc_error ("Argument %qs of MOD at %L shall not be zero", 5953 "P", &p->where); 5954 return &gfc_bad_expr; 5955 } 5956 break; 5957 default: 5958 gfc_internal_error ("gfc_simplify_mod(): Bad arguments"); 5959 } 5960 5961 if (a->expr_type != EXPR_CONSTANT) 5962 return NULL; 5963 5964 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind; 5965 result = gfc_get_constant_expr (a->ts.type, kind, &a->where); 5966 5967 if (a->ts.type == BT_INTEGER) 5968 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer); 5969 else 5970 { 5971 gfc_set_model_kind (kind); 5972 mpfr_fmod (result->value.real, a->value.real, p->value.real, 5973 GFC_RND_MODE); 5974 } 5975 5976 return range_check (result, "MOD"); 5977} 5978 5979 5980gfc_expr * 5981gfc_simplify_modulo (gfc_expr *a, gfc_expr *p) 5982{ 5983 gfc_expr *result; 5984 int kind; 5985 5986 /* First check p. */ 5987 if (p->expr_type != EXPR_CONSTANT) 5988 return NULL; 5989 5990 /* p shall not be 0. */ 5991 switch (p->ts.type) 5992 { 5993 case BT_INTEGER: 5994 if (mpz_cmp_ui (p->value.integer, 0) == 0) 5995 { 5996 gfc_error ("Argument %qs of MODULO at %L shall not be zero", 5997 "P", &p->where); 5998 return &gfc_bad_expr; 5999 } 6000 break; 6001 case BT_REAL: 6002 if (mpfr_cmp_ui (p->value.real, 0) == 0) 6003 { 6004 gfc_error ("Argument %qs of MODULO at %L shall not be zero", 6005 "P", &p->where); 6006 return &gfc_bad_expr; 6007 } 6008 break; 6009 default: 6010 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments"); 6011 } 6012 6013 if (a->expr_type != EXPR_CONSTANT) 6014 return NULL; 6015 6016 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind; 6017 result = gfc_get_constant_expr (a->ts.type, kind, &a->where); 6018 6019 if (a->ts.type == BT_INTEGER) 6020 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer); 6021 else 6022 { 6023 gfc_set_model_kind (kind); 6024 mpfr_fmod (result->value.real, a->value.real, p->value.real, 6025 GFC_RND_MODE); 6026 if (mpfr_cmp_ui (result->value.real, 0) != 0) 6027 { 6028 if (mpfr_signbit (a->value.real) != mpfr_signbit (p->value.real)) 6029 mpfr_add (result->value.real, result->value.real, p->value.real, 6030 GFC_RND_MODE); 6031 } 6032 else 6033 mpfr_copysign (result->value.real, result->value.real, 6034 p->value.real, GFC_RND_MODE); 6035 } 6036 6037 return range_check (result, "MODULO"); 6038} 6039 6040 6041gfc_expr * 6042gfc_simplify_nearest (gfc_expr *x, gfc_expr *s) 6043{ 6044 gfc_expr *result; 6045 mpfr_exp_t emin, emax; 6046 int kind; 6047 6048 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT) 6049 return NULL; 6050 6051 result = gfc_copy_expr (x); 6052 6053 /* Save current values of emin and emax. */ 6054 emin = mpfr_get_emin (); 6055 emax = mpfr_get_emax (); 6056 6057 /* Set emin and emax for the current model number. */ 6058 kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0); 6059 mpfr_set_emin ((mpfr_exp_t) gfc_real_kinds[kind].min_exponent - 6060 mpfr_get_prec(result->value.real) + 1); 6061 mpfr_set_emax ((mpfr_exp_t) gfc_real_kinds[kind].max_exponent); 6062 mpfr_check_range (result->value.real, 0, MPFR_RNDU); 6063 6064 if (mpfr_sgn (s->value.real) > 0) 6065 { 6066 mpfr_nextabove (result->value.real); 6067 mpfr_subnormalize (result->value.real, 0, MPFR_RNDU); 6068 } 6069 else 6070 { 6071 mpfr_nextbelow (result->value.real); 6072 mpfr_subnormalize (result->value.real, 0, MPFR_RNDD); 6073 } 6074 6075 mpfr_set_emin (emin); 6076 mpfr_set_emax (emax); 6077 6078 /* Only NaN can occur. Do not use range check as it gives an 6079 error for denormal numbers. */ 6080 if (mpfr_nan_p (result->value.real) && flag_range_check) 6081 { 6082 gfc_error ("Result of NEAREST is NaN at %L", &result->where); 6083 gfc_free_expr (result); 6084 return &gfc_bad_expr; 6085 } 6086 6087 return result; 6088} 6089 6090 6091static gfc_expr * 6092simplify_nint (const char *name, gfc_expr *e, gfc_expr *k) 6093{ 6094 gfc_expr *itrunc, *result; 6095 int kind; 6096 6097 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind); 6098 if (kind == -1) 6099 return &gfc_bad_expr; 6100 6101 if (e->expr_type != EXPR_CONSTANT) 6102 return NULL; 6103 6104 itrunc = gfc_copy_expr (e); 6105 mpfr_round (itrunc->value.real, e->value.real); 6106 6107 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where); 6108 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real, &e->where); 6109 6110 gfc_free_expr (itrunc); 6111 6112 return range_check (result, name); 6113} 6114 6115 6116gfc_expr * 6117gfc_simplify_new_line (gfc_expr *e) 6118{ 6119 gfc_expr *result; 6120 6121 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, 1); 6122 result->value.character.string[0] = '\n'; 6123 6124 return result; 6125} 6126 6127 6128gfc_expr * 6129gfc_simplify_nint (gfc_expr *e, gfc_expr *k) 6130{ 6131 return simplify_nint ("NINT", e, k); 6132} 6133 6134 6135gfc_expr * 6136gfc_simplify_idnint (gfc_expr *e) 6137{ 6138 return simplify_nint ("IDNINT", e, NULL); 6139} 6140 6141static int norm2_scale; 6142 6143static gfc_expr * 6144norm2_add_squared (gfc_expr *result, gfc_expr *e) 6145{ 6146 mpfr_t tmp; 6147 6148 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT); 6149 gcc_assert (result->ts.type == BT_REAL 6150 && result->expr_type == EXPR_CONSTANT); 6151 6152 gfc_set_model_kind (result->ts.kind); 6153 int index = gfc_validate_kind (BT_REAL, result->ts.kind, false); 6154 mpfr_exp_t exp; 6155 if (mpfr_regular_p (result->value.real)) 6156 { 6157 exp = mpfr_get_exp (result->value.real); 6158 /* If result is getting close to overflowing, scale down. */ 6159 if (exp >= gfc_real_kinds[index].max_exponent - 4 6160 && norm2_scale <= gfc_real_kinds[index].max_exponent - 2) 6161 { 6162 norm2_scale += 2; 6163 mpfr_div_ui (result->value.real, result->value.real, 16, 6164 GFC_RND_MODE); 6165 } 6166 } 6167 6168 mpfr_init (tmp); 6169 if (mpfr_regular_p (e->value.real)) 6170 { 6171 exp = mpfr_get_exp (e->value.real); 6172 /* If e**2 would overflow or close to overflowing, scale down. */ 6173 if (exp - norm2_scale >= gfc_real_kinds[index].max_exponent / 2 - 2) 6174 { 6175 int new_scale = gfc_real_kinds[index].max_exponent / 2 + 4; 6176 mpfr_set_ui (tmp, 1, GFC_RND_MODE); 6177 mpfr_set_exp (tmp, new_scale - norm2_scale); 6178 mpfr_div (result->value.real, result->value.real, tmp, GFC_RND_MODE); 6179 mpfr_div (result->value.real, result->value.real, tmp, GFC_RND_MODE); 6180 norm2_scale = new_scale; 6181 } 6182 } 6183 if (norm2_scale) 6184 { 6185 mpfr_set_ui (tmp, 1, GFC_RND_MODE); 6186 mpfr_set_exp (tmp, norm2_scale); 6187 mpfr_div (tmp, e->value.real, tmp, GFC_RND_MODE); 6188 } 6189 else 6190 mpfr_set (tmp, e->value.real, GFC_RND_MODE); 6191 mpfr_pow_ui (tmp, tmp, 2, GFC_RND_MODE); 6192 mpfr_add (result->value.real, result->value.real, tmp, 6193 GFC_RND_MODE); 6194 mpfr_clear (tmp); 6195 6196 return result; 6197} 6198 6199 6200static gfc_expr * 6201norm2_do_sqrt (gfc_expr *result, gfc_expr *e) 6202{ 6203 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT); 6204 gcc_assert (result->ts.type == BT_REAL 6205 && result->expr_type == EXPR_CONSTANT); 6206 6207 if (result != e) 6208 mpfr_set (result->value.real, e->value.real, GFC_RND_MODE); 6209 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE); 6210 if (norm2_scale && mpfr_regular_p (result->value.real)) 6211 { 6212 mpfr_t tmp; 6213 mpfr_init (tmp); 6214 mpfr_set_ui (tmp, 1, GFC_RND_MODE); 6215 mpfr_set_exp (tmp, norm2_scale); 6216 mpfr_mul (result->value.real, result->value.real, tmp, GFC_RND_MODE); 6217 mpfr_clear (tmp); 6218 } 6219 norm2_scale = 0; 6220 6221 return result; 6222} 6223 6224 6225gfc_expr * 6226gfc_simplify_norm2 (gfc_expr *e, gfc_expr *dim) 6227{ 6228 gfc_expr *result; 6229 bool size_zero; 6230 6231 size_zero = gfc_is_size_zero_array (e); 6232 6233 if (!(is_constant_array_expr (e) || size_zero) 6234 || (dim != NULL && !gfc_is_constant_expr (dim))) 6235 return NULL; 6236 6237 result = transformational_result (e, dim, e->ts.type, e->ts.kind, &e->where); 6238 init_result_expr (result, 0, NULL); 6239 6240 if (size_zero) 6241 return result; 6242 6243 norm2_scale = 0; 6244 if (!dim || e->rank == 1) 6245 { 6246 result = simplify_transformation_to_scalar (result, e, NULL, 6247 norm2_add_squared); 6248 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE); 6249 if (norm2_scale && mpfr_regular_p (result->value.real)) 6250 { 6251 mpfr_t tmp; 6252 mpfr_init (tmp); 6253 mpfr_set_ui (tmp, 1, GFC_RND_MODE); 6254 mpfr_set_exp (tmp, norm2_scale); 6255 mpfr_mul (result->value.real, result->value.real, tmp, GFC_RND_MODE); 6256 mpfr_clear (tmp); 6257 } 6258 norm2_scale = 0; 6259 } 6260 else 6261 result = simplify_transformation_to_array (result, e, dim, NULL, 6262 norm2_add_squared, 6263 norm2_do_sqrt); 6264 6265 return result; 6266} 6267 6268 6269gfc_expr * 6270gfc_simplify_not (gfc_expr *e) 6271{ 6272 gfc_expr *result; 6273 6274 if (e->expr_type != EXPR_CONSTANT) 6275 return NULL; 6276 6277 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where); 6278 mpz_com (result->value.integer, e->value.integer); 6279 6280 return range_check (result, "NOT"); 6281} 6282 6283 6284gfc_expr * 6285gfc_simplify_null (gfc_expr *mold) 6286{ 6287 gfc_expr *result; 6288 6289 if (mold) 6290 { 6291 result = gfc_copy_expr (mold); 6292 result->expr_type = EXPR_NULL; 6293 } 6294 else 6295 result = gfc_get_null_expr (NULL); 6296 6297 return result; 6298} 6299 6300 6301gfc_expr * 6302gfc_simplify_num_images (gfc_expr *distance ATTRIBUTE_UNUSED, gfc_expr *failed) 6303{ 6304 gfc_expr *result; 6305 6306 if (flag_coarray == GFC_FCOARRAY_NONE) 6307 { 6308 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable"); 6309 return &gfc_bad_expr; 6310 } 6311 6312 if (flag_coarray != GFC_FCOARRAY_SINGLE) 6313 return NULL; 6314 6315 if (failed && failed->expr_type != EXPR_CONSTANT) 6316 return NULL; 6317 6318 /* FIXME: gfc_current_locus is wrong. */ 6319 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind, 6320 &gfc_current_locus); 6321 6322 if (failed && failed->value.logical != 0) 6323 mpz_set_si (result->value.integer, 0); 6324 else 6325 mpz_set_si (result->value.integer, 1); 6326 6327 return result; 6328} 6329 6330 6331gfc_expr * 6332gfc_simplify_or (gfc_expr *x, gfc_expr *y) 6333{ 6334 gfc_expr *result; 6335 int kind; 6336 6337 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT) 6338 return NULL; 6339 6340 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind; 6341 6342 switch (x->ts.type) 6343 { 6344 case BT_INTEGER: 6345 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where); 6346 mpz_ior (result->value.integer, x->value.integer, y->value.integer); 6347 return range_check (result, "OR"); 6348 6349 case BT_LOGICAL: 6350 return gfc_get_logical_expr (kind, &x->where, 6351 x->value.logical || y->value.logical); 6352 default: 6353 gcc_unreachable(); 6354 } 6355} 6356 6357 6358gfc_expr * 6359gfc_simplify_pack (gfc_expr *array, gfc_expr *mask, gfc_expr *vector) 6360{ 6361 gfc_expr *result; 6362 gfc_constructor *array_ctor, *mask_ctor, *vector_ctor; 6363 6364 if (!is_constant_array_expr (array) 6365 || !is_constant_array_expr (vector) 6366 || (!gfc_is_constant_expr (mask) 6367 && !is_constant_array_expr (mask))) 6368 return NULL; 6369 6370 result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where); 6371 if (array->ts.type == BT_DERIVED) 6372 result->ts.u.derived = array->ts.u.derived; 6373 6374 array_ctor = gfc_constructor_first (array->value.constructor); 6375 vector_ctor = vector 6376 ? gfc_constructor_first (vector->value.constructor) 6377 : NULL; 6378 6379 if (mask->expr_type == EXPR_CONSTANT 6380 && mask->value.logical) 6381 { 6382 /* Copy all elements of ARRAY to RESULT. */ 6383 while (array_ctor) 6384 { 6385 gfc_constructor_append_expr (&result->value.constructor, 6386 gfc_copy_expr (array_ctor->expr), 6387 NULL); 6388 6389 array_ctor = gfc_constructor_next (array_ctor); 6390 vector_ctor = gfc_constructor_next (vector_ctor); 6391 } 6392 } 6393 else if (mask->expr_type == EXPR_ARRAY) 6394 { 6395 /* Copy only those elements of ARRAY to RESULT whose 6396 MASK equals .TRUE.. */ 6397 mask_ctor = gfc_constructor_first (mask->value.constructor); 6398 while (mask_ctor && array_ctor) 6399 { 6400 if (mask_ctor->expr->value.logical) 6401 { 6402 gfc_constructor_append_expr (&result->value.constructor, 6403 gfc_copy_expr (array_ctor->expr), 6404 NULL); 6405 vector_ctor = gfc_constructor_next (vector_ctor); 6406 } 6407 6408 array_ctor = gfc_constructor_next (array_ctor); 6409 mask_ctor = gfc_constructor_next (mask_ctor); 6410 } 6411 } 6412 6413 /* Append any left-over elements from VECTOR to RESULT. */ 6414 while (vector_ctor) 6415 { 6416 gfc_constructor_append_expr (&result->value.constructor, 6417 gfc_copy_expr (vector_ctor->expr), 6418 NULL); 6419 vector_ctor = gfc_constructor_next (vector_ctor); 6420 } 6421 6422 result->shape = gfc_get_shape (1); 6423 gfc_array_size (result, &result->shape[0]); 6424 6425 if (array->ts.type == BT_CHARACTER) 6426 result->ts.u.cl = array->ts.u.cl; 6427 6428 return result; 6429} 6430 6431 6432static gfc_expr * 6433do_xor (gfc_expr *result, gfc_expr *e) 6434{ 6435 gcc_assert (e->ts.type == BT_LOGICAL && e->expr_type == EXPR_CONSTANT); 6436 gcc_assert (result->ts.type == BT_LOGICAL 6437 && result->expr_type == EXPR_CONSTANT); 6438 6439 result->value.logical = result->value.logical != e->value.logical; 6440 return result; 6441} 6442 6443 6444gfc_expr * 6445gfc_simplify_is_contiguous (gfc_expr *array) 6446{ 6447 if (gfc_is_simply_contiguous (array, false, true)) 6448 return gfc_get_logical_expr (gfc_default_logical_kind, &array->where, 1); 6449 6450 if (gfc_is_not_contiguous (array)) 6451 return gfc_get_logical_expr (gfc_default_logical_kind, &array->where, 0); 6452 6453 return NULL; 6454} 6455 6456 6457gfc_expr * 6458gfc_simplify_parity (gfc_expr *e, gfc_expr *dim) 6459{ 6460 return simplify_transformation (e, dim, NULL, 0, do_xor); 6461} 6462 6463 6464gfc_expr * 6465gfc_simplify_popcnt (gfc_expr *e) 6466{ 6467 int res, k; 6468 mpz_t x; 6469 6470 if (e->expr_type != EXPR_CONSTANT) 6471 return NULL; 6472 6473 k = gfc_validate_kind (e->ts.type, e->ts.kind, false); 6474 6475 /* Convert argument to unsigned, then count the '1' bits. */ 6476 mpz_init_set (x, e->value.integer); 6477 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size); 6478 res = mpz_popcount (x); 6479 mpz_clear (x); 6480 6481 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, res); 6482} 6483 6484 6485gfc_expr * 6486gfc_simplify_poppar (gfc_expr *e) 6487{ 6488 gfc_expr *popcnt; 6489 int i; 6490 6491 if (e->expr_type != EXPR_CONSTANT) 6492 return NULL; 6493 6494 popcnt = gfc_simplify_popcnt (e); 6495 gcc_assert (popcnt); 6496 6497 bool fail = gfc_extract_int (popcnt, &i); 6498 gcc_assert (!fail); 6499 6500 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i % 2); 6501} 6502 6503 6504gfc_expr * 6505gfc_simplify_precision (gfc_expr *e) 6506{ 6507 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false); 6508 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, 6509 gfc_real_kinds[i].precision); 6510} 6511 6512 6513gfc_expr * 6514gfc_simplify_product (gfc_expr *array, gfc_expr *dim, gfc_expr *mask) 6515{ 6516 return simplify_transformation (array, dim, mask, 1, gfc_multiply); 6517} 6518 6519 6520gfc_expr * 6521gfc_simplify_radix (gfc_expr *e) 6522{ 6523 int i; 6524 i = gfc_validate_kind (e->ts.type, e->ts.kind, false); 6525 6526 switch (e->ts.type) 6527 { 6528 case BT_INTEGER: 6529 i = gfc_integer_kinds[i].radix; 6530 break; 6531 6532 case BT_REAL: 6533 i = gfc_real_kinds[i].radix; 6534 break; 6535 6536 default: 6537 gcc_unreachable (); 6538 } 6539 6540 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i); 6541} 6542 6543 6544gfc_expr * 6545gfc_simplify_range (gfc_expr *e) 6546{ 6547 int i; 6548 i = gfc_validate_kind (e->ts.type, e->ts.kind, false); 6549 6550 switch (e->ts.type) 6551 { 6552 case BT_INTEGER: 6553 i = gfc_integer_kinds[i].range; 6554 break; 6555 6556 case BT_REAL: 6557 case BT_COMPLEX: 6558 i = gfc_real_kinds[i].range; 6559 break; 6560 6561 default: 6562 gcc_unreachable (); 6563 } 6564 6565 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i); 6566} 6567 6568 6569gfc_expr * 6570gfc_simplify_rank (gfc_expr *e) 6571{ 6572 /* Assumed rank. */ 6573 if (e->rank == -1) 6574 return NULL; 6575 6576 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, e->rank); 6577} 6578 6579 6580gfc_expr * 6581gfc_simplify_real (gfc_expr *e, gfc_expr *k) 6582{ 6583 gfc_expr *result = NULL; 6584 int kind, tmp1, tmp2; 6585 6586 /* Convert BOZ to real, and return without range checking. */ 6587 if (e->ts.type == BT_BOZ) 6588 { 6589 /* Determine kind for conversion of the BOZ. */ 6590 if (k) 6591 gfc_extract_int (k, &kind); 6592 else 6593 kind = gfc_default_real_kind; 6594 6595 if (!gfc_boz2real (e, kind)) 6596 return NULL; 6597 result = gfc_copy_expr (e); 6598 return result; 6599 } 6600 6601 if (e->ts.type == BT_COMPLEX) 6602 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind); 6603 else 6604 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind); 6605 6606 if (kind == -1) 6607 return &gfc_bad_expr; 6608 6609 if (e->expr_type != EXPR_CONSTANT) 6610 return NULL; 6611 6612 /* For explicit conversion, turn off -Wconversion and -Wconversion-extra 6613 warnings. */ 6614 tmp1 = warn_conversion; 6615 tmp2 = warn_conversion_extra; 6616 warn_conversion = warn_conversion_extra = 0; 6617 6618 result = gfc_convert_constant (e, BT_REAL, kind); 6619 6620 warn_conversion = tmp1; 6621 warn_conversion_extra = tmp2; 6622 6623 if (result == &gfc_bad_expr) 6624 return &gfc_bad_expr; 6625 6626 return range_check (result, "REAL"); 6627} 6628 6629 6630gfc_expr * 6631gfc_simplify_realpart (gfc_expr *e) 6632{ 6633 gfc_expr *result; 6634 6635 if (e->expr_type != EXPR_CONSTANT) 6636 return NULL; 6637 6638 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where); 6639 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE); 6640 6641 return range_check (result, "REALPART"); 6642} 6643 6644gfc_expr * 6645gfc_simplify_repeat (gfc_expr *e, gfc_expr *n) 6646{ 6647 gfc_expr *result; 6648 gfc_charlen_t len; 6649 mpz_t ncopies; 6650 bool have_length = false; 6651 6652 /* If NCOPIES isn't a constant, there's nothing we can do. */ 6653 if (n->expr_type != EXPR_CONSTANT) 6654 return NULL; 6655 6656 /* If NCOPIES is negative, it's an error. */ 6657 if (mpz_sgn (n->value.integer) < 0) 6658 { 6659 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L", 6660 &n->where); 6661 return &gfc_bad_expr; 6662 } 6663 6664 /* If we don't know the character length, we can do no more. */ 6665 if (e->ts.u.cl && e->ts.u.cl->length 6666 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT) 6667 { 6668 len = gfc_mpz_get_hwi (e->ts.u.cl->length->value.integer); 6669 have_length = true; 6670 } 6671 else if (e->expr_type == EXPR_CONSTANT 6672 && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL)) 6673 { 6674 len = e->value.character.length; 6675 } 6676 else 6677 return NULL; 6678 6679 /* If the source length is 0, any value of NCOPIES is valid 6680 and everything behaves as if NCOPIES == 0. */ 6681 mpz_init (ncopies); 6682 if (len == 0) 6683 mpz_set_ui (ncopies, 0); 6684 else 6685 mpz_set (ncopies, n->value.integer); 6686 6687 /* Check that NCOPIES isn't too large. */ 6688 if (len) 6689 { 6690 mpz_t max, mlen; 6691 int i; 6692 6693 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */ 6694 mpz_init (max); 6695 i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false); 6696 6697 if (have_length) 6698 { 6699 mpz_tdiv_q (max, gfc_integer_kinds[i].huge, 6700 e->ts.u.cl->length->value.integer); 6701 } 6702 else 6703 { 6704 mpz_init (mlen); 6705 gfc_mpz_set_hwi (mlen, len); 6706 mpz_tdiv_q (max, gfc_integer_kinds[i].huge, mlen); 6707 mpz_clear (mlen); 6708 } 6709 6710 /* The check itself. */ 6711 if (mpz_cmp (ncopies, max) > 0) 6712 { 6713 mpz_clear (max); 6714 mpz_clear (ncopies); 6715 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L", 6716 &n->where); 6717 return &gfc_bad_expr; 6718 } 6719 6720 mpz_clear (max); 6721 } 6722 mpz_clear (ncopies); 6723 6724 /* For further simplification, we need the character string to be 6725 constant. */ 6726 if (e->expr_type != EXPR_CONSTANT) 6727 return NULL; 6728 6729 HOST_WIDE_INT ncop; 6730 if (len || 6731 (e->ts.u.cl->length && 6732 mpz_sgn (e->ts.u.cl->length->value.integer) != 0)) 6733 { 6734 bool fail = gfc_extract_hwi (n, &ncop); 6735 gcc_assert (!fail); 6736 } 6737 else 6738 ncop = 0; 6739 6740 if (ncop == 0) 6741 return gfc_get_character_expr (e->ts.kind, &e->where, NULL, 0); 6742 6743 len = e->value.character.length; 6744 gfc_charlen_t nlen = ncop * len; 6745 6746 /* Here's a semi-arbitrary limit. If the string is longer than 1 GB 6747 (2**28 elements * 4 bytes (wide chars) per element) defer to 6748 runtime instead of consuming (unbounded) memory and CPU at 6749 compile time. */ 6750 if (nlen > 268435456) 6751 { 6752 gfc_warning_now (0, "Evaluation of string longer than 2**28 at %L" 6753 " deferred to runtime, expect bugs", &e->where); 6754 return NULL; 6755 } 6756 6757 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, nlen); 6758 for (size_t i = 0; i < (size_t) ncop; i++) 6759 for (size_t j = 0; j < (size_t) len; j++) 6760 result->value.character.string[j+i*len]= e->value.character.string[j]; 6761 6762 result->value.character.string[nlen] = '\0'; /* For debugger */ 6763 return result; 6764} 6765 6766 6767/* This one is a bear, but mainly has to do with shuffling elements. */ 6768 6769gfc_expr * 6770gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp, 6771 gfc_expr *pad, gfc_expr *order_exp) 6772{ 6773 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS]; 6774 int i, rank, npad, x[GFC_MAX_DIMENSIONS]; 6775 mpz_t index, size; 6776 unsigned long j; 6777 size_t nsource; 6778 gfc_expr *e, *result; 6779 bool zerosize = false; 6780 6781 /* Check that argument expression types are OK. */ 6782 if (!is_constant_array_expr (source) 6783 || !is_constant_array_expr (shape_exp) 6784 || !is_constant_array_expr (pad) 6785 || !is_constant_array_expr (order_exp)) 6786 return NULL; 6787 6788 if (source->shape == NULL) 6789 return NULL; 6790 6791 /* Proceed with simplification, unpacking the array. */ 6792 6793 mpz_init (index); 6794 rank = 0; 6795 6796 for (i = 0; i < GFC_MAX_DIMENSIONS; i++) 6797 x[i] = 0; 6798 6799 for (;;) 6800 { 6801 e = gfc_constructor_lookup_expr (shape_exp->value.constructor, rank); 6802 if (e == NULL) 6803 break; 6804 6805 gfc_extract_int (e, &shape[rank]); 6806 6807 gcc_assert (rank >= 0 && rank < GFC_MAX_DIMENSIONS); 6808 if (shape[rank] < 0) 6809 { 6810 gfc_error ("The SHAPE array for the RESHAPE intrinsic at %L has a " 6811 "negative value %d for dimension %d", 6812 &shape_exp->where, shape[rank], rank+1); 6813 return &gfc_bad_expr; 6814 } 6815 6816 rank++; 6817 } 6818 6819 gcc_assert (rank > 0); 6820 6821 /* Now unpack the order array if present. */ 6822 if (order_exp == NULL) 6823 { 6824 for (i = 0; i < rank; i++) 6825 order[i] = i; 6826 } 6827 else 6828 { 6829 mpz_t size; 6830 int order_size, shape_size; 6831 6832 if (order_exp->rank != shape_exp->rank) 6833 { 6834 gfc_error ("Shapes of ORDER at %L and SHAPE at %L are different", 6835 &order_exp->where, &shape_exp->where); 6836 return &gfc_bad_expr; 6837 } 6838 6839 gfc_array_size (shape_exp, &size); 6840 shape_size = mpz_get_ui (size); 6841 mpz_clear (size); 6842 gfc_array_size (order_exp, &size); 6843 order_size = mpz_get_ui (size); 6844 mpz_clear (size); 6845 if (order_size != shape_size) 6846 { 6847 gfc_error ("Sizes of ORDER at %L and SHAPE at %L are different", 6848 &order_exp->where, &shape_exp->where); 6849 return &gfc_bad_expr; 6850 } 6851 6852 for (i = 0; i < rank; i++) 6853 { 6854 e = gfc_constructor_lookup_expr (order_exp->value.constructor, i); 6855 gcc_assert (e); 6856 6857 gfc_extract_int (e, &order[i]); 6858 6859 if (order[i] < 1 || order[i] > rank) 6860 { 6861 gfc_error ("Element with a value of %d in ORDER at %L must be " 6862 "in the range [1, ..., %d] for the RESHAPE intrinsic " 6863 "near %L", order[i], &order_exp->where, rank, 6864 &shape_exp->where); 6865 return &gfc_bad_expr; 6866 } 6867 6868 order[i]--; 6869 if (x[order[i]] != 0) 6870 { 6871 gfc_error ("ORDER at %L is not a permutation of the size of " 6872 "SHAPE at %L", &order_exp->where, &shape_exp->where); 6873 return &gfc_bad_expr; 6874 } 6875 x[order[i]] = 1; 6876 } 6877 } 6878 6879 /* Count the elements in the source and padding arrays. */ 6880 6881 npad = 0; 6882 if (pad != NULL) 6883 { 6884 gfc_array_size (pad, &size); 6885 npad = mpz_get_ui (size); 6886 mpz_clear (size); 6887 } 6888 6889 gfc_array_size (source, &size); 6890 nsource = mpz_get_ui (size); 6891 mpz_clear (size); 6892 6893 /* If it weren't for that pesky permutation we could just loop 6894 through the source and round out any shortage with pad elements. 6895 But no, someone just had to have the compiler do something the 6896 user should be doing. */ 6897 6898 for (i = 0; i < rank; i++) 6899 x[i] = 0; 6900 6901 result = gfc_get_array_expr (source->ts.type, source->ts.kind, 6902 &source->where); 6903 if (source->ts.type == BT_DERIVED) 6904 result->ts.u.derived = source->ts.u.derived; 6905 if (source->ts.type == BT_CHARACTER && result->ts.u.cl == NULL) 6906 result->ts = source->ts; 6907 result->rank = rank; 6908 result->shape = gfc_get_shape (rank); 6909 for (i = 0; i < rank; i++) 6910 { 6911 mpz_init_set_ui (result->shape[i], shape[i]); 6912 if (shape[i] == 0) 6913 zerosize = true; 6914 } 6915 6916 if (zerosize) 6917 goto sizezero; 6918 6919 while (nsource > 0 || npad > 0) 6920 { 6921 /* Figure out which element to extract. */ 6922 mpz_set_ui (index, 0); 6923 6924 for (i = rank - 1; i >= 0; i--) 6925 { 6926 mpz_add_ui (index, index, x[order[i]]); 6927 if (i != 0) 6928 mpz_mul_ui (index, index, shape[order[i - 1]]); 6929 } 6930 6931 if (mpz_cmp_ui (index, INT_MAX) > 0) 6932 gfc_internal_error ("Reshaped array too large at %C"); 6933 6934 j = mpz_get_ui (index); 6935 6936 if (j < nsource) 6937 e = gfc_constructor_lookup_expr (source->value.constructor, j); 6938 else 6939 { 6940 if (npad <= 0) 6941 { 6942 mpz_clear (index); 6943 return NULL; 6944 } 6945 j = j - nsource; 6946 j = j % npad; 6947 e = gfc_constructor_lookup_expr (pad->value.constructor, j); 6948 } 6949 gcc_assert (e); 6950 6951 gfc_constructor_append_expr (&result->value.constructor, 6952 gfc_copy_expr (e), &e->where); 6953 6954 /* Calculate the next element. */ 6955 i = 0; 6956 6957inc: 6958 if (++x[i] < shape[i]) 6959 continue; 6960 x[i++] = 0; 6961 if (i < rank) 6962 goto inc; 6963 6964 break; 6965 } 6966 6967sizezero: 6968 6969 mpz_clear (index); 6970 6971 return result; 6972} 6973 6974 6975gfc_expr * 6976gfc_simplify_rrspacing (gfc_expr *x) 6977{ 6978 gfc_expr *result; 6979 int i; 6980 long int e, p; 6981 6982 if (x->expr_type != EXPR_CONSTANT) 6983 return NULL; 6984 6985 i = gfc_validate_kind (x->ts.type, x->ts.kind, false); 6986 6987 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where); 6988 6989 /* RRSPACING(+/- 0.0) = 0.0 */ 6990 if (mpfr_zero_p (x->value.real)) 6991 { 6992 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE); 6993 return result; 6994 } 6995 6996 /* RRSPACING(inf) = NaN */ 6997 if (mpfr_inf_p (x->value.real)) 6998 { 6999 mpfr_set_nan (result->value.real); 7000 return result; 7001 } 7002 7003 /* RRSPACING(NaN) = same NaN */ 7004 if (mpfr_nan_p (x->value.real)) 7005 { 7006 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE); 7007 return result; 7008 } 7009 7010 /* | x * 2**(-e) | * 2**p. */ 7011 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE); 7012 e = - (long int) mpfr_get_exp (x->value.real); 7013 mpfr_mul_2si (result->value.real, result->value.real, e, GFC_RND_MODE); 7014 7015 p = (long int) gfc_real_kinds[i].digits; 7016 mpfr_mul_2si (result->value.real, result->value.real, p, GFC_RND_MODE); 7017 7018 return range_check (result, "RRSPACING"); 7019} 7020 7021 7022gfc_expr * 7023gfc_simplify_scale (gfc_expr *x, gfc_expr *i) 7024{ 7025 int k, neg_flag, power, exp_range; 7026 mpfr_t scale, radix; 7027 gfc_expr *result; 7028 7029 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT) 7030 return NULL; 7031 7032 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where); 7033 7034 if (mpfr_zero_p (x->value.real)) 7035 { 7036 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE); 7037 return result; 7038 } 7039 7040 k = gfc_validate_kind (BT_REAL, x->ts.kind, false); 7041 7042 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent; 7043 7044 /* This check filters out values of i that would overflow an int. */ 7045 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0 7046 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0) 7047 { 7048 gfc_error ("Result of SCALE overflows its kind at %L", &result->where); 7049 gfc_free_expr (result); 7050 return &gfc_bad_expr; 7051 } 7052 7053 /* Compute scale = radix ** power. */ 7054 power = mpz_get_si (i->value.integer); 7055 7056 if (power >= 0) 7057 neg_flag = 0; 7058 else 7059 { 7060 neg_flag = 1; 7061 power = -power; 7062 } 7063 7064 gfc_set_model_kind (x->ts.kind); 7065 mpfr_init (scale); 7066 mpfr_init (radix); 7067 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE); 7068 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE); 7069 7070 if (neg_flag) 7071 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE); 7072 else 7073 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE); 7074 7075 mpfr_clears (scale, radix, NULL); 7076 7077 return range_check (result, "SCALE"); 7078} 7079 7080 7081/* Variants of strspn and strcspn that operate on wide characters. */ 7082 7083static size_t 7084wide_strspn (const gfc_char_t *s1, const gfc_char_t *s2) 7085{ 7086 size_t i = 0; 7087 const gfc_char_t *c; 7088 7089 while (s1[i]) 7090 { 7091 for (c = s2; *c; c++) 7092 { 7093 if (s1[i] == *c) 7094 break; 7095 } 7096 if (*c == '\0') 7097 break; 7098 i++; 7099 } 7100 7101 return i; 7102} 7103 7104static size_t 7105wide_strcspn (const gfc_char_t *s1, const gfc_char_t *s2) 7106{ 7107 size_t i = 0; 7108 const gfc_char_t *c; 7109 7110 while (s1[i]) 7111 { 7112 for (c = s2; *c; c++) 7113 { 7114 if (s1[i] == *c) 7115 break; 7116 } 7117 if (*c) 7118 break; 7119 i++; 7120 } 7121 7122 return i; 7123} 7124 7125 7126gfc_expr * 7127gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind) 7128{ 7129 gfc_expr *result; 7130 int back; 7131 size_t i; 7132 size_t indx, len, lenc; 7133 int k = get_kind (BT_INTEGER, kind, "SCAN", gfc_default_integer_kind); 7134 7135 if (k == -1) 7136 return &gfc_bad_expr; 7137 7138 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT 7139 || ( b != NULL && b->expr_type != EXPR_CONSTANT)) 7140 return NULL; 7141 7142 if (b != NULL && b->value.logical != 0) 7143 back = 1; 7144 else 7145 back = 0; 7146 7147 len = e->value.character.length; 7148 lenc = c->value.character.length; 7149 7150 if (len == 0 || lenc == 0) 7151 { 7152 indx = 0; 7153 } 7154 else 7155 { 7156 if (back == 0) 7157 { 7158 indx = wide_strcspn (e->value.character.string, 7159 c->value.character.string) + 1; 7160 if (indx > len) 7161 indx = 0; 7162 } 7163 else 7164 for (indx = len; indx > 0; indx--) 7165 { 7166 for (i = 0; i < lenc; i++) 7167 { 7168 if (c->value.character.string[i] 7169 == e->value.character.string[indx - 1]) 7170 break; 7171 } 7172 if (i < lenc) 7173 break; 7174 } 7175 } 7176 7177 result = gfc_get_int_expr (k, &e->where, indx); 7178 return range_check (result, "SCAN"); 7179} 7180 7181 7182gfc_expr * 7183gfc_simplify_selected_char_kind (gfc_expr *e) 7184{ 7185 int kind; 7186 7187 if (e->expr_type != EXPR_CONSTANT) 7188 return NULL; 7189 7190 if (gfc_compare_with_Cstring (e, "ascii", false) == 0 7191 || gfc_compare_with_Cstring (e, "default", false) == 0) 7192 kind = 1; 7193 else if (gfc_compare_with_Cstring (e, "iso_10646", false) == 0) 7194 kind = 4; 7195 else 7196 kind = -1; 7197 7198 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind); 7199} 7200 7201 7202gfc_expr * 7203gfc_simplify_selected_int_kind (gfc_expr *e) 7204{ 7205 int i, kind, range; 7206 7207 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range)) 7208 return NULL; 7209 7210 kind = INT_MAX; 7211 7212 for (i = 0; gfc_integer_kinds[i].kind != 0; i++) 7213 if (gfc_integer_kinds[i].range >= range 7214 && gfc_integer_kinds[i].kind < kind) 7215 kind = gfc_integer_kinds[i].kind; 7216 7217 if (kind == INT_MAX) 7218 kind = -1; 7219 7220 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind); 7221} 7222 7223 7224gfc_expr * 7225gfc_simplify_selected_real_kind (gfc_expr *p, gfc_expr *q, gfc_expr *rdx) 7226{ 7227 int range, precision, radix, i, kind, found_precision, found_range, 7228 found_radix; 7229 locus *loc = &gfc_current_locus; 7230 7231 if (p == NULL) 7232 precision = 0; 7233 else 7234 { 7235 if (p->expr_type != EXPR_CONSTANT 7236 || gfc_extract_int (p, &precision)) 7237 return NULL; 7238 loc = &p->where; 7239 } 7240 7241 if (q == NULL) 7242 range = 0; 7243 else 7244 { 7245 if (q->expr_type != EXPR_CONSTANT 7246 || gfc_extract_int (q, &range)) 7247 return NULL; 7248 7249 if (!loc) 7250 loc = &q->where; 7251 } 7252 7253 if (rdx == NULL) 7254 radix = 0; 7255 else 7256 { 7257 if (rdx->expr_type != EXPR_CONSTANT 7258 || gfc_extract_int (rdx, &radix)) 7259 return NULL; 7260 7261 if (!loc) 7262 loc = &rdx->where; 7263 } 7264 7265 kind = INT_MAX; 7266 found_precision = 0; 7267 found_range = 0; 7268 found_radix = 0; 7269 7270 for (i = 0; gfc_real_kinds[i].kind != 0; i++) 7271 { 7272 if (gfc_real_kinds[i].precision >= precision) 7273 found_precision = 1; 7274 7275 if (gfc_real_kinds[i].range >= range) 7276 found_range = 1; 7277 7278 if (radix == 0 || gfc_real_kinds[i].radix == radix) 7279 found_radix = 1; 7280 7281 if (gfc_real_kinds[i].precision >= precision 7282 && gfc_real_kinds[i].range >= range 7283 && (radix == 0 || gfc_real_kinds[i].radix == radix) 7284 && gfc_real_kinds[i].kind < kind) 7285 kind = gfc_real_kinds[i].kind; 7286 } 7287 7288 if (kind == INT_MAX) 7289 { 7290 if (found_radix && found_range && !found_precision) 7291 kind = -1; 7292 else if (found_radix && found_precision && !found_range) 7293 kind = -2; 7294 else if (found_radix && !found_precision && !found_range) 7295 kind = -3; 7296 else if (found_radix) 7297 kind = -4; 7298 else 7299 kind = -5; 7300 } 7301 7302 return gfc_get_int_expr (gfc_default_integer_kind, loc, kind); 7303} 7304 7305 7306gfc_expr * 7307gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i) 7308{ 7309 gfc_expr *result; 7310 mpfr_t exp, absv, log2, pow2, frac; 7311 long exp2; 7312 7313 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT) 7314 return NULL; 7315 7316 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where); 7317 7318 /* SET_EXPONENT (+/-0.0, I) = +/- 0.0 7319 SET_EXPONENT (NaN) = same NaN */ 7320 if (mpfr_zero_p (x->value.real) || mpfr_nan_p (x->value.real)) 7321 { 7322 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE); 7323 return result; 7324 } 7325 7326 /* SET_EXPONENT (inf) = NaN */ 7327 if (mpfr_inf_p (x->value.real)) 7328 { 7329 mpfr_set_nan (result->value.real); 7330 return result; 7331 } 7332 7333 gfc_set_model_kind (x->ts.kind); 7334 mpfr_init (absv); 7335 mpfr_init (log2); 7336 mpfr_init (exp); 7337 mpfr_init (pow2); 7338 mpfr_init (frac); 7339 7340 mpfr_abs (absv, x->value.real, GFC_RND_MODE); 7341 mpfr_log2 (log2, absv, GFC_RND_MODE); 7342 7343 mpfr_floor (log2, log2); 7344 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE); 7345 7346 /* Old exponent value, and fraction. */ 7347 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE); 7348 7349 mpfr_div (frac, x->value.real, pow2, GFC_RND_MODE); 7350 7351 /* New exponent. */ 7352 exp2 = mpz_get_si (i->value.integer); 7353 mpfr_mul_2si (result->value.real, frac, exp2, GFC_RND_MODE); 7354 7355 mpfr_clears (absv, log2, exp, pow2, frac, NULL); 7356 7357 return range_check (result, "SET_EXPONENT"); 7358} 7359 7360 7361gfc_expr * 7362gfc_simplify_shape (gfc_expr *source, gfc_expr *kind) 7363{ 7364 mpz_t shape[GFC_MAX_DIMENSIONS]; 7365 gfc_expr *result, *e, *f; 7366 gfc_array_ref *ar; 7367 int n; 7368 bool t; 7369 int k = get_kind (BT_INTEGER, kind, "SHAPE", gfc_default_integer_kind); 7370 7371 if (source->rank == -1) 7372 return NULL; 7373 7374 result = gfc_get_array_expr (BT_INTEGER, k, &source->where); 7375 result->shape = gfc_get_shape (1); 7376 mpz_init (result->shape[0]); 7377 7378 if (source->rank == 0) 7379 return result; 7380 7381 if (source->expr_type == EXPR_VARIABLE) 7382 { 7383 ar = gfc_find_array_ref (source); 7384 t = gfc_array_ref_shape (ar, shape); 7385 } 7386 else if (source->shape) 7387 { 7388 t = true; 7389 for (n = 0; n < source->rank; n++) 7390 { 7391 mpz_init (shape[n]); 7392 mpz_set (shape[n], source->shape[n]); 7393 } 7394 } 7395 else 7396 t = false; 7397 7398 for (n = 0; n < source->rank; n++) 7399 { 7400 e = gfc_get_constant_expr (BT_INTEGER, k, &source->where); 7401 7402 if (t) 7403 mpz_set (e->value.integer, shape[n]); 7404 else 7405 { 7406 mpz_set_ui (e->value.integer, n + 1); 7407 7408 f = simplify_size (source, e, k); 7409 gfc_free_expr (e); 7410 if (f == NULL) 7411 { 7412 gfc_free_expr (result); 7413 return NULL; 7414 } 7415 else 7416 e = f; 7417 } 7418 7419 if (e == &gfc_bad_expr || range_check (e, "SHAPE") == &gfc_bad_expr) 7420 { 7421 gfc_free_expr (result); 7422 if (t) 7423 gfc_clear_shape (shape, source->rank); 7424 return &gfc_bad_expr; 7425 } 7426 7427 gfc_constructor_append_expr (&result->value.constructor, e, NULL); 7428 } 7429 7430 if (t) 7431 gfc_clear_shape (shape, source->rank); 7432 7433 mpz_set_si (result->shape[0], source->rank); 7434 7435 return result; 7436} 7437 7438 7439static gfc_expr * 7440simplify_size (gfc_expr *array, gfc_expr *dim, int k) 7441{ 7442 mpz_t size; 7443 gfc_expr *return_value; 7444 int d; 7445 gfc_ref *ref; 7446 7447 /* For unary operations, the size of the result is given by the size 7448 of the operand. For binary ones, it's the size of the first operand 7449 unless it is scalar, then it is the size of the second. */ 7450 if (array->expr_type == EXPR_OP && !array->value.op.uop) 7451 { 7452 gfc_expr* replacement; 7453 gfc_expr* simplified; 7454 7455 switch (array->value.op.op) 7456 { 7457 /* Unary operations. */ 7458 case INTRINSIC_NOT: 7459 case INTRINSIC_UPLUS: 7460 case INTRINSIC_UMINUS: 7461 case INTRINSIC_PARENTHESES: 7462 replacement = array->value.op.op1; 7463 break; 7464 7465 /* Binary operations. If any one of the operands is scalar, take 7466 the other one's size. If both of them are arrays, it does not 7467 matter -- try to find one with known shape, if possible. */ 7468 default: 7469 if (array->value.op.op1->rank == 0) 7470 replacement = array->value.op.op2; 7471 else if (array->value.op.op2->rank == 0) 7472 replacement = array->value.op.op1; 7473 else 7474 { 7475 simplified = simplify_size (array->value.op.op1, dim, k); 7476 if (simplified) 7477 return simplified; 7478 7479 replacement = array->value.op.op2; 7480 } 7481 break; 7482 } 7483 7484 /* Try to reduce it directly if possible. */ 7485 simplified = simplify_size (replacement, dim, k); 7486 7487 /* Otherwise, we build a new SIZE call. This is hopefully at least 7488 simpler than the original one. */ 7489 if (!simplified) 7490 { 7491 gfc_expr *kind = gfc_get_int_expr (gfc_default_integer_kind, NULL, k); 7492 simplified = gfc_build_intrinsic_call (gfc_current_ns, 7493 GFC_ISYM_SIZE, "size", 7494 array->where, 3, 7495 gfc_copy_expr (replacement), 7496 gfc_copy_expr (dim), 7497 kind); 7498 } 7499 return simplified; 7500 } 7501 7502 for (ref = array->ref; ref; ref = ref->next) 7503 if (ref->type == REF_ARRAY && ref->u.ar.as 7504 && !gfc_resolve_array_spec (ref->u.ar.as, 0)) 7505 return NULL; 7506 7507 if (dim == NULL) 7508 { 7509 if (!gfc_array_size (array, &size)) 7510 return NULL; 7511 } 7512 else 7513 { 7514 if (dim->expr_type != EXPR_CONSTANT) 7515 return NULL; 7516 7517 d = mpz_get_ui (dim->value.integer) - 1; 7518 if (!gfc_array_dimen_size (array, d, &size)) 7519 return NULL; 7520 } 7521 7522 return_value = gfc_get_constant_expr (BT_INTEGER, k, &array->where); 7523 mpz_set (return_value->value.integer, size); 7524 mpz_clear (size); 7525 7526 return return_value; 7527} 7528 7529 7530gfc_expr * 7531gfc_simplify_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind) 7532{ 7533 gfc_expr *result; 7534 int k = get_kind (BT_INTEGER, kind, "SIZE", gfc_default_integer_kind); 7535 7536 if (k == -1) 7537 return &gfc_bad_expr; 7538 7539 result = simplify_size (array, dim, k); 7540 if (result == NULL || result == &gfc_bad_expr) 7541 return result; 7542 7543 return range_check (result, "SIZE"); 7544} 7545 7546 7547/* SIZEOF and C_SIZEOF return the size in bytes of an array element 7548 multiplied by the array size. */ 7549 7550gfc_expr * 7551gfc_simplify_sizeof (gfc_expr *x) 7552{ 7553 gfc_expr *result = NULL; 7554 mpz_t array_size; 7555 size_t res_size; 7556 7557 if (x->ts.type == BT_CLASS || x->ts.deferred) 7558 return NULL; 7559 7560 if (x->ts.type == BT_CHARACTER 7561 && (!x->ts.u.cl || !x->ts.u.cl->length 7562 || x->ts.u.cl->length->expr_type != EXPR_CONSTANT)) 7563 return NULL; 7564 7565 if (x->rank && x->expr_type != EXPR_ARRAY 7566 && !gfc_array_size (x, &array_size)) 7567 return NULL; 7568 7569 result = gfc_get_constant_expr (BT_INTEGER, gfc_index_integer_kind, 7570 &x->where); 7571 gfc_target_expr_size (x, &res_size); 7572 mpz_set_si (result->value.integer, res_size); 7573 7574 return result; 7575} 7576 7577 7578/* STORAGE_SIZE returns the size in bits of a single array element. */ 7579 7580gfc_expr * 7581gfc_simplify_storage_size (gfc_expr *x, 7582 gfc_expr *kind) 7583{ 7584 gfc_expr *result = NULL; 7585 int k; 7586 size_t siz; 7587 7588 if (x->ts.type == BT_CLASS || x->ts.deferred) 7589 return NULL; 7590 7591 if (x->ts.type == BT_CHARACTER && x->expr_type != EXPR_CONSTANT 7592 && (!x->ts.u.cl || !x->ts.u.cl->length 7593 || x->ts.u.cl->length->expr_type != EXPR_CONSTANT)) 7594 return NULL; 7595 7596 k = get_kind (BT_INTEGER, kind, "STORAGE_SIZE", gfc_default_integer_kind); 7597 if (k == -1) 7598 return &gfc_bad_expr; 7599 7600 result = gfc_get_constant_expr (BT_INTEGER, k, &x->where); 7601 7602 gfc_element_size (x, &siz); 7603 mpz_set_si (result->value.integer, siz); 7604 mpz_mul_ui (result->value.integer, result->value.integer, BITS_PER_UNIT); 7605 7606 return range_check (result, "STORAGE_SIZE"); 7607} 7608 7609 7610gfc_expr * 7611gfc_simplify_sign (gfc_expr *x, gfc_expr *y) 7612{ 7613 gfc_expr *result; 7614 7615 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT) 7616 return NULL; 7617 7618 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 7619 7620 switch (x->ts.type) 7621 { 7622 case BT_INTEGER: 7623 mpz_abs (result->value.integer, x->value.integer); 7624 if (mpz_sgn (y->value.integer) < 0) 7625 mpz_neg (result->value.integer, result->value.integer); 7626 break; 7627 7628 case BT_REAL: 7629 if (flag_sign_zero) 7630 mpfr_copysign (result->value.real, x->value.real, y->value.real, 7631 GFC_RND_MODE); 7632 else 7633 mpfr_setsign (result->value.real, x->value.real, 7634 mpfr_sgn (y->value.real) < 0 ? 1 : 0, GFC_RND_MODE); 7635 break; 7636 7637 default: 7638 gfc_internal_error ("Bad type in gfc_simplify_sign"); 7639 } 7640 7641 return result; 7642} 7643 7644 7645gfc_expr * 7646gfc_simplify_sin (gfc_expr *x) 7647{ 7648 gfc_expr *result; 7649 7650 if (x->expr_type != EXPR_CONSTANT) 7651 return NULL; 7652 7653 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 7654 7655 switch (x->ts.type) 7656 { 7657 case BT_REAL: 7658 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE); 7659 break; 7660 7661 case BT_COMPLEX: 7662 gfc_set_model (x->value.real); 7663 mpc_sin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE); 7664 break; 7665 7666 default: 7667 gfc_internal_error ("in gfc_simplify_sin(): Bad type"); 7668 } 7669 7670 return range_check (result, "SIN"); 7671} 7672 7673 7674gfc_expr * 7675gfc_simplify_sinh (gfc_expr *x) 7676{ 7677 gfc_expr *result; 7678 7679 if (x->expr_type != EXPR_CONSTANT) 7680 return NULL; 7681 7682 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 7683 7684 switch (x->ts.type) 7685 { 7686 case BT_REAL: 7687 mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE); 7688 break; 7689 7690 case BT_COMPLEX: 7691 mpc_sinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE); 7692 break; 7693 7694 default: 7695 gcc_unreachable (); 7696 } 7697 7698 return range_check (result, "SINH"); 7699} 7700 7701 7702/* The argument is always a double precision real that is converted to 7703 single precision. TODO: Rounding! */ 7704 7705gfc_expr * 7706gfc_simplify_sngl (gfc_expr *a) 7707{ 7708 gfc_expr *result; 7709 int tmp1, tmp2; 7710 7711 if (a->expr_type != EXPR_CONSTANT) 7712 return NULL; 7713 7714 /* For explicit conversion, turn off -Wconversion and -Wconversion-extra 7715 warnings. */ 7716 tmp1 = warn_conversion; 7717 tmp2 = warn_conversion_extra; 7718 warn_conversion = warn_conversion_extra = 0; 7719 7720 result = gfc_real2real (a, gfc_default_real_kind); 7721 7722 warn_conversion = tmp1; 7723 warn_conversion_extra = tmp2; 7724 7725 return range_check (result, "SNGL"); 7726} 7727 7728 7729gfc_expr * 7730gfc_simplify_spacing (gfc_expr *x) 7731{ 7732 gfc_expr *result; 7733 int i; 7734 long int en, ep; 7735 7736 if (x->expr_type != EXPR_CONSTANT) 7737 return NULL; 7738 7739 i = gfc_validate_kind (x->ts.type, x->ts.kind, false); 7740 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where); 7741 7742 /* SPACING(+/- 0.0) = SPACING(TINY(0.0)) = TINY(0.0) */ 7743 if (mpfr_zero_p (x->value.real)) 7744 { 7745 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE); 7746 return result; 7747 } 7748 7749 /* SPACING(inf) = NaN */ 7750 if (mpfr_inf_p (x->value.real)) 7751 { 7752 mpfr_set_nan (result->value.real); 7753 return result; 7754 } 7755 7756 /* SPACING(NaN) = same NaN */ 7757 if (mpfr_nan_p (x->value.real)) 7758 { 7759 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE); 7760 return result; 7761 } 7762 7763 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p 7764 are the radix, exponent of x, and precision. This excludes the 7765 possibility of subnormal numbers. Fortran 2003 states the result is 7766 b**max(e - p, emin - 1). */ 7767 7768 ep = (long int) mpfr_get_exp (x->value.real) - gfc_real_kinds[i].digits; 7769 en = (long int) gfc_real_kinds[i].min_exponent - 1; 7770 en = en > ep ? en : ep; 7771 7772 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE); 7773 mpfr_mul_2si (result->value.real, result->value.real, en, GFC_RND_MODE); 7774 7775 return range_check (result, "SPACING"); 7776} 7777 7778 7779gfc_expr * 7780gfc_simplify_spread (gfc_expr *source, gfc_expr *dim_expr, gfc_expr *ncopies_expr) 7781{ 7782 gfc_expr *result = NULL; 7783 int nelem, i, j, dim, ncopies; 7784 mpz_t size; 7785 7786 if ((!gfc_is_constant_expr (source) 7787 && !is_constant_array_expr (source)) 7788 || !gfc_is_constant_expr (dim_expr) 7789 || !gfc_is_constant_expr (ncopies_expr)) 7790 return NULL; 7791 7792 gcc_assert (dim_expr->ts.type == BT_INTEGER); 7793 gfc_extract_int (dim_expr, &dim); 7794 dim -= 1; /* zero-base DIM */ 7795 7796 gcc_assert (ncopies_expr->ts.type == BT_INTEGER); 7797 gfc_extract_int (ncopies_expr, &ncopies); 7798 ncopies = MAX (ncopies, 0); 7799 7800 /* Do not allow the array size to exceed the limit for an array 7801 constructor. */ 7802 if (source->expr_type == EXPR_ARRAY) 7803 { 7804 if (!gfc_array_size (source, &size)) 7805 gfc_internal_error ("Failure getting length of a constant array."); 7806 } 7807 else 7808 mpz_init_set_ui (size, 1); 7809 7810 nelem = mpz_get_si (size) * ncopies; 7811 if (nelem > flag_max_array_constructor) 7812 { 7813 if (gfc_init_expr_flag) 7814 { 7815 gfc_error ("The number of elements (%d) in the array constructor " 7816 "at %L requires an increase of the allowed %d upper " 7817 "limit. See %<-fmax-array-constructor%> option.", 7818 nelem, &source->where, flag_max_array_constructor); 7819 return &gfc_bad_expr; 7820 } 7821 else 7822 return NULL; 7823 } 7824 7825 if (source->expr_type == EXPR_CONSTANT 7826 || source->expr_type == EXPR_STRUCTURE) 7827 { 7828 gcc_assert (dim == 0); 7829 7830 result = gfc_get_array_expr (source->ts.type, source->ts.kind, 7831 &source->where); 7832 if (source->ts.type == BT_DERIVED) 7833 result->ts.u.derived = source->ts.u.derived; 7834 result->rank = 1; 7835 result->shape = gfc_get_shape (result->rank); 7836 mpz_init_set_si (result->shape[0], ncopies); 7837 7838 for (i = 0; i < ncopies; ++i) 7839 gfc_constructor_append_expr (&result->value.constructor, 7840 gfc_copy_expr (source), NULL); 7841 } 7842 else if (source->expr_type == EXPR_ARRAY) 7843 { 7844 int offset, rstride[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS]; 7845 gfc_constructor *source_ctor; 7846 7847 gcc_assert (source->rank < GFC_MAX_DIMENSIONS); 7848 gcc_assert (dim >= 0 && dim <= source->rank); 7849 7850 result = gfc_get_array_expr (source->ts.type, source->ts.kind, 7851 &source->where); 7852 if (source->ts.type == BT_DERIVED) 7853 result->ts.u.derived = source->ts.u.derived; 7854 result->rank = source->rank + 1; 7855 result->shape = gfc_get_shape (result->rank); 7856 7857 for (i = 0, j = 0; i < result->rank; ++i) 7858 { 7859 if (i != dim) 7860 mpz_init_set (result->shape[i], source->shape[j++]); 7861 else 7862 mpz_init_set_si (result->shape[i], ncopies); 7863 7864 extent[i] = mpz_get_si (result->shape[i]); 7865 rstride[i] = (i == 0) ? 1 : rstride[i-1] * extent[i-1]; 7866 } 7867 7868 offset = 0; 7869 for (source_ctor = gfc_constructor_first (source->value.constructor); 7870 source_ctor; source_ctor = gfc_constructor_next (source_ctor)) 7871 { 7872 for (i = 0; i < ncopies; ++i) 7873 gfc_constructor_insert_expr (&result->value.constructor, 7874 gfc_copy_expr (source_ctor->expr), 7875 NULL, offset + i * rstride[dim]); 7876 7877 offset += (dim == 0 ? ncopies : 1); 7878 } 7879 } 7880 else 7881 { 7882 gfc_error ("Simplification of SPREAD at %C not yet implemented"); 7883 return &gfc_bad_expr; 7884 } 7885 7886 if (source->ts.type == BT_CHARACTER) 7887 result->ts.u.cl = source->ts.u.cl; 7888 7889 return result; 7890} 7891 7892 7893gfc_expr * 7894gfc_simplify_sqrt (gfc_expr *e) 7895{ 7896 gfc_expr *result = NULL; 7897 7898 if (e->expr_type != EXPR_CONSTANT) 7899 return NULL; 7900 7901 switch (e->ts.type) 7902 { 7903 case BT_REAL: 7904 if (mpfr_cmp_si (e->value.real, 0) < 0) 7905 { 7906 gfc_error ("Argument of SQRT at %L has a negative value", 7907 &e->where); 7908 return &gfc_bad_expr; 7909 } 7910 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where); 7911 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE); 7912 break; 7913 7914 case BT_COMPLEX: 7915 gfc_set_model (e->value.real); 7916 7917 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where); 7918 mpc_sqrt (result->value.complex, e->value.complex, GFC_MPC_RND_MODE); 7919 break; 7920 7921 default: 7922 gfc_internal_error ("invalid argument of SQRT at %L", &e->where); 7923 } 7924 7925 return range_check (result, "SQRT"); 7926} 7927 7928 7929gfc_expr * 7930gfc_simplify_sum (gfc_expr *array, gfc_expr *dim, gfc_expr *mask) 7931{ 7932 return simplify_transformation (array, dim, mask, 0, gfc_add); 7933} 7934 7935 7936/* Simplify COTAN(X) where X has the unit of radian. */ 7937 7938gfc_expr * 7939gfc_simplify_cotan (gfc_expr *x) 7940{ 7941 gfc_expr *result; 7942 mpc_t swp, *val; 7943 7944 if (x->expr_type != EXPR_CONSTANT) 7945 return NULL; 7946 7947 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 7948 7949 switch (x->ts.type) 7950 { 7951 case BT_REAL: 7952 mpfr_cot (result->value.real, x->value.real, GFC_RND_MODE); 7953 break; 7954 7955 case BT_COMPLEX: 7956 /* There is no builtin mpc_cot, so compute cot = cos / sin. */ 7957 val = &result->value.complex; 7958 mpc_init2 (swp, mpfr_get_default_prec ()); 7959 mpc_sin_cos (*val, swp, x->value.complex, GFC_MPC_RND_MODE, 7960 GFC_MPC_RND_MODE); 7961 mpc_div (*val, swp, *val, GFC_MPC_RND_MODE); 7962 mpc_clear (swp); 7963 break; 7964 7965 default: 7966 gcc_unreachable (); 7967 } 7968 7969 return range_check (result, "COTAN"); 7970} 7971 7972 7973gfc_expr * 7974gfc_simplify_tan (gfc_expr *x) 7975{ 7976 gfc_expr *result; 7977 7978 if (x->expr_type != EXPR_CONSTANT) 7979 return NULL; 7980 7981 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 7982 7983 switch (x->ts.type) 7984 { 7985 case BT_REAL: 7986 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE); 7987 break; 7988 7989 case BT_COMPLEX: 7990 mpc_tan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE); 7991 break; 7992 7993 default: 7994 gcc_unreachable (); 7995 } 7996 7997 return range_check (result, "TAN"); 7998} 7999 8000 8001gfc_expr * 8002gfc_simplify_tanh (gfc_expr *x) 8003{ 8004 gfc_expr *result; 8005 8006 if (x->expr_type != EXPR_CONSTANT) 8007 return NULL; 8008 8009 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where); 8010 8011 switch (x->ts.type) 8012 { 8013 case BT_REAL: 8014 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE); 8015 break; 8016 8017 case BT_COMPLEX: 8018 mpc_tanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE); 8019 break; 8020 8021 default: 8022 gcc_unreachable (); 8023 } 8024 8025 return range_check (result, "TANH"); 8026} 8027 8028 8029gfc_expr * 8030gfc_simplify_tiny (gfc_expr *e) 8031{ 8032 gfc_expr *result; 8033 int i; 8034 8035 i = gfc_validate_kind (BT_REAL, e->ts.kind, false); 8036 8037 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where); 8038 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE); 8039 8040 return result; 8041} 8042 8043 8044gfc_expr * 8045gfc_simplify_trailz (gfc_expr *e) 8046{ 8047 unsigned long tz, bs; 8048 int i; 8049 8050 if (e->expr_type != EXPR_CONSTANT) 8051 return NULL; 8052 8053 i = gfc_validate_kind (e->ts.type, e->ts.kind, false); 8054 bs = gfc_integer_kinds[i].bit_size; 8055 tz = mpz_scan1 (e->value.integer, 0); 8056 8057 return gfc_get_int_expr (gfc_default_integer_kind, 8058 &e->where, MIN (tz, bs)); 8059} 8060 8061 8062gfc_expr * 8063gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size) 8064{ 8065 gfc_expr *result; 8066 gfc_expr *mold_element; 8067 size_t source_size; 8068 size_t result_size; 8069 size_t buffer_size; 8070 mpz_t tmp; 8071 unsigned char *buffer; 8072 size_t result_length; 8073 8074 if (!gfc_is_constant_expr (source) || !gfc_is_constant_expr (size)) 8075 return NULL; 8076 8077 if (!gfc_resolve_expr (mold)) 8078 return NULL; 8079 if (gfc_init_expr_flag && !gfc_is_constant_expr (mold)) 8080 return NULL; 8081 8082 if (!gfc_calculate_transfer_sizes (source, mold, size, &source_size, 8083 &result_size, &result_length)) 8084 return NULL; 8085 8086 /* Calculate the size of the source. */ 8087 if (source->expr_type == EXPR_ARRAY && !gfc_array_size (source, &tmp)) 8088 gfc_internal_error ("Failure getting length of a constant array."); 8089 8090 /* Create an empty new expression with the appropriate characteristics. */ 8091 result = gfc_get_constant_expr (mold->ts.type, mold->ts.kind, 8092 &source->where); 8093 result->ts = mold->ts; 8094 8095 mold_element = (mold->expr_type == EXPR_ARRAY && mold->value.constructor) 8096 ? gfc_constructor_first (mold->value.constructor)->expr 8097 : mold; 8098 8099 /* Set result character length, if needed. Note that this needs to be 8100 set even for array expressions, in order to pass this information into 8101 gfc_target_interpret_expr. */ 8102 if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element)) 8103 { 8104 result->value.character.length = mold_element->value.character.length; 8105 8106 /* Let the typespec of the result inherit the string length. 8107 This is crucial if a resulting array has size zero. */ 8108 if (mold_element->ts.u.cl->length) 8109 result->ts.u.cl->length = gfc_copy_expr (mold_element->ts.u.cl->length); 8110 else 8111 result->ts.u.cl->length = 8112 gfc_get_int_expr (gfc_charlen_int_kind, NULL, 8113 mold_element->value.character.length); 8114 } 8115 8116 /* Set the number of elements in the result, and determine its size. */ 8117 8118 if (mold->expr_type == EXPR_ARRAY || mold->rank || size) 8119 { 8120 result->expr_type = EXPR_ARRAY; 8121 result->rank = 1; 8122 result->shape = gfc_get_shape (1); 8123 mpz_init_set_ui (result->shape[0], result_length); 8124 } 8125 else 8126 result->rank = 0; 8127 8128 /* Allocate the buffer to store the binary version of the source. */ 8129 buffer_size = MAX (source_size, result_size); 8130 buffer = (unsigned char*)alloca (buffer_size); 8131 memset (buffer, 0, buffer_size); 8132 8133 /* Now write source to the buffer. */ 8134 gfc_target_encode_expr (source, buffer, buffer_size); 8135 8136 /* And read the buffer back into the new expression. */ 8137 gfc_target_interpret_expr (buffer, buffer_size, result, false); 8138 8139 return result; 8140} 8141 8142 8143gfc_expr * 8144gfc_simplify_transpose (gfc_expr *matrix) 8145{ 8146 int row, matrix_rows, col, matrix_cols; 8147 gfc_expr *result; 8148 8149 if (!is_constant_array_expr (matrix)) 8150 return NULL; 8151 8152 gcc_assert (matrix->rank == 2); 8153 8154 if (matrix->shape == NULL) 8155 return NULL; 8156 8157 result = gfc_get_array_expr (matrix->ts.type, matrix->ts.kind, 8158 &matrix->where); 8159 result->rank = 2; 8160 result->shape = gfc_get_shape (result->rank); 8161 mpz_init_set (result->shape[0], matrix->shape[1]); 8162 mpz_init_set (result->shape[1], matrix->shape[0]); 8163 8164 if (matrix->ts.type == BT_CHARACTER) 8165 result->ts.u.cl = matrix->ts.u.cl; 8166 else if (matrix->ts.type == BT_DERIVED) 8167 result->ts.u.derived = matrix->ts.u.derived; 8168 8169 matrix_rows = mpz_get_si (matrix->shape[0]); 8170 matrix_cols = mpz_get_si (matrix->shape[1]); 8171 for (row = 0; row < matrix_rows; ++row) 8172 for (col = 0; col < matrix_cols; ++col) 8173 { 8174 gfc_expr *e = gfc_constructor_lookup_expr (matrix->value.constructor, 8175 col * matrix_rows + row); 8176 gfc_constructor_insert_expr (&result->value.constructor, 8177 gfc_copy_expr (e), &matrix->where, 8178 row * matrix_cols + col); 8179 } 8180 8181 return result; 8182} 8183 8184 8185gfc_expr * 8186gfc_simplify_trim (gfc_expr *e) 8187{ 8188 gfc_expr *result; 8189 int count, i, len, lentrim; 8190 8191 if (e->expr_type != EXPR_CONSTANT) 8192 return NULL; 8193 8194 len = e->value.character.length; 8195 for (count = 0, i = 1; i <= len; ++i) 8196 { 8197 if (e->value.character.string[len - i] == ' ') 8198 count++; 8199 else 8200 break; 8201 } 8202 8203 lentrim = len - count; 8204 8205 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, lentrim); 8206 for (i = 0; i < lentrim; i++) 8207 result->value.character.string[i] = e->value.character.string[i]; 8208 8209 return result; 8210} 8211 8212 8213gfc_expr * 8214gfc_simplify_image_index (gfc_expr *coarray, gfc_expr *sub) 8215{ 8216 gfc_expr *result; 8217 gfc_ref *ref; 8218 gfc_array_spec *as; 8219 gfc_constructor *sub_cons; 8220 bool first_image; 8221 int d; 8222 8223 if (!is_constant_array_expr (sub)) 8224 return NULL; 8225 8226 /* Follow any component references. */ 8227 as = coarray->symtree->n.sym->as; 8228 for (ref = coarray->ref; ref; ref = ref->next) 8229 if (ref->type == REF_COMPONENT) 8230 as = ref->u.ar.as; 8231 8232 if (as->type == AS_DEFERRED) 8233 return NULL; 8234 8235 /* "valid sequence of cosubscripts" are required; thus, return 0 unless 8236 the cosubscript addresses the first image. */ 8237 8238 sub_cons = gfc_constructor_first (sub->value.constructor); 8239 first_image = true; 8240 8241 for (d = 1; d <= as->corank; d++) 8242 { 8243 gfc_expr *ca_bound; 8244 int cmp; 8245 8246 gcc_assert (sub_cons != NULL); 8247 8248 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 0, as, 8249 NULL, true); 8250 if (ca_bound == NULL) 8251 return NULL; 8252 8253 if (ca_bound == &gfc_bad_expr) 8254 return ca_bound; 8255 8256 cmp = mpz_cmp (ca_bound->value.integer, sub_cons->expr->value.integer); 8257 8258 if (cmp == 0) 8259 { 8260 gfc_free_expr (ca_bound); 8261 sub_cons = gfc_constructor_next (sub_cons); 8262 continue; 8263 } 8264 8265 first_image = false; 8266 8267 if (cmp > 0) 8268 { 8269 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, " 8270 "SUB has %ld and COARRAY lower bound is %ld)", 8271 &coarray->where, d, 8272 mpz_get_si (sub_cons->expr->value.integer), 8273 mpz_get_si (ca_bound->value.integer)); 8274 gfc_free_expr (ca_bound); 8275 return &gfc_bad_expr; 8276 } 8277 8278 gfc_free_expr (ca_bound); 8279 8280 /* Check whether upperbound is valid for the multi-images case. */ 8281 if (d < as->corank) 8282 { 8283 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 1, as, 8284 NULL, true); 8285 if (ca_bound == &gfc_bad_expr) 8286 return ca_bound; 8287 8288 if (ca_bound && ca_bound->expr_type == EXPR_CONSTANT 8289 && mpz_cmp (ca_bound->value.integer, 8290 sub_cons->expr->value.integer) < 0) 8291 { 8292 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, " 8293 "SUB has %ld and COARRAY upper bound is %ld)", 8294 &coarray->where, d, 8295 mpz_get_si (sub_cons->expr->value.integer), 8296 mpz_get_si (ca_bound->value.integer)); 8297 gfc_free_expr (ca_bound); 8298 return &gfc_bad_expr; 8299 } 8300 8301 if (ca_bound) 8302 gfc_free_expr (ca_bound); 8303 } 8304 8305 sub_cons = gfc_constructor_next (sub_cons); 8306 } 8307 8308 gcc_assert (sub_cons == NULL); 8309 8310 if (flag_coarray != GFC_FCOARRAY_SINGLE && !first_image) 8311 return NULL; 8312 8313 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind, 8314 &gfc_current_locus); 8315 if (first_image) 8316 mpz_set_si (result->value.integer, 1); 8317 else 8318 mpz_set_si (result->value.integer, 0); 8319 8320 return result; 8321} 8322 8323gfc_expr * 8324gfc_simplify_image_status (gfc_expr *image, gfc_expr *team ATTRIBUTE_UNUSED) 8325{ 8326 if (flag_coarray == GFC_FCOARRAY_NONE) 8327 { 8328 gfc_current_locus = *gfc_current_intrinsic_where; 8329 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable"); 8330 return &gfc_bad_expr; 8331 } 8332 8333 /* Simplification is possible for fcoarray = single only. For all other modes 8334 the result depends on runtime conditions. */ 8335 if (flag_coarray != GFC_FCOARRAY_SINGLE) 8336 return NULL; 8337 8338 if (gfc_is_constant_expr (image)) 8339 { 8340 gfc_expr *result; 8341 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind, 8342 &image->where); 8343 if (mpz_get_si (image->value.integer) == 1) 8344 mpz_set_si (result->value.integer, 0); 8345 else 8346 mpz_set_si (result->value.integer, GFC_STAT_STOPPED_IMAGE); 8347 return result; 8348 } 8349 else 8350 return NULL; 8351} 8352 8353 8354gfc_expr * 8355gfc_simplify_this_image (gfc_expr *coarray, gfc_expr *dim, 8356 gfc_expr *distance ATTRIBUTE_UNUSED) 8357{ 8358 if (flag_coarray != GFC_FCOARRAY_SINGLE) 8359 return NULL; 8360 8361 /* If no coarray argument has been passed or when the first argument 8362 is actually a distance argument. */ 8363 if (coarray == NULL || !gfc_is_coarray (coarray)) 8364 { 8365 gfc_expr *result; 8366 /* FIXME: gfc_current_locus is wrong. */ 8367 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind, 8368 &gfc_current_locus); 8369 mpz_set_si (result->value.integer, 1); 8370 return result; 8371 } 8372 8373 /* For -fcoarray=single, this_image(A) is the same as lcobound(A). */ 8374 return simplify_cobound (coarray, dim, NULL, 0); 8375} 8376 8377 8378gfc_expr * 8379gfc_simplify_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind) 8380{ 8381 return simplify_bound (array, dim, kind, 1); 8382} 8383 8384gfc_expr * 8385gfc_simplify_ucobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind) 8386{ 8387 return simplify_cobound (array, dim, kind, 1); 8388} 8389 8390 8391gfc_expr * 8392gfc_simplify_unpack (gfc_expr *vector, gfc_expr *mask, gfc_expr *field) 8393{ 8394 gfc_expr *result, *e; 8395 gfc_constructor *vector_ctor, *mask_ctor, *field_ctor; 8396 8397 if (!is_constant_array_expr (vector) 8398 || !is_constant_array_expr (mask) 8399 || (!gfc_is_constant_expr (field) 8400 && !is_constant_array_expr (field))) 8401 return NULL; 8402 8403 result = gfc_get_array_expr (vector->ts.type, vector->ts.kind, 8404 &vector->where); 8405 if (vector->ts.type == BT_DERIVED) 8406 result->ts.u.derived = vector->ts.u.derived; 8407 result->rank = mask->rank; 8408 result->shape = gfc_copy_shape (mask->shape, mask->rank); 8409 8410 if (vector->ts.type == BT_CHARACTER) 8411 result->ts.u.cl = vector->ts.u.cl; 8412 8413 vector_ctor = gfc_constructor_first (vector->value.constructor); 8414 mask_ctor = gfc_constructor_first (mask->value.constructor); 8415 field_ctor 8416 = field->expr_type == EXPR_ARRAY 8417 ? gfc_constructor_first (field->value.constructor) 8418 : NULL; 8419 8420 while (mask_ctor) 8421 { 8422 if (mask_ctor->expr->value.logical) 8423 { 8424 if (vector_ctor) 8425 { 8426 e = gfc_copy_expr (vector_ctor->expr); 8427 vector_ctor = gfc_constructor_next (vector_ctor); 8428 } 8429 else 8430 { 8431 gfc_free_expr (result); 8432 return NULL; 8433 } 8434 } 8435 else if (field->expr_type == EXPR_ARRAY) 8436 e = gfc_copy_expr (field_ctor->expr); 8437 else 8438 e = gfc_copy_expr (field); 8439 8440 gfc_constructor_append_expr (&result->value.constructor, e, NULL); 8441 8442 mask_ctor = gfc_constructor_next (mask_ctor); 8443 field_ctor = gfc_constructor_next (field_ctor); 8444 } 8445 8446 return result; 8447} 8448 8449 8450gfc_expr * 8451gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind) 8452{ 8453 gfc_expr *result; 8454 int back; 8455 size_t index, len, lenset; 8456 size_t i; 8457 int k = get_kind (BT_INTEGER, kind, "VERIFY", gfc_default_integer_kind); 8458 8459 if (k == -1) 8460 return &gfc_bad_expr; 8461 8462 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT 8463 || ( b != NULL && b->expr_type != EXPR_CONSTANT)) 8464 return NULL; 8465 8466 if (b != NULL && b->value.logical != 0) 8467 back = 1; 8468 else 8469 back = 0; 8470 8471 result = gfc_get_constant_expr (BT_INTEGER, k, &s->where); 8472 8473 len = s->value.character.length; 8474 lenset = set->value.character.length; 8475 8476 if (len == 0) 8477 { 8478 mpz_set_ui (result->value.integer, 0); 8479 return result; 8480 } 8481 8482 if (back == 0) 8483 { 8484 if (lenset == 0) 8485 { 8486 mpz_set_ui (result->value.integer, 1); 8487 return result; 8488 } 8489 8490 index = wide_strspn (s->value.character.string, 8491 set->value.character.string) + 1; 8492 if (index > len) 8493 index = 0; 8494 8495 } 8496 else 8497 { 8498 if (lenset == 0) 8499 { 8500 mpz_set_ui (result->value.integer, len); 8501 return result; 8502 } 8503 for (index = len; index > 0; index --) 8504 { 8505 for (i = 0; i < lenset; i++) 8506 { 8507 if (s->value.character.string[index - 1] 8508 == set->value.character.string[i]) 8509 break; 8510 } 8511 if (i == lenset) 8512 break; 8513 } 8514 } 8515 8516 mpz_set_ui (result->value.integer, index); 8517 return result; 8518} 8519 8520 8521gfc_expr * 8522gfc_simplify_xor (gfc_expr *x, gfc_expr *y) 8523{ 8524 gfc_expr *result; 8525 int kind; 8526 8527 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT) 8528 return NULL; 8529 8530 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind; 8531 8532 switch (x->ts.type) 8533 { 8534 case BT_INTEGER: 8535 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where); 8536 mpz_xor (result->value.integer, x->value.integer, y->value.integer); 8537 return range_check (result, "XOR"); 8538 8539 case BT_LOGICAL: 8540 return gfc_get_logical_expr (kind, &x->where, 8541 (x->value.logical && !y->value.logical) 8542 || (!x->value.logical && y->value.logical)); 8543 8544 default: 8545 gcc_unreachable (); 8546 } 8547} 8548 8549 8550/****************** Constant simplification *****************/ 8551 8552/* Master function to convert one constant to another. While this is 8553 used as a simplification function, it requires the destination type 8554 and kind information which is supplied by a special case in 8555 do_simplify(). */ 8556 8557gfc_expr * 8558gfc_convert_constant (gfc_expr *e, bt type, int kind) 8559{ 8560 gfc_expr *result, *(*f) (gfc_expr *, int); 8561 gfc_constructor *c, *t; 8562 8563 switch (e->ts.type) 8564 { 8565 case BT_INTEGER: 8566 switch (type) 8567 { 8568 case BT_INTEGER: 8569 f = gfc_int2int; 8570 break; 8571 case BT_REAL: 8572 f = gfc_int2real; 8573 break; 8574 case BT_COMPLEX: 8575 f = gfc_int2complex; 8576 break; 8577 case BT_LOGICAL: 8578 f = gfc_int2log; 8579 break; 8580 default: 8581 goto oops; 8582 } 8583 break; 8584 8585 case BT_REAL: 8586 switch (type) 8587 { 8588 case BT_INTEGER: 8589 f = gfc_real2int; 8590 break; 8591 case BT_REAL: 8592 f = gfc_real2real; 8593 break; 8594 case BT_COMPLEX: 8595 f = gfc_real2complex; 8596 break; 8597 default: 8598 goto oops; 8599 } 8600 break; 8601 8602 case BT_COMPLEX: 8603 switch (type) 8604 { 8605 case BT_INTEGER: 8606 f = gfc_complex2int; 8607 break; 8608 case BT_REAL: 8609 f = gfc_complex2real; 8610 break; 8611 case BT_COMPLEX: 8612 f = gfc_complex2complex; 8613 break; 8614 8615 default: 8616 goto oops; 8617 } 8618 break; 8619 8620 case BT_LOGICAL: 8621 switch (type) 8622 { 8623 case BT_INTEGER: 8624 f = gfc_log2int; 8625 break; 8626 case BT_LOGICAL: 8627 f = gfc_log2log; 8628 break; 8629 default: 8630 goto oops; 8631 } 8632 break; 8633 8634 case BT_HOLLERITH: 8635 switch (type) 8636 { 8637 case BT_INTEGER: 8638 f = gfc_hollerith2int; 8639 break; 8640 8641 case BT_REAL: 8642 f = gfc_hollerith2real; 8643 break; 8644 8645 case BT_COMPLEX: 8646 f = gfc_hollerith2complex; 8647 break; 8648 8649 case BT_CHARACTER: 8650 f = gfc_hollerith2character; 8651 break; 8652 8653 case BT_LOGICAL: 8654 f = gfc_hollerith2logical; 8655 break; 8656 8657 default: 8658 goto oops; 8659 } 8660 break; 8661 8662 case BT_CHARACTER: 8663 switch (type) 8664 { 8665 case BT_INTEGER: 8666 f = gfc_character2int; 8667 break; 8668 8669 case BT_REAL: 8670 f = gfc_character2real; 8671 break; 8672 8673 case BT_COMPLEX: 8674 f = gfc_character2complex; 8675 break; 8676 8677 case BT_CHARACTER: 8678 f = gfc_character2character; 8679 break; 8680 8681 case BT_LOGICAL: 8682 f = gfc_character2logical; 8683 break; 8684 8685 default: 8686 goto oops; 8687 } 8688 break; 8689 8690 default: 8691 oops: 8692 return &gfc_bad_expr; 8693 } 8694 8695 result = NULL; 8696 8697 switch (e->expr_type) 8698 { 8699 case EXPR_CONSTANT: 8700 result = f (e, kind); 8701 if (result == NULL) 8702 return &gfc_bad_expr; 8703 break; 8704 8705 case EXPR_ARRAY: 8706 if (!gfc_is_constant_expr (e)) 8707 break; 8708 8709 result = gfc_get_array_expr (type, kind, &e->where); 8710 result->shape = gfc_copy_shape (e->shape, e->rank); 8711 result->rank = e->rank; 8712 8713 for (c = gfc_constructor_first (e->value.constructor); 8714 c; c = gfc_constructor_next (c)) 8715 { 8716 gfc_expr *tmp; 8717 if (c->iterator == NULL) 8718 { 8719 if (c->expr->expr_type == EXPR_ARRAY) 8720 tmp = gfc_convert_constant (c->expr, type, kind); 8721 else if (c->expr->expr_type == EXPR_OP) 8722 { 8723 if (!gfc_simplify_expr (c->expr, 1)) 8724 return &gfc_bad_expr; 8725 tmp = f (c->expr, kind); 8726 } 8727 else 8728 tmp = f (c->expr, kind); 8729 } 8730 else 8731 tmp = gfc_convert_constant (c->expr, type, kind); 8732 8733 if (tmp == NULL || tmp == &gfc_bad_expr) 8734 { 8735 gfc_free_expr (result); 8736 return NULL; 8737 } 8738 8739 t = gfc_constructor_append_expr (&result->value.constructor, 8740 tmp, &c->where); 8741 if (c->iterator) 8742 t->iterator = gfc_copy_iterator (c->iterator); 8743 } 8744 8745 break; 8746 8747 default: 8748 break; 8749 } 8750 8751 return result; 8752} 8753 8754 8755/* Function for converting character constants. */ 8756gfc_expr * 8757gfc_convert_char_constant (gfc_expr *e, bt type ATTRIBUTE_UNUSED, int kind) 8758{ 8759 gfc_expr *result; 8760 int i; 8761 8762 if (!gfc_is_constant_expr (e)) 8763 return NULL; 8764 8765 if (e->expr_type == EXPR_CONSTANT) 8766 { 8767 /* Simple case of a scalar. */ 8768 result = gfc_get_constant_expr (BT_CHARACTER, kind, &e->where); 8769 if (result == NULL) 8770 return &gfc_bad_expr; 8771 8772 result->value.character.length = e->value.character.length; 8773 result->value.character.string 8774 = gfc_get_wide_string (e->value.character.length + 1); 8775 memcpy (result->value.character.string, e->value.character.string, 8776 (e->value.character.length + 1) * sizeof (gfc_char_t)); 8777 8778 /* Check we only have values representable in the destination kind. */ 8779 for (i = 0; i < result->value.character.length; i++) 8780 if (!gfc_check_character_range (result->value.character.string[i], 8781 kind)) 8782 { 8783 gfc_error ("Character %qs in string at %L cannot be converted " 8784 "into character kind %d", 8785 gfc_print_wide_char (result->value.character.string[i]), 8786 &e->where, kind); 8787 gfc_free_expr (result); 8788 return &gfc_bad_expr; 8789 } 8790 8791 return result; 8792 } 8793 else if (e->expr_type == EXPR_ARRAY) 8794 { 8795 /* For an array constructor, we convert each constructor element. */ 8796 gfc_constructor *c; 8797 8798 result = gfc_get_array_expr (type, kind, &e->where); 8799 result->shape = gfc_copy_shape (e->shape, e->rank); 8800 result->rank = e->rank; 8801 result->ts.u.cl = e->ts.u.cl; 8802 8803 for (c = gfc_constructor_first (e->value.constructor); 8804 c; c = gfc_constructor_next (c)) 8805 { 8806 gfc_expr *tmp = gfc_convert_char_constant (c->expr, type, kind); 8807 if (tmp == &gfc_bad_expr) 8808 { 8809 gfc_free_expr (result); 8810 return &gfc_bad_expr; 8811 } 8812 8813 if (tmp == NULL) 8814 { 8815 gfc_free_expr (result); 8816 return NULL; 8817 } 8818 8819 gfc_constructor_append_expr (&result->value.constructor, 8820 tmp, &c->where); 8821 } 8822 8823 return result; 8824 } 8825 else 8826 return NULL; 8827} 8828 8829 8830gfc_expr * 8831gfc_simplify_compiler_options (void) 8832{ 8833 char *str; 8834 gfc_expr *result; 8835 8836 str = gfc_get_option_string (); 8837 result = gfc_get_character_expr (gfc_default_character_kind, 8838 &gfc_current_locus, str, strlen (str)); 8839 free (str); 8840 return result; 8841} 8842 8843 8844gfc_expr * 8845gfc_simplify_compiler_version (void) 8846{ 8847 char *buffer; 8848 size_t len; 8849 8850 len = strlen ("GCC version ") + strlen (version_string); 8851 buffer = XALLOCAVEC (char, len + 1); 8852 snprintf (buffer, len + 1, "GCC version %s", version_string); 8853 return gfc_get_character_expr (gfc_default_character_kind, 8854 &gfc_current_locus, buffer, len); 8855} 8856 8857/* Simplification routines for intrinsics of IEEE modules. */ 8858 8859gfc_expr * 8860simplify_ieee_selected_real_kind (gfc_expr *expr) 8861{ 8862 gfc_actual_arglist *arg; 8863 gfc_expr *p = NULL, *q = NULL, *rdx = NULL; 8864 8865 arg = expr->value.function.actual; 8866 p = arg->expr; 8867 if (arg->next) 8868 { 8869 q = arg->next->expr; 8870 if (arg->next->next) 8871 rdx = arg->next->next->expr; 8872 } 8873 8874 /* Currently, if IEEE is supported and this module is built, it means 8875 all our floating-point types conform to IEEE. Hence, we simply handle 8876 IEEE_SELECTED_REAL_KIND like SELECTED_REAL_KIND. */ 8877 return gfc_simplify_selected_real_kind (p, q, rdx); 8878} 8879 8880gfc_expr * 8881simplify_ieee_support (gfc_expr *expr) 8882{ 8883 /* We consider that if the IEEE modules are loaded, we have full support 8884 for flags, halting and rounding, which are the three functions 8885 (IEEE_SUPPORT_{FLAG,HALTING,ROUNDING}) allowed in constant 8886 expressions. One day, we will need libgfortran to detect support and 8887 communicate it back to us, allowing for partial support. */ 8888 8889 return gfc_get_logical_expr (gfc_default_logical_kind, &expr->where, 8890 true); 8891} 8892 8893bool 8894matches_ieee_function_name (gfc_symbol *sym, const char *name) 8895{ 8896 int n = strlen(name); 8897 8898 if (!strncmp(sym->name, name, n)) 8899 return true; 8900 8901 /* If a generic was used and renamed, we need more work to find out. 8902 Compare the specific name. */ 8903 if (sym->generic && !strncmp(sym->generic->sym->name, name, n)) 8904 return true; 8905 8906 return false; 8907} 8908 8909gfc_expr * 8910gfc_simplify_ieee_functions (gfc_expr *expr) 8911{ 8912 gfc_symbol* sym = expr->symtree->n.sym; 8913 8914 if (matches_ieee_function_name(sym, "ieee_selected_real_kind")) 8915 return simplify_ieee_selected_real_kind (expr); 8916 else if (matches_ieee_function_name(sym, "ieee_support_flag") 8917 || matches_ieee_function_name(sym, "ieee_support_halting") 8918 || matches_ieee_function_name(sym, "ieee_support_rounding")) 8919 return simplify_ieee_support (expr); 8920 else 8921 return NULL; 8922} 8923