* fi.po: Update.
[official-gcc.git] / gcc / fortran / simplify.c
bloba5a50de5cabca9ba2d3b53c7a63f045e589ae791
1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000-2017 Free Software Foundation, Inc.
3 Contributed by Andy Vaught & Katherine Holcomb
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
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 "target-memory.h"
29 #include "constructor.h"
30 #include "version.h" /* For version_string. */
33 gfc_expr gfc_bad_expr;
35 static gfc_expr *simplify_size (gfc_expr *, gfc_expr *, int);
38 /* Note that 'simplification' is not just transforming expressions.
39 For functions that are not simplified at compile time, range
40 checking is done if possible.
42 The return convention is that each simplification function returns:
44 A new expression node corresponding to the simplified arguments.
45 The original arguments are destroyed by the caller, and must not
46 be a part of the new expression.
48 NULL pointer indicating that no simplification was possible and
49 the original expression should remain intact.
51 An expression pointer to gfc_bad_expr (a static placeholder)
52 indicating that some error has prevented simplification. The
53 error is generated within the function and should be propagated
54 upwards
56 By the time a simplification function gets control, it has been
57 decided that the function call is really supposed to be the
58 intrinsic. No type checking is strictly necessary, since only
59 valid types will be passed on. On the other hand, a simplification
60 subroutine may have to look at the type of an argument as part of
61 its processing.
63 Array arguments are only passed to these subroutines that implement
64 the simplification of transformational intrinsics.
66 The functions in this file don't have much comment with them, but
67 everything is reasonably straight-forward. The Standard, chapter 13
68 is the best comment you'll find for this file anyway. */
70 /* Range checks an expression node. If all goes well, returns the
71 node, otherwise returns &gfc_bad_expr and frees the node. */
73 static gfc_expr *
74 range_check (gfc_expr *result, const char *name)
76 if (result == NULL)
77 return &gfc_bad_expr;
79 if (result->expr_type != EXPR_CONSTANT)
80 return result;
82 switch (gfc_range_check (result))
84 case ARITH_OK:
85 return result;
87 case ARITH_OVERFLOW:
88 gfc_error ("Result of %s overflows its kind at %L", name,
89 &result->where);
90 break;
92 case ARITH_UNDERFLOW:
93 gfc_error ("Result of %s underflows its kind at %L", name,
94 &result->where);
95 break;
97 case ARITH_NAN:
98 gfc_error ("Result of %s is NaN at %L", name, &result->where);
99 break;
101 default:
102 gfc_error ("Result of %s gives range error for its kind at %L", name,
103 &result->where);
104 break;
107 gfc_free_expr (result);
108 return &gfc_bad_expr;
112 /* A helper function that gets an optional and possibly missing
113 kind parameter. Returns the kind, -1 if something went wrong. */
115 static int
116 get_kind (bt type, gfc_expr *k, const char *name, int default_kind)
118 int kind;
120 if (k == NULL)
121 return default_kind;
123 if (k->expr_type != EXPR_CONSTANT)
125 gfc_error ("KIND parameter of %s at %L must be an initialization "
126 "expression", name, &k->where);
127 return -1;
130 if (gfc_extract_int (k, &kind) != NULL
131 || gfc_validate_kind (type, kind, true) < 0)
133 gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where);
134 return -1;
137 return kind;
141 /* Converts an mpz_t signed variable into an unsigned one, assuming
142 two's complement representations and a binary width of bitsize.
143 The conversion is a no-op unless x is negative; otherwise, it can
144 be accomplished by masking out the high bits. */
146 static void
147 convert_mpz_to_unsigned (mpz_t x, int bitsize)
149 mpz_t mask;
151 if (mpz_sgn (x) < 0)
153 /* Confirm that no bits above the signed range are unset if we
154 are doing range checking. */
155 if (flag_range_check != 0)
156 gcc_assert (mpz_scan0 (x, bitsize-1) == ULONG_MAX);
158 mpz_init_set_ui (mask, 1);
159 mpz_mul_2exp (mask, mask, bitsize);
160 mpz_sub_ui (mask, mask, 1);
162 mpz_and (x, x, mask);
164 mpz_clear (mask);
166 else
168 /* Confirm that no bits above the signed range are set. */
169 gcc_assert (mpz_scan1 (x, bitsize-1) == ULONG_MAX);
174 /* Converts an mpz_t unsigned variable into a signed one, assuming
175 two's complement representations and a binary width of bitsize.
176 If the bitsize-1 bit is set, this is taken as a sign bit and
177 the number is converted to the corresponding negative number. */
179 void
180 gfc_convert_mpz_to_signed (mpz_t x, int bitsize)
182 mpz_t mask;
184 /* Confirm that no bits above the unsigned range are set if we are
185 doing range checking. */
186 if (flag_range_check != 0)
187 gcc_assert (mpz_scan1 (x, bitsize) == ULONG_MAX);
189 if (mpz_tstbit (x, bitsize - 1) == 1)
191 mpz_init_set_ui (mask, 1);
192 mpz_mul_2exp (mask, mask, bitsize);
193 mpz_sub_ui (mask, mask, 1);
195 /* We negate the number by hand, zeroing the high bits, that is
196 make it the corresponding positive number, and then have it
197 negated by GMP, giving the correct representation of the
198 negative number. */
199 mpz_com (x, x);
200 mpz_add_ui (x, x, 1);
201 mpz_and (x, x, mask);
203 mpz_neg (x, x);
205 mpz_clear (mask);
210 /* In-place convert BOZ to REAL of the specified kind. */
212 static gfc_expr *
213 convert_boz (gfc_expr *x, int kind)
215 if (x && x->ts.type == BT_INTEGER && x->is_boz)
217 gfc_typespec ts;
218 gfc_clear_ts (&ts);
219 ts.type = BT_REAL;
220 ts.kind = kind;
222 if (!gfc_convert_boz (x, &ts))
223 return &gfc_bad_expr;
226 return x;
230 /* Test that the expression is an constant array. */
232 static bool
233 is_constant_array_expr (gfc_expr *e)
235 gfc_constructor *c;
237 if (e == NULL)
238 return true;
240 if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e))
241 return false;
243 for (c = gfc_constructor_first (e->value.constructor);
244 c; c = gfc_constructor_next (c))
245 if (c->expr->expr_type != EXPR_CONSTANT
246 && c->expr->expr_type != EXPR_STRUCTURE)
247 return false;
249 return true;
253 /* Initialize a transformational result expression with a given value. */
255 static void
256 init_result_expr (gfc_expr *e, int init, gfc_expr *array)
258 if (e && e->expr_type == EXPR_ARRAY)
260 gfc_constructor *ctor = gfc_constructor_first (e->value.constructor);
261 while (ctor)
263 init_result_expr (ctor->expr, init, array);
264 ctor = gfc_constructor_next (ctor);
267 else if (e && e->expr_type == EXPR_CONSTANT)
269 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
270 int length;
271 gfc_char_t *string;
273 switch (e->ts.type)
275 case BT_LOGICAL:
276 e->value.logical = (init ? 1 : 0);
277 break;
279 case BT_INTEGER:
280 if (init == INT_MIN)
281 mpz_set (e->value.integer, gfc_integer_kinds[i].min_int);
282 else if (init == INT_MAX)
283 mpz_set (e->value.integer, gfc_integer_kinds[i].huge);
284 else
285 mpz_set_si (e->value.integer, init);
286 break;
288 case BT_REAL:
289 if (init == INT_MIN)
291 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
292 mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE);
294 else if (init == INT_MAX)
295 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
296 else
297 mpfr_set_si (e->value.real, init, GFC_RND_MODE);
298 break;
300 case BT_COMPLEX:
301 mpc_set_si (e->value.complex, init, GFC_MPC_RND_MODE);
302 break;
304 case BT_CHARACTER:
305 if (init == INT_MIN)
307 gfc_expr *len = gfc_simplify_len (array, NULL);
308 gfc_extract_int (len, &length);
309 string = gfc_get_wide_string (length + 1);
310 gfc_wide_memset (string, 0, length);
312 else if (init == INT_MAX)
314 gfc_expr *len = gfc_simplify_len (array, NULL);
315 gfc_extract_int (len, &length);
316 string = gfc_get_wide_string (length + 1);
317 gfc_wide_memset (string, 255, length);
319 else
321 length = 0;
322 string = gfc_get_wide_string (1);
325 string[length] = '\0';
326 e->value.character.length = length;
327 e->value.character.string = string;
328 break;
330 default:
331 gcc_unreachable();
334 else
335 gcc_unreachable();
339 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul;
340 if conj_a is true, the matrix_a is complex conjugated. */
342 static gfc_expr *
343 compute_dot_product (gfc_expr *matrix_a, int stride_a, int offset_a,
344 gfc_expr *matrix_b, int stride_b, int offset_b,
345 bool conj_a)
347 gfc_expr *result, *a, *b, *c;
349 result = gfc_get_constant_expr (matrix_a->ts.type, matrix_a->ts.kind,
350 &matrix_a->where);
351 init_result_expr (result, 0, NULL);
353 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
354 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
355 while (a && b)
357 /* Copying of expressions is required as operands are free'd
358 by the gfc_arith routines. */
359 switch (result->ts.type)
361 case BT_LOGICAL:
362 result = gfc_or (result,
363 gfc_and (gfc_copy_expr (a),
364 gfc_copy_expr (b)));
365 break;
367 case BT_INTEGER:
368 case BT_REAL:
369 case BT_COMPLEX:
370 if (conj_a && a->ts.type == BT_COMPLEX)
371 c = gfc_simplify_conjg (a);
372 else
373 c = gfc_copy_expr (a);
374 result = gfc_add (result, gfc_multiply (c, gfc_copy_expr (b)));
375 break;
377 default:
378 gcc_unreachable();
381 offset_a += stride_a;
382 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
384 offset_b += stride_b;
385 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
388 return result;
392 /* Build a result expression for transformational intrinsics,
393 depending on DIM. */
395 static gfc_expr *
396 transformational_result (gfc_expr *array, gfc_expr *dim, bt type,
397 int kind, locus* where)
399 gfc_expr *result;
400 int i, nelem;
402 if (!dim || array->rank == 1)
403 return gfc_get_constant_expr (type, kind, where);
405 result = gfc_get_array_expr (type, kind, where);
406 result->shape = gfc_copy_shape_excluding (array->shape, array->rank, dim);
407 result->rank = array->rank - 1;
409 /* gfc_array_size() would count the number of elements in the constructor,
410 we have not built those yet. */
411 nelem = 1;
412 for (i = 0; i < result->rank; ++i)
413 nelem *= mpz_get_ui (result->shape[i]);
415 for (i = 0; i < nelem; ++i)
417 gfc_constructor_append_expr (&result->value.constructor,
418 gfc_get_constant_expr (type, kind, where),
419 NULL);
422 return result;
426 typedef gfc_expr* (*transformational_op)(gfc_expr*, gfc_expr*);
428 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
429 of COUNT intrinsic is .TRUE..
431 Interface and implementation mimics arith functions as
432 gfc_add, gfc_multiply, etc. */
434 static gfc_expr* gfc_count (gfc_expr *op1, gfc_expr *op2)
436 gfc_expr *result;
438 gcc_assert (op1->ts.type == BT_INTEGER);
439 gcc_assert (op2->ts.type == BT_LOGICAL);
440 gcc_assert (op2->value.logical);
442 result = gfc_copy_expr (op1);
443 mpz_add_ui (result->value.integer, result->value.integer, 1);
445 gfc_free_expr (op1);
446 gfc_free_expr (op2);
447 return result;
451 /* Transforms an ARRAY with operation OP, according to MASK, to a
452 scalar RESULT. E.g. called if
454 REAL, PARAMETER :: array(n, m) = ...
455 REAL, PARAMETER :: s = SUM(array)
457 where OP == gfc_add(). */
459 static gfc_expr *
460 simplify_transformation_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *mask,
461 transformational_op op)
463 gfc_expr *a, *m;
464 gfc_constructor *array_ctor, *mask_ctor;
466 /* Shortcut for constant .FALSE. MASK. */
467 if (mask
468 && mask->expr_type == EXPR_CONSTANT
469 && !mask->value.logical)
470 return result;
472 array_ctor = gfc_constructor_first (array->value.constructor);
473 mask_ctor = NULL;
474 if (mask && mask->expr_type == EXPR_ARRAY)
475 mask_ctor = gfc_constructor_first (mask->value.constructor);
477 while (array_ctor)
479 a = array_ctor->expr;
480 array_ctor = gfc_constructor_next (array_ctor);
482 /* A constant MASK equals .TRUE. here and can be ignored. */
483 if (mask_ctor)
485 m = mask_ctor->expr;
486 mask_ctor = gfc_constructor_next (mask_ctor);
487 if (!m->value.logical)
488 continue;
491 result = op (result, gfc_copy_expr (a));
492 if (!result)
493 return result;
496 return result;
499 /* Transforms an ARRAY with operation OP, according to MASK, to an
500 array RESULT. E.g. called if
502 REAL, PARAMETER :: array(n, m) = ...
503 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
505 where OP == gfc_multiply().
506 The result might be post processed using post_op. */
508 static gfc_expr *
509 simplify_transformation_to_array (gfc_expr *result, gfc_expr *array, gfc_expr *dim,
510 gfc_expr *mask, transformational_op op,
511 transformational_op post_op)
513 mpz_t size;
514 int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride;
515 gfc_expr **arrayvec, **resultvec, **base, **src, **dest;
516 gfc_constructor *array_ctor, *mask_ctor, *result_ctor;
518 int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
519 sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS],
520 tmpstride[GFC_MAX_DIMENSIONS];
522 /* Shortcut for constant .FALSE. MASK. */
523 if (mask
524 && mask->expr_type == EXPR_CONSTANT
525 && !mask->value.logical)
526 return result;
528 /* Build an indexed table for array element expressions to minimize
529 linked-list traversal. Masked elements are set to NULL. */
530 gfc_array_size (array, &size);
531 arraysize = mpz_get_ui (size);
532 mpz_clear (size);
534 arrayvec = XCNEWVEC (gfc_expr*, arraysize);
536 array_ctor = gfc_constructor_first (array->value.constructor);
537 mask_ctor = NULL;
538 if (mask && mask->expr_type == EXPR_ARRAY)
539 mask_ctor = gfc_constructor_first (mask->value.constructor);
541 for (i = 0; i < arraysize; ++i)
543 arrayvec[i] = array_ctor->expr;
544 array_ctor = gfc_constructor_next (array_ctor);
546 if (mask_ctor)
548 if (!mask_ctor->expr->value.logical)
549 arrayvec[i] = NULL;
551 mask_ctor = gfc_constructor_next (mask_ctor);
555 /* Same for the result expression. */
556 gfc_array_size (result, &size);
557 resultsize = mpz_get_ui (size);
558 mpz_clear (size);
560 resultvec = XCNEWVEC (gfc_expr*, resultsize);
561 result_ctor = gfc_constructor_first (result->value.constructor);
562 for (i = 0; i < resultsize; ++i)
564 resultvec[i] = result_ctor->expr;
565 result_ctor = gfc_constructor_next (result_ctor);
568 gfc_extract_int (dim, &dim_index);
569 dim_index -= 1; /* zero-base index */
570 dim_extent = 0;
571 dim_stride = 0;
573 for (i = 0, n = 0; i < array->rank; ++i)
575 count[i] = 0;
576 tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]);
577 if (i == dim_index)
579 dim_extent = mpz_get_si (array->shape[i]);
580 dim_stride = tmpstride[i];
581 continue;
584 extent[n] = mpz_get_si (array->shape[i]);
585 sstride[n] = tmpstride[i];
586 dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1];
587 n += 1;
590 done = false;
591 base = arrayvec;
592 dest = resultvec;
593 while (!done)
595 for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n)
596 if (*src)
597 *dest = op (*dest, gfc_copy_expr (*src));
599 count[0]++;
600 base += sstride[0];
601 dest += dstride[0];
603 n = 0;
604 while (!done && count[n] == extent[n])
606 count[n] = 0;
607 base -= sstride[n] * extent[n];
608 dest -= dstride[n] * extent[n];
610 n++;
611 if (n < result->rank)
613 count [n]++;
614 base += sstride[n];
615 dest += dstride[n];
617 else
618 done = true;
622 /* Place updated expression in result constructor. */
623 result_ctor = gfc_constructor_first (result->value.constructor);
624 for (i = 0; i < resultsize; ++i)
626 if (post_op)
627 result_ctor->expr = post_op (result_ctor->expr, resultvec[i]);
628 else
629 result_ctor->expr = resultvec[i];
630 result_ctor = gfc_constructor_next (result_ctor);
633 free (arrayvec);
634 free (resultvec);
635 return result;
639 static gfc_expr *
640 simplify_transformation (gfc_expr *array, gfc_expr *dim, gfc_expr *mask,
641 int init_val, transformational_op op)
643 gfc_expr *result;
645 if (!is_constant_array_expr (array)
646 || !gfc_is_constant_expr (dim))
647 return NULL;
649 if (mask
650 && !is_constant_array_expr (mask)
651 && mask->expr_type != EXPR_CONSTANT)
652 return NULL;
654 result = transformational_result (array, dim, array->ts.type,
655 array->ts.kind, &array->where);
656 init_result_expr (result, init_val, NULL);
658 return !dim || array->rank == 1 ?
659 simplify_transformation_to_scalar (result, array, mask, op) :
660 simplify_transformation_to_array (result, array, dim, mask, op, NULL);
664 /********************** Simplification functions *****************************/
666 gfc_expr *
667 gfc_simplify_abs (gfc_expr *e)
669 gfc_expr *result;
671 if (e->expr_type != EXPR_CONSTANT)
672 return NULL;
674 switch (e->ts.type)
676 case BT_INTEGER:
677 result = gfc_get_constant_expr (BT_INTEGER, e->ts.kind, &e->where);
678 mpz_abs (result->value.integer, e->value.integer);
679 return range_check (result, "IABS");
681 case BT_REAL:
682 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
683 mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
684 return range_check (result, "ABS");
686 case BT_COMPLEX:
687 gfc_set_model_kind (e->ts.kind);
688 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
689 mpc_abs (result->value.real, e->value.complex, GFC_RND_MODE);
690 return range_check (result, "CABS");
692 default:
693 gfc_internal_error ("gfc_simplify_abs(): Bad type");
698 static gfc_expr *
699 simplify_achar_char (gfc_expr *e, gfc_expr *k, const char *name, bool ascii)
701 gfc_expr *result;
702 int kind;
703 bool too_large = false;
705 if (e->expr_type != EXPR_CONSTANT)
706 return NULL;
708 kind = get_kind (BT_CHARACTER, k, name, gfc_default_character_kind);
709 if (kind == -1)
710 return &gfc_bad_expr;
712 if (mpz_cmp_si (e->value.integer, 0) < 0)
714 gfc_error ("Argument of %s function at %L is negative", name,
715 &e->where);
716 return &gfc_bad_expr;
719 if (ascii && warn_surprising && mpz_cmp_si (e->value.integer, 127) > 0)
720 gfc_warning (OPT_Wsurprising,
721 "Argument of %s function at %L outside of range [0,127]",
722 name, &e->where);
724 if (kind == 1 && mpz_cmp_si (e->value.integer, 255) > 0)
725 too_large = true;
726 else if (kind == 4)
728 mpz_t t;
729 mpz_init_set_ui (t, 2);
730 mpz_pow_ui (t, t, 32);
731 mpz_sub_ui (t, t, 1);
732 if (mpz_cmp (e->value.integer, t) > 0)
733 too_large = true;
734 mpz_clear (t);
737 if (too_large)
739 gfc_error ("Argument of %s function at %L is too large for the "
740 "collating sequence of kind %d", name, &e->where, kind);
741 return &gfc_bad_expr;
744 result = gfc_get_character_expr (kind, &e->where, NULL, 1);
745 result->value.character.string[0] = mpz_get_ui (e->value.integer);
747 return result;
752 /* We use the processor's collating sequence, because all
753 systems that gfortran currently works on are ASCII. */
755 gfc_expr *
756 gfc_simplify_achar (gfc_expr *e, gfc_expr *k)
758 return simplify_achar_char (e, k, "ACHAR", true);
762 gfc_expr *
763 gfc_simplify_acos (gfc_expr *x)
765 gfc_expr *result;
767 if (x->expr_type != EXPR_CONSTANT)
768 return NULL;
770 switch (x->ts.type)
772 case BT_REAL:
773 if (mpfr_cmp_si (x->value.real, 1) > 0
774 || mpfr_cmp_si (x->value.real, -1) < 0)
776 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
777 &x->where);
778 return &gfc_bad_expr;
780 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
781 mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
782 break;
784 case BT_COMPLEX:
785 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
786 mpc_acos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
787 break;
789 default:
790 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
793 return range_check (result, "ACOS");
796 gfc_expr *
797 gfc_simplify_acosh (gfc_expr *x)
799 gfc_expr *result;
801 if (x->expr_type != EXPR_CONSTANT)
802 return NULL;
804 switch (x->ts.type)
806 case BT_REAL:
807 if (mpfr_cmp_si (x->value.real, 1) < 0)
809 gfc_error ("Argument of ACOSH at %L must not be less than 1",
810 &x->where);
811 return &gfc_bad_expr;
814 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
815 mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
816 break;
818 case BT_COMPLEX:
819 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
820 mpc_acosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
821 break;
823 default:
824 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
827 return range_check (result, "ACOSH");
830 gfc_expr *
831 gfc_simplify_adjustl (gfc_expr *e)
833 gfc_expr *result;
834 int count, i, len;
835 gfc_char_t ch;
837 if (e->expr_type != EXPR_CONSTANT)
838 return NULL;
840 len = e->value.character.length;
842 for (count = 0, i = 0; i < len; ++i)
844 ch = e->value.character.string[i];
845 if (ch != ' ')
846 break;
847 ++count;
850 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
851 for (i = 0; i < len - count; ++i)
852 result->value.character.string[i] = e->value.character.string[count + i];
854 return result;
858 gfc_expr *
859 gfc_simplify_adjustr (gfc_expr *e)
861 gfc_expr *result;
862 int count, i, len;
863 gfc_char_t ch;
865 if (e->expr_type != EXPR_CONSTANT)
866 return NULL;
868 len = e->value.character.length;
870 for (count = 0, i = len - 1; i >= 0; --i)
872 ch = e->value.character.string[i];
873 if (ch != ' ')
874 break;
875 ++count;
878 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
879 for (i = 0; i < count; ++i)
880 result->value.character.string[i] = ' ';
882 for (i = count; i < len; ++i)
883 result->value.character.string[i] = e->value.character.string[i - count];
885 return result;
889 gfc_expr *
890 gfc_simplify_aimag (gfc_expr *e)
892 gfc_expr *result;
894 if (e->expr_type != EXPR_CONSTANT)
895 return NULL;
897 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
898 mpfr_set (result->value.real, mpc_imagref (e->value.complex), GFC_RND_MODE);
900 return range_check (result, "AIMAG");
904 gfc_expr *
905 gfc_simplify_aint (gfc_expr *e, gfc_expr *k)
907 gfc_expr *rtrunc, *result;
908 int kind;
910 kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
911 if (kind == -1)
912 return &gfc_bad_expr;
914 if (e->expr_type != EXPR_CONSTANT)
915 return NULL;
917 rtrunc = gfc_copy_expr (e);
918 mpfr_trunc (rtrunc->value.real, e->value.real);
920 result = gfc_real2real (rtrunc, kind);
922 gfc_free_expr (rtrunc);
924 return range_check (result, "AINT");
928 gfc_expr *
929 gfc_simplify_all (gfc_expr *mask, gfc_expr *dim)
931 return simplify_transformation (mask, dim, NULL, true, gfc_and);
935 gfc_expr *
936 gfc_simplify_dint (gfc_expr *e)
938 gfc_expr *rtrunc, *result;
940 if (e->expr_type != EXPR_CONSTANT)
941 return NULL;
943 rtrunc = gfc_copy_expr (e);
944 mpfr_trunc (rtrunc->value.real, e->value.real);
946 result = gfc_real2real (rtrunc, gfc_default_double_kind);
948 gfc_free_expr (rtrunc);
950 return range_check (result, "DINT");
954 gfc_expr *
955 gfc_simplify_dreal (gfc_expr *e)
957 gfc_expr *result = NULL;
959 if (e->expr_type != EXPR_CONSTANT)
960 return NULL;
962 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
963 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
965 return range_check (result, "DREAL");
969 gfc_expr *
970 gfc_simplify_anint (gfc_expr *e, gfc_expr *k)
972 gfc_expr *result;
973 int kind;
975 kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
976 if (kind == -1)
977 return &gfc_bad_expr;
979 if (e->expr_type != EXPR_CONSTANT)
980 return NULL;
982 result = gfc_get_constant_expr (e->ts.type, kind, &e->where);
983 mpfr_round (result->value.real, e->value.real);
985 return range_check (result, "ANINT");
989 gfc_expr *
990 gfc_simplify_and (gfc_expr *x, gfc_expr *y)
992 gfc_expr *result;
993 int kind;
995 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
996 return NULL;
998 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
1000 switch (x->ts.type)
1002 case BT_INTEGER:
1003 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
1004 mpz_and (result->value.integer, x->value.integer, y->value.integer);
1005 return range_check (result, "AND");
1007 case BT_LOGICAL:
1008 return gfc_get_logical_expr (kind, &x->where,
1009 x->value.logical && y->value.logical);
1011 default:
1012 gcc_unreachable ();
1017 gfc_expr *
1018 gfc_simplify_any (gfc_expr *mask, gfc_expr *dim)
1020 return simplify_transformation (mask, dim, NULL, false, gfc_or);
1024 gfc_expr *
1025 gfc_simplify_dnint (gfc_expr *e)
1027 gfc_expr *result;
1029 if (e->expr_type != EXPR_CONSTANT)
1030 return NULL;
1032 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &e->where);
1033 mpfr_round (result->value.real, e->value.real);
1035 return range_check (result, "DNINT");
1039 gfc_expr *
1040 gfc_simplify_asin (gfc_expr *x)
1042 gfc_expr *result;
1044 if (x->expr_type != EXPR_CONSTANT)
1045 return NULL;
1047 switch (x->ts.type)
1049 case BT_REAL:
1050 if (mpfr_cmp_si (x->value.real, 1) > 0
1051 || mpfr_cmp_si (x->value.real, -1) < 0)
1053 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1054 &x->where);
1055 return &gfc_bad_expr;
1057 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1058 mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE);
1059 break;
1061 case BT_COMPLEX:
1062 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1063 mpc_asin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1064 break;
1066 default:
1067 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1070 return range_check (result, "ASIN");
1074 gfc_expr *
1075 gfc_simplify_asinh (gfc_expr *x)
1077 gfc_expr *result;
1079 if (x->expr_type != EXPR_CONSTANT)
1080 return NULL;
1082 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1084 switch (x->ts.type)
1086 case BT_REAL:
1087 mpfr_asinh (result->value.real, x->value.real, GFC_RND_MODE);
1088 break;
1090 case BT_COMPLEX:
1091 mpc_asinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1092 break;
1094 default:
1095 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1098 return range_check (result, "ASINH");
1102 gfc_expr *
1103 gfc_simplify_atan (gfc_expr *x)
1105 gfc_expr *result;
1107 if (x->expr_type != EXPR_CONSTANT)
1108 return NULL;
1110 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1112 switch (x->ts.type)
1114 case BT_REAL:
1115 mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE);
1116 break;
1118 case BT_COMPLEX:
1119 mpc_atan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1120 break;
1122 default:
1123 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1126 return range_check (result, "ATAN");
1130 gfc_expr *
1131 gfc_simplify_atanh (gfc_expr *x)
1133 gfc_expr *result;
1135 if (x->expr_type != EXPR_CONSTANT)
1136 return NULL;
1138 switch (x->ts.type)
1140 case BT_REAL:
1141 if (mpfr_cmp_si (x->value.real, 1) >= 0
1142 || mpfr_cmp_si (x->value.real, -1) <= 0)
1144 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1145 "to 1", &x->where);
1146 return &gfc_bad_expr;
1148 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1149 mpfr_atanh (result->value.real, x->value.real, GFC_RND_MODE);
1150 break;
1152 case BT_COMPLEX:
1153 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1154 mpc_atanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1155 break;
1157 default:
1158 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1161 return range_check (result, "ATANH");
1165 gfc_expr *
1166 gfc_simplify_atan2 (gfc_expr *y, gfc_expr *x)
1168 gfc_expr *result;
1170 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1171 return NULL;
1173 if (mpfr_zero_p (y->value.real) && mpfr_zero_p (x->value.real))
1175 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1176 "second argument must not be zero", &x->where);
1177 return &gfc_bad_expr;
1180 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1181 mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE);
1183 return range_check (result, "ATAN2");
1187 gfc_expr *
1188 gfc_simplify_bessel_j0 (gfc_expr *x)
1190 gfc_expr *result;
1192 if (x->expr_type != EXPR_CONSTANT)
1193 return NULL;
1195 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1196 mpfr_j0 (result->value.real, x->value.real, GFC_RND_MODE);
1198 return range_check (result, "BESSEL_J0");
1202 gfc_expr *
1203 gfc_simplify_bessel_j1 (gfc_expr *x)
1205 gfc_expr *result;
1207 if (x->expr_type != EXPR_CONSTANT)
1208 return NULL;
1210 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1211 mpfr_j1 (result->value.real, x->value.real, GFC_RND_MODE);
1213 return range_check (result, "BESSEL_J1");
1217 gfc_expr *
1218 gfc_simplify_bessel_jn (gfc_expr *order, gfc_expr *x)
1220 gfc_expr *result;
1221 long n;
1223 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1224 return NULL;
1226 n = mpz_get_si (order->value.integer);
1227 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1228 mpfr_jn (result->value.real, n, x->value.real, GFC_RND_MODE);
1230 return range_check (result, "BESSEL_JN");
1234 /* Simplify transformational form of JN and YN. */
1236 static gfc_expr *
1237 gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x,
1238 bool jn)
1240 gfc_expr *result;
1241 gfc_expr *e;
1242 long n1, n2;
1243 int i;
1244 mpfr_t x2rev, last1, last2;
1246 if (x->expr_type != EXPR_CONSTANT || order1->expr_type != EXPR_CONSTANT
1247 || order2->expr_type != EXPR_CONSTANT)
1248 return NULL;
1250 n1 = mpz_get_si (order1->value.integer);
1251 n2 = mpz_get_si (order2->value.integer);
1252 result = gfc_get_array_expr (x->ts.type, x->ts.kind, &x->where);
1253 result->rank = 1;
1254 result->shape = gfc_get_shape (1);
1255 mpz_init_set_ui (result->shape[0], MAX (n2-n1+1, 0));
1257 if (n2 < n1)
1258 return result;
1260 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1261 YN(N, 0.0) = -Inf. */
1263 if (mpfr_cmp_ui (x->value.real, 0.0) == 0)
1265 if (!jn && flag_range_check)
1267 gfc_error ("Result of BESSEL_YN is -INF at %L", &result->where);
1268 gfc_free_expr (result);
1269 return &gfc_bad_expr;
1272 if (jn && n1 == 0)
1274 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1275 mpfr_set_ui (e->value.real, 1, GFC_RND_MODE);
1276 gfc_constructor_append_expr (&result->value.constructor, e,
1277 &x->where);
1278 n1++;
1281 for (i = n1; i <= n2; i++)
1283 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1284 if (jn)
1285 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
1286 else
1287 mpfr_set_inf (e->value.real, -1);
1288 gfc_constructor_append_expr (&result->value.constructor, e,
1289 &x->where);
1292 return result;
1295 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1296 are stable for downward recursion and Neumann functions are stable
1297 for upward recursion. It is
1298 x2rev = 2.0/x,
1299 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1300 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1301 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1303 gfc_set_model_kind (x->ts.kind);
1305 /* Get first recursion anchor. */
1307 mpfr_init (last1);
1308 if (jn)
1309 mpfr_jn (last1, n2, x->value.real, GFC_RND_MODE);
1310 else
1311 mpfr_yn (last1, n1, x->value.real, GFC_RND_MODE);
1313 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1314 mpfr_set (e->value.real, last1, GFC_RND_MODE);
1315 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1317 mpfr_clear (last1);
1318 gfc_free_expr (e);
1319 gfc_free_expr (result);
1320 return &gfc_bad_expr;
1322 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1324 if (n1 == n2)
1326 mpfr_clear (last1);
1327 return result;
1330 /* Get second recursion anchor. */
1332 mpfr_init (last2);
1333 if (jn)
1334 mpfr_jn (last2, n2-1, x->value.real, GFC_RND_MODE);
1335 else
1336 mpfr_yn (last2, n1+1, x->value.real, GFC_RND_MODE);
1338 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1339 mpfr_set (e->value.real, last2, GFC_RND_MODE);
1340 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1342 mpfr_clear (last1);
1343 mpfr_clear (last2);
1344 gfc_free_expr (e);
1345 gfc_free_expr (result);
1346 return &gfc_bad_expr;
1348 if (jn)
1349 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where, -2);
1350 else
1351 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1353 if (n1 + 1 == n2)
1355 mpfr_clear (last1);
1356 mpfr_clear (last2);
1357 return result;
1360 /* Start actual recursion. */
1362 mpfr_init (x2rev);
1363 mpfr_ui_div (x2rev, 2, x->value.real, GFC_RND_MODE);
1365 for (i = 2; i <= n2-n1; i++)
1367 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1369 /* Special case: For YN, if the previous N gave -INF, set
1370 also N+1 to -INF. */
1371 if (!jn && !flag_range_check && mpfr_inf_p (last2))
1373 mpfr_set_inf (e->value.real, -1);
1374 gfc_constructor_append_expr (&result->value.constructor, e,
1375 &x->where);
1376 continue;
1379 mpfr_mul_si (e->value.real, x2rev, jn ? (n2-i+1) : (n1+i-1),
1380 GFC_RND_MODE);
1381 mpfr_mul (e->value.real, e->value.real, last2, GFC_RND_MODE);
1382 mpfr_sub (e->value.real, e->value.real, last1, GFC_RND_MODE);
1384 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1386 /* Range_check frees "e" in that case. */
1387 e = NULL;
1388 goto error;
1391 if (jn)
1392 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where,
1393 -i-1);
1394 else
1395 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1397 mpfr_set (last1, last2, GFC_RND_MODE);
1398 mpfr_set (last2, e->value.real, GFC_RND_MODE);
1401 mpfr_clear (last1);
1402 mpfr_clear (last2);
1403 mpfr_clear (x2rev);
1404 return result;
1406 error:
1407 mpfr_clear (last1);
1408 mpfr_clear (last2);
1409 mpfr_clear (x2rev);
1410 gfc_free_expr (e);
1411 gfc_free_expr (result);
1412 return &gfc_bad_expr;
1416 gfc_expr *
1417 gfc_simplify_bessel_jn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1419 return gfc_simplify_bessel_n2 (order1, order2, x, true);
1423 gfc_expr *
1424 gfc_simplify_bessel_y0 (gfc_expr *x)
1426 gfc_expr *result;
1428 if (x->expr_type != EXPR_CONSTANT)
1429 return NULL;
1431 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1432 mpfr_y0 (result->value.real, x->value.real, GFC_RND_MODE);
1434 return range_check (result, "BESSEL_Y0");
1438 gfc_expr *
1439 gfc_simplify_bessel_y1 (gfc_expr *x)
1441 gfc_expr *result;
1443 if (x->expr_type != EXPR_CONSTANT)
1444 return NULL;
1446 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1447 mpfr_y1 (result->value.real, x->value.real, GFC_RND_MODE);
1449 return range_check (result, "BESSEL_Y1");
1453 gfc_expr *
1454 gfc_simplify_bessel_yn (gfc_expr *order, gfc_expr *x)
1456 gfc_expr *result;
1457 long n;
1459 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1460 return NULL;
1462 n = mpz_get_si (order->value.integer);
1463 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1464 mpfr_yn (result->value.real, n, x->value.real, GFC_RND_MODE);
1466 return range_check (result, "BESSEL_YN");
1470 gfc_expr *
1471 gfc_simplify_bessel_yn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1473 return gfc_simplify_bessel_n2 (order1, order2, x, false);
1477 gfc_expr *
1478 gfc_simplify_bit_size (gfc_expr *e)
1480 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1481 return gfc_get_int_expr (e->ts.kind, &e->where,
1482 gfc_integer_kinds[i].bit_size);
1486 gfc_expr *
1487 gfc_simplify_btest (gfc_expr *e, gfc_expr *bit)
1489 int b;
1491 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
1492 return NULL;
1494 if (gfc_extract_int (bit, &b) != NULL || b < 0)
1495 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where, false);
1497 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where,
1498 mpz_tstbit (e->value.integer, b));
1502 static int
1503 compare_bitwise (gfc_expr *i, gfc_expr *j)
1505 mpz_t x, y;
1506 int k, res;
1508 gcc_assert (i->ts.type == BT_INTEGER);
1509 gcc_assert (j->ts.type == BT_INTEGER);
1511 mpz_init_set (x, i->value.integer);
1512 k = gfc_validate_kind (i->ts.type, i->ts.kind, false);
1513 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
1515 mpz_init_set (y, j->value.integer);
1516 k = gfc_validate_kind (j->ts.type, j->ts.kind, false);
1517 convert_mpz_to_unsigned (y, gfc_integer_kinds[k].bit_size);
1519 res = mpz_cmp (x, y);
1520 mpz_clear (x);
1521 mpz_clear (y);
1522 return res;
1526 gfc_expr *
1527 gfc_simplify_bge (gfc_expr *i, gfc_expr *j)
1529 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1530 return NULL;
1532 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1533 compare_bitwise (i, j) >= 0);
1537 gfc_expr *
1538 gfc_simplify_bgt (gfc_expr *i, gfc_expr *j)
1540 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1541 return NULL;
1543 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1544 compare_bitwise (i, j) > 0);
1548 gfc_expr *
1549 gfc_simplify_ble (gfc_expr *i, gfc_expr *j)
1551 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1552 return NULL;
1554 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1555 compare_bitwise (i, j) <= 0);
1559 gfc_expr *
1560 gfc_simplify_blt (gfc_expr *i, gfc_expr *j)
1562 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1563 return NULL;
1565 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1566 compare_bitwise (i, j) < 0);
1570 gfc_expr *
1571 gfc_simplify_ceiling (gfc_expr *e, gfc_expr *k)
1573 gfc_expr *ceil, *result;
1574 int kind;
1576 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
1577 if (kind == -1)
1578 return &gfc_bad_expr;
1580 if (e->expr_type != EXPR_CONSTANT)
1581 return NULL;
1583 ceil = gfc_copy_expr (e);
1584 mpfr_ceil (ceil->value.real, e->value.real);
1586 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
1587 gfc_mpfr_to_mpz (result->value.integer, ceil->value.real, &e->where);
1589 gfc_free_expr (ceil);
1591 return range_check (result, "CEILING");
1595 gfc_expr *
1596 gfc_simplify_char (gfc_expr *e, gfc_expr *k)
1598 return simplify_achar_char (e, k, "CHAR", false);
1602 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1604 static gfc_expr *
1605 simplify_cmplx (const char *name, gfc_expr *x, gfc_expr *y, int kind)
1607 gfc_expr *result;
1609 if (convert_boz (x, kind) == &gfc_bad_expr)
1610 return &gfc_bad_expr;
1612 if (convert_boz (y, kind) == &gfc_bad_expr)
1613 return &gfc_bad_expr;
1615 if (x->expr_type != EXPR_CONSTANT
1616 || (y != NULL && y->expr_type != EXPR_CONSTANT))
1617 return NULL;
1619 result = gfc_get_constant_expr (BT_COMPLEX, kind, &x->where);
1621 switch (x->ts.type)
1623 case BT_INTEGER:
1624 mpc_set_z (result->value.complex, x->value.integer, GFC_MPC_RND_MODE);
1625 break;
1627 case BT_REAL:
1628 mpc_set_fr (result->value.complex, x->value.real, GFC_RND_MODE);
1629 break;
1631 case BT_COMPLEX:
1632 mpc_set (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1633 break;
1635 default:
1636 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1639 if (!y)
1640 return range_check (result, name);
1642 switch (y->ts.type)
1644 case BT_INTEGER:
1645 mpfr_set_z (mpc_imagref (result->value.complex),
1646 y->value.integer, GFC_RND_MODE);
1647 break;
1649 case BT_REAL:
1650 mpfr_set (mpc_imagref (result->value.complex),
1651 y->value.real, GFC_RND_MODE);
1652 break;
1654 default:
1655 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1658 return range_check (result, name);
1662 gfc_expr *
1663 gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k)
1665 int kind;
1667 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_complex_kind);
1668 if (kind == -1)
1669 return &gfc_bad_expr;
1671 return simplify_cmplx ("CMPLX", x, y, kind);
1675 gfc_expr *
1676 gfc_simplify_complex (gfc_expr *x, gfc_expr *y)
1678 int kind;
1680 if (x->ts.type == BT_INTEGER && y->ts.type == BT_INTEGER)
1681 kind = gfc_default_complex_kind;
1682 else if (x->ts.type == BT_REAL || y->ts.type == BT_INTEGER)
1683 kind = x->ts.kind;
1684 else if (x->ts.type == BT_INTEGER || y->ts.type == BT_REAL)
1685 kind = y->ts.kind;
1686 else if (x->ts.type == BT_REAL && y->ts.type == BT_REAL)
1687 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
1688 else
1689 gcc_unreachable ();
1691 return simplify_cmplx ("COMPLEX", x, y, kind);
1695 gfc_expr *
1696 gfc_simplify_conjg (gfc_expr *e)
1698 gfc_expr *result;
1700 if (e->expr_type != EXPR_CONSTANT)
1701 return NULL;
1703 result = gfc_copy_expr (e);
1704 mpc_conj (result->value.complex, result->value.complex, GFC_MPC_RND_MODE);
1706 return range_check (result, "CONJG");
1709 /* Return the simplification of the constant expression in icall, or NULL
1710 if the expression is not constant. */
1712 static gfc_expr *
1713 simplify_trig_call (gfc_expr *icall)
1715 gfc_isym_id func = icall->value.function.isym->id;
1716 gfc_expr *x = icall->value.function.actual->expr;
1718 /* The actual simplifiers will return NULL for non-constant x. */
1719 switch (func)
1721 case GFC_ISYM_ACOS:
1722 return gfc_simplify_acos (x);
1723 case GFC_ISYM_ASIN:
1724 return gfc_simplify_asin (x);
1725 case GFC_ISYM_ATAN:
1726 return gfc_simplify_atan (x);
1727 case GFC_ISYM_COS:
1728 return gfc_simplify_cos (x);
1729 case GFC_ISYM_COTAN:
1730 return gfc_simplify_cotan (x);
1731 case GFC_ISYM_SIN:
1732 return gfc_simplify_sin (x);
1733 case GFC_ISYM_TAN:
1734 return gfc_simplify_tan (x);
1735 default:
1736 gfc_internal_error ("in simplify_trig_call(): Bad intrinsic");
1740 /* Convert a floating-point number from radians to degrees. */
1742 static void
1743 degrees_f (mpfr_t x, mp_rnd_t rnd_mode)
1745 mpfr_t tmp;
1746 mpfr_init (tmp);
1748 /* Set x = x % 2pi to avoid offsets with large angles. */
1749 mpfr_const_pi (tmp, rnd_mode);
1750 mpfr_mul_ui (tmp, tmp, 2, rnd_mode);
1751 mpfr_fmod (tmp, x, tmp, rnd_mode);
1753 /* Set x = x * 180. */
1754 mpfr_mul_ui (x, x, 180, rnd_mode);
1756 /* Set x = x / pi. */
1757 mpfr_const_pi (tmp, rnd_mode);
1758 mpfr_div (x, x, tmp, rnd_mode);
1760 mpfr_clear (tmp);
1763 /* Convert a floating-point number from degrees to radians. */
1765 static void
1766 radians_f (mpfr_t x, mp_rnd_t rnd_mode)
1768 mpfr_t tmp;
1769 mpfr_init (tmp);
1771 /* Set x = x % 360 to avoid offsets with large angles. */
1772 mpfr_set_ui (tmp, 360, rnd_mode);
1773 mpfr_fmod (tmp, x, tmp, rnd_mode);
1775 /* Set x = x * pi. */
1776 mpfr_const_pi (tmp, rnd_mode);
1777 mpfr_mul (x, x, tmp, rnd_mode);
1779 /* Set x = x / 180. */
1780 mpfr_div_ui (x, x, 180, rnd_mode);
1782 mpfr_clear (tmp);
1786 /* Convert argument to radians before calling a trig function. */
1788 gfc_expr *
1789 gfc_simplify_trigd (gfc_expr *icall)
1791 gfc_expr *arg;
1793 arg = icall->value.function.actual->expr;
1795 if (arg->ts.type != BT_REAL)
1796 gfc_internal_error ("in gfc_simplify_trigd(): Bad type");
1798 if (arg->expr_type == EXPR_CONSTANT)
1799 /* Convert constant to radians before passing off to simplifier. */
1800 radians_f (arg->value.real, GFC_RND_MODE);
1802 /* Let the usual simplifier take over - we just simplified the arg. */
1803 return simplify_trig_call (icall);
1806 /* Convert result of an inverse trig function to degrees. */
1808 gfc_expr *
1809 gfc_simplify_atrigd (gfc_expr *icall)
1811 gfc_expr *result;
1813 if (icall->value.function.actual->expr->ts.type != BT_REAL)
1814 gfc_internal_error ("in gfc_simplify_atrigd(): Bad type");
1816 /* See if another simplifier has work to do first. */
1817 result = simplify_trig_call (icall);
1819 if (result && result->expr_type == EXPR_CONSTANT)
1821 /* Convert constant to degrees after passing off to actual simplifier. */
1822 degrees_f (result->value.real, GFC_RND_MODE);
1823 return result;
1826 /* Let gfc_resolve_atrigd take care of the non-constant case. */
1827 return NULL;
1830 /* Convert the result of atan2 to degrees. */
1832 gfc_expr *
1833 gfc_simplify_atan2d (gfc_expr *y, gfc_expr *x)
1835 gfc_expr *result;
1837 if (x->ts.type != BT_REAL || y->ts.type != BT_REAL)
1838 gfc_internal_error ("in gfc_simplify_atan2d(): Bad type");
1840 if (x->expr_type == EXPR_CONSTANT && y->expr_type == EXPR_CONSTANT)
1842 result = gfc_simplify_atan2 (y, x);
1843 if (result != NULL)
1845 degrees_f (result->value.real, GFC_RND_MODE);
1846 return result;
1850 /* Let gfc_resolve_atan2d take care of the non-constant case. */
1851 return NULL;
1854 gfc_expr *
1855 gfc_simplify_cos (gfc_expr *x)
1857 gfc_expr *result;
1859 if (x->expr_type != EXPR_CONSTANT)
1860 return NULL;
1862 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1864 switch (x->ts.type)
1866 case BT_REAL:
1867 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
1868 break;
1870 case BT_COMPLEX:
1871 gfc_set_model_kind (x->ts.kind);
1872 mpc_cos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1873 break;
1875 default:
1876 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1879 return range_check (result, "COS");
1883 gfc_expr *
1884 gfc_simplify_cosh (gfc_expr *x)
1886 gfc_expr *result;
1888 if (x->expr_type != EXPR_CONSTANT)
1889 return NULL;
1891 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1893 switch (x->ts.type)
1895 case BT_REAL:
1896 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
1897 break;
1899 case BT_COMPLEX:
1900 mpc_cosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1901 break;
1903 default:
1904 gcc_unreachable ();
1907 return range_check (result, "COSH");
1911 gfc_expr *
1912 gfc_simplify_count (gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
1914 gfc_expr *result;
1916 if (!is_constant_array_expr (mask)
1917 || !gfc_is_constant_expr (dim)
1918 || !gfc_is_constant_expr (kind))
1919 return NULL;
1921 result = transformational_result (mask, dim,
1922 BT_INTEGER,
1923 get_kind (BT_INTEGER, kind, "COUNT",
1924 gfc_default_integer_kind),
1925 &mask->where);
1927 init_result_expr (result, 0, NULL);
1929 /* Passing MASK twice, once as data array, once as mask.
1930 Whenever gfc_count is called, '1' is added to the result. */
1931 return !dim || mask->rank == 1 ?
1932 simplify_transformation_to_scalar (result, mask, mask, gfc_count) :
1933 simplify_transformation_to_array (result, mask, dim, mask, gfc_count, NULL);
1937 gfc_expr *
1938 gfc_simplify_cshift (gfc_expr *array, gfc_expr *shift, gfc_expr *dim)
1940 gfc_expr *a, *result;
1941 int dm;
1943 /* DIM is only useful for rank > 1, but deal with it here as one can
1944 set DIM = 1 for rank = 1. */
1945 if (dim)
1947 if (!gfc_is_constant_expr (dim))
1948 return NULL;
1949 dm = mpz_get_si (dim->value.integer);
1951 else
1952 dm = 1;
1954 /* Copy array into 'a', simplify it, and then test for a constant array. */
1955 a = gfc_copy_expr (array);
1956 gfc_simplify_expr (a, 0);
1957 if (!is_constant_array_expr (a))
1959 gfc_free_expr (a);
1960 return NULL;
1963 if (a->rank == 1)
1965 gfc_constructor *ca, *cr;
1966 mpz_t size;
1967 int i, j, shft, sz;
1969 if (!gfc_is_constant_expr (shift))
1971 gfc_free_expr (a);
1972 return NULL;
1975 shft = mpz_get_si (shift->value.integer);
1977 /* Case (i): If ARRAY has rank one, element i of the result is
1978 ARRAY (1 + MODULO (i + SHIFT - 1, SIZE (ARRAY))). */
1980 mpz_init (size);
1981 gfc_array_size (a, &size);
1982 sz = mpz_get_si (size);
1983 mpz_clear (size);
1985 /* Adjust shft to deal with right or left shifts. */
1986 shft = shft < 0 ? 1 - shft : shft;
1988 /* Special case: Shift to the original order! */
1989 if (sz == 0 || shft % sz == 0)
1990 return a;
1992 result = gfc_copy_expr (a);
1993 cr = gfc_constructor_first (result->value.constructor);
1994 for (i = 0; i < sz; i++, cr = gfc_constructor_next (cr))
1996 j = (i + shft) % sz;
1997 ca = gfc_constructor_first (a->value.constructor);
1998 while (j-- > 0)
1999 ca = gfc_constructor_next (ca);
2000 cr->expr = gfc_copy_expr (ca->expr);
2003 gfc_free_expr (a);
2004 return result;
2006 else
2008 /* FIXME: Deal with rank > 1 arrays. For now, don't leak memory. */
2010 /* GCC bootstrap is too stupid to realize that the above code for dm
2011 is correct. First, dim can be specified for a rank 1 array. It is
2012 not needed in this nor used here. Second, the code is simply waiting
2013 for someone to implement rank > 1 simplification. For now, add a
2014 pessimization to the code that has a zero valid reason to be here. */
2015 if (dm > array->rank)
2016 gcc_unreachable ();
2018 gfc_free_expr (a);
2021 return NULL;
2025 gfc_expr *
2026 gfc_simplify_dcmplx (gfc_expr *x, gfc_expr *y)
2028 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
2032 gfc_expr *
2033 gfc_simplify_dble (gfc_expr *e)
2035 gfc_expr *result = NULL;
2037 if (e->expr_type != EXPR_CONSTANT)
2038 return NULL;
2040 if (convert_boz (e, gfc_default_double_kind) == &gfc_bad_expr)
2041 return &gfc_bad_expr;
2043 result = gfc_convert_constant (e, BT_REAL, gfc_default_double_kind);
2044 if (result == &gfc_bad_expr)
2045 return &gfc_bad_expr;
2047 return range_check (result, "DBLE");
2051 gfc_expr *
2052 gfc_simplify_digits (gfc_expr *x)
2054 int i, digits;
2056 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2058 switch (x->ts.type)
2060 case BT_INTEGER:
2061 digits = gfc_integer_kinds[i].digits;
2062 break;
2064 case BT_REAL:
2065 case BT_COMPLEX:
2066 digits = gfc_real_kinds[i].digits;
2067 break;
2069 default:
2070 gcc_unreachable ();
2073 return gfc_get_int_expr (gfc_default_integer_kind, NULL, digits);
2077 gfc_expr *
2078 gfc_simplify_dim (gfc_expr *x, gfc_expr *y)
2080 gfc_expr *result;
2081 int kind;
2083 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2084 return NULL;
2086 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
2087 result = gfc_get_constant_expr (x->ts.type, kind, &x->where);
2089 switch (x->ts.type)
2091 case BT_INTEGER:
2092 if (mpz_cmp (x->value.integer, y->value.integer) > 0)
2093 mpz_sub (result->value.integer, x->value.integer, y->value.integer);
2094 else
2095 mpz_set_ui (result->value.integer, 0);
2097 break;
2099 case BT_REAL:
2100 if (mpfr_cmp (x->value.real, y->value.real) > 0)
2101 mpfr_sub (result->value.real, x->value.real, y->value.real,
2102 GFC_RND_MODE);
2103 else
2104 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2106 break;
2108 default:
2109 gfc_internal_error ("gfc_simplify_dim(): Bad type");
2112 return range_check (result, "DIM");
2116 gfc_expr*
2117 gfc_simplify_dot_product (gfc_expr *vector_a, gfc_expr *vector_b)
2120 gfc_expr temp;
2122 if (!is_constant_array_expr (vector_a)
2123 || !is_constant_array_expr (vector_b))
2124 return NULL;
2126 gcc_assert (vector_a->rank == 1);
2127 gcc_assert (vector_b->rank == 1);
2129 temp.expr_type = EXPR_OP;
2130 gfc_clear_ts (&temp.ts);
2131 temp.value.op.op = INTRINSIC_NONE;
2132 temp.value.op.op1 = vector_a;
2133 temp.value.op.op2 = vector_b;
2134 gfc_type_convert_binary (&temp, 1);
2136 return compute_dot_product (vector_a, 1, 0, vector_b, 1, 0, true);
2140 gfc_expr *
2141 gfc_simplify_dprod (gfc_expr *x, gfc_expr *y)
2143 gfc_expr *a1, *a2, *result;
2145 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2146 return NULL;
2148 a1 = gfc_real2real (x, gfc_default_double_kind);
2149 a2 = gfc_real2real (y, gfc_default_double_kind);
2151 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &x->where);
2152 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
2154 gfc_free_expr (a2);
2155 gfc_free_expr (a1);
2157 return range_check (result, "DPROD");
2161 static gfc_expr *
2162 simplify_dshift (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg,
2163 bool right)
2165 gfc_expr *result;
2166 int i, k, size, shift;
2168 if (arg1->expr_type != EXPR_CONSTANT || arg2->expr_type != EXPR_CONSTANT
2169 || shiftarg->expr_type != EXPR_CONSTANT)
2170 return NULL;
2172 k = gfc_validate_kind (BT_INTEGER, arg1->ts.kind, false);
2173 size = gfc_integer_kinds[k].bit_size;
2175 gfc_extract_int (shiftarg, &shift);
2177 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */
2178 if (right)
2179 shift = size - shift;
2181 result = gfc_get_constant_expr (BT_INTEGER, arg1->ts.kind, &arg1->where);
2182 mpz_set_ui (result->value.integer, 0);
2184 for (i = 0; i < shift; i++)
2185 if (mpz_tstbit (arg2->value.integer, size - shift + i))
2186 mpz_setbit (result->value.integer, i);
2188 for (i = 0; i < size - shift; i++)
2189 if (mpz_tstbit (arg1->value.integer, i))
2190 mpz_setbit (result->value.integer, shift + i);
2192 /* Convert to a signed value. */
2193 gfc_convert_mpz_to_signed (result->value.integer, size);
2195 return result;
2199 gfc_expr *
2200 gfc_simplify_dshiftr (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg)
2202 return simplify_dshift (arg1, arg2, shiftarg, true);
2206 gfc_expr *
2207 gfc_simplify_dshiftl (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg)
2209 return simplify_dshift (arg1, arg2, shiftarg, false);
2213 gfc_expr *
2214 gfc_simplify_erf (gfc_expr *x)
2216 gfc_expr *result;
2218 if (x->expr_type != EXPR_CONSTANT)
2219 return NULL;
2221 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2222 mpfr_erf (result->value.real, x->value.real, GFC_RND_MODE);
2224 return range_check (result, "ERF");
2228 gfc_expr *
2229 gfc_simplify_erfc (gfc_expr *x)
2231 gfc_expr *result;
2233 if (x->expr_type != EXPR_CONSTANT)
2234 return NULL;
2236 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2237 mpfr_erfc (result->value.real, x->value.real, GFC_RND_MODE);
2239 return range_check (result, "ERFC");
2243 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
2245 #define MAX_ITER 200
2246 #define ARG_LIMIT 12
2248 /* Calculate ERFC_SCALED directly by its definition:
2250 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
2252 using a large precision for intermediate results. This is used for all
2253 but large values of the argument. */
2254 static void
2255 fullprec_erfc_scaled (mpfr_t res, mpfr_t arg)
2257 mp_prec_t prec;
2258 mpfr_t a, b;
2260 prec = mpfr_get_default_prec ();
2261 mpfr_set_default_prec (10 * prec);
2263 mpfr_init (a);
2264 mpfr_init (b);
2266 mpfr_set (a, arg, GFC_RND_MODE);
2267 mpfr_sqr (b, a, GFC_RND_MODE);
2268 mpfr_exp (b, b, GFC_RND_MODE);
2269 mpfr_erfc (a, a, GFC_RND_MODE);
2270 mpfr_mul (a, a, b, GFC_RND_MODE);
2272 mpfr_set (res, a, GFC_RND_MODE);
2273 mpfr_set_default_prec (prec);
2275 mpfr_clear (a);
2276 mpfr_clear (b);
2279 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
2281 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
2282 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
2283 / (2 * x**2)**n)
2285 This is used for large values of the argument. Intermediate calculations
2286 are performed with twice the precision. We don't do a fixed number of
2287 iterations of the sum, but stop when it has converged to the required
2288 precision. */
2289 static void
2290 asympt_erfc_scaled (mpfr_t res, mpfr_t arg)
2292 mpfr_t sum, x, u, v, w, oldsum, sumtrunc;
2293 mpz_t num;
2294 mp_prec_t prec;
2295 unsigned i;
2297 prec = mpfr_get_default_prec ();
2298 mpfr_set_default_prec (2 * prec);
2300 mpfr_init (sum);
2301 mpfr_init (x);
2302 mpfr_init (u);
2303 mpfr_init (v);
2304 mpfr_init (w);
2305 mpz_init (num);
2307 mpfr_init (oldsum);
2308 mpfr_init (sumtrunc);
2309 mpfr_set_prec (oldsum, prec);
2310 mpfr_set_prec (sumtrunc, prec);
2312 mpfr_set (x, arg, GFC_RND_MODE);
2313 mpfr_set_ui (sum, 1, GFC_RND_MODE);
2314 mpz_set_ui (num, 1);
2316 mpfr_set (u, x, GFC_RND_MODE);
2317 mpfr_sqr (u, u, GFC_RND_MODE);
2318 mpfr_mul_ui (u, u, 2, GFC_RND_MODE);
2319 mpfr_pow_si (u, u, -1, GFC_RND_MODE);
2321 for (i = 1; i < MAX_ITER; i++)
2323 mpfr_set (oldsum, sum, GFC_RND_MODE);
2325 mpz_mul_ui (num, num, 2 * i - 1);
2326 mpz_neg (num, num);
2328 mpfr_set (w, u, GFC_RND_MODE);
2329 mpfr_pow_ui (w, w, i, GFC_RND_MODE);
2331 mpfr_set_z (v, num, GFC_RND_MODE);
2332 mpfr_mul (v, v, w, GFC_RND_MODE);
2334 mpfr_add (sum, sum, v, GFC_RND_MODE);
2336 mpfr_set (sumtrunc, sum, GFC_RND_MODE);
2337 if (mpfr_cmp (sumtrunc, oldsum) == 0)
2338 break;
2341 /* We should have converged by now; otherwise, ARG_LIMIT is probably
2342 set too low. */
2343 gcc_assert (i < MAX_ITER);
2345 /* Divide by x * sqrt(Pi). */
2346 mpfr_const_pi (u, GFC_RND_MODE);
2347 mpfr_sqrt (u, u, GFC_RND_MODE);
2348 mpfr_mul (u, u, x, GFC_RND_MODE);
2349 mpfr_div (sum, sum, u, GFC_RND_MODE);
2351 mpfr_set (res, sum, GFC_RND_MODE);
2352 mpfr_set_default_prec (prec);
2354 mpfr_clears (sum, x, u, v, w, oldsum, sumtrunc, NULL);
2355 mpz_clear (num);
2359 gfc_expr *
2360 gfc_simplify_erfc_scaled (gfc_expr *x)
2362 gfc_expr *result;
2364 if (x->expr_type != EXPR_CONSTANT)
2365 return NULL;
2367 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2368 if (mpfr_cmp_d (x->value.real, ARG_LIMIT) >= 0)
2369 asympt_erfc_scaled (result->value.real, x->value.real);
2370 else
2371 fullprec_erfc_scaled (result->value.real, x->value.real);
2373 return range_check (result, "ERFC_SCALED");
2376 #undef MAX_ITER
2377 #undef ARG_LIMIT
2380 gfc_expr *
2381 gfc_simplify_epsilon (gfc_expr *e)
2383 gfc_expr *result;
2384 int i;
2386 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2388 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
2389 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
2391 return range_check (result, "EPSILON");
2395 gfc_expr *
2396 gfc_simplify_exp (gfc_expr *x)
2398 gfc_expr *result;
2400 if (x->expr_type != EXPR_CONSTANT)
2401 return NULL;
2403 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2405 switch (x->ts.type)
2407 case BT_REAL:
2408 mpfr_exp (result->value.real, x->value.real, GFC_RND_MODE);
2409 break;
2411 case BT_COMPLEX:
2412 gfc_set_model_kind (x->ts.kind);
2413 mpc_exp (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
2414 break;
2416 default:
2417 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2420 return range_check (result, "EXP");
2424 gfc_expr *
2425 gfc_simplify_exponent (gfc_expr *x)
2427 long int val;
2428 gfc_expr *result;
2430 if (x->expr_type != EXPR_CONSTANT)
2431 return NULL;
2433 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2434 &x->where);
2436 /* EXPONENT(inf) = EXPONENT(nan) = HUGE(0) */
2437 if (mpfr_inf_p (x->value.real) || mpfr_nan_p (x->value.real))
2439 int i = gfc_validate_kind (BT_INTEGER, gfc_default_integer_kind, false);
2440 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
2441 return result;
2444 /* EXPONENT(+/- 0.0) = 0 */
2445 if (mpfr_zero_p (x->value.real))
2447 mpz_set_ui (result->value.integer, 0);
2448 return result;
2451 gfc_set_model (x->value.real);
2453 val = (long int) mpfr_get_exp (x->value.real);
2454 mpz_set_si (result->value.integer, val);
2456 return range_check (result, "EXPONENT");
2460 gfc_expr *
2461 gfc_simplify_float (gfc_expr *a)
2463 gfc_expr *result;
2465 if (a->expr_type != EXPR_CONSTANT)
2466 return NULL;
2468 if (a->is_boz)
2470 if (convert_boz (a, gfc_default_real_kind) == &gfc_bad_expr)
2471 return &gfc_bad_expr;
2473 result = gfc_copy_expr (a);
2475 else
2476 result = gfc_int2real (a, gfc_default_real_kind);
2478 return range_check (result, "FLOAT");
2482 static bool
2483 is_last_ref_vtab (gfc_expr *e)
2485 gfc_ref *ref;
2486 gfc_component *comp = NULL;
2488 if (e->expr_type != EXPR_VARIABLE)
2489 return false;
2491 for (ref = e->ref; ref; ref = ref->next)
2492 if (ref->type == REF_COMPONENT)
2493 comp = ref->u.c.component;
2495 if (!e->ref || !comp)
2496 return e->symtree->n.sym->attr.vtab;
2498 if (comp->name[0] == '_' && strcmp (comp->name, "_vptr") == 0)
2499 return true;
2501 return false;
2505 gfc_expr *
2506 gfc_simplify_extends_type_of (gfc_expr *a, gfc_expr *mold)
2508 /* Avoid simplification of resolved symbols. */
2509 if (is_last_ref_vtab (a) || is_last_ref_vtab (mold))
2510 return NULL;
2512 if (a->ts.type == BT_DERIVED && mold->ts.type == BT_DERIVED)
2513 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
2514 gfc_type_is_extension_of (mold->ts.u.derived,
2515 a->ts.u.derived));
2517 if (UNLIMITED_POLY (a) || UNLIMITED_POLY (mold))
2518 return NULL;
2520 /* Return .false. if the dynamic type can never be an extension. */
2521 if ((a->ts.type == BT_CLASS && mold->ts.type == BT_CLASS
2522 && !gfc_type_is_extension_of
2523 (mold->ts.u.derived->components->ts.u.derived,
2524 a->ts.u.derived->components->ts.u.derived)
2525 && !gfc_type_is_extension_of
2526 (a->ts.u.derived->components->ts.u.derived,
2527 mold->ts.u.derived->components->ts.u.derived))
2528 || (a->ts.type == BT_DERIVED && mold->ts.type == BT_CLASS
2529 && !gfc_type_is_extension_of
2530 (mold->ts.u.derived->components->ts.u.derived,
2531 a->ts.u.derived))
2532 || (a->ts.type == BT_CLASS && mold->ts.type == BT_DERIVED
2533 && !gfc_type_is_extension_of
2534 (mold->ts.u.derived,
2535 a->ts.u.derived->components->ts.u.derived)
2536 && !gfc_type_is_extension_of
2537 (a->ts.u.derived->components->ts.u.derived,
2538 mold->ts.u.derived)))
2539 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false);
2541 /* Return .true. if the dynamic type is guaranteed to be an extension. */
2542 if (a->ts.type == BT_CLASS && mold->ts.type == BT_DERIVED
2543 && gfc_type_is_extension_of (mold->ts.u.derived,
2544 a->ts.u.derived->components->ts.u.derived))
2545 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, true);
2547 return NULL;
2551 gfc_expr *
2552 gfc_simplify_same_type_as (gfc_expr *a, gfc_expr *b)
2554 /* Avoid simplification of resolved symbols. */
2555 if (is_last_ref_vtab (a) || is_last_ref_vtab (b))
2556 return NULL;
2558 /* Return .false. if the dynamic type can never be the
2559 same. */
2560 if (((a->ts.type == BT_CLASS && gfc_expr_attr (a).class_ok)
2561 || (b->ts.type == BT_CLASS && gfc_expr_attr (b).class_ok))
2562 && !gfc_type_compatible (&a->ts, &b->ts)
2563 && !gfc_type_compatible (&b->ts, &a->ts))
2564 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false);
2566 if (a->ts.type != BT_DERIVED || b->ts.type != BT_DERIVED)
2567 return NULL;
2569 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
2570 gfc_compare_derived_types (a->ts.u.derived,
2571 b->ts.u.derived));
2575 gfc_expr *
2576 gfc_simplify_floor (gfc_expr *e, gfc_expr *k)
2578 gfc_expr *result;
2579 mpfr_t floor;
2580 int kind;
2582 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
2583 if (kind == -1)
2584 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
2586 if (e->expr_type != EXPR_CONSTANT)
2587 return NULL;
2589 mpfr_init2 (floor, mpfr_get_prec (e->value.real));
2590 mpfr_floor (floor, e->value.real);
2592 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
2593 gfc_mpfr_to_mpz (result->value.integer, floor, &e->where);
2595 mpfr_clear (floor);
2597 return range_check (result, "FLOOR");
2601 gfc_expr *
2602 gfc_simplify_fraction (gfc_expr *x)
2604 gfc_expr *result;
2606 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
2607 mpfr_t absv, exp, pow2;
2608 #else
2609 mpfr_exp_t e;
2610 #endif
2612 if (x->expr_type != EXPR_CONSTANT)
2613 return NULL;
2615 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
2617 /* FRACTION(inf) = NaN. */
2618 if (mpfr_inf_p (x->value.real))
2620 mpfr_set_nan (result->value.real);
2621 return result;
2624 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
2626 /* MPFR versions before 3.1.0 do not include mpfr_frexp.
2627 TODO: remove the kludge when MPFR 3.1.0 or newer will be required */
2629 if (mpfr_sgn (x->value.real) == 0)
2631 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
2632 return result;
2635 gfc_set_model_kind (x->ts.kind);
2636 mpfr_init (exp);
2637 mpfr_init (absv);
2638 mpfr_init (pow2);
2640 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
2641 mpfr_log2 (exp, absv, GFC_RND_MODE);
2643 mpfr_trunc (exp, exp);
2644 mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
2646 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
2648 mpfr_div (result->value.real, x->value.real, pow2, GFC_RND_MODE);
2650 mpfr_clears (exp, absv, pow2, NULL);
2652 #else
2654 /* mpfr_frexp() correctly handles zeros and NaNs. */
2655 mpfr_frexp (&e, result->value.real, x->value.real, GFC_RND_MODE);
2657 #endif
2659 return range_check (result, "FRACTION");
2663 gfc_expr *
2664 gfc_simplify_gamma (gfc_expr *x)
2666 gfc_expr *result;
2668 if (x->expr_type != EXPR_CONSTANT)
2669 return NULL;
2671 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2672 mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE);
2674 return range_check (result, "GAMMA");
2678 gfc_expr *
2679 gfc_simplify_huge (gfc_expr *e)
2681 gfc_expr *result;
2682 int i;
2684 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2685 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
2687 switch (e->ts.type)
2689 case BT_INTEGER:
2690 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
2691 break;
2693 case BT_REAL:
2694 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
2695 break;
2697 default:
2698 gcc_unreachable ();
2701 return result;
2705 gfc_expr *
2706 gfc_simplify_hypot (gfc_expr *x, gfc_expr *y)
2708 gfc_expr *result;
2710 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2711 return NULL;
2713 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2714 mpfr_hypot (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
2715 return range_check (result, "HYPOT");
2719 /* We use the processor's collating sequence, because all
2720 systems that gfortran currently works on are ASCII. */
2722 gfc_expr *
2723 gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
2725 gfc_expr *result;
2726 gfc_char_t index;
2727 int k;
2729 if (e->expr_type != EXPR_CONSTANT)
2730 return NULL;
2732 if (e->value.character.length != 1)
2734 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
2735 return &gfc_bad_expr;
2738 index = e->value.character.string[0];
2740 if (warn_surprising && index > 127)
2741 gfc_warning (OPT_Wsurprising,
2742 "Argument of IACHAR function at %L outside of range 0..127",
2743 &e->where);
2745 k = get_kind (BT_INTEGER, kind, "IACHAR", gfc_default_integer_kind);
2746 if (k == -1)
2747 return &gfc_bad_expr;
2749 result = gfc_get_int_expr (k, &e->where, index);
2751 return range_check (result, "IACHAR");
2755 static gfc_expr *
2756 do_bit_and (gfc_expr *result, gfc_expr *e)
2758 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
2759 gcc_assert (result->ts.type == BT_INTEGER
2760 && result->expr_type == EXPR_CONSTANT);
2762 mpz_and (result->value.integer, result->value.integer, e->value.integer);
2763 return result;
2767 gfc_expr *
2768 gfc_simplify_iall (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2770 return simplify_transformation (array, dim, mask, -1, do_bit_and);
2774 static gfc_expr *
2775 do_bit_ior (gfc_expr *result, gfc_expr *e)
2777 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
2778 gcc_assert (result->ts.type == BT_INTEGER
2779 && result->expr_type == EXPR_CONSTANT);
2781 mpz_ior (result->value.integer, result->value.integer, e->value.integer);
2782 return result;
2786 gfc_expr *
2787 gfc_simplify_iany (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2789 return simplify_transformation (array, dim, mask, 0, do_bit_ior);
2793 gfc_expr *
2794 gfc_simplify_iand (gfc_expr *x, gfc_expr *y)
2796 gfc_expr *result;
2798 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2799 return NULL;
2801 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2802 mpz_and (result->value.integer, x->value.integer, y->value.integer);
2804 return range_check (result, "IAND");
2808 gfc_expr *
2809 gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y)
2811 gfc_expr *result;
2812 int k, pos;
2814 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2815 return NULL;
2817 gfc_extract_int (y, &pos);
2819 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2821 result = gfc_copy_expr (x);
2823 convert_mpz_to_unsigned (result->value.integer,
2824 gfc_integer_kinds[k].bit_size);
2826 mpz_clrbit (result->value.integer, pos);
2828 gfc_convert_mpz_to_signed (result->value.integer,
2829 gfc_integer_kinds[k].bit_size);
2831 return result;
2835 gfc_expr *
2836 gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z)
2838 gfc_expr *result;
2839 int pos, len;
2840 int i, k, bitsize;
2841 int *bits;
2843 if (x->expr_type != EXPR_CONSTANT
2844 || y->expr_type != EXPR_CONSTANT
2845 || z->expr_type != EXPR_CONSTANT)
2846 return NULL;
2848 gfc_extract_int (y, &pos);
2849 gfc_extract_int (z, &len);
2851 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
2853 bitsize = gfc_integer_kinds[k].bit_size;
2855 if (pos + len > bitsize)
2857 gfc_error ("Sum of second and third arguments of IBITS exceeds "
2858 "bit size at %L", &y->where);
2859 return &gfc_bad_expr;
2862 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2863 convert_mpz_to_unsigned (result->value.integer,
2864 gfc_integer_kinds[k].bit_size);
2866 bits = XCNEWVEC (int, bitsize);
2868 for (i = 0; i < bitsize; i++)
2869 bits[i] = 0;
2871 for (i = 0; i < len; i++)
2872 bits[i] = mpz_tstbit (x->value.integer, i + pos);
2874 for (i = 0; i < bitsize; i++)
2876 if (bits[i] == 0)
2877 mpz_clrbit (result->value.integer, i);
2878 else if (bits[i] == 1)
2879 mpz_setbit (result->value.integer, i);
2880 else
2881 gfc_internal_error ("IBITS: Bad bit");
2884 free (bits);
2886 gfc_convert_mpz_to_signed (result->value.integer,
2887 gfc_integer_kinds[k].bit_size);
2889 return result;
2893 gfc_expr *
2894 gfc_simplify_ibset (gfc_expr *x, gfc_expr *y)
2896 gfc_expr *result;
2897 int k, pos;
2899 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2900 return NULL;
2902 gfc_extract_int (y, &pos);
2904 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2906 result = gfc_copy_expr (x);
2908 convert_mpz_to_unsigned (result->value.integer,
2909 gfc_integer_kinds[k].bit_size);
2911 mpz_setbit (result->value.integer, pos);
2913 gfc_convert_mpz_to_signed (result->value.integer,
2914 gfc_integer_kinds[k].bit_size);
2916 return result;
2920 gfc_expr *
2921 gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
2923 gfc_expr *result;
2924 gfc_char_t index;
2925 int k;
2927 if (e->expr_type != EXPR_CONSTANT)
2928 return NULL;
2930 if (e->value.character.length != 1)
2932 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
2933 return &gfc_bad_expr;
2936 index = e->value.character.string[0];
2938 k = get_kind (BT_INTEGER, kind, "ICHAR", gfc_default_integer_kind);
2939 if (k == -1)
2940 return &gfc_bad_expr;
2942 result = gfc_get_int_expr (k, &e->where, index);
2944 return range_check (result, "ICHAR");
2948 gfc_expr *
2949 gfc_simplify_ieor (gfc_expr *x, gfc_expr *y)
2951 gfc_expr *result;
2953 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2954 return NULL;
2956 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2957 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
2959 return range_check (result, "IEOR");
2963 gfc_expr *
2964 gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind)
2966 gfc_expr *result;
2967 int back, len, lensub;
2968 int i, j, k, count, index = 0, start;
2970 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT
2971 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
2972 return NULL;
2974 if (b != NULL && b->value.logical != 0)
2975 back = 1;
2976 else
2977 back = 0;
2979 k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind);
2980 if (k == -1)
2981 return &gfc_bad_expr;
2983 result = gfc_get_constant_expr (BT_INTEGER, k, &x->where);
2985 len = x->value.character.length;
2986 lensub = y->value.character.length;
2988 if (len < lensub)
2990 mpz_set_si (result->value.integer, 0);
2991 return result;
2994 if (back == 0)
2996 if (lensub == 0)
2998 mpz_set_si (result->value.integer, 1);
2999 return result;
3001 else if (lensub == 1)
3003 for (i = 0; i < len; i++)
3005 for (j = 0; j < lensub; j++)
3007 if (y->value.character.string[j]
3008 == x->value.character.string[i])
3010 index = i + 1;
3011 goto done;
3016 else
3018 for (i = 0; i < len; i++)
3020 for (j = 0; j < lensub; j++)
3022 if (y->value.character.string[j]
3023 == x->value.character.string[i])
3025 start = i;
3026 count = 0;
3028 for (k = 0; k < lensub; k++)
3030 if (y->value.character.string[k]
3031 == x->value.character.string[k + start])
3032 count++;
3035 if (count == lensub)
3037 index = start + 1;
3038 goto done;
3046 else
3048 if (lensub == 0)
3050 mpz_set_si (result->value.integer, len + 1);
3051 return result;
3053 else if (lensub == 1)
3055 for (i = 0; i < len; i++)
3057 for (j = 0; j < lensub; j++)
3059 if (y->value.character.string[j]
3060 == x->value.character.string[len - i])
3062 index = len - i + 1;
3063 goto done;
3068 else
3070 for (i = 0; i < len; i++)
3072 for (j = 0; j < lensub; j++)
3074 if (y->value.character.string[j]
3075 == x->value.character.string[len - i])
3077 start = len - i;
3078 if (start <= len - lensub)
3080 count = 0;
3081 for (k = 0; k < lensub; k++)
3082 if (y->value.character.string[k]
3083 == x->value.character.string[k + start])
3084 count++;
3086 if (count == lensub)
3088 index = start + 1;
3089 goto done;
3092 else
3094 continue;
3102 done:
3103 mpz_set_si (result->value.integer, index);
3104 return range_check (result, "INDEX");
3108 static gfc_expr *
3109 simplify_intconv (gfc_expr *e, int kind, const char *name)
3111 gfc_expr *result = NULL;
3113 if (e->expr_type != EXPR_CONSTANT)
3114 return NULL;
3116 result = gfc_convert_constant (e, BT_INTEGER, kind);
3117 if (result == &gfc_bad_expr)
3118 return &gfc_bad_expr;
3120 return range_check (result, name);
3124 gfc_expr *
3125 gfc_simplify_int (gfc_expr *e, gfc_expr *k)
3127 int kind;
3129 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
3130 if (kind == -1)
3131 return &gfc_bad_expr;
3133 return simplify_intconv (e, kind, "INT");
3136 gfc_expr *
3137 gfc_simplify_int2 (gfc_expr *e)
3139 return simplify_intconv (e, 2, "INT2");
3143 gfc_expr *
3144 gfc_simplify_int8 (gfc_expr *e)
3146 return simplify_intconv (e, 8, "INT8");
3150 gfc_expr *
3151 gfc_simplify_long (gfc_expr *e)
3153 return simplify_intconv (e, 4, "LONG");
3157 gfc_expr *
3158 gfc_simplify_ifix (gfc_expr *e)
3160 gfc_expr *rtrunc, *result;
3162 if (e->expr_type != EXPR_CONSTANT)
3163 return NULL;
3165 rtrunc = gfc_copy_expr (e);
3166 mpfr_trunc (rtrunc->value.real, e->value.real);
3168 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
3169 &e->where);
3170 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
3172 gfc_free_expr (rtrunc);
3174 return range_check (result, "IFIX");
3178 gfc_expr *
3179 gfc_simplify_idint (gfc_expr *e)
3181 gfc_expr *rtrunc, *result;
3183 if (e->expr_type != EXPR_CONSTANT)
3184 return NULL;
3186 rtrunc = gfc_copy_expr (e);
3187 mpfr_trunc (rtrunc->value.real, e->value.real);
3189 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
3190 &e->where);
3191 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
3193 gfc_free_expr (rtrunc);
3195 return range_check (result, "IDINT");
3199 gfc_expr *
3200 gfc_simplify_ior (gfc_expr *x, gfc_expr *y)
3202 gfc_expr *result;
3204 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3205 return NULL;
3207 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
3208 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
3210 return range_check (result, "IOR");
3214 static gfc_expr *
3215 do_bit_xor (gfc_expr *result, gfc_expr *e)
3217 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
3218 gcc_assert (result->ts.type == BT_INTEGER
3219 && result->expr_type == EXPR_CONSTANT);
3221 mpz_xor (result->value.integer, result->value.integer, e->value.integer);
3222 return result;
3226 gfc_expr *
3227 gfc_simplify_iparity (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
3229 return simplify_transformation (array, dim, mask, 0, do_bit_xor);
3233 gfc_expr *
3234 gfc_simplify_is_iostat_end (gfc_expr *x)
3236 if (x->expr_type != EXPR_CONSTANT)
3237 return NULL;
3239 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
3240 mpz_cmp_si (x->value.integer,
3241 LIBERROR_END) == 0);
3245 gfc_expr *
3246 gfc_simplify_is_iostat_eor (gfc_expr *x)
3248 if (x->expr_type != EXPR_CONSTANT)
3249 return NULL;
3251 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
3252 mpz_cmp_si (x->value.integer,
3253 LIBERROR_EOR) == 0);
3257 gfc_expr *
3258 gfc_simplify_isnan (gfc_expr *x)
3260 if (x->expr_type != EXPR_CONSTANT)
3261 return NULL;
3263 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
3264 mpfr_nan_p (x->value.real));
3268 /* Performs a shift on its first argument. Depending on the last
3269 argument, the shift can be arithmetic, i.e. with filling from the
3270 left like in the SHIFTA intrinsic. */
3271 static gfc_expr *
3272 simplify_shift (gfc_expr *e, gfc_expr *s, const char *name,
3273 bool arithmetic, int direction)
3275 gfc_expr *result;
3276 int ashift, *bits, i, k, bitsize, shift;
3278 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3279 return NULL;
3281 gfc_extract_int (s, &shift);
3283 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
3284 bitsize = gfc_integer_kinds[k].bit_size;
3286 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
3288 if (shift == 0)
3290 mpz_set (result->value.integer, e->value.integer);
3291 return result;
3294 if (direction > 0 && shift < 0)
3296 /* Left shift, as in SHIFTL. */
3297 gfc_error ("Second argument of %s is negative at %L", name, &e->where);
3298 return &gfc_bad_expr;
3300 else if (direction < 0)
3302 /* Right shift, as in SHIFTR or SHIFTA. */
3303 if (shift < 0)
3305 gfc_error ("Second argument of %s is negative at %L",
3306 name, &e->where);
3307 return &gfc_bad_expr;
3310 shift = -shift;
3313 ashift = (shift >= 0 ? shift : -shift);
3315 if (ashift > bitsize)
3317 gfc_error ("Magnitude of second argument of %s exceeds bit size "
3318 "at %L", name, &e->where);
3319 return &gfc_bad_expr;
3322 bits = XCNEWVEC (int, bitsize);
3324 for (i = 0; i < bitsize; i++)
3325 bits[i] = mpz_tstbit (e->value.integer, i);
3327 if (shift > 0)
3329 /* Left shift. */
3330 for (i = 0; i < shift; i++)
3331 mpz_clrbit (result->value.integer, i);
3333 for (i = 0; i < bitsize - shift; i++)
3335 if (bits[i] == 0)
3336 mpz_clrbit (result->value.integer, i + shift);
3337 else
3338 mpz_setbit (result->value.integer, i + shift);
3341 else
3343 /* Right shift. */
3344 if (arithmetic && bits[bitsize - 1])
3345 for (i = bitsize - 1; i >= bitsize - ashift; i--)
3346 mpz_setbit (result->value.integer, i);
3347 else
3348 for (i = bitsize - 1; i >= bitsize - ashift; i--)
3349 mpz_clrbit (result->value.integer, i);
3351 for (i = bitsize - 1; i >= ashift; i--)
3353 if (bits[i] == 0)
3354 mpz_clrbit (result->value.integer, i - ashift);
3355 else
3356 mpz_setbit (result->value.integer, i - ashift);
3360 gfc_convert_mpz_to_signed (result->value.integer, bitsize);
3361 free (bits);
3363 return result;
3367 gfc_expr *
3368 gfc_simplify_ishft (gfc_expr *e, gfc_expr *s)
3370 return simplify_shift (e, s, "ISHFT", false, 0);
3374 gfc_expr *
3375 gfc_simplify_lshift (gfc_expr *e, gfc_expr *s)
3377 return simplify_shift (e, s, "LSHIFT", false, 1);
3381 gfc_expr *
3382 gfc_simplify_rshift (gfc_expr *e, gfc_expr *s)
3384 return simplify_shift (e, s, "RSHIFT", true, -1);
3388 gfc_expr *
3389 gfc_simplify_shifta (gfc_expr *e, gfc_expr *s)
3391 return simplify_shift (e, s, "SHIFTA", true, -1);
3395 gfc_expr *
3396 gfc_simplify_shiftl (gfc_expr *e, gfc_expr *s)
3398 return simplify_shift (e, s, "SHIFTL", false, 1);
3402 gfc_expr *
3403 gfc_simplify_shiftr (gfc_expr *e, gfc_expr *s)
3405 return simplify_shift (e, s, "SHIFTR", false, -1);
3409 gfc_expr *
3410 gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
3412 gfc_expr *result;
3413 int shift, ashift, isize, ssize, delta, k;
3414 int i, *bits;
3416 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3417 return NULL;
3419 gfc_extract_int (s, &shift);
3421 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3422 isize = gfc_integer_kinds[k].bit_size;
3424 if (sz != NULL)
3426 if (sz->expr_type != EXPR_CONSTANT)
3427 return NULL;
3429 gfc_extract_int (sz, &ssize);
3431 else
3432 ssize = isize;
3434 if (shift >= 0)
3435 ashift = shift;
3436 else
3437 ashift = -shift;
3439 if (ashift > ssize)
3441 if (sz == NULL)
3442 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3443 "BIT_SIZE of first argument at %C");
3444 else
3445 gfc_error ("Absolute value of SHIFT shall be less than or equal "
3446 "to SIZE at %C");
3447 return &gfc_bad_expr;
3450 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
3452 mpz_set (result->value.integer, e->value.integer);
3454 if (shift == 0)
3455 return result;
3457 convert_mpz_to_unsigned (result->value.integer, isize);
3459 bits = XCNEWVEC (int, ssize);
3461 for (i = 0; i < ssize; i++)
3462 bits[i] = mpz_tstbit (e->value.integer, i);
3464 delta = ssize - ashift;
3466 if (shift > 0)
3468 for (i = 0; i < delta; i++)
3470 if (bits[i] == 0)
3471 mpz_clrbit (result->value.integer, i + shift);
3472 else
3473 mpz_setbit (result->value.integer, i + shift);
3476 for (i = delta; i < ssize; i++)
3478 if (bits[i] == 0)
3479 mpz_clrbit (result->value.integer, i - delta);
3480 else
3481 mpz_setbit (result->value.integer, i - delta);
3484 else
3486 for (i = 0; i < ashift; i++)
3488 if (bits[i] == 0)
3489 mpz_clrbit (result->value.integer, i + delta);
3490 else
3491 mpz_setbit (result->value.integer, i + delta);
3494 for (i = ashift; i < ssize; i++)
3496 if (bits[i] == 0)
3497 mpz_clrbit (result->value.integer, i + shift);
3498 else
3499 mpz_setbit (result->value.integer, i + shift);
3503 gfc_convert_mpz_to_signed (result->value.integer, isize);
3505 free (bits);
3506 return result;
3510 gfc_expr *
3511 gfc_simplify_kind (gfc_expr *e)
3513 return gfc_get_int_expr (gfc_default_integer_kind, NULL, e->ts.kind);
3517 static gfc_expr *
3518 simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper,
3519 gfc_array_spec *as, gfc_ref *ref, bool coarray)
3521 gfc_expr *l, *u, *result;
3522 int k;
3524 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
3525 gfc_default_integer_kind);
3526 if (k == -1)
3527 return &gfc_bad_expr;
3529 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
3531 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
3532 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
3533 if (!coarray && array->expr_type != EXPR_VARIABLE)
3535 if (upper)
3537 gfc_expr* dim = result;
3538 mpz_set_si (dim->value.integer, d);
3540 result = simplify_size (array, dim, k);
3541 gfc_free_expr (dim);
3542 if (!result)
3543 goto returnNull;
3545 else
3546 mpz_set_si (result->value.integer, 1);
3548 goto done;
3551 /* Otherwise, we have a variable expression. */
3552 gcc_assert (array->expr_type == EXPR_VARIABLE);
3553 gcc_assert (as);
3555 if (!gfc_resolve_array_spec (as, 0))
3556 return NULL;
3558 /* The last dimension of an assumed-size array is special. */
3559 if ((!coarray && d == as->rank && as->type == AS_ASSUMED_SIZE && !upper)
3560 || (coarray && d == as->rank + as->corank
3561 && (!upper || flag_coarray == GFC_FCOARRAY_SINGLE)))
3563 if (as->lower[d-1]->expr_type == EXPR_CONSTANT)
3565 gfc_free_expr (result);
3566 return gfc_copy_expr (as->lower[d-1]);
3569 goto returnNull;
3572 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
3574 /* Then, we need to know the extent of the given dimension. */
3575 if (coarray || (ref->u.ar.type == AR_FULL && !ref->next))
3577 gfc_expr *declared_bound;
3578 int empty_bound;
3579 bool constant_lbound, constant_ubound;
3581 l = as->lower[d-1];
3582 u = as->upper[d-1];
3584 gcc_assert (l != NULL);
3586 constant_lbound = l->expr_type == EXPR_CONSTANT;
3587 constant_ubound = u && u->expr_type == EXPR_CONSTANT;
3589 empty_bound = upper ? 0 : 1;
3590 declared_bound = upper ? u : l;
3592 if ((!upper && !constant_lbound)
3593 || (upper && !constant_ubound))
3594 goto returnNull;
3596 if (!coarray)
3598 /* For {L,U}BOUND, the value depends on whether the array
3599 is empty. We can nevertheless simplify if the declared bound
3600 has the same value as that of an empty array, in which case
3601 the result isn't dependent on the array emptyness. */
3602 if (mpz_cmp_si (declared_bound->value.integer, empty_bound) == 0)
3603 mpz_set_si (result->value.integer, empty_bound);
3604 else if (!constant_lbound || !constant_ubound)
3605 /* Array emptyness can't be determined, we can't simplify. */
3606 goto returnNull;
3607 else if (mpz_cmp (l->value.integer, u->value.integer) > 0)
3608 mpz_set_si (result->value.integer, empty_bound);
3609 else
3610 mpz_set (result->value.integer, declared_bound->value.integer);
3612 else
3613 mpz_set (result->value.integer, declared_bound->value.integer);
3615 else
3617 if (upper)
3619 if (!gfc_ref_dimen_size (&ref->u.ar, d - 1, &result->value.integer, NULL))
3620 goto returnNull;
3622 else
3623 mpz_set_si (result->value.integer, (long int) 1);
3626 done:
3627 return range_check (result, upper ? "UBOUND" : "LBOUND");
3629 returnNull:
3630 gfc_free_expr (result);
3631 return NULL;
3635 static gfc_expr *
3636 simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3638 gfc_ref *ref;
3639 gfc_array_spec *as;
3640 int d;
3642 if (array->ts.type == BT_CLASS)
3643 return NULL;
3645 if (array->expr_type != EXPR_VARIABLE)
3647 as = NULL;
3648 ref = NULL;
3649 goto done;
3652 /* Follow any component references. */
3653 as = array->symtree->n.sym->as;
3654 for (ref = array->ref; ref; ref = ref->next)
3656 switch (ref->type)
3658 case REF_ARRAY:
3659 switch (ref->u.ar.type)
3661 case AR_ELEMENT:
3662 as = NULL;
3663 continue;
3665 case AR_FULL:
3666 /* We're done because 'as' has already been set in the
3667 previous iteration. */
3668 goto done;
3670 case AR_UNKNOWN:
3671 return NULL;
3673 case AR_SECTION:
3674 as = ref->u.ar.as;
3675 goto done;
3678 gcc_unreachable ();
3680 case REF_COMPONENT:
3681 as = ref->u.c.component->as;
3682 continue;
3684 case REF_SUBSTRING:
3685 continue;
3689 gcc_unreachable ();
3691 done:
3693 if (as && (as->type == AS_DEFERRED || as->type == AS_ASSUMED_RANK
3694 || (as->type == AS_ASSUMED_SHAPE && upper)))
3695 return NULL;
3697 gcc_assert (!as
3698 || (as->type != AS_DEFERRED
3699 && array->expr_type == EXPR_VARIABLE
3700 && !gfc_expr_attr (array).allocatable
3701 && !gfc_expr_attr (array).pointer));
3703 if (dim == NULL)
3705 /* Multi-dimensional bounds. */
3706 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3707 gfc_expr *e;
3708 int k;
3710 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
3711 if (upper && as && as->type == AS_ASSUMED_SIZE)
3713 /* An error message will be emitted in
3714 check_assumed_size_reference (resolve.c). */
3715 return &gfc_bad_expr;
3718 /* Simplify the bounds for each dimension. */
3719 for (d = 0; d < array->rank; d++)
3721 bounds[d] = simplify_bound_dim (array, kind, d + 1, upper, as, ref,
3722 false);
3723 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3725 int j;
3727 for (j = 0; j < d; j++)
3728 gfc_free_expr (bounds[j]);
3729 return bounds[d];
3733 /* Allocate the result expression. */
3734 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
3735 gfc_default_integer_kind);
3736 if (k == -1)
3737 return &gfc_bad_expr;
3739 e = gfc_get_array_expr (BT_INTEGER, k, &array->where);
3741 /* The result is a rank 1 array; its size is the rank of the first
3742 argument to {L,U}BOUND. */
3743 e->rank = 1;
3744 e->shape = gfc_get_shape (1);
3745 mpz_init_set_ui (e->shape[0], array->rank);
3747 /* Create the constructor for this array. */
3748 for (d = 0; d < array->rank; d++)
3749 gfc_constructor_append_expr (&e->value.constructor,
3750 bounds[d], &e->where);
3752 return e;
3754 else
3756 /* A DIM argument is specified. */
3757 if (dim->expr_type != EXPR_CONSTANT)
3758 return NULL;
3760 d = mpz_get_si (dim->value.integer);
3762 if ((d < 1 || d > array->rank)
3763 || (d == array->rank && as && as->type == AS_ASSUMED_SIZE && upper))
3765 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3766 return &gfc_bad_expr;
3769 if (as && as->type == AS_ASSUMED_RANK)
3770 return NULL;
3772 return simplify_bound_dim (array, kind, d, upper, as, ref, false);
3777 static gfc_expr *
3778 simplify_cobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3780 gfc_ref *ref;
3781 gfc_array_spec *as;
3782 int d;
3784 if (array->expr_type != EXPR_VARIABLE)
3785 return NULL;
3787 /* Follow any component references. */
3788 as = (array->ts.type == BT_CLASS && array->ts.u.derived->components)
3789 ? array->ts.u.derived->components->as
3790 : array->symtree->n.sym->as;
3791 for (ref = array->ref; ref; ref = ref->next)
3793 switch (ref->type)
3795 case REF_ARRAY:
3796 switch (ref->u.ar.type)
3798 case AR_ELEMENT:
3799 if (ref->u.ar.as->corank > 0)
3801 gcc_assert (as == ref->u.ar.as);
3802 goto done;
3804 as = NULL;
3805 continue;
3807 case AR_FULL:
3808 /* We're done because 'as' has already been set in the
3809 previous iteration. */
3810 goto done;
3812 case AR_UNKNOWN:
3813 return NULL;
3815 case AR_SECTION:
3816 as = ref->u.ar.as;
3817 goto done;
3820 gcc_unreachable ();
3822 case REF_COMPONENT:
3823 as = ref->u.c.component->as;
3824 continue;
3826 case REF_SUBSTRING:
3827 continue;
3831 if (!as)
3832 gcc_unreachable ();
3834 done:
3836 if (as->cotype == AS_DEFERRED || as->cotype == AS_ASSUMED_SHAPE)
3837 return NULL;
3839 if (dim == NULL)
3841 /* Multi-dimensional cobounds. */
3842 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3843 gfc_expr *e;
3844 int k;
3846 /* Simplify the cobounds for each dimension. */
3847 for (d = 0; d < as->corank; d++)
3849 bounds[d] = simplify_bound_dim (array, kind, d + 1 + as->rank,
3850 upper, as, ref, true);
3851 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3853 int j;
3855 for (j = 0; j < d; j++)
3856 gfc_free_expr (bounds[j]);
3857 return bounds[d];
3861 /* Allocate the result expression. */
3862 e = gfc_get_expr ();
3863 e->where = array->where;
3864 e->expr_type = EXPR_ARRAY;
3865 e->ts.type = BT_INTEGER;
3866 k = get_kind (BT_INTEGER, kind, upper ? "UCOBOUND" : "LCOBOUND",
3867 gfc_default_integer_kind);
3868 if (k == -1)
3870 gfc_free_expr (e);
3871 return &gfc_bad_expr;
3873 e->ts.kind = k;
3875 /* The result is a rank 1 array; its size is the rank of the first
3876 argument to {L,U}COBOUND. */
3877 e->rank = 1;
3878 e->shape = gfc_get_shape (1);
3879 mpz_init_set_ui (e->shape[0], as->corank);
3881 /* Create the constructor for this array. */
3882 for (d = 0; d < as->corank; d++)
3883 gfc_constructor_append_expr (&e->value.constructor,
3884 bounds[d], &e->where);
3885 return e;
3887 else
3889 /* A DIM argument is specified. */
3890 if (dim->expr_type != EXPR_CONSTANT)
3891 return NULL;
3893 d = mpz_get_si (dim->value.integer);
3895 if (d < 1 || d > as->corank)
3897 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3898 return &gfc_bad_expr;
3901 return simplify_bound_dim (array, kind, d+as->rank, upper, as, ref, true);
3906 gfc_expr *
3907 gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3909 return simplify_bound (array, dim, kind, 0);
3913 gfc_expr *
3914 gfc_simplify_lcobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3916 return simplify_cobound (array, dim, kind, 0);
3919 gfc_expr *
3920 gfc_simplify_leadz (gfc_expr *e)
3922 unsigned long lz, bs;
3923 int i;
3925 if (e->expr_type != EXPR_CONSTANT)
3926 return NULL;
3928 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3929 bs = gfc_integer_kinds[i].bit_size;
3930 if (mpz_cmp_si (e->value.integer, 0) == 0)
3931 lz = bs;
3932 else if (mpz_cmp_si (e->value.integer, 0) < 0)
3933 lz = 0;
3934 else
3935 lz = bs - mpz_sizeinbase (e->value.integer, 2);
3937 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, lz);
3941 gfc_expr *
3942 gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
3944 gfc_expr *result;
3945 int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind);
3947 if (k == -1)
3948 return &gfc_bad_expr;
3950 if (e->expr_type == EXPR_CONSTANT)
3952 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3953 mpz_set_si (result->value.integer, e->value.character.length);
3954 return range_check (result, "LEN");
3956 else if (e->ts.u.cl != NULL && e->ts.u.cl->length != NULL
3957 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT
3958 && e->ts.u.cl->length->ts.type == BT_INTEGER)
3960 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3961 mpz_set (result->value.integer, e->ts.u.cl->length->value.integer);
3962 return range_check (result, "LEN");
3964 else if (e->expr_type == EXPR_VARIABLE && e->ts.type == BT_CHARACTER
3965 && e->symtree->n.sym
3966 && e->symtree->n.sym->ts.type != BT_DERIVED
3967 && e->symtree->n.sym->assoc && e->symtree->n.sym->assoc->target
3968 && e->symtree->n.sym->assoc->target->ts.type == BT_DERIVED
3969 && e->symtree->n.sym->assoc->target->symtree->n.sym
3970 && UNLIMITED_POLY (e->symtree->n.sym->assoc->target->symtree->n.sym))
3972 /* The expression in assoc->target points to a ref to the _data component
3973 of the unlimited polymorphic entity. To get the _len component the last
3974 _data ref needs to be stripped and a ref to the _len component added. */
3975 return gfc_get_len_component (e->symtree->n.sym->assoc->target);
3976 else
3977 return NULL;
3981 gfc_expr *
3982 gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
3984 gfc_expr *result;
3985 int count, len, i;
3986 int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind);
3988 if (k == -1)
3989 return &gfc_bad_expr;
3991 if (e->expr_type != EXPR_CONSTANT)
3992 return NULL;
3994 len = e->value.character.length;
3995 for (count = 0, i = 1; i <= len; i++)
3996 if (e->value.character.string[len - i] == ' ')
3997 count++;
3998 else
3999 break;
4001 result = gfc_get_int_expr (k, &e->where, len - count);
4002 return range_check (result, "LEN_TRIM");
4005 gfc_expr *
4006 gfc_simplify_lgamma (gfc_expr *x)
4008 gfc_expr *result;
4009 int sg;
4011 if (x->expr_type != EXPR_CONSTANT)
4012 return NULL;
4014 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
4015 mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE);
4017 return range_check (result, "LGAMMA");
4021 gfc_expr *
4022 gfc_simplify_lge (gfc_expr *a, gfc_expr *b)
4024 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
4025 return NULL;
4027 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
4028 gfc_compare_string (a, b) >= 0);
4032 gfc_expr *
4033 gfc_simplify_lgt (gfc_expr *a, gfc_expr *b)
4035 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
4036 return NULL;
4038 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
4039 gfc_compare_string (a, b) > 0);
4043 gfc_expr *
4044 gfc_simplify_lle (gfc_expr *a, gfc_expr *b)
4046 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
4047 return NULL;
4049 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
4050 gfc_compare_string (a, b) <= 0);
4054 gfc_expr *
4055 gfc_simplify_llt (gfc_expr *a, gfc_expr *b)
4057 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
4058 return NULL;
4060 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
4061 gfc_compare_string (a, b) < 0);
4065 gfc_expr *
4066 gfc_simplify_log (gfc_expr *x)
4068 gfc_expr *result;
4070 if (x->expr_type != EXPR_CONSTANT)
4071 return NULL;
4073 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
4075 switch (x->ts.type)
4077 case BT_REAL:
4078 if (mpfr_sgn (x->value.real) <= 0)
4080 gfc_error ("Argument of LOG at %L cannot be less than or equal "
4081 "to zero", &x->where);
4082 gfc_free_expr (result);
4083 return &gfc_bad_expr;
4086 mpfr_log (result->value.real, x->value.real, GFC_RND_MODE);
4087 break;
4089 case BT_COMPLEX:
4090 if (mpfr_zero_p (mpc_realref (x->value.complex))
4091 && mpfr_zero_p (mpc_imagref (x->value.complex)))
4093 gfc_error ("Complex argument of LOG at %L cannot be zero",
4094 &x->where);
4095 gfc_free_expr (result);
4096 return &gfc_bad_expr;
4099 gfc_set_model_kind (x->ts.kind);
4100 mpc_log (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
4101 break;
4103 default:
4104 gfc_internal_error ("gfc_simplify_log: bad type");
4107 return range_check (result, "LOG");
4111 gfc_expr *
4112 gfc_simplify_log10 (gfc_expr *x)
4114 gfc_expr *result;
4116 if (x->expr_type != EXPR_CONSTANT)
4117 return NULL;
4119 if (mpfr_sgn (x->value.real) <= 0)
4121 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
4122 "to zero", &x->where);
4123 return &gfc_bad_expr;
4126 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
4127 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
4129 return range_check (result, "LOG10");
4133 gfc_expr *
4134 gfc_simplify_logical (gfc_expr *e, gfc_expr *k)
4136 int kind;
4138 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
4139 if (kind < 0)
4140 return &gfc_bad_expr;
4142 if (e->expr_type != EXPR_CONSTANT)
4143 return NULL;
4145 return gfc_get_logical_expr (kind, &e->where, e->value.logical);
4149 gfc_expr*
4150 gfc_simplify_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
4152 gfc_expr *result;
4153 int row, result_rows, col, result_columns;
4154 int stride_a, offset_a, stride_b, offset_b;
4156 if (!is_constant_array_expr (matrix_a)
4157 || !is_constant_array_expr (matrix_b))
4158 return NULL;
4160 gcc_assert (gfc_compare_types (&matrix_a->ts, &matrix_b->ts));
4161 result = gfc_get_array_expr (matrix_a->ts.type,
4162 matrix_a->ts.kind,
4163 &matrix_a->where);
4165 if (matrix_a->rank == 1 && matrix_b->rank == 2)
4167 result_rows = 1;
4168 result_columns = mpz_get_si (matrix_b->shape[1]);
4169 stride_a = 1;
4170 stride_b = mpz_get_si (matrix_b->shape[0]);
4172 result->rank = 1;
4173 result->shape = gfc_get_shape (result->rank);
4174 mpz_init_set_si (result->shape[0], result_columns);
4176 else if (matrix_a->rank == 2 && matrix_b->rank == 1)
4178 result_rows = mpz_get_si (matrix_a->shape[0]);
4179 result_columns = 1;
4180 stride_a = mpz_get_si (matrix_a->shape[0]);
4181 stride_b = 1;
4183 result->rank = 1;
4184 result->shape = gfc_get_shape (result->rank);
4185 mpz_init_set_si (result->shape[0], result_rows);
4187 else if (matrix_a->rank == 2 && matrix_b->rank == 2)
4189 result_rows = mpz_get_si (matrix_a->shape[0]);
4190 result_columns = mpz_get_si (matrix_b->shape[1]);
4191 stride_a = mpz_get_si (matrix_a->shape[0]);
4192 stride_b = mpz_get_si (matrix_b->shape[0]);
4194 result->rank = 2;
4195 result->shape = gfc_get_shape (result->rank);
4196 mpz_init_set_si (result->shape[0], result_rows);
4197 mpz_init_set_si (result->shape[1], result_columns);
4199 else
4200 gcc_unreachable();
4202 offset_a = offset_b = 0;
4203 for (col = 0; col < result_columns; ++col)
4205 offset_a = 0;
4207 for (row = 0; row < result_rows; ++row)
4209 gfc_expr *e = compute_dot_product (matrix_a, stride_a, offset_a,
4210 matrix_b, 1, offset_b, false);
4211 gfc_constructor_append_expr (&result->value.constructor,
4212 e, NULL);
4214 offset_a += 1;
4217 offset_b += stride_b;
4220 return result;
4224 gfc_expr *
4225 gfc_simplify_maskr (gfc_expr *i, gfc_expr *kind_arg)
4227 gfc_expr *result;
4228 int kind, arg, k;
4229 const char *s;
4231 if (i->expr_type != EXPR_CONSTANT)
4232 return NULL;
4234 kind = get_kind (BT_INTEGER, kind_arg, "MASKR", gfc_default_integer_kind);
4235 if (kind == -1)
4236 return &gfc_bad_expr;
4237 k = gfc_validate_kind (BT_INTEGER, kind, false);
4239 s = gfc_extract_int (i, &arg);
4240 gcc_assert (!s);
4242 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
4244 /* MASKR(n) = 2^n - 1 */
4245 mpz_set_ui (result->value.integer, 1);
4246 mpz_mul_2exp (result->value.integer, result->value.integer, arg);
4247 mpz_sub_ui (result->value.integer, result->value.integer, 1);
4249 gfc_convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
4251 return result;
4255 gfc_expr *
4256 gfc_simplify_maskl (gfc_expr *i, gfc_expr *kind_arg)
4258 gfc_expr *result;
4259 int kind, arg, k;
4260 const char *s;
4261 mpz_t z;
4263 if (i->expr_type != EXPR_CONSTANT)
4264 return NULL;
4266 kind = get_kind (BT_INTEGER, kind_arg, "MASKL", gfc_default_integer_kind);
4267 if (kind == -1)
4268 return &gfc_bad_expr;
4269 k = gfc_validate_kind (BT_INTEGER, kind, false);
4271 s = gfc_extract_int (i, &arg);
4272 gcc_assert (!s);
4274 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
4276 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
4277 mpz_init_set_ui (z, 1);
4278 mpz_mul_2exp (z, z, gfc_integer_kinds[k].bit_size);
4279 mpz_set_ui (result->value.integer, 1);
4280 mpz_mul_2exp (result->value.integer, result->value.integer,
4281 gfc_integer_kinds[k].bit_size - arg);
4282 mpz_sub (result->value.integer, z, result->value.integer);
4283 mpz_clear (z);
4285 gfc_convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
4287 return result;
4291 gfc_expr *
4292 gfc_simplify_merge (gfc_expr *tsource, gfc_expr *fsource, gfc_expr *mask)
4294 gfc_expr * result;
4295 gfc_constructor *tsource_ctor, *fsource_ctor, *mask_ctor;
4297 if (mask->expr_type == EXPR_CONSTANT)
4298 return gfc_get_parentheses (gfc_copy_expr (mask->value.logical
4299 ? tsource : fsource));
4301 if (!mask->rank || !is_constant_array_expr (mask)
4302 || !is_constant_array_expr (tsource) || !is_constant_array_expr (fsource))
4303 return NULL;
4305 result = gfc_get_array_expr (tsource->ts.type, tsource->ts.kind,
4306 &tsource->where);
4307 if (tsource->ts.type == BT_DERIVED)
4308 result->ts.u.derived = tsource->ts.u.derived;
4309 else if (tsource->ts.type == BT_CHARACTER)
4310 result->ts.u.cl = tsource->ts.u.cl;
4312 tsource_ctor = gfc_constructor_first (tsource->value.constructor);
4313 fsource_ctor = gfc_constructor_first (fsource->value.constructor);
4314 mask_ctor = gfc_constructor_first (mask->value.constructor);
4316 while (mask_ctor)
4318 if (mask_ctor->expr->value.logical)
4319 gfc_constructor_append_expr (&result->value.constructor,
4320 gfc_copy_expr (tsource_ctor->expr),
4321 NULL);
4322 else
4323 gfc_constructor_append_expr (&result->value.constructor,
4324 gfc_copy_expr (fsource_ctor->expr),
4325 NULL);
4326 tsource_ctor = gfc_constructor_next (tsource_ctor);
4327 fsource_ctor = gfc_constructor_next (fsource_ctor);
4328 mask_ctor = gfc_constructor_next (mask_ctor);
4331 result->shape = gfc_get_shape (1);
4332 gfc_array_size (result, &result->shape[0]);
4334 return result;
4338 gfc_expr *
4339 gfc_simplify_merge_bits (gfc_expr *i, gfc_expr *j, gfc_expr *mask_expr)
4341 mpz_t arg1, arg2, mask;
4342 gfc_expr *result;
4344 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT
4345 || mask_expr->expr_type != EXPR_CONSTANT)
4346 return NULL;
4348 result = gfc_get_constant_expr (BT_INTEGER, i->ts.kind, &i->where);
4350 /* Convert all argument to unsigned. */
4351 mpz_init_set (arg1, i->value.integer);
4352 mpz_init_set (arg2, j->value.integer);
4353 mpz_init_set (mask, mask_expr->value.integer);
4355 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
4356 mpz_and (arg1, arg1, mask);
4357 mpz_com (mask, mask);
4358 mpz_and (arg2, arg2, mask);
4359 mpz_ior (result->value.integer, arg1, arg2);
4361 mpz_clear (arg1);
4362 mpz_clear (arg2);
4363 mpz_clear (mask);
4365 return result;
4369 /* Selects between current value and extremum for simplify_min_max
4370 and simplify_minval_maxval. */
4371 static void
4372 min_max_choose (gfc_expr *arg, gfc_expr *extremum, int sign)
4374 switch (arg->ts.type)
4376 case BT_INTEGER:
4377 if (mpz_cmp (arg->value.integer,
4378 extremum->value.integer) * sign > 0)
4379 mpz_set (extremum->value.integer, arg->value.integer);
4380 break;
4382 case BT_REAL:
4383 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
4384 if (sign > 0)
4385 mpfr_max (extremum->value.real, extremum->value.real,
4386 arg->value.real, GFC_RND_MODE);
4387 else
4388 mpfr_min (extremum->value.real, extremum->value.real,
4389 arg->value.real, GFC_RND_MODE);
4390 break;
4392 case BT_CHARACTER:
4393 #define LENGTH(x) ((x)->value.character.length)
4394 #define STRING(x) ((x)->value.character.string)
4395 if (LENGTH (extremum) < LENGTH(arg))
4397 gfc_char_t *tmp = STRING(extremum);
4399 STRING(extremum) = gfc_get_wide_string (LENGTH(arg) + 1);
4400 memcpy (STRING(extremum), tmp,
4401 LENGTH(extremum) * sizeof (gfc_char_t));
4402 gfc_wide_memset (&STRING(extremum)[LENGTH(extremum)], ' ',
4403 LENGTH(arg) - LENGTH(extremum));
4404 STRING(extremum)[LENGTH(arg)] = '\0'; /* For debugger */
4405 LENGTH(extremum) = LENGTH(arg);
4406 free (tmp);
4409 if (gfc_compare_string (arg, extremum) * sign > 0)
4411 free (STRING(extremum));
4412 STRING(extremum) = gfc_get_wide_string (LENGTH(extremum) + 1);
4413 memcpy (STRING(extremum), STRING(arg),
4414 LENGTH(arg) * sizeof (gfc_char_t));
4415 gfc_wide_memset (&STRING(extremum)[LENGTH(arg)], ' ',
4416 LENGTH(extremum) - LENGTH(arg));
4417 STRING(extremum)[LENGTH(extremum)] = '\0'; /* For debugger */
4419 #undef LENGTH
4420 #undef STRING
4421 break;
4423 default:
4424 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
4429 /* This function is special since MAX() can take any number of
4430 arguments. The simplified expression is a rewritten version of the
4431 argument list containing at most one constant element. Other
4432 constant elements are deleted. Because the argument list has
4433 already been checked, this function always succeeds. sign is 1 for
4434 MAX(), -1 for MIN(). */
4436 static gfc_expr *
4437 simplify_min_max (gfc_expr *expr, int sign)
4439 gfc_actual_arglist *arg, *last, *extremum;
4440 gfc_intrinsic_sym * specific;
4442 last = NULL;
4443 extremum = NULL;
4444 specific = expr->value.function.isym;
4446 arg = expr->value.function.actual;
4448 for (; arg; last = arg, arg = arg->next)
4450 if (arg->expr->expr_type != EXPR_CONSTANT)
4451 continue;
4453 if (extremum == NULL)
4455 extremum = arg;
4456 continue;
4459 min_max_choose (arg->expr, extremum->expr, sign);
4461 /* Delete the extra constant argument. */
4462 last->next = arg->next;
4464 arg->next = NULL;
4465 gfc_free_actual_arglist (arg);
4466 arg = last;
4469 /* If there is one value left, replace the function call with the
4470 expression. */
4471 if (expr->value.function.actual->next != NULL)
4472 return NULL;
4474 /* Convert to the correct type and kind. */
4475 if (expr->ts.type != BT_UNKNOWN)
4476 return gfc_convert_constant (expr->value.function.actual->expr,
4477 expr->ts.type, expr->ts.kind);
4479 if (specific->ts.type != BT_UNKNOWN)
4480 return gfc_convert_constant (expr->value.function.actual->expr,
4481 specific->ts.type, specific->ts.kind);
4483 return gfc_copy_expr (expr->value.function.actual->expr);
4487 gfc_expr *
4488 gfc_simplify_min (gfc_expr *e)
4490 return simplify_min_max (e, -1);
4494 gfc_expr *
4495 gfc_simplify_max (gfc_expr *e)
4497 return simplify_min_max (e, 1);
4501 /* This is a simplified version of simplify_min_max to provide
4502 simplification of minval and maxval for a vector. */
4504 static gfc_expr *
4505 simplify_minval_maxval (gfc_expr *expr, int sign)
4507 gfc_constructor *c, *extremum;
4508 gfc_intrinsic_sym * specific;
4510 extremum = NULL;
4511 specific = expr->value.function.isym;
4513 for (c = gfc_constructor_first (expr->value.constructor);
4514 c; c = gfc_constructor_next (c))
4516 if (c->expr->expr_type != EXPR_CONSTANT)
4517 return NULL;
4519 if (extremum == NULL)
4521 extremum = c;
4522 continue;
4525 min_max_choose (c->expr, extremum->expr, sign);
4528 if (extremum == NULL)
4529 return NULL;
4531 /* Convert to the correct type and kind. */
4532 if (expr->ts.type != BT_UNKNOWN)
4533 return gfc_convert_constant (extremum->expr,
4534 expr->ts.type, expr->ts.kind);
4536 if (specific->ts.type != BT_UNKNOWN)
4537 return gfc_convert_constant (extremum->expr,
4538 specific->ts.type, specific->ts.kind);
4540 return gfc_copy_expr (extremum->expr);
4544 gfc_expr *
4545 gfc_simplify_minval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
4547 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
4548 return NULL;
4550 return simplify_minval_maxval (array, -1);
4554 gfc_expr *
4555 gfc_simplify_maxval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
4557 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
4558 return NULL;
4560 return simplify_minval_maxval (array, 1);
4564 gfc_expr *
4565 gfc_simplify_maxexponent (gfc_expr *x)
4567 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4568 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
4569 gfc_real_kinds[i].max_exponent);
4573 gfc_expr *
4574 gfc_simplify_minexponent (gfc_expr *x)
4576 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4577 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
4578 gfc_real_kinds[i].min_exponent);
4582 gfc_expr *
4583 gfc_simplify_mod (gfc_expr *a, gfc_expr *p)
4585 gfc_expr *result;
4586 int kind;
4588 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
4589 return NULL;
4591 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
4592 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
4594 switch (a->ts.type)
4596 case BT_INTEGER:
4597 if (mpz_cmp_ui (p->value.integer, 0) == 0)
4599 /* Result is processor-dependent. */
4600 gfc_error ("Second argument MOD at %L is zero", &a->where);
4601 gfc_free_expr (result);
4602 return &gfc_bad_expr;
4604 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
4605 break;
4607 case BT_REAL:
4608 if (mpfr_cmp_ui (p->value.real, 0) == 0)
4610 /* Result is processor-dependent. */
4611 gfc_error ("Second argument of MOD at %L is zero", &p->where);
4612 gfc_free_expr (result);
4613 return &gfc_bad_expr;
4616 gfc_set_model_kind (kind);
4617 mpfr_fmod (result->value.real, a->value.real, p->value.real,
4618 GFC_RND_MODE);
4619 break;
4621 default:
4622 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
4625 return range_check (result, "MOD");
4629 gfc_expr *
4630 gfc_simplify_modulo (gfc_expr *a, gfc_expr *p)
4632 gfc_expr *result;
4633 int kind;
4635 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
4636 return NULL;
4638 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
4639 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
4641 switch (a->ts.type)
4643 case BT_INTEGER:
4644 if (mpz_cmp_ui (p->value.integer, 0) == 0)
4646 /* Result is processor-dependent. This processor just opts
4647 to not handle it at all. */
4648 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
4649 gfc_free_expr (result);
4650 return &gfc_bad_expr;
4652 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
4654 break;
4656 case BT_REAL:
4657 if (mpfr_cmp_ui (p->value.real, 0) == 0)
4659 /* Result is processor-dependent. */
4660 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
4661 gfc_free_expr (result);
4662 return &gfc_bad_expr;
4665 gfc_set_model_kind (kind);
4666 mpfr_fmod (result->value.real, a->value.real, p->value.real,
4667 GFC_RND_MODE);
4668 if (mpfr_cmp_ui (result->value.real, 0) != 0)
4670 if (mpfr_signbit (a->value.real) != mpfr_signbit (p->value.real))
4671 mpfr_add (result->value.real, result->value.real, p->value.real,
4672 GFC_RND_MODE);
4674 else
4675 mpfr_copysign (result->value.real, result->value.real,
4676 p->value.real, GFC_RND_MODE);
4677 break;
4679 default:
4680 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
4683 return range_check (result, "MODULO");
4687 gfc_expr *
4688 gfc_simplify_nearest (gfc_expr *x, gfc_expr *s)
4690 gfc_expr *result;
4691 mp_exp_t emin, emax;
4692 int kind;
4694 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
4695 return NULL;
4697 result = gfc_copy_expr (x);
4699 /* Save current values of emin and emax. */
4700 emin = mpfr_get_emin ();
4701 emax = mpfr_get_emax ();
4703 /* Set emin and emax for the current model number. */
4704 kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
4705 mpfr_set_emin ((mp_exp_t) gfc_real_kinds[kind].min_exponent -
4706 mpfr_get_prec(result->value.real) + 1);
4707 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[kind].max_exponent - 1);
4708 mpfr_check_range (result->value.real, 0, GMP_RNDU);
4710 if (mpfr_sgn (s->value.real) > 0)
4712 mpfr_nextabove (result->value.real);
4713 mpfr_subnormalize (result->value.real, 0, GMP_RNDU);
4715 else
4717 mpfr_nextbelow (result->value.real);
4718 mpfr_subnormalize (result->value.real, 0, GMP_RNDD);
4721 mpfr_set_emin (emin);
4722 mpfr_set_emax (emax);
4724 /* Only NaN can occur. Do not use range check as it gives an
4725 error for denormal numbers. */
4726 if (mpfr_nan_p (result->value.real) && flag_range_check)
4728 gfc_error ("Result of NEAREST is NaN at %L", &result->where);
4729 gfc_free_expr (result);
4730 return &gfc_bad_expr;
4733 return result;
4737 static gfc_expr *
4738 simplify_nint (const char *name, gfc_expr *e, gfc_expr *k)
4740 gfc_expr *itrunc, *result;
4741 int kind;
4743 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
4744 if (kind == -1)
4745 return &gfc_bad_expr;
4747 if (e->expr_type != EXPR_CONSTANT)
4748 return NULL;
4750 itrunc = gfc_copy_expr (e);
4751 mpfr_round (itrunc->value.real, e->value.real);
4753 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
4754 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real, &e->where);
4756 gfc_free_expr (itrunc);
4758 return range_check (result, name);
4762 gfc_expr *
4763 gfc_simplify_new_line (gfc_expr *e)
4765 gfc_expr *result;
4767 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, 1);
4768 result->value.character.string[0] = '\n';
4770 return result;
4774 gfc_expr *
4775 gfc_simplify_nint (gfc_expr *e, gfc_expr *k)
4777 return simplify_nint ("NINT", e, k);
4781 gfc_expr *
4782 gfc_simplify_idnint (gfc_expr *e)
4784 return simplify_nint ("IDNINT", e, NULL);
4788 static gfc_expr *
4789 add_squared (gfc_expr *result, gfc_expr *e)
4791 mpfr_t tmp;
4793 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
4794 gcc_assert (result->ts.type == BT_REAL
4795 && result->expr_type == EXPR_CONSTANT);
4797 gfc_set_model_kind (result->ts.kind);
4798 mpfr_init (tmp);
4799 mpfr_pow_ui (tmp, e->value.real, 2, GFC_RND_MODE);
4800 mpfr_add (result->value.real, result->value.real, tmp,
4801 GFC_RND_MODE);
4802 mpfr_clear (tmp);
4804 return result;
4808 static gfc_expr *
4809 do_sqrt (gfc_expr *result, gfc_expr *e)
4811 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
4812 gcc_assert (result->ts.type == BT_REAL
4813 && result->expr_type == EXPR_CONSTANT);
4815 mpfr_set (result->value.real, e->value.real, GFC_RND_MODE);
4816 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
4817 return result;
4821 gfc_expr *
4822 gfc_simplify_norm2 (gfc_expr *e, gfc_expr *dim)
4824 gfc_expr *result;
4826 if (!is_constant_array_expr (e)
4827 || (dim != NULL && !gfc_is_constant_expr (dim)))
4828 return NULL;
4830 result = transformational_result (e, dim, e->ts.type, e->ts.kind, &e->where);
4831 init_result_expr (result, 0, NULL);
4833 if (!dim || e->rank == 1)
4835 result = simplify_transformation_to_scalar (result, e, NULL,
4836 add_squared);
4837 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
4839 else
4840 result = simplify_transformation_to_array (result, e, dim, NULL,
4841 add_squared, &do_sqrt);
4843 return result;
4847 gfc_expr *
4848 gfc_simplify_not (gfc_expr *e)
4850 gfc_expr *result;
4852 if (e->expr_type != EXPR_CONSTANT)
4853 return NULL;
4855 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
4856 mpz_com (result->value.integer, e->value.integer);
4858 return range_check (result, "NOT");
4862 gfc_expr *
4863 gfc_simplify_null (gfc_expr *mold)
4865 gfc_expr *result;
4867 if (mold)
4869 result = gfc_copy_expr (mold);
4870 result->expr_type = EXPR_NULL;
4872 else
4873 result = gfc_get_null_expr (NULL);
4875 return result;
4879 gfc_expr *
4880 gfc_simplify_num_images (gfc_expr *distance ATTRIBUTE_UNUSED, gfc_expr *failed)
4882 gfc_expr *result;
4884 if (flag_coarray == GFC_FCOARRAY_NONE)
4886 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
4887 return &gfc_bad_expr;
4890 if (flag_coarray != GFC_FCOARRAY_SINGLE)
4891 return NULL;
4893 if (failed && failed->expr_type != EXPR_CONSTANT)
4894 return NULL;
4896 /* FIXME: gfc_current_locus is wrong. */
4897 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
4898 &gfc_current_locus);
4900 if (failed && failed->value.logical != 0)
4901 mpz_set_si (result->value.integer, 0);
4902 else
4903 mpz_set_si (result->value.integer, 1);
4905 return result;
4909 gfc_expr *
4910 gfc_simplify_or (gfc_expr *x, gfc_expr *y)
4912 gfc_expr *result;
4913 int kind;
4915 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
4916 return NULL;
4918 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
4920 switch (x->ts.type)
4922 case BT_INTEGER:
4923 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
4924 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
4925 return range_check (result, "OR");
4927 case BT_LOGICAL:
4928 return gfc_get_logical_expr (kind, &x->where,
4929 x->value.logical || y->value.logical);
4930 default:
4931 gcc_unreachable();
4936 gfc_expr *
4937 gfc_simplify_pack (gfc_expr *array, gfc_expr *mask, gfc_expr *vector)
4939 gfc_expr *result;
4940 gfc_constructor *array_ctor, *mask_ctor, *vector_ctor;
4942 if (!is_constant_array_expr (array)
4943 || !is_constant_array_expr (vector)
4944 || (!gfc_is_constant_expr (mask)
4945 && !is_constant_array_expr (mask)))
4946 return NULL;
4948 result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where);
4949 if (array->ts.type == BT_DERIVED)
4950 result->ts.u.derived = array->ts.u.derived;
4952 array_ctor = gfc_constructor_first (array->value.constructor);
4953 vector_ctor = vector
4954 ? gfc_constructor_first (vector->value.constructor)
4955 : NULL;
4957 if (mask->expr_type == EXPR_CONSTANT
4958 && mask->value.logical)
4960 /* Copy all elements of ARRAY to RESULT. */
4961 while (array_ctor)
4963 gfc_constructor_append_expr (&result->value.constructor,
4964 gfc_copy_expr (array_ctor->expr),
4965 NULL);
4967 array_ctor = gfc_constructor_next (array_ctor);
4968 vector_ctor = gfc_constructor_next (vector_ctor);
4971 else if (mask->expr_type == EXPR_ARRAY)
4973 /* Copy only those elements of ARRAY to RESULT whose
4974 MASK equals .TRUE.. */
4975 mask_ctor = gfc_constructor_first (mask->value.constructor);
4976 while (mask_ctor)
4978 if (mask_ctor->expr->value.logical)
4980 gfc_constructor_append_expr (&result->value.constructor,
4981 gfc_copy_expr (array_ctor->expr),
4982 NULL);
4983 vector_ctor = gfc_constructor_next (vector_ctor);
4986 array_ctor = gfc_constructor_next (array_ctor);
4987 mask_ctor = gfc_constructor_next (mask_ctor);
4991 /* Append any left-over elements from VECTOR to RESULT. */
4992 while (vector_ctor)
4994 gfc_constructor_append_expr (&result->value.constructor,
4995 gfc_copy_expr (vector_ctor->expr),
4996 NULL);
4997 vector_ctor = gfc_constructor_next (vector_ctor);
5000 result->shape = gfc_get_shape (1);
5001 gfc_array_size (result, &result->shape[0]);
5003 if (array->ts.type == BT_CHARACTER)
5004 result->ts.u.cl = array->ts.u.cl;
5006 return result;
5010 static gfc_expr *
5011 do_xor (gfc_expr *result, gfc_expr *e)
5013 gcc_assert (e->ts.type == BT_LOGICAL && e->expr_type == EXPR_CONSTANT);
5014 gcc_assert (result->ts.type == BT_LOGICAL
5015 && result->expr_type == EXPR_CONSTANT);
5017 result->value.logical = result->value.logical != e->value.logical;
5018 return result;
5023 gfc_expr *
5024 gfc_simplify_parity (gfc_expr *e, gfc_expr *dim)
5026 return simplify_transformation (e, dim, NULL, 0, do_xor);
5030 gfc_expr *
5031 gfc_simplify_popcnt (gfc_expr *e)
5033 int res, k;
5034 mpz_t x;
5036 if (e->expr_type != EXPR_CONSTANT)
5037 return NULL;
5039 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5041 /* Convert argument to unsigned, then count the '1' bits. */
5042 mpz_init_set (x, e->value.integer);
5043 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
5044 res = mpz_popcount (x);
5045 mpz_clear (x);
5047 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, res);
5051 gfc_expr *
5052 gfc_simplify_poppar (gfc_expr *e)
5054 gfc_expr *popcnt;
5055 const char *s;
5056 int i;
5058 if (e->expr_type != EXPR_CONSTANT)
5059 return NULL;
5061 popcnt = gfc_simplify_popcnt (e);
5062 gcc_assert (popcnt);
5064 s = gfc_extract_int (popcnt, &i);
5065 gcc_assert (!s);
5067 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i % 2);
5071 gfc_expr *
5072 gfc_simplify_precision (gfc_expr *e)
5074 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5075 return gfc_get_int_expr (gfc_default_integer_kind, &e->where,
5076 gfc_real_kinds[i].precision);
5080 gfc_expr *
5081 gfc_simplify_product (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
5083 return simplify_transformation (array, dim, mask, 1, gfc_multiply);
5087 gfc_expr *
5088 gfc_simplify_radix (gfc_expr *e)
5090 int i;
5091 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5093 switch (e->ts.type)
5095 case BT_INTEGER:
5096 i = gfc_integer_kinds[i].radix;
5097 break;
5099 case BT_REAL:
5100 i = gfc_real_kinds[i].radix;
5101 break;
5103 default:
5104 gcc_unreachable ();
5107 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
5111 gfc_expr *
5112 gfc_simplify_range (gfc_expr *e)
5114 int i;
5115 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5117 switch (e->ts.type)
5119 case BT_INTEGER:
5120 i = gfc_integer_kinds[i].range;
5121 break;
5123 case BT_REAL:
5124 case BT_COMPLEX:
5125 i = gfc_real_kinds[i].range;
5126 break;
5128 default:
5129 gcc_unreachable ();
5132 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
5136 gfc_expr *
5137 gfc_simplify_rank (gfc_expr *e)
5139 /* Assumed rank. */
5140 if (e->rank == -1)
5141 return NULL;
5143 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, e->rank);
5147 gfc_expr *
5148 gfc_simplify_real (gfc_expr *e, gfc_expr *k)
5150 gfc_expr *result = NULL;
5151 int kind;
5153 if (e->ts.type == BT_COMPLEX)
5154 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
5155 else
5156 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
5158 if (kind == -1)
5159 return &gfc_bad_expr;
5161 if (e->expr_type != EXPR_CONSTANT)
5162 return NULL;
5164 if (convert_boz (e, kind) == &gfc_bad_expr)
5165 return &gfc_bad_expr;
5167 result = gfc_convert_constant (e, BT_REAL, kind);
5168 if (result == &gfc_bad_expr)
5169 return &gfc_bad_expr;
5171 return range_check (result, "REAL");
5175 gfc_expr *
5176 gfc_simplify_realpart (gfc_expr *e)
5178 gfc_expr *result;
5180 if (e->expr_type != EXPR_CONSTANT)
5181 return NULL;
5183 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
5184 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
5186 return range_check (result, "REALPART");
5189 gfc_expr *
5190 gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
5192 gfc_expr *result;
5193 int i, j, len, ncop, nlen;
5194 mpz_t ncopies;
5195 bool have_length = false;
5197 /* If NCOPIES isn't a constant, there's nothing we can do. */
5198 if (n->expr_type != EXPR_CONSTANT)
5199 return NULL;
5201 /* If NCOPIES is negative, it's an error. */
5202 if (mpz_sgn (n->value.integer) < 0)
5204 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
5205 &n->where);
5206 return &gfc_bad_expr;
5209 /* If we don't know the character length, we can do no more. */
5210 if (e->ts.u.cl && e->ts.u.cl->length
5211 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
5213 len = mpz_get_si (e->ts.u.cl->length->value.integer);
5214 have_length = true;
5216 else if (e->expr_type == EXPR_CONSTANT
5217 && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
5219 len = e->value.character.length;
5221 else
5222 return NULL;
5224 /* If the source length is 0, any value of NCOPIES is valid
5225 and everything behaves as if NCOPIES == 0. */
5226 mpz_init (ncopies);
5227 if (len == 0)
5228 mpz_set_ui (ncopies, 0);
5229 else
5230 mpz_set (ncopies, n->value.integer);
5232 /* Check that NCOPIES isn't too large. */
5233 if (len)
5235 mpz_t max, mlen;
5236 int i;
5238 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
5239 mpz_init (max);
5240 i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
5242 if (have_length)
5244 mpz_tdiv_q (max, gfc_integer_kinds[i].huge,
5245 e->ts.u.cl->length->value.integer);
5247 else
5249 mpz_init_set_si (mlen, len);
5250 mpz_tdiv_q (max, gfc_integer_kinds[i].huge, mlen);
5251 mpz_clear (mlen);
5254 /* The check itself. */
5255 if (mpz_cmp (ncopies, max) > 0)
5257 mpz_clear (max);
5258 mpz_clear (ncopies);
5259 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
5260 &n->where);
5261 return &gfc_bad_expr;
5264 mpz_clear (max);
5266 mpz_clear (ncopies);
5268 /* For further simplification, we need the character string to be
5269 constant. */
5270 if (e->expr_type != EXPR_CONSTANT)
5271 return NULL;
5273 if (len ||
5274 (e->ts.u.cl->length &&
5275 mpz_sgn (e->ts.u.cl->length->value.integer) != 0))
5277 const char *res = gfc_extract_int (n, &ncop);
5278 gcc_assert (res == NULL);
5280 else
5281 ncop = 0;
5283 if (ncop == 0)
5284 return gfc_get_character_expr (e->ts.kind, &e->where, NULL, 0);
5286 len = e->value.character.length;
5287 nlen = ncop * len;
5289 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, nlen);
5290 for (i = 0; i < ncop; i++)
5291 for (j = 0; j < len; j++)
5292 result->value.character.string[j+i*len]= e->value.character.string[j];
5294 result->value.character.string[nlen] = '\0'; /* For debugger */
5295 return result;
5299 /* This one is a bear, but mainly has to do with shuffling elements. */
5301 gfc_expr *
5302 gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
5303 gfc_expr *pad, gfc_expr *order_exp)
5305 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
5306 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
5307 mpz_t index, size;
5308 unsigned long j;
5309 size_t nsource;
5310 gfc_expr *e, *result;
5312 /* Check that argument expression types are OK. */
5313 if (!is_constant_array_expr (source)
5314 || !is_constant_array_expr (shape_exp)
5315 || !is_constant_array_expr (pad)
5316 || !is_constant_array_expr (order_exp))
5317 return NULL;
5319 if (source->shape == NULL)
5320 return NULL;
5322 /* Proceed with simplification, unpacking the array. */
5324 mpz_init (index);
5325 rank = 0;
5327 for (;;)
5329 e = gfc_constructor_lookup_expr (shape_exp->value.constructor, rank);
5330 if (e == NULL)
5331 break;
5333 gfc_extract_int (e, &shape[rank]);
5335 gcc_assert (rank >= 0 && rank < GFC_MAX_DIMENSIONS);
5336 gcc_assert (shape[rank] >= 0);
5338 rank++;
5341 gcc_assert (rank > 0);
5343 /* Now unpack the order array if present. */
5344 if (order_exp == NULL)
5346 for (i = 0; i < rank; i++)
5347 order[i] = i;
5349 else
5351 for (i = 0; i < rank; i++)
5352 x[i] = 0;
5354 for (i = 0; i < rank; i++)
5356 e = gfc_constructor_lookup_expr (order_exp->value.constructor, i);
5357 gcc_assert (e);
5359 gfc_extract_int (e, &order[i]);
5361 gcc_assert (order[i] >= 1 && order[i] <= rank);
5362 order[i]--;
5363 gcc_assert (x[order[i]] == 0);
5364 x[order[i]] = 1;
5368 /* Count the elements in the source and padding arrays. */
5370 npad = 0;
5371 if (pad != NULL)
5373 gfc_array_size (pad, &size);
5374 npad = mpz_get_ui (size);
5375 mpz_clear (size);
5378 gfc_array_size (source, &size);
5379 nsource = mpz_get_ui (size);
5380 mpz_clear (size);
5382 /* If it weren't for that pesky permutation we could just loop
5383 through the source and round out any shortage with pad elements.
5384 But no, someone just had to have the compiler do something the
5385 user should be doing. */
5387 for (i = 0; i < rank; i++)
5388 x[i] = 0;
5390 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5391 &source->where);
5392 if (source->ts.type == BT_DERIVED)
5393 result->ts.u.derived = source->ts.u.derived;
5394 result->rank = rank;
5395 result->shape = gfc_get_shape (rank);
5396 for (i = 0; i < rank; i++)
5397 mpz_init_set_ui (result->shape[i], shape[i]);
5399 while (nsource > 0 || npad > 0)
5401 /* Figure out which element to extract. */
5402 mpz_set_ui (index, 0);
5404 for (i = rank - 1; i >= 0; i--)
5406 mpz_add_ui (index, index, x[order[i]]);
5407 if (i != 0)
5408 mpz_mul_ui (index, index, shape[order[i - 1]]);
5411 if (mpz_cmp_ui (index, INT_MAX) > 0)
5412 gfc_internal_error ("Reshaped array too large at %C");
5414 j = mpz_get_ui (index);
5416 if (j < nsource)
5417 e = gfc_constructor_lookup_expr (source->value.constructor, j);
5418 else
5420 if (npad <= 0)
5422 mpz_clear (index);
5423 return NULL;
5425 j = j - nsource;
5426 j = j % npad;
5427 e = gfc_constructor_lookup_expr (pad->value.constructor, j);
5429 gcc_assert (e);
5431 gfc_constructor_append_expr (&result->value.constructor,
5432 gfc_copy_expr (e), &e->where);
5434 /* Calculate the next element. */
5435 i = 0;
5437 inc:
5438 if (++x[i] < shape[i])
5439 continue;
5440 x[i++] = 0;
5441 if (i < rank)
5442 goto inc;
5444 break;
5447 mpz_clear (index);
5449 return result;
5453 gfc_expr *
5454 gfc_simplify_rrspacing (gfc_expr *x)
5456 gfc_expr *result;
5457 int i;
5458 long int e, p;
5460 if (x->expr_type != EXPR_CONSTANT)
5461 return NULL;
5463 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
5465 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5467 /* RRSPACING(+/- 0.0) = 0.0 */
5468 if (mpfr_zero_p (x->value.real))
5470 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5471 return result;
5474 /* RRSPACING(inf) = NaN */
5475 if (mpfr_inf_p (x->value.real))
5477 mpfr_set_nan (result->value.real);
5478 return result;
5481 /* RRSPACING(NaN) = same NaN */
5482 if (mpfr_nan_p (x->value.real))
5484 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
5485 return result;
5488 /* | x * 2**(-e) | * 2**p. */
5489 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
5490 e = - (long int) mpfr_get_exp (x->value.real);
5491 mpfr_mul_2si (result->value.real, result->value.real, e, GFC_RND_MODE);
5493 p = (long int) gfc_real_kinds[i].digits;
5494 mpfr_mul_2si (result->value.real, result->value.real, p, GFC_RND_MODE);
5496 return range_check (result, "RRSPACING");
5500 gfc_expr *
5501 gfc_simplify_scale (gfc_expr *x, gfc_expr *i)
5503 int k, neg_flag, power, exp_range;
5504 mpfr_t scale, radix;
5505 gfc_expr *result;
5507 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
5508 return NULL;
5510 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5512 if (mpfr_zero_p (x->value.real))
5514 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5515 return result;
5518 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
5520 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
5522 /* This check filters out values of i that would overflow an int. */
5523 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
5524 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
5526 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
5527 gfc_free_expr (result);
5528 return &gfc_bad_expr;
5531 /* Compute scale = radix ** power. */
5532 power = mpz_get_si (i->value.integer);
5534 if (power >= 0)
5535 neg_flag = 0;
5536 else
5538 neg_flag = 1;
5539 power = -power;
5542 gfc_set_model_kind (x->ts.kind);
5543 mpfr_init (scale);
5544 mpfr_init (radix);
5545 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
5546 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
5548 if (neg_flag)
5549 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
5550 else
5551 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
5553 mpfr_clears (scale, radix, NULL);
5555 return range_check (result, "SCALE");
5559 /* Variants of strspn and strcspn that operate on wide characters. */
5561 static size_t
5562 wide_strspn (const gfc_char_t *s1, const gfc_char_t *s2)
5564 size_t i = 0;
5565 const gfc_char_t *c;
5567 while (s1[i])
5569 for (c = s2; *c; c++)
5571 if (s1[i] == *c)
5572 break;
5574 if (*c == '\0')
5575 break;
5576 i++;
5579 return i;
5582 static size_t
5583 wide_strcspn (const gfc_char_t *s1, const gfc_char_t *s2)
5585 size_t i = 0;
5586 const gfc_char_t *c;
5588 while (s1[i])
5590 for (c = s2; *c; c++)
5592 if (s1[i] == *c)
5593 break;
5595 if (*c)
5596 break;
5597 i++;
5600 return i;
5604 gfc_expr *
5605 gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind)
5607 gfc_expr *result;
5608 int back;
5609 size_t i;
5610 size_t indx, len, lenc;
5611 int k = get_kind (BT_INTEGER, kind, "SCAN", gfc_default_integer_kind);
5613 if (k == -1)
5614 return &gfc_bad_expr;
5616 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT
5617 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
5618 return NULL;
5620 if (b != NULL && b->value.logical != 0)
5621 back = 1;
5622 else
5623 back = 0;
5625 len = e->value.character.length;
5626 lenc = c->value.character.length;
5628 if (len == 0 || lenc == 0)
5630 indx = 0;
5632 else
5634 if (back == 0)
5636 indx = wide_strcspn (e->value.character.string,
5637 c->value.character.string) + 1;
5638 if (indx > len)
5639 indx = 0;
5641 else
5643 i = 0;
5644 for (indx = len; indx > 0; indx--)
5646 for (i = 0; i < lenc; i++)
5648 if (c->value.character.string[i]
5649 == e->value.character.string[indx - 1])
5650 break;
5652 if (i < lenc)
5653 break;
5658 result = gfc_get_int_expr (k, &e->where, indx);
5659 return range_check (result, "SCAN");
5663 gfc_expr *
5664 gfc_simplify_selected_char_kind (gfc_expr *e)
5666 int kind;
5668 if (e->expr_type != EXPR_CONSTANT)
5669 return NULL;
5671 if (gfc_compare_with_Cstring (e, "ascii", false) == 0
5672 || gfc_compare_with_Cstring (e, "default", false) == 0)
5673 kind = 1;
5674 else if (gfc_compare_with_Cstring (e, "iso_10646", false) == 0)
5675 kind = 4;
5676 else
5677 kind = -1;
5679 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
5683 gfc_expr *
5684 gfc_simplify_selected_int_kind (gfc_expr *e)
5686 int i, kind, range;
5688 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
5689 return NULL;
5691 kind = INT_MAX;
5693 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
5694 if (gfc_integer_kinds[i].range >= range
5695 && gfc_integer_kinds[i].kind < kind)
5696 kind = gfc_integer_kinds[i].kind;
5698 if (kind == INT_MAX)
5699 kind = -1;
5701 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
5705 gfc_expr *
5706 gfc_simplify_selected_real_kind (gfc_expr *p, gfc_expr *q, gfc_expr *rdx)
5708 int range, precision, radix, i, kind, found_precision, found_range,
5709 found_radix;
5710 locus *loc = &gfc_current_locus;
5712 if (p == NULL)
5713 precision = 0;
5714 else
5716 if (p->expr_type != EXPR_CONSTANT
5717 || gfc_extract_int (p, &precision) != NULL)
5718 return NULL;
5719 loc = &p->where;
5722 if (q == NULL)
5723 range = 0;
5724 else
5726 if (q->expr_type != EXPR_CONSTANT
5727 || gfc_extract_int (q, &range) != NULL)
5728 return NULL;
5730 if (!loc)
5731 loc = &q->where;
5734 if (rdx == NULL)
5735 radix = 0;
5736 else
5738 if (rdx->expr_type != EXPR_CONSTANT
5739 || gfc_extract_int (rdx, &radix) != NULL)
5740 return NULL;
5742 if (!loc)
5743 loc = &rdx->where;
5746 kind = INT_MAX;
5747 found_precision = 0;
5748 found_range = 0;
5749 found_radix = 0;
5751 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
5753 if (gfc_real_kinds[i].precision >= precision)
5754 found_precision = 1;
5756 if (gfc_real_kinds[i].range >= range)
5757 found_range = 1;
5759 if (radix == 0 || gfc_real_kinds[i].radix == radix)
5760 found_radix = 1;
5762 if (gfc_real_kinds[i].precision >= precision
5763 && gfc_real_kinds[i].range >= range
5764 && (radix == 0 || gfc_real_kinds[i].radix == radix)
5765 && gfc_real_kinds[i].kind < kind)
5766 kind = gfc_real_kinds[i].kind;
5769 if (kind == INT_MAX)
5771 if (found_radix && found_range && !found_precision)
5772 kind = -1;
5773 else if (found_radix && found_precision && !found_range)
5774 kind = -2;
5775 else if (found_radix && !found_precision && !found_range)
5776 kind = -3;
5777 else if (found_radix)
5778 kind = -4;
5779 else
5780 kind = -5;
5783 return gfc_get_int_expr (gfc_default_integer_kind, loc, kind);
5787 gfc_expr *
5788 gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i)
5790 gfc_expr *result;
5791 mpfr_t exp, absv, log2, pow2, frac;
5792 unsigned long exp2;
5794 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
5795 return NULL;
5797 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5799 /* SET_EXPONENT (+/-0.0, I) = +/- 0.0
5800 SET_EXPONENT (NaN) = same NaN */
5801 if (mpfr_zero_p (x->value.real) || mpfr_nan_p (x->value.real))
5803 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
5804 return result;
5807 /* SET_EXPONENT (inf) = NaN */
5808 if (mpfr_inf_p (x->value.real))
5810 mpfr_set_nan (result->value.real);
5811 return result;
5814 gfc_set_model_kind (x->ts.kind);
5815 mpfr_init (absv);
5816 mpfr_init (log2);
5817 mpfr_init (exp);
5818 mpfr_init (pow2);
5819 mpfr_init (frac);
5821 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
5822 mpfr_log2 (log2, absv, GFC_RND_MODE);
5824 mpfr_trunc (log2, log2);
5825 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
5827 /* Old exponent value, and fraction. */
5828 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
5830 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
5832 /* New exponent. */
5833 exp2 = (unsigned long) mpz_get_d (i->value.integer);
5834 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
5836 mpfr_clears (absv, log2, pow2, frac, NULL);
5838 return range_check (result, "SET_EXPONENT");
5842 gfc_expr *
5843 gfc_simplify_shape (gfc_expr *source, gfc_expr *kind)
5845 mpz_t shape[GFC_MAX_DIMENSIONS];
5846 gfc_expr *result, *e, *f;
5847 gfc_array_ref *ar;
5848 int n;
5849 bool t;
5850 int k = get_kind (BT_INTEGER, kind, "SHAPE", gfc_default_integer_kind);
5852 if (source->rank == -1)
5853 return NULL;
5855 result = gfc_get_array_expr (BT_INTEGER, k, &source->where);
5857 if (source->rank == 0)
5858 return result;
5860 if (source->expr_type == EXPR_VARIABLE)
5862 ar = gfc_find_array_ref (source);
5863 t = gfc_array_ref_shape (ar, shape);
5865 else if (source->shape)
5867 t = true;
5868 for (n = 0; n < source->rank; n++)
5870 mpz_init (shape[n]);
5871 mpz_set (shape[n], source->shape[n]);
5874 else
5875 t = false;
5877 for (n = 0; n < source->rank; n++)
5879 e = gfc_get_constant_expr (BT_INTEGER, k, &source->where);
5881 if (t)
5882 mpz_set (e->value.integer, shape[n]);
5883 else
5885 mpz_set_ui (e->value.integer, n + 1);
5887 f = simplify_size (source, e, k);
5888 gfc_free_expr (e);
5889 if (f == NULL)
5891 gfc_free_expr (result);
5892 return NULL;
5894 else
5895 e = f;
5898 if (e == &gfc_bad_expr || range_check (e, "SHAPE") == &gfc_bad_expr)
5900 gfc_free_expr (result);
5901 if (t)
5902 gfc_clear_shape (shape, source->rank);
5903 return &gfc_bad_expr;
5906 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
5909 if (t)
5910 gfc_clear_shape (shape, source->rank);
5912 return result;
5916 static gfc_expr *
5917 simplify_size (gfc_expr *array, gfc_expr *dim, int k)
5919 mpz_t size;
5920 gfc_expr *return_value;
5921 int d;
5923 /* For unary operations, the size of the result is given by the size
5924 of the operand. For binary ones, it's the size of the first operand
5925 unless it is scalar, then it is the size of the second. */
5926 if (array->expr_type == EXPR_OP && !array->value.op.uop)
5928 gfc_expr* replacement;
5929 gfc_expr* simplified;
5931 switch (array->value.op.op)
5933 /* Unary operations. */
5934 case INTRINSIC_NOT:
5935 case INTRINSIC_UPLUS:
5936 case INTRINSIC_UMINUS:
5937 case INTRINSIC_PARENTHESES:
5938 replacement = array->value.op.op1;
5939 break;
5941 /* Binary operations. If any one of the operands is scalar, take
5942 the other one's size. If both of them are arrays, it does not
5943 matter -- try to find one with known shape, if possible. */
5944 default:
5945 if (array->value.op.op1->rank == 0)
5946 replacement = array->value.op.op2;
5947 else if (array->value.op.op2->rank == 0)
5948 replacement = array->value.op.op1;
5949 else
5951 simplified = simplify_size (array->value.op.op1, dim, k);
5952 if (simplified)
5953 return simplified;
5955 replacement = array->value.op.op2;
5957 break;
5960 /* Try to reduce it directly if possible. */
5961 simplified = simplify_size (replacement, dim, k);
5963 /* Otherwise, we build a new SIZE call. This is hopefully at least
5964 simpler than the original one. */
5965 if (!simplified)
5967 gfc_expr *kind = gfc_get_int_expr (gfc_default_integer_kind, NULL, k);
5968 simplified = gfc_build_intrinsic_call (gfc_current_ns,
5969 GFC_ISYM_SIZE, "size",
5970 array->where, 3,
5971 gfc_copy_expr (replacement),
5972 gfc_copy_expr (dim),
5973 kind);
5975 return simplified;
5978 if (dim == NULL)
5980 if (!gfc_array_size (array, &size))
5981 return NULL;
5983 else
5985 if (dim->expr_type != EXPR_CONSTANT)
5986 return NULL;
5988 d = mpz_get_ui (dim->value.integer) - 1;
5989 if (!gfc_array_dimen_size (array, d, &size))
5990 return NULL;
5993 return_value = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
5994 mpz_set (return_value->value.integer, size);
5995 mpz_clear (size);
5997 return return_value;
6001 gfc_expr *
6002 gfc_simplify_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6004 gfc_expr *result;
6005 int k = get_kind (BT_INTEGER, kind, "SIZE", gfc_default_integer_kind);
6007 if (k == -1)
6008 return &gfc_bad_expr;
6010 result = simplify_size (array, dim, k);
6011 if (result == NULL || result == &gfc_bad_expr)
6012 return result;
6014 return range_check (result, "SIZE");
6018 /* SIZEOF and C_SIZEOF return the size in bytes of an array element
6019 multiplied by the array size. */
6021 gfc_expr *
6022 gfc_simplify_sizeof (gfc_expr *x)
6024 gfc_expr *result = NULL;
6025 mpz_t array_size;
6027 if (x->ts.type == BT_CLASS || x->ts.deferred)
6028 return NULL;
6030 if (x->ts.type == BT_CHARACTER
6031 && (!x->ts.u.cl || !x->ts.u.cl->length
6032 || x->ts.u.cl->length->expr_type != EXPR_CONSTANT))
6033 return NULL;
6035 if (x->rank && x->expr_type != EXPR_ARRAY
6036 && !gfc_array_size (x, &array_size))
6037 return NULL;
6039 result = gfc_get_constant_expr (BT_INTEGER, gfc_index_integer_kind,
6040 &x->where);
6041 mpz_set_si (result->value.integer, gfc_target_expr_size (x));
6043 return result;
6047 /* STORAGE_SIZE returns the size in bits of a single array element. */
6049 gfc_expr *
6050 gfc_simplify_storage_size (gfc_expr *x,
6051 gfc_expr *kind)
6053 gfc_expr *result = NULL;
6054 int k;
6056 if (x->ts.type == BT_CLASS || x->ts.deferred)
6057 return NULL;
6059 if (x->ts.type == BT_CHARACTER && x->expr_type != EXPR_CONSTANT
6060 && (!x->ts.u.cl || !x->ts.u.cl->length
6061 || x->ts.u.cl->length->expr_type != EXPR_CONSTANT))
6062 return NULL;
6064 k = get_kind (BT_INTEGER, kind, "STORAGE_SIZE", gfc_default_integer_kind);
6065 if (k == -1)
6066 return &gfc_bad_expr;
6068 result = gfc_get_constant_expr (BT_INTEGER, k, &x->where);
6070 mpz_set_si (result->value.integer, gfc_element_size (x));
6071 mpz_mul_ui (result->value.integer, result->value.integer, BITS_PER_UNIT);
6073 return range_check (result, "STORAGE_SIZE");
6077 gfc_expr *
6078 gfc_simplify_sign (gfc_expr *x, gfc_expr *y)
6080 gfc_expr *result;
6082 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
6083 return NULL;
6085 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6087 switch (x->ts.type)
6089 case BT_INTEGER:
6090 mpz_abs (result->value.integer, x->value.integer);
6091 if (mpz_sgn (y->value.integer) < 0)
6092 mpz_neg (result->value.integer, result->value.integer);
6093 break;
6095 case BT_REAL:
6096 if (flag_sign_zero)
6097 mpfr_copysign (result->value.real, x->value.real, y->value.real,
6098 GFC_RND_MODE);
6099 else
6100 mpfr_setsign (result->value.real, x->value.real,
6101 mpfr_sgn (y->value.real) < 0 ? 1 : 0, GFC_RND_MODE);
6102 break;
6104 default:
6105 gfc_internal_error ("Bad type in gfc_simplify_sign");
6108 return result;
6112 gfc_expr *
6113 gfc_simplify_sin (gfc_expr *x)
6115 gfc_expr *result;
6117 if (x->expr_type != EXPR_CONSTANT)
6118 return NULL;
6120 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6122 switch (x->ts.type)
6124 case BT_REAL:
6125 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
6126 break;
6128 case BT_COMPLEX:
6129 gfc_set_model (x->value.real);
6130 mpc_sin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
6131 break;
6133 default:
6134 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
6137 return range_check (result, "SIN");
6141 gfc_expr *
6142 gfc_simplify_sinh (gfc_expr *x)
6144 gfc_expr *result;
6146 if (x->expr_type != EXPR_CONSTANT)
6147 return NULL;
6149 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6151 switch (x->ts.type)
6153 case BT_REAL:
6154 mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE);
6155 break;
6157 case BT_COMPLEX:
6158 mpc_sinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
6159 break;
6161 default:
6162 gcc_unreachable ();
6165 return range_check (result, "SINH");
6169 /* The argument is always a double precision real that is converted to
6170 single precision. TODO: Rounding! */
6172 gfc_expr *
6173 gfc_simplify_sngl (gfc_expr *a)
6175 gfc_expr *result;
6177 if (a->expr_type != EXPR_CONSTANT)
6178 return NULL;
6180 result = gfc_real2real (a, gfc_default_real_kind);
6181 return range_check (result, "SNGL");
6185 gfc_expr *
6186 gfc_simplify_spacing (gfc_expr *x)
6188 gfc_expr *result;
6189 int i;
6190 long int en, ep;
6192 if (x->expr_type != EXPR_CONSTANT)
6193 return NULL;
6195 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
6196 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
6198 /* SPACING(+/- 0.0) = SPACING(TINY(0.0)) = TINY(0.0) */
6199 if (mpfr_zero_p (x->value.real))
6201 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
6202 return result;
6205 /* SPACING(inf) = NaN */
6206 if (mpfr_inf_p (x->value.real))
6208 mpfr_set_nan (result->value.real);
6209 return result;
6212 /* SPACING(NaN) = same NaN */
6213 if (mpfr_nan_p (x->value.real))
6215 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
6216 return result;
6219 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
6220 are the radix, exponent of x, and precision. This excludes the
6221 possibility of subnormal numbers. Fortran 2003 states the result is
6222 b**max(e - p, emin - 1). */
6224 ep = (long int) mpfr_get_exp (x->value.real) - gfc_real_kinds[i].digits;
6225 en = (long int) gfc_real_kinds[i].min_exponent - 1;
6226 en = en > ep ? en : ep;
6228 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
6229 mpfr_mul_2si (result->value.real, result->value.real, en, GFC_RND_MODE);
6231 return range_check (result, "SPACING");
6235 gfc_expr *
6236 gfc_simplify_spread (gfc_expr *source, gfc_expr *dim_expr, gfc_expr *ncopies_expr)
6238 gfc_expr *result = NULL;
6239 int nelem, i, j, dim, ncopies;
6240 mpz_t size;
6242 if ((!gfc_is_constant_expr (source)
6243 && !is_constant_array_expr (source))
6244 || !gfc_is_constant_expr (dim_expr)
6245 || !gfc_is_constant_expr (ncopies_expr))
6246 return NULL;
6248 gcc_assert (dim_expr->ts.type == BT_INTEGER);
6249 gfc_extract_int (dim_expr, &dim);
6250 dim -= 1; /* zero-base DIM */
6252 gcc_assert (ncopies_expr->ts.type == BT_INTEGER);
6253 gfc_extract_int (ncopies_expr, &ncopies);
6254 ncopies = MAX (ncopies, 0);
6256 /* Do not allow the array size to exceed the limit for an array
6257 constructor. */
6258 if (source->expr_type == EXPR_ARRAY)
6260 if (!gfc_array_size (source, &size))
6261 gfc_internal_error ("Failure getting length of a constant array.");
6263 else
6264 mpz_init_set_ui (size, 1);
6266 nelem = mpz_get_si (size) * ncopies;
6267 if (nelem > flag_max_array_constructor)
6269 if (gfc_current_ns->sym_root->n.sym->attr.flavor == FL_PARAMETER)
6271 gfc_error ("The number of elements (%d) in the array constructor "
6272 "at %L requires an increase of the allowed %d upper "
6273 "limit. See %<-fmax-array-constructor%> option.",
6274 nelem, &source->where, flag_max_array_constructor);
6275 return &gfc_bad_expr;
6277 else
6278 return NULL;
6281 if (source->expr_type == EXPR_CONSTANT)
6283 gcc_assert (dim == 0);
6285 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
6286 &source->where);
6287 if (source->ts.type == BT_DERIVED)
6288 result->ts.u.derived = source->ts.u.derived;
6289 result->rank = 1;
6290 result->shape = gfc_get_shape (result->rank);
6291 mpz_init_set_si (result->shape[0], ncopies);
6293 for (i = 0; i < ncopies; ++i)
6294 gfc_constructor_append_expr (&result->value.constructor,
6295 gfc_copy_expr (source), NULL);
6297 else if (source->expr_type == EXPR_ARRAY)
6299 int offset, rstride[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS];
6300 gfc_constructor *source_ctor;
6302 gcc_assert (source->rank < GFC_MAX_DIMENSIONS);
6303 gcc_assert (dim >= 0 && dim <= source->rank);
6305 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
6306 &source->where);
6307 if (source->ts.type == BT_DERIVED)
6308 result->ts.u.derived = source->ts.u.derived;
6309 result->rank = source->rank + 1;
6310 result->shape = gfc_get_shape (result->rank);
6312 for (i = 0, j = 0; i < result->rank; ++i)
6314 if (i != dim)
6315 mpz_init_set (result->shape[i], source->shape[j++]);
6316 else
6317 mpz_init_set_si (result->shape[i], ncopies);
6319 extent[i] = mpz_get_si (result->shape[i]);
6320 rstride[i] = (i == 0) ? 1 : rstride[i-1] * extent[i-1];
6323 offset = 0;
6324 for (source_ctor = gfc_constructor_first (source->value.constructor);
6325 source_ctor; source_ctor = gfc_constructor_next (source_ctor))
6327 for (i = 0; i < ncopies; ++i)
6328 gfc_constructor_insert_expr (&result->value.constructor,
6329 gfc_copy_expr (source_ctor->expr),
6330 NULL, offset + i * rstride[dim]);
6332 offset += (dim == 0 ? ncopies : 1);
6335 else
6337 gfc_error ("Simplification of SPREAD at %C not yet implemented");
6338 return &gfc_bad_expr;
6341 if (source->ts.type == BT_CHARACTER)
6342 result->ts.u.cl = source->ts.u.cl;
6344 return result;
6348 gfc_expr *
6349 gfc_simplify_sqrt (gfc_expr *e)
6351 gfc_expr *result = NULL;
6353 if (e->expr_type != EXPR_CONSTANT)
6354 return NULL;
6356 switch (e->ts.type)
6358 case BT_REAL:
6359 if (mpfr_cmp_si (e->value.real, 0) < 0)
6361 gfc_error ("Argument of SQRT at %L has a negative value",
6362 &e->where);
6363 return &gfc_bad_expr;
6365 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
6366 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
6367 break;
6369 case BT_COMPLEX:
6370 gfc_set_model (e->value.real);
6372 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
6373 mpc_sqrt (result->value.complex, e->value.complex, GFC_MPC_RND_MODE);
6374 break;
6376 default:
6377 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
6380 return range_check (result, "SQRT");
6384 gfc_expr *
6385 gfc_simplify_sum (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
6387 return simplify_transformation (array, dim, mask, 0, gfc_add);
6391 gfc_expr *
6392 gfc_simplify_cotan (gfc_expr *x)
6394 gfc_expr *result;
6395 mpc_t swp, *val;
6397 if (x->expr_type != EXPR_CONSTANT)
6398 return NULL;
6400 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6402 switch (x->ts.type)
6404 case BT_REAL:
6405 mpfr_cot (result->value.real, x->value.real, GFC_RND_MODE);
6406 break;
6408 case BT_COMPLEX:
6409 /* There is no builtin mpc_cot, so compute cot = cos / sin. */
6410 val = &result->value.complex;
6411 mpc_init2 (swp, mpfr_get_default_prec ());
6412 mpc_cos (swp, x->value.complex, GFC_MPC_RND_MODE);
6413 mpc_sin (*val, x->value.complex, GFC_MPC_RND_MODE);
6414 mpc_div (*val, swp, *val, GFC_MPC_RND_MODE);
6415 mpc_clear (swp);
6416 break;
6418 default:
6419 gcc_unreachable ();
6422 return range_check (result, "COTAN");
6426 gfc_expr *
6427 gfc_simplify_tan (gfc_expr *x)
6429 gfc_expr *result;
6431 if (x->expr_type != EXPR_CONSTANT)
6432 return NULL;
6434 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6436 switch (x->ts.type)
6438 case BT_REAL:
6439 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
6440 break;
6442 case BT_COMPLEX:
6443 mpc_tan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
6444 break;
6446 default:
6447 gcc_unreachable ();
6450 return range_check (result, "TAN");
6454 gfc_expr *
6455 gfc_simplify_tanh (gfc_expr *x)
6457 gfc_expr *result;
6459 if (x->expr_type != EXPR_CONSTANT)
6460 return NULL;
6462 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6464 switch (x->ts.type)
6466 case BT_REAL:
6467 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
6468 break;
6470 case BT_COMPLEX:
6471 mpc_tanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
6472 break;
6474 default:
6475 gcc_unreachable ();
6478 return range_check (result, "TANH");
6482 gfc_expr *
6483 gfc_simplify_tiny (gfc_expr *e)
6485 gfc_expr *result;
6486 int i;
6488 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
6490 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
6491 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
6493 return result;
6497 gfc_expr *
6498 gfc_simplify_trailz (gfc_expr *e)
6500 unsigned long tz, bs;
6501 int i;
6503 if (e->expr_type != EXPR_CONSTANT)
6504 return NULL;
6506 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
6507 bs = gfc_integer_kinds[i].bit_size;
6508 tz = mpz_scan1 (e->value.integer, 0);
6510 return gfc_get_int_expr (gfc_default_integer_kind,
6511 &e->where, MIN (tz, bs));
6515 gfc_expr *
6516 gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
6518 gfc_expr *result;
6519 gfc_expr *mold_element;
6520 size_t source_size;
6521 size_t result_size;
6522 size_t buffer_size;
6523 mpz_t tmp;
6524 unsigned char *buffer;
6525 size_t result_length;
6528 if (!gfc_is_constant_expr (source)
6529 || (gfc_init_expr_flag && !gfc_is_constant_expr (mold))
6530 || !gfc_is_constant_expr (size))
6531 return NULL;
6533 if (!gfc_calculate_transfer_sizes (source, mold, size, &source_size,
6534 &result_size, &result_length))
6535 return NULL;
6537 /* Calculate the size of the source. */
6538 if (source->expr_type == EXPR_ARRAY
6539 && !gfc_array_size (source, &tmp))
6540 gfc_internal_error ("Failure getting length of a constant array.");
6542 /* Create an empty new expression with the appropriate characteristics. */
6543 result = gfc_get_constant_expr (mold->ts.type, mold->ts.kind,
6544 &source->where);
6545 result->ts = mold->ts;
6547 mold_element = mold->expr_type == EXPR_ARRAY
6548 ? gfc_constructor_first (mold->value.constructor)->expr
6549 : mold;
6551 /* Set result character length, if needed. Note that this needs to be
6552 set even for array expressions, in order to pass this information into
6553 gfc_target_interpret_expr. */
6554 if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element))
6555 result->value.character.length = mold_element->value.character.length;
6557 /* Set the number of elements in the result, and determine its size. */
6559 if (mold->expr_type == EXPR_ARRAY || mold->rank || size)
6561 result->expr_type = EXPR_ARRAY;
6562 result->rank = 1;
6563 result->shape = gfc_get_shape (1);
6564 mpz_init_set_ui (result->shape[0], result_length);
6566 else
6567 result->rank = 0;
6569 /* Allocate the buffer to store the binary version of the source. */
6570 buffer_size = MAX (source_size, result_size);
6571 buffer = (unsigned char*)alloca (buffer_size);
6572 memset (buffer, 0, buffer_size);
6574 /* Now write source to the buffer. */
6575 gfc_target_encode_expr (source, buffer, buffer_size);
6577 /* And read the buffer back into the new expression. */
6578 gfc_target_interpret_expr (buffer, buffer_size, result, false);
6580 return result;
6584 gfc_expr *
6585 gfc_simplify_transpose (gfc_expr *matrix)
6587 int row, matrix_rows, col, matrix_cols;
6588 gfc_expr *result;
6590 if (!is_constant_array_expr (matrix))
6591 return NULL;
6593 gcc_assert (matrix->rank == 2);
6595 result = gfc_get_array_expr (matrix->ts.type, matrix->ts.kind,
6596 &matrix->where);
6597 result->rank = 2;
6598 result->shape = gfc_get_shape (result->rank);
6599 mpz_set (result->shape[0], matrix->shape[1]);
6600 mpz_set (result->shape[1], matrix->shape[0]);
6602 if (matrix->ts.type == BT_CHARACTER)
6603 result->ts.u.cl = matrix->ts.u.cl;
6604 else if (matrix->ts.type == BT_DERIVED)
6605 result->ts.u.derived = matrix->ts.u.derived;
6607 matrix_rows = mpz_get_si (matrix->shape[0]);
6608 matrix_cols = mpz_get_si (matrix->shape[1]);
6609 for (row = 0; row < matrix_rows; ++row)
6610 for (col = 0; col < matrix_cols; ++col)
6612 gfc_expr *e = gfc_constructor_lookup_expr (matrix->value.constructor,
6613 col * matrix_rows + row);
6614 gfc_constructor_insert_expr (&result->value.constructor,
6615 gfc_copy_expr (e), &matrix->where,
6616 row * matrix_cols + col);
6619 return result;
6623 gfc_expr *
6624 gfc_simplify_trim (gfc_expr *e)
6626 gfc_expr *result;
6627 int count, i, len, lentrim;
6629 if (e->expr_type != EXPR_CONSTANT)
6630 return NULL;
6632 len = e->value.character.length;
6633 for (count = 0, i = 1; i <= len; ++i)
6635 if (e->value.character.string[len - i] == ' ')
6636 count++;
6637 else
6638 break;
6641 lentrim = len - count;
6643 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, lentrim);
6644 for (i = 0; i < lentrim; i++)
6645 result->value.character.string[i] = e->value.character.string[i];
6647 return result;
6651 gfc_expr *
6652 gfc_simplify_image_index (gfc_expr *coarray, gfc_expr *sub)
6654 gfc_expr *result;
6655 gfc_ref *ref;
6656 gfc_array_spec *as;
6657 gfc_constructor *sub_cons;
6658 bool first_image;
6659 int d;
6661 if (!is_constant_array_expr (sub))
6662 return NULL;
6664 /* Follow any component references. */
6665 as = coarray->symtree->n.sym->as;
6666 for (ref = coarray->ref; ref; ref = ref->next)
6667 if (ref->type == REF_COMPONENT)
6668 as = ref->u.ar.as;
6670 if (as->type == AS_DEFERRED)
6671 return NULL;
6673 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
6674 the cosubscript addresses the first image. */
6676 sub_cons = gfc_constructor_first (sub->value.constructor);
6677 first_image = true;
6679 for (d = 1; d <= as->corank; d++)
6681 gfc_expr *ca_bound;
6682 int cmp;
6684 gcc_assert (sub_cons != NULL);
6686 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 0, as,
6687 NULL, true);
6688 if (ca_bound == NULL)
6689 return NULL;
6691 if (ca_bound == &gfc_bad_expr)
6692 return ca_bound;
6694 cmp = mpz_cmp (ca_bound->value.integer, sub_cons->expr->value.integer);
6696 if (cmp == 0)
6698 gfc_free_expr (ca_bound);
6699 sub_cons = gfc_constructor_next (sub_cons);
6700 continue;
6703 first_image = false;
6705 if (cmp > 0)
6707 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6708 "SUB has %ld and COARRAY lower bound is %ld)",
6709 &coarray->where, d,
6710 mpz_get_si (sub_cons->expr->value.integer),
6711 mpz_get_si (ca_bound->value.integer));
6712 gfc_free_expr (ca_bound);
6713 return &gfc_bad_expr;
6716 gfc_free_expr (ca_bound);
6718 /* Check whether upperbound is valid for the multi-images case. */
6719 if (d < as->corank)
6721 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 1, as,
6722 NULL, true);
6723 if (ca_bound == &gfc_bad_expr)
6724 return ca_bound;
6726 if (ca_bound && ca_bound->expr_type == EXPR_CONSTANT
6727 && mpz_cmp (ca_bound->value.integer,
6728 sub_cons->expr->value.integer) < 0)
6730 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6731 "SUB has %ld and COARRAY upper bound is %ld)",
6732 &coarray->where, d,
6733 mpz_get_si (sub_cons->expr->value.integer),
6734 mpz_get_si (ca_bound->value.integer));
6735 gfc_free_expr (ca_bound);
6736 return &gfc_bad_expr;
6739 if (ca_bound)
6740 gfc_free_expr (ca_bound);
6743 sub_cons = gfc_constructor_next (sub_cons);
6746 gcc_assert (sub_cons == NULL);
6748 if (flag_coarray != GFC_FCOARRAY_SINGLE && !first_image)
6749 return NULL;
6751 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
6752 &gfc_current_locus);
6753 if (first_image)
6754 mpz_set_si (result->value.integer, 1);
6755 else
6756 mpz_set_si (result->value.integer, 0);
6758 return result;
6762 gfc_expr *
6763 gfc_simplify_this_image (gfc_expr *coarray, gfc_expr *dim,
6764 gfc_expr *distance ATTRIBUTE_UNUSED)
6766 if (flag_coarray != GFC_FCOARRAY_SINGLE)
6767 return NULL;
6769 /* If no coarray argument has been passed or when the first argument
6770 is actually a distance argment. */
6771 if (coarray == NULL || !gfc_is_coarray (coarray))
6773 gfc_expr *result;
6774 /* FIXME: gfc_current_locus is wrong. */
6775 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
6776 &gfc_current_locus);
6777 mpz_set_si (result->value.integer, 1);
6778 return result;
6781 /* For -fcoarray=single, this_image(A) is the same as lcobound(A). */
6782 return simplify_cobound (coarray, dim, NULL, 0);
6786 gfc_expr *
6787 gfc_simplify_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6789 return simplify_bound (array, dim, kind, 1);
6792 gfc_expr *
6793 gfc_simplify_ucobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6795 return simplify_cobound (array, dim, kind, 1);
6799 gfc_expr *
6800 gfc_simplify_unpack (gfc_expr *vector, gfc_expr *mask, gfc_expr *field)
6802 gfc_expr *result, *e;
6803 gfc_constructor *vector_ctor, *mask_ctor, *field_ctor;
6805 if (!is_constant_array_expr (vector)
6806 || !is_constant_array_expr (mask)
6807 || (!gfc_is_constant_expr (field)
6808 && !is_constant_array_expr (field)))
6809 return NULL;
6811 result = gfc_get_array_expr (vector->ts.type, vector->ts.kind,
6812 &vector->where);
6813 if (vector->ts.type == BT_DERIVED)
6814 result->ts.u.derived = vector->ts.u.derived;
6815 result->rank = mask->rank;
6816 result->shape = gfc_copy_shape (mask->shape, mask->rank);
6818 if (vector->ts.type == BT_CHARACTER)
6819 result->ts.u.cl = vector->ts.u.cl;
6821 vector_ctor = gfc_constructor_first (vector->value.constructor);
6822 mask_ctor = gfc_constructor_first (mask->value.constructor);
6823 field_ctor
6824 = field->expr_type == EXPR_ARRAY
6825 ? gfc_constructor_first (field->value.constructor)
6826 : NULL;
6828 while (mask_ctor)
6830 if (mask_ctor->expr->value.logical)
6832 gcc_assert (vector_ctor);
6833 e = gfc_copy_expr (vector_ctor->expr);
6834 vector_ctor = gfc_constructor_next (vector_ctor);
6836 else if (field->expr_type == EXPR_ARRAY)
6837 e = gfc_copy_expr (field_ctor->expr);
6838 else
6839 e = gfc_copy_expr (field);
6841 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
6843 mask_ctor = gfc_constructor_next (mask_ctor);
6844 field_ctor = gfc_constructor_next (field_ctor);
6847 return result;
6851 gfc_expr *
6852 gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind)
6854 gfc_expr *result;
6855 int back;
6856 size_t index, len, lenset;
6857 size_t i;
6858 int k = get_kind (BT_INTEGER, kind, "VERIFY", gfc_default_integer_kind);
6860 if (k == -1)
6861 return &gfc_bad_expr;
6863 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT
6864 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
6865 return NULL;
6867 if (b != NULL && b->value.logical != 0)
6868 back = 1;
6869 else
6870 back = 0;
6872 result = gfc_get_constant_expr (BT_INTEGER, k, &s->where);
6874 len = s->value.character.length;
6875 lenset = set->value.character.length;
6877 if (len == 0)
6879 mpz_set_ui (result->value.integer, 0);
6880 return result;
6883 if (back == 0)
6885 if (lenset == 0)
6887 mpz_set_ui (result->value.integer, 1);
6888 return result;
6891 index = wide_strspn (s->value.character.string,
6892 set->value.character.string) + 1;
6893 if (index > len)
6894 index = 0;
6897 else
6899 if (lenset == 0)
6901 mpz_set_ui (result->value.integer, len);
6902 return result;
6904 for (index = len; index > 0; index --)
6906 for (i = 0; i < lenset; i++)
6908 if (s->value.character.string[index - 1]
6909 == set->value.character.string[i])
6910 break;
6912 if (i == lenset)
6913 break;
6917 mpz_set_ui (result->value.integer, index);
6918 return result;
6922 gfc_expr *
6923 gfc_simplify_xor (gfc_expr *x, gfc_expr *y)
6925 gfc_expr *result;
6926 int kind;
6928 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
6929 return NULL;
6931 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
6933 switch (x->ts.type)
6935 case BT_INTEGER:
6936 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
6937 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
6938 return range_check (result, "XOR");
6940 case BT_LOGICAL:
6941 return gfc_get_logical_expr (kind, &x->where,
6942 (x->value.logical && !y->value.logical)
6943 || (!x->value.logical && y->value.logical));
6945 default:
6946 gcc_unreachable ();
6951 /****************** Constant simplification *****************/
6953 /* Master function to convert one constant to another. While this is
6954 used as a simplification function, it requires the destination type
6955 and kind information which is supplied by a special case in
6956 do_simplify(). */
6958 gfc_expr *
6959 gfc_convert_constant (gfc_expr *e, bt type, int kind)
6961 gfc_expr *g, *result, *(*f) (gfc_expr *, int);
6962 gfc_constructor *c;
6964 switch (e->ts.type)
6966 case BT_INTEGER:
6967 switch (type)
6969 case BT_INTEGER:
6970 f = gfc_int2int;
6971 break;
6972 case BT_REAL:
6973 f = gfc_int2real;
6974 break;
6975 case BT_COMPLEX:
6976 f = gfc_int2complex;
6977 break;
6978 case BT_LOGICAL:
6979 f = gfc_int2log;
6980 break;
6981 default:
6982 goto oops;
6984 break;
6986 case BT_REAL:
6987 switch (type)
6989 case BT_INTEGER:
6990 f = gfc_real2int;
6991 break;
6992 case BT_REAL:
6993 f = gfc_real2real;
6994 break;
6995 case BT_COMPLEX:
6996 f = gfc_real2complex;
6997 break;
6998 default:
6999 goto oops;
7001 break;
7003 case BT_COMPLEX:
7004 switch (type)
7006 case BT_INTEGER:
7007 f = gfc_complex2int;
7008 break;
7009 case BT_REAL:
7010 f = gfc_complex2real;
7011 break;
7012 case BT_COMPLEX:
7013 f = gfc_complex2complex;
7014 break;
7016 default:
7017 goto oops;
7019 break;
7021 case BT_LOGICAL:
7022 switch (type)
7024 case BT_INTEGER:
7025 f = gfc_log2int;
7026 break;
7027 case BT_LOGICAL:
7028 f = gfc_log2log;
7029 break;
7030 default:
7031 goto oops;
7033 break;
7035 case BT_HOLLERITH:
7036 switch (type)
7038 case BT_INTEGER:
7039 f = gfc_hollerith2int;
7040 break;
7042 case BT_REAL:
7043 f = gfc_hollerith2real;
7044 break;
7046 case BT_COMPLEX:
7047 f = gfc_hollerith2complex;
7048 break;
7050 case BT_CHARACTER:
7051 f = gfc_hollerith2character;
7052 break;
7054 case BT_LOGICAL:
7055 f = gfc_hollerith2logical;
7056 break;
7058 default:
7059 goto oops;
7061 break;
7063 default:
7064 oops:
7065 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
7068 result = NULL;
7070 switch (e->expr_type)
7072 case EXPR_CONSTANT:
7073 result = f (e, kind);
7074 if (result == NULL)
7075 return &gfc_bad_expr;
7076 break;
7078 case EXPR_ARRAY:
7079 if (!gfc_is_constant_expr (e))
7080 break;
7082 result = gfc_get_array_expr (type, kind, &e->where);
7083 result->shape = gfc_copy_shape (e->shape, e->rank);
7084 result->rank = e->rank;
7086 for (c = gfc_constructor_first (e->value.constructor);
7087 c; c = gfc_constructor_next (c))
7089 gfc_expr *tmp;
7090 if (c->iterator == NULL)
7091 tmp = f (c->expr, kind);
7092 else
7094 g = gfc_convert_constant (c->expr, type, kind);
7095 if (g == &gfc_bad_expr)
7097 gfc_free_expr (result);
7098 return g;
7100 tmp = g;
7103 if (tmp == NULL)
7105 gfc_free_expr (result);
7106 return NULL;
7109 gfc_constructor_append_expr (&result->value.constructor,
7110 tmp, &c->where);
7113 break;
7115 default:
7116 break;
7119 return result;
7123 /* Function for converting character constants. */
7124 gfc_expr *
7125 gfc_convert_char_constant (gfc_expr *e, bt type ATTRIBUTE_UNUSED, int kind)
7127 gfc_expr *result;
7128 int i;
7130 if (!gfc_is_constant_expr (e))
7131 return NULL;
7133 if (e->expr_type == EXPR_CONSTANT)
7135 /* Simple case of a scalar. */
7136 result = gfc_get_constant_expr (BT_CHARACTER, kind, &e->where);
7137 if (result == NULL)
7138 return &gfc_bad_expr;
7140 result->value.character.length = e->value.character.length;
7141 result->value.character.string
7142 = gfc_get_wide_string (e->value.character.length + 1);
7143 memcpy (result->value.character.string, e->value.character.string,
7144 (e->value.character.length + 1) * sizeof (gfc_char_t));
7146 /* Check we only have values representable in the destination kind. */
7147 for (i = 0; i < result->value.character.length; i++)
7148 if (!gfc_check_character_range (result->value.character.string[i],
7149 kind))
7151 gfc_error ("Character %qs in string at %L cannot be converted "
7152 "into character kind %d",
7153 gfc_print_wide_char (result->value.character.string[i]),
7154 &e->where, kind);
7155 gfc_free_expr (result);
7156 return &gfc_bad_expr;
7159 return result;
7161 else if (e->expr_type == EXPR_ARRAY)
7163 /* For an array constructor, we convert each constructor element. */
7164 gfc_constructor *c;
7166 result = gfc_get_array_expr (type, kind, &e->where);
7167 result->shape = gfc_copy_shape (e->shape, e->rank);
7168 result->rank = e->rank;
7169 result->ts.u.cl = e->ts.u.cl;
7171 for (c = gfc_constructor_first (e->value.constructor);
7172 c; c = gfc_constructor_next (c))
7174 gfc_expr *tmp = gfc_convert_char_constant (c->expr, type, kind);
7175 if (tmp == &gfc_bad_expr)
7177 gfc_free_expr (result);
7178 return &gfc_bad_expr;
7181 if (tmp == NULL)
7183 gfc_free_expr (result);
7184 return NULL;
7187 gfc_constructor_append_expr (&result->value.constructor,
7188 tmp, &c->where);
7191 return result;
7193 else
7194 return NULL;
7198 gfc_expr *
7199 gfc_simplify_compiler_options (void)
7201 char *str;
7202 gfc_expr *result;
7204 str = gfc_get_option_string ();
7205 result = gfc_get_character_expr (gfc_default_character_kind,
7206 &gfc_current_locus, str, strlen (str));
7207 free (str);
7208 return result;
7212 gfc_expr *
7213 gfc_simplify_compiler_version (void)
7215 char *buffer;
7216 size_t len;
7218 len = strlen ("GCC version ") + strlen (version_string);
7219 buffer = XALLOCAVEC (char, len + 1);
7220 snprintf (buffer, len + 1, "GCC version %s", version_string);
7221 return gfc_get_character_expr (gfc_default_character_kind,
7222 &gfc_current_locus, buffer, len);
7225 /* Simplification routines for intrinsics of IEEE modules. */
7227 gfc_expr *
7228 simplify_ieee_selected_real_kind (gfc_expr *expr)
7230 gfc_actual_arglist *arg;
7231 gfc_expr *p = NULL, *q = NULL, *rdx = NULL;
7233 arg = expr->value.function.actual;
7234 p = arg->expr;
7235 if (arg->next)
7237 q = arg->next->expr;
7238 if (arg->next->next)
7239 rdx = arg->next->next->expr;
7242 /* Currently, if IEEE is supported and this module is built, it means
7243 all our floating-point types conform to IEEE. Hence, we simply handle
7244 IEEE_SELECTED_REAL_KIND like SELECTED_REAL_KIND. */
7245 return gfc_simplify_selected_real_kind (p, q, rdx);
7248 gfc_expr *
7249 simplify_ieee_support (gfc_expr *expr)
7251 /* We consider that if the IEEE modules are loaded, we have full support
7252 for flags, halting and rounding, which are the three functions
7253 (IEEE_SUPPORT_{FLAG,HALTING,ROUNDING}) allowed in constant
7254 expressions. One day, we will need libgfortran to detect support and
7255 communicate it back to us, allowing for partial support. */
7257 return gfc_get_logical_expr (gfc_default_logical_kind, &expr->where,
7258 true);
7261 bool
7262 matches_ieee_function_name (gfc_symbol *sym, const char *name)
7264 int n = strlen(name);
7266 if (!strncmp(sym->name, name, n))
7267 return true;
7269 /* If a generic was used and renamed, we need more work to find out.
7270 Compare the specific name. */
7271 if (sym->generic && !strncmp(sym->generic->sym->name, name, n))
7272 return true;
7274 return false;
7277 gfc_expr *
7278 gfc_simplify_ieee_functions (gfc_expr *expr)
7280 gfc_symbol* sym = expr->symtree->n.sym;
7282 if (matches_ieee_function_name(sym, "ieee_selected_real_kind"))
7283 return simplify_ieee_selected_real_kind (expr);
7284 else if (matches_ieee_function_name(sym, "ieee_support_flag")
7285 || matches_ieee_function_name(sym, "ieee_support_halting")
7286 || matches_ieee_function_name(sym, "ieee_support_rounding"))
7287 return simplify_ieee_support (expr);
7288 else
7289 return NULL;