2018-05-27 Steven G. Kargl <kargl@gcc.gnu.org>
[official-gcc.git] / gcc / fortran / simplify.c
blobfdd85edf62c66dc77ef105748b3bd2816406fb61
1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000-2018 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 "match.h"
29 #include "target-memory.h"
30 #include "constructor.h"
31 #include "version.h" /* For version_string. */
33 /* Prototypes. */
35 static int min_max_choose (gfc_expr *, gfc_expr *, int, bool back_val = false);
37 gfc_expr gfc_bad_expr;
39 static gfc_expr *simplify_size (gfc_expr *, gfc_expr *, int);
42 /* Note that 'simplification' is not just transforming expressions.
43 For functions that are not simplified at compile time, range
44 checking is done if possible.
46 The return convention is that each simplification function returns:
48 A new expression node corresponding to the simplified arguments.
49 The original arguments are destroyed by the caller, and must not
50 be a part of the new expression.
52 NULL pointer indicating that no simplification was possible and
53 the original expression should remain intact.
55 An expression pointer to gfc_bad_expr (a static placeholder)
56 indicating that some error has prevented simplification. The
57 error is generated within the function and should be propagated
58 upwards
60 By the time a simplification function gets control, it has been
61 decided that the function call is really supposed to be the
62 intrinsic. No type checking is strictly necessary, since only
63 valid types will be passed on. On the other hand, a simplification
64 subroutine may have to look at the type of an argument as part of
65 its processing.
67 Array arguments are only passed to these subroutines that implement
68 the simplification of transformational intrinsics.
70 The functions in this file don't have much comment with them, but
71 everything is reasonably straight-forward. The Standard, chapter 13
72 is the best comment you'll find for this file anyway. */
74 /* Range checks an expression node. If all goes well, returns the
75 node, otherwise returns &gfc_bad_expr and frees the node. */
77 static gfc_expr *
78 range_check (gfc_expr *result, const char *name)
80 if (result == NULL)
81 return &gfc_bad_expr;
83 if (result->expr_type != EXPR_CONSTANT)
84 return result;
86 switch (gfc_range_check (result))
88 case ARITH_OK:
89 return result;
91 case ARITH_OVERFLOW:
92 gfc_error ("Result of %s overflows its kind at %L", name,
93 &result->where);
94 break;
96 case ARITH_UNDERFLOW:
97 gfc_error ("Result of %s underflows its kind at %L", name,
98 &result->where);
99 break;
101 case ARITH_NAN:
102 gfc_error ("Result of %s is NaN at %L", name, &result->where);
103 break;
105 default:
106 gfc_error ("Result of %s gives range error for its kind at %L", name,
107 &result->where);
108 break;
111 gfc_free_expr (result);
112 return &gfc_bad_expr;
116 /* A helper function that gets an optional and possibly missing
117 kind parameter. Returns the kind, -1 if something went wrong. */
119 static int
120 get_kind (bt type, gfc_expr *k, const char *name, int default_kind)
122 int kind;
124 if (k == NULL)
125 return default_kind;
127 if (k->expr_type != EXPR_CONSTANT)
129 gfc_error ("KIND parameter of %s at %L must be an initialization "
130 "expression", name, &k->where);
131 return -1;
134 if (gfc_extract_int (k, &kind)
135 || gfc_validate_kind (type, kind, true) < 0)
137 gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where);
138 return -1;
141 return kind;
145 /* Converts an mpz_t signed variable into an unsigned one, assuming
146 two's complement representations and a binary width of bitsize.
147 The conversion is a no-op unless x is negative; otherwise, it can
148 be accomplished by masking out the high bits. */
150 static void
151 convert_mpz_to_unsigned (mpz_t x, int bitsize)
153 mpz_t mask;
155 if (mpz_sgn (x) < 0)
157 /* Confirm that no bits above the signed range are unset if we
158 are doing range checking. */
159 if (flag_range_check != 0)
160 gcc_assert (mpz_scan0 (x, bitsize-1) == ULONG_MAX);
162 mpz_init_set_ui (mask, 1);
163 mpz_mul_2exp (mask, mask, bitsize);
164 mpz_sub_ui (mask, mask, 1);
166 mpz_and (x, x, mask);
168 mpz_clear (mask);
170 else
172 /* Confirm that no bits above the signed range are set. */
173 gcc_assert (mpz_scan1 (x, bitsize-1) == ULONG_MAX);
178 /* Converts an mpz_t unsigned variable into a signed one, assuming
179 two's complement representations and a binary width of bitsize.
180 If the bitsize-1 bit is set, this is taken as a sign bit and
181 the number is converted to the corresponding negative number. */
183 void
184 gfc_convert_mpz_to_signed (mpz_t x, int bitsize)
186 mpz_t mask;
188 /* Confirm that no bits above the unsigned range are set if we are
189 doing range checking. */
190 if (flag_range_check != 0)
191 gcc_assert (mpz_scan1 (x, bitsize) == ULONG_MAX);
193 if (mpz_tstbit (x, bitsize - 1) == 1)
195 mpz_init_set_ui (mask, 1);
196 mpz_mul_2exp (mask, mask, bitsize);
197 mpz_sub_ui (mask, mask, 1);
199 /* We negate the number by hand, zeroing the high bits, that is
200 make it the corresponding positive number, and then have it
201 negated by GMP, giving the correct representation of the
202 negative number. */
203 mpz_com (x, x);
204 mpz_add_ui (x, x, 1);
205 mpz_and (x, x, mask);
207 mpz_neg (x, x);
209 mpz_clear (mask);
214 /* In-place convert BOZ to REAL of the specified kind. */
216 static gfc_expr *
217 convert_boz (gfc_expr *x, int kind)
219 if (x && x->ts.type == BT_INTEGER && x->is_boz)
221 gfc_typespec ts;
222 gfc_clear_ts (&ts);
223 ts.type = BT_REAL;
224 ts.kind = kind;
226 if (!gfc_convert_boz (x, &ts))
227 return &gfc_bad_expr;
230 return x;
234 /* Test that the expression is a constant array, simplifying if
235 we are dealing with a parameter array. */
237 static bool
238 is_constant_array_expr (gfc_expr *e)
240 gfc_constructor *c;
242 if (e == NULL)
243 return true;
245 if (e->expr_type == EXPR_VARIABLE && e->rank > 0
246 && e->symtree->n.sym->attr.flavor == FL_PARAMETER)
247 gfc_simplify_expr (e, 1);
249 if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e))
250 return false;
252 for (c = gfc_constructor_first (e->value.constructor);
253 c; c = gfc_constructor_next (c))
254 if (c->expr->expr_type != EXPR_CONSTANT
255 && c->expr->expr_type != EXPR_STRUCTURE)
256 return false;
258 return true;
261 /* Test for a size zero array. */
262 bool
263 gfc_is_size_zero_array (gfc_expr *array)
266 if (array->rank == 0)
267 return false;
269 if (array->expr_type == EXPR_VARIABLE && array->rank > 0
270 && array->symtree->n.sym->attr.flavor == FL_PARAMETER
271 && array->shape != NULL)
273 for (int i = 0; i < array->rank; i++)
274 if (mpz_cmp_si (array->shape[i], 0) <= 0)
275 return true;
277 return false;
280 if (array->expr_type == EXPR_ARRAY)
281 return array->value.constructor == NULL;
283 return false;
287 /* Initialize a transformational result expression with a given value. */
289 static void
290 init_result_expr (gfc_expr *e, int init, gfc_expr *array)
292 if (e && e->expr_type == EXPR_ARRAY)
294 gfc_constructor *ctor = gfc_constructor_first (e->value.constructor);
295 while (ctor)
297 init_result_expr (ctor->expr, init, array);
298 ctor = gfc_constructor_next (ctor);
301 else if (e && e->expr_type == EXPR_CONSTANT)
303 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
304 HOST_WIDE_INT length;
305 gfc_char_t *string;
307 switch (e->ts.type)
309 case BT_LOGICAL:
310 e->value.logical = (init ? 1 : 0);
311 break;
313 case BT_INTEGER:
314 if (init == INT_MIN)
315 mpz_set (e->value.integer, gfc_integer_kinds[i].min_int);
316 else if (init == INT_MAX)
317 mpz_set (e->value.integer, gfc_integer_kinds[i].huge);
318 else
319 mpz_set_si (e->value.integer, init);
320 break;
322 case BT_REAL:
323 if (init == INT_MIN)
325 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
326 mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE);
328 else if (init == INT_MAX)
329 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
330 else
331 mpfr_set_si (e->value.real, init, GFC_RND_MODE);
332 break;
334 case BT_COMPLEX:
335 mpc_set_si (e->value.complex, init, GFC_MPC_RND_MODE);
336 break;
338 case BT_CHARACTER:
339 if (init == INT_MIN)
341 gfc_expr *len = gfc_simplify_len (array, NULL);
342 gfc_extract_hwi (len, &length);
343 string = gfc_get_wide_string (length + 1);
344 gfc_wide_memset (string, 0, length);
346 else if (init == INT_MAX)
348 gfc_expr *len = gfc_simplify_len (array, NULL);
349 gfc_extract_hwi (len, &length);
350 string = gfc_get_wide_string (length + 1);
351 gfc_wide_memset (string, 255, length);
353 else
355 length = 0;
356 string = gfc_get_wide_string (1);
359 string[length] = '\0';
360 e->value.character.length = length;
361 e->value.character.string = string;
362 break;
364 default:
365 gcc_unreachable();
368 else
369 gcc_unreachable();
373 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul;
374 if conj_a is true, the matrix_a is complex conjugated. */
376 static gfc_expr *
377 compute_dot_product (gfc_expr *matrix_a, int stride_a, int offset_a,
378 gfc_expr *matrix_b, int stride_b, int offset_b,
379 bool conj_a)
381 gfc_expr *result, *a, *b, *c;
383 /* Set result to an INTEGER(1) 0 for numeric types and .false. for
384 LOGICAL. Mixed-mode math in the loop will promote result to the
385 correct type and kind. */
386 if (matrix_a->ts.type == BT_LOGICAL)
387 result = gfc_get_logical_expr (gfc_default_logical_kind, NULL, false);
388 else
389 result = gfc_get_int_expr (1, NULL, 0);
390 result->where = matrix_a->where;
392 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
393 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
394 while (a && b)
396 /* Copying of expressions is required as operands are free'd
397 by the gfc_arith routines. */
398 switch (result->ts.type)
400 case BT_LOGICAL:
401 result = gfc_or (result,
402 gfc_and (gfc_copy_expr (a),
403 gfc_copy_expr (b)));
404 break;
406 case BT_INTEGER:
407 case BT_REAL:
408 case BT_COMPLEX:
409 if (conj_a && a->ts.type == BT_COMPLEX)
410 c = gfc_simplify_conjg (a);
411 else
412 c = gfc_copy_expr (a);
413 result = gfc_add (result, gfc_multiply (c, gfc_copy_expr (b)));
414 break;
416 default:
417 gcc_unreachable();
420 offset_a += stride_a;
421 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
423 offset_b += stride_b;
424 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
427 return result;
431 /* Build a result expression for transformational intrinsics,
432 depending on DIM. */
434 static gfc_expr *
435 transformational_result (gfc_expr *array, gfc_expr *dim, bt type,
436 int kind, locus* where)
438 gfc_expr *result;
439 int i, nelem;
441 if (!dim || array->rank == 1)
442 return gfc_get_constant_expr (type, kind, where);
444 result = gfc_get_array_expr (type, kind, where);
445 result->shape = gfc_copy_shape_excluding (array->shape, array->rank, dim);
446 result->rank = array->rank - 1;
448 /* gfc_array_size() would count the number of elements in the constructor,
449 we have not built those yet. */
450 nelem = 1;
451 for (i = 0; i < result->rank; ++i)
452 nelem *= mpz_get_ui (result->shape[i]);
454 for (i = 0; i < nelem; ++i)
456 gfc_constructor_append_expr (&result->value.constructor,
457 gfc_get_constant_expr (type, kind, where),
458 NULL);
461 return result;
465 typedef gfc_expr* (*transformational_op)(gfc_expr*, gfc_expr*);
467 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
468 of COUNT intrinsic is .TRUE..
470 Interface and implementation mimics arith functions as
471 gfc_add, gfc_multiply, etc. */
473 static gfc_expr *
474 gfc_count (gfc_expr *op1, gfc_expr *op2)
476 gfc_expr *result;
478 gcc_assert (op1->ts.type == BT_INTEGER);
479 gcc_assert (op2->ts.type == BT_LOGICAL);
480 gcc_assert (op2->value.logical);
482 result = gfc_copy_expr (op1);
483 mpz_add_ui (result->value.integer, result->value.integer, 1);
485 gfc_free_expr (op1);
486 gfc_free_expr (op2);
487 return result;
491 /* Transforms an ARRAY with operation OP, according to MASK, to a
492 scalar RESULT. E.g. called if
494 REAL, PARAMETER :: array(n, m) = ...
495 REAL, PARAMETER :: s = SUM(array)
497 where OP == gfc_add(). */
499 static gfc_expr *
500 simplify_transformation_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *mask,
501 transformational_op op)
503 gfc_expr *a, *m;
504 gfc_constructor *array_ctor, *mask_ctor;
506 /* Shortcut for constant .FALSE. MASK. */
507 if (mask
508 && mask->expr_type == EXPR_CONSTANT
509 && !mask->value.logical)
510 return result;
512 array_ctor = gfc_constructor_first (array->value.constructor);
513 mask_ctor = NULL;
514 if (mask && mask->expr_type == EXPR_ARRAY)
515 mask_ctor = gfc_constructor_first (mask->value.constructor);
517 while (array_ctor)
519 a = array_ctor->expr;
520 array_ctor = gfc_constructor_next (array_ctor);
522 /* A constant MASK equals .TRUE. here and can be ignored. */
523 if (mask_ctor)
525 m = mask_ctor->expr;
526 mask_ctor = gfc_constructor_next (mask_ctor);
527 if (!m->value.logical)
528 continue;
531 result = op (result, gfc_copy_expr (a));
532 if (!result)
533 return result;
536 return result;
539 /* Transforms an ARRAY with operation OP, according to MASK, to an
540 array RESULT. E.g. called if
542 REAL, PARAMETER :: array(n, m) = ...
543 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
545 where OP == gfc_multiply().
546 The result might be post processed using post_op. */
548 static gfc_expr *
549 simplify_transformation_to_array (gfc_expr *result, gfc_expr *array, gfc_expr *dim,
550 gfc_expr *mask, transformational_op op,
551 transformational_op post_op)
553 mpz_t size;
554 int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride;
555 gfc_expr **arrayvec, **resultvec, **base, **src, **dest;
556 gfc_constructor *array_ctor, *mask_ctor, *result_ctor;
558 int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
559 sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS],
560 tmpstride[GFC_MAX_DIMENSIONS];
562 /* Shortcut for constant .FALSE. MASK. */
563 if (mask
564 && mask->expr_type == EXPR_CONSTANT
565 && !mask->value.logical)
566 return result;
568 /* Build an indexed table for array element expressions to minimize
569 linked-list traversal. Masked elements are set to NULL. */
570 gfc_array_size (array, &size);
571 arraysize = mpz_get_ui (size);
572 mpz_clear (size);
574 arrayvec = XCNEWVEC (gfc_expr*, arraysize);
576 array_ctor = gfc_constructor_first (array->value.constructor);
577 mask_ctor = NULL;
578 if (mask && mask->expr_type == EXPR_ARRAY)
579 mask_ctor = gfc_constructor_first (mask->value.constructor);
581 for (i = 0; i < arraysize; ++i)
583 arrayvec[i] = array_ctor->expr;
584 array_ctor = gfc_constructor_next (array_ctor);
586 if (mask_ctor)
588 if (!mask_ctor->expr->value.logical)
589 arrayvec[i] = NULL;
591 mask_ctor = gfc_constructor_next (mask_ctor);
595 /* Same for the result expression. */
596 gfc_array_size (result, &size);
597 resultsize = mpz_get_ui (size);
598 mpz_clear (size);
600 resultvec = XCNEWVEC (gfc_expr*, resultsize);
601 result_ctor = gfc_constructor_first (result->value.constructor);
602 for (i = 0; i < resultsize; ++i)
604 resultvec[i] = result_ctor->expr;
605 result_ctor = gfc_constructor_next (result_ctor);
608 gfc_extract_int (dim, &dim_index);
609 dim_index -= 1; /* zero-base index */
610 dim_extent = 0;
611 dim_stride = 0;
613 for (i = 0, n = 0; i < array->rank; ++i)
615 count[i] = 0;
616 tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]);
617 if (i == dim_index)
619 dim_extent = mpz_get_si (array->shape[i]);
620 dim_stride = tmpstride[i];
621 continue;
624 extent[n] = mpz_get_si (array->shape[i]);
625 sstride[n] = tmpstride[i];
626 dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1];
627 n += 1;
630 done = resultsize <= 0;
631 base = arrayvec;
632 dest = resultvec;
633 while (!done)
635 for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n)
636 if (*src)
637 *dest = op (*dest, gfc_copy_expr (*src));
639 count[0]++;
640 base += sstride[0];
641 dest += dstride[0];
643 n = 0;
644 while (!done && count[n] == extent[n])
646 count[n] = 0;
647 base -= sstride[n] * extent[n];
648 dest -= dstride[n] * extent[n];
650 n++;
651 if (n < result->rank)
653 /* If the nested loop is unrolled GFC_MAX_DIMENSIONS
654 times, we'd warn for the last iteration, because the
655 array index will have already been incremented to the
656 array sizes, and we can't tell that this must make
657 the test against result->rank false, because ranks
658 must not exceed GFC_MAX_DIMENSIONS. */
659 GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray-bounds)
660 count[n]++;
661 base += sstride[n];
662 dest += dstride[n];
663 GCC_DIAGNOSTIC_POP
665 else
666 done = true;
670 /* Place updated expression in result constructor. */
671 result_ctor = gfc_constructor_first (result->value.constructor);
672 for (i = 0; i < resultsize; ++i)
674 if (post_op)
675 result_ctor->expr = post_op (result_ctor->expr, resultvec[i]);
676 else
677 result_ctor->expr = resultvec[i];
678 result_ctor = gfc_constructor_next (result_ctor);
681 free (arrayvec);
682 free (resultvec);
683 return result;
687 static gfc_expr *
688 simplify_transformation (gfc_expr *array, gfc_expr *dim, gfc_expr *mask,
689 int init_val, transformational_op op)
691 gfc_expr *result;
692 bool size_zero;
694 size_zero = gfc_is_size_zero_array (array);
696 if (!(is_constant_array_expr (array) || size_zero)
697 || !gfc_is_constant_expr (dim))
698 return NULL;
700 if (mask
701 && !is_constant_array_expr (mask)
702 && mask->expr_type != EXPR_CONSTANT)
703 return NULL;
705 result = transformational_result (array, dim, array->ts.type,
706 array->ts.kind, &array->where);
707 init_result_expr (result, init_val, array);
709 if (size_zero)
710 return result;
712 return !dim || array->rank == 1 ?
713 simplify_transformation_to_scalar (result, array, mask, op) :
714 simplify_transformation_to_array (result, array, dim, mask, op, NULL);
718 /********************** Simplification functions *****************************/
720 gfc_expr *
721 gfc_simplify_abs (gfc_expr *e)
723 gfc_expr *result;
725 if (e->expr_type != EXPR_CONSTANT)
726 return NULL;
728 switch (e->ts.type)
730 case BT_INTEGER:
731 result = gfc_get_constant_expr (BT_INTEGER, e->ts.kind, &e->where);
732 mpz_abs (result->value.integer, e->value.integer);
733 return range_check (result, "IABS");
735 case BT_REAL:
736 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
737 mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
738 return range_check (result, "ABS");
740 case BT_COMPLEX:
741 gfc_set_model_kind (e->ts.kind);
742 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
743 mpc_abs (result->value.real, e->value.complex, GFC_RND_MODE);
744 return range_check (result, "CABS");
746 default:
747 gfc_internal_error ("gfc_simplify_abs(): Bad type");
752 static gfc_expr *
753 simplify_achar_char (gfc_expr *e, gfc_expr *k, const char *name, bool ascii)
755 gfc_expr *result;
756 int kind;
757 bool too_large = false;
759 if (e->expr_type != EXPR_CONSTANT)
760 return NULL;
762 kind = get_kind (BT_CHARACTER, k, name, gfc_default_character_kind);
763 if (kind == -1)
764 return &gfc_bad_expr;
766 if (mpz_cmp_si (e->value.integer, 0) < 0)
768 gfc_error ("Argument of %s function at %L is negative", name,
769 &e->where);
770 return &gfc_bad_expr;
773 if (ascii && warn_surprising && mpz_cmp_si (e->value.integer, 127) > 0)
774 gfc_warning (OPT_Wsurprising,
775 "Argument of %s function at %L outside of range [0,127]",
776 name, &e->where);
778 if (kind == 1 && mpz_cmp_si (e->value.integer, 255) > 0)
779 too_large = true;
780 else if (kind == 4)
782 mpz_t t;
783 mpz_init_set_ui (t, 2);
784 mpz_pow_ui (t, t, 32);
785 mpz_sub_ui (t, t, 1);
786 if (mpz_cmp (e->value.integer, t) > 0)
787 too_large = true;
788 mpz_clear (t);
791 if (too_large)
793 gfc_error ("Argument of %s function at %L is too large for the "
794 "collating sequence of kind %d", name, &e->where, kind);
795 return &gfc_bad_expr;
798 result = gfc_get_character_expr (kind, &e->where, NULL, 1);
799 result->value.character.string[0] = mpz_get_ui (e->value.integer);
801 return result;
806 /* We use the processor's collating sequence, because all
807 systems that gfortran currently works on are ASCII. */
809 gfc_expr *
810 gfc_simplify_achar (gfc_expr *e, gfc_expr *k)
812 return simplify_achar_char (e, k, "ACHAR", true);
816 gfc_expr *
817 gfc_simplify_acos (gfc_expr *x)
819 gfc_expr *result;
821 if (x->expr_type != EXPR_CONSTANT)
822 return NULL;
824 switch (x->ts.type)
826 case BT_REAL:
827 if (mpfr_cmp_si (x->value.real, 1) > 0
828 || mpfr_cmp_si (x->value.real, -1) < 0)
830 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
831 &x->where);
832 return &gfc_bad_expr;
834 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
835 mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
836 break;
838 case BT_COMPLEX:
839 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
840 mpc_acos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
841 break;
843 default:
844 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
847 return range_check (result, "ACOS");
850 gfc_expr *
851 gfc_simplify_acosh (gfc_expr *x)
853 gfc_expr *result;
855 if (x->expr_type != EXPR_CONSTANT)
856 return NULL;
858 switch (x->ts.type)
860 case BT_REAL:
861 if (mpfr_cmp_si (x->value.real, 1) < 0)
863 gfc_error ("Argument of ACOSH at %L must not be less than 1",
864 &x->where);
865 return &gfc_bad_expr;
868 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
869 mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
870 break;
872 case BT_COMPLEX:
873 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
874 mpc_acosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
875 break;
877 default:
878 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
881 return range_check (result, "ACOSH");
884 gfc_expr *
885 gfc_simplify_adjustl (gfc_expr *e)
887 gfc_expr *result;
888 int count, i, len;
889 gfc_char_t ch;
891 if (e->expr_type != EXPR_CONSTANT)
892 return NULL;
894 len = e->value.character.length;
896 for (count = 0, i = 0; i < len; ++i)
898 ch = e->value.character.string[i];
899 if (ch != ' ')
900 break;
901 ++count;
904 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
905 for (i = 0; i < len - count; ++i)
906 result->value.character.string[i] = e->value.character.string[count + i];
908 return result;
912 gfc_expr *
913 gfc_simplify_adjustr (gfc_expr *e)
915 gfc_expr *result;
916 int count, i, len;
917 gfc_char_t ch;
919 if (e->expr_type != EXPR_CONSTANT)
920 return NULL;
922 len = e->value.character.length;
924 for (count = 0, i = len - 1; i >= 0; --i)
926 ch = e->value.character.string[i];
927 if (ch != ' ')
928 break;
929 ++count;
932 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
933 for (i = 0; i < count; ++i)
934 result->value.character.string[i] = ' ';
936 for (i = count; i < len; ++i)
937 result->value.character.string[i] = e->value.character.string[i - count];
939 return result;
943 gfc_expr *
944 gfc_simplify_aimag (gfc_expr *e)
946 gfc_expr *result;
948 if (e->expr_type != EXPR_CONSTANT)
949 return NULL;
951 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
952 mpfr_set (result->value.real, mpc_imagref (e->value.complex), GFC_RND_MODE);
954 return range_check (result, "AIMAG");
958 gfc_expr *
959 gfc_simplify_aint (gfc_expr *e, gfc_expr *k)
961 gfc_expr *rtrunc, *result;
962 int kind;
964 kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
965 if (kind == -1)
966 return &gfc_bad_expr;
968 if (e->expr_type != EXPR_CONSTANT)
969 return NULL;
971 rtrunc = gfc_copy_expr (e);
972 mpfr_trunc (rtrunc->value.real, e->value.real);
974 result = gfc_real2real (rtrunc, kind);
976 gfc_free_expr (rtrunc);
978 return range_check (result, "AINT");
982 gfc_expr *
983 gfc_simplify_all (gfc_expr *mask, gfc_expr *dim)
985 return simplify_transformation (mask, dim, NULL, true, gfc_and);
989 gfc_expr *
990 gfc_simplify_dint (gfc_expr *e)
992 gfc_expr *rtrunc, *result;
994 if (e->expr_type != EXPR_CONSTANT)
995 return NULL;
997 rtrunc = gfc_copy_expr (e);
998 mpfr_trunc (rtrunc->value.real, e->value.real);
1000 result = gfc_real2real (rtrunc, gfc_default_double_kind);
1002 gfc_free_expr (rtrunc);
1004 return range_check (result, "DINT");
1008 gfc_expr *
1009 gfc_simplify_dreal (gfc_expr *e)
1011 gfc_expr *result = NULL;
1013 if (e->expr_type != EXPR_CONSTANT)
1014 return NULL;
1016 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
1017 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
1019 return range_check (result, "DREAL");
1023 gfc_expr *
1024 gfc_simplify_anint (gfc_expr *e, gfc_expr *k)
1026 gfc_expr *result;
1027 int kind;
1029 kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
1030 if (kind == -1)
1031 return &gfc_bad_expr;
1033 if (e->expr_type != EXPR_CONSTANT)
1034 return NULL;
1036 result = gfc_get_constant_expr (e->ts.type, kind, &e->where);
1037 mpfr_round (result->value.real, e->value.real);
1039 return range_check (result, "ANINT");
1043 gfc_expr *
1044 gfc_simplify_and (gfc_expr *x, gfc_expr *y)
1046 gfc_expr *result;
1047 int kind;
1049 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1050 return NULL;
1052 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
1054 switch (x->ts.type)
1056 case BT_INTEGER:
1057 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
1058 mpz_and (result->value.integer, x->value.integer, y->value.integer);
1059 return range_check (result, "AND");
1061 case BT_LOGICAL:
1062 return gfc_get_logical_expr (kind, &x->where,
1063 x->value.logical && y->value.logical);
1065 default:
1066 gcc_unreachable ();
1071 gfc_expr *
1072 gfc_simplify_any (gfc_expr *mask, gfc_expr *dim)
1074 return simplify_transformation (mask, dim, NULL, false, gfc_or);
1078 gfc_expr *
1079 gfc_simplify_dnint (gfc_expr *e)
1081 gfc_expr *result;
1083 if (e->expr_type != EXPR_CONSTANT)
1084 return NULL;
1086 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &e->where);
1087 mpfr_round (result->value.real, e->value.real);
1089 return range_check (result, "DNINT");
1093 gfc_expr *
1094 gfc_simplify_asin (gfc_expr *x)
1096 gfc_expr *result;
1098 if (x->expr_type != EXPR_CONSTANT)
1099 return NULL;
1101 switch (x->ts.type)
1103 case BT_REAL:
1104 if (mpfr_cmp_si (x->value.real, 1) > 0
1105 || mpfr_cmp_si (x->value.real, -1) < 0)
1107 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1108 &x->where);
1109 return &gfc_bad_expr;
1111 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1112 mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE);
1113 break;
1115 case BT_COMPLEX:
1116 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1117 mpc_asin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1118 break;
1120 default:
1121 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1124 return range_check (result, "ASIN");
1128 gfc_expr *
1129 gfc_simplify_asinh (gfc_expr *x)
1131 gfc_expr *result;
1133 if (x->expr_type != EXPR_CONSTANT)
1134 return NULL;
1136 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1138 switch (x->ts.type)
1140 case BT_REAL:
1141 mpfr_asinh (result->value.real, x->value.real, GFC_RND_MODE);
1142 break;
1144 case BT_COMPLEX:
1145 mpc_asinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1146 break;
1148 default:
1149 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1152 return range_check (result, "ASINH");
1156 gfc_expr *
1157 gfc_simplify_atan (gfc_expr *x)
1159 gfc_expr *result;
1161 if (x->expr_type != EXPR_CONSTANT)
1162 return NULL;
1164 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1166 switch (x->ts.type)
1168 case BT_REAL:
1169 mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE);
1170 break;
1172 case BT_COMPLEX:
1173 mpc_atan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1174 break;
1176 default:
1177 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1180 return range_check (result, "ATAN");
1184 gfc_expr *
1185 gfc_simplify_atanh (gfc_expr *x)
1187 gfc_expr *result;
1189 if (x->expr_type != EXPR_CONSTANT)
1190 return NULL;
1192 switch (x->ts.type)
1194 case BT_REAL:
1195 if (mpfr_cmp_si (x->value.real, 1) >= 0
1196 || mpfr_cmp_si (x->value.real, -1) <= 0)
1198 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1199 "to 1", &x->where);
1200 return &gfc_bad_expr;
1202 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1203 mpfr_atanh (result->value.real, x->value.real, GFC_RND_MODE);
1204 break;
1206 case BT_COMPLEX:
1207 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1208 mpc_atanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1209 break;
1211 default:
1212 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1215 return range_check (result, "ATANH");
1219 gfc_expr *
1220 gfc_simplify_atan2 (gfc_expr *y, gfc_expr *x)
1222 gfc_expr *result;
1224 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1225 return NULL;
1227 if (mpfr_zero_p (y->value.real) && mpfr_zero_p (x->value.real))
1229 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1230 "second argument must not be zero", &x->where);
1231 return &gfc_bad_expr;
1234 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1235 mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE);
1237 return range_check (result, "ATAN2");
1241 gfc_expr *
1242 gfc_simplify_bessel_j0 (gfc_expr *x)
1244 gfc_expr *result;
1246 if (x->expr_type != EXPR_CONSTANT)
1247 return NULL;
1249 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1250 mpfr_j0 (result->value.real, x->value.real, GFC_RND_MODE);
1252 return range_check (result, "BESSEL_J0");
1256 gfc_expr *
1257 gfc_simplify_bessel_j1 (gfc_expr *x)
1259 gfc_expr *result;
1261 if (x->expr_type != EXPR_CONSTANT)
1262 return NULL;
1264 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1265 mpfr_j1 (result->value.real, x->value.real, GFC_RND_MODE);
1267 return range_check (result, "BESSEL_J1");
1271 gfc_expr *
1272 gfc_simplify_bessel_jn (gfc_expr *order, gfc_expr *x)
1274 gfc_expr *result;
1275 long n;
1277 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1278 return NULL;
1280 n = mpz_get_si (order->value.integer);
1281 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1282 mpfr_jn (result->value.real, n, x->value.real, GFC_RND_MODE);
1284 return range_check (result, "BESSEL_JN");
1288 /* Simplify transformational form of JN and YN. */
1290 static gfc_expr *
1291 gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x,
1292 bool jn)
1294 gfc_expr *result;
1295 gfc_expr *e;
1296 long n1, n2;
1297 int i;
1298 mpfr_t x2rev, last1, last2;
1300 if (x->expr_type != EXPR_CONSTANT || order1->expr_type != EXPR_CONSTANT
1301 || order2->expr_type != EXPR_CONSTANT)
1302 return NULL;
1304 n1 = mpz_get_si (order1->value.integer);
1305 n2 = mpz_get_si (order2->value.integer);
1306 result = gfc_get_array_expr (x->ts.type, x->ts.kind, &x->where);
1307 result->rank = 1;
1308 result->shape = gfc_get_shape (1);
1309 mpz_init_set_ui (result->shape[0], MAX (n2-n1+1, 0));
1311 if (n2 < n1)
1312 return result;
1314 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1315 YN(N, 0.0) = -Inf. */
1317 if (mpfr_cmp_ui (x->value.real, 0.0) == 0)
1319 if (!jn && flag_range_check)
1321 gfc_error ("Result of BESSEL_YN is -INF at %L", &result->where);
1322 gfc_free_expr (result);
1323 return &gfc_bad_expr;
1326 if (jn && n1 == 0)
1328 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1329 mpfr_set_ui (e->value.real, 1, GFC_RND_MODE);
1330 gfc_constructor_append_expr (&result->value.constructor, e,
1331 &x->where);
1332 n1++;
1335 for (i = n1; i <= n2; i++)
1337 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1338 if (jn)
1339 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
1340 else
1341 mpfr_set_inf (e->value.real, -1);
1342 gfc_constructor_append_expr (&result->value.constructor, e,
1343 &x->where);
1346 return result;
1349 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1350 are stable for downward recursion and Neumann functions are stable
1351 for upward recursion. It is
1352 x2rev = 2.0/x,
1353 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1354 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1355 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1357 gfc_set_model_kind (x->ts.kind);
1359 /* Get first recursion anchor. */
1361 mpfr_init (last1);
1362 if (jn)
1363 mpfr_jn (last1, n2, x->value.real, GFC_RND_MODE);
1364 else
1365 mpfr_yn (last1, n1, x->value.real, GFC_RND_MODE);
1367 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1368 mpfr_set (e->value.real, last1, GFC_RND_MODE);
1369 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1371 mpfr_clear (last1);
1372 gfc_free_expr (e);
1373 gfc_free_expr (result);
1374 return &gfc_bad_expr;
1376 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1378 if (n1 == n2)
1380 mpfr_clear (last1);
1381 return result;
1384 /* Get second recursion anchor. */
1386 mpfr_init (last2);
1387 if (jn)
1388 mpfr_jn (last2, n2-1, x->value.real, GFC_RND_MODE);
1389 else
1390 mpfr_yn (last2, n1+1, x->value.real, GFC_RND_MODE);
1392 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1393 mpfr_set (e->value.real, last2, GFC_RND_MODE);
1394 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1396 mpfr_clear (last1);
1397 mpfr_clear (last2);
1398 gfc_free_expr (e);
1399 gfc_free_expr (result);
1400 return &gfc_bad_expr;
1402 if (jn)
1403 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where, -2);
1404 else
1405 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1407 if (n1 + 1 == n2)
1409 mpfr_clear (last1);
1410 mpfr_clear (last2);
1411 return result;
1414 /* Start actual recursion. */
1416 mpfr_init (x2rev);
1417 mpfr_ui_div (x2rev, 2, x->value.real, GFC_RND_MODE);
1419 for (i = 2; i <= n2-n1; i++)
1421 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1423 /* Special case: For YN, if the previous N gave -INF, set
1424 also N+1 to -INF. */
1425 if (!jn && !flag_range_check && mpfr_inf_p (last2))
1427 mpfr_set_inf (e->value.real, -1);
1428 gfc_constructor_append_expr (&result->value.constructor, e,
1429 &x->where);
1430 continue;
1433 mpfr_mul_si (e->value.real, x2rev, jn ? (n2-i+1) : (n1+i-1),
1434 GFC_RND_MODE);
1435 mpfr_mul (e->value.real, e->value.real, last2, GFC_RND_MODE);
1436 mpfr_sub (e->value.real, e->value.real, last1, GFC_RND_MODE);
1438 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1440 /* Range_check frees "e" in that case. */
1441 e = NULL;
1442 goto error;
1445 if (jn)
1446 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where,
1447 -i-1);
1448 else
1449 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1451 mpfr_set (last1, last2, GFC_RND_MODE);
1452 mpfr_set (last2, e->value.real, GFC_RND_MODE);
1455 mpfr_clear (last1);
1456 mpfr_clear (last2);
1457 mpfr_clear (x2rev);
1458 return result;
1460 error:
1461 mpfr_clear (last1);
1462 mpfr_clear (last2);
1463 mpfr_clear (x2rev);
1464 gfc_free_expr (e);
1465 gfc_free_expr (result);
1466 return &gfc_bad_expr;
1470 gfc_expr *
1471 gfc_simplify_bessel_jn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1473 return gfc_simplify_bessel_n2 (order1, order2, x, true);
1477 gfc_expr *
1478 gfc_simplify_bessel_y0 (gfc_expr *x)
1480 gfc_expr *result;
1482 if (x->expr_type != EXPR_CONSTANT)
1483 return NULL;
1485 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1486 mpfr_y0 (result->value.real, x->value.real, GFC_RND_MODE);
1488 return range_check (result, "BESSEL_Y0");
1492 gfc_expr *
1493 gfc_simplify_bessel_y1 (gfc_expr *x)
1495 gfc_expr *result;
1497 if (x->expr_type != EXPR_CONSTANT)
1498 return NULL;
1500 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1501 mpfr_y1 (result->value.real, x->value.real, GFC_RND_MODE);
1503 return range_check (result, "BESSEL_Y1");
1507 gfc_expr *
1508 gfc_simplify_bessel_yn (gfc_expr *order, gfc_expr *x)
1510 gfc_expr *result;
1511 long n;
1513 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1514 return NULL;
1516 n = mpz_get_si (order->value.integer);
1517 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1518 mpfr_yn (result->value.real, n, x->value.real, GFC_RND_MODE);
1520 return range_check (result, "BESSEL_YN");
1524 gfc_expr *
1525 gfc_simplify_bessel_yn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1527 return gfc_simplify_bessel_n2 (order1, order2, x, false);
1531 gfc_expr *
1532 gfc_simplify_bit_size (gfc_expr *e)
1534 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1535 return gfc_get_int_expr (e->ts.kind, &e->where,
1536 gfc_integer_kinds[i].bit_size);
1540 gfc_expr *
1541 gfc_simplify_btest (gfc_expr *e, gfc_expr *bit)
1543 int b;
1545 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
1546 return NULL;
1548 if (gfc_extract_int (bit, &b) || b < 0)
1549 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where, false);
1551 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where,
1552 mpz_tstbit (e->value.integer, b));
1556 static int
1557 compare_bitwise (gfc_expr *i, gfc_expr *j)
1559 mpz_t x, y;
1560 int k, res;
1562 gcc_assert (i->ts.type == BT_INTEGER);
1563 gcc_assert (j->ts.type == BT_INTEGER);
1565 mpz_init_set (x, i->value.integer);
1566 k = gfc_validate_kind (i->ts.type, i->ts.kind, false);
1567 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
1569 mpz_init_set (y, j->value.integer);
1570 k = gfc_validate_kind (j->ts.type, j->ts.kind, false);
1571 convert_mpz_to_unsigned (y, gfc_integer_kinds[k].bit_size);
1573 res = mpz_cmp (x, y);
1574 mpz_clear (x);
1575 mpz_clear (y);
1576 return res;
1580 gfc_expr *
1581 gfc_simplify_bge (gfc_expr *i, gfc_expr *j)
1583 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1584 return NULL;
1586 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1587 compare_bitwise (i, j) >= 0);
1591 gfc_expr *
1592 gfc_simplify_bgt (gfc_expr *i, gfc_expr *j)
1594 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1595 return NULL;
1597 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1598 compare_bitwise (i, j) > 0);
1602 gfc_expr *
1603 gfc_simplify_ble (gfc_expr *i, gfc_expr *j)
1605 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1606 return NULL;
1608 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1609 compare_bitwise (i, j) <= 0);
1613 gfc_expr *
1614 gfc_simplify_blt (gfc_expr *i, gfc_expr *j)
1616 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1617 return NULL;
1619 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1620 compare_bitwise (i, j) < 0);
1624 gfc_expr *
1625 gfc_simplify_ceiling (gfc_expr *e, gfc_expr *k)
1627 gfc_expr *ceil, *result;
1628 int kind;
1630 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
1631 if (kind == -1)
1632 return &gfc_bad_expr;
1634 if (e->expr_type != EXPR_CONSTANT)
1635 return NULL;
1637 ceil = gfc_copy_expr (e);
1638 mpfr_ceil (ceil->value.real, e->value.real);
1640 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
1641 gfc_mpfr_to_mpz (result->value.integer, ceil->value.real, &e->where);
1643 gfc_free_expr (ceil);
1645 return range_check (result, "CEILING");
1649 gfc_expr *
1650 gfc_simplify_char (gfc_expr *e, gfc_expr *k)
1652 return simplify_achar_char (e, k, "CHAR", false);
1656 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1658 static gfc_expr *
1659 simplify_cmplx (const char *name, gfc_expr *x, gfc_expr *y, int kind)
1661 gfc_expr *result;
1663 if (convert_boz (x, kind) == &gfc_bad_expr)
1664 return &gfc_bad_expr;
1666 if (convert_boz (y, kind) == &gfc_bad_expr)
1667 return &gfc_bad_expr;
1669 if (x->expr_type != EXPR_CONSTANT
1670 || (y != NULL && y->expr_type != EXPR_CONSTANT))
1671 return NULL;
1673 result = gfc_get_constant_expr (BT_COMPLEX, kind, &x->where);
1675 switch (x->ts.type)
1677 case BT_INTEGER:
1678 mpc_set_z (result->value.complex, x->value.integer, GFC_MPC_RND_MODE);
1679 break;
1681 case BT_REAL:
1682 mpc_set_fr (result->value.complex, x->value.real, GFC_RND_MODE);
1683 break;
1685 case BT_COMPLEX:
1686 mpc_set (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1687 break;
1689 default:
1690 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1693 if (!y)
1694 return range_check (result, name);
1696 switch (y->ts.type)
1698 case BT_INTEGER:
1699 mpfr_set_z (mpc_imagref (result->value.complex),
1700 y->value.integer, GFC_RND_MODE);
1701 break;
1703 case BT_REAL:
1704 mpfr_set (mpc_imagref (result->value.complex),
1705 y->value.real, GFC_RND_MODE);
1706 break;
1708 default:
1709 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1712 return range_check (result, name);
1716 gfc_expr *
1717 gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k)
1719 int kind;
1721 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_complex_kind);
1722 if (kind == -1)
1723 return &gfc_bad_expr;
1725 return simplify_cmplx ("CMPLX", x, y, kind);
1729 gfc_expr *
1730 gfc_simplify_complex (gfc_expr *x, gfc_expr *y)
1732 int kind;
1734 if (x->ts.type == BT_INTEGER && y->ts.type == BT_INTEGER)
1735 kind = gfc_default_complex_kind;
1736 else if (x->ts.type == BT_REAL || y->ts.type == BT_INTEGER)
1737 kind = x->ts.kind;
1738 else if (x->ts.type == BT_INTEGER || y->ts.type == BT_REAL)
1739 kind = y->ts.kind;
1740 else if (x->ts.type == BT_REAL && y->ts.type == BT_REAL)
1741 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
1742 else
1743 gcc_unreachable ();
1745 return simplify_cmplx ("COMPLEX", x, y, kind);
1749 gfc_expr *
1750 gfc_simplify_conjg (gfc_expr *e)
1752 gfc_expr *result;
1754 if (e->expr_type != EXPR_CONSTANT)
1755 return NULL;
1757 result = gfc_copy_expr (e);
1758 mpc_conj (result->value.complex, result->value.complex, GFC_MPC_RND_MODE);
1760 return range_check (result, "CONJG");
1763 /* Return the simplification of the constant expression in icall, or NULL
1764 if the expression is not constant. */
1766 static gfc_expr *
1767 simplify_trig_call (gfc_expr *icall)
1769 gfc_isym_id func = icall->value.function.isym->id;
1770 gfc_expr *x = icall->value.function.actual->expr;
1772 /* The actual simplifiers will return NULL for non-constant x. */
1773 switch (func)
1775 case GFC_ISYM_ACOS:
1776 return gfc_simplify_acos (x);
1777 case GFC_ISYM_ASIN:
1778 return gfc_simplify_asin (x);
1779 case GFC_ISYM_ATAN:
1780 return gfc_simplify_atan (x);
1781 case GFC_ISYM_COS:
1782 return gfc_simplify_cos (x);
1783 case GFC_ISYM_COTAN:
1784 return gfc_simplify_cotan (x);
1785 case GFC_ISYM_SIN:
1786 return gfc_simplify_sin (x);
1787 case GFC_ISYM_TAN:
1788 return gfc_simplify_tan (x);
1789 default:
1790 gfc_internal_error ("in simplify_trig_call(): Bad intrinsic");
1794 /* Convert a floating-point number from radians to degrees. */
1796 static void
1797 degrees_f (mpfr_t x, mp_rnd_t rnd_mode)
1799 mpfr_t tmp;
1800 mpfr_init (tmp);
1802 /* Set x = x % 2pi to avoid offsets with large angles. */
1803 mpfr_const_pi (tmp, rnd_mode);
1804 mpfr_mul_ui (tmp, tmp, 2, rnd_mode);
1805 mpfr_fmod (tmp, x, tmp, rnd_mode);
1807 /* Set x = x * 180. */
1808 mpfr_mul_ui (x, x, 180, rnd_mode);
1810 /* Set x = x / pi. */
1811 mpfr_const_pi (tmp, rnd_mode);
1812 mpfr_div (x, x, tmp, rnd_mode);
1814 mpfr_clear (tmp);
1817 /* Convert a floating-point number from degrees to radians. */
1819 static void
1820 radians_f (mpfr_t x, mp_rnd_t rnd_mode)
1822 mpfr_t tmp;
1823 mpfr_init (tmp);
1825 /* Set x = x % 360 to avoid offsets with large angles. */
1826 mpfr_set_ui (tmp, 360, rnd_mode);
1827 mpfr_fmod (tmp, x, tmp, rnd_mode);
1829 /* Set x = x * pi. */
1830 mpfr_const_pi (tmp, rnd_mode);
1831 mpfr_mul (x, x, tmp, rnd_mode);
1833 /* Set x = x / 180. */
1834 mpfr_div_ui (x, x, 180, rnd_mode);
1836 mpfr_clear (tmp);
1840 /* Convert argument to radians before calling a trig function. */
1842 gfc_expr *
1843 gfc_simplify_trigd (gfc_expr *icall)
1845 gfc_expr *arg;
1847 arg = icall->value.function.actual->expr;
1849 if (arg->ts.type != BT_REAL)
1850 gfc_internal_error ("in gfc_simplify_trigd(): Bad type");
1852 if (arg->expr_type == EXPR_CONSTANT)
1853 /* Convert constant to radians before passing off to simplifier. */
1854 radians_f (arg->value.real, GFC_RND_MODE);
1856 /* Let the usual simplifier take over - we just simplified the arg. */
1857 return simplify_trig_call (icall);
1860 /* Convert result of an inverse trig function to degrees. */
1862 gfc_expr *
1863 gfc_simplify_atrigd (gfc_expr *icall)
1865 gfc_expr *result;
1867 if (icall->value.function.actual->expr->ts.type != BT_REAL)
1868 gfc_internal_error ("in gfc_simplify_atrigd(): Bad type");
1870 /* See if another simplifier has work to do first. */
1871 result = simplify_trig_call (icall);
1873 if (result && result->expr_type == EXPR_CONSTANT)
1875 /* Convert constant to degrees after passing off to actual simplifier. */
1876 degrees_f (result->value.real, GFC_RND_MODE);
1877 return result;
1880 /* Let gfc_resolve_atrigd take care of the non-constant case. */
1881 return NULL;
1884 /* Convert the result of atan2 to degrees. */
1886 gfc_expr *
1887 gfc_simplify_atan2d (gfc_expr *y, gfc_expr *x)
1889 gfc_expr *result;
1891 if (x->ts.type != BT_REAL || y->ts.type != BT_REAL)
1892 gfc_internal_error ("in gfc_simplify_atan2d(): Bad type");
1894 if (x->expr_type == EXPR_CONSTANT && y->expr_type == EXPR_CONSTANT)
1896 result = gfc_simplify_atan2 (y, x);
1897 if (result != NULL)
1899 degrees_f (result->value.real, GFC_RND_MODE);
1900 return result;
1904 /* Let gfc_resolve_atan2d take care of the non-constant case. */
1905 return NULL;
1908 gfc_expr *
1909 gfc_simplify_cos (gfc_expr *x)
1911 gfc_expr *result;
1913 if (x->expr_type != EXPR_CONSTANT)
1914 return NULL;
1916 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1918 switch (x->ts.type)
1920 case BT_REAL:
1921 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
1922 break;
1924 case BT_COMPLEX:
1925 gfc_set_model_kind (x->ts.kind);
1926 mpc_cos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1927 break;
1929 default:
1930 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1933 return range_check (result, "COS");
1937 gfc_expr *
1938 gfc_simplify_cosh (gfc_expr *x)
1940 gfc_expr *result;
1942 if (x->expr_type != EXPR_CONSTANT)
1943 return NULL;
1945 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1947 switch (x->ts.type)
1949 case BT_REAL:
1950 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
1951 break;
1953 case BT_COMPLEX:
1954 mpc_cosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1955 break;
1957 default:
1958 gcc_unreachable ();
1961 return range_check (result, "COSH");
1965 gfc_expr *
1966 gfc_simplify_count (gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
1968 gfc_expr *result;
1969 bool size_zero;
1971 size_zero = gfc_is_size_zero_array (mask);
1973 if (!(is_constant_array_expr (mask) || size_zero)
1974 || !gfc_is_constant_expr (dim)
1975 || !gfc_is_constant_expr (kind))
1976 return NULL;
1978 result = transformational_result (mask, dim,
1979 BT_INTEGER,
1980 get_kind (BT_INTEGER, kind, "COUNT",
1981 gfc_default_integer_kind),
1982 &mask->where);
1984 init_result_expr (result, 0, NULL);
1986 if (size_zero)
1987 return result;
1989 /* Passing MASK twice, once as data array, once as mask.
1990 Whenever gfc_count is called, '1' is added to the result. */
1991 return !dim || mask->rank == 1 ?
1992 simplify_transformation_to_scalar (result, mask, mask, gfc_count) :
1993 simplify_transformation_to_array (result, mask, dim, mask, gfc_count, NULL);
1996 /* Simplification routine for cshift. This works by copying the array
1997 expressions into a one-dimensional array, shuffling the values into another
1998 one-dimensional array and creating the new array expression from this. The
1999 shuffling part is basically taken from the library routine. */
2001 gfc_expr *
2002 gfc_simplify_cshift (gfc_expr *array, gfc_expr *shift, gfc_expr *dim)
2004 gfc_expr *result;
2005 int which;
2006 gfc_expr **arrayvec, **resultvec;
2007 gfc_expr **rptr, **sptr;
2008 mpz_t size;
2009 size_t arraysize, shiftsize, i;
2010 gfc_constructor *array_ctor, *shift_ctor;
2011 ssize_t *shiftvec, *hptr;
2012 ssize_t shift_val, len;
2013 ssize_t count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
2014 hs_ex[GFC_MAX_DIMENSIONS],
2015 hstride[GFC_MAX_DIMENSIONS], sstride[GFC_MAX_DIMENSIONS],
2016 a_extent[GFC_MAX_DIMENSIONS], a_stride[GFC_MAX_DIMENSIONS],
2017 h_extent[GFC_MAX_DIMENSIONS],
2018 ss_ex[GFC_MAX_DIMENSIONS];
2019 ssize_t rsoffset;
2020 int d, n;
2021 bool continue_loop;
2022 gfc_expr **src, **dest;
2024 if (!is_constant_array_expr (array))
2025 return NULL;
2027 if (shift->rank > 0)
2028 gfc_simplify_expr (shift, 1);
2030 if (!gfc_is_constant_expr (shift))
2031 return NULL;
2033 /* Make dim zero-based. */
2034 if (dim)
2036 if (!gfc_is_constant_expr (dim))
2037 return NULL;
2038 which = mpz_get_si (dim->value.integer) - 1;
2040 else
2041 which = 0;
2043 gfc_array_size (array, &size);
2044 arraysize = mpz_get_ui (size);
2045 mpz_clear (size);
2047 result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where);
2048 result->shape = gfc_copy_shape (array->shape, array->rank);
2049 result->rank = array->rank;
2050 result->ts.u.derived = array->ts.u.derived;
2052 if (arraysize == 0)
2053 return result;
2055 arrayvec = XCNEWVEC (gfc_expr *, arraysize);
2056 array_ctor = gfc_constructor_first (array->value.constructor);
2057 for (i = 0; i < arraysize; i++)
2059 arrayvec[i] = array_ctor->expr;
2060 array_ctor = gfc_constructor_next (array_ctor);
2063 resultvec = XCNEWVEC (gfc_expr *, arraysize);
2065 extent[0] = 1;
2066 count[0] = 0;
2068 for (d=0; d < array->rank; d++)
2070 a_extent[d] = mpz_get_si (array->shape[d]);
2071 a_stride[d] = d == 0 ? 1 : a_stride[d-1] * a_extent[d-1];
2074 if (shift->rank > 0)
2076 gfc_array_size (shift, &size);
2077 shiftsize = mpz_get_ui (size);
2078 mpz_clear (size);
2079 shiftvec = XCNEWVEC (ssize_t, shiftsize);
2080 shift_ctor = gfc_constructor_first (shift->value.constructor);
2081 for (d = 0; d < shift->rank; d++)
2083 h_extent[d] = mpz_get_si (shift->shape[d]);
2084 hstride[d] = d == 0 ? 1 : hstride[d-1] * h_extent[d-1];
2087 else
2088 shiftvec = NULL;
2090 /* Shut up compiler */
2091 len = 1;
2092 rsoffset = 1;
2094 n = 0;
2095 for (d=0; d < array->rank; d++)
2097 if (d == which)
2099 rsoffset = a_stride[d];
2100 len = a_extent[d];
2102 else
2104 count[n] = 0;
2105 extent[n] = a_extent[d];
2106 sstride[n] = a_stride[d];
2107 ss_ex[n] = sstride[n] * extent[n];
2108 if (shiftvec)
2109 hs_ex[n] = hstride[n] * extent[n];
2110 n++;
2114 if (shiftvec)
2116 for (i = 0; i < shiftsize; i++)
2118 ssize_t val;
2119 val = mpz_get_si (shift_ctor->expr->value.integer);
2120 val = val % len;
2121 if (val < 0)
2122 val += len;
2123 shiftvec[i] = val;
2124 shift_ctor = gfc_constructor_next (shift_ctor);
2126 shift_val = 0;
2128 else
2130 shift_val = mpz_get_si (shift->value.integer);
2131 shift_val = shift_val % len;
2132 if (shift_val < 0)
2133 shift_val += len;
2136 continue_loop = true;
2137 d = array->rank;
2138 rptr = resultvec;
2139 sptr = arrayvec;
2140 hptr = shiftvec;
2142 while (continue_loop)
2144 ssize_t sh;
2145 if (shiftvec)
2146 sh = *hptr;
2147 else
2148 sh = shift_val;
2150 src = &sptr[sh * rsoffset];
2151 dest = rptr;
2152 for (n = 0; n < len - sh; n++)
2154 *dest = *src;
2155 dest += rsoffset;
2156 src += rsoffset;
2158 src = sptr;
2159 for ( n = 0; n < sh; n++)
2161 *dest = *src;
2162 dest += rsoffset;
2163 src += rsoffset;
2165 rptr += sstride[0];
2166 sptr += sstride[0];
2167 if (shiftvec)
2168 hptr += hstride[0];
2169 count[0]++;
2170 n = 0;
2171 while (count[n] == extent[n])
2173 count[n] = 0;
2174 rptr -= ss_ex[n];
2175 sptr -= ss_ex[n];
2176 if (shiftvec)
2177 hptr -= hs_ex[n];
2178 n++;
2179 if (n >= d - 1)
2181 continue_loop = false;
2182 break;
2184 else
2186 count[n]++;
2187 rptr += sstride[n];
2188 sptr += sstride[n];
2189 if (shiftvec)
2190 hptr += hstride[n];
2195 for (i = 0; i < arraysize; i++)
2197 gfc_constructor_append_expr (&result->value.constructor,
2198 gfc_copy_expr (resultvec[i]),
2199 NULL);
2201 return result;
2205 gfc_expr *
2206 gfc_simplify_dcmplx (gfc_expr *x, gfc_expr *y)
2208 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
2212 gfc_expr *
2213 gfc_simplify_dble (gfc_expr *e)
2215 gfc_expr *result = NULL;
2217 if (e->expr_type != EXPR_CONSTANT)
2218 return NULL;
2220 if (convert_boz (e, gfc_default_double_kind) == &gfc_bad_expr)
2221 return &gfc_bad_expr;
2223 result = gfc_convert_constant (e, BT_REAL, gfc_default_double_kind);
2224 if (result == &gfc_bad_expr)
2225 return &gfc_bad_expr;
2227 return range_check (result, "DBLE");
2231 gfc_expr *
2232 gfc_simplify_digits (gfc_expr *x)
2234 int i, digits;
2236 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2238 switch (x->ts.type)
2240 case BT_INTEGER:
2241 digits = gfc_integer_kinds[i].digits;
2242 break;
2244 case BT_REAL:
2245 case BT_COMPLEX:
2246 digits = gfc_real_kinds[i].digits;
2247 break;
2249 default:
2250 gcc_unreachable ();
2253 return gfc_get_int_expr (gfc_default_integer_kind, NULL, digits);
2257 gfc_expr *
2258 gfc_simplify_dim (gfc_expr *x, gfc_expr *y)
2260 gfc_expr *result;
2261 int kind;
2263 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2264 return NULL;
2266 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
2267 result = gfc_get_constant_expr (x->ts.type, kind, &x->where);
2269 switch (x->ts.type)
2271 case BT_INTEGER:
2272 if (mpz_cmp (x->value.integer, y->value.integer) > 0)
2273 mpz_sub (result->value.integer, x->value.integer, y->value.integer);
2274 else
2275 mpz_set_ui (result->value.integer, 0);
2277 break;
2279 case BT_REAL:
2280 if (mpfr_cmp (x->value.real, y->value.real) > 0)
2281 mpfr_sub (result->value.real, x->value.real, y->value.real,
2282 GFC_RND_MODE);
2283 else
2284 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2286 break;
2288 default:
2289 gfc_internal_error ("gfc_simplify_dim(): Bad type");
2292 return range_check (result, "DIM");
2296 gfc_expr*
2297 gfc_simplify_dot_product (gfc_expr *vector_a, gfc_expr *vector_b)
2299 /* If vector_a is a zero-sized array, the result is 0 for INTEGER,
2300 REAL, and COMPLEX types and .false. for LOGICAL. */
2301 if (vector_a->shape && mpz_get_si (vector_a->shape[0]) == 0)
2303 if (vector_a->ts.type == BT_LOGICAL)
2304 return gfc_get_logical_expr (gfc_default_logical_kind, NULL, false);
2305 else
2306 return gfc_get_int_expr (gfc_default_integer_kind, NULL, 0);
2309 if (!is_constant_array_expr (vector_a)
2310 || !is_constant_array_expr (vector_b))
2311 return NULL;
2313 return compute_dot_product (vector_a, 1, 0, vector_b, 1, 0, true);
2317 gfc_expr *
2318 gfc_simplify_dprod (gfc_expr *x, gfc_expr *y)
2320 gfc_expr *a1, *a2, *result;
2322 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2323 return NULL;
2325 a1 = gfc_real2real (x, gfc_default_double_kind);
2326 a2 = gfc_real2real (y, gfc_default_double_kind);
2328 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &x->where);
2329 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
2331 gfc_free_expr (a2);
2332 gfc_free_expr (a1);
2334 return range_check (result, "DPROD");
2338 static gfc_expr *
2339 simplify_dshift (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg,
2340 bool right)
2342 gfc_expr *result;
2343 int i, k, size, shift;
2345 if (arg1->expr_type != EXPR_CONSTANT || arg2->expr_type != EXPR_CONSTANT
2346 || shiftarg->expr_type != EXPR_CONSTANT)
2347 return NULL;
2349 k = gfc_validate_kind (BT_INTEGER, arg1->ts.kind, false);
2350 size = gfc_integer_kinds[k].bit_size;
2352 gfc_extract_int (shiftarg, &shift);
2354 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */
2355 if (right)
2356 shift = size - shift;
2358 result = gfc_get_constant_expr (BT_INTEGER, arg1->ts.kind, &arg1->where);
2359 mpz_set_ui (result->value.integer, 0);
2361 for (i = 0; i < shift; i++)
2362 if (mpz_tstbit (arg2->value.integer, size - shift + i))
2363 mpz_setbit (result->value.integer, i);
2365 for (i = 0; i < size - shift; i++)
2366 if (mpz_tstbit (arg1->value.integer, i))
2367 mpz_setbit (result->value.integer, shift + i);
2369 /* Convert to a signed value. */
2370 gfc_convert_mpz_to_signed (result->value.integer, size);
2372 return result;
2376 gfc_expr *
2377 gfc_simplify_dshiftr (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg)
2379 return simplify_dshift (arg1, arg2, shiftarg, true);
2383 gfc_expr *
2384 gfc_simplify_dshiftl (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg)
2386 return simplify_dshift (arg1, arg2, shiftarg, false);
2390 gfc_expr *
2391 gfc_simplify_eoshift (gfc_expr *array, gfc_expr *shift, gfc_expr *boundary,
2392 gfc_expr *dim)
2394 bool temp_boundary;
2395 gfc_expr *bnd;
2396 gfc_expr *result;
2397 int which;
2398 gfc_expr **arrayvec, **resultvec;
2399 gfc_expr **rptr, **sptr;
2400 mpz_t size;
2401 size_t arraysize, i;
2402 gfc_constructor *array_ctor, *shift_ctor, *bnd_ctor;
2403 ssize_t shift_val, len;
2404 ssize_t count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
2405 sstride[GFC_MAX_DIMENSIONS], a_extent[GFC_MAX_DIMENSIONS],
2406 a_stride[GFC_MAX_DIMENSIONS], ss_ex[GFC_MAX_DIMENSIONS];
2407 ssize_t rsoffset;
2408 int d, n;
2409 bool continue_loop;
2410 gfc_expr **src, **dest;
2411 size_t s_len;
2413 if (!is_constant_array_expr (array))
2414 return NULL;
2416 if (shift->rank > 0)
2417 gfc_simplify_expr (shift, 1);
2419 if (!gfc_is_constant_expr (shift))
2420 return NULL;
2422 if (boundary)
2424 if (boundary->rank > 0)
2425 gfc_simplify_expr (boundary, 1);
2427 if (!gfc_is_constant_expr (boundary))
2428 return NULL;
2431 if (dim)
2433 if (!gfc_is_constant_expr (dim))
2434 return NULL;
2435 which = mpz_get_si (dim->value.integer) - 1;
2437 else
2438 which = 0;
2440 s_len = 0;
2441 if (boundary == NULL)
2443 temp_boundary = true;
2444 switch (array->ts.type)
2447 case BT_INTEGER:
2448 bnd = gfc_get_int_expr (array->ts.kind, NULL, 0);
2449 break;
2451 case BT_LOGICAL:
2452 bnd = gfc_get_logical_expr (array->ts.kind, NULL, 0);
2453 break;
2455 case BT_REAL:
2456 bnd = gfc_get_constant_expr (array->ts.type, array->ts.kind, &gfc_current_locus);
2457 mpfr_set_ui (bnd->value.real, 0, GFC_RND_MODE);
2458 break;
2460 case BT_COMPLEX:
2461 bnd = gfc_get_constant_expr (array->ts.type, array->ts.kind, &gfc_current_locus);
2462 mpc_set_ui (bnd->value.complex, 0, GFC_RND_MODE);
2463 break;
2465 case BT_CHARACTER:
2466 s_len = mpz_get_ui (array->ts.u.cl->length->value.integer);
2467 bnd = gfc_get_character_expr (array->ts.kind, &gfc_current_locus, NULL, s_len);
2468 break;
2470 default:
2471 gcc_unreachable();
2475 else
2477 temp_boundary = false;
2478 bnd = boundary;
2481 gfc_array_size (array, &size);
2482 arraysize = mpz_get_ui (size);
2483 mpz_clear (size);
2485 result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where);
2486 result->shape = gfc_copy_shape (array->shape, array->rank);
2487 result->rank = array->rank;
2488 result->ts = array->ts;
2490 if (arraysize == 0)
2491 goto final;
2493 arrayvec = XCNEWVEC (gfc_expr *, arraysize);
2494 array_ctor = gfc_constructor_first (array->value.constructor);
2495 for (i = 0; i < arraysize; i++)
2497 arrayvec[i] = array_ctor->expr;
2498 array_ctor = gfc_constructor_next (array_ctor);
2501 resultvec = XCNEWVEC (gfc_expr *, arraysize);
2503 extent[0] = 1;
2504 count[0] = 0;
2506 for (d=0; d < array->rank; d++)
2508 a_extent[d] = mpz_get_si (array->shape[d]);
2509 a_stride[d] = d == 0 ? 1 : a_stride[d-1] * a_extent[d-1];
2512 if (shift->rank > 0)
2514 shift_ctor = gfc_constructor_first (shift->value.constructor);
2515 shift_val = 0;
2517 else
2519 shift_ctor = NULL;
2520 shift_val = mpz_get_si (shift->value.integer);
2523 if (bnd->rank > 0)
2524 bnd_ctor = gfc_constructor_first (bnd->value.constructor);
2525 else
2526 bnd_ctor = NULL;
2528 /* Shut up compiler */
2529 len = 1;
2530 rsoffset = 1;
2532 n = 0;
2533 for (d=0; d < array->rank; d++)
2535 if (d == which)
2537 rsoffset = a_stride[d];
2538 len = a_extent[d];
2540 else
2542 count[n] = 0;
2543 extent[n] = a_extent[d];
2544 sstride[n] = a_stride[d];
2545 ss_ex[n] = sstride[n] * extent[n];
2546 n++;
2550 continue_loop = true;
2551 d = array->rank;
2552 rptr = resultvec;
2553 sptr = arrayvec;
2555 while (continue_loop)
2557 ssize_t sh, delta;
2559 if (shift_ctor)
2560 sh = mpz_get_si (shift_ctor->expr->value.integer);
2561 else
2562 sh = shift_val;
2564 if (( sh >= 0 ? sh : -sh ) > len)
2566 delta = len;
2567 sh = len;
2569 else
2570 delta = (sh >= 0) ? sh: -sh;
2572 if (sh > 0)
2574 src = &sptr[delta * rsoffset];
2575 dest = rptr;
2577 else
2579 src = sptr;
2580 dest = &rptr[delta * rsoffset];
2583 for (n = 0; n < len - delta; n++)
2585 *dest = *src;
2586 dest += rsoffset;
2587 src += rsoffset;
2590 if (sh < 0)
2591 dest = rptr;
2593 n = delta;
2595 if (bnd_ctor)
2597 while (n--)
2599 *dest = gfc_copy_expr (bnd_ctor->expr);
2600 dest += rsoffset;
2603 else
2605 while (n--)
2607 *dest = gfc_copy_expr (bnd);
2608 dest += rsoffset;
2611 rptr += sstride[0];
2612 sptr += sstride[0];
2613 if (shift_ctor)
2614 shift_ctor = gfc_constructor_next (shift_ctor);
2616 if (bnd_ctor)
2617 bnd_ctor = gfc_constructor_next (bnd_ctor);
2619 count[0]++;
2620 n = 0;
2621 while (count[n] == extent[n])
2623 count[n] = 0;
2624 rptr -= ss_ex[n];
2625 sptr -= ss_ex[n];
2626 n++;
2627 if (n >= d - 1)
2629 continue_loop = false;
2630 break;
2632 else
2634 count[n]++;
2635 rptr += sstride[n];
2636 sptr += sstride[n];
2641 for (i = 0; i < arraysize; i++)
2643 gfc_constructor_append_expr (&result->value.constructor,
2644 gfc_copy_expr (resultvec[i]),
2645 NULL);
2648 final:
2649 if (temp_boundary)
2650 gfc_free_expr (bnd);
2652 return result;
2655 gfc_expr *
2656 gfc_simplify_erf (gfc_expr *x)
2658 gfc_expr *result;
2660 if (x->expr_type != EXPR_CONSTANT)
2661 return NULL;
2663 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2664 mpfr_erf (result->value.real, x->value.real, GFC_RND_MODE);
2666 return range_check (result, "ERF");
2670 gfc_expr *
2671 gfc_simplify_erfc (gfc_expr *x)
2673 gfc_expr *result;
2675 if (x->expr_type != EXPR_CONSTANT)
2676 return NULL;
2678 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2679 mpfr_erfc (result->value.real, x->value.real, GFC_RND_MODE);
2681 return range_check (result, "ERFC");
2685 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
2687 #define MAX_ITER 200
2688 #define ARG_LIMIT 12
2690 /* Calculate ERFC_SCALED directly by its definition:
2692 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
2694 using a large precision for intermediate results. This is used for all
2695 but large values of the argument. */
2696 static void
2697 fullprec_erfc_scaled (mpfr_t res, mpfr_t arg)
2699 mp_prec_t prec;
2700 mpfr_t a, b;
2702 prec = mpfr_get_default_prec ();
2703 mpfr_set_default_prec (10 * prec);
2705 mpfr_init (a);
2706 mpfr_init (b);
2708 mpfr_set (a, arg, GFC_RND_MODE);
2709 mpfr_sqr (b, a, GFC_RND_MODE);
2710 mpfr_exp (b, b, GFC_RND_MODE);
2711 mpfr_erfc (a, a, GFC_RND_MODE);
2712 mpfr_mul (a, a, b, GFC_RND_MODE);
2714 mpfr_set (res, a, GFC_RND_MODE);
2715 mpfr_set_default_prec (prec);
2717 mpfr_clear (a);
2718 mpfr_clear (b);
2721 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
2723 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
2724 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
2725 / (2 * x**2)**n)
2727 This is used for large values of the argument. Intermediate calculations
2728 are performed with twice the precision. We don't do a fixed number of
2729 iterations of the sum, but stop when it has converged to the required
2730 precision. */
2731 static void
2732 asympt_erfc_scaled (mpfr_t res, mpfr_t arg)
2734 mpfr_t sum, x, u, v, w, oldsum, sumtrunc;
2735 mpz_t num;
2736 mp_prec_t prec;
2737 unsigned i;
2739 prec = mpfr_get_default_prec ();
2740 mpfr_set_default_prec (2 * prec);
2742 mpfr_init (sum);
2743 mpfr_init (x);
2744 mpfr_init (u);
2745 mpfr_init (v);
2746 mpfr_init (w);
2747 mpz_init (num);
2749 mpfr_init (oldsum);
2750 mpfr_init (sumtrunc);
2751 mpfr_set_prec (oldsum, prec);
2752 mpfr_set_prec (sumtrunc, prec);
2754 mpfr_set (x, arg, GFC_RND_MODE);
2755 mpfr_set_ui (sum, 1, GFC_RND_MODE);
2756 mpz_set_ui (num, 1);
2758 mpfr_set (u, x, GFC_RND_MODE);
2759 mpfr_sqr (u, u, GFC_RND_MODE);
2760 mpfr_mul_ui (u, u, 2, GFC_RND_MODE);
2761 mpfr_pow_si (u, u, -1, GFC_RND_MODE);
2763 for (i = 1; i < MAX_ITER; i++)
2765 mpfr_set (oldsum, sum, GFC_RND_MODE);
2767 mpz_mul_ui (num, num, 2 * i - 1);
2768 mpz_neg (num, num);
2770 mpfr_set (w, u, GFC_RND_MODE);
2771 mpfr_pow_ui (w, w, i, GFC_RND_MODE);
2773 mpfr_set_z (v, num, GFC_RND_MODE);
2774 mpfr_mul (v, v, w, GFC_RND_MODE);
2776 mpfr_add (sum, sum, v, GFC_RND_MODE);
2778 mpfr_set (sumtrunc, sum, GFC_RND_MODE);
2779 if (mpfr_cmp (sumtrunc, oldsum) == 0)
2780 break;
2783 /* We should have converged by now; otherwise, ARG_LIMIT is probably
2784 set too low. */
2785 gcc_assert (i < MAX_ITER);
2787 /* Divide by x * sqrt(Pi). */
2788 mpfr_const_pi (u, GFC_RND_MODE);
2789 mpfr_sqrt (u, u, GFC_RND_MODE);
2790 mpfr_mul (u, u, x, GFC_RND_MODE);
2791 mpfr_div (sum, sum, u, GFC_RND_MODE);
2793 mpfr_set (res, sum, GFC_RND_MODE);
2794 mpfr_set_default_prec (prec);
2796 mpfr_clears (sum, x, u, v, w, oldsum, sumtrunc, NULL);
2797 mpz_clear (num);
2801 gfc_expr *
2802 gfc_simplify_erfc_scaled (gfc_expr *x)
2804 gfc_expr *result;
2806 if (x->expr_type != EXPR_CONSTANT)
2807 return NULL;
2809 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2810 if (mpfr_cmp_d (x->value.real, ARG_LIMIT) >= 0)
2811 asympt_erfc_scaled (result->value.real, x->value.real);
2812 else
2813 fullprec_erfc_scaled (result->value.real, x->value.real);
2815 return range_check (result, "ERFC_SCALED");
2818 #undef MAX_ITER
2819 #undef ARG_LIMIT
2822 gfc_expr *
2823 gfc_simplify_epsilon (gfc_expr *e)
2825 gfc_expr *result;
2826 int i;
2828 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2830 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
2831 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
2833 return range_check (result, "EPSILON");
2837 gfc_expr *
2838 gfc_simplify_exp (gfc_expr *x)
2840 gfc_expr *result;
2842 if (x->expr_type != EXPR_CONSTANT)
2843 return NULL;
2845 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2847 switch (x->ts.type)
2849 case BT_REAL:
2850 mpfr_exp (result->value.real, x->value.real, GFC_RND_MODE);
2851 break;
2853 case BT_COMPLEX:
2854 gfc_set_model_kind (x->ts.kind);
2855 mpc_exp (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
2856 break;
2858 default:
2859 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2862 return range_check (result, "EXP");
2866 gfc_expr *
2867 gfc_simplify_exponent (gfc_expr *x)
2869 long int val;
2870 gfc_expr *result;
2872 if (x->expr_type != EXPR_CONSTANT)
2873 return NULL;
2875 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2876 &x->where);
2878 /* EXPONENT(inf) = EXPONENT(nan) = HUGE(0) */
2879 if (mpfr_inf_p (x->value.real) || mpfr_nan_p (x->value.real))
2881 int i = gfc_validate_kind (BT_INTEGER, gfc_default_integer_kind, false);
2882 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
2883 return result;
2886 /* EXPONENT(+/- 0.0) = 0 */
2887 if (mpfr_zero_p (x->value.real))
2889 mpz_set_ui (result->value.integer, 0);
2890 return result;
2893 gfc_set_model (x->value.real);
2895 val = (long int) mpfr_get_exp (x->value.real);
2896 mpz_set_si (result->value.integer, val);
2898 return range_check (result, "EXPONENT");
2902 gfc_expr *
2903 gfc_simplify_failed_or_stopped_images (gfc_expr *team ATTRIBUTE_UNUSED,
2904 gfc_expr *kind)
2906 if (flag_coarray == GFC_FCOARRAY_NONE)
2908 gfc_current_locus = *gfc_current_intrinsic_where;
2909 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
2910 return &gfc_bad_expr;
2913 if (flag_coarray == GFC_FCOARRAY_SINGLE)
2915 gfc_expr *result;
2916 int actual_kind;
2917 if (kind)
2918 gfc_extract_int (kind, &actual_kind);
2919 else
2920 actual_kind = gfc_default_integer_kind;
2922 result = gfc_get_array_expr (BT_INTEGER, actual_kind, &gfc_current_locus);
2923 result->rank = 1;
2924 return result;
2927 /* For fcoarray = lib no simplification is possible, because it is not known
2928 what images failed or are stopped at compile time. */
2929 return NULL;
2933 gfc_expr *
2934 gfc_simplify_get_team (gfc_expr *level ATTRIBUTE_UNUSED)
2936 if (flag_coarray == GFC_FCOARRAY_NONE)
2938 gfc_current_locus = *gfc_current_intrinsic_where;
2939 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
2940 return &gfc_bad_expr;
2943 if (flag_coarray == GFC_FCOARRAY_SINGLE)
2945 gfc_expr *result;
2946 result = gfc_get_array_expr (BT_INTEGER, gfc_default_integer_kind, &gfc_current_locus);
2947 result->rank = 0;
2948 return result;
2951 /* For fcoarray = lib no simplification is possible, because it is not known
2952 what images failed or are stopped at compile time. */
2953 return NULL;
2957 gfc_expr *
2958 gfc_simplify_float (gfc_expr *a)
2960 gfc_expr *result;
2962 if (a->expr_type != EXPR_CONSTANT)
2963 return NULL;
2965 if (a->is_boz)
2967 if (convert_boz (a, gfc_default_real_kind) == &gfc_bad_expr)
2968 return &gfc_bad_expr;
2970 result = gfc_copy_expr (a);
2972 else
2973 result = gfc_int2real (a, gfc_default_real_kind);
2975 return range_check (result, "FLOAT");
2979 static bool
2980 is_last_ref_vtab (gfc_expr *e)
2982 gfc_ref *ref;
2983 gfc_component *comp = NULL;
2985 if (e->expr_type != EXPR_VARIABLE)
2986 return false;
2988 for (ref = e->ref; ref; ref = ref->next)
2989 if (ref->type == REF_COMPONENT)
2990 comp = ref->u.c.component;
2992 if (!e->ref || !comp)
2993 return e->symtree->n.sym->attr.vtab;
2995 if (comp->name[0] == '_' && strcmp (comp->name, "_vptr") == 0)
2996 return true;
2998 return false;
3002 gfc_expr *
3003 gfc_simplify_extends_type_of (gfc_expr *a, gfc_expr *mold)
3005 /* Avoid simplification of resolved symbols. */
3006 if (is_last_ref_vtab (a) || is_last_ref_vtab (mold))
3007 return NULL;
3009 if (a->ts.type == BT_DERIVED && mold->ts.type == BT_DERIVED)
3010 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3011 gfc_type_is_extension_of (mold->ts.u.derived,
3012 a->ts.u.derived));
3014 if (UNLIMITED_POLY (a) || UNLIMITED_POLY (mold))
3015 return NULL;
3017 /* Return .false. if the dynamic type can never be an extension. */
3018 if ((a->ts.type == BT_CLASS && mold->ts.type == BT_CLASS
3019 && !gfc_type_is_extension_of
3020 (mold->ts.u.derived->components->ts.u.derived,
3021 a->ts.u.derived->components->ts.u.derived)
3022 && !gfc_type_is_extension_of
3023 (a->ts.u.derived->components->ts.u.derived,
3024 mold->ts.u.derived->components->ts.u.derived))
3025 || (a->ts.type == BT_DERIVED && mold->ts.type == BT_CLASS
3026 && !gfc_type_is_extension_of
3027 (mold->ts.u.derived->components->ts.u.derived,
3028 a->ts.u.derived))
3029 || (a->ts.type == BT_CLASS && mold->ts.type == BT_DERIVED
3030 && !gfc_type_is_extension_of
3031 (mold->ts.u.derived,
3032 a->ts.u.derived->components->ts.u.derived)
3033 && !gfc_type_is_extension_of
3034 (a->ts.u.derived->components->ts.u.derived,
3035 mold->ts.u.derived)))
3036 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false);
3038 /* Return .true. if the dynamic type is guaranteed to be an extension. */
3039 if (a->ts.type == BT_CLASS && mold->ts.type == BT_DERIVED
3040 && gfc_type_is_extension_of (mold->ts.u.derived,
3041 a->ts.u.derived->components->ts.u.derived))
3042 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, true);
3044 return NULL;
3048 gfc_expr *
3049 gfc_simplify_same_type_as (gfc_expr *a, gfc_expr *b)
3051 /* Avoid simplification of resolved symbols. */
3052 if (is_last_ref_vtab (a) || is_last_ref_vtab (b))
3053 return NULL;
3055 /* Return .false. if the dynamic type can never be the
3056 same. */
3057 if (((a->ts.type == BT_CLASS && gfc_expr_attr (a).class_ok)
3058 || (b->ts.type == BT_CLASS && gfc_expr_attr (b).class_ok))
3059 && !gfc_type_compatible (&a->ts, &b->ts)
3060 && !gfc_type_compatible (&b->ts, &a->ts))
3061 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false);
3063 if (a->ts.type != BT_DERIVED || b->ts.type != BT_DERIVED)
3064 return NULL;
3066 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3067 gfc_compare_derived_types (a->ts.u.derived,
3068 b->ts.u.derived));
3072 gfc_expr *
3073 gfc_simplify_floor (gfc_expr *e, gfc_expr *k)
3075 gfc_expr *result;
3076 mpfr_t floor;
3077 int kind;
3079 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
3080 if (kind == -1)
3081 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
3083 if (e->expr_type != EXPR_CONSTANT)
3084 return NULL;
3086 mpfr_init2 (floor, mpfr_get_prec (e->value.real));
3087 mpfr_floor (floor, e->value.real);
3089 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
3090 gfc_mpfr_to_mpz (result->value.integer, floor, &e->where);
3092 mpfr_clear (floor);
3094 return range_check (result, "FLOOR");
3098 gfc_expr *
3099 gfc_simplify_fraction (gfc_expr *x)
3101 gfc_expr *result;
3103 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
3104 mpfr_t absv, exp, pow2;
3105 #else
3106 mpfr_exp_t e;
3107 #endif
3109 if (x->expr_type != EXPR_CONSTANT)
3110 return NULL;
3112 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
3114 /* FRACTION(inf) = NaN. */
3115 if (mpfr_inf_p (x->value.real))
3117 mpfr_set_nan (result->value.real);
3118 return result;
3121 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
3123 /* MPFR versions before 3.1.0 do not include mpfr_frexp.
3124 TODO: remove the kludge when MPFR 3.1.0 or newer will be required */
3126 if (mpfr_sgn (x->value.real) == 0)
3128 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
3129 return result;
3132 gfc_set_model_kind (x->ts.kind);
3133 mpfr_init (exp);
3134 mpfr_init (absv);
3135 mpfr_init (pow2);
3137 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
3138 mpfr_log2 (exp, absv, GFC_RND_MODE);
3140 mpfr_trunc (exp, exp);
3141 mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
3143 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
3145 mpfr_div (result->value.real, x->value.real, pow2, GFC_RND_MODE);
3147 mpfr_clears (exp, absv, pow2, NULL);
3149 #else
3151 /* mpfr_frexp() correctly handles zeros and NaNs. */
3152 mpfr_frexp (&e, result->value.real, x->value.real, GFC_RND_MODE);
3154 #endif
3156 return range_check (result, "FRACTION");
3160 gfc_expr *
3161 gfc_simplify_gamma (gfc_expr *x)
3163 gfc_expr *result;
3165 if (x->expr_type != EXPR_CONSTANT)
3166 return NULL;
3168 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3169 mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE);
3171 return range_check (result, "GAMMA");
3175 gfc_expr *
3176 gfc_simplify_huge (gfc_expr *e)
3178 gfc_expr *result;
3179 int i;
3181 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3182 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
3184 switch (e->ts.type)
3186 case BT_INTEGER:
3187 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
3188 break;
3190 case BT_REAL:
3191 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
3192 break;
3194 default:
3195 gcc_unreachable ();
3198 return result;
3202 gfc_expr *
3203 gfc_simplify_hypot (gfc_expr *x, gfc_expr *y)
3205 gfc_expr *result;
3207 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3208 return NULL;
3210 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3211 mpfr_hypot (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
3212 return range_check (result, "HYPOT");
3216 /* We use the processor's collating sequence, because all
3217 systems that gfortran currently works on are ASCII. */
3219 gfc_expr *
3220 gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
3222 gfc_expr *result;
3223 gfc_char_t index;
3224 int k;
3226 if (e->expr_type != EXPR_CONSTANT)
3227 return NULL;
3229 if (e->value.character.length != 1)
3231 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
3232 return &gfc_bad_expr;
3235 index = e->value.character.string[0];
3237 if (warn_surprising && index > 127)
3238 gfc_warning (OPT_Wsurprising,
3239 "Argument of IACHAR function at %L outside of range 0..127",
3240 &e->where);
3242 k = get_kind (BT_INTEGER, kind, "IACHAR", gfc_default_integer_kind);
3243 if (k == -1)
3244 return &gfc_bad_expr;
3246 result = gfc_get_int_expr (k, &e->where, index);
3248 return range_check (result, "IACHAR");
3252 static gfc_expr *
3253 do_bit_and (gfc_expr *result, gfc_expr *e)
3255 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
3256 gcc_assert (result->ts.type == BT_INTEGER
3257 && result->expr_type == EXPR_CONSTANT);
3259 mpz_and (result->value.integer, result->value.integer, e->value.integer);
3260 return result;
3264 gfc_expr *
3265 gfc_simplify_iall (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
3267 return simplify_transformation (array, dim, mask, -1, do_bit_and);
3271 static gfc_expr *
3272 do_bit_ior (gfc_expr *result, gfc_expr *e)
3274 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
3275 gcc_assert (result->ts.type == BT_INTEGER
3276 && result->expr_type == EXPR_CONSTANT);
3278 mpz_ior (result->value.integer, result->value.integer, e->value.integer);
3279 return result;
3283 gfc_expr *
3284 gfc_simplify_iany (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
3286 return simplify_transformation (array, dim, mask, 0, do_bit_ior);
3290 gfc_expr *
3291 gfc_simplify_iand (gfc_expr *x, gfc_expr *y)
3293 gfc_expr *result;
3295 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3296 return NULL;
3298 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
3299 mpz_and (result->value.integer, x->value.integer, y->value.integer);
3301 return range_check (result, "IAND");
3305 gfc_expr *
3306 gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y)
3308 gfc_expr *result;
3309 int k, pos;
3311 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3312 return NULL;
3314 gfc_extract_int (y, &pos);
3316 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
3318 result = gfc_copy_expr (x);
3320 convert_mpz_to_unsigned (result->value.integer,
3321 gfc_integer_kinds[k].bit_size);
3323 mpz_clrbit (result->value.integer, pos);
3325 gfc_convert_mpz_to_signed (result->value.integer,
3326 gfc_integer_kinds[k].bit_size);
3328 return result;
3332 gfc_expr *
3333 gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z)
3335 gfc_expr *result;
3336 int pos, len;
3337 int i, k, bitsize;
3338 int *bits;
3340 if (x->expr_type != EXPR_CONSTANT
3341 || y->expr_type != EXPR_CONSTANT
3342 || z->expr_type != EXPR_CONSTANT)
3343 return NULL;
3345 gfc_extract_int (y, &pos);
3346 gfc_extract_int (z, &len);
3348 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
3350 bitsize = gfc_integer_kinds[k].bit_size;
3352 if (pos + len > bitsize)
3354 gfc_error ("Sum of second and third arguments of IBITS exceeds "
3355 "bit size at %L", &y->where);
3356 return &gfc_bad_expr;
3359 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3360 convert_mpz_to_unsigned (result->value.integer,
3361 gfc_integer_kinds[k].bit_size);
3363 bits = XCNEWVEC (int, bitsize);
3365 for (i = 0; i < bitsize; i++)
3366 bits[i] = 0;
3368 for (i = 0; i < len; i++)
3369 bits[i] = mpz_tstbit (x->value.integer, i + pos);
3371 for (i = 0; i < bitsize; i++)
3373 if (bits[i] == 0)
3374 mpz_clrbit (result->value.integer, i);
3375 else if (bits[i] == 1)
3376 mpz_setbit (result->value.integer, i);
3377 else
3378 gfc_internal_error ("IBITS: Bad bit");
3381 free (bits);
3383 gfc_convert_mpz_to_signed (result->value.integer,
3384 gfc_integer_kinds[k].bit_size);
3386 return result;
3390 gfc_expr *
3391 gfc_simplify_ibset (gfc_expr *x, gfc_expr *y)
3393 gfc_expr *result;
3394 int k, pos;
3396 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3397 return NULL;
3399 gfc_extract_int (y, &pos);
3401 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
3403 result = gfc_copy_expr (x);
3405 convert_mpz_to_unsigned (result->value.integer,
3406 gfc_integer_kinds[k].bit_size);
3408 mpz_setbit (result->value.integer, pos);
3410 gfc_convert_mpz_to_signed (result->value.integer,
3411 gfc_integer_kinds[k].bit_size);
3413 return result;
3417 gfc_expr *
3418 gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
3420 gfc_expr *result;
3421 gfc_char_t index;
3422 int k;
3424 if (e->expr_type != EXPR_CONSTANT)
3425 return NULL;
3427 if (e->value.character.length != 1)
3429 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
3430 return &gfc_bad_expr;
3433 index = e->value.character.string[0];
3435 k = get_kind (BT_INTEGER, kind, "ICHAR", gfc_default_integer_kind);
3436 if (k == -1)
3437 return &gfc_bad_expr;
3439 result = gfc_get_int_expr (k, &e->where, index);
3441 return range_check (result, "ICHAR");
3445 gfc_expr *
3446 gfc_simplify_ieor (gfc_expr *x, gfc_expr *y)
3448 gfc_expr *result;
3450 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3451 return NULL;
3453 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
3454 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
3456 return range_check (result, "IEOR");
3460 gfc_expr *
3461 gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind)
3463 gfc_expr *result;
3464 int back, len, lensub;
3465 int i, j, k, count, index = 0, start;
3467 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT
3468 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
3469 return NULL;
3471 if (b != NULL && b->value.logical != 0)
3472 back = 1;
3473 else
3474 back = 0;
3476 k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind);
3477 if (k == -1)
3478 return &gfc_bad_expr;
3480 result = gfc_get_constant_expr (BT_INTEGER, k, &x->where);
3482 len = x->value.character.length;
3483 lensub = y->value.character.length;
3485 if (len < lensub)
3487 mpz_set_si (result->value.integer, 0);
3488 return result;
3491 if (back == 0)
3493 if (lensub == 0)
3495 mpz_set_si (result->value.integer, 1);
3496 return result;
3498 else if (lensub == 1)
3500 for (i = 0; i < len; i++)
3502 for (j = 0; j < lensub; j++)
3504 if (y->value.character.string[j]
3505 == x->value.character.string[i])
3507 index = i + 1;
3508 goto done;
3513 else
3515 for (i = 0; i < len; i++)
3517 for (j = 0; j < lensub; j++)
3519 if (y->value.character.string[j]
3520 == x->value.character.string[i])
3522 start = i;
3523 count = 0;
3525 for (k = 0; k < lensub; k++)
3527 if (y->value.character.string[k]
3528 == x->value.character.string[k + start])
3529 count++;
3532 if (count == lensub)
3534 index = start + 1;
3535 goto done;
3543 else
3545 if (lensub == 0)
3547 mpz_set_si (result->value.integer, len + 1);
3548 return result;
3550 else if (lensub == 1)
3552 for (i = 0; i < len; i++)
3554 for (j = 0; j < lensub; j++)
3556 if (y->value.character.string[j]
3557 == x->value.character.string[len - i])
3559 index = len - i + 1;
3560 goto done;
3565 else
3567 for (i = 0; i < len; i++)
3569 for (j = 0; j < lensub; j++)
3571 if (y->value.character.string[j]
3572 == x->value.character.string[len - i])
3574 start = len - i;
3575 if (start <= len - lensub)
3577 count = 0;
3578 for (k = 0; k < lensub; k++)
3579 if (y->value.character.string[k]
3580 == x->value.character.string[k + start])
3581 count++;
3583 if (count == lensub)
3585 index = start + 1;
3586 goto done;
3589 else
3591 continue;
3599 done:
3600 mpz_set_si (result->value.integer, index);
3601 return range_check (result, "INDEX");
3605 static gfc_expr *
3606 simplify_intconv (gfc_expr *e, int kind, const char *name)
3608 gfc_expr *result = NULL;
3610 if (e->expr_type != EXPR_CONSTANT)
3611 return NULL;
3613 result = gfc_convert_constant (e, BT_INTEGER, kind);
3614 if (result == &gfc_bad_expr)
3615 return &gfc_bad_expr;
3617 return range_check (result, name);
3621 gfc_expr *
3622 gfc_simplify_int (gfc_expr *e, gfc_expr *k)
3624 int kind;
3626 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
3627 if (kind == -1)
3628 return &gfc_bad_expr;
3630 return simplify_intconv (e, kind, "INT");
3633 gfc_expr *
3634 gfc_simplify_int2 (gfc_expr *e)
3636 return simplify_intconv (e, 2, "INT2");
3640 gfc_expr *
3641 gfc_simplify_int8 (gfc_expr *e)
3643 return simplify_intconv (e, 8, "INT8");
3647 gfc_expr *
3648 gfc_simplify_long (gfc_expr *e)
3650 return simplify_intconv (e, 4, "LONG");
3654 gfc_expr *
3655 gfc_simplify_ifix (gfc_expr *e)
3657 gfc_expr *rtrunc, *result;
3659 if (e->expr_type != EXPR_CONSTANT)
3660 return NULL;
3662 rtrunc = gfc_copy_expr (e);
3663 mpfr_trunc (rtrunc->value.real, e->value.real);
3665 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
3666 &e->where);
3667 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
3669 gfc_free_expr (rtrunc);
3671 return range_check (result, "IFIX");
3675 gfc_expr *
3676 gfc_simplify_idint (gfc_expr *e)
3678 gfc_expr *rtrunc, *result;
3680 if (e->expr_type != EXPR_CONSTANT)
3681 return NULL;
3683 rtrunc = gfc_copy_expr (e);
3684 mpfr_trunc (rtrunc->value.real, e->value.real);
3686 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
3687 &e->where);
3688 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
3690 gfc_free_expr (rtrunc);
3692 return range_check (result, "IDINT");
3696 gfc_expr *
3697 gfc_simplify_ior (gfc_expr *x, gfc_expr *y)
3699 gfc_expr *result;
3701 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3702 return NULL;
3704 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
3705 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
3707 return range_check (result, "IOR");
3711 static gfc_expr *
3712 do_bit_xor (gfc_expr *result, gfc_expr *e)
3714 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
3715 gcc_assert (result->ts.type == BT_INTEGER
3716 && result->expr_type == EXPR_CONSTANT);
3718 mpz_xor (result->value.integer, result->value.integer, e->value.integer);
3719 return result;
3723 gfc_expr *
3724 gfc_simplify_iparity (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
3726 return simplify_transformation (array, dim, mask, 0, do_bit_xor);
3730 gfc_expr *
3731 gfc_simplify_is_iostat_end (gfc_expr *x)
3733 if (x->expr_type != EXPR_CONSTANT)
3734 return NULL;
3736 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
3737 mpz_cmp_si (x->value.integer,
3738 LIBERROR_END) == 0);
3742 gfc_expr *
3743 gfc_simplify_is_iostat_eor (gfc_expr *x)
3745 if (x->expr_type != EXPR_CONSTANT)
3746 return NULL;
3748 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
3749 mpz_cmp_si (x->value.integer,
3750 LIBERROR_EOR) == 0);
3754 gfc_expr *
3755 gfc_simplify_isnan (gfc_expr *x)
3757 if (x->expr_type != EXPR_CONSTANT)
3758 return NULL;
3760 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
3761 mpfr_nan_p (x->value.real));
3765 /* Performs a shift on its first argument. Depending on the last
3766 argument, the shift can be arithmetic, i.e. with filling from the
3767 left like in the SHIFTA intrinsic. */
3768 static gfc_expr *
3769 simplify_shift (gfc_expr *e, gfc_expr *s, const char *name,
3770 bool arithmetic, int direction)
3772 gfc_expr *result;
3773 int ashift, *bits, i, k, bitsize, shift;
3775 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3776 return NULL;
3778 gfc_extract_int (s, &shift);
3780 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
3781 bitsize = gfc_integer_kinds[k].bit_size;
3783 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
3785 if (shift == 0)
3787 mpz_set (result->value.integer, e->value.integer);
3788 return result;
3791 if (direction > 0 && shift < 0)
3793 /* Left shift, as in SHIFTL. */
3794 gfc_error ("Second argument of %s is negative at %L", name, &e->where);
3795 return &gfc_bad_expr;
3797 else if (direction < 0)
3799 /* Right shift, as in SHIFTR or SHIFTA. */
3800 if (shift < 0)
3802 gfc_error ("Second argument of %s is negative at %L",
3803 name, &e->where);
3804 return &gfc_bad_expr;
3807 shift = -shift;
3810 ashift = (shift >= 0 ? shift : -shift);
3812 if (ashift > bitsize)
3814 gfc_error ("Magnitude of second argument of %s exceeds bit size "
3815 "at %L", name, &e->where);
3816 return &gfc_bad_expr;
3819 bits = XCNEWVEC (int, bitsize);
3821 for (i = 0; i < bitsize; i++)
3822 bits[i] = mpz_tstbit (e->value.integer, i);
3824 if (shift > 0)
3826 /* Left shift. */
3827 for (i = 0; i < shift; i++)
3828 mpz_clrbit (result->value.integer, i);
3830 for (i = 0; i < bitsize - shift; i++)
3832 if (bits[i] == 0)
3833 mpz_clrbit (result->value.integer, i + shift);
3834 else
3835 mpz_setbit (result->value.integer, i + shift);
3838 else
3840 /* Right shift. */
3841 if (arithmetic && bits[bitsize - 1])
3842 for (i = bitsize - 1; i >= bitsize - ashift; i--)
3843 mpz_setbit (result->value.integer, i);
3844 else
3845 for (i = bitsize - 1; i >= bitsize - ashift; i--)
3846 mpz_clrbit (result->value.integer, i);
3848 for (i = bitsize - 1; i >= ashift; i--)
3850 if (bits[i] == 0)
3851 mpz_clrbit (result->value.integer, i - ashift);
3852 else
3853 mpz_setbit (result->value.integer, i - ashift);
3857 gfc_convert_mpz_to_signed (result->value.integer, bitsize);
3858 free (bits);
3860 return result;
3864 gfc_expr *
3865 gfc_simplify_ishft (gfc_expr *e, gfc_expr *s)
3867 return simplify_shift (e, s, "ISHFT", false, 0);
3871 gfc_expr *
3872 gfc_simplify_lshift (gfc_expr *e, gfc_expr *s)
3874 return simplify_shift (e, s, "LSHIFT", false, 1);
3878 gfc_expr *
3879 gfc_simplify_rshift (gfc_expr *e, gfc_expr *s)
3881 return simplify_shift (e, s, "RSHIFT", true, -1);
3885 gfc_expr *
3886 gfc_simplify_shifta (gfc_expr *e, gfc_expr *s)
3888 return simplify_shift (e, s, "SHIFTA", true, -1);
3892 gfc_expr *
3893 gfc_simplify_shiftl (gfc_expr *e, gfc_expr *s)
3895 return simplify_shift (e, s, "SHIFTL", false, 1);
3899 gfc_expr *
3900 gfc_simplify_shiftr (gfc_expr *e, gfc_expr *s)
3902 return simplify_shift (e, s, "SHIFTR", false, -1);
3906 gfc_expr *
3907 gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
3909 gfc_expr *result;
3910 int shift, ashift, isize, ssize, delta, k;
3911 int i, *bits;
3913 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3914 return NULL;
3916 gfc_extract_int (s, &shift);
3918 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3919 isize = gfc_integer_kinds[k].bit_size;
3921 if (sz != NULL)
3923 if (sz->expr_type != EXPR_CONSTANT)
3924 return NULL;
3926 gfc_extract_int (sz, &ssize);
3928 else
3929 ssize = isize;
3931 if (shift >= 0)
3932 ashift = shift;
3933 else
3934 ashift = -shift;
3936 if (ashift > ssize)
3938 if (sz == NULL)
3939 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3940 "BIT_SIZE of first argument at %C");
3941 else
3942 gfc_error ("Absolute value of SHIFT shall be less than or equal "
3943 "to SIZE at %C");
3944 return &gfc_bad_expr;
3947 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
3949 mpz_set (result->value.integer, e->value.integer);
3951 if (shift == 0)
3952 return result;
3954 convert_mpz_to_unsigned (result->value.integer, isize);
3956 bits = XCNEWVEC (int, ssize);
3958 for (i = 0; i < ssize; i++)
3959 bits[i] = mpz_tstbit (e->value.integer, i);
3961 delta = ssize - ashift;
3963 if (shift > 0)
3965 for (i = 0; i < delta; i++)
3967 if (bits[i] == 0)
3968 mpz_clrbit (result->value.integer, i + shift);
3969 else
3970 mpz_setbit (result->value.integer, i + shift);
3973 for (i = delta; i < ssize; i++)
3975 if (bits[i] == 0)
3976 mpz_clrbit (result->value.integer, i - delta);
3977 else
3978 mpz_setbit (result->value.integer, i - delta);
3981 else
3983 for (i = 0; i < ashift; i++)
3985 if (bits[i] == 0)
3986 mpz_clrbit (result->value.integer, i + delta);
3987 else
3988 mpz_setbit (result->value.integer, i + delta);
3991 for (i = ashift; i < ssize; i++)
3993 if (bits[i] == 0)
3994 mpz_clrbit (result->value.integer, i + shift);
3995 else
3996 mpz_setbit (result->value.integer, i + shift);
4000 gfc_convert_mpz_to_signed (result->value.integer, isize);
4002 free (bits);
4003 return result;
4007 gfc_expr *
4008 gfc_simplify_kind (gfc_expr *e)
4010 return gfc_get_int_expr (gfc_default_integer_kind, NULL, e->ts.kind);
4014 static gfc_expr *
4015 simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper,
4016 gfc_array_spec *as, gfc_ref *ref, bool coarray)
4018 gfc_expr *l, *u, *result;
4019 int k;
4021 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
4022 gfc_default_integer_kind);
4023 if (k == -1)
4024 return &gfc_bad_expr;
4026 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
4028 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
4029 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
4030 if (!coarray && array->expr_type != EXPR_VARIABLE)
4032 if (upper)
4034 gfc_expr* dim = result;
4035 mpz_set_si (dim->value.integer, d);
4037 result = simplify_size (array, dim, k);
4038 gfc_free_expr (dim);
4039 if (!result)
4040 goto returnNull;
4042 else
4043 mpz_set_si (result->value.integer, 1);
4045 goto done;
4048 /* Otherwise, we have a variable expression. */
4049 gcc_assert (array->expr_type == EXPR_VARIABLE);
4050 gcc_assert (as);
4052 if (!gfc_resolve_array_spec (as, 0))
4053 return NULL;
4055 /* The last dimension of an assumed-size array is special. */
4056 if ((!coarray && d == as->rank && as->type == AS_ASSUMED_SIZE && !upper)
4057 || (coarray && d == as->rank + as->corank
4058 && (!upper || flag_coarray == GFC_FCOARRAY_SINGLE)))
4060 if (as->lower[d-1]->expr_type == EXPR_CONSTANT)
4062 gfc_free_expr (result);
4063 return gfc_copy_expr (as->lower[d-1]);
4066 goto returnNull;
4069 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
4071 /* Then, we need to know the extent of the given dimension. */
4072 if (coarray || (ref->u.ar.type == AR_FULL && !ref->next))
4074 gfc_expr *declared_bound;
4075 int empty_bound;
4076 bool constant_lbound, constant_ubound;
4078 l = as->lower[d-1];
4079 u = as->upper[d-1];
4081 gcc_assert (l != NULL);
4083 constant_lbound = l->expr_type == EXPR_CONSTANT;
4084 constant_ubound = u && u->expr_type == EXPR_CONSTANT;
4086 empty_bound = upper ? 0 : 1;
4087 declared_bound = upper ? u : l;
4089 if ((!upper && !constant_lbound)
4090 || (upper && !constant_ubound))
4091 goto returnNull;
4093 if (!coarray)
4095 /* For {L,U}BOUND, the value depends on whether the array
4096 is empty. We can nevertheless simplify if the declared bound
4097 has the same value as that of an empty array, in which case
4098 the result isn't dependent on the array emptyness. */
4099 if (mpz_cmp_si (declared_bound->value.integer, empty_bound) == 0)
4100 mpz_set_si (result->value.integer, empty_bound);
4101 else if (!constant_lbound || !constant_ubound)
4102 /* Array emptyness can't be determined, we can't simplify. */
4103 goto returnNull;
4104 else if (mpz_cmp (l->value.integer, u->value.integer) > 0)
4105 mpz_set_si (result->value.integer, empty_bound);
4106 else
4107 mpz_set (result->value.integer, declared_bound->value.integer);
4109 else
4110 mpz_set (result->value.integer, declared_bound->value.integer);
4112 else
4114 if (upper)
4116 if (!gfc_ref_dimen_size (&ref->u.ar, d - 1, &result->value.integer, NULL))
4117 goto returnNull;
4119 else
4120 mpz_set_si (result->value.integer, (long int) 1);
4123 done:
4124 return range_check (result, upper ? "UBOUND" : "LBOUND");
4126 returnNull:
4127 gfc_free_expr (result);
4128 return NULL;
4132 static gfc_expr *
4133 simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
4135 gfc_ref *ref;
4136 gfc_array_spec *as;
4137 int d;
4139 if (array->ts.type == BT_CLASS)
4140 return NULL;
4142 if (array->expr_type != EXPR_VARIABLE)
4144 as = NULL;
4145 ref = NULL;
4146 goto done;
4149 /* Follow any component references. */
4150 as = array->symtree->n.sym->as;
4151 for (ref = array->ref; ref; ref = ref->next)
4153 switch (ref->type)
4155 case REF_ARRAY:
4156 switch (ref->u.ar.type)
4158 case AR_ELEMENT:
4159 as = NULL;
4160 continue;
4162 case AR_FULL:
4163 /* We're done because 'as' has already been set in the
4164 previous iteration. */
4165 goto done;
4167 case AR_UNKNOWN:
4168 return NULL;
4170 case AR_SECTION:
4171 as = ref->u.ar.as;
4172 goto done;
4175 gcc_unreachable ();
4177 case REF_COMPONENT:
4178 as = ref->u.c.component->as;
4179 continue;
4181 case REF_SUBSTRING:
4182 continue;
4186 gcc_unreachable ();
4188 done:
4190 if (as && (as->type == AS_DEFERRED || as->type == AS_ASSUMED_RANK
4191 || (as->type == AS_ASSUMED_SHAPE && upper)))
4192 return NULL;
4194 gcc_assert (!as
4195 || (as->type != AS_DEFERRED
4196 && array->expr_type == EXPR_VARIABLE
4197 && !gfc_expr_attr (array).allocatable
4198 && !gfc_expr_attr (array).pointer));
4200 if (dim == NULL)
4202 /* Multi-dimensional bounds. */
4203 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
4204 gfc_expr *e;
4205 int k;
4207 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
4208 if (upper && as && as->type == AS_ASSUMED_SIZE)
4210 /* An error message will be emitted in
4211 check_assumed_size_reference (resolve.c). */
4212 return &gfc_bad_expr;
4215 /* Simplify the bounds for each dimension. */
4216 for (d = 0; d < array->rank; d++)
4218 bounds[d] = simplify_bound_dim (array, kind, d + 1, upper, as, ref,
4219 false);
4220 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
4222 int j;
4224 for (j = 0; j < d; j++)
4225 gfc_free_expr (bounds[j]);
4226 return bounds[d];
4230 /* Allocate the result expression. */
4231 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
4232 gfc_default_integer_kind);
4233 if (k == -1)
4234 return &gfc_bad_expr;
4236 e = gfc_get_array_expr (BT_INTEGER, k, &array->where);
4238 /* The result is a rank 1 array; its size is the rank of the first
4239 argument to {L,U}BOUND. */
4240 e->rank = 1;
4241 e->shape = gfc_get_shape (1);
4242 mpz_init_set_ui (e->shape[0], array->rank);
4244 /* Create the constructor for this array. */
4245 for (d = 0; d < array->rank; d++)
4246 gfc_constructor_append_expr (&e->value.constructor,
4247 bounds[d], &e->where);
4249 return e;
4251 else
4253 /* A DIM argument is specified. */
4254 if (dim->expr_type != EXPR_CONSTANT)
4255 return NULL;
4257 d = mpz_get_si (dim->value.integer);
4259 if ((d < 1 || d > array->rank)
4260 || (d == array->rank && as && as->type == AS_ASSUMED_SIZE && upper))
4262 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
4263 return &gfc_bad_expr;
4266 if (as && as->type == AS_ASSUMED_RANK)
4267 return NULL;
4269 return simplify_bound_dim (array, kind, d, upper, as, ref, false);
4274 static gfc_expr *
4275 simplify_cobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
4277 gfc_ref *ref;
4278 gfc_array_spec *as;
4279 int d;
4281 if (array->expr_type != EXPR_VARIABLE)
4282 return NULL;
4284 /* Follow any component references. */
4285 as = (array->ts.type == BT_CLASS && array->ts.u.derived->components)
4286 ? array->ts.u.derived->components->as
4287 : array->symtree->n.sym->as;
4288 for (ref = array->ref; ref; ref = ref->next)
4290 switch (ref->type)
4292 case REF_ARRAY:
4293 switch (ref->u.ar.type)
4295 case AR_ELEMENT:
4296 if (ref->u.ar.as->corank > 0)
4298 gcc_assert (as == ref->u.ar.as);
4299 goto done;
4301 as = NULL;
4302 continue;
4304 case AR_FULL:
4305 /* We're done because 'as' has already been set in the
4306 previous iteration. */
4307 goto done;
4309 case AR_UNKNOWN:
4310 return NULL;
4312 case AR_SECTION:
4313 as = ref->u.ar.as;
4314 goto done;
4317 gcc_unreachable ();
4319 case REF_COMPONENT:
4320 as = ref->u.c.component->as;
4321 continue;
4323 case REF_SUBSTRING:
4324 continue;
4328 if (!as)
4329 gcc_unreachable ();
4331 done:
4333 if (as->cotype == AS_DEFERRED || as->cotype == AS_ASSUMED_SHAPE)
4334 return NULL;
4336 if (dim == NULL)
4338 /* Multi-dimensional cobounds. */
4339 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
4340 gfc_expr *e;
4341 int k;
4343 /* Simplify the cobounds for each dimension. */
4344 for (d = 0; d < as->corank; d++)
4346 bounds[d] = simplify_bound_dim (array, kind, d + 1 + as->rank,
4347 upper, as, ref, true);
4348 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
4350 int j;
4352 for (j = 0; j < d; j++)
4353 gfc_free_expr (bounds[j]);
4354 return bounds[d];
4358 /* Allocate the result expression. */
4359 e = gfc_get_expr ();
4360 e->where = array->where;
4361 e->expr_type = EXPR_ARRAY;
4362 e->ts.type = BT_INTEGER;
4363 k = get_kind (BT_INTEGER, kind, upper ? "UCOBOUND" : "LCOBOUND",
4364 gfc_default_integer_kind);
4365 if (k == -1)
4367 gfc_free_expr (e);
4368 return &gfc_bad_expr;
4370 e->ts.kind = k;
4372 /* The result is a rank 1 array; its size is the rank of the first
4373 argument to {L,U}COBOUND. */
4374 e->rank = 1;
4375 e->shape = gfc_get_shape (1);
4376 mpz_init_set_ui (e->shape[0], as->corank);
4378 /* Create the constructor for this array. */
4379 for (d = 0; d < as->corank; d++)
4380 gfc_constructor_append_expr (&e->value.constructor,
4381 bounds[d], &e->where);
4382 return e;
4384 else
4386 /* A DIM argument is specified. */
4387 if (dim->expr_type != EXPR_CONSTANT)
4388 return NULL;
4390 d = mpz_get_si (dim->value.integer);
4392 if (d < 1 || d > as->corank)
4394 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
4395 return &gfc_bad_expr;
4398 return simplify_bound_dim (array, kind, d+as->rank, upper, as, ref, true);
4403 gfc_expr *
4404 gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
4406 return simplify_bound (array, dim, kind, 0);
4410 gfc_expr *
4411 gfc_simplify_lcobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
4413 return simplify_cobound (array, dim, kind, 0);
4416 gfc_expr *
4417 gfc_simplify_leadz (gfc_expr *e)
4419 unsigned long lz, bs;
4420 int i;
4422 if (e->expr_type != EXPR_CONSTANT)
4423 return NULL;
4425 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4426 bs = gfc_integer_kinds[i].bit_size;
4427 if (mpz_cmp_si (e->value.integer, 0) == 0)
4428 lz = bs;
4429 else if (mpz_cmp_si (e->value.integer, 0) < 0)
4430 lz = 0;
4431 else
4432 lz = bs - mpz_sizeinbase (e->value.integer, 2);
4434 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, lz);
4438 gfc_expr *
4439 gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
4441 gfc_expr *result;
4442 int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind);
4444 if (k == -1)
4445 return &gfc_bad_expr;
4447 if (e->expr_type == EXPR_CONSTANT)
4449 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
4450 mpz_set_si (result->value.integer, e->value.character.length);
4451 return range_check (result, "LEN");
4453 else if (e->ts.u.cl != NULL && e->ts.u.cl->length != NULL
4454 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT
4455 && e->ts.u.cl->length->ts.type == BT_INTEGER)
4457 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
4458 mpz_set (result->value.integer, e->ts.u.cl->length->value.integer);
4459 return range_check (result, "LEN");
4461 else if (e->expr_type == EXPR_VARIABLE && e->ts.type == BT_CHARACTER
4462 && e->symtree->n.sym
4463 && e->symtree->n.sym->ts.type != BT_DERIVED
4464 && e->symtree->n.sym->assoc && e->symtree->n.sym->assoc->target
4465 && e->symtree->n.sym->assoc->target->ts.type == BT_DERIVED
4466 && e->symtree->n.sym->assoc->target->symtree->n.sym
4467 && UNLIMITED_POLY (e->symtree->n.sym->assoc->target->symtree->n.sym))
4469 /* The expression in assoc->target points to a ref to the _data component
4470 of the unlimited polymorphic entity. To get the _len component the last
4471 _data ref needs to be stripped and a ref to the _len component added. */
4472 return gfc_get_len_component (e->symtree->n.sym->assoc->target);
4473 else
4474 return NULL;
4478 gfc_expr *
4479 gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
4481 gfc_expr *result;
4482 size_t count, len, i;
4483 int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind);
4485 if (k == -1)
4486 return &gfc_bad_expr;
4488 if (e->expr_type != EXPR_CONSTANT)
4489 return NULL;
4491 len = e->value.character.length;
4492 for (count = 0, i = 1; i <= len; i++)
4493 if (e->value.character.string[len - i] == ' ')
4494 count++;
4495 else
4496 break;
4498 result = gfc_get_int_expr (k, &e->where, len - count);
4499 return range_check (result, "LEN_TRIM");
4502 gfc_expr *
4503 gfc_simplify_lgamma (gfc_expr *x)
4505 gfc_expr *result;
4506 int sg;
4508 if (x->expr_type != EXPR_CONSTANT)
4509 return NULL;
4511 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
4512 mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE);
4514 return range_check (result, "LGAMMA");
4518 gfc_expr *
4519 gfc_simplify_lge (gfc_expr *a, gfc_expr *b)
4521 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
4522 return NULL;
4524 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
4525 gfc_compare_string (a, b) >= 0);
4529 gfc_expr *
4530 gfc_simplify_lgt (gfc_expr *a, gfc_expr *b)
4532 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
4533 return NULL;
4535 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
4536 gfc_compare_string (a, b) > 0);
4540 gfc_expr *
4541 gfc_simplify_lle (gfc_expr *a, gfc_expr *b)
4543 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
4544 return NULL;
4546 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
4547 gfc_compare_string (a, b) <= 0);
4551 gfc_expr *
4552 gfc_simplify_llt (gfc_expr *a, gfc_expr *b)
4554 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
4555 return NULL;
4557 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
4558 gfc_compare_string (a, b) < 0);
4562 gfc_expr *
4563 gfc_simplify_log (gfc_expr *x)
4565 gfc_expr *result;
4567 if (x->expr_type != EXPR_CONSTANT)
4568 return NULL;
4570 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
4572 switch (x->ts.type)
4574 case BT_REAL:
4575 if (mpfr_sgn (x->value.real) <= 0)
4577 gfc_error ("Argument of LOG at %L cannot be less than or equal "
4578 "to zero", &x->where);
4579 gfc_free_expr (result);
4580 return &gfc_bad_expr;
4583 mpfr_log (result->value.real, x->value.real, GFC_RND_MODE);
4584 break;
4586 case BT_COMPLEX:
4587 if (mpfr_zero_p (mpc_realref (x->value.complex))
4588 && mpfr_zero_p (mpc_imagref (x->value.complex)))
4590 gfc_error ("Complex argument of LOG at %L cannot be zero",
4591 &x->where);
4592 gfc_free_expr (result);
4593 return &gfc_bad_expr;
4596 gfc_set_model_kind (x->ts.kind);
4597 mpc_log (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
4598 break;
4600 default:
4601 gfc_internal_error ("gfc_simplify_log: bad type");
4604 return range_check (result, "LOG");
4608 gfc_expr *
4609 gfc_simplify_log10 (gfc_expr *x)
4611 gfc_expr *result;
4613 if (x->expr_type != EXPR_CONSTANT)
4614 return NULL;
4616 if (mpfr_sgn (x->value.real) <= 0)
4618 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
4619 "to zero", &x->where);
4620 return &gfc_bad_expr;
4623 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
4624 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
4626 return range_check (result, "LOG10");
4630 gfc_expr *
4631 gfc_simplify_logical (gfc_expr *e, gfc_expr *k)
4633 int kind;
4635 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
4636 if (kind < 0)
4637 return &gfc_bad_expr;
4639 if (e->expr_type != EXPR_CONSTANT)
4640 return NULL;
4642 return gfc_get_logical_expr (kind, &e->where, e->value.logical);
4646 gfc_expr*
4647 gfc_simplify_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
4649 gfc_expr *result;
4650 int row, result_rows, col, result_columns;
4651 int stride_a, offset_a, stride_b, offset_b;
4653 if (!is_constant_array_expr (matrix_a)
4654 || !is_constant_array_expr (matrix_b))
4655 return NULL;
4657 /* MATMUL should do mixed-mode arithmetic. Set the result type. */
4658 if (matrix_a->ts.type != matrix_b->ts.type)
4660 gfc_expr e;
4661 e.expr_type = EXPR_OP;
4662 gfc_clear_ts (&e.ts);
4663 e.value.op.op = INTRINSIC_NONE;
4664 e.value.op.op1 = matrix_a;
4665 e.value.op.op2 = matrix_b;
4666 gfc_type_convert_binary (&e, 1);
4667 result = gfc_get_array_expr (e.ts.type, e.ts.kind, &matrix_a->where);
4669 else
4671 result = gfc_get_array_expr (matrix_a->ts.type, matrix_a->ts.kind,
4672 &matrix_a->where);
4675 if (matrix_a->rank == 1 && matrix_b->rank == 2)
4677 result_rows = 1;
4678 result_columns = mpz_get_si (matrix_b->shape[1]);
4679 stride_a = 1;
4680 stride_b = mpz_get_si (matrix_b->shape[0]);
4682 result->rank = 1;
4683 result->shape = gfc_get_shape (result->rank);
4684 mpz_init_set_si (result->shape[0], result_columns);
4686 else if (matrix_a->rank == 2 && matrix_b->rank == 1)
4688 result_rows = mpz_get_si (matrix_a->shape[0]);
4689 result_columns = 1;
4690 stride_a = mpz_get_si (matrix_a->shape[0]);
4691 stride_b = 1;
4693 result->rank = 1;
4694 result->shape = gfc_get_shape (result->rank);
4695 mpz_init_set_si (result->shape[0], result_rows);
4697 else if (matrix_a->rank == 2 && matrix_b->rank == 2)
4699 result_rows = mpz_get_si (matrix_a->shape[0]);
4700 result_columns = mpz_get_si (matrix_b->shape[1]);
4701 stride_a = mpz_get_si (matrix_a->shape[0]);
4702 stride_b = mpz_get_si (matrix_b->shape[0]);
4704 result->rank = 2;
4705 result->shape = gfc_get_shape (result->rank);
4706 mpz_init_set_si (result->shape[0], result_rows);
4707 mpz_init_set_si (result->shape[1], result_columns);
4709 else
4710 gcc_unreachable();
4712 offset_a = offset_b = 0;
4713 for (col = 0; col < result_columns; ++col)
4715 offset_a = 0;
4717 for (row = 0; row < result_rows; ++row)
4719 gfc_expr *e = compute_dot_product (matrix_a, stride_a, offset_a,
4720 matrix_b, 1, offset_b, false);
4721 gfc_constructor_append_expr (&result->value.constructor,
4722 e, NULL);
4724 offset_a += 1;
4727 offset_b += stride_b;
4730 return result;
4734 gfc_expr *
4735 gfc_simplify_maskr (gfc_expr *i, gfc_expr *kind_arg)
4737 gfc_expr *result;
4738 int kind, arg, k;
4740 if (i->expr_type != EXPR_CONSTANT)
4741 return NULL;
4743 kind = get_kind (BT_INTEGER, kind_arg, "MASKR", gfc_default_integer_kind);
4744 if (kind == -1)
4745 return &gfc_bad_expr;
4746 k = gfc_validate_kind (BT_INTEGER, kind, false);
4748 bool fail = gfc_extract_int (i, &arg);
4749 gcc_assert (!fail);
4751 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
4753 /* MASKR(n) = 2^n - 1 */
4754 mpz_set_ui (result->value.integer, 1);
4755 mpz_mul_2exp (result->value.integer, result->value.integer, arg);
4756 mpz_sub_ui (result->value.integer, result->value.integer, 1);
4758 gfc_convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
4760 return result;
4764 gfc_expr *
4765 gfc_simplify_maskl (gfc_expr *i, gfc_expr *kind_arg)
4767 gfc_expr *result;
4768 int kind, arg, k;
4769 mpz_t z;
4771 if (i->expr_type != EXPR_CONSTANT)
4772 return NULL;
4774 kind = get_kind (BT_INTEGER, kind_arg, "MASKL", gfc_default_integer_kind);
4775 if (kind == -1)
4776 return &gfc_bad_expr;
4777 k = gfc_validate_kind (BT_INTEGER, kind, false);
4779 bool fail = gfc_extract_int (i, &arg);
4780 gcc_assert (!fail);
4782 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
4784 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
4785 mpz_init_set_ui (z, 1);
4786 mpz_mul_2exp (z, z, gfc_integer_kinds[k].bit_size);
4787 mpz_set_ui (result->value.integer, 1);
4788 mpz_mul_2exp (result->value.integer, result->value.integer,
4789 gfc_integer_kinds[k].bit_size - arg);
4790 mpz_sub (result->value.integer, z, result->value.integer);
4791 mpz_clear (z);
4793 gfc_convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
4795 return result;
4799 gfc_expr *
4800 gfc_simplify_merge (gfc_expr *tsource, gfc_expr *fsource, gfc_expr *mask)
4802 gfc_expr * result;
4803 gfc_constructor *tsource_ctor, *fsource_ctor, *mask_ctor;
4805 if (mask->expr_type == EXPR_CONSTANT)
4806 return gfc_get_parentheses (gfc_copy_expr (mask->value.logical
4807 ? tsource : fsource));
4809 if (!mask->rank || !is_constant_array_expr (mask)
4810 || !is_constant_array_expr (tsource) || !is_constant_array_expr (fsource))
4811 return NULL;
4813 result = gfc_get_array_expr (tsource->ts.type, tsource->ts.kind,
4814 &tsource->where);
4815 if (tsource->ts.type == BT_DERIVED)
4816 result->ts.u.derived = tsource->ts.u.derived;
4817 else if (tsource->ts.type == BT_CHARACTER)
4818 result->ts.u.cl = tsource->ts.u.cl;
4820 tsource_ctor = gfc_constructor_first (tsource->value.constructor);
4821 fsource_ctor = gfc_constructor_first (fsource->value.constructor);
4822 mask_ctor = gfc_constructor_first (mask->value.constructor);
4824 while (mask_ctor)
4826 if (mask_ctor->expr->value.logical)
4827 gfc_constructor_append_expr (&result->value.constructor,
4828 gfc_copy_expr (tsource_ctor->expr),
4829 NULL);
4830 else
4831 gfc_constructor_append_expr (&result->value.constructor,
4832 gfc_copy_expr (fsource_ctor->expr),
4833 NULL);
4834 tsource_ctor = gfc_constructor_next (tsource_ctor);
4835 fsource_ctor = gfc_constructor_next (fsource_ctor);
4836 mask_ctor = gfc_constructor_next (mask_ctor);
4839 result->shape = gfc_get_shape (1);
4840 gfc_array_size (result, &result->shape[0]);
4842 return result;
4846 gfc_expr *
4847 gfc_simplify_merge_bits (gfc_expr *i, gfc_expr *j, gfc_expr *mask_expr)
4849 mpz_t arg1, arg2, mask;
4850 gfc_expr *result;
4852 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT
4853 || mask_expr->expr_type != EXPR_CONSTANT)
4854 return NULL;
4856 result = gfc_get_constant_expr (BT_INTEGER, i->ts.kind, &i->where);
4858 /* Convert all argument to unsigned. */
4859 mpz_init_set (arg1, i->value.integer);
4860 mpz_init_set (arg2, j->value.integer);
4861 mpz_init_set (mask, mask_expr->value.integer);
4863 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
4864 mpz_and (arg1, arg1, mask);
4865 mpz_com (mask, mask);
4866 mpz_and (arg2, arg2, mask);
4867 mpz_ior (result->value.integer, arg1, arg2);
4869 mpz_clear (arg1);
4870 mpz_clear (arg2);
4871 mpz_clear (mask);
4873 return result;
4877 /* Selects between current value and extremum for simplify_min_max
4878 and simplify_minval_maxval. */
4879 static int
4880 min_max_choose (gfc_expr *arg, gfc_expr *extremum, int sign, bool back_val)
4882 int ret;
4884 switch (arg->ts.type)
4886 case BT_INTEGER:
4887 ret = mpz_cmp (arg->value.integer,
4888 extremum->value.integer) * sign;
4889 if (ret > 0)
4890 mpz_set (extremum->value.integer, arg->value.integer);
4891 break;
4893 case BT_REAL:
4894 if (mpfr_nan_p (extremum->value.real))
4896 ret = 1;
4897 mpfr_set (extremum->value.real, arg->value.real, GFC_RND_MODE);
4899 else if (mpfr_nan_p (arg->value.real))
4900 ret = -1;
4901 else
4903 ret = mpfr_cmp (arg->value.real, extremum->value.real) * sign;
4904 if (ret > 0)
4905 mpfr_set (extremum->value.real, arg->value.real, GFC_RND_MODE);
4907 break;
4909 case BT_CHARACTER:
4910 #define LENGTH(x) ((x)->value.character.length)
4911 #define STRING(x) ((x)->value.character.string)
4912 if (LENGTH (extremum) < LENGTH(arg))
4914 gfc_char_t *tmp = STRING(extremum);
4916 STRING(extremum) = gfc_get_wide_string (LENGTH(arg) + 1);
4917 memcpy (STRING(extremum), tmp,
4918 LENGTH(extremum) * sizeof (gfc_char_t));
4919 gfc_wide_memset (&STRING(extremum)[LENGTH(extremum)], ' ',
4920 LENGTH(arg) - LENGTH(extremum));
4921 STRING(extremum)[LENGTH(arg)] = '\0'; /* For debugger */
4922 LENGTH(extremum) = LENGTH(arg);
4923 free (tmp);
4925 ret = gfc_compare_string (arg, extremum) * sign;
4926 if (ret > 0)
4928 free (STRING(extremum));
4929 STRING(extremum) = gfc_get_wide_string (LENGTH(extremum) + 1);
4930 memcpy (STRING(extremum), STRING(arg),
4931 LENGTH(arg) * sizeof (gfc_char_t));
4932 gfc_wide_memset (&STRING(extremum)[LENGTH(arg)], ' ',
4933 LENGTH(extremum) - LENGTH(arg));
4934 STRING(extremum)[LENGTH(extremum)] = '\0'; /* For debugger */
4936 #undef LENGTH
4937 #undef STRING
4938 break;
4940 default:
4941 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
4943 if (back_val && ret == 0)
4944 ret = 1;
4946 return ret;
4950 /* This function is special since MAX() can take any number of
4951 arguments. The simplified expression is a rewritten version of the
4952 argument list containing at most one constant element. Other
4953 constant elements are deleted. Because the argument list has
4954 already been checked, this function always succeeds. sign is 1 for
4955 MAX(), -1 for MIN(). */
4957 static gfc_expr *
4958 simplify_min_max (gfc_expr *expr, int sign)
4960 gfc_actual_arglist *arg, *last, *extremum;
4961 gfc_intrinsic_sym * specific;
4963 last = NULL;
4964 extremum = NULL;
4965 specific = expr->value.function.isym;
4967 arg = expr->value.function.actual;
4969 for (; arg; last = arg, arg = arg->next)
4971 if (arg->expr->expr_type != EXPR_CONSTANT)
4972 continue;
4974 if (extremum == NULL)
4976 extremum = arg;
4977 continue;
4980 min_max_choose (arg->expr, extremum->expr, sign);
4982 /* Delete the extra constant argument. */
4983 last->next = arg->next;
4985 arg->next = NULL;
4986 gfc_free_actual_arglist (arg);
4987 arg = last;
4990 /* If there is one value left, replace the function call with the
4991 expression. */
4992 if (expr->value.function.actual->next != NULL)
4993 return NULL;
4995 /* Convert to the correct type and kind. */
4996 if (expr->ts.type != BT_UNKNOWN)
4997 return gfc_convert_constant (expr->value.function.actual->expr,
4998 expr->ts.type, expr->ts.kind);
5000 if (specific->ts.type != BT_UNKNOWN)
5001 return gfc_convert_constant (expr->value.function.actual->expr,
5002 specific->ts.type, specific->ts.kind);
5004 return gfc_copy_expr (expr->value.function.actual->expr);
5008 gfc_expr *
5009 gfc_simplify_min (gfc_expr *e)
5011 return simplify_min_max (e, -1);
5015 gfc_expr *
5016 gfc_simplify_max (gfc_expr *e)
5018 return simplify_min_max (e, 1);
5021 /* Helper function for gfc_simplify_minval. */
5023 static gfc_expr *
5024 gfc_min (gfc_expr *op1, gfc_expr *op2)
5026 min_max_choose (op1, op2, -1);
5027 gfc_free_expr (op1);
5028 return op2;
5031 /* Simplify minval for constant arrays. */
5033 gfc_expr *
5034 gfc_simplify_minval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
5036 return simplify_transformation (array, dim, mask, INT_MAX, gfc_min);
5039 /* Helper function for gfc_simplify_maxval. */
5041 static gfc_expr *
5042 gfc_max (gfc_expr *op1, gfc_expr *op2)
5044 min_max_choose (op1, op2, 1);
5045 gfc_free_expr (op1);
5046 return op2;
5050 /* Simplify maxval for constant arrays. */
5052 gfc_expr *
5053 gfc_simplify_maxval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
5055 return simplify_transformation (array, dim, mask, INT_MIN, gfc_max);
5059 /* Transform minloc or maxloc of an array, according to MASK,
5060 to the scalar result. This code is mostly identical to
5061 simplify_transformation_to_scalar. */
5063 static gfc_expr *
5064 simplify_minmaxloc_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *mask,
5065 gfc_expr *extremum, int sign, bool back_val)
5067 gfc_expr *a, *m;
5068 gfc_constructor *array_ctor, *mask_ctor;
5069 mpz_t count;
5071 mpz_set_si (result->value.integer, 0);
5074 /* Shortcut for constant .FALSE. MASK. */
5075 if (mask
5076 && mask->expr_type == EXPR_CONSTANT
5077 && !mask->value.logical)
5078 return result;
5080 array_ctor = gfc_constructor_first (array->value.constructor);
5081 if (mask && mask->expr_type == EXPR_ARRAY)
5082 mask_ctor = gfc_constructor_first (mask->value.constructor);
5083 else
5084 mask_ctor = NULL;
5086 mpz_init_set_si (count, 0);
5087 while (array_ctor)
5089 mpz_add_ui (count, count, 1);
5090 a = array_ctor->expr;
5091 array_ctor = gfc_constructor_next (array_ctor);
5092 /* A constant MASK equals .TRUE. here and can be ignored. */
5093 if (mask_ctor)
5095 m = mask_ctor->expr;
5096 mask_ctor = gfc_constructor_next (mask_ctor);
5097 if (!m->value.logical)
5098 continue;
5100 if (min_max_choose (a, extremum, sign, back_val) > 0)
5101 mpz_set (result->value.integer, count);
5103 mpz_clear (count);
5104 gfc_free_expr (extremum);
5105 return result;
5108 /* Simplify minloc / maxloc in the absence of a dim argument. */
5110 static gfc_expr *
5111 simplify_minmaxloc_nodim (gfc_expr *result, gfc_expr *extremum,
5112 gfc_expr *array, gfc_expr *mask, int sign,
5113 bool back_val)
5115 ssize_t res[GFC_MAX_DIMENSIONS];
5116 int i, n;
5117 gfc_constructor *result_ctor, *array_ctor, *mask_ctor;
5118 ssize_t count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
5119 sstride[GFC_MAX_DIMENSIONS];
5120 gfc_expr *a, *m;
5121 bool continue_loop;
5122 bool ma;
5124 for (i = 0; i<array->rank; i++)
5125 res[i] = -1;
5127 /* Shortcut for constant .FALSE. MASK. */
5128 if (mask
5129 && mask->expr_type == EXPR_CONSTANT
5130 && !mask->value.logical)
5131 goto finish;
5133 for (i = 0; i < array->rank; i++)
5135 count[i] = 0;
5136 sstride[i] = (i == 0) ? 1 : sstride[i-1] * mpz_get_si (array->shape[i-1]);
5137 extent[i] = mpz_get_si (array->shape[i]);
5138 if (extent[i] <= 0)
5139 goto finish;
5142 continue_loop = true;
5143 array_ctor = gfc_constructor_first (array->value.constructor);
5144 if (mask && mask->rank > 0)
5145 mask_ctor = gfc_constructor_first (mask->value.constructor);
5146 else
5147 mask_ctor = NULL;
5149 /* Loop over the array elements (and mask), keeping track of
5150 the indices to return. */
5151 while (continue_loop)
5155 a = array_ctor->expr;
5156 if (mask_ctor)
5158 m = mask_ctor->expr;
5159 ma = m->value.logical;
5160 mask_ctor = gfc_constructor_next (mask_ctor);
5162 else
5163 ma = true;
5165 if (ma && min_max_choose (a, extremum, sign, back_val) > 0)
5167 for (i = 0; i<array->rank; i++)
5168 res[i] = count[i];
5170 array_ctor = gfc_constructor_next (array_ctor);
5171 count[0] ++;
5172 } while (count[0] != extent[0]);
5173 n = 0;
5176 /* When we get to the end of a dimension, reset it and increment
5177 the next dimension. */
5178 count[n] = 0;
5179 n++;
5180 if (n >= array->rank)
5182 continue_loop = false;
5183 break;
5185 else
5186 count[n] ++;
5187 } while (count[n] == extent[n]);
5190 finish:
5191 gfc_free_expr (extremum);
5192 result_ctor = gfc_constructor_first (result->value.constructor);
5193 for (i = 0; i<array->rank; i++)
5195 gfc_expr *r_expr;
5196 r_expr = result_ctor->expr;
5197 mpz_set_si (r_expr->value.integer, res[i] + 1);
5198 result_ctor = gfc_constructor_next (result_ctor);
5200 return result;
5203 /* Helper function for gfc_simplify_minmaxloc - build an array
5204 expression with n elements. */
5206 static gfc_expr *
5207 new_array (bt type, int kind, int n, locus *where)
5209 gfc_expr *result;
5210 int i;
5212 result = gfc_get_array_expr (type, kind, where);
5213 result->rank = 1;
5214 result->shape = gfc_get_shape(1);
5215 mpz_init_set_si (result->shape[0], n);
5216 for (i = 0; i < n; i++)
5218 gfc_constructor_append_expr (&result->value.constructor,
5219 gfc_get_constant_expr (type, kind, where),
5220 NULL);
5223 return result;
5226 /* Simplify minloc and maxloc. This code is mostly identical to
5227 simplify_transformation_to_array. */
5229 static gfc_expr *
5230 simplify_minmaxloc_to_array (gfc_expr *result, gfc_expr *array,
5231 gfc_expr *dim, gfc_expr *mask,
5232 gfc_expr *extremum, int sign, bool back_val)
5234 mpz_t size;
5235 int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride;
5236 gfc_expr **arrayvec, **resultvec, **base, **src, **dest;
5237 gfc_constructor *array_ctor, *mask_ctor, *result_ctor;
5239 int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
5240 sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS],
5241 tmpstride[GFC_MAX_DIMENSIONS];
5243 /* Shortcut for constant .FALSE. MASK. */
5244 if (mask
5245 && mask->expr_type == EXPR_CONSTANT
5246 && !mask->value.logical)
5247 return result;
5249 /* Build an indexed table for array element expressions to minimize
5250 linked-list traversal. Masked elements are set to NULL. */
5251 gfc_array_size (array, &size);
5252 arraysize = mpz_get_ui (size);
5253 mpz_clear (size);
5255 arrayvec = XCNEWVEC (gfc_expr*, arraysize);
5257 array_ctor = gfc_constructor_first (array->value.constructor);
5258 mask_ctor = NULL;
5259 if (mask && mask->expr_type == EXPR_ARRAY)
5260 mask_ctor = gfc_constructor_first (mask->value.constructor);
5262 for (i = 0; i < arraysize; ++i)
5264 arrayvec[i] = array_ctor->expr;
5265 array_ctor = gfc_constructor_next (array_ctor);
5267 if (mask_ctor)
5269 if (!mask_ctor->expr->value.logical)
5270 arrayvec[i] = NULL;
5272 mask_ctor = gfc_constructor_next (mask_ctor);
5276 /* Same for the result expression. */
5277 gfc_array_size (result, &size);
5278 resultsize = mpz_get_ui (size);
5279 mpz_clear (size);
5281 resultvec = XCNEWVEC (gfc_expr*, resultsize);
5282 result_ctor = gfc_constructor_first (result->value.constructor);
5283 for (i = 0; i < resultsize; ++i)
5285 resultvec[i] = result_ctor->expr;
5286 result_ctor = gfc_constructor_next (result_ctor);
5289 gfc_extract_int (dim, &dim_index);
5290 dim_index -= 1; /* zero-base index */
5291 dim_extent = 0;
5292 dim_stride = 0;
5294 for (i = 0, n = 0; i < array->rank; ++i)
5296 count[i] = 0;
5297 tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]);
5298 if (i == dim_index)
5300 dim_extent = mpz_get_si (array->shape[i]);
5301 dim_stride = tmpstride[i];
5302 continue;
5305 extent[n] = mpz_get_si (array->shape[i]);
5306 sstride[n] = tmpstride[i];
5307 dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1];
5308 n += 1;
5311 done = resultsize <= 0;
5312 base = arrayvec;
5313 dest = resultvec;
5314 while (!done)
5316 gfc_expr *ex;
5317 ex = gfc_copy_expr (extremum);
5318 for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n)
5320 if (*src && min_max_choose (*src, ex, sign, back_val) > 0)
5321 mpz_set_si ((*dest)->value.integer, n + 1);
5324 count[0]++;
5325 base += sstride[0];
5326 dest += dstride[0];
5327 gfc_free_expr (ex);
5329 n = 0;
5330 while (!done && count[n] == extent[n])
5332 count[n] = 0;
5333 base -= sstride[n] * extent[n];
5334 dest -= dstride[n] * extent[n];
5336 n++;
5337 if (n < result->rank)
5339 /* If the nested loop is unrolled GFC_MAX_DIMENSIONS
5340 times, we'd warn for the last iteration, because the
5341 array index will have already been incremented to the
5342 array sizes, and we can't tell that this must make
5343 the test against result->rank false, because ranks
5344 must not exceed GFC_MAX_DIMENSIONS. */
5345 GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray-bounds)
5346 count[n]++;
5347 base += sstride[n];
5348 dest += dstride[n];
5349 GCC_DIAGNOSTIC_POP
5351 else
5352 done = true;
5356 /* Place updated expression in result constructor. */
5357 result_ctor = gfc_constructor_first (result->value.constructor);
5358 for (i = 0; i < resultsize; ++i)
5360 result_ctor->expr = resultvec[i];
5361 result_ctor = gfc_constructor_next (result_ctor);
5364 free (arrayvec);
5365 free (resultvec);
5366 free (extremum);
5367 return result;
5370 /* Simplify minloc and maxloc for constant arrays. */
5372 gfc_expr *
5373 gfc_simplify_minmaxloc (gfc_expr *array, gfc_expr *dim, gfc_expr *mask,
5374 gfc_expr *kind, gfc_expr *back, int sign)
5376 gfc_expr *result;
5377 gfc_expr *extremum;
5378 int ikind;
5379 int init_val;
5380 bool back_val = false;
5382 if (!is_constant_array_expr (array)
5383 || !gfc_is_constant_expr (dim))
5384 return NULL;
5386 if (mask
5387 && !is_constant_array_expr (mask)
5388 && mask->expr_type != EXPR_CONSTANT)
5389 return NULL;
5391 if (kind)
5393 if (gfc_extract_int (kind, &ikind, -1))
5394 return NULL;
5396 else
5397 ikind = gfc_default_integer_kind;
5399 if (back)
5401 if (back->expr_type != EXPR_CONSTANT)
5402 return NULL;
5404 back_val = back->value.logical;
5407 if (sign < 0)
5408 init_val = INT_MAX;
5409 else if (sign > 0)
5410 init_val = INT_MIN;
5411 else
5412 gcc_unreachable();
5414 extremum = gfc_get_constant_expr (array->ts.type, array->ts.kind, &array->where);
5415 init_result_expr (extremum, init_val, array);
5417 if (dim)
5419 result = transformational_result (array, dim, BT_INTEGER,
5420 ikind, &array->where);
5421 init_result_expr (result, 0, array);
5423 if (array->rank == 1)
5424 return simplify_minmaxloc_to_scalar (result, array, mask, extremum,
5425 sign, back_val);
5426 else
5427 return simplify_minmaxloc_to_array (result, array, dim, mask, extremum,
5428 sign, back_val);
5430 else
5432 result = new_array (BT_INTEGER, ikind, array->rank, &array->where);
5433 return simplify_minmaxloc_nodim (result, extremum, array, mask,
5434 sign, back_val);
5438 gfc_expr *
5439 gfc_simplify_minloc (gfc_expr *array, gfc_expr *dim, gfc_expr *mask, gfc_expr *kind,
5440 gfc_expr *back)
5442 return gfc_simplify_minmaxloc (array, dim, mask, kind, back, -1);
5445 gfc_expr *
5446 gfc_simplify_maxloc (gfc_expr *array, gfc_expr *dim, gfc_expr *mask, gfc_expr *kind,
5447 gfc_expr *back)
5449 return gfc_simplify_minmaxloc (array, dim, mask, kind, back, 1);
5452 gfc_expr *
5453 gfc_simplify_maxexponent (gfc_expr *x)
5455 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
5456 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
5457 gfc_real_kinds[i].max_exponent);
5461 gfc_expr *
5462 gfc_simplify_minexponent (gfc_expr *x)
5464 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
5465 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
5466 gfc_real_kinds[i].min_exponent);
5470 gfc_expr *
5471 gfc_simplify_mod (gfc_expr *a, gfc_expr *p)
5473 gfc_expr *result;
5474 int kind;
5476 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
5477 return NULL;
5479 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
5480 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
5482 switch (a->ts.type)
5484 case BT_INTEGER:
5485 if (mpz_cmp_ui (p->value.integer, 0) == 0)
5487 /* Result is processor-dependent. */
5488 gfc_error ("Second argument MOD at %L is zero", &a->where);
5489 gfc_free_expr (result);
5490 return &gfc_bad_expr;
5492 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
5493 break;
5495 case BT_REAL:
5496 if (mpfr_cmp_ui (p->value.real, 0) == 0)
5498 /* Result is processor-dependent. */
5499 gfc_error ("Second argument of MOD at %L is zero", &p->where);
5500 gfc_free_expr (result);
5501 return &gfc_bad_expr;
5504 gfc_set_model_kind (kind);
5505 mpfr_fmod (result->value.real, a->value.real, p->value.real,
5506 GFC_RND_MODE);
5507 break;
5509 default:
5510 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
5513 return range_check (result, "MOD");
5517 gfc_expr *
5518 gfc_simplify_modulo (gfc_expr *a, gfc_expr *p)
5520 gfc_expr *result;
5521 int kind;
5523 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
5524 return NULL;
5526 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
5527 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
5529 switch (a->ts.type)
5531 case BT_INTEGER:
5532 if (mpz_cmp_ui (p->value.integer, 0) == 0)
5534 /* Result is processor-dependent. This processor just opts
5535 to not handle it at all. */
5536 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
5537 gfc_free_expr (result);
5538 return &gfc_bad_expr;
5540 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
5542 break;
5544 case BT_REAL:
5545 if (mpfr_cmp_ui (p->value.real, 0) == 0)
5547 /* Result is processor-dependent. */
5548 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
5549 gfc_free_expr (result);
5550 return &gfc_bad_expr;
5553 gfc_set_model_kind (kind);
5554 mpfr_fmod (result->value.real, a->value.real, p->value.real,
5555 GFC_RND_MODE);
5556 if (mpfr_cmp_ui (result->value.real, 0) != 0)
5558 if (mpfr_signbit (a->value.real) != mpfr_signbit (p->value.real))
5559 mpfr_add (result->value.real, result->value.real, p->value.real,
5560 GFC_RND_MODE);
5562 else
5563 mpfr_copysign (result->value.real, result->value.real,
5564 p->value.real, GFC_RND_MODE);
5565 break;
5567 default:
5568 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
5571 return range_check (result, "MODULO");
5575 gfc_expr *
5576 gfc_simplify_nearest (gfc_expr *x, gfc_expr *s)
5578 gfc_expr *result;
5579 mp_exp_t emin, emax;
5580 int kind;
5582 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
5583 return NULL;
5585 result = gfc_copy_expr (x);
5587 /* Save current values of emin and emax. */
5588 emin = mpfr_get_emin ();
5589 emax = mpfr_get_emax ();
5591 /* Set emin and emax for the current model number. */
5592 kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
5593 mpfr_set_emin ((mp_exp_t) gfc_real_kinds[kind].min_exponent -
5594 mpfr_get_prec(result->value.real) + 1);
5595 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[kind].max_exponent - 1);
5596 mpfr_check_range (result->value.real, 0, GMP_RNDU);
5598 if (mpfr_sgn (s->value.real) > 0)
5600 mpfr_nextabove (result->value.real);
5601 mpfr_subnormalize (result->value.real, 0, GMP_RNDU);
5603 else
5605 mpfr_nextbelow (result->value.real);
5606 mpfr_subnormalize (result->value.real, 0, GMP_RNDD);
5609 mpfr_set_emin (emin);
5610 mpfr_set_emax (emax);
5612 /* Only NaN can occur. Do not use range check as it gives an
5613 error for denormal numbers. */
5614 if (mpfr_nan_p (result->value.real) && flag_range_check)
5616 gfc_error ("Result of NEAREST is NaN at %L", &result->where);
5617 gfc_free_expr (result);
5618 return &gfc_bad_expr;
5621 return result;
5625 static gfc_expr *
5626 simplify_nint (const char *name, gfc_expr *e, gfc_expr *k)
5628 gfc_expr *itrunc, *result;
5629 int kind;
5631 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
5632 if (kind == -1)
5633 return &gfc_bad_expr;
5635 if (e->expr_type != EXPR_CONSTANT)
5636 return NULL;
5638 itrunc = gfc_copy_expr (e);
5639 mpfr_round (itrunc->value.real, e->value.real);
5641 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
5642 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real, &e->where);
5644 gfc_free_expr (itrunc);
5646 return range_check (result, name);
5650 gfc_expr *
5651 gfc_simplify_new_line (gfc_expr *e)
5653 gfc_expr *result;
5655 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, 1);
5656 result->value.character.string[0] = '\n';
5658 return result;
5662 gfc_expr *
5663 gfc_simplify_nint (gfc_expr *e, gfc_expr *k)
5665 return simplify_nint ("NINT", e, k);
5669 gfc_expr *
5670 gfc_simplify_idnint (gfc_expr *e)
5672 return simplify_nint ("IDNINT", e, NULL);
5676 static gfc_expr *
5677 add_squared (gfc_expr *result, gfc_expr *e)
5679 mpfr_t tmp;
5681 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
5682 gcc_assert (result->ts.type == BT_REAL
5683 && result->expr_type == EXPR_CONSTANT);
5685 gfc_set_model_kind (result->ts.kind);
5686 mpfr_init (tmp);
5687 mpfr_pow_ui (tmp, e->value.real, 2, GFC_RND_MODE);
5688 mpfr_add (result->value.real, result->value.real, tmp,
5689 GFC_RND_MODE);
5690 mpfr_clear (tmp);
5692 return result;
5696 static gfc_expr *
5697 do_sqrt (gfc_expr *result, gfc_expr *e)
5699 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
5700 gcc_assert (result->ts.type == BT_REAL
5701 && result->expr_type == EXPR_CONSTANT);
5703 mpfr_set (result->value.real, e->value.real, GFC_RND_MODE);
5704 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
5705 return result;
5709 gfc_expr *
5710 gfc_simplify_norm2 (gfc_expr *e, gfc_expr *dim)
5712 gfc_expr *result;
5713 bool size_zero;
5715 size_zero = gfc_is_size_zero_array (e);
5717 if (!(is_constant_array_expr (e) || size_zero)
5718 || (dim != NULL && !gfc_is_constant_expr (dim)))
5719 return NULL;
5721 result = transformational_result (e, dim, e->ts.type, e->ts.kind, &e->where);
5722 init_result_expr (result, 0, NULL);
5724 if (size_zero)
5725 return result;
5727 if (!dim || e->rank == 1)
5729 result = simplify_transformation_to_scalar (result, e, NULL,
5730 add_squared);
5731 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
5733 else
5734 result = simplify_transformation_to_array (result, e, dim, NULL,
5735 add_squared, &do_sqrt);
5737 return result;
5741 gfc_expr *
5742 gfc_simplify_not (gfc_expr *e)
5744 gfc_expr *result;
5746 if (e->expr_type != EXPR_CONSTANT)
5747 return NULL;
5749 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
5750 mpz_com (result->value.integer, e->value.integer);
5752 return range_check (result, "NOT");
5756 gfc_expr *
5757 gfc_simplify_null (gfc_expr *mold)
5759 gfc_expr *result;
5761 if (mold)
5763 result = gfc_copy_expr (mold);
5764 result->expr_type = EXPR_NULL;
5766 else
5767 result = gfc_get_null_expr (NULL);
5769 return result;
5773 gfc_expr *
5774 gfc_simplify_num_images (gfc_expr *distance ATTRIBUTE_UNUSED, gfc_expr *failed)
5776 gfc_expr *result;
5778 if (flag_coarray == GFC_FCOARRAY_NONE)
5780 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
5781 return &gfc_bad_expr;
5784 if (flag_coarray != GFC_FCOARRAY_SINGLE)
5785 return NULL;
5787 if (failed && failed->expr_type != EXPR_CONSTANT)
5788 return NULL;
5790 /* FIXME: gfc_current_locus is wrong. */
5791 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
5792 &gfc_current_locus);
5794 if (failed && failed->value.logical != 0)
5795 mpz_set_si (result->value.integer, 0);
5796 else
5797 mpz_set_si (result->value.integer, 1);
5799 return result;
5803 gfc_expr *
5804 gfc_simplify_or (gfc_expr *x, gfc_expr *y)
5806 gfc_expr *result;
5807 int kind;
5809 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
5810 return NULL;
5812 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
5814 switch (x->ts.type)
5816 case BT_INTEGER:
5817 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
5818 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
5819 return range_check (result, "OR");
5821 case BT_LOGICAL:
5822 return gfc_get_logical_expr (kind, &x->where,
5823 x->value.logical || y->value.logical);
5824 default:
5825 gcc_unreachable();
5830 gfc_expr *
5831 gfc_simplify_pack (gfc_expr *array, gfc_expr *mask, gfc_expr *vector)
5833 gfc_expr *result;
5834 gfc_constructor *array_ctor, *mask_ctor, *vector_ctor;
5836 if (!is_constant_array_expr (array)
5837 || !is_constant_array_expr (vector)
5838 || (!gfc_is_constant_expr (mask)
5839 && !is_constant_array_expr (mask)))
5840 return NULL;
5842 result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where);
5843 if (array->ts.type == BT_DERIVED)
5844 result->ts.u.derived = array->ts.u.derived;
5846 array_ctor = gfc_constructor_first (array->value.constructor);
5847 vector_ctor = vector
5848 ? gfc_constructor_first (vector->value.constructor)
5849 : NULL;
5851 if (mask->expr_type == EXPR_CONSTANT
5852 && mask->value.logical)
5854 /* Copy all elements of ARRAY to RESULT. */
5855 while (array_ctor)
5857 gfc_constructor_append_expr (&result->value.constructor,
5858 gfc_copy_expr (array_ctor->expr),
5859 NULL);
5861 array_ctor = gfc_constructor_next (array_ctor);
5862 vector_ctor = gfc_constructor_next (vector_ctor);
5865 else if (mask->expr_type == EXPR_ARRAY)
5867 /* Copy only those elements of ARRAY to RESULT whose
5868 MASK equals .TRUE.. */
5869 mask_ctor = gfc_constructor_first (mask->value.constructor);
5870 while (mask_ctor)
5872 if (mask_ctor->expr->value.logical)
5874 gfc_constructor_append_expr (&result->value.constructor,
5875 gfc_copy_expr (array_ctor->expr),
5876 NULL);
5877 vector_ctor = gfc_constructor_next (vector_ctor);
5880 array_ctor = gfc_constructor_next (array_ctor);
5881 mask_ctor = gfc_constructor_next (mask_ctor);
5885 /* Append any left-over elements from VECTOR to RESULT. */
5886 while (vector_ctor)
5888 gfc_constructor_append_expr (&result->value.constructor,
5889 gfc_copy_expr (vector_ctor->expr),
5890 NULL);
5891 vector_ctor = gfc_constructor_next (vector_ctor);
5894 result->shape = gfc_get_shape (1);
5895 gfc_array_size (result, &result->shape[0]);
5897 if (array->ts.type == BT_CHARACTER)
5898 result->ts.u.cl = array->ts.u.cl;
5900 return result;
5904 static gfc_expr *
5905 do_xor (gfc_expr *result, gfc_expr *e)
5907 gcc_assert (e->ts.type == BT_LOGICAL && e->expr_type == EXPR_CONSTANT);
5908 gcc_assert (result->ts.type == BT_LOGICAL
5909 && result->expr_type == EXPR_CONSTANT);
5911 result->value.logical = result->value.logical != e->value.logical;
5912 return result;
5917 gfc_expr *
5918 gfc_simplify_parity (gfc_expr *e, gfc_expr *dim)
5920 return simplify_transformation (e, dim, NULL, 0, do_xor);
5924 gfc_expr *
5925 gfc_simplify_popcnt (gfc_expr *e)
5927 int res, k;
5928 mpz_t x;
5930 if (e->expr_type != EXPR_CONSTANT)
5931 return NULL;
5933 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5935 /* Convert argument to unsigned, then count the '1' bits. */
5936 mpz_init_set (x, e->value.integer);
5937 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
5938 res = mpz_popcount (x);
5939 mpz_clear (x);
5941 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, res);
5945 gfc_expr *
5946 gfc_simplify_poppar (gfc_expr *e)
5948 gfc_expr *popcnt;
5949 int i;
5951 if (e->expr_type != EXPR_CONSTANT)
5952 return NULL;
5954 popcnt = gfc_simplify_popcnt (e);
5955 gcc_assert (popcnt);
5957 bool fail = gfc_extract_int (popcnt, &i);
5958 gcc_assert (!fail);
5960 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i % 2);
5964 gfc_expr *
5965 gfc_simplify_precision (gfc_expr *e)
5967 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5968 return gfc_get_int_expr (gfc_default_integer_kind, &e->where,
5969 gfc_real_kinds[i].precision);
5973 gfc_expr *
5974 gfc_simplify_product (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
5976 return simplify_transformation (array, dim, mask, 1, gfc_multiply);
5980 gfc_expr *
5981 gfc_simplify_radix (gfc_expr *e)
5983 int i;
5984 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5986 switch (e->ts.type)
5988 case BT_INTEGER:
5989 i = gfc_integer_kinds[i].radix;
5990 break;
5992 case BT_REAL:
5993 i = gfc_real_kinds[i].radix;
5994 break;
5996 default:
5997 gcc_unreachable ();
6000 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
6004 gfc_expr *
6005 gfc_simplify_range (gfc_expr *e)
6007 int i;
6008 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
6010 switch (e->ts.type)
6012 case BT_INTEGER:
6013 i = gfc_integer_kinds[i].range;
6014 break;
6016 case BT_REAL:
6017 case BT_COMPLEX:
6018 i = gfc_real_kinds[i].range;
6019 break;
6021 default:
6022 gcc_unreachable ();
6025 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
6029 gfc_expr *
6030 gfc_simplify_rank (gfc_expr *e)
6032 /* Assumed rank. */
6033 if (e->rank == -1)
6034 return NULL;
6036 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, e->rank);
6040 gfc_expr *
6041 gfc_simplify_real (gfc_expr *e, gfc_expr *k)
6043 gfc_expr *result = NULL;
6044 int kind;
6046 if (e->ts.type == BT_COMPLEX)
6047 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
6048 else
6049 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
6051 if (kind == -1)
6052 return &gfc_bad_expr;
6054 if (e->expr_type != EXPR_CONSTANT)
6055 return NULL;
6057 if (convert_boz (e, kind) == &gfc_bad_expr)
6058 return &gfc_bad_expr;
6060 result = gfc_convert_constant (e, BT_REAL, kind);
6061 if (result == &gfc_bad_expr)
6062 return &gfc_bad_expr;
6064 return range_check (result, "REAL");
6068 gfc_expr *
6069 gfc_simplify_realpart (gfc_expr *e)
6071 gfc_expr *result;
6073 if (e->expr_type != EXPR_CONSTANT)
6074 return NULL;
6076 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
6077 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
6079 return range_check (result, "REALPART");
6082 gfc_expr *
6083 gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
6085 gfc_expr *result;
6086 gfc_charlen_t len;
6087 mpz_t ncopies;
6088 bool have_length = false;
6090 /* If NCOPIES isn't a constant, there's nothing we can do. */
6091 if (n->expr_type != EXPR_CONSTANT)
6092 return NULL;
6094 /* If NCOPIES is negative, it's an error. */
6095 if (mpz_sgn (n->value.integer) < 0)
6097 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
6098 &n->where);
6099 return &gfc_bad_expr;
6102 /* If we don't know the character length, we can do no more. */
6103 if (e->ts.u.cl && e->ts.u.cl->length
6104 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
6106 len = gfc_mpz_get_hwi (e->ts.u.cl->length->value.integer);
6107 have_length = true;
6109 else if (e->expr_type == EXPR_CONSTANT
6110 && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
6112 len = e->value.character.length;
6114 else
6115 return NULL;
6117 /* If the source length is 0, any value of NCOPIES is valid
6118 and everything behaves as if NCOPIES == 0. */
6119 mpz_init (ncopies);
6120 if (len == 0)
6121 mpz_set_ui (ncopies, 0);
6122 else
6123 mpz_set (ncopies, n->value.integer);
6125 /* Check that NCOPIES isn't too large. */
6126 if (len)
6128 mpz_t max, mlen;
6129 int i;
6131 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
6132 mpz_init (max);
6133 i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
6135 if (have_length)
6137 mpz_tdiv_q (max, gfc_integer_kinds[i].huge,
6138 e->ts.u.cl->length->value.integer);
6140 else
6142 mpz_init (mlen);
6143 gfc_mpz_set_hwi (mlen, len);
6144 mpz_tdiv_q (max, gfc_integer_kinds[i].huge, mlen);
6145 mpz_clear (mlen);
6148 /* The check itself. */
6149 if (mpz_cmp (ncopies, max) > 0)
6151 mpz_clear (max);
6152 mpz_clear (ncopies);
6153 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
6154 &n->where);
6155 return &gfc_bad_expr;
6158 mpz_clear (max);
6160 mpz_clear (ncopies);
6162 /* For further simplification, we need the character string to be
6163 constant. */
6164 if (e->expr_type != EXPR_CONSTANT)
6165 return NULL;
6167 HOST_WIDE_INT ncop;
6168 if (len ||
6169 (e->ts.u.cl->length &&
6170 mpz_sgn (e->ts.u.cl->length->value.integer) != 0))
6172 bool fail = gfc_extract_hwi (n, &ncop);
6173 gcc_assert (!fail);
6175 else
6176 ncop = 0;
6178 if (ncop == 0)
6179 return gfc_get_character_expr (e->ts.kind, &e->where, NULL, 0);
6181 len = e->value.character.length;
6182 gfc_charlen_t nlen = ncop * len;
6184 /* Here's a semi-arbitrary limit. If the string is longer than 1 GB
6185 (2**28 elements * 4 bytes (wide chars) per element) defer to
6186 runtime instead of consuming (unbounded) memory and CPU at
6187 compile time. */
6188 if (nlen > 268435456)
6190 gfc_warning_now (0, "Evaluation of string longer than 2**28 at %L"
6191 " deferred to runtime, expect bugs", &e->where);
6192 return NULL;
6195 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, nlen);
6196 for (size_t i = 0; i < (size_t) ncop; i++)
6197 for (size_t j = 0; j < (size_t) len; j++)
6198 result->value.character.string[j+i*len]= e->value.character.string[j];
6200 result->value.character.string[nlen] = '\0'; /* For debugger */
6201 return result;
6205 /* This one is a bear, but mainly has to do with shuffling elements. */
6207 gfc_expr *
6208 gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
6209 gfc_expr *pad, gfc_expr *order_exp)
6211 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
6212 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
6213 mpz_t index, size;
6214 unsigned long j;
6215 size_t nsource;
6216 gfc_expr *e, *result;
6218 /* Check that argument expression types are OK. */
6219 if (!is_constant_array_expr (source)
6220 || !is_constant_array_expr (shape_exp)
6221 || !is_constant_array_expr (pad)
6222 || !is_constant_array_expr (order_exp))
6223 return NULL;
6225 if (source->shape == NULL)
6226 return NULL;
6228 /* Proceed with simplification, unpacking the array. */
6230 mpz_init (index);
6231 rank = 0;
6233 for (;;)
6235 e = gfc_constructor_lookup_expr (shape_exp->value.constructor, rank);
6236 if (e == NULL)
6237 break;
6239 gfc_extract_int (e, &shape[rank]);
6241 gcc_assert (rank >= 0 && rank < GFC_MAX_DIMENSIONS);
6242 gcc_assert (shape[rank] >= 0);
6244 rank++;
6247 gcc_assert (rank > 0);
6249 /* Now unpack the order array if present. */
6250 if (order_exp == NULL)
6252 for (i = 0; i < rank; i++)
6253 order[i] = i;
6255 else
6257 for (i = 0; i < rank; i++)
6258 x[i] = 0;
6260 for (i = 0; i < rank; i++)
6262 e = gfc_constructor_lookup_expr (order_exp->value.constructor, i);
6263 gcc_assert (e);
6265 gfc_extract_int (e, &order[i]);
6267 gcc_assert (order[i] >= 1 && order[i] <= rank);
6268 order[i]--;
6269 gcc_assert (x[order[i]] == 0);
6270 x[order[i]] = 1;
6274 /* Count the elements in the source and padding arrays. */
6276 npad = 0;
6277 if (pad != NULL)
6279 gfc_array_size (pad, &size);
6280 npad = mpz_get_ui (size);
6281 mpz_clear (size);
6284 gfc_array_size (source, &size);
6285 nsource = mpz_get_ui (size);
6286 mpz_clear (size);
6288 /* If it weren't for that pesky permutation we could just loop
6289 through the source and round out any shortage with pad elements.
6290 But no, someone just had to have the compiler do something the
6291 user should be doing. */
6293 for (i = 0; i < rank; i++)
6294 x[i] = 0;
6296 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
6297 &source->where);
6298 if (source->ts.type == BT_DERIVED)
6299 result->ts.u.derived = source->ts.u.derived;
6300 result->rank = rank;
6301 result->shape = gfc_get_shape (rank);
6302 for (i = 0; i < rank; i++)
6303 mpz_init_set_ui (result->shape[i], shape[i]);
6305 while (nsource > 0 || npad > 0)
6307 /* Figure out which element to extract. */
6308 mpz_set_ui (index, 0);
6310 for (i = rank - 1; i >= 0; i--)
6312 mpz_add_ui (index, index, x[order[i]]);
6313 if (i != 0)
6314 mpz_mul_ui (index, index, shape[order[i - 1]]);
6317 if (mpz_cmp_ui (index, INT_MAX) > 0)
6318 gfc_internal_error ("Reshaped array too large at %C");
6320 j = mpz_get_ui (index);
6322 if (j < nsource)
6323 e = gfc_constructor_lookup_expr (source->value.constructor, j);
6324 else
6326 if (npad <= 0)
6328 mpz_clear (index);
6329 return NULL;
6331 j = j - nsource;
6332 j = j % npad;
6333 e = gfc_constructor_lookup_expr (pad->value.constructor, j);
6335 gcc_assert (e);
6337 gfc_constructor_append_expr (&result->value.constructor,
6338 gfc_copy_expr (e), &e->where);
6340 /* Calculate the next element. */
6341 i = 0;
6343 inc:
6344 if (++x[i] < shape[i])
6345 continue;
6346 x[i++] = 0;
6347 if (i < rank)
6348 goto inc;
6350 break;
6353 mpz_clear (index);
6355 return result;
6359 gfc_expr *
6360 gfc_simplify_rrspacing (gfc_expr *x)
6362 gfc_expr *result;
6363 int i;
6364 long int e, p;
6366 if (x->expr_type != EXPR_CONSTANT)
6367 return NULL;
6369 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
6371 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
6373 /* RRSPACING(+/- 0.0) = 0.0 */
6374 if (mpfr_zero_p (x->value.real))
6376 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
6377 return result;
6380 /* RRSPACING(inf) = NaN */
6381 if (mpfr_inf_p (x->value.real))
6383 mpfr_set_nan (result->value.real);
6384 return result;
6387 /* RRSPACING(NaN) = same NaN */
6388 if (mpfr_nan_p (x->value.real))
6390 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
6391 return result;
6394 /* | x * 2**(-e) | * 2**p. */
6395 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
6396 e = - (long int) mpfr_get_exp (x->value.real);
6397 mpfr_mul_2si (result->value.real, result->value.real, e, GFC_RND_MODE);
6399 p = (long int) gfc_real_kinds[i].digits;
6400 mpfr_mul_2si (result->value.real, result->value.real, p, GFC_RND_MODE);
6402 return range_check (result, "RRSPACING");
6406 gfc_expr *
6407 gfc_simplify_scale (gfc_expr *x, gfc_expr *i)
6409 int k, neg_flag, power, exp_range;
6410 mpfr_t scale, radix;
6411 gfc_expr *result;
6413 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
6414 return NULL;
6416 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
6418 if (mpfr_zero_p (x->value.real))
6420 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
6421 return result;
6424 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
6426 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
6428 /* This check filters out values of i that would overflow an int. */
6429 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
6430 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
6432 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
6433 gfc_free_expr (result);
6434 return &gfc_bad_expr;
6437 /* Compute scale = radix ** power. */
6438 power = mpz_get_si (i->value.integer);
6440 if (power >= 0)
6441 neg_flag = 0;
6442 else
6444 neg_flag = 1;
6445 power = -power;
6448 gfc_set_model_kind (x->ts.kind);
6449 mpfr_init (scale);
6450 mpfr_init (radix);
6451 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
6452 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
6454 if (neg_flag)
6455 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
6456 else
6457 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
6459 mpfr_clears (scale, radix, NULL);
6461 return range_check (result, "SCALE");
6465 /* Variants of strspn and strcspn that operate on wide characters. */
6467 static size_t
6468 wide_strspn (const gfc_char_t *s1, const gfc_char_t *s2)
6470 size_t i = 0;
6471 const gfc_char_t *c;
6473 while (s1[i])
6475 for (c = s2; *c; c++)
6477 if (s1[i] == *c)
6478 break;
6480 if (*c == '\0')
6481 break;
6482 i++;
6485 return i;
6488 static size_t
6489 wide_strcspn (const gfc_char_t *s1, const gfc_char_t *s2)
6491 size_t i = 0;
6492 const gfc_char_t *c;
6494 while (s1[i])
6496 for (c = s2; *c; c++)
6498 if (s1[i] == *c)
6499 break;
6501 if (*c)
6502 break;
6503 i++;
6506 return i;
6510 gfc_expr *
6511 gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind)
6513 gfc_expr *result;
6514 int back;
6515 size_t i;
6516 size_t indx, len, lenc;
6517 int k = get_kind (BT_INTEGER, kind, "SCAN", gfc_default_integer_kind);
6519 if (k == -1)
6520 return &gfc_bad_expr;
6522 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT
6523 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
6524 return NULL;
6526 if (b != NULL && b->value.logical != 0)
6527 back = 1;
6528 else
6529 back = 0;
6531 len = e->value.character.length;
6532 lenc = c->value.character.length;
6534 if (len == 0 || lenc == 0)
6536 indx = 0;
6538 else
6540 if (back == 0)
6542 indx = wide_strcspn (e->value.character.string,
6543 c->value.character.string) + 1;
6544 if (indx > len)
6545 indx = 0;
6547 else
6549 i = 0;
6550 for (indx = len; indx > 0; indx--)
6552 for (i = 0; i < lenc; i++)
6554 if (c->value.character.string[i]
6555 == e->value.character.string[indx - 1])
6556 break;
6558 if (i < lenc)
6559 break;
6564 result = gfc_get_int_expr (k, &e->where, indx);
6565 return range_check (result, "SCAN");
6569 gfc_expr *
6570 gfc_simplify_selected_char_kind (gfc_expr *e)
6572 int kind;
6574 if (e->expr_type != EXPR_CONSTANT)
6575 return NULL;
6577 if (gfc_compare_with_Cstring (e, "ascii", false) == 0
6578 || gfc_compare_with_Cstring (e, "default", false) == 0)
6579 kind = 1;
6580 else if (gfc_compare_with_Cstring (e, "iso_10646", false) == 0)
6581 kind = 4;
6582 else
6583 kind = -1;
6585 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
6589 gfc_expr *
6590 gfc_simplify_selected_int_kind (gfc_expr *e)
6592 int i, kind, range;
6594 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range))
6595 return NULL;
6597 kind = INT_MAX;
6599 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
6600 if (gfc_integer_kinds[i].range >= range
6601 && gfc_integer_kinds[i].kind < kind)
6602 kind = gfc_integer_kinds[i].kind;
6604 if (kind == INT_MAX)
6605 kind = -1;
6607 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
6611 gfc_expr *
6612 gfc_simplify_selected_real_kind (gfc_expr *p, gfc_expr *q, gfc_expr *rdx)
6614 int range, precision, radix, i, kind, found_precision, found_range,
6615 found_radix;
6616 locus *loc = &gfc_current_locus;
6618 if (p == NULL)
6619 precision = 0;
6620 else
6622 if (p->expr_type != EXPR_CONSTANT
6623 || gfc_extract_int (p, &precision))
6624 return NULL;
6625 loc = &p->where;
6628 if (q == NULL)
6629 range = 0;
6630 else
6632 if (q->expr_type != EXPR_CONSTANT
6633 || gfc_extract_int (q, &range))
6634 return NULL;
6636 if (!loc)
6637 loc = &q->where;
6640 if (rdx == NULL)
6641 radix = 0;
6642 else
6644 if (rdx->expr_type != EXPR_CONSTANT
6645 || gfc_extract_int (rdx, &radix))
6646 return NULL;
6648 if (!loc)
6649 loc = &rdx->where;
6652 kind = INT_MAX;
6653 found_precision = 0;
6654 found_range = 0;
6655 found_radix = 0;
6657 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
6659 if (gfc_real_kinds[i].precision >= precision)
6660 found_precision = 1;
6662 if (gfc_real_kinds[i].range >= range)
6663 found_range = 1;
6665 if (radix == 0 || gfc_real_kinds[i].radix == radix)
6666 found_radix = 1;
6668 if (gfc_real_kinds[i].precision >= precision
6669 && gfc_real_kinds[i].range >= range
6670 && (radix == 0 || gfc_real_kinds[i].radix == radix)
6671 && gfc_real_kinds[i].kind < kind)
6672 kind = gfc_real_kinds[i].kind;
6675 if (kind == INT_MAX)
6677 if (found_radix && found_range && !found_precision)
6678 kind = -1;
6679 else if (found_radix && found_precision && !found_range)
6680 kind = -2;
6681 else if (found_radix && !found_precision && !found_range)
6682 kind = -3;
6683 else if (found_radix)
6684 kind = -4;
6685 else
6686 kind = -5;
6689 return gfc_get_int_expr (gfc_default_integer_kind, loc, kind);
6693 gfc_expr *
6694 gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i)
6696 gfc_expr *result;
6697 mpfr_t exp, absv, log2, pow2, frac;
6698 unsigned long exp2;
6700 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
6701 return NULL;
6703 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
6705 /* SET_EXPONENT (+/-0.0, I) = +/- 0.0
6706 SET_EXPONENT (NaN) = same NaN */
6707 if (mpfr_zero_p (x->value.real) || mpfr_nan_p (x->value.real))
6709 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
6710 return result;
6713 /* SET_EXPONENT (inf) = NaN */
6714 if (mpfr_inf_p (x->value.real))
6716 mpfr_set_nan (result->value.real);
6717 return result;
6720 gfc_set_model_kind (x->ts.kind);
6721 mpfr_init (absv);
6722 mpfr_init (log2);
6723 mpfr_init (exp);
6724 mpfr_init (pow2);
6725 mpfr_init (frac);
6727 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
6728 mpfr_log2 (log2, absv, GFC_RND_MODE);
6730 mpfr_trunc (log2, log2);
6731 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
6733 /* Old exponent value, and fraction. */
6734 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
6736 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
6738 /* New exponent. */
6739 exp2 = (unsigned long) mpz_get_d (i->value.integer);
6740 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
6742 mpfr_clears (absv, log2, pow2, frac, NULL);
6744 return range_check (result, "SET_EXPONENT");
6748 gfc_expr *
6749 gfc_simplify_shape (gfc_expr *source, gfc_expr *kind)
6751 mpz_t shape[GFC_MAX_DIMENSIONS];
6752 gfc_expr *result, *e, *f;
6753 gfc_array_ref *ar;
6754 int n;
6755 bool t;
6756 int k = get_kind (BT_INTEGER, kind, "SHAPE", gfc_default_integer_kind);
6758 if (source->rank == -1)
6759 return NULL;
6761 result = gfc_get_array_expr (BT_INTEGER, k, &source->where);
6763 if (source->rank == 0)
6764 return result;
6766 if (source->expr_type == EXPR_VARIABLE)
6768 ar = gfc_find_array_ref (source);
6769 t = gfc_array_ref_shape (ar, shape);
6771 else if (source->shape)
6773 t = true;
6774 for (n = 0; n < source->rank; n++)
6776 mpz_init (shape[n]);
6777 mpz_set (shape[n], source->shape[n]);
6780 else
6781 t = false;
6783 for (n = 0; n < source->rank; n++)
6785 e = gfc_get_constant_expr (BT_INTEGER, k, &source->where);
6787 if (t)
6788 mpz_set (e->value.integer, shape[n]);
6789 else
6791 mpz_set_ui (e->value.integer, n + 1);
6793 f = simplify_size (source, e, k);
6794 gfc_free_expr (e);
6795 if (f == NULL)
6797 gfc_free_expr (result);
6798 return NULL;
6800 else
6801 e = f;
6804 if (e == &gfc_bad_expr || range_check (e, "SHAPE") == &gfc_bad_expr)
6806 gfc_free_expr (result);
6807 if (t)
6808 gfc_clear_shape (shape, source->rank);
6809 return &gfc_bad_expr;
6812 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
6815 if (t)
6816 gfc_clear_shape (shape, source->rank);
6818 return result;
6822 static gfc_expr *
6823 simplify_size (gfc_expr *array, gfc_expr *dim, int k)
6825 mpz_t size;
6826 gfc_expr *return_value;
6827 int d;
6829 /* For unary operations, the size of the result is given by the size
6830 of the operand. For binary ones, it's the size of the first operand
6831 unless it is scalar, then it is the size of the second. */
6832 if (array->expr_type == EXPR_OP && !array->value.op.uop)
6834 gfc_expr* replacement;
6835 gfc_expr* simplified;
6837 switch (array->value.op.op)
6839 /* Unary operations. */
6840 case INTRINSIC_NOT:
6841 case INTRINSIC_UPLUS:
6842 case INTRINSIC_UMINUS:
6843 case INTRINSIC_PARENTHESES:
6844 replacement = array->value.op.op1;
6845 break;
6847 /* Binary operations. If any one of the operands is scalar, take
6848 the other one's size. If both of them are arrays, it does not
6849 matter -- try to find one with known shape, if possible. */
6850 default:
6851 if (array->value.op.op1->rank == 0)
6852 replacement = array->value.op.op2;
6853 else if (array->value.op.op2->rank == 0)
6854 replacement = array->value.op.op1;
6855 else
6857 simplified = simplify_size (array->value.op.op1, dim, k);
6858 if (simplified)
6859 return simplified;
6861 replacement = array->value.op.op2;
6863 break;
6866 /* Try to reduce it directly if possible. */
6867 simplified = simplify_size (replacement, dim, k);
6869 /* Otherwise, we build a new SIZE call. This is hopefully at least
6870 simpler than the original one. */
6871 if (!simplified)
6873 gfc_expr *kind = gfc_get_int_expr (gfc_default_integer_kind, NULL, k);
6874 simplified = gfc_build_intrinsic_call (gfc_current_ns,
6875 GFC_ISYM_SIZE, "size",
6876 array->where, 3,
6877 gfc_copy_expr (replacement),
6878 gfc_copy_expr (dim),
6879 kind);
6881 return simplified;
6884 if (dim == NULL)
6886 if (!gfc_array_size (array, &size))
6887 return NULL;
6889 else
6891 if (dim->expr_type != EXPR_CONSTANT)
6892 return NULL;
6894 d = mpz_get_ui (dim->value.integer) - 1;
6895 if (!gfc_array_dimen_size (array, d, &size))
6896 return NULL;
6899 return_value = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
6900 mpz_set (return_value->value.integer, size);
6901 mpz_clear (size);
6903 return return_value;
6907 gfc_expr *
6908 gfc_simplify_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6910 gfc_expr *result;
6911 int k = get_kind (BT_INTEGER, kind, "SIZE", gfc_default_integer_kind);
6913 if (k == -1)
6914 return &gfc_bad_expr;
6916 result = simplify_size (array, dim, k);
6917 if (result == NULL || result == &gfc_bad_expr)
6918 return result;
6920 return range_check (result, "SIZE");
6924 /* SIZEOF and C_SIZEOF return the size in bytes of an array element
6925 multiplied by the array size. */
6927 gfc_expr *
6928 gfc_simplify_sizeof (gfc_expr *x)
6930 gfc_expr *result = NULL;
6931 mpz_t array_size;
6933 if (x->ts.type == BT_CLASS || x->ts.deferred)
6934 return NULL;
6936 if (x->ts.type == BT_CHARACTER
6937 && (!x->ts.u.cl || !x->ts.u.cl->length
6938 || x->ts.u.cl->length->expr_type != EXPR_CONSTANT))
6939 return NULL;
6941 if (x->rank && x->expr_type != EXPR_ARRAY
6942 && !gfc_array_size (x, &array_size))
6943 return NULL;
6945 result = gfc_get_constant_expr (BT_INTEGER, gfc_index_integer_kind,
6946 &x->where);
6947 mpz_set_si (result->value.integer, gfc_target_expr_size (x));
6949 return result;
6953 /* STORAGE_SIZE returns the size in bits of a single array element. */
6955 gfc_expr *
6956 gfc_simplify_storage_size (gfc_expr *x,
6957 gfc_expr *kind)
6959 gfc_expr *result = NULL;
6960 int k;
6962 if (x->ts.type == BT_CLASS || x->ts.deferred)
6963 return NULL;
6965 if (x->ts.type == BT_CHARACTER && x->expr_type != EXPR_CONSTANT
6966 && (!x->ts.u.cl || !x->ts.u.cl->length
6967 || x->ts.u.cl->length->expr_type != EXPR_CONSTANT))
6968 return NULL;
6970 k = get_kind (BT_INTEGER, kind, "STORAGE_SIZE", gfc_default_integer_kind);
6971 if (k == -1)
6972 return &gfc_bad_expr;
6974 result = gfc_get_constant_expr (BT_INTEGER, k, &x->where);
6976 mpz_set_si (result->value.integer, gfc_element_size (x));
6977 mpz_mul_ui (result->value.integer, result->value.integer, BITS_PER_UNIT);
6979 return range_check (result, "STORAGE_SIZE");
6983 gfc_expr *
6984 gfc_simplify_sign (gfc_expr *x, gfc_expr *y)
6986 gfc_expr *result;
6988 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
6989 return NULL;
6991 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6993 switch (x->ts.type)
6995 case BT_INTEGER:
6996 mpz_abs (result->value.integer, x->value.integer);
6997 if (mpz_sgn (y->value.integer) < 0)
6998 mpz_neg (result->value.integer, result->value.integer);
6999 break;
7001 case BT_REAL:
7002 if (flag_sign_zero)
7003 mpfr_copysign (result->value.real, x->value.real, y->value.real,
7004 GFC_RND_MODE);
7005 else
7006 mpfr_setsign (result->value.real, x->value.real,
7007 mpfr_sgn (y->value.real) < 0 ? 1 : 0, GFC_RND_MODE);
7008 break;
7010 default:
7011 gfc_internal_error ("Bad type in gfc_simplify_sign");
7014 return result;
7018 gfc_expr *
7019 gfc_simplify_sin (gfc_expr *x)
7021 gfc_expr *result;
7023 if (x->expr_type != EXPR_CONSTANT)
7024 return NULL;
7026 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
7028 switch (x->ts.type)
7030 case BT_REAL:
7031 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
7032 break;
7034 case BT_COMPLEX:
7035 gfc_set_model (x->value.real);
7036 mpc_sin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
7037 break;
7039 default:
7040 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
7043 return range_check (result, "SIN");
7047 gfc_expr *
7048 gfc_simplify_sinh (gfc_expr *x)
7050 gfc_expr *result;
7052 if (x->expr_type != EXPR_CONSTANT)
7053 return NULL;
7055 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
7057 switch (x->ts.type)
7059 case BT_REAL:
7060 mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE);
7061 break;
7063 case BT_COMPLEX:
7064 mpc_sinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
7065 break;
7067 default:
7068 gcc_unreachable ();
7071 return range_check (result, "SINH");
7075 /* The argument is always a double precision real that is converted to
7076 single precision. TODO: Rounding! */
7078 gfc_expr *
7079 gfc_simplify_sngl (gfc_expr *a)
7081 gfc_expr *result;
7083 if (a->expr_type != EXPR_CONSTANT)
7084 return NULL;
7086 result = gfc_real2real (a, gfc_default_real_kind);
7087 return range_check (result, "SNGL");
7091 gfc_expr *
7092 gfc_simplify_spacing (gfc_expr *x)
7094 gfc_expr *result;
7095 int i;
7096 long int en, ep;
7098 if (x->expr_type != EXPR_CONSTANT)
7099 return NULL;
7101 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
7102 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
7104 /* SPACING(+/- 0.0) = SPACING(TINY(0.0)) = TINY(0.0) */
7105 if (mpfr_zero_p (x->value.real))
7107 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
7108 return result;
7111 /* SPACING(inf) = NaN */
7112 if (mpfr_inf_p (x->value.real))
7114 mpfr_set_nan (result->value.real);
7115 return result;
7118 /* SPACING(NaN) = same NaN */
7119 if (mpfr_nan_p (x->value.real))
7121 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
7122 return result;
7125 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
7126 are the radix, exponent of x, and precision. This excludes the
7127 possibility of subnormal numbers. Fortran 2003 states the result is
7128 b**max(e - p, emin - 1). */
7130 ep = (long int) mpfr_get_exp (x->value.real) - gfc_real_kinds[i].digits;
7131 en = (long int) gfc_real_kinds[i].min_exponent - 1;
7132 en = en > ep ? en : ep;
7134 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
7135 mpfr_mul_2si (result->value.real, result->value.real, en, GFC_RND_MODE);
7137 return range_check (result, "SPACING");
7141 gfc_expr *
7142 gfc_simplify_spread (gfc_expr *source, gfc_expr *dim_expr, gfc_expr *ncopies_expr)
7144 gfc_expr *result = NULL;
7145 int nelem, i, j, dim, ncopies;
7146 mpz_t size;
7148 if ((!gfc_is_constant_expr (source)
7149 && !is_constant_array_expr (source))
7150 || !gfc_is_constant_expr (dim_expr)
7151 || !gfc_is_constant_expr (ncopies_expr))
7152 return NULL;
7154 gcc_assert (dim_expr->ts.type == BT_INTEGER);
7155 gfc_extract_int (dim_expr, &dim);
7156 dim -= 1; /* zero-base DIM */
7158 gcc_assert (ncopies_expr->ts.type == BT_INTEGER);
7159 gfc_extract_int (ncopies_expr, &ncopies);
7160 ncopies = MAX (ncopies, 0);
7162 /* Do not allow the array size to exceed the limit for an array
7163 constructor. */
7164 if (source->expr_type == EXPR_ARRAY)
7166 if (!gfc_array_size (source, &size))
7167 gfc_internal_error ("Failure getting length of a constant array.");
7169 else
7170 mpz_init_set_ui (size, 1);
7172 nelem = mpz_get_si (size) * ncopies;
7173 if (nelem > flag_max_array_constructor)
7175 if (gfc_current_ns->sym_root->n.sym->attr.flavor == FL_PARAMETER)
7177 gfc_error ("The number of elements (%d) in the array constructor "
7178 "at %L requires an increase of the allowed %d upper "
7179 "limit. See %<-fmax-array-constructor%> option.",
7180 nelem, &source->where, flag_max_array_constructor);
7181 return &gfc_bad_expr;
7183 else
7184 return NULL;
7187 if (source->expr_type == EXPR_CONSTANT)
7189 gcc_assert (dim == 0);
7191 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
7192 &source->where);
7193 if (source->ts.type == BT_DERIVED)
7194 result->ts.u.derived = source->ts.u.derived;
7195 result->rank = 1;
7196 result->shape = gfc_get_shape (result->rank);
7197 mpz_init_set_si (result->shape[0], ncopies);
7199 for (i = 0; i < ncopies; ++i)
7200 gfc_constructor_append_expr (&result->value.constructor,
7201 gfc_copy_expr (source), NULL);
7203 else if (source->expr_type == EXPR_ARRAY)
7205 int offset, rstride[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS];
7206 gfc_constructor *source_ctor;
7208 gcc_assert (source->rank < GFC_MAX_DIMENSIONS);
7209 gcc_assert (dim >= 0 && dim <= source->rank);
7211 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
7212 &source->where);
7213 if (source->ts.type == BT_DERIVED)
7214 result->ts.u.derived = source->ts.u.derived;
7215 result->rank = source->rank + 1;
7216 result->shape = gfc_get_shape (result->rank);
7218 for (i = 0, j = 0; i < result->rank; ++i)
7220 if (i != dim)
7221 mpz_init_set (result->shape[i], source->shape[j++]);
7222 else
7223 mpz_init_set_si (result->shape[i], ncopies);
7225 extent[i] = mpz_get_si (result->shape[i]);
7226 rstride[i] = (i == 0) ? 1 : rstride[i-1] * extent[i-1];
7229 offset = 0;
7230 for (source_ctor = gfc_constructor_first (source->value.constructor);
7231 source_ctor; source_ctor = gfc_constructor_next (source_ctor))
7233 for (i = 0; i < ncopies; ++i)
7234 gfc_constructor_insert_expr (&result->value.constructor,
7235 gfc_copy_expr (source_ctor->expr),
7236 NULL, offset + i * rstride[dim]);
7238 offset += (dim == 0 ? ncopies : 1);
7241 else
7243 gfc_error ("Simplification of SPREAD at %C not yet implemented");
7244 return &gfc_bad_expr;
7247 if (source->ts.type == BT_CHARACTER)
7248 result->ts.u.cl = source->ts.u.cl;
7250 return result;
7254 gfc_expr *
7255 gfc_simplify_sqrt (gfc_expr *e)
7257 gfc_expr *result = NULL;
7259 if (e->expr_type != EXPR_CONSTANT)
7260 return NULL;
7262 switch (e->ts.type)
7264 case BT_REAL:
7265 if (mpfr_cmp_si (e->value.real, 0) < 0)
7267 gfc_error ("Argument of SQRT at %L has a negative value",
7268 &e->where);
7269 return &gfc_bad_expr;
7271 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
7272 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
7273 break;
7275 case BT_COMPLEX:
7276 gfc_set_model (e->value.real);
7278 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
7279 mpc_sqrt (result->value.complex, e->value.complex, GFC_MPC_RND_MODE);
7280 break;
7282 default:
7283 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
7286 return range_check (result, "SQRT");
7290 gfc_expr *
7291 gfc_simplify_sum (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
7293 return simplify_transformation (array, dim, mask, 0, gfc_add);
7297 gfc_expr *
7298 gfc_simplify_cotan (gfc_expr *x)
7300 gfc_expr *result;
7301 mpc_t swp, *val;
7303 if (x->expr_type != EXPR_CONSTANT)
7304 return NULL;
7306 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
7308 switch (x->ts.type)
7310 case BT_REAL:
7311 mpfr_cot (result->value.real, x->value.real, GFC_RND_MODE);
7312 break;
7314 case BT_COMPLEX:
7315 /* There is no builtin mpc_cot, so compute cot = cos / sin. */
7316 val = &result->value.complex;
7317 mpc_init2 (swp, mpfr_get_default_prec ());
7318 mpc_cos (swp, x->value.complex, GFC_MPC_RND_MODE);
7319 mpc_sin (*val, x->value.complex, GFC_MPC_RND_MODE);
7320 mpc_div (*val, swp, *val, GFC_MPC_RND_MODE);
7321 mpc_clear (swp);
7322 break;
7324 default:
7325 gcc_unreachable ();
7328 return range_check (result, "COTAN");
7332 gfc_expr *
7333 gfc_simplify_tan (gfc_expr *x)
7335 gfc_expr *result;
7337 if (x->expr_type != EXPR_CONSTANT)
7338 return NULL;
7340 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
7342 switch (x->ts.type)
7344 case BT_REAL:
7345 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
7346 break;
7348 case BT_COMPLEX:
7349 mpc_tan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
7350 break;
7352 default:
7353 gcc_unreachable ();
7356 return range_check (result, "TAN");
7360 gfc_expr *
7361 gfc_simplify_tanh (gfc_expr *x)
7363 gfc_expr *result;
7365 if (x->expr_type != EXPR_CONSTANT)
7366 return NULL;
7368 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
7370 switch (x->ts.type)
7372 case BT_REAL:
7373 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
7374 break;
7376 case BT_COMPLEX:
7377 mpc_tanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
7378 break;
7380 default:
7381 gcc_unreachable ();
7384 return range_check (result, "TANH");
7388 gfc_expr *
7389 gfc_simplify_tiny (gfc_expr *e)
7391 gfc_expr *result;
7392 int i;
7394 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
7396 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
7397 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
7399 return result;
7403 gfc_expr *
7404 gfc_simplify_trailz (gfc_expr *e)
7406 unsigned long tz, bs;
7407 int i;
7409 if (e->expr_type != EXPR_CONSTANT)
7410 return NULL;
7412 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
7413 bs = gfc_integer_kinds[i].bit_size;
7414 tz = mpz_scan1 (e->value.integer, 0);
7416 return gfc_get_int_expr (gfc_default_integer_kind,
7417 &e->where, MIN (tz, bs));
7421 gfc_expr *
7422 gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
7424 gfc_expr *result;
7425 gfc_expr *mold_element;
7426 size_t source_size;
7427 size_t result_size;
7428 size_t buffer_size;
7429 mpz_t tmp;
7430 unsigned char *buffer;
7431 size_t result_length;
7433 if (!gfc_is_constant_expr (source) || !gfc_is_constant_expr (size))
7434 return NULL;
7436 if (!gfc_resolve_expr (mold))
7437 return NULL;
7438 if (gfc_init_expr_flag && !gfc_is_constant_expr (mold))
7439 return NULL;
7441 if (!gfc_calculate_transfer_sizes (source, mold, size, &source_size,
7442 &result_size, &result_length))
7443 return NULL;
7445 /* Calculate the size of the source. */
7446 if (source->expr_type == EXPR_ARRAY && !gfc_array_size (source, &tmp))
7447 gfc_internal_error ("Failure getting length of a constant array.");
7449 /* Create an empty new expression with the appropriate characteristics. */
7450 result = gfc_get_constant_expr (mold->ts.type, mold->ts.kind,
7451 &source->where);
7452 result->ts = mold->ts;
7454 mold_element = (mold->expr_type == EXPR_ARRAY && mold->value.constructor)
7455 ? gfc_constructor_first (mold->value.constructor)->expr
7456 : mold;
7458 /* Set result character length, if needed. Note that this needs to be
7459 set even for array expressions, in order to pass this information into
7460 gfc_target_interpret_expr. */
7461 if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element))
7462 result->value.character.length = mold_element->value.character.length;
7464 /* Set the number of elements in the result, and determine its size. */
7466 if (mold->expr_type == EXPR_ARRAY || mold->rank || size)
7468 result->expr_type = EXPR_ARRAY;
7469 result->rank = 1;
7470 result->shape = gfc_get_shape (1);
7471 mpz_init_set_ui (result->shape[0], result_length);
7473 else
7474 result->rank = 0;
7476 /* Allocate the buffer to store the binary version of the source. */
7477 buffer_size = MAX (source_size, result_size);
7478 buffer = (unsigned char*)alloca (buffer_size);
7479 memset (buffer, 0, buffer_size);
7481 /* Now write source to the buffer. */
7482 gfc_target_encode_expr (source, buffer, buffer_size);
7484 /* And read the buffer back into the new expression. */
7485 gfc_target_interpret_expr (buffer, buffer_size, result, false);
7487 return result;
7491 gfc_expr *
7492 gfc_simplify_transpose (gfc_expr *matrix)
7494 int row, matrix_rows, col, matrix_cols;
7495 gfc_expr *result;
7497 if (!is_constant_array_expr (matrix))
7498 return NULL;
7500 gcc_assert (matrix->rank == 2);
7502 result = gfc_get_array_expr (matrix->ts.type, matrix->ts.kind,
7503 &matrix->where);
7504 result->rank = 2;
7505 result->shape = gfc_get_shape (result->rank);
7506 mpz_set (result->shape[0], matrix->shape[1]);
7507 mpz_set (result->shape[1], matrix->shape[0]);
7509 if (matrix->ts.type == BT_CHARACTER)
7510 result->ts.u.cl = matrix->ts.u.cl;
7511 else if (matrix->ts.type == BT_DERIVED)
7512 result->ts.u.derived = matrix->ts.u.derived;
7514 matrix_rows = mpz_get_si (matrix->shape[0]);
7515 matrix_cols = mpz_get_si (matrix->shape[1]);
7516 for (row = 0; row < matrix_rows; ++row)
7517 for (col = 0; col < matrix_cols; ++col)
7519 gfc_expr *e = gfc_constructor_lookup_expr (matrix->value.constructor,
7520 col * matrix_rows + row);
7521 gfc_constructor_insert_expr (&result->value.constructor,
7522 gfc_copy_expr (e), &matrix->where,
7523 row * matrix_cols + col);
7526 return result;
7530 gfc_expr *
7531 gfc_simplify_trim (gfc_expr *e)
7533 gfc_expr *result;
7534 int count, i, len, lentrim;
7536 if (e->expr_type != EXPR_CONSTANT)
7537 return NULL;
7539 len = e->value.character.length;
7540 for (count = 0, i = 1; i <= len; ++i)
7542 if (e->value.character.string[len - i] == ' ')
7543 count++;
7544 else
7545 break;
7548 lentrim = len - count;
7550 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, lentrim);
7551 for (i = 0; i < lentrim; i++)
7552 result->value.character.string[i] = e->value.character.string[i];
7554 return result;
7558 gfc_expr *
7559 gfc_simplify_image_index (gfc_expr *coarray, gfc_expr *sub)
7561 gfc_expr *result;
7562 gfc_ref *ref;
7563 gfc_array_spec *as;
7564 gfc_constructor *sub_cons;
7565 bool first_image;
7566 int d;
7568 if (!is_constant_array_expr (sub))
7569 return NULL;
7571 /* Follow any component references. */
7572 as = coarray->symtree->n.sym->as;
7573 for (ref = coarray->ref; ref; ref = ref->next)
7574 if (ref->type == REF_COMPONENT)
7575 as = ref->u.ar.as;
7577 if (as->type == AS_DEFERRED)
7578 return NULL;
7580 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
7581 the cosubscript addresses the first image. */
7583 sub_cons = gfc_constructor_first (sub->value.constructor);
7584 first_image = true;
7586 for (d = 1; d <= as->corank; d++)
7588 gfc_expr *ca_bound;
7589 int cmp;
7591 gcc_assert (sub_cons != NULL);
7593 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 0, as,
7594 NULL, true);
7595 if (ca_bound == NULL)
7596 return NULL;
7598 if (ca_bound == &gfc_bad_expr)
7599 return ca_bound;
7601 cmp = mpz_cmp (ca_bound->value.integer, sub_cons->expr->value.integer);
7603 if (cmp == 0)
7605 gfc_free_expr (ca_bound);
7606 sub_cons = gfc_constructor_next (sub_cons);
7607 continue;
7610 first_image = false;
7612 if (cmp > 0)
7614 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
7615 "SUB has %ld and COARRAY lower bound is %ld)",
7616 &coarray->where, d,
7617 mpz_get_si (sub_cons->expr->value.integer),
7618 mpz_get_si (ca_bound->value.integer));
7619 gfc_free_expr (ca_bound);
7620 return &gfc_bad_expr;
7623 gfc_free_expr (ca_bound);
7625 /* Check whether upperbound is valid for the multi-images case. */
7626 if (d < as->corank)
7628 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 1, as,
7629 NULL, true);
7630 if (ca_bound == &gfc_bad_expr)
7631 return ca_bound;
7633 if (ca_bound && ca_bound->expr_type == EXPR_CONSTANT
7634 && mpz_cmp (ca_bound->value.integer,
7635 sub_cons->expr->value.integer) < 0)
7637 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
7638 "SUB has %ld and COARRAY upper bound is %ld)",
7639 &coarray->where, d,
7640 mpz_get_si (sub_cons->expr->value.integer),
7641 mpz_get_si (ca_bound->value.integer));
7642 gfc_free_expr (ca_bound);
7643 return &gfc_bad_expr;
7646 if (ca_bound)
7647 gfc_free_expr (ca_bound);
7650 sub_cons = gfc_constructor_next (sub_cons);
7653 gcc_assert (sub_cons == NULL);
7655 if (flag_coarray != GFC_FCOARRAY_SINGLE && !first_image)
7656 return NULL;
7658 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
7659 &gfc_current_locus);
7660 if (first_image)
7661 mpz_set_si (result->value.integer, 1);
7662 else
7663 mpz_set_si (result->value.integer, 0);
7665 return result;
7668 gfc_expr *
7669 gfc_simplify_image_status (gfc_expr *image, gfc_expr *team ATTRIBUTE_UNUSED)
7671 if (flag_coarray == GFC_FCOARRAY_NONE)
7673 gfc_current_locus = *gfc_current_intrinsic_where;
7674 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
7675 return &gfc_bad_expr;
7678 /* Simplification is possible for fcoarray = single only. For all other modes
7679 the result depends on runtime conditions. */
7680 if (flag_coarray != GFC_FCOARRAY_SINGLE)
7681 return NULL;
7683 if (gfc_is_constant_expr (image))
7685 gfc_expr *result;
7686 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
7687 &image->where);
7688 if (mpz_get_si (image->value.integer) == 1)
7689 mpz_set_si (result->value.integer, 0);
7690 else
7691 mpz_set_si (result->value.integer, GFC_STAT_STOPPED_IMAGE);
7692 return result;
7694 else
7695 return NULL;
7699 gfc_expr *
7700 gfc_simplify_this_image (gfc_expr *coarray, gfc_expr *dim,
7701 gfc_expr *distance ATTRIBUTE_UNUSED)
7703 if (flag_coarray != GFC_FCOARRAY_SINGLE)
7704 return NULL;
7706 /* If no coarray argument has been passed or when the first argument
7707 is actually a distance argment. */
7708 if (coarray == NULL || !gfc_is_coarray (coarray))
7710 gfc_expr *result;
7711 /* FIXME: gfc_current_locus is wrong. */
7712 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
7713 &gfc_current_locus);
7714 mpz_set_si (result->value.integer, 1);
7715 return result;
7718 /* For -fcoarray=single, this_image(A) is the same as lcobound(A). */
7719 return simplify_cobound (coarray, dim, NULL, 0);
7723 gfc_expr *
7724 gfc_simplify_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
7726 return simplify_bound (array, dim, kind, 1);
7729 gfc_expr *
7730 gfc_simplify_ucobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
7732 return simplify_cobound (array, dim, kind, 1);
7736 gfc_expr *
7737 gfc_simplify_unpack (gfc_expr *vector, gfc_expr *mask, gfc_expr *field)
7739 gfc_expr *result, *e;
7740 gfc_constructor *vector_ctor, *mask_ctor, *field_ctor;
7742 if (!is_constant_array_expr (vector)
7743 || !is_constant_array_expr (mask)
7744 || (!gfc_is_constant_expr (field)
7745 && !is_constant_array_expr (field)))
7746 return NULL;
7748 result = gfc_get_array_expr (vector->ts.type, vector->ts.kind,
7749 &vector->where);
7750 if (vector->ts.type == BT_DERIVED)
7751 result->ts.u.derived = vector->ts.u.derived;
7752 result->rank = mask->rank;
7753 result->shape = gfc_copy_shape (mask->shape, mask->rank);
7755 if (vector->ts.type == BT_CHARACTER)
7756 result->ts.u.cl = vector->ts.u.cl;
7758 vector_ctor = gfc_constructor_first (vector->value.constructor);
7759 mask_ctor = gfc_constructor_first (mask->value.constructor);
7760 field_ctor
7761 = field->expr_type == EXPR_ARRAY
7762 ? gfc_constructor_first (field->value.constructor)
7763 : NULL;
7765 while (mask_ctor)
7767 if (mask_ctor->expr->value.logical)
7769 gcc_assert (vector_ctor);
7770 e = gfc_copy_expr (vector_ctor->expr);
7771 vector_ctor = gfc_constructor_next (vector_ctor);
7773 else if (field->expr_type == EXPR_ARRAY)
7774 e = gfc_copy_expr (field_ctor->expr);
7775 else
7776 e = gfc_copy_expr (field);
7778 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
7780 mask_ctor = gfc_constructor_next (mask_ctor);
7781 field_ctor = gfc_constructor_next (field_ctor);
7784 return result;
7788 gfc_expr *
7789 gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind)
7791 gfc_expr *result;
7792 int back;
7793 size_t index, len, lenset;
7794 size_t i;
7795 int k = get_kind (BT_INTEGER, kind, "VERIFY", gfc_default_integer_kind);
7797 if (k == -1)
7798 return &gfc_bad_expr;
7800 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT
7801 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
7802 return NULL;
7804 if (b != NULL && b->value.logical != 0)
7805 back = 1;
7806 else
7807 back = 0;
7809 result = gfc_get_constant_expr (BT_INTEGER, k, &s->where);
7811 len = s->value.character.length;
7812 lenset = set->value.character.length;
7814 if (len == 0)
7816 mpz_set_ui (result->value.integer, 0);
7817 return result;
7820 if (back == 0)
7822 if (lenset == 0)
7824 mpz_set_ui (result->value.integer, 1);
7825 return result;
7828 index = wide_strspn (s->value.character.string,
7829 set->value.character.string) + 1;
7830 if (index > len)
7831 index = 0;
7834 else
7836 if (lenset == 0)
7838 mpz_set_ui (result->value.integer, len);
7839 return result;
7841 for (index = len; index > 0; index --)
7843 for (i = 0; i < lenset; i++)
7845 if (s->value.character.string[index - 1]
7846 == set->value.character.string[i])
7847 break;
7849 if (i == lenset)
7850 break;
7854 mpz_set_ui (result->value.integer, index);
7855 return result;
7859 gfc_expr *
7860 gfc_simplify_xor (gfc_expr *x, gfc_expr *y)
7862 gfc_expr *result;
7863 int kind;
7865 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
7866 return NULL;
7868 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
7870 switch (x->ts.type)
7872 case BT_INTEGER:
7873 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
7874 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
7875 return range_check (result, "XOR");
7877 case BT_LOGICAL:
7878 return gfc_get_logical_expr (kind, &x->where,
7879 (x->value.logical && !y->value.logical)
7880 || (!x->value.logical && y->value.logical));
7882 default:
7883 gcc_unreachable ();
7888 /****************** Constant simplification *****************/
7890 /* Master function to convert one constant to another. While this is
7891 used as a simplification function, it requires the destination type
7892 and kind information which is supplied by a special case in
7893 do_simplify(). */
7895 gfc_expr *
7896 gfc_convert_constant (gfc_expr *e, bt type, int kind)
7898 gfc_expr *result, *(*f) (gfc_expr *, int);
7899 gfc_constructor *c, *t;
7901 switch (e->ts.type)
7903 case BT_INTEGER:
7904 switch (type)
7906 case BT_INTEGER:
7907 f = gfc_int2int;
7908 break;
7909 case BT_REAL:
7910 f = gfc_int2real;
7911 break;
7912 case BT_COMPLEX:
7913 f = gfc_int2complex;
7914 break;
7915 case BT_LOGICAL:
7916 f = gfc_int2log;
7917 break;
7918 default:
7919 goto oops;
7921 break;
7923 case BT_REAL:
7924 switch (type)
7926 case BT_INTEGER:
7927 f = gfc_real2int;
7928 break;
7929 case BT_REAL:
7930 f = gfc_real2real;
7931 break;
7932 case BT_COMPLEX:
7933 f = gfc_real2complex;
7934 break;
7935 default:
7936 goto oops;
7938 break;
7940 case BT_COMPLEX:
7941 switch (type)
7943 case BT_INTEGER:
7944 f = gfc_complex2int;
7945 break;
7946 case BT_REAL:
7947 f = gfc_complex2real;
7948 break;
7949 case BT_COMPLEX:
7950 f = gfc_complex2complex;
7951 break;
7953 default:
7954 goto oops;
7956 break;
7958 case BT_LOGICAL:
7959 switch (type)
7961 case BT_INTEGER:
7962 f = gfc_log2int;
7963 break;
7964 case BT_LOGICAL:
7965 f = gfc_log2log;
7966 break;
7967 default:
7968 goto oops;
7970 break;
7972 case BT_HOLLERITH:
7973 switch (type)
7975 case BT_INTEGER:
7976 f = gfc_hollerith2int;
7977 break;
7979 case BT_REAL:
7980 f = gfc_hollerith2real;
7981 break;
7983 case BT_COMPLEX:
7984 f = gfc_hollerith2complex;
7985 break;
7987 case BT_CHARACTER:
7988 f = gfc_hollerith2character;
7989 break;
7991 case BT_LOGICAL:
7992 f = gfc_hollerith2logical;
7993 break;
7995 default:
7996 goto oops;
7998 break;
8000 case BT_CHARACTER:
8001 if (type == BT_CHARACTER)
8002 f = gfc_character2character;
8003 else
8004 goto oops;
8005 break;
8007 default:
8008 oops:
8009 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
8012 result = NULL;
8014 switch (e->expr_type)
8016 case EXPR_CONSTANT:
8017 result = f (e, kind);
8018 if (result == NULL)
8019 return &gfc_bad_expr;
8020 break;
8022 case EXPR_ARRAY:
8023 if (!gfc_is_constant_expr (e))
8024 break;
8026 result = gfc_get_array_expr (type, kind, &e->where);
8027 result->shape = gfc_copy_shape (e->shape, e->rank);
8028 result->rank = e->rank;
8030 for (c = gfc_constructor_first (e->value.constructor);
8031 c; c = gfc_constructor_next (c))
8033 gfc_expr *tmp;
8034 if (c->iterator == NULL)
8036 if (c->expr->expr_type == EXPR_ARRAY)
8037 tmp = gfc_convert_constant (c->expr, type, kind);
8038 else
8039 tmp = f (c->expr, kind);
8041 else
8042 tmp = gfc_convert_constant (c->expr, type, kind);
8044 if (tmp == NULL || tmp == &gfc_bad_expr)
8046 gfc_free_expr (result);
8047 return NULL;
8050 t = gfc_constructor_append_expr (&result->value.constructor,
8051 tmp, &c->where);
8052 if (c->iterator)
8053 t->iterator = gfc_copy_iterator (c->iterator);
8056 break;
8058 default:
8059 break;
8062 return result;
8066 /* Function for converting character constants. */
8067 gfc_expr *
8068 gfc_convert_char_constant (gfc_expr *e, bt type ATTRIBUTE_UNUSED, int kind)
8070 gfc_expr *result;
8071 int i;
8073 if (!gfc_is_constant_expr (e))
8074 return NULL;
8076 if (e->expr_type == EXPR_CONSTANT)
8078 /* Simple case of a scalar. */
8079 result = gfc_get_constant_expr (BT_CHARACTER, kind, &e->where);
8080 if (result == NULL)
8081 return &gfc_bad_expr;
8083 result->value.character.length = e->value.character.length;
8084 result->value.character.string
8085 = gfc_get_wide_string (e->value.character.length + 1);
8086 memcpy (result->value.character.string, e->value.character.string,
8087 (e->value.character.length + 1) * sizeof (gfc_char_t));
8089 /* Check we only have values representable in the destination kind. */
8090 for (i = 0; i < result->value.character.length; i++)
8091 if (!gfc_check_character_range (result->value.character.string[i],
8092 kind))
8094 gfc_error ("Character %qs in string at %L cannot be converted "
8095 "into character kind %d",
8096 gfc_print_wide_char (result->value.character.string[i]),
8097 &e->where, kind);
8098 gfc_free_expr (result);
8099 return &gfc_bad_expr;
8102 return result;
8104 else if (e->expr_type == EXPR_ARRAY)
8106 /* For an array constructor, we convert each constructor element. */
8107 gfc_constructor *c;
8109 result = gfc_get_array_expr (type, kind, &e->where);
8110 result->shape = gfc_copy_shape (e->shape, e->rank);
8111 result->rank = e->rank;
8112 result->ts.u.cl = e->ts.u.cl;
8114 for (c = gfc_constructor_first (e->value.constructor);
8115 c; c = gfc_constructor_next (c))
8117 gfc_expr *tmp = gfc_convert_char_constant (c->expr, type, kind);
8118 if (tmp == &gfc_bad_expr)
8120 gfc_free_expr (result);
8121 return &gfc_bad_expr;
8124 if (tmp == NULL)
8126 gfc_free_expr (result);
8127 return NULL;
8130 gfc_constructor_append_expr (&result->value.constructor,
8131 tmp, &c->where);
8134 return result;
8136 else
8137 return NULL;
8141 gfc_expr *
8142 gfc_simplify_compiler_options (void)
8144 char *str;
8145 gfc_expr *result;
8147 str = gfc_get_option_string ();
8148 result = gfc_get_character_expr (gfc_default_character_kind,
8149 &gfc_current_locus, str, strlen (str));
8150 free (str);
8151 return result;
8155 gfc_expr *
8156 gfc_simplify_compiler_version (void)
8158 char *buffer;
8159 size_t len;
8161 len = strlen ("GCC version ") + strlen (version_string);
8162 buffer = XALLOCAVEC (char, len + 1);
8163 snprintf (buffer, len + 1, "GCC version %s", version_string);
8164 return gfc_get_character_expr (gfc_default_character_kind,
8165 &gfc_current_locus, buffer, len);
8168 /* Simplification routines for intrinsics of IEEE modules. */
8170 gfc_expr *
8171 simplify_ieee_selected_real_kind (gfc_expr *expr)
8173 gfc_actual_arglist *arg;
8174 gfc_expr *p = NULL, *q = NULL, *rdx = NULL;
8176 arg = expr->value.function.actual;
8177 p = arg->expr;
8178 if (arg->next)
8180 q = arg->next->expr;
8181 if (arg->next->next)
8182 rdx = arg->next->next->expr;
8185 /* Currently, if IEEE is supported and this module is built, it means
8186 all our floating-point types conform to IEEE. Hence, we simply handle
8187 IEEE_SELECTED_REAL_KIND like SELECTED_REAL_KIND. */
8188 return gfc_simplify_selected_real_kind (p, q, rdx);
8191 gfc_expr *
8192 simplify_ieee_support (gfc_expr *expr)
8194 /* We consider that if the IEEE modules are loaded, we have full support
8195 for flags, halting and rounding, which are the three functions
8196 (IEEE_SUPPORT_{FLAG,HALTING,ROUNDING}) allowed in constant
8197 expressions. One day, we will need libgfortran to detect support and
8198 communicate it back to us, allowing for partial support. */
8200 return gfc_get_logical_expr (gfc_default_logical_kind, &expr->where,
8201 true);
8204 bool
8205 matches_ieee_function_name (gfc_symbol *sym, const char *name)
8207 int n = strlen(name);
8209 if (!strncmp(sym->name, name, n))
8210 return true;
8212 /* If a generic was used and renamed, we need more work to find out.
8213 Compare the specific name. */
8214 if (sym->generic && !strncmp(sym->generic->sym->name, name, n))
8215 return true;
8217 return false;
8220 gfc_expr *
8221 gfc_simplify_ieee_functions (gfc_expr *expr)
8223 gfc_symbol* sym = expr->symtree->n.sym;
8225 if (matches_ieee_function_name(sym, "ieee_selected_real_kind"))
8226 return simplify_ieee_selected_real_kind (expr);
8227 else if (matches_ieee_function_name(sym, "ieee_support_flag")
8228 || matches_ieee_function_name(sym, "ieee_support_halting")
8229 || matches_ieee_function_name(sym, "ieee_support_rounding"))
8230 return simplify_ieee_support (expr);
8231 else
8232 return NULL;