2016-10-11 Fritz Reese <fritzoreese@gmail.com>
[official-gcc.git] / gcc / fortran / simplify.c
blobeb6e41258fb8297ec8c16a6c32dd4553c7c762ef
1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000-2016 Free Software Foundation, Inc.
3 Contributed by Andy Vaught & Katherine Holcomb
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tm.h" /* For BITS_PER_UNIT. */
25 #include "gfortran.h"
26 #include "arith.h"
27 #include "intrinsic.h"
28 #include "target-memory.h"
29 #include "constructor.h"
30 #include "version.h" /* For version_string. */
33 gfc_expr gfc_bad_expr;
35 static gfc_expr *simplify_size (gfc_expr *, gfc_expr *, int);
38 /* Note that 'simplification' is not just transforming expressions.
39 For functions that are not simplified at compile time, range
40 checking is done if possible.
42 The return convention is that each simplification function returns:
44 A new expression node corresponding to the simplified arguments.
45 The original arguments are destroyed by the caller, and must not
46 be a part of the new expression.
48 NULL pointer indicating that no simplification was possible and
49 the original expression should remain intact.
51 An expression pointer to gfc_bad_expr (a static placeholder)
52 indicating that some error has prevented simplification. The
53 error is generated within the function and should be propagated
54 upwards
56 By the time a simplification function gets control, it has been
57 decided that the function call is really supposed to be the
58 intrinsic. No type checking is strictly necessary, since only
59 valid types will be passed on. On the other hand, a simplification
60 subroutine may have to look at the type of an argument as part of
61 its processing.
63 Array arguments are only passed to these subroutines that implement
64 the simplification of transformational intrinsics.
66 The functions in this file don't have much comment with them, but
67 everything is reasonably straight-forward. The Standard, chapter 13
68 is the best comment you'll find for this file anyway. */
70 /* Range checks an expression node. If all goes well, returns the
71 node, otherwise returns &gfc_bad_expr and frees the node. */
73 static gfc_expr *
74 range_check (gfc_expr *result, const char *name)
76 if (result == NULL)
77 return &gfc_bad_expr;
79 if (result->expr_type != EXPR_CONSTANT)
80 return result;
82 switch (gfc_range_check (result))
84 case ARITH_OK:
85 return result;
87 case ARITH_OVERFLOW:
88 gfc_error ("Result of %s overflows its kind at %L", name,
89 &result->where);
90 break;
92 case ARITH_UNDERFLOW:
93 gfc_error ("Result of %s underflows its kind at %L", name,
94 &result->where);
95 break;
97 case ARITH_NAN:
98 gfc_error ("Result of %s is NaN at %L", name, &result->where);
99 break;
101 default:
102 gfc_error ("Result of %s gives range error for its kind at %L", name,
103 &result->where);
104 break;
107 gfc_free_expr (result);
108 return &gfc_bad_expr;
112 /* A helper function that gets an optional and possibly missing
113 kind parameter. Returns the kind, -1 if something went wrong. */
115 static int
116 get_kind (bt type, gfc_expr *k, const char *name, int default_kind)
118 int kind;
120 if (k == NULL)
121 return default_kind;
123 if (k->expr_type != EXPR_CONSTANT)
125 gfc_error ("KIND parameter of %s at %L must be an initialization "
126 "expression", name, &k->where);
127 return -1;
130 if (gfc_extract_int (k, &kind) != NULL
131 || gfc_validate_kind (type, kind, true) < 0)
133 gfc_error ("Invalid KIND parameter of %s at %L", name, &k->where);
134 return -1;
137 return kind;
141 /* Converts an mpz_t signed variable into an unsigned one, assuming
142 two's complement representations and a binary width of bitsize.
143 The conversion is a no-op unless x is negative; otherwise, it can
144 be accomplished by masking out the high bits. */
146 static void
147 convert_mpz_to_unsigned (mpz_t x, int bitsize)
149 mpz_t mask;
151 if (mpz_sgn (x) < 0)
153 /* Confirm that no bits above the signed range are unset if we
154 are doing range checking. */
155 if (flag_range_check != 0)
156 gcc_assert (mpz_scan0 (x, bitsize-1) == ULONG_MAX);
158 mpz_init_set_ui (mask, 1);
159 mpz_mul_2exp (mask, mask, bitsize);
160 mpz_sub_ui (mask, mask, 1);
162 mpz_and (x, x, mask);
164 mpz_clear (mask);
166 else
168 /* Confirm that no bits above the signed range are set. */
169 gcc_assert (mpz_scan1 (x, bitsize-1) == ULONG_MAX);
174 /* Converts an mpz_t unsigned variable into a signed one, assuming
175 two's complement representations and a binary width of bitsize.
176 If the bitsize-1 bit is set, this is taken as a sign bit and
177 the number is converted to the corresponding negative number. */
179 void
180 gfc_convert_mpz_to_signed (mpz_t x, int bitsize)
182 mpz_t mask;
184 /* Confirm that no bits above the unsigned range are set if we are
185 doing range checking. */
186 if (flag_range_check != 0)
187 gcc_assert (mpz_scan1 (x, bitsize) == ULONG_MAX);
189 if (mpz_tstbit (x, bitsize - 1) == 1)
191 mpz_init_set_ui (mask, 1);
192 mpz_mul_2exp (mask, mask, bitsize);
193 mpz_sub_ui (mask, mask, 1);
195 /* We negate the number by hand, zeroing the high bits, that is
196 make it the corresponding positive number, and then have it
197 negated by GMP, giving the correct representation of the
198 negative number. */
199 mpz_com (x, x);
200 mpz_add_ui (x, x, 1);
201 mpz_and (x, x, mask);
203 mpz_neg (x, x);
205 mpz_clear (mask);
210 /* In-place convert BOZ to REAL of the specified kind. */
212 static gfc_expr *
213 convert_boz (gfc_expr *x, int kind)
215 if (x && x->ts.type == BT_INTEGER && x->is_boz)
217 gfc_typespec ts;
218 gfc_clear_ts (&ts);
219 ts.type = BT_REAL;
220 ts.kind = kind;
222 if (!gfc_convert_boz (x, &ts))
223 return &gfc_bad_expr;
226 return x;
230 /* Test that the expression is an constant array. */
232 static bool
233 is_constant_array_expr (gfc_expr *e)
235 gfc_constructor *c;
237 if (e == NULL)
238 return true;
240 if (e->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (e))
241 return false;
243 for (c = gfc_constructor_first (e->value.constructor);
244 c; c = gfc_constructor_next (c))
245 if (c->expr->expr_type != EXPR_CONSTANT
246 && c->expr->expr_type != EXPR_STRUCTURE)
247 return false;
249 return true;
253 /* Initialize a transformational result expression with a given value. */
255 static void
256 init_result_expr (gfc_expr *e, int init, gfc_expr *array)
258 if (e && e->expr_type == EXPR_ARRAY)
260 gfc_constructor *ctor = gfc_constructor_first (e->value.constructor);
261 while (ctor)
263 init_result_expr (ctor->expr, init, array);
264 ctor = gfc_constructor_next (ctor);
267 else if (e && e->expr_type == EXPR_CONSTANT)
269 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
270 int length;
271 gfc_char_t *string;
273 switch (e->ts.type)
275 case BT_LOGICAL:
276 e->value.logical = (init ? 1 : 0);
277 break;
279 case BT_INTEGER:
280 if (init == INT_MIN)
281 mpz_set (e->value.integer, gfc_integer_kinds[i].min_int);
282 else if (init == INT_MAX)
283 mpz_set (e->value.integer, gfc_integer_kinds[i].huge);
284 else
285 mpz_set_si (e->value.integer, init);
286 break;
288 case BT_REAL:
289 if (init == INT_MIN)
291 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
292 mpfr_neg (e->value.real, e->value.real, GFC_RND_MODE);
294 else if (init == INT_MAX)
295 mpfr_set (e->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
296 else
297 mpfr_set_si (e->value.real, init, GFC_RND_MODE);
298 break;
300 case BT_COMPLEX:
301 mpc_set_si (e->value.complex, init, GFC_MPC_RND_MODE);
302 break;
304 case BT_CHARACTER:
305 if (init == INT_MIN)
307 gfc_expr *len = gfc_simplify_len (array, NULL);
308 gfc_extract_int (len, &length);
309 string = gfc_get_wide_string (length + 1);
310 gfc_wide_memset (string, 0, length);
312 else if (init == INT_MAX)
314 gfc_expr *len = gfc_simplify_len (array, NULL);
315 gfc_extract_int (len, &length);
316 string = gfc_get_wide_string (length + 1);
317 gfc_wide_memset (string, 255, length);
319 else
321 length = 0;
322 string = gfc_get_wide_string (1);
325 string[length] = '\0';
326 e->value.character.length = length;
327 e->value.character.string = string;
328 break;
330 default:
331 gcc_unreachable();
334 else
335 gcc_unreachable();
339 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul;
340 if conj_a is true, the matrix_a is complex conjugated. */
342 static gfc_expr *
343 compute_dot_product (gfc_expr *matrix_a, int stride_a, int offset_a,
344 gfc_expr *matrix_b, int stride_b, int offset_b,
345 bool conj_a)
347 gfc_expr *result, *a, *b, *c;
349 result = gfc_get_constant_expr (matrix_a->ts.type, matrix_a->ts.kind,
350 &matrix_a->where);
351 init_result_expr (result, 0, NULL);
353 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
354 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
355 while (a && b)
357 /* Copying of expressions is required as operands are free'd
358 by the gfc_arith routines. */
359 switch (result->ts.type)
361 case BT_LOGICAL:
362 result = gfc_or (result,
363 gfc_and (gfc_copy_expr (a),
364 gfc_copy_expr (b)));
365 break;
367 case BT_INTEGER:
368 case BT_REAL:
369 case BT_COMPLEX:
370 if (conj_a && a->ts.type == BT_COMPLEX)
371 c = gfc_simplify_conjg (a);
372 else
373 c = gfc_copy_expr (a);
374 result = gfc_add (result, gfc_multiply (c, gfc_copy_expr (b)));
375 break;
377 default:
378 gcc_unreachable();
381 offset_a += stride_a;
382 a = gfc_constructor_lookup_expr (matrix_a->value.constructor, offset_a);
384 offset_b += stride_b;
385 b = gfc_constructor_lookup_expr (matrix_b->value.constructor, offset_b);
388 return result;
392 /* Build a result expression for transformational intrinsics,
393 depending on DIM. */
395 static gfc_expr *
396 transformational_result (gfc_expr *array, gfc_expr *dim, bt type,
397 int kind, locus* where)
399 gfc_expr *result;
400 int i, nelem;
402 if (!dim || array->rank == 1)
403 return gfc_get_constant_expr (type, kind, where);
405 result = gfc_get_array_expr (type, kind, where);
406 result->shape = gfc_copy_shape_excluding (array->shape, array->rank, dim);
407 result->rank = array->rank - 1;
409 /* gfc_array_size() would count the number of elements in the constructor,
410 we have not built those yet. */
411 nelem = 1;
412 for (i = 0; i < result->rank; ++i)
413 nelem *= mpz_get_ui (result->shape[i]);
415 for (i = 0; i < nelem; ++i)
417 gfc_constructor_append_expr (&result->value.constructor,
418 gfc_get_constant_expr (type, kind, where),
419 NULL);
422 return result;
426 typedef gfc_expr* (*transformational_op)(gfc_expr*, gfc_expr*);
428 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
429 of COUNT intrinsic is .TRUE..
431 Interface and implementation mimics arith functions as
432 gfc_add, gfc_multiply, etc. */
434 static gfc_expr* gfc_count (gfc_expr *op1, gfc_expr *op2)
436 gfc_expr *result;
438 gcc_assert (op1->ts.type == BT_INTEGER);
439 gcc_assert (op2->ts.type == BT_LOGICAL);
440 gcc_assert (op2->value.logical);
442 result = gfc_copy_expr (op1);
443 mpz_add_ui (result->value.integer, result->value.integer, 1);
445 gfc_free_expr (op1);
446 gfc_free_expr (op2);
447 return result;
451 /* Transforms an ARRAY with operation OP, according to MASK, to a
452 scalar RESULT. E.g. called if
454 REAL, PARAMETER :: array(n, m) = ...
455 REAL, PARAMETER :: s = SUM(array)
457 where OP == gfc_add(). */
459 static gfc_expr *
460 simplify_transformation_to_scalar (gfc_expr *result, gfc_expr *array, gfc_expr *mask,
461 transformational_op op)
463 gfc_expr *a, *m;
464 gfc_constructor *array_ctor, *mask_ctor;
466 /* Shortcut for constant .FALSE. MASK. */
467 if (mask
468 && mask->expr_type == EXPR_CONSTANT
469 && !mask->value.logical)
470 return result;
472 array_ctor = gfc_constructor_first (array->value.constructor);
473 mask_ctor = NULL;
474 if (mask && mask->expr_type == EXPR_ARRAY)
475 mask_ctor = gfc_constructor_first (mask->value.constructor);
477 while (array_ctor)
479 a = array_ctor->expr;
480 array_ctor = gfc_constructor_next (array_ctor);
482 /* A constant MASK equals .TRUE. here and can be ignored. */
483 if (mask_ctor)
485 m = mask_ctor->expr;
486 mask_ctor = gfc_constructor_next (mask_ctor);
487 if (!m->value.logical)
488 continue;
491 result = op (result, gfc_copy_expr (a));
492 if (!result)
493 return result;
496 return result;
499 /* Transforms an ARRAY with operation OP, according to MASK, to an
500 array RESULT. E.g. called if
502 REAL, PARAMETER :: array(n, m) = ...
503 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
505 where OP == gfc_multiply().
506 The result might be post processed using post_op. */
508 static gfc_expr *
509 simplify_transformation_to_array (gfc_expr *result, gfc_expr *array, gfc_expr *dim,
510 gfc_expr *mask, transformational_op op,
511 transformational_op post_op)
513 mpz_t size;
514 int done, i, n, arraysize, resultsize, dim_index, dim_extent, dim_stride;
515 gfc_expr **arrayvec, **resultvec, **base, **src, **dest;
516 gfc_constructor *array_ctor, *mask_ctor, *result_ctor;
518 int count[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS],
519 sstride[GFC_MAX_DIMENSIONS], dstride[GFC_MAX_DIMENSIONS],
520 tmpstride[GFC_MAX_DIMENSIONS];
522 /* Shortcut for constant .FALSE. MASK. */
523 if (mask
524 && mask->expr_type == EXPR_CONSTANT
525 && !mask->value.logical)
526 return result;
528 /* Build an indexed table for array element expressions to minimize
529 linked-list traversal. Masked elements are set to NULL. */
530 gfc_array_size (array, &size);
531 arraysize = mpz_get_ui (size);
532 mpz_clear (size);
534 arrayvec = XCNEWVEC (gfc_expr*, arraysize);
536 array_ctor = gfc_constructor_first (array->value.constructor);
537 mask_ctor = NULL;
538 if (mask && mask->expr_type == EXPR_ARRAY)
539 mask_ctor = gfc_constructor_first (mask->value.constructor);
541 for (i = 0; i < arraysize; ++i)
543 arrayvec[i] = array_ctor->expr;
544 array_ctor = gfc_constructor_next (array_ctor);
546 if (mask_ctor)
548 if (!mask_ctor->expr->value.logical)
549 arrayvec[i] = NULL;
551 mask_ctor = gfc_constructor_next (mask_ctor);
555 /* Same for the result expression. */
556 gfc_array_size (result, &size);
557 resultsize = mpz_get_ui (size);
558 mpz_clear (size);
560 resultvec = XCNEWVEC (gfc_expr*, resultsize);
561 result_ctor = gfc_constructor_first (result->value.constructor);
562 for (i = 0; i < resultsize; ++i)
564 resultvec[i] = result_ctor->expr;
565 result_ctor = gfc_constructor_next (result_ctor);
568 gfc_extract_int (dim, &dim_index);
569 dim_index -= 1; /* zero-base index */
570 dim_extent = 0;
571 dim_stride = 0;
573 for (i = 0, n = 0; i < array->rank; ++i)
575 count[i] = 0;
576 tmpstride[i] = (i == 0) ? 1 : tmpstride[i-1] * mpz_get_si (array->shape[i-1]);
577 if (i == dim_index)
579 dim_extent = mpz_get_si (array->shape[i]);
580 dim_stride = tmpstride[i];
581 continue;
584 extent[n] = mpz_get_si (array->shape[i]);
585 sstride[n] = tmpstride[i];
586 dstride[n] = (n == 0) ? 1 : dstride[n-1] * extent[n-1];
587 n += 1;
590 done = false;
591 base = arrayvec;
592 dest = resultvec;
593 while (!done)
595 for (src = base, n = 0; n < dim_extent; src += dim_stride, ++n)
596 if (*src)
597 *dest = op (*dest, gfc_copy_expr (*src));
599 count[0]++;
600 base += sstride[0];
601 dest += dstride[0];
603 n = 0;
604 while (!done && count[n] == extent[n])
606 count[n] = 0;
607 base -= sstride[n] * extent[n];
608 dest -= dstride[n] * extent[n];
610 n++;
611 if (n < result->rank)
613 count [n]++;
614 base += sstride[n];
615 dest += dstride[n];
617 else
618 done = true;
622 /* Place updated expression in result constructor. */
623 result_ctor = gfc_constructor_first (result->value.constructor);
624 for (i = 0; i < resultsize; ++i)
626 if (post_op)
627 result_ctor->expr = post_op (result_ctor->expr, resultvec[i]);
628 else
629 result_ctor->expr = resultvec[i];
630 result_ctor = gfc_constructor_next (result_ctor);
633 free (arrayvec);
634 free (resultvec);
635 return result;
639 static gfc_expr *
640 simplify_transformation (gfc_expr *array, gfc_expr *dim, gfc_expr *mask,
641 int init_val, transformational_op op)
643 gfc_expr *result;
645 if (!is_constant_array_expr (array)
646 || !gfc_is_constant_expr (dim))
647 return NULL;
649 if (mask
650 && !is_constant_array_expr (mask)
651 && mask->expr_type != EXPR_CONSTANT)
652 return NULL;
654 result = transformational_result (array, dim, array->ts.type,
655 array->ts.kind, &array->where);
656 init_result_expr (result, init_val, NULL);
658 return !dim || array->rank == 1 ?
659 simplify_transformation_to_scalar (result, array, mask, op) :
660 simplify_transformation_to_array (result, array, dim, mask, op, NULL);
664 /********************** Simplification functions *****************************/
666 gfc_expr *
667 gfc_simplify_abs (gfc_expr *e)
669 gfc_expr *result;
671 if (e->expr_type != EXPR_CONSTANT)
672 return NULL;
674 switch (e->ts.type)
676 case BT_INTEGER:
677 result = gfc_get_constant_expr (BT_INTEGER, e->ts.kind, &e->where);
678 mpz_abs (result->value.integer, e->value.integer);
679 return range_check (result, "IABS");
681 case BT_REAL:
682 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
683 mpfr_abs (result->value.real, e->value.real, GFC_RND_MODE);
684 return range_check (result, "ABS");
686 case BT_COMPLEX:
687 gfc_set_model_kind (e->ts.kind);
688 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
689 mpc_abs (result->value.real, e->value.complex, GFC_RND_MODE);
690 return range_check (result, "CABS");
692 default:
693 gfc_internal_error ("gfc_simplify_abs(): Bad type");
698 static gfc_expr *
699 simplify_achar_char (gfc_expr *e, gfc_expr *k, const char *name, bool ascii)
701 gfc_expr *result;
702 int kind;
703 bool too_large = false;
705 if (e->expr_type != EXPR_CONSTANT)
706 return NULL;
708 kind = get_kind (BT_CHARACTER, k, name, gfc_default_character_kind);
709 if (kind == -1)
710 return &gfc_bad_expr;
712 if (mpz_cmp_si (e->value.integer, 0) < 0)
714 gfc_error ("Argument of %s function at %L is negative", name,
715 &e->where);
716 return &gfc_bad_expr;
719 if (ascii && warn_surprising && mpz_cmp_si (e->value.integer, 127) > 0)
720 gfc_warning (OPT_Wsurprising,
721 "Argument of %s function at %L outside of range [0,127]",
722 name, &e->where);
724 if (kind == 1 && mpz_cmp_si (e->value.integer, 255) > 0)
725 too_large = true;
726 else if (kind == 4)
728 mpz_t t;
729 mpz_init_set_ui (t, 2);
730 mpz_pow_ui (t, t, 32);
731 mpz_sub_ui (t, t, 1);
732 if (mpz_cmp (e->value.integer, t) > 0)
733 too_large = true;
734 mpz_clear (t);
737 if (too_large)
739 gfc_error ("Argument of %s function at %L is too large for the "
740 "collating sequence of kind %d", name, &e->where, kind);
741 return &gfc_bad_expr;
744 result = gfc_get_character_expr (kind, &e->where, NULL, 1);
745 result->value.character.string[0] = mpz_get_ui (e->value.integer);
747 return result;
752 /* We use the processor's collating sequence, because all
753 systems that gfortran currently works on are ASCII. */
755 gfc_expr *
756 gfc_simplify_achar (gfc_expr *e, gfc_expr *k)
758 return simplify_achar_char (e, k, "ACHAR", true);
762 gfc_expr *
763 gfc_simplify_acos (gfc_expr *x)
765 gfc_expr *result;
767 if (x->expr_type != EXPR_CONSTANT)
768 return NULL;
770 switch (x->ts.type)
772 case BT_REAL:
773 if (mpfr_cmp_si (x->value.real, 1) > 0
774 || mpfr_cmp_si (x->value.real, -1) < 0)
776 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
777 &x->where);
778 return &gfc_bad_expr;
780 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
781 mpfr_acos (result->value.real, x->value.real, GFC_RND_MODE);
782 break;
784 case BT_COMPLEX:
785 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
786 mpc_acos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
787 break;
789 default:
790 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
793 return range_check (result, "ACOS");
796 gfc_expr *
797 gfc_simplify_acosh (gfc_expr *x)
799 gfc_expr *result;
801 if (x->expr_type != EXPR_CONSTANT)
802 return NULL;
804 switch (x->ts.type)
806 case BT_REAL:
807 if (mpfr_cmp_si (x->value.real, 1) < 0)
809 gfc_error ("Argument of ACOSH at %L must not be less than 1",
810 &x->where);
811 return &gfc_bad_expr;
814 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
815 mpfr_acosh (result->value.real, x->value.real, GFC_RND_MODE);
816 break;
818 case BT_COMPLEX:
819 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
820 mpc_acosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
821 break;
823 default:
824 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
827 return range_check (result, "ACOSH");
830 gfc_expr *
831 gfc_simplify_adjustl (gfc_expr *e)
833 gfc_expr *result;
834 int count, i, len;
835 gfc_char_t ch;
837 if (e->expr_type != EXPR_CONSTANT)
838 return NULL;
840 len = e->value.character.length;
842 for (count = 0, i = 0; i < len; ++i)
844 ch = e->value.character.string[i];
845 if (ch != ' ')
846 break;
847 ++count;
850 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
851 for (i = 0; i < len - count; ++i)
852 result->value.character.string[i] = e->value.character.string[count + i];
854 return result;
858 gfc_expr *
859 gfc_simplify_adjustr (gfc_expr *e)
861 gfc_expr *result;
862 int count, i, len;
863 gfc_char_t ch;
865 if (e->expr_type != EXPR_CONSTANT)
866 return NULL;
868 len = e->value.character.length;
870 for (count = 0, i = len - 1; i >= 0; --i)
872 ch = e->value.character.string[i];
873 if (ch != ' ')
874 break;
875 ++count;
878 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, len);
879 for (i = 0; i < count; ++i)
880 result->value.character.string[i] = ' ';
882 for (i = count; i < len; ++i)
883 result->value.character.string[i] = e->value.character.string[i - count];
885 return result;
889 gfc_expr *
890 gfc_simplify_aimag (gfc_expr *e)
892 gfc_expr *result;
894 if (e->expr_type != EXPR_CONSTANT)
895 return NULL;
897 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
898 mpfr_set (result->value.real, mpc_imagref (e->value.complex), GFC_RND_MODE);
900 return range_check (result, "AIMAG");
904 gfc_expr *
905 gfc_simplify_aint (gfc_expr *e, gfc_expr *k)
907 gfc_expr *rtrunc, *result;
908 int kind;
910 kind = get_kind (BT_REAL, k, "AINT", e->ts.kind);
911 if (kind == -1)
912 return &gfc_bad_expr;
914 if (e->expr_type != EXPR_CONSTANT)
915 return NULL;
917 rtrunc = gfc_copy_expr (e);
918 mpfr_trunc (rtrunc->value.real, e->value.real);
920 result = gfc_real2real (rtrunc, kind);
922 gfc_free_expr (rtrunc);
924 return range_check (result, "AINT");
928 gfc_expr *
929 gfc_simplify_all (gfc_expr *mask, gfc_expr *dim)
931 return simplify_transformation (mask, dim, NULL, true, gfc_and);
935 gfc_expr *
936 gfc_simplify_dint (gfc_expr *e)
938 gfc_expr *rtrunc, *result;
940 if (e->expr_type != EXPR_CONSTANT)
941 return NULL;
943 rtrunc = gfc_copy_expr (e);
944 mpfr_trunc (rtrunc->value.real, e->value.real);
946 result = gfc_real2real (rtrunc, gfc_default_double_kind);
948 gfc_free_expr (rtrunc);
950 return range_check (result, "DINT");
954 gfc_expr *
955 gfc_simplify_dreal (gfc_expr *e)
957 gfc_expr *result = NULL;
959 if (e->expr_type != EXPR_CONSTANT)
960 return NULL;
962 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
963 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
965 return range_check (result, "DREAL");
969 gfc_expr *
970 gfc_simplify_anint (gfc_expr *e, gfc_expr *k)
972 gfc_expr *result;
973 int kind;
975 kind = get_kind (BT_REAL, k, "ANINT", e->ts.kind);
976 if (kind == -1)
977 return &gfc_bad_expr;
979 if (e->expr_type != EXPR_CONSTANT)
980 return NULL;
982 result = gfc_get_constant_expr (e->ts.type, kind, &e->where);
983 mpfr_round (result->value.real, e->value.real);
985 return range_check (result, "ANINT");
989 gfc_expr *
990 gfc_simplify_and (gfc_expr *x, gfc_expr *y)
992 gfc_expr *result;
993 int kind;
995 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
996 return NULL;
998 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
1000 switch (x->ts.type)
1002 case BT_INTEGER:
1003 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
1004 mpz_and (result->value.integer, x->value.integer, y->value.integer);
1005 return range_check (result, "AND");
1007 case BT_LOGICAL:
1008 return gfc_get_logical_expr (kind, &x->where,
1009 x->value.logical && y->value.logical);
1011 default:
1012 gcc_unreachable ();
1017 gfc_expr *
1018 gfc_simplify_any (gfc_expr *mask, gfc_expr *dim)
1020 return simplify_transformation (mask, dim, NULL, false, gfc_or);
1024 gfc_expr *
1025 gfc_simplify_dnint (gfc_expr *e)
1027 gfc_expr *result;
1029 if (e->expr_type != EXPR_CONSTANT)
1030 return NULL;
1032 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &e->where);
1033 mpfr_round (result->value.real, e->value.real);
1035 return range_check (result, "DNINT");
1039 gfc_expr *
1040 gfc_simplify_asin (gfc_expr *x)
1042 gfc_expr *result;
1044 if (x->expr_type != EXPR_CONSTANT)
1045 return NULL;
1047 switch (x->ts.type)
1049 case BT_REAL:
1050 if (mpfr_cmp_si (x->value.real, 1) > 0
1051 || mpfr_cmp_si (x->value.real, -1) < 0)
1053 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1054 &x->where);
1055 return &gfc_bad_expr;
1057 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1058 mpfr_asin (result->value.real, x->value.real, GFC_RND_MODE);
1059 break;
1061 case BT_COMPLEX:
1062 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1063 mpc_asin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1064 break;
1066 default:
1067 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1070 return range_check (result, "ASIN");
1074 gfc_expr *
1075 gfc_simplify_asinh (gfc_expr *x)
1077 gfc_expr *result;
1079 if (x->expr_type != EXPR_CONSTANT)
1080 return NULL;
1082 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1084 switch (x->ts.type)
1086 case BT_REAL:
1087 mpfr_asinh (result->value.real, x->value.real, GFC_RND_MODE);
1088 break;
1090 case BT_COMPLEX:
1091 mpc_asinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1092 break;
1094 default:
1095 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1098 return range_check (result, "ASINH");
1102 gfc_expr *
1103 gfc_simplify_atan (gfc_expr *x)
1105 gfc_expr *result;
1107 if (x->expr_type != EXPR_CONSTANT)
1108 return NULL;
1110 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1112 switch (x->ts.type)
1114 case BT_REAL:
1115 mpfr_atan (result->value.real, x->value.real, GFC_RND_MODE);
1116 break;
1118 case BT_COMPLEX:
1119 mpc_atan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1120 break;
1122 default:
1123 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1126 return range_check (result, "ATAN");
1130 gfc_expr *
1131 gfc_simplify_atanh (gfc_expr *x)
1133 gfc_expr *result;
1135 if (x->expr_type != EXPR_CONSTANT)
1136 return NULL;
1138 switch (x->ts.type)
1140 case BT_REAL:
1141 if (mpfr_cmp_si (x->value.real, 1) >= 0
1142 || mpfr_cmp_si (x->value.real, -1) <= 0)
1144 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1145 "to 1", &x->where);
1146 return &gfc_bad_expr;
1148 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1149 mpfr_atanh (result->value.real, x->value.real, GFC_RND_MODE);
1150 break;
1152 case BT_COMPLEX:
1153 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1154 mpc_atanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1155 break;
1157 default:
1158 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1161 return range_check (result, "ATANH");
1165 gfc_expr *
1166 gfc_simplify_atan2 (gfc_expr *y, gfc_expr *x)
1168 gfc_expr *result;
1170 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
1171 return NULL;
1173 if (mpfr_zero_p (y->value.real) && mpfr_zero_p (x->value.real))
1175 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1176 "second argument must not be zero", &x->where);
1177 return &gfc_bad_expr;
1180 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1181 mpfr_atan2 (result->value.real, y->value.real, x->value.real, GFC_RND_MODE);
1183 return range_check (result, "ATAN2");
1187 gfc_expr *
1188 gfc_simplify_bessel_j0 (gfc_expr *x)
1190 gfc_expr *result;
1192 if (x->expr_type != EXPR_CONSTANT)
1193 return NULL;
1195 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1196 mpfr_j0 (result->value.real, x->value.real, GFC_RND_MODE);
1198 return range_check (result, "BESSEL_J0");
1202 gfc_expr *
1203 gfc_simplify_bessel_j1 (gfc_expr *x)
1205 gfc_expr *result;
1207 if (x->expr_type != EXPR_CONSTANT)
1208 return NULL;
1210 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1211 mpfr_j1 (result->value.real, x->value.real, GFC_RND_MODE);
1213 return range_check (result, "BESSEL_J1");
1217 gfc_expr *
1218 gfc_simplify_bessel_jn (gfc_expr *order, gfc_expr *x)
1220 gfc_expr *result;
1221 long n;
1223 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1224 return NULL;
1226 n = mpz_get_si (order->value.integer);
1227 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1228 mpfr_jn (result->value.real, n, x->value.real, GFC_RND_MODE);
1230 return range_check (result, "BESSEL_JN");
1234 /* Simplify transformational form of JN and YN. */
1236 static gfc_expr *
1237 gfc_simplify_bessel_n2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x,
1238 bool jn)
1240 gfc_expr *result;
1241 gfc_expr *e;
1242 long n1, n2;
1243 int i;
1244 mpfr_t x2rev, last1, last2;
1246 if (x->expr_type != EXPR_CONSTANT || order1->expr_type != EXPR_CONSTANT
1247 || order2->expr_type != EXPR_CONSTANT)
1248 return NULL;
1250 n1 = mpz_get_si (order1->value.integer);
1251 n2 = mpz_get_si (order2->value.integer);
1252 result = gfc_get_array_expr (x->ts.type, x->ts.kind, &x->where);
1253 result->rank = 1;
1254 result->shape = gfc_get_shape (1);
1255 mpz_init_set_ui (result->shape[0], MAX (n2-n1+1, 0));
1257 if (n2 < n1)
1258 return result;
1260 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1261 YN(N, 0.0) = -Inf. */
1263 if (mpfr_cmp_ui (x->value.real, 0.0) == 0)
1265 if (!jn && flag_range_check)
1267 gfc_error ("Result of BESSEL_YN is -INF at %L", &result->where);
1268 gfc_free_expr (result);
1269 return &gfc_bad_expr;
1272 if (jn && n1 == 0)
1274 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1275 mpfr_set_ui (e->value.real, 1, GFC_RND_MODE);
1276 gfc_constructor_append_expr (&result->value.constructor, e,
1277 &x->where);
1278 n1++;
1281 for (i = n1; i <= n2; i++)
1283 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1284 if (jn)
1285 mpfr_set_ui (e->value.real, 0, GFC_RND_MODE);
1286 else
1287 mpfr_set_inf (e->value.real, -1);
1288 gfc_constructor_append_expr (&result->value.constructor, e,
1289 &x->where);
1292 return result;
1295 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1296 are stable for downward recursion and Neumann functions are stable
1297 for upward recursion. It is
1298 x2rev = 2.0/x,
1299 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1300 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1301 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1303 gfc_set_model_kind (x->ts.kind);
1305 /* Get first recursion anchor. */
1307 mpfr_init (last1);
1308 if (jn)
1309 mpfr_jn (last1, n2, x->value.real, GFC_RND_MODE);
1310 else
1311 mpfr_yn (last1, n1, x->value.real, GFC_RND_MODE);
1313 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1314 mpfr_set (e->value.real, last1, GFC_RND_MODE);
1315 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1317 mpfr_clear (last1);
1318 gfc_free_expr (e);
1319 gfc_free_expr (result);
1320 return &gfc_bad_expr;
1322 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1324 if (n1 == n2)
1326 mpfr_clear (last1);
1327 return result;
1330 /* Get second recursion anchor. */
1332 mpfr_init (last2);
1333 if (jn)
1334 mpfr_jn (last2, n2-1, x->value.real, GFC_RND_MODE);
1335 else
1336 mpfr_yn (last2, n1+1, x->value.real, GFC_RND_MODE);
1338 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1339 mpfr_set (e->value.real, last2, GFC_RND_MODE);
1340 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1342 mpfr_clear (last1);
1343 mpfr_clear (last2);
1344 gfc_free_expr (e);
1345 gfc_free_expr (result);
1346 return &gfc_bad_expr;
1348 if (jn)
1349 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where, -2);
1350 else
1351 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1353 if (n1 + 1 == n2)
1355 mpfr_clear (last1);
1356 mpfr_clear (last2);
1357 return result;
1360 /* Start actual recursion. */
1362 mpfr_init (x2rev);
1363 mpfr_ui_div (x2rev, 2, x->value.real, GFC_RND_MODE);
1365 for (i = 2; i <= n2-n1; i++)
1367 e = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1369 /* Special case: For YN, if the previous N gave -INF, set
1370 also N+1 to -INF. */
1371 if (!jn && !flag_range_check && mpfr_inf_p (last2))
1373 mpfr_set_inf (e->value.real, -1);
1374 gfc_constructor_append_expr (&result->value.constructor, e,
1375 &x->where);
1376 continue;
1379 mpfr_mul_si (e->value.real, x2rev, jn ? (n2-i+1) : (n1+i-1),
1380 GFC_RND_MODE);
1381 mpfr_mul (e->value.real, e->value.real, last2, GFC_RND_MODE);
1382 mpfr_sub (e->value.real, e->value.real, last1, GFC_RND_MODE);
1384 if (range_check (e, jn ? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr)
1386 /* Range_check frees "e" in that case. */
1387 e = NULL;
1388 goto error;
1391 if (jn)
1392 gfc_constructor_insert_expr (&result->value.constructor, e, &x->where,
1393 -i-1);
1394 else
1395 gfc_constructor_append_expr (&result->value.constructor, e, &x->where);
1397 mpfr_set (last1, last2, GFC_RND_MODE);
1398 mpfr_set (last2, e->value.real, GFC_RND_MODE);
1401 mpfr_clear (last1);
1402 mpfr_clear (last2);
1403 mpfr_clear (x2rev);
1404 return result;
1406 error:
1407 mpfr_clear (last1);
1408 mpfr_clear (last2);
1409 mpfr_clear (x2rev);
1410 gfc_free_expr (e);
1411 gfc_free_expr (result);
1412 return &gfc_bad_expr;
1416 gfc_expr *
1417 gfc_simplify_bessel_jn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1419 return gfc_simplify_bessel_n2 (order1, order2, x, true);
1423 gfc_expr *
1424 gfc_simplify_bessel_y0 (gfc_expr *x)
1426 gfc_expr *result;
1428 if (x->expr_type != EXPR_CONSTANT)
1429 return NULL;
1431 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1432 mpfr_y0 (result->value.real, x->value.real, GFC_RND_MODE);
1434 return range_check (result, "BESSEL_Y0");
1438 gfc_expr *
1439 gfc_simplify_bessel_y1 (gfc_expr *x)
1441 gfc_expr *result;
1443 if (x->expr_type != EXPR_CONSTANT)
1444 return NULL;
1446 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1447 mpfr_y1 (result->value.real, x->value.real, GFC_RND_MODE);
1449 return range_check (result, "BESSEL_Y1");
1453 gfc_expr *
1454 gfc_simplify_bessel_yn (gfc_expr *order, gfc_expr *x)
1456 gfc_expr *result;
1457 long n;
1459 if (x->expr_type != EXPR_CONSTANT || order->expr_type != EXPR_CONSTANT)
1460 return NULL;
1462 n = mpz_get_si (order->value.integer);
1463 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1464 mpfr_yn (result->value.real, n, x->value.real, GFC_RND_MODE);
1466 return range_check (result, "BESSEL_YN");
1470 gfc_expr *
1471 gfc_simplify_bessel_yn2 (gfc_expr *order1, gfc_expr *order2, gfc_expr *x)
1473 return gfc_simplify_bessel_n2 (order1, order2, x, false);
1477 gfc_expr *
1478 gfc_simplify_bit_size (gfc_expr *e)
1480 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
1481 return gfc_get_int_expr (e->ts.kind, &e->where,
1482 gfc_integer_kinds[i].bit_size);
1486 gfc_expr *
1487 gfc_simplify_btest (gfc_expr *e, gfc_expr *bit)
1489 int b;
1491 if (e->expr_type != EXPR_CONSTANT || bit->expr_type != EXPR_CONSTANT)
1492 return NULL;
1494 if (gfc_extract_int (bit, &b) != NULL || b < 0)
1495 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where, false);
1497 return gfc_get_logical_expr (gfc_default_logical_kind, &e->where,
1498 mpz_tstbit (e->value.integer, b));
1502 static int
1503 compare_bitwise (gfc_expr *i, gfc_expr *j)
1505 mpz_t x, y;
1506 int k, res;
1508 gcc_assert (i->ts.type == BT_INTEGER);
1509 gcc_assert (j->ts.type == BT_INTEGER);
1511 mpz_init_set (x, i->value.integer);
1512 k = gfc_validate_kind (i->ts.type, i->ts.kind, false);
1513 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
1515 mpz_init_set (y, j->value.integer);
1516 k = gfc_validate_kind (j->ts.type, j->ts.kind, false);
1517 convert_mpz_to_unsigned (y, gfc_integer_kinds[k].bit_size);
1519 res = mpz_cmp (x, y);
1520 mpz_clear (x);
1521 mpz_clear (y);
1522 return res;
1526 gfc_expr *
1527 gfc_simplify_bge (gfc_expr *i, gfc_expr *j)
1529 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1530 return NULL;
1532 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1533 compare_bitwise (i, j) >= 0);
1537 gfc_expr *
1538 gfc_simplify_bgt (gfc_expr *i, gfc_expr *j)
1540 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1541 return NULL;
1543 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1544 compare_bitwise (i, j) > 0);
1548 gfc_expr *
1549 gfc_simplify_ble (gfc_expr *i, gfc_expr *j)
1551 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1552 return NULL;
1554 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1555 compare_bitwise (i, j) <= 0);
1559 gfc_expr *
1560 gfc_simplify_blt (gfc_expr *i, gfc_expr *j)
1562 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT)
1563 return NULL;
1565 return gfc_get_logical_expr (gfc_default_logical_kind, &i->where,
1566 compare_bitwise (i, j) < 0);
1570 gfc_expr *
1571 gfc_simplify_ceiling (gfc_expr *e, gfc_expr *k)
1573 gfc_expr *ceil, *result;
1574 int kind;
1576 kind = get_kind (BT_INTEGER, k, "CEILING", gfc_default_integer_kind);
1577 if (kind == -1)
1578 return &gfc_bad_expr;
1580 if (e->expr_type != EXPR_CONSTANT)
1581 return NULL;
1583 ceil = gfc_copy_expr (e);
1584 mpfr_ceil (ceil->value.real, e->value.real);
1586 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
1587 gfc_mpfr_to_mpz (result->value.integer, ceil->value.real, &e->where);
1589 gfc_free_expr (ceil);
1591 return range_check (result, "CEILING");
1595 gfc_expr *
1596 gfc_simplify_char (gfc_expr *e, gfc_expr *k)
1598 return simplify_achar_char (e, k, "CHAR", false);
1602 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1604 static gfc_expr *
1605 simplify_cmplx (const char *name, gfc_expr *x, gfc_expr *y, int kind)
1607 gfc_expr *result;
1609 if (convert_boz (x, kind) == &gfc_bad_expr)
1610 return &gfc_bad_expr;
1612 if (convert_boz (y, kind) == &gfc_bad_expr)
1613 return &gfc_bad_expr;
1615 if (x->expr_type != EXPR_CONSTANT
1616 || (y != NULL && y->expr_type != EXPR_CONSTANT))
1617 return NULL;
1619 result = gfc_get_constant_expr (BT_COMPLEX, kind, &x->where);
1621 switch (x->ts.type)
1623 case BT_INTEGER:
1624 mpc_set_z (result->value.complex, x->value.integer, GFC_MPC_RND_MODE);
1625 break;
1627 case BT_REAL:
1628 mpc_set_fr (result->value.complex, x->value.real, GFC_RND_MODE);
1629 break;
1631 case BT_COMPLEX:
1632 mpc_set (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1633 break;
1635 default:
1636 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1639 if (!y)
1640 return range_check (result, name);
1642 switch (y->ts.type)
1644 case BT_INTEGER:
1645 mpfr_set_z (mpc_imagref (result->value.complex),
1646 y->value.integer, GFC_RND_MODE);
1647 break;
1649 case BT_REAL:
1650 mpfr_set (mpc_imagref (result->value.complex),
1651 y->value.real, GFC_RND_MODE);
1652 break;
1654 default:
1655 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1658 return range_check (result, name);
1662 gfc_expr *
1663 gfc_simplify_cmplx (gfc_expr *x, gfc_expr *y, gfc_expr *k)
1665 int kind;
1667 kind = get_kind (BT_REAL, k, "CMPLX", gfc_default_complex_kind);
1668 if (kind == -1)
1669 return &gfc_bad_expr;
1671 return simplify_cmplx ("CMPLX", x, y, kind);
1675 gfc_expr *
1676 gfc_simplify_complex (gfc_expr *x, gfc_expr *y)
1678 int kind;
1680 if (x->ts.type == BT_INTEGER && y->ts.type == BT_INTEGER)
1681 kind = gfc_default_complex_kind;
1682 else if (x->ts.type == BT_REAL || y->ts.type == BT_INTEGER)
1683 kind = x->ts.kind;
1684 else if (x->ts.type == BT_INTEGER || y->ts.type == BT_REAL)
1685 kind = y->ts.kind;
1686 else if (x->ts.type == BT_REAL && y->ts.type == BT_REAL)
1687 kind = (x->ts.kind > y->ts.kind) ? x->ts.kind : y->ts.kind;
1688 else
1689 gcc_unreachable ();
1691 return simplify_cmplx ("COMPLEX", x, y, kind);
1695 gfc_expr *
1696 gfc_simplify_conjg (gfc_expr *e)
1698 gfc_expr *result;
1700 if (e->expr_type != EXPR_CONSTANT)
1701 return NULL;
1703 result = gfc_copy_expr (e);
1704 mpc_conj (result->value.complex, result->value.complex, GFC_MPC_RND_MODE);
1706 return range_check (result, "CONJG");
1709 /* Return the simplification of the constant expression in icall, or NULL
1710 if the expression is not constant. */
1712 static gfc_expr *
1713 simplify_trig_call (gfc_expr *icall)
1715 gfc_isym_id func = icall->value.function.isym->id;
1716 gfc_expr *x = icall->value.function.actual->expr;
1718 /* The actual simplifiers will return NULL for non-constant x. */
1719 switch (func)
1721 case GFC_ISYM_ACOS:
1722 return gfc_simplify_acos (x);
1723 case GFC_ISYM_ASIN:
1724 return gfc_simplify_asin (x);
1725 case GFC_ISYM_ATAN:
1726 return gfc_simplify_atan (x);
1727 case GFC_ISYM_COS:
1728 return gfc_simplify_cos (x);
1729 case GFC_ISYM_COTAN:
1730 return gfc_simplify_cotan (x);
1731 case GFC_ISYM_SIN:
1732 return gfc_simplify_sin (x);
1733 case GFC_ISYM_TAN:
1734 return gfc_simplify_tan (x);
1735 default:
1736 break;
1739 gfc_internal_error ("in simplify_trig_call(): Bad intrinsic");
1740 return NULL;
1743 /* Convert a floating-point number from radians to degrees. */
1745 static void
1746 degrees_f (mpfr_t x, mp_rnd_t rnd_mode)
1748 mpfr_t tmp;
1749 mpfr_init (tmp);
1751 /* Set x = x % 2pi to avoid offsets with large angles. */
1752 mpfr_const_pi (tmp, rnd_mode);
1753 mpfr_mul_ui (tmp, tmp, 2, rnd_mode);
1754 mpfr_fmod (tmp, x, tmp, rnd_mode);
1756 /* Set x = x * 180. */
1757 mpfr_mul_ui (x, x, 180, rnd_mode);
1759 /* Set x = x / pi. */
1760 mpfr_const_pi (tmp, rnd_mode);
1761 mpfr_div (x, x, tmp, rnd_mode);
1763 mpfr_clear (tmp);
1766 /* Convert a floating-point number from degrees to radians. */
1768 static void
1769 radians_f (mpfr_t x, mp_rnd_t rnd_mode)
1771 mpfr_t tmp;
1772 mpfr_init (tmp);
1774 /* Set x = x % 360 to avoid offsets with large angles. */
1775 mpfr_set_ui (tmp, 360, rnd_mode);
1776 mpfr_fmod (tmp, x, tmp, rnd_mode);
1778 /* Set x = x * pi. */
1779 mpfr_const_pi (tmp, rnd_mode);
1780 mpfr_mul (x, x, tmp, rnd_mode);
1782 /* Set x = x / 180. */
1783 mpfr_div_ui (x, x, 180, rnd_mode);
1785 mpfr_clear (tmp);
1789 /* Convert argument to radians before calling a trig function. */
1791 gfc_expr *
1792 gfc_simplify_trigd (gfc_expr *icall)
1794 gfc_expr *arg;
1796 arg = icall->value.function.actual->expr;
1798 if (arg->ts.type != BT_REAL)
1799 gfc_internal_error ("in gfc_simplify_trigd(): Bad type");
1801 if (arg->expr_type == EXPR_CONSTANT)
1802 /* Convert constant to radians before passing off to simplifier. */
1803 radians_f (arg->value.real, GFC_RND_MODE);
1805 /* Let the usual simplifier take over - we just simplified the arg. */
1806 return simplify_trig_call (icall);
1809 /* Convert result of an inverse trig function to degrees. */
1811 gfc_expr *
1812 gfc_simplify_atrigd (gfc_expr *icall)
1814 gfc_expr *result;
1816 if (icall->value.function.actual->expr->ts.type != BT_REAL)
1817 gfc_internal_error ("in gfc_simplify_atrigd(): Bad type");
1819 /* See if another simplifier has work to do first. */
1820 result = simplify_trig_call (icall);
1822 if (result && result->expr_type == EXPR_CONSTANT)
1824 /* Convert constant to degrees after passing off to actual simplifier. */
1825 degrees_f (result->value.real, GFC_RND_MODE);
1826 return result;
1829 /* Let gfc_resolve_atrigd take care of the non-constant case. */
1830 return NULL;
1833 /* Convert the result of atan2 to degrees. */
1835 gfc_expr *
1836 gfc_simplify_atan2d (gfc_expr *y, gfc_expr *x)
1838 gfc_expr *result;
1840 if (x->ts.type != BT_REAL || y->ts.type != BT_REAL)
1841 gfc_internal_error ("in gfc_simplify_atan2d(): Bad type");
1843 if (x->expr_type == EXPR_CONSTANT && y->expr_type == EXPR_CONSTANT)
1845 result = gfc_simplify_atan2 (y, x);
1846 if (result != NULL)
1848 degrees_f (result->value.real, GFC_RND_MODE);
1849 return result;
1853 /* Let gfc_resolve_atan2d take care of the non-constant case. */
1854 return NULL;
1857 gfc_expr *
1858 gfc_simplify_cos (gfc_expr *x)
1860 gfc_expr *result;
1862 if (x->expr_type != EXPR_CONSTANT)
1863 return NULL;
1865 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1867 switch (x->ts.type)
1869 case BT_REAL:
1870 mpfr_cos (result->value.real, x->value.real, GFC_RND_MODE);
1871 break;
1873 case BT_COMPLEX:
1874 gfc_set_model_kind (x->ts.kind);
1875 mpc_cos (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1876 break;
1878 default:
1879 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1882 return range_check (result, "COS");
1886 gfc_expr *
1887 gfc_simplify_cosh (gfc_expr *x)
1889 gfc_expr *result;
1891 if (x->expr_type != EXPR_CONSTANT)
1892 return NULL;
1894 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
1896 switch (x->ts.type)
1898 case BT_REAL:
1899 mpfr_cosh (result->value.real, x->value.real, GFC_RND_MODE);
1900 break;
1902 case BT_COMPLEX:
1903 mpc_cosh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
1904 break;
1906 default:
1907 gcc_unreachable ();
1910 return range_check (result, "COSH");
1914 gfc_expr *
1915 gfc_simplify_count (gfc_expr *mask, gfc_expr *dim, gfc_expr *kind)
1917 gfc_expr *result;
1919 if (!is_constant_array_expr (mask)
1920 || !gfc_is_constant_expr (dim)
1921 || !gfc_is_constant_expr (kind))
1922 return NULL;
1924 result = transformational_result (mask, dim,
1925 BT_INTEGER,
1926 get_kind (BT_INTEGER, kind, "COUNT",
1927 gfc_default_integer_kind),
1928 &mask->where);
1930 init_result_expr (result, 0, NULL);
1932 /* Passing MASK twice, once as data array, once as mask.
1933 Whenever gfc_count is called, '1' is added to the result. */
1934 return !dim || mask->rank == 1 ?
1935 simplify_transformation_to_scalar (result, mask, mask, gfc_count) :
1936 simplify_transformation_to_array (result, mask, dim, mask, gfc_count, NULL);
1940 gfc_expr *
1941 gfc_simplify_cshift (gfc_expr *array, gfc_expr *shift, gfc_expr *dim)
1943 gfc_expr *a, *result;
1944 int dm;
1946 /* DIM is only useful for rank > 1, but deal with it here as one can
1947 set DIM = 1 for rank = 1. */
1948 if (dim)
1950 if (!gfc_is_constant_expr (dim))
1951 return NULL;
1952 dm = mpz_get_si (dim->value.integer);
1954 else
1955 dm = 1;
1957 /* Copy array into 'a', simplify it, and then test for a constant array. */
1958 a = gfc_copy_expr (array);
1959 gfc_simplify_expr (a, 0);
1960 if (!is_constant_array_expr (a))
1962 gfc_free_expr (a);
1963 return NULL;
1966 if (a->rank == 1)
1968 gfc_constructor *ca, *cr;
1969 mpz_t size;
1970 int i, j, shft, sz;
1972 if (!gfc_is_constant_expr (shift))
1974 gfc_free_expr (a);
1975 return NULL;
1978 shft = mpz_get_si (shift->value.integer);
1980 /* Case (i): If ARRAY has rank one, element i of the result is
1981 ARRAY (1 + MODULO (i + SHIFT - 1, SIZE (ARRAY))). */
1983 mpz_init (size);
1984 gfc_array_size (a, &size);
1985 sz = mpz_get_si (size);
1986 mpz_clear (size);
1988 /* Adjust shft to deal with right or left shifts. */
1989 shft = shft < 0 ? 1 - shft : shft;
1991 /* Special case: Shift to the original order! */
1992 if (shft % sz == 0)
1993 return a;
1995 result = gfc_copy_expr (a);
1996 cr = gfc_constructor_first (result->value.constructor);
1997 for (i = 0; i < sz; i++, cr = gfc_constructor_next (cr))
1999 j = (i + shft) % sz;
2000 ca = gfc_constructor_first (a->value.constructor);
2001 while (j-- > 0)
2002 ca = gfc_constructor_next (ca);
2003 cr->expr = gfc_copy_expr (ca->expr);
2006 gfc_free_expr (a);
2007 return result;
2009 else
2011 /* FIXME: Deal with rank > 1 arrays. For now, don't leak memory. */
2013 /* GCC bootstrap is too stupid to realize that the above code for dm
2014 is correct. First, dim can be specified for a rank 1 array. It is
2015 not needed in this nor used here. Second, the code is simply waiting
2016 for someone to implement rank > 1 simplification. For now, add a
2017 pessimization to the code that has a zero valid reason to be here. */
2018 if (dm > array->rank)
2019 gcc_unreachable ();
2021 gfc_free_expr (a);
2024 return NULL;
2028 gfc_expr *
2029 gfc_simplify_dcmplx (gfc_expr *x, gfc_expr *y)
2031 return simplify_cmplx ("DCMPLX", x, y, gfc_default_double_kind);
2035 gfc_expr *
2036 gfc_simplify_dble (gfc_expr *e)
2038 gfc_expr *result = NULL;
2040 if (e->expr_type != EXPR_CONSTANT)
2041 return NULL;
2043 if (convert_boz (e, gfc_default_double_kind) == &gfc_bad_expr)
2044 return &gfc_bad_expr;
2046 result = gfc_convert_constant (e, BT_REAL, gfc_default_double_kind);
2047 if (result == &gfc_bad_expr)
2048 return &gfc_bad_expr;
2050 return range_check (result, "DBLE");
2054 gfc_expr *
2055 gfc_simplify_digits (gfc_expr *x)
2057 int i, digits;
2059 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2061 switch (x->ts.type)
2063 case BT_INTEGER:
2064 digits = gfc_integer_kinds[i].digits;
2065 break;
2067 case BT_REAL:
2068 case BT_COMPLEX:
2069 digits = gfc_real_kinds[i].digits;
2070 break;
2072 default:
2073 gcc_unreachable ();
2076 return gfc_get_int_expr (gfc_default_integer_kind, NULL, digits);
2080 gfc_expr *
2081 gfc_simplify_dim (gfc_expr *x, gfc_expr *y)
2083 gfc_expr *result;
2084 int kind;
2086 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2087 return NULL;
2089 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
2090 result = gfc_get_constant_expr (x->ts.type, kind, &x->where);
2092 switch (x->ts.type)
2094 case BT_INTEGER:
2095 if (mpz_cmp (x->value.integer, y->value.integer) > 0)
2096 mpz_sub (result->value.integer, x->value.integer, y->value.integer);
2097 else
2098 mpz_set_ui (result->value.integer, 0);
2100 break;
2102 case BT_REAL:
2103 if (mpfr_cmp (x->value.real, y->value.real) > 0)
2104 mpfr_sub (result->value.real, x->value.real, y->value.real,
2105 GFC_RND_MODE);
2106 else
2107 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
2109 break;
2111 default:
2112 gfc_internal_error ("gfc_simplify_dim(): Bad type");
2115 return range_check (result, "DIM");
2119 gfc_expr*
2120 gfc_simplify_dot_product (gfc_expr *vector_a, gfc_expr *vector_b)
2123 gfc_expr temp;
2125 if (!is_constant_array_expr (vector_a)
2126 || !is_constant_array_expr (vector_b))
2127 return NULL;
2129 gcc_assert (vector_a->rank == 1);
2130 gcc_assert (vector_b->rank == 1);
2132 temp.expr_type = EXPR_OP;
2133 gfc_clear_ts (&temp.ts);
2134 temp.value.op.op = INTRINSIC_NONE;
2135 temp.value.op.op1 = vector_a;
2136 temp.value.op.op2 = vector_b;
2137 gfc_type_convert_binary (&temp, 1);
2139 return compute_dot_product (vector_a, 1, 0, vector_b, 1, 0, true);
2143 gfc_expr *
2144 gfc_simplify_dprod (gfc_expr *x, gfc_expr *y)
2146 gfc_expr *a1, *a2, *result;
2148 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2149 return NULL;
2151 a1 = gfc_real2real (x, gfc_default_double_kind);
2152 a2 = gfc_real2real (y, gfc_default_double_kind);
2154 result = gfc_get_constant_expr (BT_REAL, gfc_default_double_kind, &x->where);
2155 mpfr_mul (result->value.real, a1->value.real, a2->value.real, GFC_RND_MODE);
2157 gfc_free_expr (a2);
2158 gfc_free_expr (a1);
2160 return range_check (result, "DPROD");
2164 static gfc_expr *
2165 simplify_dshift (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg,
2166 bool right)
2168 gfc_expr *result;
2169 int i, k, size, shift;
2171 if (arg1->expr_type != EXPR_CONSTANT || arg2->expr_type != EXPR_CONSTANT
2172 || shiftarg->expr_type != EXPR_CONSTANT)
2173 return NULL;
2175 k = gfc_validate_kind (BT_INTEGER, arg1->ts.kind, false);
2176 size = gfc_integer_kinds[k].bit_size;
2178 gfc_extract_int (shiftarg, &shift);
2180 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */
2181 if (right)
2182 shift = size - shift;
2184 result = gfc_get_constant_expr (BT_INTEGER, arg1->ts.kind, &arg1->where);
2185 mpz_set_ui (result->value.integer, 0);
2187 for (i = 0; i < shift; i++)
2188 if (mpz_tstbit (arg2->value.integer, size - shift + i))
2189 mpz_setbit (result->value.integer, i);
2191 for (i = 0; i < size - shift; i++)
2192 if (mpz_tstbit (arg1->value.integer, i))
2193 mpz_setbit (result->value.integer, shift + i);
2195 /* Convert to a signed value. */
2196 gfc_convert_mpz_to_signed (result->value.integer, size);
2198 return result;
2202 gfc_expr *
2203 gfc_simplify_dshiftr (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg)
2205 return simplify_dshift (arg1, arg2, shiftarg, true);
2209 gfc_expr *
2210 gfc_simplify_dshiftl (gfc_expr *arg1, gfc_expr *arg2, gfc_expr *shiftarg)
2212 return simplify_dshift (arg1, arg2, shiftarg, false);
2216 gfc_expr *
2217 gfc_simplify_erf (gfc_expr *x)
2219 gfc_expr *result;
2221 if (x->expr_type != EXPR_CONSTANT)
2222 return NULL;
2224 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2225 mpfr_erf (result->value.real, x->value.real, GFC_RND_MODE);
2227 return range_check (result, "ERF");
2231 gfc_expr *
2232 gfc_simplify_erfc (gfc_expr *x)
2234 gfc_expr *result;
2236 if (x->expr_type != EXPR_CONSTANT)
2237 return NULL;
2239 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2240 mpfr_erfc (result->value.real, x->value.real, GFC_RND_MODE);
2242 return range_check (result, "ERFC");
2246 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
2248 #define MAX_ITER 200
2249 #define ARG_LIMIT 12
2251 /* Calculate ERFC_SCALED directly by its definition:
2253 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
2255 using a large precision for intermediate results. This is used for all
2256 but large values of the argument. */
2257 static void
2258 fullprec_erfc_scaled (mpfr_t res, mpfr_t arg)
2260 mp_prec_t prec;
2261 mpfr_t a, b;
2263 prec = mpfr_get_default_prec ();
2264 mpfr_set_default_prec (10 * prec);
2266 mpfr_init (a);
2267 mpfr_init (b);
2269 mpfr_set (a, arg, GFC_RND_MODE);
2270 mpfr_sqr (b, a, GFC_RND_MODE);
2271 mpfr_exp (b, b, GFC_RND_MODE);
2272 mpfr_erfc (a, a, GFC_RND_MODE);
2273 mpfr_mul (a, a, b, GFC_RND_MODE);
2275 mpfr_set (res, a, GFC_RND_MODE);
2276 mpfr_set_default_prec (prec);
2278 mpfr_clear (a);
2279 mpfr_clear (b);
2282 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
2284 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
2285 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
2286 / (2 * x**2)**n)
2288 This is used for large values of the argument. Intermediate calculations
2289 are performed with twice the precision. We don't do a fixed number of
2290 iterations of the sum, but stop when it has converged to the required
2291 precision. */
2292 static void
2293 asympt_erfc_scaled (mpfr_t res, mpfr_t arg)
2295 mpfr_t sum, x, u, v, w, oldsum, sumtrunc;
2296 mpz_t num;
2297 mp_prec_t prec;
2298 unsigned i;
2300 prec = mpfr_get_default_prec ();
2301 mpfr_set_default_prec (2 * prec);
2303 mpfr_init (sum);
2304 mpfr_init (x);
2305 mpfr_init (u);
2306 mpfr_init (v);
2307 mpfr_init (w);
2308 mpz_init (num);
2310 mpfr_init (oldsum);
2311 mpfr_init (sumtrunc);
2312 mpfr_set_prec (oldsum, prec);
2313 mpfr_set_prec (sumtrunc, prec);
2315 mpfr_set (x, arg, GFC_RND_MODE);
2316 mpfr_set_ui (sum, 1, GFC_RND_MODE);
2317 mpz_set_ui (num, 1);
2319 mpfr_set (u, x, GFC_RND_MODE);
2320 mpfr_sqr (u, u, GFC_RND_MODE);
2321 mpfr_mul_ui (u, u, 2, GFC_RND_MODE);
2322 mpfr_pow_si (u, u, -1, GFC_RND_MODE);
2324 for (i = 1; i < MAX_ITER; i++)
2326 mpfr_set (oldsum, sum, GFC_RND_MODE);
2328 mpz_mul_ui (num, num, 2 * i - 1);
2329 mpz_neg (num, num);
2331 mpfr_set (w, u, GFC_RND_MODE);
2332 mpfr_pow_ui (w, w, i, GFC_RND_MODE);
2334 mpfr_set_z (v, num, GFC_RND_MODE);
2335 mpfr_mul (v, v, w, GFC_RND_MODE);
2337 mpfr_add (sum, sum, v, GFC_RND_MODE);
2339 mpfr_set (sumtrunc, sum, GFC_RND_MODE);
2340 if (mpfr_cmp (sumtrunc, oldsum) == 0)
2341 break;
2344 /* We should have converged by now; otherwise, ARG_LIMIT is probably
2345 set too low. */
2346 gcc_assert (i < MAX_ITER);
2348 /* Divide by x * sqrt(Pi). */
2349 mpfr_const_pi (u, GFC_RND_MODE);
2350 mpfr_sqrt (u, u, GFC_RND_MODE);
2351 mpfr_mul (u, u, x, GFC_RND_MODE);
2352 mpfr_div (sum, sum, u, GFC_RND_MODE);
2354 mpfr_set (res, sum, GFC_RND_MODE);
2355 mpfr_set_default_prec (prec);
2357 mpfr_clears (sum, x, u, v, w, oldsum, sumtrunc, NULL);
2358 mpz_clear (num);
2362 gfc_expr *
2363 gfc_simplify_erfc_scaled (gfc_expr *x)
2365 gfc_expr *result;
2367 if (x->expr_type != EXPR_CONSTANT)
2368 return NULL;
2370 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2371 if (mpfr_cmp_d (x->value.real, ARG_LIMIT) >= 0)
2372 asympt_erfc_scaled (result->value.real, x->value.real);
2373 else
2374 fullprec_erfc_scaled (result->value.real, x->value.real);
2376 return range_check (result, "ERFC_SCALED");
2379 #undef MAX_ITER
2380 #undef ARG_LIMIT
2383 gfc_expr *
2384 gfc_simplify_epsilon (gfc_expr *e)
2386 gfc_expr *result;
2387 int i;
2389 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2391 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
2392 mpfr_set (result->value.real, gfc_real_kinds[i].epsilon, GFC_RND_MODE);
2394 return range_check (result, "EPSILON");
2398 gfc_expr *
2399 gfc_simplify_exp (gfc_expr *x)
2401 gfc_expr *result;
2403 if (x->expr_type != EXPR_CONSTANT)
2404 return NULL;
2406 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2408 switch (x->ts.type)
2410 case BT_REAL:
2411 mpfr_exp (result->value.real, x->value.real, GFC_RND_MODE);
2412 break;
2414 case BT_COMPLEX:
2415 gfc_set_model_kind (x->ts.kind);
2416 mpc_exp (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
2417 break;
2419 default:
2420 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2423 return range_check (result, "EXP");
2427 gfc_expr *
2428 gfc_simplify_exponent (gfc_expr *x)
2430 long int val;
2431 gfc_expr *result;
2433 if (x->expr_type != EXPR_CONSTANT)
2434 return NULL;
2436 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
2437 &x->where);
2439 /* EXPONENT(inf) = EXPONENT(nan) = HUGE(0) */
2440 if (mpfr_inf_p (x->value.real) || mpfr_nan_p (x->value.real))
2442 int i = gfc_validate_kind (BT_INTEGER, gfc_default_integer_kind, false);
2443 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
2444 return result;
2447 /* EXPONENT(+/- 0.0) = 0 */
2448 if (mpfr_zero_p (x->value.real))
2450 mpz_set_ui (result->value.integer, 0);
2451 return result;
2454 gfc_set_model (x->value.real);
2456 val = (long int) mpfr_get_exp (x->value.real);
2457 mpz_set_si (result->value.integer, val);
2459 return range_check (result, "EXPONENT");
2463 gfc_expr *
2464 gfc_simplify_float (gfc_expr *a)
2466 gfc_expr *result;
2468 if (a->expr_type != EXPR_CONSTANT)
2469 return NULL;
2471 if (a->is_boz)
2473 if (convert_boz (a, gfc_default_real_kind) == &gfc_bad_expr)
2474 return &gfc_bad_expr;
2476 result = gfc_copy_expr (a);
2478 else
2479 result = gfc_int2real (a, gfc_default_real_kind);
2481 return range_check (result, "FLOAT");
2485 static bool
2486 is_last_ref_vtab (gfc_expr *e)
2488 gfc_ref *ref;
2489 gfc_component *comp = NULL;
2491 if (e->expr_type != EXPR_VARIABLE)
2492 return false;
2494 for (ref = e->ref; ref; ref = ref->next)
2495 if (ref->type == REF_COMPONENT)
2496 comp = ref->u.c.component;
2498 if (!e->ref || !comp)
2499 return e->symtree->n.sym->attr.vtab;
2501 if (comp->name[0] == '_' && strcmp (comp->name, "_vptr") == 0)
2502 return true;
2504 return false;
2508 gfc_expr *
2509 gfc_simplify_extends_type_of (gfc_expr *a, gfc_expr *mold)
2511 /* Avoid simplification of resolved symbols. */
2512 if (is_last_ref_vtab (a) || is_last_ref_vtab (mold))
2513 return NULL;
2515 if (a->ts.type == BT_DERIVED && mold->ts.type == BT_DERIVED)
2516 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
2517 gfc_type_is_extension_of (mold->ts.u.derived,
2518 a->ts.u.derived));
2520 if (UNLIMITED_POLY (a) || UNLIMITED_POLY (mold))
2521 return NULL;
2523 /* Return .false. if the dynamic type can never be the same. */
2524 if ((a->ts.type == BT_CLASS && mold->ts.type == BT_CLASS
2525 && !gfc_type_is_extension_of
2526 (mold->ts.u.derived->components->ts.u.derived,
2527 a->ts.u.derived->components->ts.u.derived)
2528 && !gfc_type_is_extension_of
2529 (a->ts.u.derived->components->ts.u.derived,
2530 mold->ts.u.derived->components->ts.u.derived))
2531 || (a->ts.type == BT_DERIVED && mold->ts.type == BT_CLASS
2532 && !gfc_type_is_extension_of
2533 (a->ts.u.derived,
2534 mold->ts.u.derived->components->ts.u.derived)
2535 && !gfc_type_is_extension_of
2536 (mold->ts.u.derived->components->ts.u.derived,
2537 a->ts.u.derived))
2538 || (a->ts.type == BT_CLASS && mold->ts.type == BT_DERIVED
2539 && !gfc_type_is_extension_of
2540 (mold->ts.u.derived,
2541 a->ts.u.derived->components->ts.u.derived)))
2542 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false);
2544 if (mold->ts.type == BT_DERIVED
2545 && gfc_type_is_extension_of (mold->ts.u.derived,
2546 a->ts.u.derived->components->ts.u.derived))
2547 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, true);
2549 return NULL;
2553 gfc_expr *
2554 gfc_simplify_same_type_as (gfc_expr *a, gfc_expr *b)
2556 /* Avoid simplification of resolved symbols. */
2557 if (is_last_ref_vtab (a) || is_last_ref_vtab (b))
2558 return NULL;
2560 /* Return .false. if the dynamic type can never be the
2561 same. */
2562 if (((a->ts.type == BT_CLASS && gfc_expr_attr (a).class_ok)
2563 || (b->ts.type == BT_CLASS && gfc_expr_attr (b).class_ok))
2564 && !gfc_type_compatible (&a->ts, &b->ts)
2565 && !gfc_type_compatible (&b->ts, &a->ts))
2566 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where, false);
2568 if (a->ts.type != BT_DERIVED || b->ts.type != BT_DERIVED)
2569 return NULL;
2571 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
2572 gfc_compare_derived_types (a->ts.u.derived,
2573 b->ts.u.derived));
2577 gfc_expr *
2578 gfc_simplify_floor (gfc_expr *e, gfc_expr *k)
2580 gfc_expr *result;
2581 mpfr_t floor;
2582 int kind;
2584 kind = get_kind (BT_INTEGER, k, "FLOOR", gfc_default_integer_kind);
2585 if (kind == -1)
2586 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
2588 if (e->expr_type != EXPR_CONSTANT)
2589 return NULL;
2591 mpfr_init2 (floor, mpfr_get_prec (e->value.real));
2592 mpfr_floor (floor, e->value.real);
2594 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
2595 gfc_mpfr_to_mpz (result->value.integer, floor, &e->where);
2597 mpfr_clear (floor);
2599 return range_check (result, "FLOOR");
2603 gfc_expr *
2604 gfc_simplify_fraction (gfc_expr *x)
2606 gfc_expr *result;
2608 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
2609 mpfr_t absv, exp, pow2;
2610 #else
2611 mpfr_exp_t e;
2612 #endif
2614 if (x->expr_type != EXPR_CONSTANT)
2615 return NULL;
2617 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
2619 /* FRACTION(inf) = NaN. */
2620 if (mpfr_inf_p (x->value.real))
2622 mpfr_set_nan (result->value.real);
2623 return result;
2626 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
2628 /* MPFR versions before 3.1.0 do not include mpfr_frexp.
2629 TODO: remove the kludge when MPFR 3.1.0 or newer will be required */
2631 if (mpfr_sgn (x->value.real) == 0)
2633 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
2634 return result;
2637 gfc_set_model_kind (x->ts.kind);
2638 mpfr_init (exp);
2639 mpfr_init (absv);
2640 mpfr_init (pow2);
2642 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
2643 mpfr_log2 (exp, absv, GFC_RND_MODE);
2645 mpfr_trunc (exp, exp);
2646 mpfr_add_ui (exp, exp, 1, GFC_RND_MODE);
2648 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
2650 mpfr_div (result->value.real, x->value.real, pow2, GFC_RND_MODE);
2652 mpfr_clears (exp, absv, pow2, NULL);
2654 #else
2656 /* mpfr_frexp() correctly handles zeros and NaNs. */
2657 mpfr_frexp (&e, result->value.real, x->value.real, GFC_RND_MODE);
2659 #endif
2661 return range_check (result, "FRACTION");
2665 gfc_expr *
2666 gfc_simplify_gamma (gfc_expr *x)
2668 gfc_expr *result;
2670 if (x->expr_type != EXPR_CONSTANT)
2671 return NULL;
2673 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2674 mpfr_gamma (result->value.real, x->value.real, GFC_RND_MODE);
2676 return range_check (result, "GAMMA");
2680 gfc_expr *
2681 gfc_simplify_huge (gfc_expr *e)
2683 gfc_expr *result;
2684 int i;
2686 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
2687 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
2689 switch (e->ts.type)
2691 case BT_INTEGER:
2692 mpz_set (result->value.integer, gfc_integer_kinds[i].huge);
2693 break;
2695 case BT_REAL:
2696 mpfr_set (result->value.real, gfc_real_kinds[i].huge, GFC_RND_MODE);
2697 break;
2699 default:
2700 gcc_unreachable ();
2703 return result;
2707 gfc_expr *
2708 gfc_simplify_hypot (gfc_expr *x, gfc_expr *y)
2710 gfc_expr *result;
2712 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2713 return NULL;
2715 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2716 mpfr_hypot (result->value.real, x->value.real, y->value.real, GFC_RND_MODE);
2717 return range_check (result, "HYPOT");
2721 /* We use the processor's collating sequence, because all
2722 systems that gfortran currently works on are ASCII. */
2724 gfc_expr *
2725 gfc_simplify_iachar (gfc_expr *e, gfc_expr *kind)
2727 gfc_expr *result;
2728 gfc_char_t index;
2729 int k;
2731 if (e->expr_type != EXPR_CONSTANT)
2732 return NULL;
2734 if (e->value.character.length != 1)
2736 gfc_error ("Argument of IACHAR at %L must be of length one", &e->where);
2737 return &gfc_bad_expr;
2740 index = e->value.character.string[0];
2742 if (warn_surprising && index > 127)
2743 gfc_warning (OPT_Wsurprising,
2744 "Argument of IACHAR function at %L outside of range 0..127",
2745 &e->where);
2747 k = get_kind (BT_INTEGER, kind, "IACHAR", gfc_default_integer_kind);
2748 if (k == -1)
2749 return &gfc_bad_expr;
2751 result = gfc_get_int_expr (k, &e->where, index);
2753 return range_check (result, "IACHAR");
2757 static gfc_expr *
2758 do_bit_and (gfc_expr *result, gfc_expr *e)
2760 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
2761 gcc_assert (result->ts.type == BT_INTEGER
2762 && result->expr_type == EXPR_CONSTANT);
2764 mpz_and (result->value.integer, result->value.integer, e->value.integer);
2765 return result;
2769 gfc_expr *
2770 gfc_simplify_iall (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2772 return simplify_transformation (array, dim, mask, -1, do_bit_and);
2776 static gfc_expr *
2777 do_bit_ior (gfc_expr *result, gfc_expr *e)
2779 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
2780 gcc_assert (result->ts.type == BT_INTEGER
2781 && result->expr_type == EXPR_CONSTANT);
2783 mpz_ior (result->value.integer, result->value.integer, e->value.integer);
2784 return result;
2788 gfc_expr *
2789 gfc_simplify_iany (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
2791 return simplify_transformation (array, dim, mask, 0, do_bit_ior);
2795 gfc_expr *
2796 gfc_simplify_iand (gfc_expr *x, gfc_expr *y)
2798 gfc_expr *result;
2800 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2801 return NULL;
2803 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2804 mpz_and (result->value.integer, x->value.integer, y->value.integer);
2806 return range_check (result, "IAND");
2810 gfc_expr *
2811 gfc_simplify_ibclr (gfc_expr *x, gfc_expr *y)
2813 gfc_expr *result;
2814 int k, pos;
2816 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2817 return NULL;
2819 gfc_extract_int (y, &pos);
2821 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2823 result = gfc_copy_expr (x);
2825 convert_mpz_to_unsigned (result->value.integer,
2826 gfc_integer_kinds[k].bit_size);
2828 mpz_clrbit (result->value.integer, pos);
2830 gfc_convert_mpz_to_signed (result->value.integer,
2831 gfc_integer_kinds[k].bit_size);
2833 return result;
2837 gfc_expr *
2838 gfc_simplify_ibits (gfc_expr *x, gfc_expr *y, gfc_expr *z)
2840 gfc_expr *result;
2841 int pos, len;
2842 int i, k, bitsize;
2843 int *bits;
2845 if (x->expr_type != EXPR_CONSTANT
2846 || y->expr_type != EXPR_CONSTANT
2847 || z->expr_type != EXPR_CONSTANT)
2848 return NULL;
2850 gfc_extract_int (y, &pos);
2851 gfc_extract_int (z, &len);
2853 k = gfc_validate_kind (BT_INTEGER, x->ts.kind, false);
2855 bitsize = gfc_integer_kinds[k].bit_size;
2857 if (pos + len > bitsize)
2859 gfc_error ("Sum of second and third arguments of IBITS exceeds "
2860 "bit size at %L", &y->where);
2861 return &gfc_bad_expr;
2864 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
2865 convert_mpz_to_unsigned (result->value.integer,
2866 gfc_integer_kinds[k].bit_size);
2868 bits = XCNEWVEC (int, bitsize);
2870 for (i = 0; i < bitsize; i++)
2871 bits[i] = 0;
2873 for (i = 0; i < len; i++)
2874 bits[i] = mpz_tstbit (x->value.integer, i + pos);
2876 for (i = 0; i < bitsize; i++)
2878 if (bits[i] == 0)
2879 mpz_clrbit (result->value.integer, i);
2880 else if (bits[i] == 1)
2881 mpz_setbit (result->value.integer, i);
2882 else
2883 gfc_internal_error ("IBITS: Bad bit");
2886 free (bits);
2888 gfc_convert_mpz_to_signed (result->value.integer,
2889 gfc_integer_kinds[k].bit_size);
2891 return result;
2895 gfc_expr *
2896 gfc_simplify_ibset (gfc_expr *x, gfc_expr *y)
2898 gfc_expr *result;
2899 int k, pos;
2901 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2902 return NULL;
2904 gfc_extract_int (y, &pos);
2906 k = gfc_validate_kind (x->ts.type, x->ts.kind, false);
2908 result = gfc_copy_expr (x);
2910 convert_mpz_to_unsigned (result->value.integer,
2911 gfc_integer_kinds[k].bit_size);
2913 mpz_setbit (result->value.integer, pos);
2915 gfc_convert_mpz_to_signed (result->value.integer,
2916 gfc_integer_kinds[k].bit_size);
2918 return result;
2922 gfc_expr *
2923 gfc_simplify_ichar (gfc_expr *e, gfc_expr *kind)
2925 gfc_expr *result;
2926 gfc_char_t index;
2927 int k;
2929 if (e->expr_type != EXPR_CONSTANT)
2930 return NULL;
2932 if (e->value.character.length != 1)
2934 gfc_error ("Argument of ICHAR at %L must be of length one", &e->where);
2935 return &gfc_bad_expr;
2938 index = e->value.character.string[0];
2940 k = get_kind (BT_INTEGER, kind, "ICHAR", gfc_default_integer_kind);
2941 if (k == -1)
2942 return &gfc_bad_expr;
2944 result = gfc_get_int_expr (k, &e->where, index);
2946 return range_check (result, "ICHAR");
2950 gfc_expr *
2951 gfc_simplify_ieor (gfc_expr *x, gfc_expr *y)
2953 gfc_expr *result;
2955 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
2956 return NULL;
2958 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
2959 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
2961 return range_check (result, "IEOR");
2965 gfc_expr *
2966 gfc_simplify_index (gfc_expr *x, gfc_expr *y, gfc_expr *b, gfc_expr *kind)
2968 gfc_expr *result;
2969 int back, len, lensub;
2970 int i, j, k, count, index = 0, start;
2972 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT
2973 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
2974 return NULL;
2976 if (b != NULL && b->value.logical != 0)
2977 back = 1;
2978 else
2979 back = 0;
2981 k = get_kind (BT_INTEGER, kind, "INDEX", gfc_default_integer_kind);
2982 if (k == -1)
2983 return &gfc_bad_expr;
2985 result = gfc_get_constant_expr (BT_INTEGER, k, &x->where);
2987 len = x->value.character.length;
2988 lensub = y->value.character.length;
2990 if (len < lensub)
2992 mpz_set_si (result->value.integer, 0);
2993 return result;
2996 if (back == 0)
2998 if (lensub == 0)
3000 mpz_set_si (result->value.integer, 1);
3001 return result;
3003 else if (lensub == 1)
3005 for (i = 0; i < len; i++)
3007 for (j = 0; j < lensub; j++)
3009 if (y->value.character.string[j]
3010 == x->value.character.string[i])
3012 index = i + 1;
3013 goto done;
3018 else
3020 for (i = 0; i < len; i++)
3022 for (j = 0; j < lensub; j++)
3024 if (y->value.character.string[j]
3025 == x->value.character.string[i])
3027 start = i;
3028 count = 0;
3030 for (k = 0; k < lensub; k++)
3032 if (y->value.character.string[k]
3033 == x->value.character.string[k + start])
3034 count++;
3037 if (count == lensub)
3039 index = start + 1;
3040 goto done;
3048 else
3050 if (lensub == 0)
3052 mpz_set_si (result->value.integer, len + 1);
3053 return result;
3055 else if (lensub == 1)
3057 for (i = 0; i < len; i++)
3059 for (j = 0; j < lensub; j++)
3061 if (y->value.character.string[j]
3062 == x->value.character.string[len - i])
3064 index = len - i + 1;
3065 goto done;
3070 else
3072 for (i = 0; i < len; i++)
3074 for (j = 0; j < lensub; j++)
3076 if (y->value.character.string[j]
3077 == x->value.character.string[len - i])
3079 start = len - i;
3080 if (start <= len - lensub)
3082 count = 0;
3083 for (k = 0; k < lensub; k++)
3084 if (y->value.character.string[k]
3085 == x->value.character.string[k + start])
3086 count++;
3088 if (count == lensub)
3090 index = start + 1;
3091 goto done;
3094 else
3096 continue;
3104 done:
3105 mpz_set_si (result->value.integer, index);
3106 return range_check (result, "INDEX");
3110 static gfc_expr *
3111 simplify_intconv (gfc_expr *e, int kind, const char *name)
3113 gfc_expr *result = NULL;
3115 if (e->expr_type != EXPR_CONSTANT)
3116 return NULL;
3118 result = gfc_convert_constant (e, BT_INTEGER, kind);
3119 if (result == &gfc_bad_expr)
3120 return &gfc_bad_expr;
3122 return range_check (result, name);
3126 gfc_expr *
3127 gfc_simplify_int (gfc_expr *e, gfc_expr *k)
3129 int kind;
3131 kind = get_kind (BT_INTEGER, k, "INT", gfc_default_integer_kind);
3132 if (kind == -1)
3133 return &gfc_bad_expr;
3135 return simplify_intconv (e, kind, "INT");
3138 gfc_expr *
3139 gfc_simplify_int2 (gfc_expr *e)
3141 return simplify_intconv (e, 2, "INT2");
3145 gfc_expr *
3146 gfc_simplify_int8 (gfc_expr *e)
3148 return simplify_intconv (e, 8, "INT8");
3152 gfc_expr *
3153 gfc_simplify_long (gfc_expr *e)
3155 return simplify_intconv (e, 4, "LONG");
3159 gfc_expr *
3160 gfc_simplify_ifix (gfc_expr *e)
3162 gfc_expr *rtrunc, *result;
3164 if (e->expr_type != EXPR_CONSTANT)
3165 return NULL;
3167 rtrunc = gfc_copy_expr (e);
3168 mpfr_trunc (rtrunc->value.real, e->value.real);
3170 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
3171 &e->where);
3172 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
3174 gfc_free_expr (rtrunc);
3176 return range_check (result, "IFIX");
3180 gfc_expr *
3181 gfc_simplify_idint (gfc_expr *e)
3183 gfc_expr *rtrunc, *result;
3185 if (e->expr_type != EXPR_CONSTANT)
3186 return NULL;
3188 rtrunc = gfc_copy_expr (e);
3189 mpfr_trunc (rtrunc->value.real, e->value.real);
3191 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
3192 &e->where);
3193 gfc_mpfr_to_mpz (result->value.integer, rtrunc->value.real, &e->where);
3195 gfc_free_expr (rtrunc);
3197 return range_check (result, "IDINT");
3201 gfc_expr *
3202 gfc_simplify_ior (gfc_expr *x, gfc_expr *y)
3204 gfc_expr *result;
3206 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
3207 return NULL;
3209 result = gfc_get_constant_expr (BT_INTEGER, x->ts.kind, &x->where);
3210 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
3212 return range_check (result, "IOR");
3216 static gfc_expr *
3217 do_bit_xor (gfc_expr *result, gfc_expr *e)
3219 gcc_assert (e->ts.type == BT_INTEGER && e->expr_type == EXPR_CONSTANT);
3220 gcc_assert (result->ts.type == BT_INTEGER
3221 && result->expr_type == EXPR_CONSTANT);
3223 mpz_xor (result->value.integer, result->value.integer, e->value.integer);
3224 return result;
3228 gfc_expr *
3229 gfc_simplify_iparity (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
3231 return simplify_transformation (array, dim, mask, 0, do_bit_xor);
3235 gfc_expr *
3236 gfc_simplify_is_iostat_end (gfc_expr *x)
3238 if (x->expr_type != EXPR_CONSTANT)
3239 return NULL;
3241 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
3242 mpz_cmp_si (x->value.integer,
3243 LIBERROR_END) == 0);
3247 gfc_expr *
3248 gfc_simplify_is_iostat_eor (gfc_expr *x)
3250 if (x->expr_type != EXPR_CONSTANT)
3251 return NULL;
3253 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
3254 mpz_cmp_si (x->value.integer,
3255 LIBERROR_EOR) == 0);
3259 gfc_expr *
3260 gfc_simplify_isnan (gfc_expr *x)
3262 if (x->expr_type != EXPR_CONSTANT)
3263 return NULL;
3265 return gfc_get_logical_expr (gfc_default_logical_kind, &x->where,
3266 mpfr_nan_p (x->value.real));
3270 /* Performs a shift on its first argument. Depending on the last
3271 argument, the shift can be arithmetic, i.e. with filling from the
3272 left like in the SHIFTA intrinsic. */
3273 static gfc_expr *
3274 simplify_shift (gfc_expr *e, gfc_expr *s, const char *name,
3275 bool arithmetic, int direction)
3277 gfc_expr *result;
3278 int ashift, *bits, i, k, bitsize, shift;
3280 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3281 return NULL;
3283 gfc_extract_int (s, &shift);
3285 k = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
3286 bitsize = gfc_integer_kinds[k].bit_size;
3288 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
3290 if (shift == 0)
3292 mpz_set (result->value.integer, e->value.integer);
3293 return result;
3296 if (direction > 0 && shift < 0)
3298 /* Left shift, as in SHIFTL. */
3299 gfc_error ("Second argument of %s is negative at %L", name, &e->where);
3300 return &gfc_bad_expr;
3302 else if (direction < 0)
3304 /* Right shift, as in SHIFTR or SHIFTA. */
3305 if (shift < 0)
3307 gfc_error ("Second argument of %s is negative at %L",
3308 name, &e->where);
3309 return &gfc_bad_expr;
3312 shift = -shift;
3315 ashift = (shift >= 0 ? shift : -shift);
3317 if (ashift > bitsize)
3319 gfc_error ("Magnitude of second argument of %s exceeds bit size "
3320 "at %L", name, &e->where);
3321 return &gfc_bad_expr;
3324 bits = XCNEWVEC (int, bitsize);
3326 for (i = 0; i < bitsize; i++)
3327 bits[i] = mpz_tstbit (e->value.integer, i);
3329 if (shift > 0)
3331 /* Left shift. */
3332 for (i = 0; i < shift; i++)
3333 mpz_clrbit (result->value.integer, i);
3335 for (i = 0; i < bitsize - shift; i++)
3337 if (bits[i] == 0)
3338 mpz_clrbit (result->value.integer, i + shift);
3339 else
3340 mpz_setbit (result->value.integer, i + shift);
3343 else
3345 /* Right shift. */
3346 if (arithmetic && bits[bitsize - 1])
3347 for (i = bitsize - 1; i >= bitsize - ashift; i--)
3348 mpz_setbit (result->value.integer, i);
3349 else
3350 for (i = bitsize - 1; i >= bitsize - ashift; i--)
3351 mpz_clrbit (result->value.integer, i);
3353 for (i = bitsize - 1; i >= ashift; i--)
3355 if (bits[i] == 0)
3356 mpz_clrbit (result->value.integer, i - ashift);
3357 else
3358 mpz_setbit (result->value.integer, i - ashift);
3362 gfc_convert_mpz_to_signed (result->value.integer, bitsize);
3363 free (bits);
3365 return result;
3369 gfc_expr *
3370 gfc_simplify_ishft (gfc_expr *e, gfc_expr *s)
3372 return simplify_shift (e, s, "ISHFT", false, 0);
3376 gfc_expr *
3377 gfc_simplify_lshift (gfc_expr *e, gfc_expr *s)
3379 return simplify_shift (e, s, "LSHIFT", false, 1);
3383 gfc_expr *
3384 gfc_simplify_rshift (gfc_expr *e, gfc_expr *s)
3386 return simplify_shift (e, s, "RSHIFT", true, -1);
3390 gfc_expr *
3391 gfc_simplify_shifta (gfc_expr *e, gfc_expr *s)
3393 return simplify_shift (e, s, "SHIFTA", true, -1);
3397 gfc_expr *
3398 gfc_simplify_shiftl (gfc_expr *e, gfc_expr *s)
3400 return simplify_shift (e, s, "SHIFTL", false, 1);
3404 gfc_expr *
3405 gfc_simplify_shiftr (gfc_expr *e, gfc_expr *s)
3407 return simplify_shift (e, s, "SHIFTR", false, -1);
3411 gfc_expr *
3412 gfc_simplify_ishftc (gfc_expr *e, gfc_expr *s, gfc_expr *sz)
3414 gfc_expr *result;
3415 int shift, ashift, isize, ssize, delta, k;
3416 int i, *bits;
3418 if (e->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
3419 return NULL;
3421 gfc_extract_int (s, &shift);
3423 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3424 isize = gfc_integer_kinds[k].bit_size;
3426 if (sz != NULL)
3428 if (sz->expr_type != EXPR_CONSTANT)
3429 return NULL;
3431 gfc_extract_int (sz, &ssize);
3433 else
3434 ssize = isize;
3436 if (shift >= 0)
3437 ashift = shift;
3438 else
3439 ashift = -shift;
3441 if (ashift > ssize)
3443 if (sz == NULL)
3444 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3445 "BIT_SIZE of first argument at %C");
3446 else
3447 gfc_error ("Absolute value of SHIFT shall be less than or equal "
3448 "to SIZE at %C");
3449 return &gfc_bad_expr;
3452 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
3454 mpz_set (result->value.integer, e->value.integer);
3456 if (shift == 0)
3457 return result;
3459 convert_mpz_to_unsigned (result->value.integer, isize);
3461 bits = XCNEWVEC (int, ssize);
3463 for (i = 0; i < ssize; i++)
3464 bits[i] = mpz_tstbit (e->value.integer, i);
3466 delta = ssize - ashift;
3468 if (shift > 0)
3470 for (i = 0; i < delta; i++)
3472 if (bits[i] == 0)
3473 mpz_clrbit (result->value.integer, i + shift);
3474 else
3475 mpz_setbit (result->value.integer, i + shift);
3478 for (i = delta; i < ssize; i++)
3480 if (bits[i] == 0)
3481 mpz_clrbit (result->value.integer, i - delta);
3482 else
3483 mpz_setbit (result->value.integer, i - delta);
3486 else
3488 for (i = 0; i < ashift; i++)
3490 if (bits[i] == 0)
3491 mpz_clrbit (result->value.integer, i + delta);
3492 else
3493 mpz_setbit (result->value.integer, i + delta);
3496 for (i = ashift; i < ssize; i++)
3498 if (bits[i] == 0)
3499 mpz_clrbit (result->value.integer, i + shift);
3500 else
3501 mpz_setbit (result->value.integer, i + shift);
3505 gfc_convert_mpz_to_signed (result->value.integer, isize);
3507 free (bits);
3508 return result;
3512 gfc_expr *
3513 gfc_simplify_kind (gfc_expr *e)
3515 return gfc_get_int_expr (gfc_default_integer_kind, NULL, e->ts.kind);
3519 static gfc_expr *
3520 simplify_bound_dim (gfc_expr *array, gfc_expr *kind, int d, int upper,
3521 gfc_array_spec *as, gfc_ref *ref, bool coarray)
3523 gfc_expr *l, *u, *result;
3524 int k;
3526 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
3527 gfc_default_integer_kind);
3528 if (k == -1)
3529 return &gfc_bad_expr;
3531 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
3533 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
3534 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
3535 if (!coarray && array->expr_type != EXPR_VARIABLE)
3537 if (upper)
3539 gfc_expr* dim = result;
3540 mpz_set_si (dim->value.integer, d);
3542 result = simplify_size (array, dim, k);
3543 gfc_free_expr (dim);
3544 if (!result)
3545 goto returnNull;
3547 else
3548 mpz_set_si (result->value.integer, 1);
3550 goto done;
3553 /* Otherwise, we have a variable expression. */
3554 gcc_assert (array->expr_type == EXPR_VARIABLE);
3555 gcc_assert (as);
3557 if (!gfc_resolve_array_spec (as, 0))
3558 return NULL;
3560 /* The last dimension of an assumed-size array is special. */
3561 if ((!coarray && d == as->rank && as->type == AS_ASSUMED_SIZE && !upper)
3562 || (coarray && d == as->rank + as->corank
3563 && (!upper || flag_coarray == GFC_FCOARRAY_SINGLE)))
3565 if (as->lower[d-1]->expr_type == EXPR_CONSTANT)
3567 gfc_free_expr (result);
3568 return gfc_copy_expr (as->lower[d-1]);
3571 goto returnNull;
3574 result = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
3576 /* Then, we need to know the extent of the given dimension. */
3577 if (coarray || (ref->u.ar.type == AR_FULL && !ref->next))
3579 gfc_expr *declared_bound;
3580 int empty_bound;
3581 bool constant_lbound, constant_ubound;
3583 l = as->lower[d-1];
3584 u = as->upper[d-1];
3586 gcc_assert (l != NULL);
3588 constant_lbound = l->expr_type == EXPR_CONSTANT;
3589 constant_ubound = u && u->expr_type == EXPR_CONSTANT;
3591 empty_bound = upper ? 0 : 1;
3592 declared_bound = upper ? u : l;
3594 if ((!upper && !constant_lbound)
3595 || (upper && !constant_ubound))
3596 goto returnNull;
3598 if (!coarray)
3600 /* For {L,U}BOUND, the value depends on whether the array
3601 is empty. We can nevertheless simplify if the declared bound
3602 has the same value as that of an empty array, in which case
3603 the result isn't dependent on the array emptyness. */
3604 if (mpz_cmp_si (declared_bound->value.integer, empty_bound) == 0)
3605 mpz_set_si (result->value.integer, empty_bound);
3606 else if (!constant_lbound || !constant_ubound)
3607 /* Array emptyness can't be determined, we can't simplify. */
3608 goto returnNull;
3609 else if (mpz_cmp (l->value.integer, u->value.integer) > 0)
3610 mpz_set_si (result->value.integer, empty_bound);
3611 else
3612 mpz_set (result->value.integer, declared_bound->value.integer);
3614 else
3615 mpz_set (result->value.integer, declared_bound->value.integer);
3617 else
3619 if (upper)
3621 if (!gfc_ref_dimen_size (&ref->u.ar, d - 1, &result->value.integer, NULL))
3622 goto returnNull;
3624 else
3625 mpz_set_si (result->value.integer, (long int) 1);
3628 done:
3629 return range_check (result, upper ? "UBOUND" : "LBOUND");
3631 returnNull:
3632 gfc_free_expr (result);
3633 return NULL;
3637 static gfc_expr *
3638 simplify_bound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3640 gfc_ref *ref;
3641 gfc_array_spec *as;
3642 int d;
3644 if (array->ts.type == BT_CLASS)
3645 return NULL;
3647 if (array->expr_type != EXPR_VARIABLE)
3649 as = NULL;
3650 ref = NULL;
3651 goto done;
3654 /* Follow any component references. */
3655 as = array->symtree->n.sym->as;
3656 for (ref = array->ref; ref; ref = ref->next)
3658 switch (ref->type)
3660 case REF_ARRAY:
3661 switch (ref->u.ar.type)
3663 case AR_ELEMENT:
3664 as = NULL;
3665 continue;
3667 case AR_FULL:
3668 /* We're done because 'as' has already been set in the
3669 previous iteration. */
3670 goto done;
3672 case AR_UNKNOWN:
3673 return NULL;
3675 case AR_SECTION:
3676 as = ref->u.ar.as;
3677 goto done;
3680 gcc_unreachable ();
3682 case REF_COMPONENT:
3683 as = ref->u.c.component->as;
3684 continue;
3686 case REF_SUBSTRING:
3687 continue;
3691 gcc_unreachable ();
3693 done:
3695 if (as && (as->type == AS_DEFERRED || as->type == AS_ASSUMED_RANK
3696 || (as->type == AS_ASSUMED_SHAPE && upper)))
3697 return NULL;
3699 gcc_assert (!as
3700 || (as->type != AS_DEFERRED
3701 && array->expr_type == EXPR_VARIABLE
3702 && !gfc_expr_attr (array).allocatable
3703 && !gfc_expr_attr (array).pointer));
3705 if (dim == NULL)
3707 /* Multi-dimensional bounds. */
3708 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3709 gfc_expr *e;
3710 int k;
3712 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
3713 if (upper && as && as->type == AS_ASSUMED_SIZE)
3715 /* An error message will be emitted in
3716 check_assumed_size_reference (resolve.c). */
3717 return &gfc_bad_expr;
3720 /* Simplify the bounds for each dimension. */
3721 for (d = 0; d < array->rank; d++)
3723 bounds[d] = simplify_bound_dim (array, kind, d + 1, upper, as, ref,
3724 false);
3725 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3727 int j;
3729 for (j = 0; j < d; j++)
3730 gfc_free_expr (bounds[j]);
3731 return bounds[d];
3735 /* Allocate the result expression. */
3736 k = get_kind (BT_INTEGER, kind, upper ? "UBOUND" : "LBOUND",
3737 gfc_default_integer_kind);
3738 if (k == -1)
3739 return &gfc_bad_expr;
3741 e = gfc_get_array_expr (BT_INTEGER, k, &array->where);
3743 /* The result is a rank 1 array; its size is the rank of the first
3744 argument to {L,U}BOUND. */
3745 e->rank = 1;
3746 e->shape = gfc_get_shape (1);
3747 mpz_init_set_ui (e->shape[0], array->rank);
3749 /* Create the constructor for this array. */
3750 for (d = 0; d < array->rank; d++)
3751 gfc_constructor_append_expr (&e->value.constructor,
3752 bounds[d], &e->where);
3754 return e;
3756 else
3758 /* A DIM argument is specified. */
3759 if (dim->expr_type != EXPR_CONSTANT)
3760 return NULL;
3762 d = mpz_get_si (dim->value.integer);
3764 if ((d < 1 || d > array->rank)
3765 || (d == array->rank && as && as->type == AS_ASSUMED_SIZE && upper))
3767 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3768 return &gfc_bad_expr;
3771 if (as && as->type == AS_ASSUMED_RANK)
3772 return NULL;
3774 return simplify_bound_dim (array, kind, d, upper, as, ref, false);
3779 static gfc_expr *
3780 simplify_cobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind, int upper)
3782 gfc_ref *ref;
3783 gfc_array_spec *as;
3784 int d;
3786 if (array->expr_type != EXPR_VARIABLE)
3787 return NULL;
3789 /* Follow any component references. */
3790 as = (array->ts.type == BT_CLASS && array->ts.u.derived->components)
3791 ? array->ts.u.derived->components->as
3792 : array->symtree->n.sym->as;
3793 for (ref = array->ref; ref; ref = ref->next)
3795 switch (ref->type)
3797 case REF_ARRAY:
3798 switch (ref->u.ar.type)
3800 case AR_ELEMENT:
3801 if (ref->u.ar.as->corank > 0)
3803 gcc_assert (as == ref->u.ar.as);
3804 goto done;
3806 as = NULL;
3807 continue;
3809 case AR_FULL:
3810 /* We're done because 'as' has already been set in the
3811 previous iteration. */
3812 goto done;
3814 case AR_UNKNOWN:
3815 return NULL;
3817 case AR_SECTION:
3818 as = ref->u.ar.as;
3819 goto done;
3822 gcc_unreachable ();
3824 case REF_COMPONENT:
3825 as = ref->u.c.component->as;
3826 continue;
3828 case REF_SUBSTRING:
3829 continue;
3833 if (!as)
3834 gcc_unreachable ();
3836 done:
3838 if (as->cotype == AS_DEFERRED || as->cotype == AS_ASSUMED_SHAPE)
3839 return NULL;
3841 if (dim == NULL)
3843 /* Multi-dimensional cobounds. */
3844 gfc_expr *bounds[GFC_MAX_DIMENSIONS];
3845 gfc_expr *e;
3846 int k;
3848 /* Simplify the cobounds for each dimension. */
3849 for (d = 0; d < as->corank; d++)
3851 bounds[d] = simplify_bound_dim (array, kind, d + 1 + as->rank,
3852 upper, as, ref, true);
3853 if (bounds[d] == NULL || bounds[d] == &gfc_bad_expr)
3855 int j;
3857 for (j = 0; j < d; j++)
3858 gfc_free_expr (bounds[j]);
3859 return bounds[d];
3863 /* Allocate the result expression. */
3864 e = gfc_get_expr ();
3865 e->where = array->where;
3866 e->expr_type = EXPR_ARRAY;
3867 e->ts.type = BT_INTEGER;
3868 k = get_kind (BT_INTEGER, kind, upper ? "UCOBOUND" : "LCOBOUND",
3869 gfc_default_integer_kind);
3870 if (k == -1)
3872 gfc_free_expr (e);
3873 return &gfc_bad_expr;
3875 e->ts.kind = k;
3877 /* The result is a rank 1 array; its size is the rank of the first
3878 argument to {L,U}COBOUND. */
3879 e->rank = 1;
3880 e->shape = gfc_get_shape (1);
3881 mpz_init_set_ui (e->shape[0], as->corank);
3883 /* Create the constructor for this array. */
3884 for (d = 0; d < as->corank; d++)
3885 gfc_constructor_append_expr (&e->value.constructor,
3886 bounds[d], &e->where);
3887 return e;
3889 else
3891 /* A DIM argument is specified. */
3892 if (dim->expr_type != EXPR_CONSTANT)
3893 return NULL;
3895 d = mpz_get_si (dim->value.integer);
3897 if (d < 1 || d > as->corank)
3899 gfc_error ("DIM argument at %L is out of bounds", &dim->where);
3900 return &gfc_bad_expr;
3903 return simplify_bound_dim (array, kind, d+as->rank, upper, as, ref, true);
3908 gfc_expr *
3909 gfc_simplify_lbound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3911 return simplify_bound (array, dim, kind, 0);
3915 gfc_expr *
3916 gfc_simplify_lcobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
3918 return simplify_cobound (array, dim, kind, 0);
3921 gfc_expr *
3922 gfc_simplify_leadz (gfc_expr *e)
3924 unsigned long lz, bs;
3925 int i;
3927 if (e->expr_type != EXPR_CONSTANT)
3928 return NULL;
3930 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
3931 bs = gfc_integer_kinds[i].bit_size;
3932 if (mpz_cmp_si (e->value.integer, 0) == 0)
3933 lz = bs;
3934 else if (mpz_cmp_si (e->value.integer, 0) < 0)
3935 lz = 0;
3936 else
3937 lz = bs - mpz_sizeinbase (e->value.integer, 2);
3939 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, lz);
3943 gfc_expr *
3944 gfc_simplify_len (gfc_expr *e, gfc_expr *kind)
3946 gfc_expr *result;
3947 int k = get_kind (BT_INTEGER, kind, "LEN", gfc_default_integer_kind);
3949 if (k == -1)
3950 return &gfc_bad_expr;
3952 if (e->expr_type == EXPR_CONSTANT)
3954 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3955 mpz_set_si (result->value.integer, e->value.character.length);
3956 return range_check (result, "LEN");
3958 else if (e->ts.u.cl != NULL && e->ts.u.cl->length != NULL
3959 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT
3960 && e->ts.u.cl->length->ts.type == BT_INTEGER)
3962 result = gfc_get_constant_expr (BT_INTEGER, k, &e->where);
3963 mpz_set (result->value.integer, e->ts.u.cl->length->value.integer);
3964 return range_check (result, "LEN");
3966 else if (e->expr_type == EXPR_VARIABLE && e->ts.type == BT_CHARACTER
3967 && e->symtree->n.sym
3968 && e->symtree->n.sym->ts.type != BT_DERIVED
3969 && e->symtree->n.sym->assoc && e->symtree->n.sym->assoc->target
3970 && e->symtree->n.sym->assoc->target->ts.type == BT_DERIVED
3971 && e->symtree->n.sym->assoc->target->symtree->n.sym
3972 && UNLIMITED_POLY (e->symtree->n.sym->assoc->target->symtree->n.sym))
3974 /* The expression in assoc->target points to a ref to the _data component
3975 of the unlimited polymorphic entity. To get the _len component the last
3976 _data ref needs to be stripped and a ref to the _len component added. */
3977 return gfc_get_len_component (e->symtree->n.sym->assoc->target);
3978 else
3979 return NULL;
3983 gfc_expr *
3984 gfc_simplify_len_trim (gfc_expr *e, gfc_expr *kind)
3986 gfc_expr *result;
3987 int count, len, i;
3988 int k = get_kind (BT_INTEGER, kind, "LEN_TRIM", gfc_default_integer_kind);
3990 if (k == -1)
3991 return &gfc_bad_expr;
3993 if (e->expr_type != EXPR_CONSTANT)
3994 return NULL;
3996 len = e->value.character.length;
3997 for (count = 0, i = 1; i <= len; i++)
3998 if (e->value.character.string[len - i] == ' ')
3999 count++;
4000 else
4001 break;
4003 result = gfc_get_int_expr (k, &e->where, len - count);
4004 return range_check (result, "LEN_TRIM");
4007 gfc_expr *
4008 gfc_simplify_lgamma (gfc_expr *x)
4010 gfc_expr *result;
4011 int sg;
4013 if (x->expr_type != EXPR_CONSTANT)
4014 return NULL;
4016 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
4017 mpfr_lgamma (result->value.real, &sg, x->value.real, GFC_RND_MODE);
4019 return range_check (result, "LGAMMA");
4023 gfc_expr *
4024 gfc_simplify_lge (gfc_expr *a, gfc_expr *b)
4026 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
4027 return NULL;
4029 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
4030 gfc_compare_string (a, b) >= 0);
4034 gfc_expr *
4035 gfc_simplify_lgt (gfc_expr *a, gfc_expr *b)
4037 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
4038 return NULL;
4040 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
4041 gfc_compare_string (a, b) > 0);
4045 gfc_expr *
4046 gfc_simplify_lle (gfc_expr *a, gfc_expr *b)
4048 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
4049 return NULL;
4051 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
4052 gfc_compare_string (a, b) <= 0);
4056 gfc_expr *
4057 gfc_simplify_llt (gfc_expr *a, gfc_expr *b)
4059 if (a->expr_type != EXPR_CONSTANT || b->expr_type != EXPR_CONSTANT)
4060 return NULL;
4062 return gfc_get_logical_expr (gfc_default_logical_kind, &a->where,
4063 gfc_compare_string (a, b) < 0);
4067 gfc_expr *
4068 gfc_simplify_log (gfc_expr *x)
4070 gfc_expr *result;
4072 if (x->expr_type != EXPR_CONSTANT)
4073 return NULL;
4075 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
4077 switch (x->ts.type)
4079 case BT_REAL:
4080 if (mpfr_sgn (x->value.real) <= 0)
4082 gfc_error ("Argument of LOG at %L cannot be less than or equal "
4083 "to zero", &x->where);
4084 gfc_free_expr (result);
4085 return &gfc_bad_expr;
4088 mpfr_log (result->value.real, x->value.real, GFC_RND_MODE);
4089 break;
4091 case BT_COMPLEX:
4092 if (mpfr_zero_p (mpc_realref (x->value.complex))
4093 && mpfr_zero_p (mpc_imagref (x->value.complex)))
4095 gfc_error ("Complex argument of LOG at %L cannot be zero",
4096 &x->where);
4097 gfc_free_expr (result);
4098 return &gfc_bad_expr;
4101 gfc_set_model_kind (x->ts.kind);
4102 mpc_log (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
4103 break;
4105 default:
4106 gfc_internal_error ("gfc_simplify_log: bad type");
4109 return range_check (result, "LOG");
4113 gfc_expr *
4114 gfc_simplify_log10 (gfc_expr *x)
4116 gfc_expr *result;
4118 if (x->expr_type != EXPR_CONSTANT)
4119 return NULL;
4121 if (mpfr_sgn (x->value.real) <= 0)
4123 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
4124 "to zero", &x->where);
4125 return &gfc_bad_expr;
4128 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
4129 mpfr_log10 (result->value.real, x->value.real, GFC_RND_MODE);
4131 return range_check (result, "LOG10");
4135 gfc_expr *
4136 gfc_simplify_logical (gfc_expr *e, gfc_expr *k)
4138 int kind;
4140 kind = get_kind (BT_LOGICAL, k, "LOGICAL", gfc_default_logical_kind);
4141 if (kind < 0)
4142 return &gfc_bad_expr;
4144 if (e->expr_type != EXPR_CONSTANT)
4145 return NULL;
4147 return gfc_get_logical_expr (kind, &e->where, e->value.logical);
4151 gfc_expr*
4152 gfc_simplify_matmul (gfc_expr *matrix_a, gfc_expr *matrix_b)
4154 gfc_expr *result;
4155 int row, result_rows, col, result_columns;
4156 int stride_a, offset_a, stride_b, offset_b;
4158 if (!is_constant_array_expr (matrix_a)
4159 || !is_constant_array_expr (matrix_b))
4160 return NULL;
4162 gcc_assert (gfc_compare_types (&matrix_a->ts, &matrix_b->ts));
4163 result = gfc_get_array_expr (matrix_a->ts.type,
4164 matrix_a->ts.kind,
4165 &matrix_a->where);
4167 if (matrix_a->rank == 1 && matrix_b->rank == 2)
4169 result_rows = 1;
4170 result_columns = mpz_get_si (matrix_b->shape[1]);
4171 stride_a = 1;
4172 stride_b = mpz_get_si (matrix_b->shape[0]);
4174 result->rank = 1;
4175 result->shape = gfc_get_shape (result->rank);
4176 mpz_init_set_si (result->shape[0], result_columns);
4178 else if (matrix_a->rank == 2 && matrix_b->rank == 1)
4180 result_rows = mpz_get_si (matrix_a->shape[0]);
4181 result_columns = 1;
4182 stride_a = mpz_get_si (matrix_a->shape[0]);
4183 stride_b = 1;
4185 result->rank = 1;
4186 result->shape = gfc_get_shape (result->rank);
4187 mpz_init_set_si (result->shape[0], result_rows);
4189 else if (matrix_a->rank == 2 && matrix_b->rank == 2)
4191 result_rows = mpz_get_si (matrix_a->shape[0]);
4192 result_columns = mpz_get_si (matrix_b->shape[1]);
4193 stride_a = mpz_get_si (matrix_a->shape[0]);
4194 stride_b = mpz_get_si (matrix_b->shape[0]);
4196 result->rank = 2;
4197 result->shape = gfc_get_shape (result->rank);
4198 mpz_init_set_si (result->shape[0], result_rows);
4199 mpz_init_set_si (result->shape[1], result_columns);
4201 else
4202 gcc_unreachable();
4204 offset_a = offset_b = 0;
4205 for (col = 0; col < result_columns; ++col)
4207 offset_a = 0;
4209 for (row = 0; row < result_rows; ++row)
4211 gfc_expr *e = compute_dot_product (matrix_a, stride_a, offset_a,
4212 matrix_b, 1, offset_b, false);
4213 gfc_constructor_append_expr (&result->value.constructor,
4214 e, NULL);
4216 offset_a += 1;
4219 offset_b += stride_b;
4222 return result;
4226 gfc_expr *
4227 gfc_simplify_maskr (gfc_expr *i, gfc_expr *kind_arg)
4229 gfc_expr *result;
4230 int kind, arg, k;
4231 const char *s;
4233 if (i->expr_type != EXPR_CONSTANT)
4234 return NULL;
4236 kind = get_kind (BT_INTEGER, kind_arg, "MASKR", gfc_default_integer_kind);
4237 if (kind == -1)
4238 return &gfc_bad_expr;
4239 k = gfc_validate_kind (BT_INTEGER, kind, false);
4241 s = gfc_extract_int (i, &arg);
4242 gcc_assert (!s);
4244 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
4246 /* MASKR(n) = 2^n - 1 */
4247 mpz_set_ui (result->value.integer, 1);
4248 mpz_mul_2exp (result->value.integer, result->value.integer, arg);
4249 mpz_sub_ui (result->value.integer, result->value.integer, 1);
4251 gfc_convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
4253 return result;
4257 gfc_expr *
4258 gfc_simplify_maskl (gfc_expr *i, gfc_expr *kind_arg)
4260 gfc_expr *result;
4261 int kind, arg, k;
4262 const char *s;
4263 mpz_t z;
4265 if (i->expr_type != EXPR_CONSTANT)
4266 return NULL;
4268 kind = get_kind (BT_INTEGER, kind_arg, "MASKL", gfc_default_integer_kind);
4269 if (kind == -1)
4270 return &gfc_bad_expr;
4271 k = gfc_validate_kind (BT_INTEGER, kind, false);
4273 s = gfc_extract_int (i, &arg);
4274 gcc_assert (!s);
4276 result = gfc_get_constant_expr (BT_INTEGER, kind, &i->where);
4278 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
4279 mpz_init_set_ui (z, 1);
4280 mpz_mul_2exp (z, z, gfc_integer_kinds[k].bit_size);
4281 mpz_set_ui (result->value.integer, 1);
4282 mpz_mul_2exp (result->value.integer, result->value.integer,
4283 gfc_integer_kinds[k].bit_size - arg);
4284 mpz_sub (result->value.integer, z, result->value.integer);
4285 mpz_clear (z);
4287 gfc_convert_mpz_to_signed (result->value.integer, gfc_integer_kinds[k].bit_size);
4289 return result;
4293 gfc_expr *
4294 gfc_simplify_merge (gfc_expr *tsource, gfc_expr *fsource, gfc_expr *mask)
4296 gfc_expr * result;
4297 gfc_constructor *tsource_ctor, *fsource_ctor, *mask_ctor;
4299 if (mask->expr_type == EXPR_CONSTANT)
4300 return gfc_get_parentheses (gfc_copy_expr (mask->value.logical
4301 ? tsource : fsource));
4303 if (!mask->rank || !is_constant_array_expr (mask)
4304 || !is_constant_array_expr (tsource) || !is_constant_array_expr (fsource))
4305 return NULL;
4307 result = gfc_get_array_expr (tsource->ts.type, tsource->ts.kind,
4308 &tsource->where);
4309 if (tsource->ts.type == BT_DERIVED)
4310 result->ts.u.derived = tsource->ts.u.derived;
4311 else if (tsource->ts.type == BT_CHARACTER)
4312 result->ts.u.cl = tsource->ts.u.cl;
4314 tsource_ctor = gfc_constructor_first (tsource->value.constructor);
4315 fsource_ctor = gfc_constructor_first (fsource->value.constructor);
4316 mask_ctor = gfc_constructor_first (mask->value.constructor);
4318 while (mask_ctor)
4320 if (mask_ctor->expr->value.logical)
4321 gfc_constructor_append_expr (&result->value.constructor,
4322 gfc_copy_expr (tsource_ctor->expr),
4323 NULL);
4324 else
4325 gfc_constructor_append_expr (&result->value.constructor,
4326 gfc_copy_expr (fsource_ctor->expr),
4327 NULL);
4328 tsource_ctor = gfc_constructor_next (tsource_ctor);
4329 fsource_ctor = gfc_constructor_next (fsource_ctor);
4330 mask_ctor = gfc_constructor_next (mask_ctor);
4333 result->shape = gfc_get_shape (1);
4334 gfc_array_size (result, &result->shape[0]);
4336 return result;
4340 gfc_expr *
4341 gfc_simplify_merge_bits (gfc_expr *i, gfc_expr *j, gfc_expr *mask_expr)
4343 mpz_t arg1, arg2, mask;
4344 gfc_expr *result;
4346 if (i->expr_type != EXPR_CONSTANT || j->expr_type != EXPR_CONSTANT
4347 || mask_expr->expr_type != EXPR_CONSTANT)
4348 return NULL;
4350 result = gfc_get_constant_expr (BT_INTEGER, i->ts.kind, &i->where);
4352 /* Convert all argument to unsigned. */
4353 mpz_init_set (arg1, i->value.integer);
4354 mpz_init_set (arg2, j->value.integer);
4355 mpz_init_set (mask, mask_expr->value.integer);
4357 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
4358 mpz_and (arg1, arg1, mask);
4359 mpz_com (mask, mask);
4360 mpz_and (arg2, arg2, mask);
4361 mpz_ior (result->value.integer, arg1, arg2);
4363 mpz_clear (arg1);
4364 mpz_clear (arg2);
4365 mpz_clear (mask);
4367 return result;
4371 /* Selects between current value and extremum for simplify_min_max
4372 and simplify_minval_maxval. */
4373 static void
4374 min_max_choose (gfc_expr *arg, gfc_expr *extremum, int sign)
4376 switch (arg->ts.type)
4378 case BT_INTEGER:
4379 if (mpz_cmp (arg->value.integer,
4380 extremum->value.integer) * sign > 0)
4381 mpz_set (extremum->value.integer, arg->value.integer);
4382 break;
4384 case BT_REAL:
4385 /* We need to use mpfr_min and mpfr_max to treat NaN properly. */
4386 if (sign > 0)
4387 mpfr_max (extremum->value.real, extremum->value.real,
4388 arg->value.real, GFC_RND_MODE);
4389 else
4390 mpfr_min (extremum->value.real, extremum->value.real,
4391 arg->value.real, GFC_RND_MODE);
4392 break;
4394 case BT_CHARACTER:
4395 #define LENGTH(x) ((x)->value.character.length)
4396 #define STRING(x) ((x)->value.character.string)
4397 if (LENGTH (extremum) < LENGTH(arg))
4399 gfc_char_t *tmp = STRING(extremum);
4401 STRING(extremum) = gfc_get_wide_string (LENGTH(arg) + 1);
4402 memcpy (STRING(extremum), tmp,
4403 LENGTH(extremum) * sizeof (gfc_char_t));
4404 gfc_wide_memset (&STRING(extremum)[LENGTH(extremum)], ' ',
4405 LENGTH(arg) - LENGTH(extremum));
4406 STRING(extremum)[LENGTH(arg)] = '\0'; /* For debugger */
4407 LENGTH(extremum) = LENGTH(arg);
4408 free (tmp);
4411 if (gfc_compare_string (arg, extremum) * sign > 0)
4413 free (STRING(extremum));
4414 STRING(extremum) = gfc_get_wide_string (LENGTH(extremum) + 1);
4415 memcpy (STRING(extremum), STRING(arg),
4416 LENGTH(arg) * sizeof (gfc_char_t));
4417 gfc_wide_memset (&STRING(extremum)[LENGTH(arg)], ' ',
4418 LENGTH(extremum) - LENGTH(arg));
4419 STRING(extremum)[LENGTH(extremum)] = '\0'; /* For debugger */
4421 #undef LENGTH
4422 #undef STRING
4423 break;
4425 default:
4426 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
4431 /* This function is special since MAX() can take any number of
4432 arguments. The simplified expression is a rewritten version of the
4433 argument list containing at most one constant element. Other
4434 constant elements are deleted. Because the argument list has
4435 already been checked, this function always succeeds. sign is 1 for
4436 MAX(), -1 for MIN(). */
4438 static gfc_expr *
4439 simplify_min_max (gfc_expr *expr, int sign)
4441 gfc_actual_arglist *arg, *last, *extremum;
4442 gfc_intrinsic_sym * specific;
4444 last = NULL;
4445 extremum = NULL;
4446 specific = expr->value.function.isym;
4448 arg = expr->value.function.actual;
4450 for (; arg; last = arg, arg = arg->next)
4452 if (arg->expr->expr_type != EXPR_CONSTANT)
4453 continue;
4455 if (extremum == NULL)
4457 extremum = arg;
4458 continue;
4461 min_max_choose (arg->expr, extremum->expr, sign);
4463 /* Delete the extra constant argument. */
4464 last->next = arg->next;
4466 arg->next = NULL;
4467 gfc_free_actual_arglist (arg);
4468 arg = last;
4471 /* If there is one value left, replace the function call with the
4472 expression. */
4473 if (expr->value.function.actual->next != NULL)
4474 return NULL;
4476 /* Convert to the correct type and kind. */
4477 if (expr->ts.type != BT_UNKNOWN)
4478 return gfc_convert_constant (expr->value.function.actual->expr,
4479 expr->ts.type, expr->ts.kind);
4481 if (specific->ts.type != BT_UNKNOWN)
4482 return gfc_convert_constant (expr->value.function.actual->expr,
4483 specific->ts.type, specific->ts.kind);
4485 return gfc_copy_expr (expr->value.function.actual->expr);
4489 gfc_expr *
4490 gfc_simplify_min (gfc_expr *e)
4492 return simplify_min_max (e, -1);
4496 gfc_expr *
4497 gfc_simplify_max (gfc_expr *e)
4499 return simplify_min_max (e, 1);
4503 /* This is a simplified version of simplify_min_max to provide
4504 simplification of minval and maxval for a vector. */
4506 static gfc_expr *
4507 simplify_minval_maxval (gfc_expr *expr, int sign)
4509 gfc_constructor *c, *extremum;
4510 gfc_intrinsic_sym * specific;
4512 extremum = NULL;
4513 specific = expr->value.function.isym;
4515 for (c = gfc_constructor_first (expr->value.constructor);
4516 c; c = gfc_constructor_next (c))
4518 if (c->expr->expr_type != EXPR_CONSTANT)
4519 return NULL;
4521 if (extremum == NULL)
4523 extremum = c;
4524 continue;
4527 min_max_choose (c->expr, extremum->expr, sign);
4530 if (extremum == NULL)
4531 return NULL;
4533 /* Convert to the correct type and kind. */
4534 if (expr->ts.type != BT_UNKNOWN)
4535 return gfc_convert_constant (extremum->expr,
4536 expr->ts.type, expr->ts.kind);
4538 if (specific->ts.type != BT_UNKNOWN)
4539 return gfc_convert_constant (extremum->expr,
4540 specific->ts.type, specific->ts.kind);
4542 return gfc_copy_expr (extremum->expr);
4546 gfc_expr *
4547 gfc_simplify_minval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
4549 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
4550 return NULL;
4552 return simplify_minval_maxval (array, -1);
4556 gfc_expr *
4557 gfc_simplify_maxval (gfc_expr *array, gfc_expr* dim, gfc_expr *mask)
4559 if (array->expr_type != EXPR_ARRAY || array->rank != 1 || dim || mask)
4560 return NULL;
4562 return simplify_minval_maxval (array, 1);
4566 gfc_expr *
4567 gfc_simplify_maxexponent (gfc_expr *x)
4569 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4570 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
4571 gfc_real_kinds[i].max_exponent);
4575 gfc_expr *
4576 gfc_simplify_minexponent (gfc_expr *x)
4578 int i = gfc_validate_kind (BT_REAL, x->ts.kind, false);
4579 return gfc_get_int_expr (gfc_default_integer_kind, &x->where,
4580 gfc_real_kinds[i].min_exponent);
4584 gfc_expr *
4585 gfc_simplify_mod (gfc_expr *a, gfc_expr *p)
4587 gfc_expr *result;
4588 int kind;
4590 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
4591 return NULL;
4593 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
4594 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
4596 switch (a->ts.type)
4598 case BT_INTEGER:
4599 if (mpz_cmp_ui (p->value.integer, 0) == 0)
4601 /* Result is processor-dependent. */
4602 gfc_error ("Second argument MOD at %L is zero", &a->where);
4603 gfc_free_expr (result);
4604 return &gfc_bad_expr;
4606 mpz_tdiv_r (result->value.integer, a->value.integer, p->value.integer);
4607 break;
4609 case BT_REAL:
4610 if (mpfr_cmp_ui (p->value.real, 0) == 0)
4612 /* Result is processor-dependent. */
4613 gfc_error ("Second argument of MOD at %L is zero", &p->where);
4614 gfc_free_expr (result);
4615 return &gfc_bad_expr;
4618 gfc_set_model_kind (kind);
4619 mpfr_fmod (result->value.real, a->value.real, p->value.real,
4620 GFC_RND_MODE);
4621 break;
4623 default:
4624 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
4627 return range_check (result, "MOD");
4631 gfc_expr *
4632 gfc_simplify_modulo (gfc_expr *a, gfc_expr *p)
4634 gfc_expr *result;
4635 int kind;
4637 if (a->expr_type != EXPR_CONSTANT || p->expr_type != EXPR_CONSTANT)
4638 return NULL;
4640 kind = a->ts.kind > p->ts.kind ? a->ts.kind : p->ts.kind;
4641 result = gfc_get_constant_expr (a->ts.type, kind, &a->where);
4643 switch (a->ts.type)
4645 case BT_INTEGER:
4646 if (mpz_cmp_ui (p->value.integer, 0) == 0)
4648 /* Result is processor-dependent. This processor just opts
4649 to not handle it at all. */
4650 gfc_error ("Second argument of MODULO at %L is zero", &a->where);
4651 gfc_free_expr (result);
4652 return &gfc_bad_expr;
4654 mpz_fdiv_r (result->value.integer, a->value.integer, p->value.integer);
4656 break;
4658 case BT_REAL:
4659 if (mpfr_cmp_ui (p->value.real, 0) == 0)
4661 /* Result is processor-dependent. */
4662 gfc_error ("Second argument of MODULO at %L is zero", &p->where);
4663 gfc_free_expr (result);
4664 return &gfc_bad_expr;
4667 gfc_set_model_kind (kind);
4668 mpfr_fmod (result->value.real, a->value.real, p->value.real,
4669 GFC_RND_MODE);
4670 if (mpfr_cmp_ui (result->value.real, 0) != 0)
4672 if (mpfr_signbit (a->value.real) != mpfr_signbit (p->value.real))
4673 mpfr_add (result->value.real, result->value.real, p->value.real,
4674 GFC_RND_MODE);
4676 else
4677 mpfr_copysign (result->value.real, result->value.real,
4678 p->value.real, GFC_RND_MODE);
4679 break;
4681 default:
4682 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
4685 return range_check (result, "MODULO");
4689 gfc_expr *
4690 gfc_simplify_nearest (gfc_expr *x, gfc_expr *s)
4692 gfc_expr *result;
4693 mp_exp_t emin, emax;
4694 int kind;
4696 if (x->expr_type != EXPR_CONSTANT || s->expr_type != EXPR_CONSTANT)
4697 return NULL;
4699 result = gfc_copy_expr (x);
4701 /* Save current values of emin and emax. */
4702 emin = mpfr_get_emin ();
4703 emax = mpfr_get_emax ();
4705 /* Set emin and emax for the current model number. */
4706 kind = gfc_validate_kind (BT_REAL, x->ts.kind, 0);
4707 mpfr_set_emin ((mp_exp_t) gfc_real_kinds[kind].min_exponent -
4708 mpfr_get_prec(result->value.real) + 1);
4709 mpfr_set_emax ((mp_exp_t) gfc_real_kinds[kind].max_exponent - 1);
4710 mpfr_check_range (result->value.real, 0, GMP_RNDU);
4712 if (mpfr_sgn (s->value.real) > 0)
4714 mpfr_nextabove (result->value.real);
4715 mpfr_subnormalize (result->value.real, 0, GMP_RNDU);
4717 else
4719 mpfr_nextbelow (result->value.real);
4720 mpfr_subnormalize (result->value.real, 0, GMP_RNDD);
4723 mpfr_set_emin (emin);
4724 mpfr_set_emax (emax);
4726 /* Only NaN can occur. Do not use range check as it gives an
4727 error for denormal numbers. */
4728 if (mpfr_nan_p (result->value.real) && flag_range_check)
4730 gfc_error ("Result of NEAREST is NaN at %L", &result->where);
4731 gfc_free_expr (result);
4732 return &gfc_bad_expr;
4735 return result;
4739 static gfc_expr *
4740 simplify_nint (const char *name, gfc_expr *e, gfc_expr *k)
4742 gfc_expr *itrunc, *result;
4743 int kind;
4745 kind = get_kind (BT_INTEGER, k, name, gfc_default_integer_kind);
4746 if (kind == -1)
4747 return &gfc_bad_expr;
4749 if (e->expr_type != EXPR_CONSTANT)
4750 return NULL;
4752 itrunc = gfc_copy_expr (e);
4753 mpfr_round (itrunc->value.real, e->value.real);
4755 result = gfc_get_constant_expr (BT_INTEGER, kind, &e->where);
4756 gfc_mpfr_to_mpz (result->value.integer, itrunc->value.real, &e->where);
4758 gfc_free_expr (itrunc);
4760 return range_check (result, name);
4764 gfc_expr *
4765 gfc_simplify_new_line (gfc_expr *e)
4767 gfc_expr *result;
4769 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, 1);
4770 result->value.character.string[0] = '\n';
4772 return result;
4776 gfc_expr *
4777 gfc_simplify_nint (gfc_expr *e, gfc_expr *k)
4779 return simplify_nint ("NINT", e, k);
4783 gfc_expr *
4784 gfc_simplify_idnint (gfc_expr *e)
4786 return simplify_nint ("IDNINT", e, NULL);
4790 static gfc_expr *
4791 add_squared (gfc_expr *result, gfc_expr *e)
4793 mpfr_t tmp;
4795 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
4796 gcc_assert (result->ts.type == BT_REAL
4797 && result->expr_type == EXPR_CONSTANT);
4799 gfc_set_model_kind (result->ts.kind);
4800 mpfr_init (tmp);
4801 mpfr_pow_ui (tmp, e->value.real, 2, GFC_RND_MODE);
4802 mpfr_add (result->value.real, result->value.real, tmp,
4803 GFC_RND_MODE);
4804 mpfr_clear (tmp);
4806 return result;
4810 static gfc_expr *
4811 do_sqrt (gfc_expr *result, gfc_expr *e)
4813 gcc_assert (e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT);
4814 gcc_assert (result->ts.type == BT_REAL
4815 && result->expr_type == EXPR_CONSTANT);
4817 mpfr_set (result->value.real, e->value.real, GFC_RND_MODE);
4818 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
4819 return result;
4823 gfc_expr *
4824 gfc_simplify_norm2 (gfc_expr *e, gfc_expr *dim)
4826 gfc_expr *result;
4828 if (!is_constant_array_expr (e)
4829 || (dim != NULL && !gfc_is_constant_expr (dim)))
4830 return NULL;
4832 result = transformational_result (e, dim, e->ts.type, e->ts.kind, &e->where);
4833 init_result_expr (result, 0, NULL);
4835 if (!dim || e->rank == 1)
4837 result = simplify_transformation_to_scalar (result, e, NULL,
4838 add_squared);
4839 mpfr_sqrt (result->value.real, result->value.real, GFC_RND_MODE);
4841 else
4842 result = simplify_transformation_to_array (result, e, dim, NULL,
4843 add_squared, &do_sqrt);
4845 return result;
4849 gfc_expr *
4850 gfc_simplify_not (gfc_expr *e)
4852 gfc_expr *result;
4854 if (e->expr_type != EXPR_CONSTANT)
4855 return NULL;
4857 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
4858 mpz_com (result->value.integer, e->value.integer);
4860 return range_check (result, "NOT");
4864 gfc_expr *
4865 gfc_simplify_null (gfc_expr *mold)
4867 gfc_expr *result;
4869 if (mold)
4871 result = gfc_copy_expr (mold);
4872 result->expr_type = EXPR_NULL;
4874 else
4875 result = gfc_get_null_expr (NULL);
4877 return result;
4881 gfc_expr *
4882 gfc_simplify_num_images (gfc_expr *distance ATTRIBUTE_UNUSED, gfc_expr *failed)
4884 gfc_expr *result;
4886 if (flag_coarray == GFC_FCOARRAY_NONE)
4888 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
4889 return &gfc_bad_expr;
4892 if (flag_coarray != GFC_FCOARRAY_SINGLE)
4893 return NULL;
4895 if (failed && failed->expr_type != EXPR_CONSTANT)
4896 return NULL;
4898 /* FIXME: gfc_current_locus is wrong. */
4899 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
4900 &gfc_current_locus);
4902 if (failed && failed->value.logical != 0)
4903 mpz_set_si (result->value.integer, 0);
4904 else
4905 mpz_set_si (result->value.integer, 1);
4907 return result;
4911 gfc_expr *
4912 gfc_simplify_or (gfc_expr *x, gfc_expr *y)
4914 gfc_expr *result;
4915 int kind;
4917 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
4918 return NULL;
4920 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
4922 switch (x->ts.type)
4924 case BT_INTEGER:
4925 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
4926 mpz_ior (result->value.integer, x->value.integer, y->value.integer);
4927 return range_check (result, "OR");
4929 case BT_LOGICAL:
4930 return gfc_get_logical_expr (kind, &x->where,
4931 x->value.logical || y->value.logical);
4932 default:
4933 gcc_unreachable();
4938 gfc_expr *
4939 gfc_simplify_pack (gfc_expr *array, gfc_expr *mask, gfc_expr *vector)
4941 gfc_expr *result;
4942 gfc_constructor *array_ctor, *mask_ctor, *vector_ctor;
4944 if (!is_constant_array_expr (array)
4945 || !is_constant_array_expr (vector)
4946 || (!gfc_is_constant_expr (mask)
4947 && !is_constant_array_expr (mask)))
4948 return NULL;
4950 result = gfc_get_array_expr (array->ts.type, array->ts.kind, &array->where);
4951 if (array->ts.type == BT_DERIVED)
4952 result->ts.u.derived = array->ts.u.derived;
4954 array_ctor = gfc_constructor_first (array->value.constructor);
4955 vector_ctor = vector
4956 ? gfc_constructor_first (vector->value.constructor)
4957 : NULL;
4959 if (mask->expr_type == EXPR_CONSTANT
4960 && mask->value.logical)
4962 /* Copy all elements of ARRAY to RESULT. */
4963 while (array_ctor)
4965 gfc_constructor_append_expr (&result->value.constructor,
4966 gfc_copy_expr (array_ctor->expr),
4967 NULL);
4969 array_ctor = gfc_constructor_next (array_ctor);
4970 vector_ctor = gfc_constructor_next (vector_ctor);
4973 else if (mask->expr_type == EXPR_ARRAY)
4975 /* Copy only those elements of ARRAY to RESULT whose
4976 MASK equals .TRUE.. */
4977 mask_ctor = gfc_constructor_first (mask->value.constructor);
4978 while (mask_ctor)
4980 if (mask_ctor->expr->value.logical)
4982 gfc_constructor_append_expr (&result->value.constructor,
4983 gfc_copy_expr (array_ctor->expr),
4984 NULL);
4985 vector_ctor = gfc_constructor_next (vector_ctor);
4988 array_ctor = gfc_constructor_next (array_ctor);
4989 mask_ctor = gfc_constructor_next (mask_ctor);
4993 /* Append any left-over elements from VECTOR to RESULT. */
4994 while (vector_ctor)
4996 gfc_constructor_append_expr (&result->value.constructor,
4997 gfc_copy_expr (vector_ctor->expr),
4998 NULL);
4999 vector_ctor = gfc_constructor_next (vector_ctor);
5002 result->shape = gfc_get_shape (1);
5003 gfc_array_size (result, &result->shape[0]);
5005 if (array->ts.type == BT_CHARACTER)
5006 result->ts.u.cl = array->ts.u.cl;
5008 return result;
5012 static gfc_expr *
5013 do_xor (gfc_expr *result, gfc_expr *e)
5015 gcc_assert (e->ts.type == BT_LOGICAL && e->expr_type == EXPR_CONSTANT);
5016 gcc_assert (result->ts.type == BT_LOGICAL
5017 && result->expr_type == EXPR_CONSTANT);
5019 result->value.logical = result->value.logical != e->value.logical;
5020 return result;
5025 gfc_expr *
5026 gfc_simplify_parity (gfc_expr *e, gfc_expr *dim)
5028 return simplify_transformation (e, dim, NULL, 0, do_xor);
5032 gfc_expr *
5033 gfc_simplify_popcnt (gfc_expr *e)
5035 int res, k;
5036 mpz_t x;
5038 if (e->expr_type != EXPR_CONSTANT)
5039 return NULL;
5041 k = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5043 /* Convert argument to unsigned, then count the '1' bits. */
5044 mpz_init_set (x, e->value.integer);
5045 convert_mpz_to_unsigned (x, gfc_integer_kinds[k].bit_size);
5046 res = mpz_popcount (x);
5047 mpz_clear (x);
5049 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, res);
5053 gfc_expr *
5054 gfc_simplify_poppar (gfc_expr *e)
5056 gfc_expr *popcnt;
5057 const char *s;
5058 int i;
5060 if (e->expr_type != EXPR_CONSTANT)
5061 return NULL;
5063 popcnt = gfc_simplify_popcnt (e);
5064 gcc_assert (popcnt);
5066 s = gfc_extract_int (popcnt, &i);
5067 gcc_assert (!s);
5069 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i % 2);
5073 gfc_expr *
5074 gfc_simplify_precision (gfc_expr *e)
5076 int i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5077 return gfc_get_int_expr (gfc_default_integer_kind, &e->where,
5078 gfc_real_kinds[i].precision);
5082 gfc_expr *
5083 gfc_simplify_product (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
5085 return simplify_transformation (array, dim, mask, 1, gfc_multiply);
5089 gfc_expr *
5090 gfc_simplify_radix (gfc_expr *e)
5092 int i;
5093 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5095 switch (e->ts.type)
5097 case BT_INTEGER:
5098 i = gfc_integer_kinds[i].radix;
5099 break;
5101 case BT_REAL:
5102 i = gfc_real_kinds[i].radix;
5103 break;
5105 default:
5106 gcc_unreachable ();
5109 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
5113 gfc_expr *
5114 gfc_simplify_range (gfc_expr *e)
5116 int i;
5117 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
5119 switch (e->ts.type)
5121 case BT_INTEGER:
5122 i = gfc_integer_kinds[i].range;
5123 break;
5125 case BT_REAL:
5126 case BT_COMPLEX:
5127 i = gfc_real_kinds[i].range;
5128 break;
5130 default:
5131 gcc_unreachable ();
5134 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, i);
5138 gfc_expr *
5139 gfc_simplify_rank (gfc_expr *e)
5141 /* Assumed rank. */
5142 if (e->rank == -1)
5143 return NULL;
5145 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, e->rank);
5149 gfc_expr *
5150 gfc_simplify_real (gfc_expr *e, gfc_expr *k)
5152 gfc_expr *result = NULL;
5153 int kind;
5155 if (e->ts.type == BT_COMPLEX)
5156 kind = get_kind (BT_REAL, k, "REAL", e->ts.kind);
5157 else
5158 kind = get_kind (BT_REAL, k, "REAL", gfc_default_real_kind);
5160 if (kind == -1)
5161 return &gfc_bad_expr;
5163 if (e->expr_type != EXPR_CONSTANT)
5164 return NULL;
5166 if (convert_boz (e, kind) == &gfc_bad_expr)
5167 return &gfc_bad_expr;
5169 result = gfc_convert_constant (e, BT_REAL, kind);
5170 if (result == &gfc_bad_expr)
5171 return &gfc_bad_expr;
5173 return range_check (result, "REAL");
5177 gfc_expr *
5178 gfc_simplify_realpart (gfc_expr *e)
5180 gfc_expr *result;
5182 if (e->expr_type != EXPR_CONSTANT)
5183 return NULL;
5185 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
5186 mpc_real (result->value.real, e->value.complex, GFC_RND_MODE);
5188 return range_check (result, "REALPART");
5191 gfc_expr *
5192 gfc_simplify_repeat (gfc_expr *e, gfc_expr *n)
5194 gfc_expr *result;
5195 int i, j, len, ncop, nlen;
5196 mpz_t ncopies;
5197 bool have_length = false;
5199 /* If NCOPIES isn't a constant, there's nothing we can do. */
5200 if (n->expr_type != EXPR_CONSTANT)
5201 return NULL;
5203 /* If NCOPIES is negative, it's an error. */
5204 if (mpz_sgn (n->value.integer) < 0)
5206 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
5207 &n->where);
5208 return &gfc_bad_expr;
5211 /* If we don't know the character length, we can do no more. */
5212 if (e->ts.u.cl && e->ts.u.cl->length
5213 && e->ts.u.cl->length->expr_type == EXPR_CONSTANT)
5215 len = mpz_get_si (e->ts.u.cl->length->value.integer);
5216 have_length = true;
5218 else if (e->expr_type == EXPR_CONSTANT
5219 && (e->ts.u.cl == NULL || e->ts.u.cl->length == NULL))
5221 len = e->value.character.length;
5223 else
5224 return NULL;
5226 /* If the source length is 0, any value of NCOPIES is valid
5227 and everything behaves as if NCOPIES == 0. */
5228 mpz_init (ncopies);
5229 if (len == 0)
5230 mpz_set_ui (ncopies, 0);
5231 else
5232 mpz_set (ncopies, n->value.integer);
5234 /* Check that NCOPIES isn't too large. */
5235 if (len)
5237 mpz_t max, mlen;
5238 int i;
5240 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
5241 mpz_init (max);
5242 i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
5244 if (have_length)
5246 mpz_tdiv_q (max, gfc_integer_kinds[i].huge,
5247 e->ts.u.cl->length->value.integer);
5249 else
5251 mpz_init_set_si (mlen, len);
5252 mpz_tdiv_q (max, gfc_integer_kinds[i].huge, mlen);
5253 mpz_clear (mlen);
5256 /* The check itself. */
5257 if (mpz_cmp (ncopies, max) > 0)
5259 mpz_clear (max);
5260 mpz_clear (ncopies);
5261 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
5262 &n->where);
5263 return &gfc_bad_expr;
5266 mpz_clear (max);
5268 mpz_clear (ncopies);
5270 /* For further simplification, we need the character string to be
5271 constant. */
5272 if (e->expr_type != EXPR_CONSTANT)
5273 return NULL;
5275 if (len ||
5276 (e->ts.u.cl->length &&
5277 mpz_sgn (e->ts.u.cl->length->value.integer) != 0))
5279 const char *res = gfc_extract_int (n, &ncop);
5280 gcc_assert (res == NULL);
5282 else
5283 ncop = 0;
5285 if (ncop == 0)
5286 return gfc_get_character_expr (e->ts.kind, &e->where, NULL, 0);
5288 len = e->value.character.length;
5289 nlen = ncop * len;
5291 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, nlen);
5292 for (i = 0; i < ncop; i++)
5293 for (j = 0; j < len; j++)
5294 result->value.character.string[j+i*len]= e->value.character.string[j];
5296 result->value.character.string[nlen] = '\0'; /* For debugger */
5297 return result;
5301 /* This one is a bear, but mainly has to do with shuffling elements. */
5303 gfc_expr *
5304 gfc_simplify_reshape (gfc_expr *source, gfc_expr *shape_exp,
5305 gfc_expr *pad, gfc_expr *order_exp)
5307 int order[GFC_MAX_DIMENSIONS], shape[GFC_MAX_DIMENSIONS];
5308 int i, rank, npad, x[GFC_MAX_DIMENSIONS];
5309 mpz_t index, size;
5310 unsigned long j;
5311 size_t nsource;
5312 gfc_expr *e, *result;
5314 /* Check that argument expression types are OK. */
5315 if (!is_constant_array_expr (source)
5316 || !is_constant_array_expr (shape_exp)
5317 || !is_constant_array_expr (pad)
5318 || !is_constant_array_expr (order_exp))
5319 return NULL;
5321 if (source->shape == NULL)
5322 return NULL;
5324 /* Proceed with simplification, unpacking the array. */
5326 mpz_init (index);
5327 rank = 0;
5329 for (;;)
5331 e = gfc_constructor_lookup_expr (shape_exp->value.constructor, rank);
5332 if (e == NULL)
5333 break;
5335 gfc_extract_int (e, &shape[rank]);
5337 gcc_assert (rank >= 0 && rank < GFC_MAX_DIMENSIONS);
5338 gcc_assert (shape[rank] >= 0);
5340 rank++;
5343 gcc_assert (rank > 0);
5345 /* Now unpack the order array if present. */
5346 if (order_exp == NULL)
5348 for (i = 0; i < rank; i++)
5349 order[i] = i;
5351 else
5353 for (i = 0; i < rank; i++)
5354 x[i] = 0;
5356 for (i = 0; i < rank; i++)
5358 e = gfc_constructor_lookup_expr (order_exp->value.constructor, i);
5359 gcc_assert (e);
5361 gfc_extract_int (e, &order[i]);
5363 gcc_assert (order[i] >= 1 && order[i] <= rank);
5364 order[i]--;
5365 gcc_assert (x[order[i]] == 0);
5366 x[order[i]] = 1;
5370 /* Count the elements in the source and padding arrays. */
5372 npad = 0;
5373 if (pad != NULL)
5375 gfc_array_size (pad, &size);
5376 npad = mpz_get_ui (size);
5377 mpz_clear (size);
5380 gfc_array_size (source, &size);
5381 nsource = mpz_get_ui (size);
5382 mpz_clear (size);
5384 /* If it weren't for that pesky permutation we could just loop
5385 through the source and round out any shortage with pad elements.
5386 But no, someone just had to have the compiler do something the
5387 user should be doing. */
5389 for (i = 0; i < rank; i++)
5390 x[i] = 0;
5392 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
5393 &source->where);
5394 if (source->ts.type == BT_DERIVED)
5395 result->ts.u.derived = source->ts.u.derived;
5396 result->rank = rank;
5397 result->shape = gfc_get_shape (rank);
5398 for (i = 0; i < rank; i++)
5399 mpz_init_set_ui (result->shape[i], shape[i]);
5401 while (nsource > 0 || npad > 0)
5403 /* Figure out which element to extract. */
5404 mpz_set_ui (index, 0);
5406 for (i = rank - 1; i >= 0; i--)
5408 mpz_add_ui (index, index, x[order[i]]);
5409 if (i != 0)
5410 mpz_mul_ui (index, index, shape[order[i - 1]]);
5413 if (mpz_cmp_ui (index, INT_MAX) > 0)
5414 gfc_internal_error ("Reshaped array too large at %C");
5416 j = mpz_get_ui (index);
5418 if (j < nsource)
5419 e = gfc_constructor_lookup_expr (source->value.constructor, j);
5420 else
5422 if (npad <= 0)
5424 mpz_clear (index);
5425 return NULL;
5427 j = j - nsource;
5428 j = j % npad;
5429 e = gfc_constructor_lookup_expr (pad->value.constructor, j);
5431 gcc_assert (e);
5433 gfc_constructor_append_expr (&result->value.constructor,
5434 gfc_copy_expr (e), &e->where);
5436 /* Calculate the next element. */
5437 i = 0;
5439 inc:
5440 if (++x[i] < shape[i])
5441 continue;
5442 x[i++] = 0;
5443 if (i < rank)
5444 goto inc;
5446 break;
5449 mpz_clear (index);
5451 return result;
5455 gfc_expr *
5456 gfc_simplify_rrspacing (gfc_expr *x)
5458 gfc_expr *result;
5459 int i;
5460 long int e, p;
5462 if (x->expr_type != EXPR_CONSTANT)
5463 return NULL;
5465 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
5467 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5469 /* RRSPACING(+/- 0.0) = 0.0 */
5470 if (mpfr_zero_p (x->value.real))
5472 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5473 return result;
5476 /* RRSPACING(inf) = NaN */
5477 if (mpfr_inf_p (x->value.real))
5479 mpfr_set_nan (result->value.real);
5480 return result;
5483 /* RRSPACING(NaN) = same NaN */
5484 if (mpfr_nan_p (x->value.real))
5486 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
5487 return result;
5490 /* | x * 2**(-e) | * 2**p. */
5491 mpfr_abs (result->value.real, x->value.real, GFC_RND_MODE);
5492 e = - (long int) mpfr_get_exp (x->value.real);
5493 mpfr_mul_2si (result->value.real, result->value.real, e, GFC_RND_MODE);
5495 p = (long int) gfc_real_kinds[i].digits;
5496 mpfr_mul_2si (result->value.real, result->value.real, p, GFC_RND_MODE);
5498 return range_check (result, "RRSPACING");
5502 gfc_expr *
5503 gfc_simplify_scale (gfc_expr *x, gfc_expr *i)
5505 int k, neg_flag, power, exp_range;
5506 mpfr_t scale, radix;
5507 gfc_expr *result;
5509 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
5510 return NULL;
5512 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5514 if (mpfr_zero_p (x->value.real))
5516 mpfr_set_ui (result->value.real, 0, GFC_RND_MODE);
5517 return result;
5520 k = gfc_validate_kind (BT_REAL, x->ts.kind, false);
5522 exp_range = gfc_real_kinds[k].max_exponent - gfc_real_kinds[k].min_exponent;
5524 /* This check filters out values of i that would overflow an int. */
5525 if (mpz_cmp_si (i->value.integer, exp_range + 2) > 0
5526 || mpz_cmp_si (i->value.integer, -exp_range - 2) < 0)
5528 gfc_error ("Result of SCALE overflows its kind at %L", &result->where);
5529 gfc_free_expr (result);
5530 return &gfc_bad_expr;
5533 /* Compute scale = radix ** power. */
5534 power = mpz_get_si (i->value.integer);
5536 if (power >= 0)
5537 neg_flag = 0;
5538 else
5540 neg_flag = 1;
5541 power = -power;
5544 gfc_set_model_kind (x->ts.kind);
5545 mpfr_init (scale);
5546 mpfr_init (radix);
5547 mpfr_set_ui (radix, gfc_real_kinds[k].radix, GFC_RND_MODE);
5548 mpfr_pow_ui (scale, radix, power, GFC_RND_MODE);
5550 if (neg_flag)
5551 mpfr_div (result->value.real, x->value.real, scale, GFC_RND_MODE);
5552 else
5553 mpfr_mul (result->value.real, x->value.real, scale, GFC_RND_MODE);
5555 mpfr_clears (scale, radix, NULL);
5557 return range_check (result, "SCALE");
5561 /* Variants of strspn and strcspn that operate on wide characters. */
5563 static size_t
5564 wide_strspn (const gfc_char_t *s1, const gfc_char_t *s2)
5566 size_t i = 0;
5567 const gfc_char_t *c;
5569 while (s1[i])
5571 for (c = s2; *c; c++)
5573 if (s1[i] == *c)
5574 break;
5576 if (*c == '\0')
5577 break;
5578 i++;
5581 return i;
5584 static size_t
5585 wide_strcspn (const gfc_char_t *s1, const gfc_char_t *s2)
5587 size_t i = 0;
5588 const gfc_char_t *c;
5590 while (s1[i])
5592 for (c = s2; *c; c++)
5594 if (s1[i] == *c)
5595 break;
5597 if (*c)
5598 break;
5599 i++;
5602 return i;
5606 gfc_expr *
5607 gfc_simplify_scan (gfc_expr *e, gfc_expr *c, gfc_expr *b, gfc_expr *kind)
5609 gfc_expr *result;
5610 int back;
5611 size_t i;
5612 size_t indx, len, lenc;
5613 int k = get_kind (BT_INTEGER, kind, "SCAN", gfc_default_integer_kind);
5615 if (k == -1)
5616 return &gfc_bad_expr;
5618 if (e->expr_type != EXPR_CONSTANT || c->expr_type != EXPR_CONSTANT
5619 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
5620 return NULL;
5622 if (b != NULL && b->value.logical != 0)
5623 back = 1;
5624 else
5625 back = 0;
5627 len = e->value.character.length;
5628 lenc = c->value.character.length;
5630 if (len == 0 || lenc == 0)
5632 indx = 0;
5634 else
5636 if (back == 0)
5638 indx = wide_strcspn (e->value.character.string,
5639 c->value.character.string) + 1;
5640 if (indx > len)
5641 indx = 0;
5643 else
5645 i = 0;
5646 for (indx = len; indx > 0; indx--)
5648 for (i = 0; i < lenc; i++)
5650 if (c->value.character.string[i]
5651 == e->value.character.string[indx - 1])
5652 break;
5654 if (i < lenc)
5655 break;
5660 result = gfc_get_int_expr (k, &e->where, indx);
5661 return range_check (result, "SCAN");
5665 gfc_expr *
5666 gfc_simplify_selected_char_kind (gfc_expr *e)
5668 int kind;
5670 if (e->expr_type != EXPR_CONSTANT)
5671 return NULL;
5673 if (gfc_compare_with_Cstring (e, "ascii", false) == 0
5674 || gfc_compare_with_Cstring (e, "default", false) == 0)
5675 kind = 1;
5676 else if (gfc_compare_with_Cstring (e, "iso_10646", false) == 0)
5677 kind = 4;
5678 else
5679 kind = -1;
5681 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
5685 gfc_expr *
5686 gfc_simplify_selected_int_kind (gfc_expr *e)
5688 int i, kind, range;
5690 if (e->expr_type != EXPR_CONSTANT || gfc_extract_int (e, &range) != NULL)
5691 return NULL;
5693 kind = INT_MAX;
5695 for (i = 0; gfc_integer_kinds[i].kind != 0; i++)
5696 if (gfc_integer_kinds[i].range >= range
5697 && gfc_integer_kinds[i].kind < kind)
5698 kind = gfc_integer_kinds[i].kind;
5700 if (kind == INT_MAX)
5701 kind = -1;
5703 return gfc_get_int_expr (gfc_default_integer_kind, &e->where, kind);
5707 gfc_expr *
5708 gfc_simplify_selected_real_kind (gfc_expr *p, gfc_expr *q, gfc_expr *rdx)
5710 int range, precision, radix, i, kind, found_precision, found_range,
5711 found_radix;
5712 locus *loc = &gfc_current_locus;
5714 if (p == NULL)
5715 precision = 0;
5716 else
5718 if (p->expr_type != EXPR_CONSTANT
5719 || gfc_extract_int (p, &precision) != NULL)
5720 return NULL;
5721 loc = &p->where;
5724 if (q == NULL)
5725 range = 0;
5726 else
5728 if (q->expr_type != EXPR_CONSTANT
5729 || gfc_extract_int (q, &range) != NULL)
5730 return NULL;
5732 if (!loc)
5733 loc = &q->where;
5736 if (rdx == NULL)
5737 radix = 0;
5738 else
5740 if (rdx->expr_type != EXPR_CONSTANT
5741 || gfc_extract_int (rdx, &radix) != NULL)
5742 return NULL;
5744 if (!loc)
5745 loc = &rdx->where;
5748 kind = INT_MAX;
5749 found_precision = 0;
5750 found_range = 0;
5751 found_radix = 0;
5753 for (i = 0; gfc_real_kinds[i].kind != 0; i++)
5755 if (gfc_real_kinds[i].precision >= precision)
5756 found_precision = 1;
5758 if (gfc_real_kinds[i].range >= range)
5759 found_range = 1;
5761 if (radix == 0 || gfc_real_kinds[i].radix == radix)
5762 found_radix = 1;
5764 if (gfc_real_kinds[i].precision >= precision
5765 && gfc_real_kinds[i].range >= range
5766 && (radix == 0 || gfc_real_kinds[i].radix == radix)
5767 && gfc_real_kinds[i].kind < kind)
5768 kind = gfc_real_kinds[i].kind;
5771 if (kind == INT_MAX)
5773 if (found_radix && found_range && !found_precision)
5774 kind = -1;
5775 else if (found_radix && found_precision && !found_range)
5776 kind = -2;
5777 else if (found_radix && !found_precision && !found_range)
5778 kind = -3;
5779 else if (found_radix)
5780 kind = -4;
5781 else
5782 kind = -5;
5785 return gfc_get_int_expr (gfc_default_integer_kind, loc, kind);
5789 gfc_expr *
5790 gfc_simplify_set_exponent (gfc_expr *x, gfc_expr *i)
5792 gfc_expr *result;
5793 mpfr_t exp, absv, log2, pow2, frac;
5794 unsigned long exp2;
5796 if (x->expr_type != EXPR_CONSTANT || i->expr_type != EXPR_CONSTANT)
5797 return NULL;
5799 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
5801 /* SET_EXPONENT (+/-0.0, I) = +/- 0.0
5802 SET_EXPONENT (NaN) = same NaN */
5803 if (mpfr_zero_p (x->value.real) || mpfr_nan_p (x->value.real))
5805 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
5806 return result;
5809 /* SET_EXPONENT (inf) = NaN */
5810 if (mpfr_inf_p (x->value.real))
5812 mpfr_set_nan (result->value.real);
5813 return result;
5816 gfc_set_model_kind (x->ts.kind);
5817 mpfr_init (absv);
5818 mpfr_init (log2);
5819 mpfr_init (exp);
5820 mpfr_init (pow2);
5821 mpfr_init (frac);
5823 mpfr_abs (absv, x->value.real, GFC_RND_MODE);
5824 mpfr_log2 (log2, absv, GFC_RND_MODE);
5826 mpfr_trunc (log2, log2);
5827 mpfr_add_ui (exp, log2, 1, GFC_RND_MODE);
5829 /* Old exponent value, and fraction. */
5830 mpfr_ui_pow (pow2, 2, exp, GFC_RND_MODE);
5832 mpfr_div (frac, absv, pow2, GFC_RND_MODE);
5834 /* New exponent. */
5835 exp2 = (unsigned long) mpz_get_d (i->value.integer);
5836 mpfr_mul_2exp (result->value.real, frac, exp2, GFC_RND_MODE);
5838 mpfr_clears (absv, log2, pow2, frac, NULL);
5840 return range_check (result, "SET_EXPONENT");
5844 gfc_expr *
5845 gfc_simplify_shape (gfc_expr *source, gfc_expr *kind)
5847 mpz_t shape[GFC_MAX_DIMENSIONS];
5848 gfc_expr *result, *e, *f;
5849 gfc_array_ref *ar;
5850 int n;
5851 bool t;
5852 int k = get_kind (BT_INTEGER, kind, "SHAPE", gfc_default_integer_kind);
5854 if (source->rank == -1)
5855 return NULL;
5857 result = gfc_get_array_expr (BT_INTEGER, k, &source->where);
5859 if (source->rank == 0)
5860 return result;
5862 if (source->expr_type == EXPR_VARIABLE)
5864 ar = gfc_find_array_ref (source);
5865 t = gfc_array_ref_shape (ar, shape);
5867 else if (source->shape)
5869 t = true;
5870 for (n = 0; n < source->rank; n++)
5872 mpz_init (shape[n]);
5873 mpz_set (shape[n], source->shape[n]);
5876 else
5877 t = false;
5879 for (n = 0; n < source->rank; n++)
5881 e = gfc_get_constant_expr (BT_INTEGER, k, &source->where);
5883 if (t)
5884 mpz_set (e->value.integer, shape[n]);
5885 else
5887 mpz_set_ui (e->value.integer, n + 1);
5889 f = simplify_size (source, e, k);
5890 gfc_free_expr (e);
5891 if (f == NULL)
5893 gfc_free_expr (result);
5894 return NULL;
5896 else
5897 e = f;
5900 if (e == &gfc_bad_expr || range_check (e, "SHAPE") == &gfc_bad_expr)
5902 gfc_free_expr (result);
5903 if (t)
5904 gfc_clear_shape (shape, source->rank);
5905 return &gfc_bad_expr;
5908 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
5911 if (t)
5912 gfc_clear_shape (shape, source->rank);
5914 return result;
5918 static gfc_expr *
5919 simplify_size (gfc_expr *array, gfc_expr *dim, int k)
5921 mpz_t size;
5922 gfc_expr *return_value;
5923 int d;
5925 /* For unary operations, the size of the result is given by the size
5926 of the operand. For binary ones, it's the size of the first operand
5927 unless it is scalar, then it is the size of the second. */
5928 if (array->expr_type == EXPR_OP && !array->value.op.uop)
5930 gfc_expr* replacement;
5931 gfc_expr* simplified;
5933 switch (array->value.op.op)
5935 /* Unary operations. */
5936 case INTRINSIC_NOT:
5937 case INTRINSIC_UPLUS:
5938 case INTRINSIC_UMINUS:
5939 case INTRINSIC_PARENTHESES:
5940 replacement = array->value.op.op1;
5941 break;
5943 /* Binary operations. If any one of the operands is scalar, take
5944 the other one's size. If both of them are arrays, it does not
5945 matter -- try to find one with known shape, if possible. */
5946 default:
5947 if (array->value.op.op1->rank == 0)
5948 replacement = array->value.op.op2;
5949 else if (array->value.op.op2->rank == 0)
5950 replacement = array->value.op.op1;
5951 else
5953 simplified = simplify_size (array->value.op.op1, dim, k);
5954 if (simplified)
5955 return simplified;
5957 replacement = array->value.op.op2;
5959 break;
5962 /* Try to reduce it directly if possible. */
5963 simplified = simplify_size (replacement, dim, k);
5965 /* Otherwise, we build a new SIZE call. This is hopefully at least
5966 simpler than the original one. */
5967 if (!simplified)
5969 gfc_expr *kind = gfc_get_int_expr (gfc_default_integer_kind, NULL, k);
5970 simplified = gfc_build_intrinsic_call (gfc_current_ns,
5971 GFC_ISYM_SIZE, "size",
5972 array->where, 3,
5973 gfc_copy_expr (replacement),
5974 gfc_copy_expr (dim),
5975 kind);
5977 return simplified;
5980 if (dim == NULL)
5982 if (!gfc_array_size (array, &size))
5983 return NULL;
5985 else
5987 if (dim->expr_type != EXPR_CONSTANT)
5988 return NULL;
5990 d = mpz_get_ui (dim->value.integer) - 1;
5991 if (!gfc_array_dimen_size (array, d, &size))
5992 return NULL;
5995 return_value = gfc_get_constant_expr (BT_INTEGER, k, &array->where);
5996 mpz_set (return_value->value.integer, size);
5997 mpz_clear (size);
5999 return return_value;
6003 gfc_expr *
6004 gfc_simplify_size (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6006 gfc_expr *result;
6007 int k = get_kind (BT_INTEGER, kind, "SIZE", gfc_default_integer_kind);
6009 if (k == -1)
6010 return &gfc_bad_expr;
6012 result = simplify_size (array, dim, k);
6013 if (result == NULL || result == &gfc_bad_expr)
6014 return result;
6016 return range_check (result, "SIZE");
6020 /* SIZEOF and C_SIZEOF return the size in bytes of an array element
6021 multiplied by the array size. */
6023 gfc_expr *
6024 gfc_simplify_sizeof (gfc_expr *x)
6026 gfc_expr *result = NULL;
6027 mpz_t array_size;
6029 if (x->ts.type == BT_CLASS || x->ts.deferred)
6030 return NULL;
6032 if (x->ts.type == BT_CHARACTER
6033 && (!x->ts.u.cl || !x->ts.u.cl->length
6034 || x->ts.u.cl->length->expr_type != EXPR_CONSTANT))
6035 return NULL;
6037 if (x->rank && x->expr_type != EXPR_ARRAY
6038 && !gfc_array_size (x, &array_size))
6039 return NULL;
6041 result = gfc_get_constant_expr (BT_INTEGER, gfc_index_integer_kind,
6042 &x->where);
6043 mpz_set_si (result->value.integer, gfc_target_expr_size (x));
6045 return result;
6049 /* STORAGE_SIZE returns the size in bits of a single array element. */
6051 gfc_expr *
6052 gfc_simplify_storage_size (gfc_expr *x,
6053 gfc_expr *kind)
6055 gfc_expr *result = NULL;
6056 int k;
6058 if (x->ts.type == BT_CLASS || x->ts.deferred)
6059 return NULL;
6061 if (x->ts.type == BT_CHARACTER && x->expr_type != EXPR_CONSTANT
6062 && (!x->ts.u.cl || !x->ts.u.cl->length
6063 || x->ts.u.cl->length->expr_type != EXPR_CONSTANT))
6064 return NULL;
6066 k = get_kind (BT_INTEGER, kind, "STORAGE_SIZE", gfc_default_integer_kind);
6067 if (k == -1)
6068 return &gfc_bad_expr;
6070 result = gfc_get_constant_expr (BT_INTEGER, k, &x->where);
6072 mpz_set_si (result->value.integer, gfc_element_size (x));
6073 mpz_mul_ui (result->value.integer, result->value.integer, BITS_PER_UNIT);
6075 return range_check (result, "STORAGE_SIZE");
6079 gfc_expr *
6080 gfc_simplify_sign (gfc_expr *x, gfc_expr *y)
6082 gfc_expr *result;
6084 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
6085 return NULL;
6087 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6089 switch (x->ts.type)
6091 case BT_INTEGER:
6092 mpz_abs (result->value.integer, x->value.integer);
6093 if (mpz_sgn (y->value.integer) < 0)
6094 mpz_neg (result->value.integer, result->value.integer);
6095 break;
6097 case BT_REAL:
6098 if (flag_sign_zero)
6099 mpfr_copysign (result->value.real, x->value.real, y->value.real,
6100 GFC_RND_MODE);
6101 else
6102 mpfr_setsign (result->value.real, x->value.real,
6103 mpfr_sgn (y->value.real) < 0 ? 1 : 0, GFC_RND_MODE);
6104 break;
6106 default:
6107 gfc_internal_error ("Bad type in gfc_simplify_sign");
6110 return result;
6114 gfc_expr *
6115 gfc_simplify_sin (gfc_expr *x)
6117 gfc_expr *result;
6119 if (x->expr_type != EXPR_CONSTANT)
6120 return NULL;
6122 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6124 switch (x->ts.type)
6126 case BT_REAL:
6127 mpfr_sin (result->value.real, x->value.real, GFC_RND_MODE);
6128 break;
6130 case BT_COMPLEX:
6131 gfc_set_model (x->value.real);
6132 mpc_sin (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
6133 break;
6135 default:
6136 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
6139 return range_check (result, "SIN");
6143 gfc_expr *
6144 gfc_simplify_sinh (gfc_expr *x)
6146 gfc_expr *result;
6148 if (x->expr_type != EXPR_CONSTANT)
6149 return NULL;
6151 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6153 switch (x->ts.type)
6155 case BT_REAL:
6156 mpfr_sinh (result->value.real, x->value.real, GFC_RND_MODE);
6157 break;
6159 case BT_COMPLEX:
6160 mpc_sinh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
6161 break;
6163 default:
6164 gcc_unreachable ();
6167 return range_check (result, "SINH");
6171 /* The argument is always a double precision real that is converted to
6172 single precision. TODO: Rounding! */
6174 gfc_expr *
6175 gfc_simplify_sngl (gfc_expr *a)
6177 gfc_expr *result;
6179 if (a->expr_type != EXPR_CONSTANT)
6180 return NULL;
6182 result = gfc_real2real (a, gfc_default_real_kind);
6183 return range_check (result, "SNGL");
6187 gfc_expr *
6188 gfc_simplify_spacing (gfc_expr *x)
6190 gfc_expr *result;
6191 int i;
6192 long int en, ep;
6194 if (x->expr_type != EXPR_CONSTANT)
6195 return NULL;
6197 i = gfc_validate_kind (x->ts.type, x->ts.kind, false);
6198 result = gfc_get_constant_expr (BT_REAL, x->ts.kind, &x->where);
6200 /* SPACING(+/- 0.0) = SPACING(TINY(0.0)) = TINY(0.0) */
6201 if (mpfr_zero_p (x->value.real))
6203 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
6204 return result;
6207 /* SPACING(inf) = NaN */
6208 if (mpfr_inf_p (x->value.real))
6210 mpfr_set_nan (result->value.real);
6211 return result;
6214 /* SPACING(NaN) = same NaN */
6215 if (mpfr_nan_p (x->value.real))
6217 mpfr_set (result->value.real, x->value.real, GFC_RND_MODE);
6218 return result;
6221 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
6222 are the radix, exponent of x, and precision. This excludes the
6223 possibility of subnormal numbers. Fortran 2003 states the result is
6224 b**max(e - p, emin - 1). */
6226 ep = (long int) mpfr_get_exp (x->value.real) - gfc_real_kinds[i].digits;
6227 en = (long int) gfc_real_kinds[i].min_exponent - 1;
6228 en = en > ep ? en : ep;
6230 mpfr_set_ui (result->value.real, 1, GFC_RND_MODE);
6231 mpfr_mul_2si (result->value.real, result->value.real, en, GFC_RND_MODE);
6233 return range_check (result, "SPACING");
6237 gfc_expr *
6238 gfc_simplify_spread (gfc_expr *source, gfc_expr *dim_expr, gfc_expr *ncopies_expr)
6240 gfc_expr *result = NULL;
6241 int nelem, i, j, dim, ncopies;
6242 mpz_t size;
6244 if ((!gfc_is_constant_expr (source)
6245 && !is_constant_array_expr (source))
6246 || !gfc_is_constant_expr (dim_expr)
6247 || !gfc_is_constant_expr (ncopies_expr))
6248 return NULL;
6250 gcc_assert (dim_expr->ts.type == BT_INTEGER);
6251 gfc_extract_int (dim_expr, &dim);
6252 dim -= 1; /* zero-base DIM */
6254 gcc_assert (ncopies_expr->ts.type == BT_INTEGER);
6255 gfc_extract_int (ncopies_expr, &ncopies);
6256 ncopies = MAX (ncopies, 0);
6258 /* Do not allow the array size to exceed the limit for an array
6259 constructor. */
6260 if (source->expr_type == EXPR_ARRAY)
6262 if (!gfc_array_size (source, &size))
6263 gfc_internal_error ("Failure getting length of a constant array.");
6265 else
6266 mpz_init_set_ui (size, 1);
6268 nelem = mpz_get_si (size) * ncopies;
6269 if (nelem > flag_max_array_constructor)
6271 if (gfc_current_ns->sym_root->n.sym->attr.flavor == FL_PARAMETER)
6273 gfc_error ("The number of elements (%d) in the array constructor "
6274 "at %L requires an increase of the allowed %d upper "
6275 "limit. See %<-fmax-array-constructor%> option.",
6276 nelem, &source->where, flag_max_array_constructor);
6277 return &gfc_bad_expr;
6279 else
6280 return NULL;
6283 if (source->expr_type == EXPR_CONSTANT)
6285 gcc_assert (dim == 0);
6287 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
6288 &source->where);
6289 if (source->ts.type == BT_DERIVED)
6290 result->ts.u.derived = source->ts.u.derived;
6291 result->rank = 1;
6292 result->shape = gfc_get_shape (result->rank);
6293 mpz_init_set_si (result->shape[0], ncopies);
6295 for (i = 0; i < ncopies; ++i)
6296 gfc_constructor_append_expr (&result->value.constructor,
6297 gfc_copy_expr (source), NULL);
6299 else if (source->expr_type == EXPR_ARRAY)
6301 int offset, rstride[GFC_MAX_DIMENSIONS], extent[GFC_MAX_DIMENSIONS];
6302 gfc_constructor *source_ctor;
6304 gcc_assert (source->rank < GFC_MAX_DIMENSIONS);
6305 gcc_assert (dim >= 0 && dim <= source->rank);
6307 result = gfc_get_array_expr (source->ts.type, source->ts.kind,
6308 &source->where);
6309 if (source->ts.type == BT_DERIVED)
6310 result->ts.u.derived = source->ts.u.derived;
6311 result->rank = source->rank + 1;
6312 result->shape = gfc_get_shape (result->rank);
6314 for (i = 0, j = 0; i < result->rank; ++i)
6316 if (i != dim)
6317 mpz_init_set (result->shape[i], source->shape[j++]);
6318 else
6319 mpz_init_set_si (result->shape[i], ncopies);
6321 extent[i] = mpz_get_si (result->shape[i]);
6322 rstride[i] = (i == 0) ? 1 : rstride[i-1] * extent[i-1];
6325 offset = 0;
6326 for (source_ctor = gfc_constructor_first (source->value.constructor);
6327 source_ctor; source_ctor = gfc_constructor_next (source_ctor))
6329 for (i = 0; i < ncopies; ++i)
6330 gfc_constructor_insert_expr (&result->value.constructor,
6331 gfc_copy_expr (source_ctor->expr),
6332 NULL, offset + i * rstride[dim]);
6334 offset += (dim == 0 ? ncopies : 1);
6337 else
6339 gfc_error ("Simplification of SPREAD at %C not yet implemented");
6340 return &gfc_bad_expr;
6343 if (source->ts.type == BT_CHARACTER)
6344 result->ts.u.cl = source->ts.u.cl;
6346 return result;
6350 gfc_expr *
6351 gfc_simplify_sqrt (gfc_expr *e)
6353 gfc_expr *result = NULL;
6355 if (e->expr_type != EXPR_CONSTANT)
6356 return NULL;
6358 switch (e->ts.type)
6360 case BT_REAL:
6361 if (mpfr_cmp_si (e->value.real, 0) < 0)
6363 gfc_error ("Argument of SQRT at %L has a negative value",
6364 &e->where);
6365 return &gfc_bad_expr;
6367 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
6368 mpfr_sqrt (result->value.real, e->value.real, GFC_RND_MODE);
6369 break;
6371 case BT_COMPLEX:
6372 gfc_set_model (e->value.real);
6374 result = gfc_get_constant_expr (e->ts.type, e->ts.kind, &e->where);
6375 mpc_sqrt (result->value.complex, e->value.complex, GFC_MPC_RND_MODE);
6376 break;
6378 default:
6379 gfc_internal_error ("invalid argument of SQRT at %L", &e->where);
6382 return range_check (result, "SQRT");
6386 gfc_expr *
6387 gfc_simplify_sum (gfc_expr *array, gfc_expr *dim, gfc_expr *mask)
6389 return simplify_transformation (array, dim, mask, 0, gfc_add);
6393 gfc_expr *
6394 gfc_simplify_cotan (gfc_expr *x)
6396 gfc_expr *result;
6397 mpc_t swp, *val;
6399 if (x->expr_type != EXPR_CONSTANT)
6400 return NULL;
6402 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6404 switch (x->ts.type)
6406 case BT_REAL:
6407 mpfr_cot (result->value.real, x->value.real, GFC_RND_MODE);
6408 break;
6410 case BT_COMPLEX:
6411 /* There is no builtin mpc_cot, so compute cot = cos / sin. */
6412 val = &result->value.complex;
6413 mpc_init2 (swp, mpfr_get_default_prec ());
6414 mpc_cos (swp, x->value.complex, GFC_MPC_RND_MODE);
6415 mpc_sin (*val, x->value.complex, GFC_MPC_RND_MODE);
6416 mpc_div (*val, swp, *val, GFC_MPC_RND_MODE);
6417 mpc_clear (swp);
6418 break;
6420 default:
6421 gcc_unreachable ();
6424 return range_check (result, "COTAN");
6428 gfc_expr *
6429 gfc_simplify_tan (gfc_expr *x)
6431 gfc_expr *result;
6433 if (x->expr_type != EXPR_CONSTANT)
6434 return NULL;
6436 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6438 switch (x->ts.type)
6440 case BT_REAL:
6441 mpfr_tan (result->value.real, x->value.real, GFC_RND_MODE);
6442 break;
6444 case BT_COMPLEX:
6445 mpc_tan (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
6446 break;
6448 default:
6449 gcc_unreachable ();
6452 return range_check (result, "TAN");
6456 gfc_expr *
6457 gfc_simplify_tanh (gfc_expr *x)
6459 gfc_expr *result;
6461 if (x->expr_type != EXPR_CONSTANT)
6462 return NULL;
6464 result = gfc_get_constant_expr (x->ts.type, x->ts.kind, &x->where);
6466 switch (x->ts.type)
6468 case BT_REAL:
6469 mpfr_tanh (result->value.real, x->value.real, GFC_RND_MODE);
6470 break;
6472 case BT_COMPLEX:
6473 mpc_tanh (result->value.complex, x->value.complex, GFC_MPC_RND_MODE);
6474 break;
6476 default:
6477 gcc_unreachable ();
6480 return range_check (result, "TANH");
6484 gfc_expr *
6485 gfc_simplify_tiny (gfc_expr *e)
6487 gfc_expr *result;
6488 int i;
6490 i = gfc_validate_kind (BT_REAL, e->ts.kind, false);
6492 result = gfc_get_constant_expr (BT_REAL, e->ts.kind, &e->where);
6493 mpfr_set (result->value.real, gfc_real_kinds[i].tiny, GFC_RND_MODE);
6495 return result;
6499 gfc_expr *
6500 gfc_simplify_trailz (gfc_expr *e)
6502 unsigned long tz, bs;
6503 int i;
6505 if (e->expr_type != EXPR_CONSTANT)
6506 return NULL;
6508 i = gfc_validate_kind (e->ts.type, e->ts.kind, false);
6509 bs = gfc_integer_kinds[i].bit_size;
6510 tz = mpz_scan1 (e->value.integer, 0);
6512 return gfc_get_int_expr (gfc_default_integer_kind,
6513 &e->where, MIN (tz, bs));
6517 gfc_expr *
6518 gfc_simplify_transfer (gfc_expr *source, gfc_expr *mold, gfc_expr *size)
6520 gfc_expr *result;
6521 gfc_expr *mold_element;
6522 size_t source_size;
6523 size_t result_size;
6524 size_t buffer_size;
6525 mpz_t tmp;
6526 unsigned char *buffer;
6527 size_t result_length;
6530 if (!gfc_is_constant_expr (source)
6531 || (gfc_init_expr_flag && !gfc_is_constant_expr (mold))
6532 || !gfc_is_constant_expr (size))
6533 return NULL;
6535 if (!gfc_calculate_transfer_sizes (source, mold, size, &source_size,
6536 &result_size, &result_length))
6537 return NULL;
6539 /* Calculate the size of the source. */
6540 if (source->expr_type == EXPR_ARRAY
6541 && !gfc_array_size (source, &tmp))
6542 gfc_internal_error ("Failure getting length of a constant array.");
6544 /* Create an empty new expression with the appropriate characteristics. */
6545 result = gfc_get_constant_expr (mold->ts.type, mold->ts.kind,
6546 &source->where);
6547 result->ts = mold->ts;
6549 mold_element = mold->expr_type == EXPR_ARRAY
6550 ? gfc_constructor_first (mold->value.constructor)->expr
6551 : mold;
6553 /* Set result character length, if needed. Note that this needs to be
6554 set even for array expressions, in order to pass this information into
6555 gfc_target_interpret_expr. */
6556 if (result->ts.type == BT_CHARACTER && gfc_is_constant_expr (mold_element))
6557 result->value.character.length = mold_element->value.character.length;
6559 /* Set the number of elements in the result, and determine its size. */
6561 if (mold->expr_type == EXPR_ARRAY || mold->rank || size)
6563 result->expr_type = EXPR_ARRAY;
6564 result->rank = 1;
6565 result->shape = gfc_get_shape (1);
6566 mpz_init_set_ui (result->shape[0], result_length);
6568 else
6569 result->rank = 0;
6571 /* Allocate the buffer to store the binary version of the source. */
6572 buffer_size = MAX (source_size, result_size);
6573 buffer = (unsigned char*)alloca (buffer_size);
6574 memset (buffer, 0, buffer_size);
6576 /* Now write source to the buffer. */
6577 gfc_target_encode_expr (source, buffer, buffer_size);
6579 /* And read the buffer back into the new expression. */
6580 gfc_target_interpret_expr (buffer, buffer_size, result, false);
6582 return result;
6586 gfc_expr *
6587 gfc_simplify_transpose (gfc_expr *matrix)
6589 int row, matrix_rows, col, matrix_cols;
6590 gfc_expr *result;
6592 if (!is_constant_array_expr (matrix))
6593 return NULL;
6595 gcc_assert (matrix->rank == 2);
6597 result = gfc_get_array_expr (matrix->ts.type, matrix->ts.kind,
6598 &matrix->where);
6599 result->rank = 2;
6600 result->shape = gfc_get_shape (result->rank);
6601 mpz_set (result->shape[0], matrix->shape[1]);
6602 mpz_set (result->shape[1], matrix->shape[0]);
6604 if (matrix->ts.type == BT_CHARACTER)
6605 result->ts.u.cl = matrix->ts.u.cl;
6606 else if (matrix->ts.type == BT_DERIVED)
6607 result->ts.u.derived = matrix->ts.u.derived;
6609 matrix_rows = mpz_get_si (matrix->shape[0]);
6610 matrix_cols = mpz_get_si (matrix->shape[1]);
6611 for (row = 0; row < matrix_rows; ++row)
6612 for (col = 0; col < matrix_cols; ++col)
6614 gfc_expr *e = gfc_constructor_lookup_expr (matrix->value.constructor,
6615 col * matrix_rows + row);
6616 gfc_constructor_insert_expr (&result->value.constructor,
6617 gfc_copy_expr (e), &matrix->where,
6618 row * matrix_cols + col);
6621 return result;
6625 gfc_expr *
6626 gfc_simplify_trim (gfc_expr *e)
6628 gfc_expr *result;
6629 int count, i, len, lentrim;
6631 if (e->expr_type != EXPR_CONSTANT)
6632 return NULL;
6634 len = e->value.character.length;
6635 for (count = 0, i = 1; i <= len; ++i)
6637 if (e->value.character.string[len - i] == ' ')
6638 count++;
6639 else
6640 break;
6643 lentrim = len - count;
6645 result = gfc_get_character_expr (e->ts.kind, &e->where, NULL, lentrim);
6646 for (i = 0; i < lentrim; i++)
6647 result->value.character.string[i] = e->value.character.string[i];
6649 return result;
6653 gfc_expr *
6654 gfc_simplify_image_index (gfc_expr *coarray, gfc_expr *sub)
6656 gfc_expr *result;
6657 gfc_ref *ref;
6658 gfc_array_spec *as;
6659 gfc_constructor *sub_cons;
6660 bool first_image;
6661 int d;
6663 if (!is_constant_array_expr (sub))
6664 return NULL;
6666 /* Follow any component references. */
6667 as = coarray->symtree->n.sym->as;
6668 for (ref = coarray->ref; ref; ref = ref->next)
6669 if (ref->type == REF_COMPONENT)
6670 as = ref->u.ar.as;
6672 if (as->type == AS_DEFERRED)
6673 return NULL;
6675 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
6676 the cosubscript addresses the first image. */
6678 sub_cons = gfc_constructor_first (sub->value.constructor);
6679 first_image = true;
6681 for (d = 1; d <= as->corank; d++)
6683 gfc_expr *ca_bound;
6684 int cmp;
6686 gcc_assert (sub_cons != NULL);
6688 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 0, as,
6689 NULL, true);
6690 if (ca_bound == NULL)
6691 return NULL;
6693 if (ca_bound == &gfc_bad_expr)
6694 return ca_bound;
6696 cmp = mpz_cmp (ca_bound->value.integer, sub_cons->expr->value.integer);
6698 if (cmp == 0)
6700 gfc_free_expr (ca_bound);
6701 sub_cons = gfc_constructor_next (sub_cons);
6702 continue;
6705 first_image = false;
6707 if (cmp > 0)
6709 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6710 "SUB has %ld and COARRAY lower bound is %ld)",
6711 &coarray->where, d,
6712 mpz_get_si (sub_cons->expr->value.integer),
6713 mpz_get_si (ca_bound->value.integer));
6714 gfc_free_expr (ca_bound);
6715 return &gfc_bad_expr;
6718 gfc_free_expr (ca_bound);
6720 /* Check whether upperbound is valid for the multi-images case. */
6721 if (d < as->corank)
6723 ca_bound = simplify_bound_dim (coarray, NULL, d + as->rank, 1, as,
6724 NULL, true);
6725 if (ca_bound == &gfc_bad_expr)
6726 return ca_bound;
6728 if (ca_bound && ca_bound->expr_type == EXPR_CONSTANT
6729 && mpz_cmp (ca_bound->value.integer,
6730 sub_cons->expr->value.integer) < 0)
6732 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
6733 "SUB has %ld and COARRAY upper bound is %ld)",
6734 &coarray->where, d,
6735 mpz_get_si (sub_cons->expr->value.integer),
6736 mpz_get_si (ca_bound->value.integer));
6737 gfc_free_expr (ca_bound);
6738 return &gfc_bad_expr;
6741 if (ca_bound)
6742 gfc_free_expr (ca_bound);
6745 sub_cons = gfc_constructor_next (sub_cons);
6748 gcc_assert (sub_cons == NULL);
6750 if (flag_coarray != GFC_FCOARRAY_SINGLE && !first_image)
6751 return NULL;
6753 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
6754 &gfc_current_locus);
6755 if (first_image)
6756 mpz_set_si (result->value.integer, 1);
6757 else
6758 mpz_set_si (result->value.integer, 0);
6760 return result;
6764 gfc_expr *
6765 gfc_simplify_this_image (gfc_expr *coarray, gfc_expr *dim,
6766 gfc_expr *distance ATTRIBUTE_UNUSED)
6768 if (flag_coarray != GFC_FCOARRAY_SINGLE)
6769 return NULL;
6771 /* If no coarray argument has been passed or when the first argument
6772 is actually a distance argment. */
6773 if (coarray == NULL || !gfc_is_coarray (coarray))
6775 gfc_expr *result;
6776 /* FIXME: gfc_current_locus is wrong. */
6777 result = gfc_get_constant_expr (BT_INTEGER, gfc_default_integer_kind,
6778 &gfc_current_locus);
6779 mpz_set_si (result->value.integer, 1);
6780 return result;
6783 /* For -fcoarray=single, this_image(A) is the same as lcobound(A). */
6784 return simplify_cobound (coarray, dim, NULL, 0);
6788 gfc_expr *
6789 gfc_simplify_ubound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6791 return simplify_bound (array, dim, kind, 1);
6794 gfc_expr *
6795 gfc_simplify_ucobound (gfc_expr *array, gfc_expr *dim, gfc_expr *kind)
6797 return simplify_cobound (array, dim, kind, 1);
6801 gfc_expr *
6802 gfc_simplify_unpack (gfc_expr *vector, gfc_expr *mask, gfc_expr *field)
6804 gfc_expr *result, *e;
6805 gfc_constructor *vector_ctor, *mask_ctor, *field_ctor;
6807 if (!is_constant_array_expr (vector)
6808 || !is_constant_array_expr (mask)
6809 || (!gfc_is_constant_expr (field)
6810 && !is_constant_array_expr (field)))
6811 return NULL;
6813 result = gfc_get_array_expr (vector->ts.type, vector->ts.kind,
6814 &vector->where);
6815 if (vector->ts.type == BT_DERIVED)
6816 result->ts.u.derived = vector->ts.u.derived;
6817 result->rank = mask->rank;
6818 result->shape = gfc_copy_shape (mask->shape, mask->rank);
6820 if (vector->ts.type == BT_CHARACTER)
6821 result->ts.u.cl = vector->ts.u.cl;
6823 vector_ctor = gfc_constructor_first (vector->value.constructor);
6824 mask_ctor = gfc_constructor_first (mask->value.constructor);
6825 field_ctor
6826 = field->expr_type == EXPR_ARRAY
6827 ? gfc_constructor_first (field->value.constructor)
6828 : NULL;
6830 while (mask_ctor)
6832 if (mask_ctor->expr->value.logical)
6834 gcc_assert (vector_ctor);
6835 e = gfc_copy_expr (vector_ctor->expr);
6836 vector_ctor = gfc_constructor_next (vector_ctor);
6838 else if (field->expr_type == EXPR_ARRAY)
6839 e = gfc_copy_expr (field_ctor->expr);
6840 else
6841 e = gfc_copy_expr (field);
6843 gfc_constructor_append_expr (&result->value.constructor, e, NULL);
6845 mask_ctor = gfc_constructor_next (mask_ctor);
6846 field_ctor = gfc_constructor_next (field_ctor);
6849 return result;
6853 gfc_expr *
6854 gfc_simplify_verify (gfc_expr *s, gfc_expr *set, gfc_expr *b, gfc_expr *kind)
6856 gfc_expr *result;
6857 int back;
6858 size_t index, len, lenset;
6859 size_t i;
6860 int k = get_kind (BT_INTEGER, kind, "VERIFY", gfc_default_integer_kind);
6862 if (k == -1)
6863 return &gfc_bad_expr;
6865 if (s->expr_type != EXPR_CONSTANT || set->expr_type != EXPR_CONSTANT
6866 || ( b != NULL && b->expr_type != EXPR_CONSTANT))
6867 return NULL;
6869 if (b != NULL && b->value.logical != 0)
6870 back = 1;
6871 else
6872 back = 0;
6874 result = gfc_get_constant_expr (BT_INTEGER, k, &s->where);
6876 len = s->value.character.length;
6877 lenset = set->value.character.length;
6879 if (len == 0)
6881 mpz_set_ui (result->value.integer, 0);
6882 return result;
6885 if (back == 0)
6887 if (lenset == 0)
6889 mpz_set_ui (result->value.integer, 1);
6890 return result;
6893 index = wide_strspn (s->value.character.string,
6894 set->value.character.string) + 1;
6895 if (index > len)
6896 index = 0;
6899 else
6901 if (lenset == 0)
6903 mpz_set_ui (result->value.integer, len);
6904 return result;
6906 for (index = len; index > 0; index --)
6908 for (i = 0; i < lenset; i++)
6910 if (s->value.character.string[index - 1]
6911 == set->value.character.string[i])
6912 break;
6914 if (i == lenset)
6915 break;
6919 mpz_set_ui (result->value.integer, index);
6920 return result;
6924 gfc_expr *
6925 gfc_simplify_xor (gfc_expr *x, gfc_expr *y)
6927 gfc_expr *result;
6928 int kind;
6930 if (x->expr_type != EXPR_CONSTANT || y->expr_type != EXPR_CONSTANT)
6931 return NULL;
6933 kind = x->ts.kind > y->ts.kind ? x->ts.kind : y->ts.kind;
6935 switch (x->ts.type)
6937 case BT_INTEGER:
6938 result = gfc_get_constant_expr (BT_INTEGER, kind, &x->where);
6939 mpz_xor (result->value.integer, x->value.integer, y->value.integer);
6940 return range_check (result, "XOR");
6942 case BT_LOGICAL:
6943 return gfc_get_logical_expr (kind, &x->where,
6944 (x->value.logical && !y->value.logical)
6945 || (!x->value.logical && y->value.logical));
6947 default:
6948 gcc_unreachable ();
6953 /****************** Constant simplification *****************/
6955 /* Master function to convert one constant to another. While this is
6956 used as a simplification function, it requires the destination type
6957 and kind information which is supplied by a special case in
6958 do_simplify(). */
6960 gfc_expr *
6961 gfc_convert_constant (gfc_expr *e, bt type, int kind)
6963 gfc_expr *g, *result, *(*f) (gfc_expr *, int);
6964 gfc_constructor *c;
6966 switch (e->ts.type)
6968 case BT_INTEGER:
6969 switch (type)
6971 case BT_INTEGER:
6972 f = gfc_int2int;
6973 break;
6974 case BT_REAL:
6975 f = gfc_int2real;
6976 break;
6977 case BT_COMPLEX:
6978 f = gfc_int2complex;
6979 break;
6980 case BT_LOGICAL:
6981 f = gfc_int2log;
6982 break;
6983 default:
6984 goto oops;
6986 break;
6988 case BT_REAL:
6989 switch (type)
6991 case BT_INTEGER:
6992 f = gfc_real2int;
6993 break;
6994 case BT_REAL:
6995 f = gfc_real2real;
6996 break;
6997 case BT_COMPLEX:
6998 f = gfc_real2complex;
6999 break;
7000 default:
7001 goto oops;
7003 break;
7005 case BT_COMPLEX:
7006 switch (type)
7008 case BT_INTEGER:
7009 f = gfc_complex2int;
7010 break;
7011 case BT_REAL:
7012 f = gfc_complex2real;
7013 break;
7014 case BT_COMPLEX:
7015 f = gfc_complex2complex;
7016 break;
7018 default:
7019 goto oops;
7021 break;
7023 case BT_LOGICAL:
7024 switch (type)
7026 case BT_INTEGER:
7027 f = gfc_log2int;
7028 break;
7029 case BT_LOGICAL:
7030 f = gfc_log2log;
7031 break;
7032 default:
7033 goto oops;
7035 break;
7037 case BT_HOLLERITH:
7038 switch (type)
7040 case BT_INTEGER:
7041 f = gfc_hollerith2int;
7042 break;
7044 case BT_REAL:
7045 f = gfc_hollerith2real;
7046 break;
7048 case BT_COMPLEX:
7049 f = gfc_hollerith2complex;
7050 break;
7052 case BT_CHARACTER:
7053 f = gfc_hollerith2character;
7054 break;
7056 case BT_LOGICAL:
7057 f = gfc_hollerith2logical;
7058 break;
7060 default:
7061 goto oops;
7063 break;
7065 default:
7066 oops:
7067 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
7070 result = NULL;
7072 switch (e->expr_type)
7074 case EXPR_CONSTANT:
7075 result = f (e, kind);
7076 if (result == NULL)
7077 return &gfc_bad_expr;
7078 break;
7080 case EXPR_ARRAY:
7081 if (!gfc_is_constant_expr (e))
7082 break;
7084 result = gfc_get_array_expr (type, kind, &e->where);
7085 result->shape = gfc_copy_shape (e->shape, e->rank);
7086 result->rank = e->rank;
7088 for (c = gfc_constructor_first (e->value.constructor);
7089 c; c = gfc_constructor_next (c))
7091 gfc_expr *tmp;
7092 if (c->iterator == NULL)
7093 tmp = f (c->expr, kind);
7094 else
7096 g = gfc_convert_constant (c->expr, type, kind);
7097 if (g == &gfc_bad_expr)
7099 gfc_free_expr (result);
7100 return g;
7102 tmp = g;
7105 if (tmp == NULL)
7107 gfc_free_expr (result);
7108 return NULL;
7111 gfc_constructor_append_expr (&result->value.constructor,
7112 tmp, &c->where);
7115 break;
7117 default:
7118 break;
7121 return result;
7125 /* Function for converting character constants. */
7126 gfc_expr *
7127 gfc_convert_char_constant (gfc_expr *e, bt type ATTRIBUTE_UNUSED, int kind)
7129 gfc_expr *result;
7130 int i;
7132 if (!gfc_is_constant_expr (e))
7133 return NULL;
7135 if (e->expr_type == EXPR_CONSTANT)
7137 /* Simple case of a scalar. */
7138 result = gfc_get_constant_expr (BT_CHARACTER, kind, &e->where);
7139 if (result == NULL)
7140 return &gfc_bad_expr;
7142 result->value.character.length = e->value.character.length;
7143 result->value.character.string
7144 = gfc_get_wide_string (e->value.character.length + 1);
7145 memcpy (result->value.character.string, e->value.character.string,
7146 (e->value.character.length + 1) * sizeof (gfc_char_t));
7148 /* Check we only have values representable in the destination kind. */
7149 for (i = 0; i < result->value.character.length; i++)
7150 if (!gfc_check_character_range (result->value.character.string[i],
7151 kind))
7153 gfc_error ("Character %qs in string at %L cannot be converted "
7154 "into character kind %d",
7155 gfc_print_wide_char (result->value.character.string[i]),
7156 &e->where, kind);
7157 return &gfc_bad_expr;
7160 return result;
7162 else if (e->expr_type == EXPR_ARRAY)
7164 /* For an array constructor, we convert each constructor element. */
7165 gfc_constructor *c;
7167 result = gfc_get_array_expr (type, kind, &e->where);
7168 result->shape = gfc_copy_shape (e->shape, e->rank);
7169 result->rank = e->rank;
7170 result->ts.u.cl = e->ts.u.cl;
7172 for (c = gfc_constructor_first (e->value.constructor);
7173 c; c = gfc_constructor_next (c))
7175 gfc_expr *tmp = gfc_convert_char_constant (c->expr, type, kind);
7176 if (tmp == &gfc_bad_expr)
7178 gfc_free_expr (result);
7179 return &gfc_bad_expr;
7182 if (tmp == NULL)
7184 gfc_free_expr (result);
7185 return NULL;
7188 gfc_constructor_append_expr (&result->value.constructor,
7189 tmp, &c->where);
7192 return result;
7194 else
7195 return NULL;
7199 gfc_expr *
7200 gfc_simplify_compiler_options (void)
7202 char *str;
7203 gfc_expr *result;
7205 str = gfc_get_option_string ();
7206 result = gfc_get_character_expr (gfc_default_character_kind,
7207 &gfc_current_locus, str, strlen (str));
7208 free (str);
7209 return result;
7213 gfc_expr *
7214 gfc_simplify_compiler_version (void)
7216 char *buffer;
7217 size_t len;
7219 len = strlen ("GCC version ") + strlen (version_string);
7220 buffer = XALLOCAVEC (char, len + 1);
7221 snprintf (buffer, len + 1, "GCC version %s", version_string);
7222 return gfc_get_character_expr (gfc_default_character_kind,
7223 &gfc_current_locus, buffer, len);
7226 /* Simplification routines for intrinsics of IEEE modules. */
7228 gfc_expr *
7229 simplify_ieee_selected_real_kind (gfc_expr *expr)
7231 gfc_actual_arglist *arg;
7232 gfc_expr *p = NULL, *q = NULL, *rdx = NULL;
7234 arg = expr->value.function.actual;
7235 p = arg->expr;
7236 if (arg->next)
7238 q = arg->next->expr;
7239 if (arg->next->next)
7240 rdx = arg->next->next->expr;
7243 /* Currently, if IEEE is supported and this module is built, it means
7244 all our floating-point types conform to IEEE. Hence, we simply handle
7245 IEEE_SELECTED_REAL_KIND like SELECTED_REAL_KIND. */
7246 return gfc_simplify_selected_real_kind (p, q, rdx);
7249 gfc_expr *
7250 simplify_ieee_support (gfc_expr *expr)
7252 /* We consider that if the IEEE modules are loaded, we have full support
7253 for flags, halting and rounding, which are the three functions
7254 (IEEE_SUPPORT_{FLAG,HALTING,ROUNDING}) allowed in constant
7255 expressions. One day, we will need libgfortran to detect support and
7256 communicate it back to us, allowing for partial support. */
7258 return gfc_get_logical_expr (gfc_default_logical_kind, &expr->where,
7259 true);
7262 bool
7263 matches_ieee_function_name (gfc_symbol *sym, const char *name)
7265 int n = strlen(name);
7267 if (!strncmp(sym->name, name, n))
7268 return true;
7270 /* If a generic was used and renamed, we need more work to find out.
7271 Compare the specific name. */
7272 if (sym->generic && !strncmp(sym->generic->sym->name, name, n))
7273 return true;
7275 return false;
7278 gfc_expr *
7279 gfc_simplify_ieee_functions (gfc_expr *expr)
7281 gfc_symbol* sym = expr->symtree->n.sym;
7283 if (matches_ieee_function_name(sym, "ieee_selected_real_kind"))
7284 return simplify_ieee_selected_real_kind (expr);
7285 else if (matches_ieee_function_name(sym, "ieee_support_flag")
7286 || matches_ieee_function_name(sym, "ieee_support_halting")
7287 || matches_ieee_function_name(sym, "ieee_support_rounding"))
7288 return simplify_ieee_support (expr);
7289 else
7290 return NULL;