1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
3 2010, 2011 Free Software Foundation, Inc.
4 Contributed by Andy Vaught & Katherine Holcomb
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
27 #include "intrinsic.h"
28 #include "target-memory.h"
29 #include "constructor.h"
30 #include "version.h" /* For version_string. */
33 gfc_expr gfc_bad_expr;
36 /* Note that 'simplification' is not just transforming expressions.
37 For functions that are not simplified at compile time, range
38 checking is done if possible.
40 The return convention is that each simplification function returns:
42 A new expression node corresponding to the simplified arguments.
43 The original arguments are destroyed by the caller, and must not
44 be a part of the new expression.
46 NULL pointer indicating that no simplification was possible and
47 the original expression should remain intact.
49 An expression pointer to gfc_bad_expr (a static placeholder)
50 indicating that some error has prevented simplification. The
51 error is generated within the function and should be propagated
54 By the time a simplification function gets control, it has been
55 decided that the function call is really supposed to be the
56 intrinsic. No type checking is strictly necessary, since only
57 valid types will be passed on. On the other hand, a simplification
58 subroutine may have to look at the type of an argument as part of
61 Array arguments are only passed to these subroutines that implement
62 the simplification of transformational intrinsics.
64 The functions in this file don't have much comment with them, but
65 everything is reasonably straight-forward. The Standard, chapter 13
66 is the best comment you'll find for this file anyway. */
68 /* Range checks an expression node. If all goes well, returns the
69 node, otherwise returns &gfc_bad_expr and frees the node. */
72 range_check (gfc_expr *result, const char *name)
77 if (result->expr_type != EXPR_CONSTANT)
80 switch (gfc_range_check (result))
86 gfc_error ("Result of %s overflows its kind at %L", name,
91 gfc_error ("Result of %s underflows its kind at %L", name,
96 gfc_error ("Result of %s is NaN at %L", name, &result->where);
100 gfc_error ("Result of %s gives range error for its kind at %L", name,
105 gfc_free_expr (result);
106 return &gfc_bad_expr;
110 /* A helper function that gets an optional and possibly missing
111 kind parameter. Returns the kind, -1 if something went wrong. */
114 get_kind (bt type, gfc_expr *k, const char *name, int default_kind)
121 if (k->expr_type != EXPR_CONSTANT)
123 gfc_error ("KIND parameter of %s at %L must be an initialization "
124 "expression", name, &k->where);
128 if (gfc_extract_int (k, &kind) != NULL
129 || gfc_validate_kind (type, kind, true) < 0)
131 gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where);
139 /* Converts an mpz_t signed variable into an unsigned one, assuming
140 two's complement representations and a binary width of bitsize.
141 The conversion is a no-op unless x is negative; otherwise, it can
142 be accomplished by masking out the high bits. */
145 convert_mpz_to_unsigned (mpz_t x, int bitsize)
151 /* Confirm that no bits above the signed range are unset. */
152 gcc_assert (mpz_scan0 (x, bitsize-1) == ULONG_MAX);
154 mpz_init_set_ui (mask, 1);
155 mpz_mul_2exp (mask, mask, bitsize);
156 mpz_sub_ui (mask, mask, 1);
158 mpz_and (x, x, mask);
164 /* Confirm that no bits above the signed range are set. */
165 gcc_assert (mpz_scan1 (x, bitsize-1) == ULONG_MAX);
170 /* Converts an mpz_t unsigned variable into a signed one, assuming
171 two's complement representations and a binary width of bitsize.
172 If the bitsize-1 bit is set, this is taken as a sign bit and
173 the number is converted to the corresponding negative number. */
176 convert_mpz_to_signed (mpz_t x, int bitsize)
180 /* Confirm that no bits above the unsigned range are set. */
181 gcc_assert (mpz_scan1 (x, bitsize) == ULONG_MAX);
183 if (mpz_tstbit (x, bitsize - 1) == 1)
185 mpz_init_set_ui (mask, 1);
186 mpz_mul_2exp (mask, mask, bitsize);
187 mpz_sub_ui (mask, mask, 1);
189 /* We negate the number by hand, zeroing the high bits, that is
190 make it the corresponding positive number, and then have it
191 negated by GMP, giving the correct representation of the
194 mpz_add_ui (x, x, 1);
195 mpz_and (x, x, mask);
204 /* In-place convert BOZ to REAL of the specified kind. */
207 convert_boz (gfc_expr *x, int kind)
209 if (x && x->ts.type == BT_INTEGER && x->is_boz)
216 if (!gfc_convert_boz (x, &ts))
217 return &gfc_bad_expr;
224 /* Test that the expression is an constant array. */
227 is_constant_array_expr (gfc_expr *e)
234 if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e))
237 for (c = gfc_constructor_first (e->value.constructor);
238 c; c = gfc_constructor_next (c))
239 if (c->expr->expr_type != EXPR_CONSTANT
240 && c->expr->expr_type != EXPR_STRUCTURE)
247 /* Initialize a transformational result expression with a given value. */
250 init_result_expr (gfc_expr *e, int init, gfc_expr *array)
252 if (e && e->expr_type == EXPR_ARRAY)
254 gfc_constructor *ctor = gfc_constructor_first (e->value.constructor);
257 init_result_expr (ctor->expr, init, array);
258 ctor = gfc_constructor_next (ctor);
261 else if (e && e->expr_type == EXPR_CONSTANT)
263 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
270 e->value.logical = (init ? 1 : 0);
275 mpz_set (e->value.integer, gfc_integer_kinds[i].min_int);
276 else if (init == INT_MAX)
277 mpz_set (e->value.integer, gfc_integer_kinds[i].huge);
279 mpz_set_si (e->value.integer, init);
285 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
286 mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE);
288 else if (init == INT_MAX)
289 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
291 mpfr_set_si (e->value.real, init, GFC_RND_MODE);
295 mpc_set_si (e->value.complex, init, GFC_MPC_RND_MODE);
301 gfc_expr *len = gfc_simplify_len (array, NULL);
302 gfc_extract_int (len, &length);
303 string = gfc_get_wide_string (length + 1);
304 gfc_wide_memset (string, 0, length);
306 else if (init == INT_MAX)
308 gfc_expr *len = gfc_simplify_len (array, NULL);
309 gfc_extract_int (len, &length);
310 string = gfc_get_wide_string (length + 1);
311 gfc_wide_memset (string, 255, length);
316 string = gfc_get_wide_string (1);
319 string[length] = '\0';
320 e->value.character.length = length;
321 e->value.character.string = string;
333 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul. */
336 compute_dot_product (gfc_expr *matrix_a, int stride_a, int offset_a,
337 gfc_expr *matrix_b, int stride_b, int offset_b)
339 gfc_expr *result, *a, *b;
341 result = gfc_get_constant_expr (matrix_a->ts.type, matrix_a->ts.kind,
343 init_result_expr (result, 0, NULL);
345 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
346 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
349 /* Copying of expressions is required as operands are free'd
350 by the gfc_arith routines. */
351 switch (result->ts.type)
354 result = gfc_or (result,
355 gfc_and (gfc_copy_expr (a),
362 result = gfc_add (result,
363 gfc_multiply (gfc_copy_expr (a),
371 offset_a += stride_a;
372 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
374 offset_b += stride_b;
375 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
382 /* Build a result expression for transformational intrinsics,
386 transformational_result (gfc_expr *array, gfc_expr *dim, bt type,
387 int kind, locus* where)
392 if (!dim || array->rank == 1)
393 return gfc_get_constant_expr (type, kind, where);
395 result = gfc_get_array_expr (type, kind, where);
396 result->shape = gfc_copy_shape_excluding (array->shape, array->rank, dim);
397 result->rank = array->rank - 1;
399 /* gfc_array_size() would count the number of elements in the constructor,
400 we have not built those yet. */
402 for (i = 0; i < result->rank; ++i)
403 nelem *= mpz_get_ui (result->shape[i]);
405 for (i = 0; i < nelem; ++i)
407 gfc_constructor_append_expr (&result->value.constructor,
408 gfc_get_constant_expr (type, kind, where),
416 typedef gfc_expr* (*transformational_op)(gfc_expr*, gfc_expr*);
418 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
419 of COUNT intrinsic is .TRUE..
421 Interface and implimentation mimics arith functions as
422 gfc_add, gfc_multiply, etc. */
424 static gfc_expr* gfc_count (gfc_expr *op1, gfc_expr *op2)
428 gcc_assert (op1->ts.type == BT_INTEGER);
429 gcc_assert (op2->ts.type == BT_LOGICAL);
430 gcc_assert (op2->value.logical);
432 result = gfc_copy_expr (op1);
433 mpz_add_ui (result->value.integer, result->value.integer, 1);
441 /* Transforms an ARRAY with operation OP, according to MASK, to a
442 scalar RESULT. E.g. called if
444 REAL, PARAMETER :: array(n, m) = ...
445 REAL, PARAMETER :: s = SUM(array)
447 where OP == gfc_add(). */
450 simplify_transformation_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *mask,
451 transformational_op op)
454 gfc_constructor *array_ctor, *mask_ctor;
456 /* Shortcut for constant .FALSE. MASK. */
458 && mask->expr_type == EXPR_CONSTANT
459 && !mask->value.logical)
462 array_ctor = gfc_constructor_first (array->value.constructor);
464 if (mask && mask->expr_type == EXPR_ARRAY)
465 mask_ctor = gfc_constructor_first (mask->value.constructor);
469 a = array_ctor->expr;
470 array_ctor = gfc_constructor_next (array_ctor);
472 /* A constant MASK equals .TRUE. here and can be ignored. */
476 mask_ctor = gfc_constructor_next (mask_ctor);
477 if (!m->value.logical)
481 result = op (result, gfc_copy_expr (a));
487 /* Transforms an ARRAY with operation OP, according to MASK, to an
488 array RESULT. E.g. called if
490 REAL, PARAMETER :: array(n, m) = ...
491 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
493 where OP == gfc_multiply(). The result might be post processed using post_op. */
496 simplify_transformation_to_array (gfc_expr *result, gfc_expr *array, gfc_expr *dim,
497 gfc_expr *mask, transformational_op op,
498 transformational_op post_op)
501 int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride;
502 gfc_expr **arrayvec, **resultvec, **base, **src, **dest;
503 gfc_constructor *array_ctor, *mask_ctor, *result_ctor;
505 int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
506 sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS],
507 tmpstride[GFC_MAX_DIMENSIONS];
509 /* Shortcut for constant .FALSE. MASK. */
511 && mask->expr_type == EXPR_CONSTANT
512 && !mask->value.logical)
515 /* Build an indexed table for array element expressions to minimize
516 linked-list traversal. Masked elements are set to NULL. */
517 gfc_array_size (array, &size);
518 arraysize = mpz_get_ui (size);
520 arrayvec = XCNEWVEC (gfc_expr*, arraysize);
522 array_ctor = gfc_constructor_first (array->value.constructor);
524 if (mask && mask->expr_type == EXPR_ARRAY)
525 mask_ctor = gfc_constructor_first (mask->value.constructor);
527 for (i = 0; i < arraysize; ++i)
529 arrayvec[i] = array_ctor->expr;
530 array_ctor = gfc_constructor_next (array_ctor);
534 if (!mask_ctor->expr->value.logical)
537 mask_ctor = gfc_constructor_next (mask_ctor);
541 /* Same for the result expression. */
542 gfc_array_size (result, &size);
543 resultsize = mpz_get_ui (size);
546 resultvec = XCNEWVEC (gfc_expr*, resultsize);
547 result_ctor = gfc_constructor_first (result->value.constructor);
548 for (i = 0; i < resultsize; ++i)
550 resultvec[i] = result_ctor->expr;
551 result_ctor = gfc_constructor_next (result_ctor);
554 gfc_extract_int (dim, &dim_index);
555 dim_index -= 1; /* zero-base index */
559 for (i = 0, n = 0; i < array->rank; ++i)
562 tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]);
565 dim_extent = mpz_get_si (array->shape[i]);
566 dim_stride = tmpstride[i];
570 extent[n] = mpz_get_si (array->shape[i]);
571 sstride[n] = tmpstride[i];
572 dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1];
581 for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n)
583 *dest = op (*dest, gfc_copy_expr (*src));
590 while (!done && count[n] == extent[n])
593 base -= sstride[n] * extent[n];
594 dest -= dstride[n] * extent[n];
597 if (n < result->rank)
608 /* Place updated expression in result constructor. */
609 result_ctor = gfc_constructor_first (result->value.constructor);
610 for (i = 0; i < resultsize; ++i)
613 result_ctor->expr = post_op (result_ctor->expr, resultvec[i]);
615 result_ctor->expr = resultvec[i];
616 result_ctor = gfc_constructor_next (result_ctor);
626 simplify_transformation (gfc_expr *array, gfc_expr *dim, gfc_expr *mask,
627 int init_val, transformational_op op)
631 if (!is_constant_array_expr (array)
632 || !gfc_is_constant_expr (dim))
636 && !is_constant_array_expr (mask)
637 && mask->expr_type != EXPR_CONSTANT)
640 result = transformational_result (array, dim, array->ts.type,
641 array->ts.kind, &array->where);
642 init_result_expr (result, init_val, NULL);
644 return !dim || array->rank == 1 ?
645 simplify_transformation_to_scalar (result, array, mask, op) :
646 simplify_transformation_to_array (result, array, dim, mask, op, NULL);
650 /********************** Simplification functions *****************************/
653 gfc_simplify_abs (gfc_expr *e)
657 if (e->expr_type != EXPR_CONSTANT)
663 result = gfc_get_constant_expr (BT_INTEGER, e->ts.kind, &e->where);
664 mpz_abs (result->value.integer, e->value.integer);
665 return range_check (result, "IABS");
668 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
669 mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
670 return range_check (result, "ABS");
673 gfc_set_model_kind (e->ts.kind);
674 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
675 mpc_abs (result->value.real, e->value.complex, GFC_RND_MODE);
676 return range_check (result, "CABS");
679 gfc_internal_error ("gfc_simplify_abs(): Bad type");
685 simplify_achar_char (gfc_expr *e, gfc_expr *k, const char *name, bool ascii)
689 bool too_large = false;
691 if (e->expr_type != EXPR_CONSTANT)
694 kind = get_kind (BT_CHARACTER, k, name, gfc_default_character_kind);
696 return &gfc_bad_expr;
698 if (mpz_cmp_si (e->value.integer, 0) < 0)
700 gfc_error ("Argument of %s function at %L is negative", name,
702 return &gfc_bad_expr;
705 if (ascii && gfc_option.warn_surprising
706 && mpz_cmp_si (e->value.integer, 127) > 0)
707 gfc_warning ("Argument of %s function at %L outside of range [0,127]",
710 if (kind == 1 && mpz_cmp_si (e->value.integer, 255) > 0)
715 mpz_init_set_ui (t, 2);
716 mpz_pow_ui (t, t, 32);
717 mpz_sub_ui (t, t, 1);
718 if (mpz_cmp (e->value.integer, t) > 0)
725 gfc_error ("Argument of %s function at %L is too large for the "
726 "collating sequence of kind %d", name, &e->where, kind);
727 return &gfc_bad_expr;
730 result = gfc_get_character_expr (kind, &e->where, NULL, 1);
731 result->value.character.string[0] = mpz_get_ui (e->value.integer);
738 /* We use the processor's collating sequence, because all
739 systems that gfortran currently works on are ASCII. */
742 gfc_simplify_achar (gfc_expr *e, gfc_expr *k)
744 return simplify_achar_char (e, k, "ACHAR", true);
749 gfc_simplify_acos (gfc_expr *x)
753 if (x->expr_type != EXPR_CONSTANT)
759 if (mpfr_cmp_si (x->value.real, 1) > 0
760 || mpfr_cmp_si (x->value.real, -1) < 0)
762 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
764 return &gfc_bad_expr;
766 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
767 mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
771 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
772 mpc_acos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
776 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
779 return range_check (result, "ACOS");
783 gfc_simplify_acosh (gfc_expr *x)
787 if (x->expr_type != EXPR_CONSTANT)
793 if (mpfr_cmp_si (x->value.real, 1) < 0)
795 gfc_error ("Argument of ACOSH at %L must not be less than 1",
797 return &gfc_bad_expr;
800 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
801 mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
805 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
806 mpc_acosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
810 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
813 return range_check (result, "ACOSH");
817 gfc_simplify_adjustl (gfc_expr *e)
823 if (e->expr_type != EXPR_CONSTANT)
826 len = e->value.character.length;
828 for (count = 0, i = 0; i < len; ++i)
830 ch = e->value.character.string[i];
836 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
837 for (i = 0; i < len - count; ++i)
838 result->value.character.string[i] = e->value.character.string[count + i];
845 gfc_simplify_adjustr (gfc_expr *e)
851 if (e->expr_type != EXPR_CONSTANT)
854 len = e->value.character.length;
856 for (count = 0, i = len - 1; i >= 0; --i)
858 ch = e->value.character.string[i];
864 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
865 for (i = 0; i < count; ++i)
866 result->value.character.string[i] = ' ';
868 for (i = count; i < len; ++i)
869 result->value.character.string[i] = e->value.character.string[i - count];
876 gfc_simplify_aimag (gfc_expr *e)
880 if (e->expr_type != EXPR_CONSTANT)
883 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
884 mpfr_set (result->value.real, mpc_imagref (e->value.complex), GFC_RND_MODE);
886 return range_check (result, "AIMAG");
891 gfc_simplify_aint (gfc_expr *e, gfc_expr *k)
893 gfc_expr *rtrunc, *result;
896 kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
898 return &gfc_bad_expr;
900 if (e->expr_type != EXPR_CONSTANT)
903 rtrunc = gfc_copy_expr (e);
904 mpfr_trunc (rtrunc->value.real, e->value.real);
906 result = gfc_real2real (rtrunc, kind);
908 gfc_free_expr (rtrunc);
910 return range_check (result, "AINT");
915 gfc_simplify_all (gfc_expr *mask, gfc_expr *dim)
917 return simplify_transformation (mask, dim, NULL, true, gfc_and);
922 gfc_simplify_dint (gfc_expr *e)
924 gfc_expr *rtrunc, *result;
926 if (e->expr_type != EXPR_CONSTANT)
929 rtrunc = gfc_copy_expr (e);
930 mpfr_trunc (rtrunc->value.real, e->value.real);
932 result = gfc_real2real (rtrunc, gfc_default_double_kind);
934 gfc_free_expr (rtrunc);
936 return range_check (result, "DINT");
941 gfc_simplify_anint (gfc_expr *e, gfc_expr *k)
946 kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
948 return &gfc_bad_expr;
950 if (e->expr_type != EXPR_CONSTANT)
953 result = gfc_get_constant_expr (e->ts.type, kind, &e->where);
954 mpfr_round (result->value.real, e->value.real);
956 return range_check (result, "ANINT");
961 gfc_simplify_and (gfc_expr *x, gfc_expr *y)
966 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
969 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
974 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
975 mpz_and (result->value.integer, x->value.integer, y->value.integer);
976 return range_check (result, "AND");
979 return gfc_get_logical_expr (kind, &x->where,
980 x->value.logical && y->value.logical);
989 gfc_simplify_any (gfc_expr *mask, gfc_expr *dim)
991 return simplify_transformation (mask, dim, NULL, false, gfc_or);
996 gfc_simplify_dnint (gfc_expr *e)
1000 if (e->expr_type != EXPR_CONSTANT)
1003 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &e->where);
1004 mpfr_round (result->value.real, e->value.real);
1006 return range_check (result, "DNINT");
1011 gfc_simplify_asin (gfc_expr *x)
1015 if (x->expr_type != EXPR_CONSTANT)
1021 if (mpfr_cmp_si (x->value.real, 1) > 0
1022 || mpfr_cmp_si (x->value.real, -1) < 0)
1024 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1026 return &gfc_bad_expr;
1028 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1029 mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE);
1033 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1034 mpc_asin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1038 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1041 return range_check (result, "ASIN");
1046 gfc_simplify_asinh (gfc_expr *x)
1050 if (x->expr_type != EXPR_CONSTANT)
1053 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1058 mpfr_asinh (result->value.real, x->value.real, GFC_RND_MODE);
1062 mpc_asinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1066 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1069 return range_check (result, "ASINH");
1074 gfc_simplify_atan (gfc_expr *x)
1078 if (x->expr_type != EXPR_CONSTANT)
1081 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1086 mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE);
1090 mpc_atan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1094 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1097 return range_check (result, "ATAN");
1102 gfc_simplify_atanh (gfc_expr *x)
1106 if (x->expr_type != EXPR_CONSTANT)
1112 if (mpfr_cmp_si (x->value.real, 1) >= 0
1113 || mpfr_cmp_si (x->value.real, -1) <= 0)
1115 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1117 return &gfc_bad_expr;
1119 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1120 mpfr_atanh (result->value.real, x->value.real, GFC_RND_MODE);
1124 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1125 mpc_atanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1129 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1132 return range_check (result, "ATANH");
1137 gfc_simplify_atan2 (gfc_expr *y, gfc_expr *x)
1141 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1144 if (mpfr_sgn (y->value.real) == 0 && mpfr_sgn (x->value.real) == 0)
1146 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1147 "second argument must not be zero", &x->where);
1148 return &gfc_bad_expr;
1151 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1152 mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE);
1154 return range_check (result, "ATAN2");
1159 gfc_simplify_bessel_j0 (gfc_expr *x)
1163 if (x->expr_type != EXPR_CONSTANT)
1166 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1167 mpfr_j0 (result->value.real, x->value.real, GFC_RND_MODE);
1169 return range_check (result, "BESSEL_J0");
1174 gfc_simplify_bessel_j1 (gfc_expr *x)
1178 if (x->expr_type != EXPR_CONSTANT)
1181 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1182 mpfr_j1 (result->value.real, x->value.real, GFC_RND_MODE);
1184 return range_check (result, "BESSEL_J1");
1189 gfc_simplify_bessel_jn (gfc_expr *order, gfc_expr *x)
1194 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1197 n = mpz_get_si (order->value.integer);
1198 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1199 mpfr_jn (result->value.real, n, x->value.real, GFC_RND_MODE);
1201 return range_check (result, "BESSEL_JN");
1205 /* Simplify transformational form of JN and YN. */
1208 gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x,
1215 mpfr_t x2rev, last1, last2;
1217 if (x->expr_type != EXPR_CONSTANT || order1->expr_type != EXPR_CONSTANT
1218 || order2->expr_type != EXPR_CONSTANT)
1221 n1 = mpz_get_si (order1->value.integer);
1222 n2 = mpz_get_si (order2->value.integer);
1223 result = gfc_get_array_expr (x->ts.type, x->ts.kind, &x->where);
1225 result->shape = gfc_get_shape (1);
1226 mpz_init_set_ui (result->shape[0], MAX (n2-n1+1, 0));
1231 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1232 YN(N, 0.0) = -Inf. */
1234 if (mpfr_cmp_ui (x->value.real, 0.0) == 0)
1236 if (!jn && gfc_option.flag_range_check)
1238 gfc_error ("Result of BESSEL_YN is -INF at %L", &result->where);
1239 gfc_free_expr (result);
1240 return &gfc_bad_expr;
1245 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1246 mpfr_set_ui (e->value.real, 1, GFC_RND_MODE);
1247 gfc_constructor_append_expr (&result->value.constructor, e,
1252 for (i = n1; i <= n2; i++)
1254 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1256 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
1258 mpfr_set_inf (e->value.real, -1);
1259 gfc_constructor_append_expr (&result->value.constructor, e,
1266 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1267 are stable for downward recursion and Neumann functions are stable
1268 for upward recursion. It is
1270 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1271 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1272 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1274 gfc_set_model_kind (x->ts.kind);
1276 /* Get first recursion anchor. */
1280 mpfr_jn (last1, n2, x->value.real, GFC_RND_MODE);
1282 mpfr_yn (last1, n1, x->value.real, GFC_RND_MODE);
1284 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1285 mpfr_set (e->value.real, last1, GFC_RND_MODE);
1286 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1290 gfc_free_expr (result);
1291 return &gfc_bad_expr;
1293 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1301 /* Get second recursion anchor. */
1305 mpfr_jn (last2, n2-1, x->value.real, GFC_RND_MODE);
1307 mpfr_yn (last2, n1+1, x->value.real, GFC_RND_MODE);
1309 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1310 mpfr_set (e->value.real, last2, GFC_RND_MODE);
1311 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1316 gfc_free_expr (result);
1317 return &gfc_bad_expr;
1320 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where, -2);
1322 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1331 /* Start actual recursion. */
1334 mpfr_ui_div (x2rev, 2, x->value.real, GFC_RND_MODE);
1336 for (i = 2; i <= n2-n1; i++)
1338 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1340 /* Special case: For YN, if the previous N gave -INF, set
1341 also N+1 to -INF. */
1342 if (!jn && !gfc_option.flag_range_check && mpfr_inf_p (last2))
1344 mpfr_set_inf (e->value.real, -1);
1345 gfc_constructor_append_expr (&result->value.constructor, e,
1350 mpfr_mul_si (e->value.real, x2rev, jn ? (n2-i+1) : (n1+i-1),
1352 mpfr_mul (e->value.real, e->value.real, last2, GFC_RND_MODE);
1353 mpfr_sub (e->value.real, e->value.real, last1, GFC_RND_MODE);
1355 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1359 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where,
1362 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1364 mpfr_set (last1, last2, GFC_RND_MODE);
1365 mpfr_set (last2, e->value.real, GFC_RND_MODE);
1378 gfc_free_expr (result);
1379 return &gfc_bad_expr;
1384 gfc_simplify_bessel_jn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1386 return gfc_simplify_bessel_n2 (order1, order2, x, true);
1391 gfc_simplify_bessel_y0 (gfc_expr *x)
1395 if (x->expr_type != EXPR_CONSTANT)
1398 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1399 mpfr_y0 (result->value.real, x->value.real, GFC_RND_MODE);
1401 return range_check (result, "BESSEL_Y0");
1406 gfc_simplify_bessel_y1 (gfc_expr *x)
1410 if (x->expr_type != EXPR_CONSTANT)
1413 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1414 mpfr_y1 (result->value.real, x->value.real, GFC_RND_MODE);
1416 return range_check (result, "BESSEL_Y1");
1421 gfc_simplify_bessel_yn (gfc_expr *order, gfc_expr *x)
1426 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1429 n = mpz_get_si (order->value.integer);
1430 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1431 mpfr_yn (result->value.real, n, x->value.real, GFC_RND_MODE);
1433 return range_check (result, "BESSEL_YN");
1438 gfc_simplify_bessel_yn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1440 return gfc_simplify_bessel_n2 (order1, order2, x, false);
1445 gfc_simplify_bit_size (gfc_expr *e)
1447 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1448 return gfc_get_int_expr (e->ts.kind, &e->where,
1449 gfc_integer_kinds[i].bit_size);
1454 gfc_simplify_btest (gfc_expr *e, gfc_expr *bit)
1458 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
1461 if (gfc_extract_int (bit, &b) != NULL || b < 0)
1462 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where, false);
1464 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where,
1465 mpz_tstbit (e->value.integer, b));
1470 compare_bitwise (gfc_expr *i, gfc_expr *j)
1475 gcc_assert (i->ts.type == BT_INTEGER);
1476 gcc_assert (j->ts.type == BT_INTEGER);
1478 mpz_init_set (x, i->value.integer);
1479 k = gfc_validate_kind (i->ts.type, i->ts.kind, false);
1480 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
1482 mpz_init_set (y, j->value.integer);
1483 k = gfc_validate_kind (j->ts.type, j->ts.kind, false);
1484 convert_mpz_to_unsigned (y, gfc_integer_kinds[k].bit_size);
1486 res = mpz_cmp (x, y);
1494 gfc_simplify_bge (gfc_expr *i, gfc_expr *j)
1496 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1499 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1500 compare_bitwise (i, j) >= 0);
1505 gfc_simplify_bgt (gfc_expr *i, gfc_expr *j)
1507 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1510 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1511 compare_bitwise (i, j) > 0);
1516 gfc_simplify_ble (gfc_expr *i, gfc_expr *j)
1518 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1521 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1522 compare_bitwise (i, j) <= 0);
1527 gfc_simplify_blt (gfc_expr *i, gfc_expr *j)
1529 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1532 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1533 compare_bitwise (i, j) < 0);
1538 gfc_simplify_ceiling (gfc_expr *e, gfc_expr *k)
1540 gfc_expr *ceil, *result;
1543 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
1545 return &gfc_bad_expr;
1547 if (e->expr_type != EXPR_CONSTANT)
1550 ceil = gfc_copy_expr (e);
1551 mpfr_ceil (ceil->value.real, e->value.real);
1553 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
1554 gfc_mpfr_to_mpz (result->value.integer, ceil->value.real, &e->where);
1556 gfc_free_expr (ceil);
1558 return range_check (result, "CEILING");
1563 gfc_simplify_char (gfc_expr *e, gfc_expr *k)
1565 return simplify_achar_char (e, k, "CHAR", false);
1569 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1572 simplify_cmplx (const char *name, gfc_expr *x, gfc_expr *y, int kind)
1576 if (convert_boz (x, kind) == &gfc_bad_expr)
1577 return &gfc_bad_expr;
1579 if (convert_boz (y, kind) == &gfc_bad_expr)
1580 return &gfc_bad_expr;
1582 if (x->expr_type != EXPR_CONSTANT
1583 || (y != NULL && y->expr_type != EXPR_CONSTANT))
1586 result = gfc_get_constant_expr (BT_COMPLEX, kind, &x->where);
1591 mpc_set_z (result->value.complex, x->value.integer, GFC_MPC_RND_MODE);
1595 mpc_set_fr (result->value.complex, x->value.real, GFC_RND_MODE);
1599 mpc_set (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1603 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1607 return range_check (result, name);
1612 mpfr_set_z (mpc_imagref (result->value.complex),
1613 y->value.integer, GFC_RND_MODE);
1617 mpfr_set (mpc_imagref (result->value.complex),
1618 y->value.real, GFC_RND_MODE);
1622 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1625 return range_check (result, name);
1630 gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k)
1634 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_complex_kind);
1636 return &gfc_bad_expr;
1638 return simplify_cmplx ("CMPLX", x, y, kind);
1643 gfc_simplify_complex (gfc_expr *x, gfc_expr *y)
1647 if (x->ts.type == BT_INTEGER && y->ts.type == BT_INTEGER)
1648 kind = gfc_default_complex_kind;
1649 else if (x->ts.type == BT_REAL || y->ts.type == BT_INTEGER)
1651 else if (x->ts.type == BT_INTEGER || y->ts.type == BT_REAL)
1653 else if (x->ts.type == BT_REAL && y->ts.type == BT_REAL)
1654 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
1658 return simplify_cmplx ("COMPLEX", x, y, kind);
1663 gfc_simplify_conjg (gfc_expr *e)
1667 if (e->expr_type != EXPR_CONSTANT)
1670 result = gfc_copy_expr (e);
1671 mpc_conj (result->value.complex, result->value.complex, GFC_MPC_RND_MODE);
1673 return range_check (result, "CONJG");
1678 gfc_simplify_cos (gfc_expr *x)
1682 if (x->expr_type != EXPR_CONSTANT)
1685 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1690 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
1694 gfc_set_model_kind (x->ts.kind);
1695 mpc_cos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1699 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1702 return range_check (result, "COS");
1707 gfc_simplify_cosh (gfc_expr *x)
1711 if (x->expr_type != EXPR_CONSTANT)
1714 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1719 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
1723 mpc_cosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1730 return range_check (result, "COSH");
1735 gfc_simplify_count (gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
1739 if (!is_constant_array_expr (mask)
1740 || !gfc_is_constant_expr (dim)
1741 || !gfc_is_constant_expr (kind))
1744 result = transformational_result (mask, dim,
1746 get_kind (BT_INTEGER, kind, "COUNT",
1747 gfc_default_integer_kind),
1750 init_result_expr (result, 0, NULL);
1752 /* Passing MASK twice, once as data array, once as mask.
1753 Whenever gfc_count is called, '1' is added to the result. */
1754 return !dim || mask->rank == 1 ?
1755 simplify_transformation_to_scalar (result, mask, mask, gfc_count) :
1756 simplify_transformation_to_array (result, mask, dim, mask, gfc_count, NULL);
1761 gfc_simplify_dcmplx (gfc_expr *x, gfc_expr *y)
1763 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
1768 gfc_simplify_dble (gfc_expr *e)
1770 gfc_expr *result = NULL;
1772 if (e->expr_type != EXPR_CONSTANT)
1775 if (convert_boz (e, gfc_default_double_kind) == &gfc_bad_expr)
1776 return &gfc_bad_expr;
1778 result = gfc_convert_constant (e, BT_REAL, gfc_default_double_kind);
1779 if (result == &gfc_bad_expr)
1780 return &gfc_bad_expr;
1782 return range_check (result, "DBLE");
1787 gfc_simplify_digits (gfc_expr *x)
1791 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
1796 digits = gfc_integer_kinds[i].digits;
1801 digits = gfc_real_kinds[i].digits;
1808 return gfc_get_int_expr (gfc_default_integer_kind, NULL, digits);
1813 gfc_simplify_dim (gfc_expr *x, gfc_expr *y)
1818 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1821 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
1822 result = gfc_get_constant_expr (x->ts.type, kind, &x->where);
1827 if (mpz_cmp (x->value.integer, y->value.integer) > 0)
1828 mpz_sub (result->value.integer, x->value.integer, y->value.integer);
1830 mpz_set_ui (result->value.integer, 0);
1835 if (mpfr_cmp (x->value.real, y->value.real) > 0)
1836 mpfr_sub (result->value.real, x->value.real, y->value.real,
1839 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
1844 gfc_internal_error ("gfc_simplify_dim(): Bad type");
1847 return range_check (result, "DIM");
1852 gfc_simplify_dot_product (gfc_expr *vector_a, gfc_expr *vector_b)
1854 if (!is_constant_array_expr (vector_a)
1855 || !is_constant_array_expr (vector_b))
1858 gcc_assert (vector_a->rank == 1);
1859 gcc_assert (vector_b->rank == 1);
1860 gcc_assert (gfc_compare_types (&vector_a->ts, &vector_b->ts));
1862 return compute_dot_product (vector_a, 1, 0, vector_b, 1, 0);
1867 gfc_simplify_dprod (gfc_expr *x, gfc_expr *y)
1869 gfc_expr *a1, *a2, *result;
1871 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1874 a1 = gfc_real2real (x, gfc_default_double_kind);
1875 a2 = gfc_real2real (y, gfc_default_double_kind);
1877 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &x->where);
1878 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
1883 return range_check (result, "DPROD");
1888 simplify_dshift (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg,
1892 int i, k, size, shift;
1894 if (arg1->expr_type != EXPR_CONSTANT || arg2->expr_type != EXPR_CONSTANT
1895 || shiftarg->expr_type != EXPR_CONSTANT)
1898 k = gfc_validate_kind (BT_INTEGER, arg1->ts.kind, false);
1899 size = gfc_integer_kinds[k].bit_size;
1901 if (gfc_extract_int (shiftarg, &shift) != NULL)
1903 gfc_error ("Invalid SHIFT argument of DSHIFTL at %L", &shiftarg->where);
1904 return &gfc_bad_expr;
1907 gcc_assert (shift >= 0 && shift <= size);
1909 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */
1911 shift = size - shift;
1913 result = gfc_get_constant_expr (BT_INTEGER, arg1->ts.kind, &arg1->where);
1914 mpz_set_ui (result->value.integer, 0);
1916 for (i = 0; i < shift; i++)
1917 if (mpz_tstbit (arg2->value.integer, size - shift + i))
1918 mpz_setbit (result->value.integer, i);
1920 for (i = 0; i < size - shift; i++)
1921 if (mpz_tstbit (arg1->value.integer, i))
1922 mpz_setbit (result->value.integer, shift + i);
1924 /* Convert to a signed value. */
1925 convert_mpz_to_signed (result->value.integer, size);
1932 gfc_simplify_dshiftr (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg)
1934 return simplify_dshift (arg1, arg2, shiftarg, true);
1939 gfc_simplify_dshiftl (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg)
1941 return simplify_dshift (arg1, arg2, shiftarg, false);
1946 gfc_simplify_erf (gfc_expr *x)
1950 if (x->expr_type != EXPR_CONSTANT)
1953 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1954 mpfr_erf (result->value.real, x->value.real, GFC_RND_MODE);
1956 return range_check (result, "ERF");
1961 gfc_simplify_erfc (gfc_expr *x)
1965 if (x->expr_type != EXPR_CONSTANT)
1968 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1969 mpfr_erfc (result->value.real, x->value.real, GFC_RND_MODE);
1971 return range_check (result, "ERFC");
1975 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
1977 #define MAX_ITER 200
1978 #define ARG_LIMIT 12
1980 /* Calculate ERFC_SCALED directly by its definition:
1982 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
1984 using a large precision for intermediate results. This is used for all
1985 but large values of the argument. */
1987 fullprec_erfc_scaled (mpfr_t res, mpfr_t arg)
1992 prec = mpfr_get_default_prec ();
1993 mpfr_set_default_prec (10 * prec);
1998 mpfr_set (a, arg, GFC_RND_MODE);
1999 mpfr_sqr (b, a, GFC_RND_MODE);
2000 mpfr_exp (b, b, GFC_RND_MODE);
2001 mpfr_erfc (a, a, GFC_RND_MODE);
2002 mpfr_mul (a, a, b, GFC_RND_MODE);
2004 mpfr_set (res, a, GFC_RND_MODE);
2005 mpfr_set_default_prec (prec);
2011 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
2013 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
2014 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
2017 This is used for large values of the argument. Intermediate calculations
2018 are performed with twice the precision. We don't do a fixed number of
2019 iterations of the sum, but stop when it has converged to the required
2022 asympt_erfc_scaled (mpfr_t res, mpfr_t arg)
2024 mpfr_t sum, x, u, v, w, oldsum, sumtrunc;
2029 prec = mpfr_get_default_prec ();
2030 mpfr_set_default_prec (2 * prec);
2040 mpfr_init (sumtrunc);
2041 mpfr_set_prec (oldsum, prec);
2042 mpfr_set_prec (sumtrunc, prec);
2044 mpfr_set (x, arg, GFC_RND_MODE);
2045 mpfr_set_ui (sum, 1, GFC_RND_MODE);
2046 mpz_set_ui (num, 1);
2048 mpfr_set (u, x, GFC_RND_MODE);
2049 mpfr_sqr (u, u, GFC_RND_MODE);
2050 mpfr_mul_ui (u, u, 2, GFC_RND_MODE);
2051 mpfr_pow_si (u, u, -1, GFC_RND_MODE);
2053 for (i = 1; i < MAX_ITER; i++)
2055 mpfr_set (oldsum, sum, GFC_RND_MODE);
2057 mpz_mul_ui (num, num, 2 * i - 1);
2060 mpfr_set (w, u, GFC_RND_MODE);
2061 mpfr_pow_ui (w, w, i, GFC_RND_MODE);
2063 mpfr_set_z (v, num, GFC_RND_MODE);
2064 mpfr_mul (v, v, w, GFC_RND_MODE);
2066 mpfr_add (sum, sum, v, GFC_RND_MODE);
2068 mpfr_set (sumtrunc, sum, GFC_RND_MODE);
2069 if (mpfr_cmp (sumtrunc, oldsum) == 0)
2073 /* We should have converged by now; otherwise, ARG_LIMIT is probably
2075 gcc_assert (i < MAX_ITER);
2077 /* Divide by x * sqrt(Pi). */
2078 mpfr_const_pi (u, GFC_RND_MODE);
2079 mpfr_sqrt (u, u, GFC_RND_MODE);
2080 mpfr_mul (u, u, x, GFC_RND_MODE);
2081 mpfr_div (sum, sum, u, GFC_RND_MODE);
2083 mpfr_set (res, sum, GFC_RND_MODE);
2084 mpfr_set_default_prec (prec);
2086 mpfr_clears (sum, x, u, v, w, oldsum, sumtrunc, NULL);
2092 gfc_simplify_erfc_scaled (gfc_expr *x)
2096 if (x->expr_type != EXPR_CONSTANT)
2099 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2100 if (mpfr_cmp_d (x->value.real, ARG_LIMIT) >= 0)
2101 asympt_erfc_scaled (result->value.real, x->value.real);
2103 fullprec_erfc_scaled (result->value.real, x->value.real);
2105 return range_check (result, "ERFC_SCALED");
2113 gfc_simplify_epsilon (gfc_expr *e)
2118 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2120 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
2121 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
2123 return range_check (result, "EPSILON");
2128 gfc_simplify_exp (gfc_expr *x)
2132 if (x->expr_type != EXPR_CONSTANT)
2135 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2140 mpfr_exp (result->value.real, x->value.real, GFC_RND_MODE);
2144 gfc_set_model_kind (x->ts.kind);
2145 mpc_exp (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
2149 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2152 return range_check (result, "EXP");
2157 gfc_simplify_exponent (gfc_expr *x)
2162 if (x->expr_type != EXPR_CONSTANT)
2165 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2168 gfc_set_model (x->value.real);
2170 if (mpfr_sgn (x->value.real) == 0)
2172 mpz_set_ui (result->value.integer, 0);
2176 i = (int) mpfr_get_exp (x->value.real);
2177 mpz_set_si (result->value.integer, i);
2179 return range_check (result, "EXPONENT");
2184 gfc_simplify_float (gfc_expr *a)
2188 if (a->expr_type != EXPR_CONSTANT)
2193 if (convert_boz (a, gfc_default_real_kind) == &gfc_bad_expr)
2194 return &gfc_bad_expr;
2196 result = gfc_copy_expr (a);
2199 result = gfc_int2real (a, gfc_default_real_kind);
2201 return range_check (result, "FLOAT");
2206 is_last_ref_vtab (gfc_expr *e)
2209 gfc_component *comp = NULL;
2211 if (e->expr_type != EXPR_VARIABLE)
2214 for (ref = e->ref; ref; ref = ref->next)
2215 if (ref->type == REF_COMPONENT)
2216 comp = ref->u.c.component;
2218 if (!e->ref || !comp)
2219 return e->symtree->n.sym->attr.vtab;
2221 if (comp->name[0] == '_' && strcmp (comp->name, "_vptr") == 0)
2229 gfc_simplify_extends_type_of (gfc_expr *a, gfc_expr *mold)
2231 /* Avoid simplification of resolved symbols. */
2232 if (is_last_ref_vtab (a) || is_last_ref_vtab (mold))
2235 if (a->ts.type == BT_DERIVED && mold->ts.type == BT_DERIVED)
2236 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
2237 gfc_type_is_extension_of (mold->ts.u.derived,
2239 /* Return .false. if the dynamic type can never be the same. */
2240 if ((a->ts.type == BT_CLASS && mold->ts.type == BT_CLASS
2241 && !gfc_type_is_extension_of
2242 (mold->ts.u.derived->components->ts.u.derived,
2243 a->ts.u.derived->components->ts.u.derived)
2244 && !gfc_type_is_extension_of
2245 (a->ts.u.derived->components->ts.u.derived,
2246 mold->ts.u.derived->components->ts.u.derived))
2247 || (a->ts.type == BT_DERIVED && mold->ts.type == BT_CLASS
2248 && !gfc_type_is_extension_of
2250 mold->ts.u.derived->components->ts.u.derived)
2251 && !gfc_type_is_extension_of
2252 (mold->ts.u.derived->components->ts.u.derived,
2254 || (a->ts.type == BT_CLASS && mold->ts.type == BT_DERIVED
2255 && !gfc_type_is_extension_of
2256 (mold->ts.u.derived,
2257 a->ts.u.derived->components->ts.u.derived)))
2258 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false);
2260 if (mold->ts.type == BT_DERIVED
2261 && gfc_type_is_extension_of (mold->ts.u.derived,
2262 a->ts.u.derived->components->ts.u.derived))
2263 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, true);
2270 gfc_simplify_same_type_as (gfc_expr *a, gfc_expr *b)
2272 /* Avoid simplification of resolved symbols. */
2273 if (is_last_ref_vtab (a) || is_last_ref_vtab (b))
2276 /* Return .false. if the dynamic type can never be the
2278 if ((a->ts.type == BT_CLASS || b->ts.type == BT_CLASS)
2279 && !gfc_type_compatible (&a->ts, &b->ts)
2280 && !gfc_type_compatible (&b->ts, &a->ts))
2281 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false);
2283 if (a->ts.type != BT_DERIVED || b->ts.type != BT_DERIVED)
2286 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
2287 gfc_compare_derived_types (a->ts.u.derived,
2293 gfc_simplify_floor (gfc_expr *e, gfc_expr *k)
2299 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
2301 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
2303 if (e->expr_type != EXPR_CONSTANT)
2306 gfc_set_model_kind (kind);
2309 mpfr_floor (floor, e->value.real);
2311 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
2312 gfc_mpfr_to_mpz (result->value.integer, floor, &e->where);
2316 return range_check (result, "FLOOR");
2321 gfc_simplify_fraction (gfc_expr *x)
2324 mpfr_t absv, exp, pow2;
2326 if (x->expr_type != EXPR_CONSTANT)
2329 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
2331 if (mpfr_sgn (x->value.real) == 0)
2333 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2337 gfc_set_model_kind (x->ts.kind);
2342 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
2343 mpfr_log2 (exp, absv, GFC_RND_MODE);
2345 mpfr_trunc (exp, exp);
2346 mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
2348 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
2350 mpfr_div (result->value.real, absv, pow2, GFC_RND_MODE);
2352 mpfr_clears (exp, absv, pow2, NULL);
2354 return range_check (result, "FRACTION");
2359 gfc_simplify_gamma (gfc_expr *x)
2363 if (x->expr_type != EXPR_CONSTANT)
2366 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2367 mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE);
2369 return range_check (result, "GAMMA");
2374 gfc_simplify_huge (gfc_expr *e)
2379 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2380 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
2385 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
2389 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
2401 gfc_simplify_hypot (gfc_expr *x, gfc_expr *y)
2405 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2408 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2409 mpfr_hypot (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
2410 return range_check (result, "HYPOT");
2414 /* We use the processor's collating sequence, because all
2415 systems that gfortran currently works on are ASCII. */
2418 gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
2424 if (e->expr_type != EXPR_CONSTANT)
2427 if (e->value.character.length != 1)
2429 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
2430 return &gfc_bad_expr;
2433 index = e->value.character.string[0];
2435 if (gfc_option.warn_surprising && index > 127)
2436 gfc_warning ("Argument of IACHAR function at %L outside of range 0..127",
2439 k = get_kind (BT_INTEGER, kind, "IACHAR", gfc_default_integer_kind);
2441 return &gfc_bad_expr;
2443 result = gfc_get_int_expr (k, &e->where, index);
2445 return range_check (result, "IACHAR");
2450 do_bit_and (gfc_expr *result, gfc_expr *e)
2452 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
2453 gcc_assert (result->ts.type == BT_INTEGER
2454 && result->expr_type == EXPR_CONSTANT);
2456 mpz_and (result->value.integer, result->value.integer, e->value.integer);
2462 gfc_simplify_iall (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2464 return simplify_transformation (array, dim, mask, -1, do_bit_and);
2469 do_bit_ior (gfc_expr *result, gfc_expr *e)
2471 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
2472 gcc_assert (result->ts.type == BT_INTEGER
2473 && result->expr_type == EXPR_CONSTANT);
2475 mpz_ior (result->value.integer, result->value.integer, e->value.integer);
2481 gfc_simplify_iany (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2483 return simplify_transformation (array, dim, mask, 0, do_bit_ior);
2488 gfc_simplify_iand (gfc_expr *x, gfc_expr *y)
2492 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2495 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2496 mpz_and (result->value.integer, x->value.integer, y->value.integer);
2498 return range_check (result, "IAND");
2503 gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y)
2508 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2511 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
2513 gfc_error ("Invalid second argument of IBCLR at %L", &y->where);
2514 return &gfc_bad_expr;
2517 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2519 if (pos >= gfc_integer_kinds[k].bit_size)
2521 gfc_error ("Second argument of IBCLR exceeds bit size at %L",
2523 return &gfc_bad_expr;
2526 result = gfc_copy_expr (x);
2528 convert_mpz_to_unsigned (result->value.integer,
2529 gfc_integer_kinds[k].bit_size);
2531 mpz_clrbit (result->value.integer, pos);
2533 convert_mpz_to_signed (result->value.integer,
2534 gfc_integer_kinds[k].bit_size);
2541 gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z)
2548 if (x->expr_type != EXPR_CONSTANT
2549 || y->expr_type != EXPR_CONSTANT
2550 || z->expr_type != EXPR_CONSTANT)
2553 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
2555 gfc_error ("Invalid second argument of IBITS at %L", &y->where);
2556 return &gfc_bad_expr;
2559 if (gfc_extract_int (z, &len) != NULL || len < 0)
2561 gfc_error ("Invalid third argument of IBITS at %L", &z->where);
2562 return &gfc_bad_expr;
2565 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
2567 bitsize = gfc_integer_kinds[k].bit_size;
2569 if (pos + len > bitsize)
2571 gfc_error ("Sum of second and third arguments of IBITS exceeds "
2572 "bit size at %L", &y->where);
2573 return &gfc_bad_expr;
2576 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2577 convert_mpz_to_unsigned (result->value.integer,
2578 gfc_integer_kinds[k].bit_size);
2580 bits = XCNEWVEC (int, bitsize);
2582 for (i = 0; i < bitsize; i++)
2585 for (i = 0; i < len; i++)
2586 bits[i] = mpz_tstbit (x->value.integer, i + pos);
2588 for (i = 0; i < bitsize; i++)
2591 mpz_clrbit (result->value.integer, i);
2592 else if (bits[i] == 1)
2593 mpz_setbit (result->value.integer, i);
2595 gfc_internal_error ("IBITS: Bad bit");
2600 convert_mpz_to_signed (result->value.integer,
2601 gfc_integer_kinds[k].bit_size);
2608 gfc_simplify_ibset (gfc_expr *x, gfc_expr *y)
2613 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2616 if (gfc_extract_int (y, &pos) != NULL || pos < 0)
2618 gfc_error ("Invalid second argument of IBSET at %L", &y->where);
2619 return &gfc_bad_expr;
2622 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2624 if (pos >= gfc_integer_kinds[k].bit_size)
2626 gfc_error ("Second argument of IBSET exceeds bit size at %L",
2628 return &gfc_bad_expr;
2631 result = gfc_copy_expr (x);
2633 convert_mpz_to_unsigned (result->value.integer,
2634 gfc_integer_kinds[k].bit_size);
2636 mpz_setbit (result->value.integer, pos);
2638 convert_mpz_to_signed (result->value.integer,
2639 gfc_integer_kinds[k].bit_size);
2646 gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
2652 if (e->expr_type != EXPR_CONSTANT)
2655 if (e->value.character.length != 1)
2657 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
2658 return &gfc_bad_expr;
2661 index = e->value.character.string[0];
2663 k = get_kind (BT_INTEGER, kind, "ICHAR", gfc_default_integer_kind);
2665 return &gfc_bad_expr;
2667 result = gfc_get_int_expr (k, &e->where, index);
2669 return range_check (result, "ICHAR");
2674 gfc_simplify_ieor (gfc_expr *x, gfc_expr *y)
2678 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2681 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2682 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
2684 return range_check (result, "IEOR");
2689 gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind)
2692 int back, len, lensub;
2693 int i, j, k, count, index = 0, start;
2695 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT
2696 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
2699 if (b != NULL && b->value.logical != 0)
2704 k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind);
2706 return &gfc_bad_expr;
2708 result = gfc_get_constant_expr (BT_INTEGER, k, &x->where);
2710 len = x->value.character.length;
2711 lensub = y->value.character.length;
2715 mpz_set_si (result->value.integer, 0);
2723 mpz_set_si (result->value.integer, 1);
2726 else if (lensub == 1)
2728 for (i = 0; i < len; i++)
2730 for (j = 0; j < lensub; j++)
2732 if (y->value.character.string[j]
2733 == x->value.character.string[i])
2743 for (i = 0; i < len; i++)
2745 for (j = 0; j < lensub; j++)
2747 if (y->value.character.string[j]
2748 == x->value.character.string[i])
2753 for (k = 0; k < lensub; k++)
2755 if (y->value.character.string[k]
2756 == x->value.character.string[k + start])
2760 if (count == lensub)
2775 mpz_set_si (result->value.integer, len + 1);
2778 else if (lensub == 1)
2780 for (i = 0; i < len; i++)
2782 for (j = 0; j < lensub; j++)
2784 if (y->value.character.string[j]
2785 == x->value.character.string[len - i])
2787 index = len - i + 1;
2795 for (i = 0; i < len; i++)
2797 for (j = 0; j < lensub; j++)
2799 if (y->value.character.string[j]
2800 == x->value.character.string[len - i])
2803 if (start <= len - lensub)
2806 for (k = 0; k < lensub; k++)
2807 if (y->value.character.string[k]
2808 == x->value.character.string[k + start])
2811 if (count == lensub)
2828 mpz_set_si (result->value.integer, index);
2829 return range_check (result, "INDEX");
2834 simplify_intconv (gfc_expr *e, int kind, const char *name)
2836 gfc_expr *result = NULL;
2838 if (e->expr_type != EXPR_CONSTANT)
2841 result = gfc_convert_constant (e, BT_INTEGER, kind);
2842 if (result == &gfc_bad_expr)
2843 return &gfc_bad_expr;
2845 return range_check (result, name);
2850 gfc_simplify_int (gfc_expr *e, gfc_expr *k)
2854 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
2856 return &gfc_bad_expr;
2858 return simplify_intconv (e, kind, "INT");
2862 gfc_simplify_int2 (gfc_expr *e)
2864 return simplify_intconv (e, 2, "INT2");
2869 gfc_simplify_int8 (gfc_expr *e)
2871 return simplify_intconv (e, 8, "INT8");
2876 gfc_simplify_long (gfc_expr *e)
2878 return simplify_intconv (e, 4, "LONG");
2883 gfc_simplify_ifix (gfc_expr *e)
2885 gfc_expr *rtrunc, *result;
2887 if (e->expr_type != EXPR_CONSTANT)
2890 rtrunc = gfc_copy_expr (e);
2891 mpfr_trunc (rtrunc->value.real, e->value.real);
2893 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2895 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
2897 gfc_free_expr (rtrunc);
2899 return range_check (result, "IFIX");
2904 gfc_simplify_idint (gfc_expr *e)
2906 gfc_expr *rtrunc, *result;
2908 if (e->expr_type != EXPR_CONSTANT)
2911 rtrunc = gfc_copy_expr (e);
2912 mpfr_trunc (rtrunc->value.real, e->value.real);
2914 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2916 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
2918 gfc_free_expr (rtrunc);
2920 return range_check (result, "IDINT");
2925 gfc_simplify_ior (gfc_expr *x, gfc_expr *y)
2929 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2932 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2933 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
2935 return range_check (result, "IOR");
2940 do_bit_xor (gfc_expr *result, gfc_expr *e)
2942 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
2943 gcc_assert (result->ts.type == BT_INTEGER
2944 && result->expr_type == EXPR_CONSTANT);
2946 mpz_xor (result->value.integer, result->value.integer, e->value.integer);
2952 gfc_simplify_iparity (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2954 return simplify_transformation (array, dim, mask, 0, do_bit_xor);
2960 gfc_simplify_is_iostat_end (gfc_expr *x)
2962 if (x->expr_type != EXPR_CONSTANT)
2965 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2966 mpz_cmp_si (x->value.integer,
2967 LIBERROR_END) == 0);
2972 gfc_simplify_is_iostat_eor (gfc_expr *x)
2974 if (x->expr_type != EXPR_CONSTANT)
2977 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2978 mpz_cmp_si (x->value.integer,
2979 LIBERROR_EOR) == 0);
2984 gfc_simplify_isnan (gfc_expr *x)
2986 if (x->expr_type != EXPR_CONSTANT)
2989 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
2990 mpfr_nan_p (x->value.real));
2994 /* Performs a shift on its first argument. Depending on the last
2995 argument, the shift can be arithmetic, i.e. with filling from the
2996 left like in the SHIFTA intrinsic. */
2998 simplify_shift (gfc_expr *e, gfc_expr *s, const char *name,
2999 bool arithmetic, int direction)
3002 int ashift, *bits, i, k, bitsize, shift;
3004 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3006 if (gfc_extract_int (s, &shift) != NULL)
3008 gfc_error ("Invalid second argument of %s at %L", name, &s->where);
3009 return &gfc_bad_expr;
3012 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
3013 bitsize = gfc_integer_kinds[k].bit_size;
3015 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
3019 mpz_set (result->value.integer, e->value.integer);
3023 if (direction > 0 && shift < 0)
3025 /* Left shift, as in SHIFTL. */
3026 gfc_error ("Second argument of %s is negative at %L", name, &e->where);
3027 return &gfc_bad_expr;
3029 else if (direction < 0)
3031 /* Right shift, as in SHIFTR or SHIFTA. */
3034 gfc_error ("Second argument of %s is negative at %L",
3036 return &gfc_bad_expr;
3042 ashift = (shift >= 0 ? shift : -shift);
3044 if (ashift > bitsize)
3046 gfc_error ("Magnitude of second argument of %s exceeds bit size "
3047 "at %L", name, &e->where);
3048 return &gfc_bad_expr;
3051 bits = XCNEWVEC (int, bitsize);
3053 for (i = 0; i < bitsize; i++)
3054 bits[i] = mpz_tstbit (e->value.integer, i);
3059 for (i = 0; i < shift; i++)
3060 mpz_clrbit (result->value.integer, i);
3062 for (i = 0; i < bitsize - shift; i++)
3065 mpz_clrbit (result->value.integer, i + shift);
3067 mpz_setbit (result->value.integer, i + shift);
3073 if (arithmetic && bits[bitsize - 1])
3074 for (i = bitsize - 1; i >= bitsize - ashift; i--)
3075 mpz_setbit (result->value.integer, i);
3077 for (i = bitsize - 1; i >= bitsize - ashift; i--)
3078 mpz_clrbit (result->value.integer, i);
3080 for (i = bitsize - 1; i >= ashift; i--)
3083 mpz_clrbit (result->value.integer, i - ashift);
3085 mpz_setbit (result->value.integer, i - ashift);
3089 convert_mpz_to_signed (result->value.integer, bitsize);
3097 gfc_simplify_ishft (gfc_expr *e, gfc_expr *s)
3099 return simplify_shift (e, s, "ISHFT", false, 0);
3104 gfc_simplify_lshift (gfc_expr *e, gfc_expr *s)
3106 return simplify_shift (e, s, "LSHIFT", false, 1);
3111 gfc_simplify_rshift (gfc_expr *e, gfc_expr *s)
3113 return simplify_shift (e, s, "RSHIFT", true, -1);
3118 gfc_simplify_shifta (gfc_expr *e, gfc_expr *s)
3120 return simplify_shift (e, s, "SHIFTA", true, -1);
3125 gfc_simplify_shiftl (gfc_expr *e, gfc_expr *s)
3127 return simplify_shift (e, s, "SHIFTL", false, 1);
3132 gfc_simplify_shiftr (gfc_expr *e, gfc_expr *s)
3134 return simplify_shift (e, s, "SHIFTR", false, -1);
3139 gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
3142 int shift, ashift, isize, ssize, delta, k;
3145 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3148 if (gfc_extract_int (s, &shift) != NULL)
3150 gfc_error ("Invalid second argument of ISHFTC at %L", &s->where);
3151 return &gfc_bad_expr;
3154 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3155 isize = gfc_integer_kinds[k].bit_size;
3159 if (sz->expr_type != EXPR_CONSTANT)
3162 if (gfc_extract_int (sz, &ssize) != NULL || ssize <= 0)
3164 gfc_error ("Invalid third argument of ISHFTC at %L", &sz->where);
3165 return &gfc_bad_expr;
3170 gfc_error ("Magnitude of third argument of ISHFTC exceeds "
3171 "BIT_SIZE of first argument at %L", &s->where);
3172 return &gfc_bad_expr;
3186 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3187 "third argument at %L", &s->where);
3189 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3190 "BIT_SIZE of first argument at %L", &s->where);
3191 return &gfc_bad_expr;
3194 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
3196 mpz_set (result->value.integer, e->value.integer);
3201 convert_mpz_to_unsigned (result->value.integer, isize);
3203 bits = XCNEWVEC (int, ssize);
3205 for (i = 0; i < ssize; i++)
3206 bits[i] = mpz_tstbit (e->value.integer, i);
3208 delta = ssize - ashift;
3212 for (i = 0; i < delta; i++)
3215 mpz_clrbit (result->value.integer, i + shift);
3217 mpz_setbit (result->value.integer, i + shift);
3220 for (i = delta; i < ssize; i++)
3223 mpz_clrbit (result->value.integer, i - delta);
3225 mpz_setbit (result->value.integer, i - delta);
3230 for (i = 0; i < ashift; i++)
3233 mpz_clrbit (result->value.integer, i + delta);
3235 mpz_setbit (result->value.integer, i + delta);
3238 for (i = ashift; i < ssize; i++)
3241 mpz_clrbit (result->value.integer, i + shift);
3243 mpz_setbit (result->value.integer, i + shift);
3247 convert_mpz_to_signed (result->value.integer, isize);
3255 gfc_simplify_kind (gfc_expr *e)
3257 return gfc_get_int_expr (gfc_default_integer_kind, NULL, e->ts.kind);
3262 simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper,
3263 gfc_array_spec *as, gfc_ref *ref, bool coarray)
3265 gfc_expr *l, *u, *result;
3268 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
3269 gfc_default_integer_kind);
3271 return &gfc_bad_expr;
3273 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
3275 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
3276 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
3277 if (!coarray && array->expr_type != EXPR_VARIABLE)
3281 gfc_expr* dim = result;
3282 mpz_set_si (dim->value.integer, d);
3284 result = gfc_simplify_size (array, dim, kind);
3285 gfc_free_expr (dim);
3290 mpz_set_si (result->value.integer, 1);
3295 /* Otherwise, we have a variable expression. */
3296 gcc_assert (array->expr_type == EXPR_VARIABLE);
3299 /* The last dimension of an assumed-size array is special. */
3300 if ((!coarray && d == as->rank && as->type == AS_ASSUMED_SIZE && !upper)
3301 || (coarray && d == as->rank + as->corank
3302 && (!upper || gfc_option.coarray == GFC_FCOARRAY_SINGLE)))
3304 if (as->lower[d-1]->expr_type == EXPR_CONSTANT)
3306 gfc_free_expr (result);
3307 return gfc_copy_expr (as->lower[d-1]);
3313 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
3315 /* Then, we need to know the extent of the given dimension. */
3316 if (coarray || ref->u.ar.type == AR_FULL)
3321 if (l->expr_type != EXPR_CONSTANT || u == NULL
3322 || u->expr_type != EXPR_CONSTANT)
3325 if (mpz_cmp (l->value.integer, u->value.integer) > 0)
3329 mpz_set_si (result->value.integer, 0);
3331 mpz_set_si (result->value.integer, 1);
3335 /* Nonzero extent. */
3337 mpz_set (result->value.integer, u->value.integer);
3339 mpz_set (result->value.integer, l->value.integer);
3346 if (gfc_ref_dimen_size (&ref->u.ar, d-1, &result->value.integer, NULL)
3351 mpz_set_si (result->value.integer, (long int) 1);
3355 return range_check (result, upper ? "UBOUND" : "LBOUND");
3358 gfc_free_expr (result);
3364 simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3370 if (array->expr_type != EXPR_VARIABLE)
3377 /* Follow any component references. */
3378 as = array->symtree->n.sym->as;
3379 for (ref = array->ref; ref; ref = ref->next)
3384 switch (ref->u.ar.type)
3391 /* We're done because 'as' has already been set in the
3392 previous iteration. */
3409 as = ref->u.c.component->as;
3421 if (as && (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE))
3426 /* Multi-dimensional bounds. */
3427 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3431 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
3432 if (upper && as && as->type == AS_ASSUMED_SIZE)
3434 /* An error message will be emitted in
3435 check_assumed_size_reference (resolve.c). */
3436 return &gfc_bad_expr;
3439 /* Simplify the bounds for each dimension. */
3440 for (d = 0; d < array->rank; d++)
3442 bounds[d] = simplify_bound_dim (array, kind, d + 1, upper, as, ref,
3444 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3448 for (j = 0; j < d; j++)
3449 gfc_free_expr (bounds[j]);
3454 /* Allocate the result expression. */
3455 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
3456 gfc_default_integer_kind);
3458 return &gfc_bad_expr;
3460 e = gfc_get_array_expr (BT_INTEGER, k, &array->where);
3462 /* The result is a rank 1 array; its size is the rank of the first
3463 argument to {L,U}BOUND. */
3465 e->shape = gfc_get_shape (1);
3466 mpz_init_set_ui (e->shape[0], array->rank);
3468 /* Create the constructor for this array. */
3469 for (d = 0; d < array->rank; d++)
3470 gfc_constructor_append_expr (&e->value.constructor,
3471 bounds[d], &e->where);
3477 /* A DIM argument is specified. */
3478 if (dim->expr_type != EXPR_CONSTANT)
3481 d = mpz_get_si (dim->value.integer);
3483 if (d < 1 || d > array->rank
3484 || (d == array->rank && as && as->type == AS_ASSUMED_SIZE && upper))
3486 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3487 return &gfc_bad_expr;
3490 return simplify_bound_dim (array, kind, d, upper, as, ref, false);
3496 simplify_cobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3502 if (array->expr_type != EXPR_VARIABLE)
3505 /* Follow any component references. */
3506 as = array->symtree->n.sym->as;
3507 for (ref = array->ref; ref; ref = ref->next)
3512 switch (ref->u.ar.type)
3515 if (ref->next == NULL)
3517 gcc_assert (ref->u.ar.as->corank > 0
3518 && ref->u.ar.as->rank == 0);
3526 /* We're done because 'as' has already been set in the
3527 previous iteration. */
3544 as = ref->u.c.component->as;
3556 if (as->type == AS_DEFERRED || as->type == AS_ASSUMED_SHAPE)
3561 /* Multi-dimensional cobounds. */
3562 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3566 /* Simplify the cobounds for each dimension. */
3567 for (d = 0; d < as->corank; d++)
3569 bounds[d] = simplify_bound_dim (array, kind, d + 1 + array->rank,
3570 upper, as, ref, true);
3571 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3575 for (j = 0; j < d; j++)
3576 gfc_free_expr (bounds[j]);
3581 /* Allocate the result expression. */
3582 e = gfc_get_expr ();
3583 e->where = array->where;
3584 e->expr_type = EXPR_ARRAY;
3585 e->ts.type = BT_INTEGER;
3586 k = get_kind (BT_INTEGER, kind, upper ? "UCOBOUND" : "LCOBOUND",
3587 gfc_default_integer_kind);
3591 return &gfc_bad_expr;
3595 /* The result is a rank 1 array; its size is the rank of the first
3596 argument to {L,U}COBOUND. */
3598 e->shape = gfc_get_shape (1);
3599 mpz_init_set_ui (e->shape[0], as->corank);
3601 /* Create the constructor for this array. */
3602 for (d = 0; d < as->corank; d++)
3603 gfc_constructor_append_expr (&e->value.constructor,
3604 bounds[d], &e->where);
3609 /* A DIM argument is specified. */
3610 if (dim->expr_type != EXPR_CONSTANT)
3613 d = mpz_get_si (dim->value.integer);
3615 if (d < 1 || d > as->corank)
3617 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3618 return &gfc_bad_expr;
3621 return simplify_bound_dim (array, kind, d+array->rank, upper, as, ref, true);
3627 gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3629 return simplify_bound (array, dim, kind, 0);
3634 gfc_simplify_lcobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3636 return simplify_cobound (array, dim, kind, 0);
3640 gfc_simplify_leadz (gfc_expr *e)
3642 unsigned long lz, bs;
3645 if (e->expr_type != EXPR_CONSTANT)
3648 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3649 bs = gfc_integer_kinds[i].bit_size;
3650 if (mpz_cmp_si (e->value.integer, 0) == 0)
3652 else if (mpz_cmp_si (e->value.integer, 0) < 0)
3655 lz = bs - mpz_sizeinbase (e->value.integer, 2);
3657 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, lz);
3662 gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
3665 int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind);
3668 return &gfc_bad_expr;
3670 if (e->expr_type == EXPR_CONSTANT)
3672 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3673 mpz_set_si (result->value.integer, e->value.character.length);
3674 return range_check (result, "LEN");
3676 else if (e->ts.u.cl != NULL && e->ts.u.cl->length != NULL
3677 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT
3678 && e->ts.u.cl->length->ts.type == BT_INTEGER)
3680 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3681 mpz_set (result->value.integer, e->ts.u.cl->length->value.integer);
3682 return range_check (result, "LEN");
3690 gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
3694 int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind);
3697 return &gfc_bad_expr;
3699 if (e->expr_type != EXPR_CONSTANT)
3702 len = e->value.character.length;
3703 for (count = 0, i = 1; i <= len; i++)
3704 if (e->value.character.string[len - i] == ' ')
3709 result = gfc_get_int_expr (k, &e->where, len - count);
3710 return range_check (result, "LEN_TRIM");
3714 gfc_simplify_lgamma (gfc_expr *x)
3719 if (x->expr_type != EXPR_CONSTANT)
3722 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3723 mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE);
3725 return range_check (result, "LGAMMA");
3730 gfc_simplify_lge (gfc_expr *a, gfc_expr *b)
3732 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3735 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3736 gfc_compare_string (a, b) >= 0);
3741 gfc_simplify_lgt (gfc_expr *a, gfc_expr *b)
3743 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3746 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3747 gfc_compare_string (a, b) > 0);
3752 gfc_simplify_lle (gfc_expr *a, gfc_expr *b)
3754 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3757 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3758 gfc_compare_string (a, b) <= 0);
3763 gfc_simplify_llt (gfc_expr *a, gfc_expr *b)
3765 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
3768 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
3769 gfc_compare_string (a, b) < 0);
3774 gfc_simplify_log (gfc_expr *x)
3778 if (x->expr_type != EXPR_CONSTANT)
3781 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3786 if (mpfr_sgn (x->value.real) <= 0)
3788 gfc_error ("Argument of LOG at %L cannot be less than or equal "
3789 "to zero", &x->where);
3790 gfc_free_expr (result);
3791 return &gfc_bad_expr;
3794 mpfr_log (result->value.real, x->value.real, GFC_RND_MODE);
3798 if ((mpfr_sgn (mpc_realref (x->value.complex)) == 0)
3799 && (mpfr_sgn (mpc_imagref (x->value.complex)) == 0))
3801 gfc_error ("Complex argument of LOG at %L cannot be zero",
3803 gfc_free_expr (result);
3804 return &gfc_bad_expr;
3807 gfc_set_model_kind (x->ts.kind);
3808 mpc_log (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
3812 gfc_internal_error ("gfc_simplify_log: bad type");
3815 return range_check (result, "LOG");
3820 gfc_simplify_log10 (gfc_expr *x)
3824 if (x->expr_type != EXPR_CONSTANT)
3827 if (mpfr_sgn (x->value.real) <= 0)
3829 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
3830 "to zero", &x->where);
3831 return &gfc_bad_expr;
3834 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
3835 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
3837 return range_check (result, "LOG10");
3842 gfc_simplify_logical (gfc_expr *e, gfc_expr *k)
3846 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
3848 return &gfc_bad_expr;
3850 if (e->expr_type != EXPR_CONSTANT)
3853 return gfc_get_logical_expr (kind, &e->where, e->value.logical);
3858 gfc_simplify_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
3861 int row, result_rows, col, result_columns;
3862 int stride_a, offset_a, stride_b, offset_b;
3864 if (!is_constant_array_expr (matrix_a)
3865 || !is_constant_array_expr (matrix_b))
3868 gcc_assert (gfc_compare_types (&matrix_a->ts, &matrix_b->ts));
3869 result = gfc_get_array_expr (matrix_a->ts.type,
3873 if (matrix_a->rank == 1 && matrix_b->rank == 2)
3876 result_columns = mpz_get_si (matrix_b->shape[0]);
3878 stride_b = mpz_get_si (matrix_b->shape[0]);
3881 result->shape = gfc_get_shape (result->rank);
3882 mpz_init_set_si (result->shape[0], result_columns);
3884 else if (matrix_a->rank == 2 && matrix_b->rank == 1)
3886 result_rows = mpz_get_si (matrix_b->shape[0]);
3888 stride_a = mpz_get_si (matrix_a->shape[0]);
3892 result->shape = gfc_get_shape (result->rank);
3893 mpz_init_set_si (result->shape[0], result_rows);
3895 else if (matrix_a->rank == 2 && matrix_b->rank == 2)
3897 result_rows = mpz_get_si (matrix_a->shape[0]);
3898 result_columns = mpz_get_si (matrix_b->shape[1]);
3899 stride_a = mpz_get_si (matrix_a->shape[1]);
3900 stride_b = mpz_get_si (matrix_b->shape[0]);
3903 result->shape = gfc_get_shape (result->rank);
3904 mpz_init_set_si (result->shape[0], result_rows);
3905 mpz_init_set_si (result->shape[1], result_columns);
3910 offset_a = offset_b = 0;
3911 for (col = 0; col < result_columns; ++col)
3915 for (row = 0; row < result_rows; ++row)
3917 gfc_expr *e = compute_dot_product (matrix_a, stride_a, offset_a,
3918 matrix_b, 1, offset_b);
3919 gfc_constructor_append_expr (&result->value.constructor,
3925 offset_b += stride_b;
3933 gfc_simplify_maskr (gfc_expr *i, gfc_expr *kind_arg)
3939 if (i->expr_type != EXPR_CONSTANT)
3942 kind = get_kind (BT_INTEGER, kind_arg, "MASKR", gfc_default_integer_kind);
3944 return &gfc_bad_expr;
3945 k = gfc_validate_kind (BT_INTEGER, kind, false);
3947 s = gfc_extract_int (i, &arg);
3950 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
3952 /* MASKR(n) = 2^n - 1 */
3953 mpz_set_ui (result->value.integer, 1);
3954 mpz_mul_2exp (result->value.integer, result->value.integer, arg);
3955 mpz_sub_ui (result->value.integer, result->value.integer, 1);
3957 convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
3964 gfc_simplify_maskl (gfc_expr *i, gfc_expr *kind_arg)
3971 if (i->expr_type != EXPR_CONSTANT)
3974 kind = get_kind (BT_INTEGER, kind_arg, "MASKL", gfc_default_integer_kind);
3976 return &gfc_bad_expr;
3977 k = gfc_validate_kind (BT_INTEGER, kind, false);
3979 s = gfc_extract_int (i, &arg);
3982 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
3984 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
3985 mpz_init_set_ui (z, 1);
3986 mpz_mul_2exp (z, z, gfc_integer_kinds[k].bit_size);
3987 mpz_set_ui (result->value.integer, 1);
3988 mpz_mul_2exp (result->value.integer, result->value.integer,
3989 gfc_integer_kinds[k].bit_size - arg);
3990 mpz_sub (result->value.integer, z, result->value.integer);
3993 convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
4000 gfc_simplify_merge (gfc_expr *tsource, gfc_expr *fsource, gfc_expr *mask)
4002 if (tsource->expr_type != EXPR_CONSTANT
4003 || fsource->expr_type != EXPR_CONSTANT
4004 || mask->expr_type != EXPR_CONSTANT)
4007 return gfc_copy_expr (mask->value.logical ? tsource : fsource);
4012 gfc_simplify_merge_bits (gfc_expr *i, gfc_expr *j, gfc_expr *mask_expr)
4014 mpz_t arg1, arg2, mask;
4017 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT
4018 || mask_expr->expr_type != EXPR_CONSTANT)
4021 result = gfc_get_constant_expr (BT_INTEGER, i->ts.kind, &i->where);
4023 /* Convert all argument to unsigned. */
4024 mpz_init_set (arg1, i->value.integer);
4025 mpz_init_set (arg2, j->value.integer);
4026 mpz_init_set (mask, mask_expr->value.integer);
4028 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
4029 mpz_and (arg1, arg1, mask);
4030 mpz_com (mask, mask);
4031 mpz_and (arg2, arg2, mask);
4032 mpz_ior (result->value.integer, arg1, arg2);
4042 /* Selects between current value and extremum for simplify_min_max
4043 and simplify_minval_maxval. */
4045 min_max_choose (gfc_expr *arg, gfc_expr *extremum, int sign)
4047 switch (arg->ts.type)
4050 if (mpz_cmp (arg->value.integer,
4051 extremum->value.integer) * sign > 0)
4052 mpz_set (extremum->value.integer, arg->value.integer);
4056 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
4058 mpfr_max (extremum->value.real, extremum->value.real,
4059 arg->value.real, GFC_RND_MODE);
4061 mpfr_min (extremum->value.real, extremum->value.real,
4062 arg->value.real, GFC_RND_MODE);
4066 #define LENGTH(x) ((x)->value.character.length)
4067 #define STRING(x) ((x)->value.character.string)
4068 if (LENGTH(extremum) < LENGTH(arg))
4070 gfc_char_t *tmp = STRING(extremum);
4072 STRING(extremum) = gfc_get_wide_string (LENGTH(arg) + 1);
4073 memcpy (STRING(extremum), tmp,
4074 LENGTH(extremum) * sizeof (gfc_char_t));
4075 gfc_wide_memset (&STRING(extremum)[LENGTH(extremum)], ' ',
4076 LENGTH(arg) - LENGTH(extremum));
4077 STRING(extremum)[LENGTH(arg)] = '\0'; /* For debugger */
4078 LENGTH(extremum) = LENGTH(arg);
4082 if (gfc_compare_string (arg, extremum) * sign > 0)
4084 free (STRING(extremum));
4085 STRING(extremum) = gfc_get_wide_string (LENGTH(extremum) + 1);
4086 memcpy (STRING(extremum), STRING(arg),
4087 LENGTH(arg) * sizeof (gfc_char_t));
4088 gfc_wide_memset (&STRING(extremum)[LENGTH(arg)], ' ',
4089 LENGTH(extremum) - LENGTH(arg));
4090 STRING(extremum)[LENGTH(extremum)] = '\0'; /* For debugger */
4097 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
4102 /* This function is special since MAX() can take any number of
4103 arguments. The simplified expression is a rewritten version of the
4104 argument list containing at most one constant element. Other
4105 constant elements are deleted. Because the argument list has
4106 already been checked, this function always succeeds. sign is 1 for
4107 MAX(), -1 for MIN(). */
4110 simplify_min_max (gfc_expr *expr, int sign)
4112 gfc_actual_arglist *arg, *last, *extremum;
4113 gfc_intrinsic_sym * specific;
4117 specific = expr->value.function.isym;
4119 arg = expr->value.function.actual;
4121 for (; arg; last = arg, arg = arg->next)
4123 if (arg->expr->expr_type != EXPR_CONSTANT)
4126 if (extremum == NULL)
4132 min_max_choose (arg->expr, extremum->expr, sign);
4134 /* Delete the extra constant argument. */
4136 expr->value.function.actual = arg->next;
4138 last->next = arg->next;
4141 gfc_free_actual_arglist (arg);
4145 /* If there is one value left, replace the function call with the
4147 if (expr->value.function.actual->next != NULL)
4150 /* Convert to the correct type and kind. */
4151 if (expr->ts.type != BT_UNKNOWN)
4152 return gfc_convert_constant (expr->value.function.actual->expr,
4153 expr->ts.type, expr->ts.kind);
4155 if (specific->ts.type != BT_UNKNOWN)
4156 return gfc_convert_constant (expr->value.function.actual->expr,
4157 specific->ts.type, specific->ts.kind);
4159 return gfc_copy_expr (expr->value.function.actual->expr);
4164 gfc_simplify_min (gfc_expr *e)
4166 return simplify_min_max (e, -1);
4171 gfc_simplify_max (gfc_expr *e)
4173 return simplify_min_max (e, 1);
4177 /* This is a simplified version of simplify_min_max to provide
4178 simplification of minval and maxval for a vector. */
4181 simplify_minval_maxval (gfc_expr *expr, int sign)
4183 gfc_constructor *c, *extremum;
4184 gfc_intrinsic_sym * specific;
4187 specific = expr->value.function.isym;
4189 for (c = gfc_constructor_first (expr->value.constructor);
4190 c; c = gfc_constructor_next (c))
4192 if (c->expr->expr_type != EXPR_CONSTANT)
4195 if (extremum == NULL)
4201 min_max_choose (c->expr, extremum->expr, sign);
4204 if (extremum == NULL)
4207 /* Convert to the correct type and kind. */
4208 if (expr->ts.type != BT_UNKNOWN)
4209 return gfc_convert_constant (extremum->expr,
4210 expr->ts.type, expr->ts.kind);
4212 if (specific->ts.type != BT_UNKNOWN)
4213 return gfc_convert_constant (extremum->expr,
4214 specific->ts.type, specific->ts.kind);
4216 return gfc_copy_expr (extremum->expr);
4221 gfc_simplify_minval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
4223 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
4226 return simplify_minval_maxval (array, -1);
4231 gfc_simplify_maxval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
4233 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
4236 return simplify_minval_maxval (array, 1);
4241 gfc_simplify_maxexponent (gfc_expr *x)
4243 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4244 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
4245 gfc_real_kinds[i].max_exponent);
4250 gfc_simplify_minexponent (gfc_expr *x)
4252 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4253 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
4254 gfc_real_kinds[i].min_exponent);
4259 gfc_simplify_mod (gfc_expr *a, gfc_expr *p)
4265 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
4268 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
4269 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
4274 if (mpz_cmp_ui (p->value.integer, 0) == 0)
4276 /* Result is processor-dependent. */
4277 gfc_error ("Second argument MOD at %L is zero", &a->where);
4278 gfc_free_expr (result);
4279 return &gfc_bad_expr;
4281 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
4285 if (mpfr_cmp_ui (p->value.real, 0) == 0)
4287 /* Result is processor-dependent. */
4288 gfc_error ("Second argument of MOD at %L is zero", &p->where);
4289 gfc_free_expr (result);
4290 return &gfc_bad_expr;
4293 gfc_set_model_kind (kind);
4295 mpfr_div (tmp, a->value.real, p->value.real, GFC_RND_MODE);
4296 mpfr_trunc (tmp, tmp);
4297 mpfr_mul (tmp, tmp, p->value.real, GFC_RND_MODE);
4298 mpfr_sub (result->value.real, a->value.real, tmp, GFC_RND_MODE);
4303 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
4306 return range_check (result, "MOD");
4311 gfc_simplify_modulo (gfc_expr *a, gfc_expr *p)
4317 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
4320 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
4321 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
4326 if (mpz_cmp_ui (p->value.integer, 0) == 0)
4328 /* Result is processor-dependent. This processor just opts
4329 to not handle it at all. */
4330 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
4331 gfc_free_expr (result);
4332 return &gfc_bad_expr;
4334 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
4339 if (mpfr_cmp_ui (p->value.real, 0) == 0)
4341 /* Result is processor-dependent. */
4342 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
4343 gfc_free_expr (result);
4344 return &gfc_bad_expr;
4347 gfc_set_model_kind (kind);
4349 mpfr_div (tmp, a->value.real, p->value.real, GFC_RND_MODE);
4350 mpfr_floor (tmp, tmp);
4351 mpfr_mul (tmp, tmp, p->value.real, GFC_RND_MODE);
4352 mpfr_sub (result->value.real, a->value.real, tmp, GFC_RND_MODE);
4357 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
4360 return range_check (result, "MODULO");
4364 /* Exists for the sole purpose of consistency with other intrinsics. */
4366 gfc_simplify_mvbits (gfc_expr *f ATTRIBUTE_UNUSED,
4367 gfc_expr *fp ATTRIBUTE_UNUSED,
4368 gfc_expr *l ATTRIBUTE_UNUSED,
4369 gfc_expr *to ATTRIBUTE_UNUSED,
4370 gfc_expr *tp ATTRIBUTE_UNUSED)
4377 gfc_simplify_nearest (gfc_expr *x, gfc_expr *s)
4380 mp_exp_t emin, emax;
4383 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
4386 if (mpfr_sgn (s->value.real) == 0)
4388 gfc_error ("Second argument of NEAREST at %L shall not be zero",
4390 return &gfc_bad_expr;
4393 result = gfc_copy_expr (x);
4395 /* Save current values of emin and emax. */
4396 emin = mpfr_get_emin ();
4397 emax = mpfr_get_emax ();
4399 /* Set emin and emax for the current model number. */
4400 kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
4401 mpfr_set_emin ((mp_exp_t) gfc_real_kinds[kind].min_exponent -
4402 mpfr_get_prec(result->value.real) + 1);
4403 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[kind].max_exponent - 1);
4404 mpfr_check_range (result->value.real, 0, GMP_RNDU);
4406 if (mpfr_sgn (s->value.real) > 0)
4408 mpfr_nextabove (result->value.real);
4409 mpfr_subnormalize (result->value.real, 0, GMP_RNDU);
4413 mpfr_nextbelow (result->value.real);
4414 mpfr_subnormalize (result->value.real, 0, GMP_RNDD);
4417 mpfr_set_emin (emin);
4418 mpfr_set_emax (emax);
4420 /* Only NaN can occur. Do not use range check as it gives an
4421 error for denormal numbers. */
4422 if (mpfr_nan_p (result->value.real) && gfc_option.flag_range_check)
4424 gfc_error ("Result of NEAREST is NaN at %L", &result->where);
4425 gfc_free_expr (result);
4426 return &gfc_bad_expr;
4434 simplify_nint (const char *name, gfc_expr *e, gfc_expr *k)
4436 gfc_expr *itrunc, *result;
4439 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
4441 return &gfc_bad_expr;
4443 if (e->expr_type != EXPR_CONSTANT)
4446 itrunc = gfc_copy_expr (e);
4447 mpfr_round (itrunc->value.real, e->value.real);
4449 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
4450 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real, &e->where);
4452 gfc_free_expr (itrunc);
4454 return range_check (result, name);
4459 gfc_simplify_new_line (gfc_expr *e)
4463 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, 1);
4464 result->value.character.string[0] = '\n';
4471 gfc_simplify_nint (gfc_expr *e, gfc_expr *k)
4473 return simplify_nint ("NINT", e, k);
4478 gfc_simplify_idnint (gfc_expr *e)
4480 return simplify_nint ("IDNINT", e, NULL);
4485 add_squared (gfc_expr *result, gfc_expr *e)
4489 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
4490 gcc_assert (result->ts.type == BT_REAL
4491 && result->expr_type == EXPR_CONSTANT);
4493 gfc_set_model_kind (result->ts.kind);
4495 mpfr_pow_ui (tmp, e->value.real, 2, GFC_RND_MODE);
4496 mpfr_add (result->value.real, result->value.real, tmp,
4505 do_sqrt (gfc_expr *result, gfc_expr *e)
4507 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
4508 gcc_assert (result->ts.type == BT_REAL
4509 && result->expr_type == EXPR_CONSTANT);
4511 mpfr_set (result->value.real, e->value.real, GFC_RND_MODE);
4512 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
4518 gfc_simplify_norm2 (gfc_expr *e, gfc_expr *dim)
4522 if (!is_constant_array_expr (e)
4523 || (dim != NULL && !gfc_is_constant_expr (dim)))
4526 result = transformational_result (e, dim, e->ts.type, e->ts.kind, &e->where);
4527 init_result_expr (result, 0, NULL);
4529 if (!dim || e->rank == 1)
4531 result = simplify_transformation_to_scalar (result, e, NULL,
4533 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
4536 result = simplify_transformation_to_array (result, e, dim, NULL,
4537 add_squared, &do_sqrt);
4544 gfc_simplify_not (gfc_expr *e)
4548 if (e->expr_type != EXPR_CONSTANT)
4551 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
4552 mpz_com (result->value.integer, e->value.integer);
4554 return range_check (result, "NOT");
4559 gfc_simplify_null (gfc_expr *mold)
4565 result = gfc_copy_expr (mold);
4566 result->expr_type = EXPR_NULL;
4569 result = gfc_get_null_expr (NULL);
4576 gfc_simplify_num_images (void)
4580 if (gfc_option.coarray == GFC_FCOARRAY_NONE)
4582 gfc_fatal_error ("Coarrays disabled at %C, use -fcoarray= to enable");
4583 return &gfc_bad_expr;
4586 if (gfc_option.coarray != GFC_FCOARRAY_SINGLE)
4589 /* FIXME: gfc_current_locus is wrong. */
4590 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
4591 &gfc_current_locus);
4592 mpz_set_si (result->value.integer, 1);
4598 gfc_simplify_or (gfc_expr *x, gfc_expr *y)
4603 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
4606 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
4611 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
4612 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
4613 return range_check (result, "OR");
4616 return gfc_get_logical_expr (kind, &x->where,
4617 x->value.logical || y->value.logical);
4625 gfc_simplify_pack (gfc_expr *array, gfc_expr *mask, gfc_expr *vector)
4628 gfc_constructor *array_ctor, *mask_ctor, *vector_ctor;
4630 if (!is_constant_array_expr(array)
4631 || !is_constant_array_expr(vector)
4632 || (!gfc_is_constant_expr (mask)
4633 && !is_constant_array_expr(mask)))
4636 result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where);
4637 if (array->ts.type == BT_DERIVED)
4638 result->ts.u.derived = array->ts.u.derived;
4640 array_ctor = gfc_constructor_first (array->value.constructor);
4641 vector_ctor = vector
4642 ? gfc_constructor_first (vector->value.constructor)
4645 if (mask->expr_type == EXPR_CONSTANT
4646 && mask->value.logical)
4648 /* Copy all elements of ARRAY to RESULT. */
4651 gfc_constructor_append_expr (&result->value.constructor,
4652 gfc_copy_expr (array_ctor->expr),
4655 array_ctor = gfc_constructor_next (array_ctor);
4656 vector_ctor = gfc_constructor_next (vector_ctor);
4659 else if (mask->expr_type == EXPR_ARRAY)
4661 /* Copy only those elements of ARRAY to RESULT whose
4662 MASK equals .TRUE.. */
4663 mask_ctor = gfc_constructor_first (mask->value.constructor);
4666 if (mask_ctor->expr->value.logical)
4668 gfc_constructor_append_expr (&result->value.constructor,
4669 gfc_copy_expr (array_ctor->expr),
4671 vector_ctor = gfc_constructor_next (vector_ctor);
4674 array_ctor = gfc_constructor_next (array_ctor);
4675 mask_ctor = gfc_constructor_next (mask_ctor);
4679 /* Append any left-over elements from VECTOR to RESULT. */
4682 gfc_constructor_append_expr (&result->value.constructor,
4683 gfc_copy_expr (vector_ctor->expr),
4685 vector_ctor = gfc_constructor_next (vector_ctor);
4688 result->shape = gfc_get_shape (1);
4689 gfc_array_size (result, &result->shape[0]);
4691 if (array->ts.type == BT_CHARACTER)
4692 result->ts.u.cl = array->ts.u.cl;
4699 do_xor (gfc_expr *result, gfc_expr *e)
4701 gcc_assert (e->ts.type == BT_LOGICAL && e->expr_type == EXPR_CONSTANT);
4702 gcc_assert (result->ts.type == BT_LOGICAL
4703 && result->expr_type == EXPR_CONSTANT);
4705 result->value.logical = result->value.logical != e->value.logical;
4712 gfc_simplify_parity (gfc_expr *e, gfc_expr *dim)
4714 return simplify_transformation (e, dim, NULL, 0, do_xor);
4719 gfc_simplify_popcnt (gfc_expr *e)
4724 if (e->expr_type != EXPR_CONSTANT)
4727 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4729 /* Convert argument to unsigned, then count the '1' bits. */
4730 mpz_init_set (x, e->value.integer);
4731 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
4732 res = mpz_popcount (x);
4735 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, res);
4740 gfc_simplify_poppar (gfc_expr *e)
4746 if (e->expr_type != EXPR_CONSTANT)
4749 popcnt = gfc_simplify_popcnt (e);
4750 gcc_assert (popcnt);
4752 s = gfc_extract_int (popcnt, &i);
4755 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i % 2);
4760 gfc_simplify_precision (gfc_expr *e)
4762 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4763 return gfc_get_int_expr (gfc_default_integer_kind, &e->where,
4764 gfc_real_kinds[i].precision);
4769 gfc_simplify_product (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
4771 return simplify_transformation (array, dim, mask, 1, gfc_multiply);
4776 gfc_simplify_radix (gfc_expr *e)
4779 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4784 i = gfc_integer_kinds[i].radix;
4788 i = gfc_real_kinds[i].radix;
4795 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
4800 gfc_simplify_range (gfc_expr *e)
4803 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
4808 i = gfc_integer_kinds[i].range;
4813 i = gfc_real_kinds[i].range;
4820 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
4825 gfc_simplify_rank (gfc_expr *e)
4827 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, e->rank);
4832 gfc_simplify_real (gfc_expr *e, gfc_expr *k)
4834 gfc_expr *result = NULL;
4837 if (e->ts.type == BT_COMPLEX)
4838 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
4840 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
4843 return &gfc_bad_expr;
4845 if (e->expr_type != EXPR_CONSTANT)
4848 if (convert_boz (e, kind) == &gfc_bad_expr)
4849 return &gfc_bad_expr;
4851 result = gfc_convert_constant (e, BT_REAL, kind);
4852 if (result == &gfc_bad_expr)
4853 return &gfc_bad_expr;
4855 return range_check (result, "REAL");
4860 gfc_simplify_realpart (gfc_expr *e)
4864 if (e->expr_type != EXPR_CONSTANT)
4867 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
4868 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
4870 return range_check (result, "REALPART");
4874 gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
4877 int i, j, len, ncop, nlen;
4879 bool have_length = false;
4881 /* If NCOPIES isn't a constant, there's nothing we can do. */
4882 if (n->expr_type != EXPR_CONSTANT)
4885 /* If NCOPIES is negative, it's an error. */
4886 if (mpz_sgn (n->value.integer) < 0)
4888 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
4890 return &gfc_bad_expr;
4893 /* If we don't know the character length, we can do no more. */
4894 if (e->ts.u.cl && e->ts.u.cl->length
4895 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
4897 len = mpz_get_si (e->ts.u.cl->length->value.integer);
4900 else if (e->expr_type == EXPR_CONSTANT
4901 && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
4903 len = e->value.character.length;
4908 /* If the source length is 0, any value of NCOPIES is valid
4909 and everything behaves as if NCOPIES == 0. */
4912 mpz_set_ui (ncopies, 0);
4914 mpz_set (ncopies, n->value.integer);
4916 /* Check that NCOPIES isn't too large. */
4922 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
4924 i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
4928 mpz_tdiv_q (max, gfc_integer_kinds[i].huge,
4929 e->ts.u.cl->length->value.integer);
4933 mpz_init_set_si (mlen, len);
4934 mpz_tdiv_q (max, gfc_integer_kinds[i].huge, mlen);
4938 /* The check itself. */
4939 if (mpz_cmp (ncopies, max) > 0)
4942 mpz_clear (ncopies);
4943 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
4945 return &gfc_bad_expr;
4950 mpz_clear (ncopies);
4952 /* For further simplification, we need the character string to be
4954 if (e->expr_type != EXPR_CONSTANT)
4958 (e->ts.u.cl->length &&
4959 mpz_sgn (e->ts.u.cl->length->value.integer)) != 0)
4961 const char *res = gfc_extract_int (n, &ncop);
4962 gcc_assert (res == NULL);
4967 len = e->value.character.length;
4970 result = gfc_get_constant_expr (BT_CHARACTER, e->ts.kind, &e->where);
4973 return gfc_get_character_expr (e->ts.kind, &e->where, NULL, 0);
4975 len = e->value.character.length;
4978 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, nlen);
4979 for (i = 0; i < ncop; i++)
4980 for (j = 0; j < len; j++)
4981 result->value.character.string[j+i*len]= e->value.character.string[j];
4983 result->value.character.string[nlen] = '\0'; /* For debugger */
4988 /* This one is a bear, but mainly has to do with shuffling elements. */
4991 gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
4992 gfc_expr *pad, gfc_expr *order_exp)
4994 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
4995 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
4999 gfc_expr *e, *result;
5001 /* Check that argument expression types are OK. */
5002 if (!is_constant_array_expr (source)
5003 || !is_constant_array_expr (shape_exp)
5004 || !is_constant_array_expr (pad)
5005 || !is_constant_array_expr (order_exp))
5008 /* Proceed with simplification, unpacking the array. */
5015 e = gfc_constructor_lookup_expr (shape_exp->value.constructor, rank);
5019 gfc_extract_int (e, &shape[rank]);
5021 gcc_assert (rank >= 0 && rank < GFC_MAX_DIMENSIONS);
5022 gcc_assert (shape[rank] >= 0);
5027 gcc_assert (rank > 0);
5029 /* Now unpack the order array if present. */
5030 if (order_exp == NULL)
5032 for (i = 0; i < rank; i++)
5037 for (i = 0; i < rank; i++)
5040 for (i = 0; i < rank; i++)
5042 e = gfc_constructor_lookup_expr (order_exp->value.constructor, i);
5045 gfc_extract_int (e, &order[i]);
5047 gcc_assert (order[i] >= 1 && order[i] <= rank);
5049 gcc_assert (x[order[i]] == 0);
5054 /* Count the elements in the source and padding arrays. */
5059 gfc_array_size (pad, &size);
5060 npad = mpz_get_ui (size);
5064 gfc_array_size (source, &size);
5065 nsource = mpz_get_ui (size);
5068 /* If it weren't for that pesky permutation we could just loop
5069 through the source and round out any shortage with pad elements.
5070 But no, someone just had to have the compiler do something the
5071 user should be doing. */
5073 for (i = 0; i < rank; i++)
5076 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5078 if (source->ts.type == BT_DERIVED)
5079 result->ts.u.derived = source->ts.u.derived;
5080 result->rank = rank;
5081 result->shape = gfc_get_shape (rank);
5082 for (i = 0; i < rank; i++)
5083 mpz_init_set_ui (result->shape[i], shape[i]);
5085 while (nsource > 0 || npad > 0)
5087 /* Figure out which element to extract. */
5088 mpz_set_ui (index, 0);
5090 for (i = rank - 1; i >= 0; i--)
5092 mpz_add_ui (index, index, x[order[i]]);
5094 mpz_mul_ui (index, index, shape[order[i - 1]]);
5097 if (mpz_cmp_ui (index, INT_MAX) > 0)
5098 gfc_internal_error ("Reshaped array too large at %C");
5100 j = mpz_get_ui (index);
5103 e = gfc_constructor_lookup_expr (source->value.constructor, j);
5106 gcc_assert (npad > 0);
5110 e = gfc_constructor_lookup_expr (pad->value.constructor, j);
5114 gfc_constructor_append_expr (&result->value.constructor,
5115 gfc_copy_expr (e), &e->where);
5117 /* Calculate the next element. */
5121 if (++x[i] < shape[i])
5137 gfc_simplify_rrspacing (gfc_expr *x)
5143 if (x->expr_type != EXPR_CONSTANT)
5146 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
5148 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5149 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
5151 /* Special case x = -0 and 0. */
5152 if (mpfr_sgn (result->value.real) == 0)
5154 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5158 /* | x * 2**(-e) | * 2**p. */
5159 e = - (long int) mpfr_get_exp (x->value.real);
5160 mpfr_mul_2si (result->value.real, result->value.real, e, GFC_RND_MODE);
5162 p = (long int) gfc_real_kinds[i].digits;
5163 mpfr_mul_2si (result->value.real, result->value.real, p, GFC_RND_MODE);
5165 return range_check (result, "RRSPACING");
5170 gfc_simplify_scale (gfc_expr *x, gfc_expr *i)
5172 int k, neg_flag, power, exp_range;
5173 mpfr_t scale, radix;
5176 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
5179 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5181 if (mpfr_sgn (x->value.real) == 0)
5183 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5187 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
5189 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
5191 /* This check filters out values of i that would overflow an int. */
5192 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
5193 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
5195 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
5196 gfc_free_expr (result);
5197 return &gfc_bad_expr;
5200 /* Compute scale = radix ** power. */
5201 power = mpz_get_si (i->value.integer);
5211 gfc_set_model_kind (x->ts.kind);
5214 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
5215 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
5218 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
5220 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
5222 mpfr_clears (scale, radix, NULL);
5224 return range_check (result, "SCALE");
5228 /* Variants of strspn and strcspn that operate on wide characters. */
5231 wide_strspn (const gfc_char_t *s1, const gfc_char_t *s2)
5234 const gfc_char_t *c;
5238 for (c = s2; *c; c++)
5252 wide_strcspn (const gfc_char_t *s1, const gfc_char_t *s2)
5255 const gfc_char_t *c;
5259 for (c = s2; *c; c++)
5274 gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind)
5279 size_t indx, len, lenc;
5280 int k = get_kind (BT_INTEGER, kind, "SCAN", gfc_default_integer_kind);
5283 return &gfc_bad_expr;
5285 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT)
5288 if (b != NULL && b->value.logical != 0)
5293 len = e->value.character.length;
5294 lenc = c->value.character.length;
5296 if (len == 0 || lenc == 0)
5304 indx = wide_strcspn (e->value.character.string,
5305 c->value.character.string) + 1;
5312 for (indx = len; indx > 0; indx--)
5314 for (i = 0; i < lenc; i++)
5316 if (c->value.character.string[i]
5317 == e->value.character.string[indx - 1])
5326 result = gfc_get_int_expr (k, &e->where, indx);
5327 return range_check (result, "SCAN");
5332 gfc_simplify_selected_char_kind (gfc_expr *e)
5336 if (e->expr_type != EXPR_CONSTANT)
5339 if (gfc_compare_with_Cstring (e, "ascii", false) == 0
5340 || gfc_compare_with_Cstring (e, "default", false) == 0)
5342 else if (gfc_compare_with_Cstring (e, "iso_10646", false) == 0)
5347 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
5352 gfc_simplify_selected_int_kind (gfc_expr *e)
5356 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
5361 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
5362 if (gfc_integer_kinds[i].range >= range
5363 && gfc_integer_kinds[i].kind < kind)
5364 kind = gfc_integer_kinds[i].kind;
5366 if (kind == INT_MAX)
5369 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
5374 gfc_simplify_selected_real_kind (gfc_expr *p, gfc_expr *q, gfc_expr *rdx)
5376 int range, precision, radix, i, kind, found_precision, found_range,
5378 locus *loc = &gfc_current_locus;
5384 if (p->expr_type != EXPR_CONSTANT
5385 || gfc_extract_int (p, &precision) != NULL)
5394 if (q->expr_type != EXPR_CONSTANT
5395 || gfc_extract_int (q, &range) != NULL)
5406 if (rdx->expr_type != EXPR_CONSTANT
5407 || gfc_extract_int (rdx, &radix) != NULL)
5415 found_precision = 0;
5419 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
5421 if (gfc_real_kinds[i].precision >= precision)
5422 found_precision = 1;
5424 if (gfc_real_kinds[i].range >= range)
5427 if (gfc_real_kinds[i].radix >= radix)
5430 if (gfc_real_kinds[i].precision >= precision
5431 && gfc_real_kinds[i].range >= range
5432 && gfc_real_kinds[i].radix >= radix && gfc_real_kinds[i].kind < kind)
5433 kind = gfc_real_kinds[i].kind;
5436 if (kind == INT_MAX)
5438 if (found_radix && found_range && !found_precision)
5440 else if (found_radix && found_precision && !found_range)
5442 else if (found_radix && !found_precision && !found_range)
5444 else if (found_radix)
5450 return gfc_get_int_expr (gfc_default_integer_kind, loc, kind);
5455 gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i)
5458 mpfr_t exp, absv, log2, pow2, frac;
5461 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
5464 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5466 if (mpfr_sgn (x->value.real) == 0)
5468 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5472 gfc_set_model_kind (x->ts.kind);
5479 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
5480 mpfr_log2 (log2, absv, GFC_RND_MODE);
5482 mpfr_trunc (log2, log2);
5483 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
5485 /* Old exponent value, and fraction. */
5486 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
5488 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
5491 exp2 = (unsigned long) mpz_get_d (i->value.integer);
5492 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
5494 mpfr_clears (absv, log2, pow2, frac, NULL);
5496 return range_check (result, "SET_EXPONENT");
5501 gfc_simplify_shape (gfc_expr *source, gfc_expr *kind)
5503 mpz_t shape[GFC_MAX_DIMENSIONS];
5504 gfc_expr *result, *e, *f;
5508 int k = get_kind (BT_INTEGER, kind, "SHAPE", gfc_default_integer_kind);
5510 result = gfc_get_array_expr (BT_INTEGER, k, &source->where);
5512 if (source->rank == 0)
5515 if (source->expr_type == EXPR_VARIABLE)
5517 ar = gfc_find_array_ref (source);
5518 t = gfc_array_ref_shape (ar, shape);
5520 else if (source->shape)
5523 for (n = 0; n < source->rank; n++)
5525 mpz_init (shape[n]);
5526 mpz_set (shape[n], source->shape[n]);
5532 for (n = 0; n < source->rank; n++)
5534 e = gfc_get_constant_expr (BT_INTEGER, k, &source->where);
5538 mpz_set (e->value.integer, shape[n]);
5539 mpz_clear (shape[n]);
5543 mpz_set_ui (e->value.integer, n + 1);
5545 f = gfc_simplify_size (source, e, NULL);
5549 gfc_free_expr (result);
5556 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
5564 gfc_simplify_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
5567 gfc_expr *return_value;
5569 int k = get_kind (BT_INTEGER, kind, "SIZE", gfc_default_integer_kind);
5572 return &gfc_bad_expr;
5574 /* For unary operations, the size of the result is given by the size
5575 of the operand. For binary ones, it's the size of the first operand
5576 unless it is scalar, then it is the size of the second. */
5577 if (array->expr_type == EXPR_OP && !array->value.op.uop)
5579 gfc_expr* replacement;
5580 gfc_expr* simplified;
5582 switch (array->value.op.op)
5584 /* Unary operations. */
5586 case INTRINSIC_UPLUS:
5587 case INTRINSIC_UMINUS:
5588 replacement = array->value.op.op1;
5591 /* Binary operations. If any one of the operands is scalar, take
5592 the other one's size. If both of them are arrays, it does not
5593 matter -- try to find one with known shape, if possible. */
5595 if (array->value.op.op1->rank == 0)
5596 replacement = array->value.op.op2;
5597 else if (array->value.op.op2->rank == 0)
5598 replacement = array->value.op.op1;
5601 simplified = gfc_simplify_size (array->value.op.op1, dim, kind);
5605 replacement = array->value.op.op2;
5610 /* Try to reduce it directly if possible. */
5611 simplified = gfc_simplify_size (replacement, dim, kind);
5613 /* Otherwise, we build a new SIZE call. This is hopefully at least
5614 simpler than the original one. */
5616 simplified = gfc_build_intrinsic_call ("size", array->where, 3,
5617 gfc_copy_expr (replacement),
5618 gfc_copy_expr (dim),
5619 gfc_copy_expr (kind));
5626 if (gfc_array_size (array, &size) == FAILURE)
5631 if (dim->expr_type != EXPR_CONSTANT)
5634 d = mpz_get_ui (dim->value.integer) - 1;
5635 if (gfc_array_dimen_size (array, d, &size) == FAILURE)
5639 return_value = gfc_get_int_expr (k, &array->where, mpz_get_si (size));
5641 return return_value;
5646 gfc_simplify_sign (gfc_expr *x, gfc_expr *y)
5650 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
5653 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5658 mpz_abs (result->value.integer, x->value.integer);
5659 if (mpz_sgn (y->value.integer) < 0)
5660 mpz_neg (result->value.integer, result->value.integer);
5664 if (gfc_option.flag_sign_zero)
5665 mpfr_copysign (result->value.real, x->value.real, y->value.real,
5668 mpfr_setsign (result->value.real, x->value.real,
5669 mpfr_sgn (y->value.real) < 0 ? 1 : 0, GFC_RND_MODE);
5673 gfc_internal_error ("Bad type in gfc_simplify_sign");
5681 gfc_simplify_sin (gfc_expr *x)
5685 if (x->expr_type != EXPR_CONSTANT)
5688 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5693 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
5697 gfc_set_model (x->value.real);
5698 mpc_sin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5702 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
5705 return range_check (result, "SIN");
5710 gfc_simplify_sinh (gfc_expr *x)
5714 if (x->expr_type != EXPR_CONSTANT)
5717 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5722 mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE);
5726 mpc_sinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5733 return range_check (result, "SINH");
5737 /* The argument is always a double precision real that is converted to
5738 single precision. TODO: Rounding! */
5741 gfc_simplify_sngl (gfc_expr *a)
5745 if (a->expr_type != EXPR_CONSTANT)
5748 result = gfc_real2real (a, gfc_default_real_kind);
5749 return range_check (result, "SNGL");
5754 gfc_simplify_spacing (gfc_expr *x)
5760 if (x->expr_type != EXPR_CONSTANT)
5763 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
5765 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5767 /* Special case x = 0 and -0. */
5768 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
5769 if (mpfr_sgn (result->value.real) == 0)
5771 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
5775 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
5776 are the radix, exponent of x, and precision. This excludes the
5777 possibility of subnormal numbers. Fortran 2003 states the result is
5778 b**max(e - p, emin - 1). */
5780 ep = (long int) mpfr_get_exp (x->value.real) - gfc_real_kinds[i].digits;
5781 en = (long int) gfc_real_kinds[i].min_exponent - 1;
5782 en = en > ep ? en : ep;
5784 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
5785 mpfr_mul_2si (result->value.real, result->value.real, en, GFC_RND_MODE);
5787 return range_check (result, "SPACING");
5792 gfc_simplify_spread (gfc_expr *source, gfc_expr *dim_expr, gfc_expr *ncopies_expr)
5794 gfc_expr *result = 0L;
5795 int i, j, dim, ncopies;
5798 if ((!gfc_is_constant_expr (source)
5799 && !is_constant_array_expr (source))
5800 || !gfc_is_constant_expr (dim_expr)
5801 || !gfc_is_constant_expr (ncopies_expr))
5804 gcc_assert (dim_expr->ts.type == BT_INTEGER);
5805 gfc_extract_int (dim_expr, &dim);
5806 dim -= 1; /* zero-base DIM */
5808 gcc_assert (ncopies_expr->ts.type == BT_INTEGER);
5809 gfc_extract_int (ncopies_expr, &ncopies);
5810 ncopies = MAX (ncopies, 0);
5812 /* Do not allow the array size to exceed the limit for an array
5814 if (source->expr_type == EXPR_ARRAY)
5816 if (gfc_array_size (source, &size) == FAILURE)
5817 gfc_internal_error ("Failure getting length of a constant array.");
5820 mpz_init_set_ui (size, 1);
5822 if (mpz_get_si (size)*ncopies > gfc_option.flag_max_array_constructor)
5825 if (source->expr_type == EXPR_CONSTANT)
5827 gcc_assert (dim == 0);
5829 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5831 if (source->ts.type == BT_DERIVED)
5832 result->ts.u.derived = source->ts.u.derived;
5834 result->shape = gfc_get_shape (result->rank);
5835 mpz_init_set_si (result->shape[0], ncopies);
5837 for (i = 0; i < ncopies; ++i)
5838 gfc_constructor_append_expr (&result->value.constructor,
5839 gfc_copy_expr (source), NULL);
5841 else if (source->expr_type == EXPR_ARRAY)
5843 int offset, rstride[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS];
5844 gfc_constructor *source_ctor;
5846 gcc_assert (source->rank < GFC_MAX_DIMENSIONS);
5847 gcc_assert (dim >= 0 && dim <= source->rank);
5849 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5851 if (source->ts.type == BT_DERIVED)
5852 result->ts.u.derived = source->ts.u.derived;
5853 result->rank = source->rank + 1;
5854 result->shape = gfc_get_shape (result->rank);
5856 for (i = 0, j = 0; i < result->rank; ++i)
5859 mpz_init_set (result->shape[i], source->shape[j++]);
5861 mpz_init_set_si (result->shape[i], ncopies);
5863 extent[i] = mpz_get_si (result->shape[i]);
5864 rstride[i] = (i == 0) ? 1 : rstride[i-1] * extent[i-1];
5868 for (source_ctor = gfc_constructor_first (source->value.constructor);
5869 source_ctor; source_ctor = gfc_constructor_next (source_ctor))
5871 for (i = 0; i < ncopies; ++i)
5872 gfc_constructor_insert_expr (&result->value.constructor,
5873 gfc_copy_expr (source_ctor->expr),
5874 NULL, offset + i * rstride[dim]);
5876 offset += (dim == 0 ? ncopies : 1);
5880 /* FIXME: Returning here avoids a regression in array_simplify_1.f90.
5881 Replace NULL with gcc_unreachable() after implementing
5882 gfc_simplify_cshift(). */
5885 if (source->ts.type == BT_CHARACTER)
5886 result->ts.u.cl = source->ts.u.cl;
5893 gfc_simplify_sqrt (gfc_expr *e)
5895 gfc_expr *result = NULL;
5897 if (e->expr_type != EXPR_CONSTANT)
5903 if (mpfr_cmp_si (e->value.real, 0) < 0)
5905 gfc_error ("Argument of SQRT at %L has a negative value",
5907 return &gfc_bad_expr;
5909 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
5910 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
5914 gfc_set_model (e->value.real);
5916 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
5917 mpc_sqrt (result->value.complex, e->value.complex, GFC_MPC_RND_MODE);
5921 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
5924 return range_check (result, "SQRT");
5929 gfc_simplify_sum (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
5931 return simplify_transformation (array, dim, mask, 0, gfc_add);
5936 gfc_simplify_tan (gfc_expr *x)
5940 if (x->expr_type != EXPR_CONSTANT)
5943 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5948 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
5952 mpc_tan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5959 return range_check (result, "TAN");
5964 gfc_simplify_tanh (gfc_expr *x)
5968 if (x->expr_type != EXPR_CONSTANT)
5971 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
5976 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
5980 mpc_tanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
5987 return range_check (result, "TANH");
5992 gfc_simplify_tiny (gfc_expr *e)
5997 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
5999 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
6000 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
6007 gfc_simplify_trailz (gfc_expr *e)
6009 unsigned long tz, bs;
6012 if (e->expr_type != EXPR_CONSTANT)
6015 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
6016 bs = gfc_integer_kinds[i].bit_size;
6017 tz = mpz_scan1 (e->value.integer, 0);
6019 return gfc_get_int_expr (gfc_default_integer_kind,
6020 &e->where, MIN (tz, bs));
6025 gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
6028 gfc_expr *mold_element;
6033 unsigned char *buffer;
6034 size_t result_length;
6037 if (!gfc_is_constant_expr (source)
6038 || (gfc_init_expr_flag && !gfc_is_constant_expr (mold))
6039 || !gfc_is_constant_expr (size))
6042 if (gfc_calculate_transfer_sizes (source, mold, size, &source_size,
6043 &result_size, &result_length) == FAILURE)
6046 /* Calculate the size of the source. */
6047 if (source->expr_type == EXPR_ARRAY
6048 && gfc_array_size (source, &tmp) == FAILURE)
6049 gfc_internal_error ("Failure getting length of a constant array.");
6051 /* Create an empty new expression with the appropriate characteristics. */
6052 result = gfc_get_constant_expr (mold->ts.type, mold->ts.kind,
6054 result->ts = mold->ts;
6056 mold_element = mold->expr_type == EXPR_ARRAY
6057 ? gfc_constructor_first (mold->value.constructor)->expr
6060 /* Set result character length, if needed. Note that this needs to be
6061 set even for array expressions, in order to pass this information into
6062 gfc_target_interpret_expr. */
6063 if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element))
6064 result->value.character.length = mold_element->value.character.length;
6066 /* Set the number of elements in the result, and determine its size. */
6068 if (mold->expr_type == EXPR_ARRAY || mold->rank || size)
6070 result->expr_type = EXPR_ARRAY;
6072 result->shape = gfc_get_shape (1);
6073 mpz_init_set_ui (result->shape[0], result_length);
6078 /* Allocate the buffer to store the binary version of the source. */
6079 buffer_size = MAX (source_size, result_size);
6080 buffer = (unsigned char*)alloca (buffer_size);
6081 memset (buffer, 0, buffer_size);
6083 /* Now write source to the buffer. */
6084 gfc_target_encode_expr (source, buffer, buffer_size);
6086 /* And read the buffer back into the new expression. */
6087 gfc_target_interpret_expr (buffer, buffer_size, result, false);
6094 gfc_simplify_transpose (gfc_expr *matrix)
6096 int row, matrix_rows, col, matrix_cols;
6099 if (!is_constant_array_expr (matrix))
6102 gcc_assert (matrix->rank == 2);
6104 result = gfc_get_array_expr (matrix->ts.type, matrix->ts.kind,
6107 result->shape = gfc_get_shape (result->rank);
6108 mpz_set (result->shape[0], matrix->shape[1]);
6109 mpz_set (result->shape[1], matrix->shape[0]);
6111 if (matrix->ts.type == BT_CHARACTER)
6112 result->ts.u.cl = matrix->ts.u.cl;
6113 else if (matrix->ts.type == BT_DERIVED)
6114 result->ts.u.derived = matrix->ts.u.derived;
6116 matrix_rows = mpz_get_si (matrix->shape[0]);
6117 matrix_cols = mpz_get_si (matrix->shape[1]);
6118 for (row = 0; row < matrix_rows; ++row)
6119 for (col = 0; col < matrix_cols; ++col)
6121 gfc_expr *e = gfc_constructor_lookup_expr (matrix->value.constructor,
6122 col * matrix_rows + row);
6123 gfc_constructor_insert_expr (&result->value.constructor,
6124 gfc_copy_expr (e), &matrix->where,
6125 row * matrix_cols + col);
6133 gfc_simplify_trim (gfc_expr *e)
6136 int count, i, len, lentrim;
6138 if (e->expr_type != EXPR_CONSTANT)
6141 len = e->value.character.length;
6142 for (count = 0, i = 1; i <= len; ++i)
6144 if (e->value.character.string[len - i] == ' ')
6150 lentrim = len - count;
6152 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, lentrim);
6153 for (i = 0; i < lentrim; i++)
6154 result->value.character.string[i] = e->value.character.string[i];
6161 gfc_simplify_image_index (gfc_expr *coarray, gfc_expr *sub)
6166 gfc_constructor *sub_cons;
6170 if (!is_constant_array_expr (sub))
6173 /* Follow any component references. */
6174 as = coarray->symtree->n.sym->as;
6175 for (ref = coarray->ref; ref; ref = ref->next)
6176 if (ref->type == REF_COMPONENT)
6179 if (as->type == AS_DEFERRED)
6182 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
6183 the cosubscript addresses the first image. */
6185 sub_cons = gfc_constructor_first (sub->value.constructor);
6188 for (d = 1; d <= as->corank; d++)
6193 gcc_assert (sub_cons != NULL);
6195 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 0, as,
6197 if (ca_bound == NULL)
6200 if (ca_bound == &gfc_bad_expr)
6203 cmp = mpz_cmp (ca_bound->value.integer, sub_cons->expr->value.integer);
6207 gfc_free_expr (ca_bound);
6208 sub_cons = gfc_constructor_next (sub_cons);
6212 first_image = false;
6216 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6217 "SUB has %ld and COARRAY lower bound is %ld)",
6219 mpz_get_si (sub_cons->expr->value.integer),
6220 mpz_get_si (ca_bound->value.integer));
6221 gfc_free_expr (ca_bound);
6222 return &gfc_bad_expr;
6225 gfc_free_expr (ca_bound);
6227 /* Check whether upperbound is valid for the multi-images case. */
6230 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 1, as,
6232 if (ca_bound == &gfc_bad_expr)
6235 if (ca_bound && ca_bound->expr_type == EXPR_CONSTANT
6236 && mpz_cmp (ca_bound->value.integer,
6237 sub_cons->expr->value.integer) < 0)
6239 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6240 "SUB has %ld and COARRAY upper bound is %ld)",
6242 mpz_get_si (sub_cons->expr->value.integer),
6243 mpz_get_si (ca_bound->value.integer));
6244 gfc_free_expr (ca_bound);
6245 return &gfc_bad_expr;
6249 gfc_free_expr (ca_bound);
6252 sub_cons = gfc_constructor_next (sub_cons);
6255 gcc_assert (sub_cons == NULL);
6257 if (gfc_option.coarray != GFC_FCOARRAY_SINGLE && !first_image)
6260 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
6261 &gfc_current_locus);
6263 mpz_set_si (result->value.integer, 1);
6265 mpz_set_si (result->value.integer, 0);
6272 gfc_simplify_this_image (gfc_expr *coarray, gfc_expr *dim)
6278 if (gfc_option.coarray != GFC_FCOARRAY_SINGLE)
6281 if (coarray == NULL)
6284 /* FIXME: gfc_current_locus is wrong. */
6285 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
6286 &gfc_current_locus);
6287 mpz_set_si (result->value.integer, 1);
6291 gcc_assert (coarray->expr_type == EXPR_VARIABLE);
6293 /* Follow any component references. */
6294 as = coarray->symtree->n.sym->as;
6295 for (ref = coarray->ref; ref; ref = ref->next)
6296 if (ref->type == REF_COMPONENT)
6299 if (as->type == AS_DEFERRED)
6304 /* Multi-dimensional bounds. */
6305 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
6308 /* Simplify the bounds for each dimension. */
6309 for (d = 0; d < as->corank; d++)
6311 bounds[d] = simplify_bound_dim (coarray, NULL, d + as->rank + 1, 0,
6313 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
6317 for (j = 0; j < d; j++)
6318 gfc_free_expr (bounds[j]);
6324 /* Allocate the result expression. */
6325 e = gfc_get_expr ();
6326 e->where = coarray->where;
6327 e->expr_type = EXPR_ARRAY;
6328 e->ts.type = BT_INTEGER;
6329 e->ts.kind = gfc_default_integer_kind;
6332 e->shape = gfc_get_shape (1);
6333 mpz_init_set_ui (e->shape[0], as->corank);
6335 /* Create the constructor for this array. */
6336 for (d = 0; d < as->corank; d++)
6337 gfc_constructor_append_expr (&e->value.constructor,
6338 bounds[d], &e->where);
6344 /* A DIM argument is specified. */
6345 if (dim->expr_type != EXPR_CONSTANT)
6348 d = mpz_get_si (dim->value.integer);
6350 if (d < 1 || d > as->corank)
6352 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
6353 return &gfc_bad_expr;
6356 return simplify_bound_dim (coarray, NULL, d + as->rank, 0, as, NULL,
6363 gfc_simplify_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6365 return simplify_bound (array, dim, kind, 1);
6369 gfc_simplify_ucobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6371 return simplify_cobound (array, dim, kind, 1);
6376 gfc_simplify_unpack (gfc_expr *vector, gfc_expr *mask, gfc_expr *field)
6378 gfc_expr *result, *e;
6379 gfc_constructor *vector_ctor, *mask_ctor, *field_ctor;
6381 if (!is_constant_array_expr (vector)
6382 || !is_constant_array_expr (mask)
6383 || (!gfc_is_constant_expr (field)
6384 && !is_constant_array_expr(field)))
6387 result = gfc_get_array_expr (vector->ts.type, vector->ts.kind,
6389 if (vector->ts.type == BT_DERIVED)
6390 result->ts.u.derived = vector->ts.u.derived;
6391 result->rank = mask->rank;
6392 result->shape = gfc_copy_shape (mask->shape, mask->rank);
6394 if (vector->ts.type == BT_CHARACTER)
6395 result->ts.u.cl = vector->ts.u.cl;
6397 vector_ctor = gfc_constructor_first (vector->value.constructor);
6398 mask_ctor = gfc_constructor_first (mask->value.constructor);
6400 = field->expr_type == EXPR_ARRAY
6401 ? gfc_constructor_first (field->value.constructor)
6406 if (mask_ctor->expr->value.logical)
6408 gcc_assert (vector_ctor);
6409 e = gfc_copy_expr (vector_ctor->expr);
6410 vector_ctor = gfc_constructor_next (vector_ctor);
6412 else if (field->expr_type == EXPR_ARRAY)
6413 e = gfc_copy_expr (field_ctor->expr);
6415 e = gfc_copy_expr (field);
6417 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
6419 mask_ctor = gfc_constructor_next (mask_ctor);
6420 field_ctor = gfc_constructor_next (field_ctor);
6428 gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind)
6432 size_t index, len, lenset;
6434 int k = get_kind (BT_INTEGER, kind, "VERIFY", gfc_default_integer_kind);
6437 return &gfc_bad_expr;
6439 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT)
6442 if (b != NULL && b->value.logical != 0)
6447 result = gfc_get_constant_expr (BT_INTEGER, k, &s->where);
6449 len = s->value.character.length;
6450 lenset = set->value.character.length;
6454 mpz_set_ui (result->value.integer, 0);
6462 mpz_set_ui (result->value.integer, 1);
6466 index = wide_strspn (s->value.character.string,
6467 set->value.character.string) + 1;
6476 mpz_set_ui (result->value.integer, len);
6479 for (index = len; index > 0; index --)
6481 for (i = 0; i < lenset; i++)
6483 if (s->value.character.string[index - 1]
6484 == set->value.character.string[i])
6492 mpz_set_ui (result->value.integer, index);
6498 gfc_simplify_xor (gfc_expr *x, gfc_expr *y)
6503 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
6506 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
6511 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
6512 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
6513 return range_check (result, "XOR");
6516 return gfc_get_logical_expr (kind, &x->where,
6517 (x->value.logical && !y->value.logical)
6518 || (!x->value.logical && y->value.logical));
6526 /****************** Constant simplification *****************/
6528 /* Master function to convert one constant to another. While this is
6529 used as a simplification function, it requires the destination type
6530 and kind information which is supplied by a special case in
6534 gfc_convert_constant (gfc_expr *e, bt type, int kind)
6536 gfc_expr *g, *result, *(*f) (gfc_expr *, int);
6551 f = gfc_int2complex;
6571 f = gfc_real2complex;
6582 f = gfc_complex2int;
6585 f = gfc_complex2real;
6588 f = gfc_complex2complex;
6614 f = gfc_hollerith2int;
6618 f = gfc_hollerith2real;
6622 f = gfc_hollerith2complex;
6626 f = gfc_hollerith2character;
6630 f = gfc_hollerith2logical;
6640 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
6645 switch (e->expr_type)
6648 result = f (e, kind);
6650 return &gfc_bad_expr;
6654 if (!gfc_is_constant_expr (e))
6657 result = gfc_get_array_expr (type, kind, &e->where);
6658 result->shape = gfc_copy_shape (e->shape, e->rank);
6659 result->rank = e->rank;
6661 for (c = gfc_constructor_first (e->value.constructor);
6662 c; c = gfc_constructor_next (c))
6665 if (c->iterator == NULL)
6666 tmp = f (c->expr, kind);
6669 g = gfc_convert_constant (c->expr, type, kind);
6670 if (g == &gfc_bad_expr)
6672 gfc_free_expr (result);
6680 gfc_free_expr (result);
6684 gfc_constructor_append_expr (&result->value.constructor,
6698 /* Function for converting character constants. */
6700 gfc_convert_char_constant (gfc_expr *e, bt type ATTRIBUTE_UNUSED, int kind)
6705 if (!gfc_is_constant_expr (e))
6708 if (e->expr_type == EXPR_CONSTANT)
6710 /* Simple case of a scalar. */
6711 result = gfc_get_constant_expr (BT_CHARACTER, kind, &e->where);
6713 return &gfc_bad_expr;
6715 result->value.character.length = e->value.character.length;
6716 result->value.character.string
6717 = gfc_get_wide_string (e->value.character.length + 1);
6718 memcpy (result->value.character.string, e->value.character.string,
6719 (e->value.character.length + 1) * sizeof (gfc_char_t));
6721 /* Check we only have values representable in the destination kind. */
6722 for (i = 0; i < result->value.character.length; i++)
6723 if (!gfc_check_character_range (result->value.character.string[i],
6726 gfc_error ("Character '%s' in string at %L cannot be converted "
6727 "into character kind %d",
6728 gfc_print_wide_char (result->value.character.string[i]),
6730 return &gfc_bad_expr;
6735 else if (e->expr_type == EXPR_ARRAY)
6737 /* For an array constructor, we convert each constructor element. */
6740 result = gfc_get_array_expr (type, kind, &e->where);
6741 result->shape = gfc_copy_shape (e->shape, e->rank);
6742 result->rank = e->rank;
6743 result->ts.u.cl = e->ts.u.cl;
6745 for (c = gfc_constructor_first (e->value.constructor);
6746 c; c = gfc_constructor_next (c))
6748 gfc_expr *tmp = gfc_convert_char_constant (c->expr, type, kind);
6749 if (tmp == &gfc_bad_expr)
6751 gfc_free_expr (result);
6752 return &gfc_bad_expr;
6757 gfc_free_expr (result);
6761 gfc_constructor_append_expr (&result->value.constructor,
6773 gfc_simplify_compiler_options (void)
6778 str = gfc_get_option_string ();
6779 result = gfc_get_character_expr (gfc_default_character_kind,
6780 &gfc_current_locus, str, strlen (str));
6787 gfc_simplify_compiler_version (void)
6792 len = strlen ("GCC version ") + strlen (version_string);
6793 buffer = XALLOCAVEC (char, len + 1);
6794 snprintf (buffer, len + 1, "GCC version %s", version_string);
6795 return gfc_get_character_expr (gfc_default_character_kind,
6796 &gfc_current_locus, buffer, len);