1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000-2024 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
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
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/>. */
23 #include "coretypes.h"
24 #include "tm.h" /* For BITS_PER_UNIT. */
27 #include "intrinsic.h"
29 #include "target-memory.h"
30 #include "constructor.h"
31 #include "version.h" /* For version_string. */
35 static int min_max_choose (gfc_expr
*, gfc_expr
*, int, bool back_val
= false);
37 gfc_expr gfc_bad_expr
;
39 static gfc_expr
*simplify_size (gfc_expr
*, gfc_expr
*, int);
42 /* Note that 'simplification' is not just transforming expressions.
43 For functions that are not simplified at compile time, range
44 checking is done if possible.
46 The return convention is that each simplification function returns:
48 A new expression node corresponding to the simplified arguments.
49 The original arguments are destroyed by the caller, and must not
50 be a part of the new expression.
52 NULL pointer indicating that no simplification was possible and
53 the original expression should remain intact.
55 An expression pointer to gfc_bad_expr (a static placeholder)
56 indicating that some error has prevented simplification. The
57 error is generated within the function and should be propagated
60 By the time a simplification function gets control, it has been
61 decided that the function call is really supposed to be the
62 intrinsic. No type checking is strictly necessary, since only
63 valid types will be passed on. On the other hand, a simplification
64 subroutine may have to look at the type of an argument as part of
67 Array arguments are only passed to these subroutines that implement
68 the simplification of transformational intrinsics.
70 The functions in this file don't have much comment with them, but
71 everything is reasonably straight-forward. The Standard, chapter 13
72 is the best comment you'll find for this file anyway. */
74 /* Range checks an expression node. If all goes well, returns the
75 node, otherwise returns &gfc_bad_expr and frees the node. */
78 range_check (gfc_expr
*result
, const char *name
)
83 if (result
->expr_type
!= EXPR_CONSTANT
)
86 switch (gfc_range_check (result
))
92 gfc_error ("Result of %s overflows its kind at %L", name
,
97 gfc_error ("Result of %s underflows its kind at %L", name
,
102 gfc_error ("Result of %s is NaN at %L", name
, &result
->where
);
106 gfc_error ("Result of %s gives range error for its kind at %L", name
,
111 gfc_free_expr (result
);
112 return &gfc_bad_expr
;
116 /* A helper function that gets an optional and possibly missing
117 kind parameter. Returns the kind, -1 if something went wrong. */
120 get_kind (bt type
, gfc_expr
*k
, const char *name
, int default_kind
)
127 if (k
->expr_type
!= EXPR_CONSTANT
)
129 gfc_error ("KIND parameter of %s at %L must be an initialization "
130 "expression", name
, &k
->where
);
134 if (gfc_extract_int (k
, &kind
)
135 || gfc_validate_kind (type
, kind
, true) < 0)
137 gfc_error ("Invalid KIND parameter of %s at %L", name
, &k
->where
);
145 /* Converts an mpz_t signed variable into an unsigned one, assuming
146 two's complement representations and a binary width of bitsize.
147 The conversion is a no-op unless x is negative; otherwise, it can
148 be accomplished by masking out the high bits. */
151 gfc_convert_mpz_to_unsigned (mpz_t x
, int bitsize
, bool sign
)
157 /* Confirm that no bits above the signed range are unset if we
158 are doing range checking. */
159 if (sign
&& flag_range_check
!= 0)
160 gcc_assert (mpz_scan0 (x
, bitsize
-1) == ULONG_MAX
);
162 mpz_init_set_ui (mask
, 1);
163 mpz_mul_2exp (mask
, mask
, bitsize
);
164 mpz_sub_ui (mask
, mask
, 1);
166 mpz_and (x
, x
, mask
);
172 /* Confirm that no bits above the signed range are set if we
173 are doing range checking. */
174 if (sign
&& flag_range_check
!= 0)
175 gcc_assert (mpz_scan1 (x
, bitsize
-1) == ULONG_MAX
);
180 /* Converts an mpz_t unsigned variable into a signed one, assuming
181 two's complement representations and a binary width of bitsize.
182 If the bitsize-1 bit is set, this is taken as a sign bit and
183 the number is converted to the corresponding negative number. */
186 gfc_convert_mpz_to_signed (mpz_t x
, int bitsize
)
190 /* Confirm that no bits above the unsigned range are set if we are
191 doing range checking. */
192 if (flag_range_check
!= 0)
193 gcc_assert (mpz_scan1 (x
, bitsize
) == ULONG_MAX
);
195 if (mpz_tstbit (x
, bitsize
- 1) == 1)
197 mpz_init_set_ui (mask
, 1);
198 mpz_mul_2exp (mask
, mask
, bitsize
);
199 mpz_sub_ui (mask
, mask
, 1);
201 /* We negate the number by hand, zeroing the high bits, that is
202 make it the corresponding positive number, and then have it
203 negated by GMP, giving the correct representation of the
206 mpz_add_ui (x
, x
, 1);
207 mpz_and (x
, x
, mask
);
216 /* Test that the expression is a constant array, simplifying if
217 we are dealing with a parameter array. */
220 is_constant_array_expr (gfc_expr
*e
)
223 bool array_OK
= true;
229 if (e
->expr_type
== EXPR_VARIABLE
&& e
->rank
> 0
230 && e
->symtree
->n
.sym
->attr
.flavor
== FL_PARAMETER
)
231 gfc_simplify_expr (e
, 1);
233 if (e
->expr_type
!= EXPR_ARRAY
|| !gfc_is_constant_expr (e
))
236 /* A non-zero-sized constant array shall have a non-empty constructor. */
237 if (e
->rank
> 0 && e
->shape
!= NULL
&& e
->value
.constructor
== NULL
)
239 mpz_init_set_ui (size
, 1);
240 for (int j
= 0; j
< e
->rank
; j
++)
241 mpz_mul (size
, size
, e
->shape
[j
]);
242 bool not_size0
= (mpz_cmp_si (size
, 0) != 0);
248 for (c
= gfc_constructor_first (e
->value
.constructor
);
249 c
; c
= gfc_constructor_next (c
))
250 if (c
->expr
->expr_type
!= EXPR_CONSTANT
251 && c
->expr
->expr_type
!= EXPR_STRUCTURE
)
257 /* Check and expand the constructor. We do this when either
258 gfc_init_expr_flag is set or for not too large array constructors. */
260 expand
= (e
->rank
== 1
262 && (mpz_cmp_ui (e
->shape
[0], flag_max_array_constructor
) < 0));
264 if (!array_OK
&& (gfc_init_expr_flag
|| expand
) && e
->rank
== 1)
266 bool saved_init_expr_flag
= gfc_init_expr_flag
;
267 array_OK
= gfc_reduce_init_expr (e
);
268 /* gfc_reduce_init_expr resets the flag. */
269 gfc_init_expr_flag
= saved_init_expr_flag
;
274 /* Recheck to make sure that any EXPR_ARRAYs have gone. */
275 for (c
= gfc_constructor_first (e
->value
.constructor
);
276 c
; c
= gfc_constructor_next (c
))
277 if (c
->expr
->expr_type
!= EXPR_CONSTANT
278 && c
->expr
->expr_type
!= EXPR_STRUCTURE
)
281 /* Make sure that the array has a valid shape. */
282 if (e
->shape
== NULL
&& e
->rank
== 1)
284 if (!gfc_array_size(e
, &size
))
286 e
->shape
= gfc_get_shape (1);
287 mpz_init_set (e
->shape
[0], size
);
295 gfc_is_constant_array_expr (gfc_expr
*e
)
297 return is_constant_array_expr (e
);
301 /* Test for a size zero array. */
303 gfc_is_size_zero_array (gfc_expr
*array
)
306 if (array
->rank
== 0)
309 if (array
->expr_type
== EXPR_VARIABLE
&& array
->rank
> 0
310 && array
->symtree
->n
.sym
->attr
.flavor
== FL_PARAMETER
311 && array
->shape
!= NULL
)
313 for (int i
= 0; i
< array
->rank
; i
++)
314 if (mpz_cmp_si (array
->shape
[i
], 0) <= 0)
320 if (array
->expr_type
== EXPR_ARRAY
)
321 return array
->value
.constructor
== NULL
;
327 /* Initialize a transformational result expression with a given value. */
330 init_result_expr (gfc_expr
*e
, int init
, gfc_expr
*array
)
332 if (e
&& e
->expr_type
== EXPR_ARRAY
)
334 gfc_constructor
*ctor
= gfc_constructor_first (e
->value
.constructor
);
337 init_result_expr (ctor
->expr
, init
, array
);
338 ctor
= gfc_constructor_next (ctor
);
341 else if (e
&& e
->expr_type
== EXPR_CONSTANT
)
343 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
344 HOST_WIDE_INT length
;
350 e
->value
.logical
= (init
? 1 : 0);
355 mpz_set (e
->value
.integer
, gfc_integer_kinds
[i
].min_int
);
356 else if (init
== INT_MAX
)
357 mpz_set (e
->value
.integer
, gfc_integer_kinds
[i
].huge
);
359 mpz_set_si (e
->value
.integer
, init
);
365 mpfr_set (e
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
366 mpfr_neg (e
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
368 else if (init
== INT_MAX
)
369 mpfr_set (e
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
371 mpfr_set_si (e
->value
.real
, init
, GFC_RND_MODE
);
375 mpc_set_si (e
->value
.complex, init
, GFC_MPC_RND_MODE
);
381 gfc_expr
*len
= gfc_simplify_len (array
, NULL
);
382 gfc_extract_hwi (len
, &length
);
383 string
= gfc_get_wide_string (length
+ 1);
384 gfc_wide_memset (string
, 0, length
);
386 else if (init
== INT_MAX
)
388 gfc_expr
*len
= gfc_simplify_len (array
, NULL
);
389 gfc_extract_hwi (len
, &length
);
390 string
= gfc_get_wide_string (length
+ 1);
391 gfc_wide_memset (string
, 255, length
);
396 string
= gfc_get_wide_string (1);
399 string
[length
] = '\0';
400 e
->value
.character
.length
= length
;
401 e
->value
.character
.string
= string
;
413 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul;
414 if conj_a is true, the matrix_a is complex conjugated. */
417 compute_dot_product (gfc_expr
*matrix_a
, int stride_a
, int offset_a
,
418 gfc_expr
*matrix_b
, int stride_b
, int offset_b
,
421 gfc_expr
*result
, *a
, *b
, *c
;
423 /* Set result to an INTEGER(1) 0 for numeric types and .false. for
424 LOGICAL. Mixed-mode math in the loop will promote result to the
425 correct type and kind. */
426 if (matrix_a
->ts
.type
== BT_LOGICAL
)
427 result
= gfc_get_logical_expr (gfc_default_logical_kind
, NULL
, false);
429 result
= gfc_get_int_expr (1, NULL
, 0);
430 result
->where
= matrix_a
->where
;
432 a
= gfc_constructor_lookup_expr (matrix_a
->value
.constructor
, offset_a
);
433 b
= gfc_constructor_lookup_expr (matrix_b
->value
.constructor
, offset_b
);
436 /* Copying of expressions is required as operands are free'd
437 by the gfc_arith routines. */
438 switch (result
->ts
.type
)
441 result
= gfc_or (result
,
442 gfc_and (gfc_copy_expr (a
),
449 if (conj_a
&& a
->ts
.type
== BT_COMPLEX
)
450 c
= gfc_simplify_conjg (a
);
452 c
= gfc_copy_expr (a
);
453 result
= gfc_add (result
, gfc_multiply (c
, gfc_copy_expr (b
)));
460 offset_a
+= stride_a
;
461 a
= gfc_constructor_lookup_expr (matrix_a
->value
.constructor
, offset_a
);
463 offset_b
+= stride_b
;
464 b
= gfc_constructor_lookup_expr (matrix_b
->value
.constructor
, offset_b
);
471 /* Build a result expression for transformational intrinsics,
475 transformational_result (gfc_expr
*array
, gfc_expr
*dim
, bt type
,
476 int kind
, locus
* where
)
481 if (!dim
|| array
->rank
== 1)
482 return gfc_get_constant_expr (type
, kind
, where
);
484 result
= gfc_get_array_expr (type
, kind
, where
);
485 result
->shape
= gfc_copy_shape_excluding (array
->shape
, array
->rank
, dim
);
486 result
->rank
= array
->rank
- 1;
488 /* gfc_array_size() would count the number of elements in the constructor,
489 we have not built those yet. */
491 for (i
= 0; i
< result
->rank
; ++i
)
492 nelem
*= mpz_get_ui (result
->shape
[i
]);
494 for (i
= 0; i
< nelem
; ++i
)
496 gfc_constructor_append_expr (&result
->value
.constructor
,
497 gfc_get_constant_expr (type
, kind
, where
),
505 typedef gfc_expr
* (*transformational_op
)(gfc_expr
*, gfc_expr
*);
507 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
508 of COUNT intrinsic is .TRUE..
510 Interface and implementation mimics arith functions as
511 gfc_add, gfc_multiply, etc. */
514 gfc_count (gfc_expr
*op1
, gfc_expr
*op2
)
518 gcc_assert (op1
->ts
.type
== BT_INTEGER
);
519 gcc_assert (op2
->ts
.type
== BT_LOGICAL
);
520 gcc_assert (op2
->value
.logical
);
522 result
= gfc_copy_expr (op1
);
523 mpz_add_ui (result
->value
.integer
, result
->value
.integer
, 1);
531 /* Transforms an ARRAY with operation OP, according to MASK, to a
532 scalar RESULT. E.g. called if
534 REAL, PARAMETER :: array(n, m) = ...
535 REAL, PARAMETER :: s = SUM(array)
537 where OP == gfc_add(). */
540 simplify_transformation_to_scalar (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*mask
,
541 transformational_op op
)
544 gfc_constructor
*array_ctor
, *mask_ctor
;
546 /* Shortcut for constant .FALSE. MASK. */
548 && mask
->expr_type
== EXPR_CONSTANT
549 && !mask
->value
.logical
)
552 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
554 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
555 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
559 a
= array_ctor
->expr
;
560 array_ctor
= gfc_constructor_next (array_ctor
);
562 /* A constant MASK equals .TRUE. here and can be ignored. */
566 mask_ctor
= gfc_constructor_next (mask_ctor
);
567 if (!m
->value
.logical
)
571 result
= op (result
, gfc_copy_expr (a
));
579 /* Transforms an ARRAY with operation OP, according to MASK, to an
580 array RESULT. E.g. called if
582 REAL, PARAMETER :: array(n, m) = ...
583 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
585 where OP == gfc_multiply().
586 The result might be post processed using post_op. */
589 simplify_transformation_to_array (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*dim
,
590 gfc_expr
*mask
, transformational_op op
,
591 transformational_op post_op
)
594 int done
, i
, n
, arraysize
, resultsize
, dim_index
, dim_extent
, dim_stride
;
595 gfc_expr
**arrayvec
, **resultvec
, **base
, **src
, **dest
;
596 gfc_constructor
*array_ctor
, *mask_ctor
, *result_ctor
;
598 int count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
599 sstride
[GFC_MAX_DIMENSIONS
], dstride
[GFC_MAX_DIMENSIONS
],
600 tmpstride
[GFC_MAX_DIMENSIONS
];
602 /* Shortcut for constant .FALSE. MASK. */
604 && mask
->expr_type
== EXPR_CONSTANT
605 && !mask
->value
.logical
)
608 /* Build an indexed table for array element expressions to minimize
609 linked-list traversal. Masked elements are set to NULL. */
610 gfc_array_size (array
, &size
);
611 arraysize
= mpz_get_ui (size
);
614 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
616 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
618 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
619 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
621 for (i
= 0; i
< arraysize
; ++i
)
623 arrayvec
[i
] = array_ctor
->expr
;
624 array_ctor
= gfc_constructor_next (array_ctor
);
628 if (!mask_ctor
->expr
->value
.logical
)
631 mask_ctor
= gfc_constructor_next (mask_ctor
);
635 /* Same for the result expression. */
636 gfc_array_size (result
, &size
);
637 resultsize
= mpz_get_ui (size
);
640 resultvec
= XCNEWVEC (gfc_expr
*, resultsize
);
641 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
642 for (i
= 0; i
< resultsize
; ++i
)
644 resultvec
[i
] = result_ctor
->expr
;
645 result_ctor
= gfc_constructor_next (result_ctor
);
648 gfc_extract_int (dim
, &dim_index
);
649 dim_index
-= 1; /* zero-base index */
653 for (i
= 0, n
= 0; i
< array
->rank
; ++i
)
656 tmpstride
[i
] = (i
== 0) ? 1 : tmpstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
659 dim_extent
= mpz_get_si (array
->shape
[i
]);
660 dim_stride
= tmpstride
[i
];
664 extent
[n
] = mpz_get_si (array
->shape
[i
]);
665 sstride
[n
] = tmpstride
[i
];
666 dstride
[n
] = (n
== 0) ? 1 : dstride
[n
-1] * extent
[n
-1];
670 done
= resultsize
<= 0;
675 for (src
= base
, n
= 0; n
< dim_extent
; src
+= dim_stride
, ++n
)
677 *dest
= op (*dest
, gfc_copy_expr (*src
));
680 *dest
= post_op (*dest
, *dest
);
687 while (!done
&& count
[n
] == extent
[n
])
690 base
-= sstride
[n
] * extent
[n
];
691 dest
-= dstride
[n
] * extent
[n
];
694 if (n
< result
->rank
)
696 /* If the nested loop is unrolled GFC_MAX_DIMENSIONS
697 times, we'd warn for the last iteration, because the
698 array index will have already been incremented to the
699 array sizes, and we can't tell that this must make
700 the test against result->rank false, because ranks
701 must not exceed GFC_MAX_DIMENSIONS. */
702 GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray
-bounds
)
713 /* Place updated expression in result constructor. */
714 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
715 for (i
= 0; i
< resultsize
; ++i
)
717 result_ctor
->expr
= resultvec
[i
];
718 result_ctor
= gfc_constructor_next (result_ctor
);
728 simplify_transformation (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
,
729 int init_val
, transformational_op op
)
734 size_zero
= gfc_is_size_zero_array (array
);
736 if (!(is_constant_array_expr (array
) || size_zero
)
737 || array
->shape
== NULL
738 || !gfc_is_constant_expr (dim
))
742 && !is_constant_array_expr (mask
)
743 && mask
->expr_type
!= EXPR_CONSTANT
)
746 result
= transformational_result (array
, dim
, array
->ts
.type
,
747 array
->ts
.kind
, &array
->where
);
748 init_result_expr (result
, init_val
, array
);
753 return !dim
|| array
->rank
== 1 ?
754 simplify_transformation_to_scalar (result
, array
, mask
, op
) :
755 simplify_transformation_to_array (result
, array
, dim
, mask
, op
, NULL
);
759 /********************** Simplification functions *****************************/
762 gfc_simplify_abs (gfc_expr
*e
)
766 if (e
->expr_type
!= EXPR_CONSTANT
)
772 result
= gfc_get_constant_expr (BT_INTEGER
, e
->ts
.kind
, &e
->where
);
773 mpz_abs (result
->value
.integer
, e
->value
.integer
);
774 return range_check (result
, "IABS");
777 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
778 mpfr_abs (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
779 return range_check (result
, "ABS");
782 gfc_set_model_kind (e
->ts
.kind
);
783 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
784 mpc_abs (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
785 return range_check (result
, "CABS");
788 gfc_internal_error ("gfc_simplify_abs(): Bad type");
794 simplify_achar_char (gfc_expr
*e
, gfc_expr
*k
, const char *name
, bool ascii
)
798 bool too_large
= false;
800 if (e
->expr_type
!= EXPR_CONSTANT
)
803 kind
= get_kind (BT_CHARACTER
, k
, name
, gfc_default_character_kind
);
805 return &gfc_bad_expr
;
807 if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
809 gfc_error ("Argument of %s function at %L is negative", name
,
811 return &gfc_bad_expr
;
814 if (ascii
&& warn_surprising
&& mpz_cmp_si (e
->value
.integer
, 127) > 0)
815 gfc_warning (OPT_Wsurprising
,
816 "Argument of %s function at %L outside of range [0,127]",
819 if (kind
== 1 && mpz_cmp_si (e
->value
.integer
, 255) > 0)
824 mpz_init_set_ui (t
, 2);
825 mpz_pow_ui (t
, t
, 32);
826 mpz_sub_ui (t
, t
, 1);
827 if (mpz_cmp (e
->value
.integer
, t
) > 0)
834 gfc_error ("Argument of %s function at %L is too large for the "
835 "collating sequence of kind %d", name
, &e
->where
, kind
);
836 return &gfc_bad_expr
;
839 result
= gfc_get_character_expr (kind
, &e
->where
, NULL
, 1);
840 result
->value
.character
.string
[0] = mpz_get_ui (e
->value
.integer
);
847 /* We use the processor's collating sequence, because all
848 systems that gfortran currently works on are ASCII. */
851 gfc_simplify_achar (gfc_expr
*e
, gfc_expr
*k
)
853 return simplify_achar_char (e
, k
, "ACHAR", true);
858 gfc_simplify_acos (gfc_expr
*x
)
862 if (x
->expr_type
!= EXPR_CONSTANT
)
868 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
869 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
871 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
873 return &gfc_bad_expr
;
875 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
876 mpfr_acos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
880 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
881 mpc_acos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
885 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
888 return range_check (result
, "ACOS");
892 gfc_simplify_acosh (gfc_expr
*x
)
896 if (x
->expr_type
!= EXPR_CONSTANT
)
902 if (mpfr_cmp_si (x
->value
.real
, 1) < 0)
904 gfc_error ("Argument of ACOSH at %L must not be less than 1",
906 return &gfc_bad_expr
;
909 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
910 mpfr_acosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
914 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
915 mpc_acosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
919 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
922 return range_check (result
, "ACOSH");
926 gfc_simplify_adjustl (gfc_expr
*e
)
932 if (e
->expr_type
!= EXPR_CONSTANT
)
935 len
= e
->value
.character
.length
;
937 for (count
= 0, i
= 0; i
< len
; ++i
)
939 ch
= e
->value
.character
.string
[i
];
945 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, len
);
946 for (i
= 0; i
< len
- count
; ++i
)
947 result
->value
.character
.string
[i
] = e
->value
.character
.string
[count
+ i
];
954 gfc_simplify_adjustr (gfc_expr
*e
)
960 if (e
->expr_type
!= EXPR_CONSTANT
)
963 len
= e
->value
.character
.length
;
965 for (count
= 0, i
= len
- 1; i
>= 0; --i
)
967 ch
= e
->value
.character
.string
[i
];
973 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, len
);
974 for (i
= 0; i
< count
; ++i
)
975 result
->value
.character
.string
[i
] = ' ';
977 for (i
= count
; i
< len
; ++i
)
978 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
- count
];
985 gfc_simplify_aimag (gfc_expr
*e
)
989 if (e
->expr_type
!= EXPR_CONSTANT
)
992 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
993 mpfr_set (result
->value
.real
, mpc_imagref (e
->value
.complex), GFC_RND_MODE
);
995 return range_check (result
, "AIMAG");
1000 gfc_simplify_aint (gfc_expr
*e
, gfc_expr
*k
)
1002 gfc_expr
*rtrunc
, *result
;
1005 kind
= get_kind (BT_REAL
, k
, "AINT", e
->ts
.kind
);
1007 return &gfc_bad_expr
;
1009 if (e
->expr_type
!= EXPR_CONSTANT
)
1012 rtrunc
= gfc_copy_expr (e
);
1013 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
1015 result
= gfc_real2real (rtrunc
, kind
);
1017 gfc_free_expr (rtrunc
);
1019 return range_check (result
, "AINT");
1024 gfc_simplify_all (gfc_expr
*mask
, gfc_expr
*dim
)
1026 return simplify_transformation (mask
, dim
, NULL
, true, gfc_and
);
1031 gfc_simplify_dint (gfc_expr
*e
)
1033 gfc_expr
*rtrunc
, *result
;
1035 if (e
->expr_type
!= EXPR_CONSTANT
)
1038 rtrunc
= gfc_copy_expr (e
);
1039 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
1041 result
= gfc_real2real (rtrunc
, gfc_default_double_kind
);
1043 gfc_free_expr (rtrunc
);
1045 return range_check (result
, "DINT");
1050 gfc_simplify_dreal (gfc_expr
*e
)
1052 gfc_expr
*result
= NULL
;
1054 if (e
->expr_type
!= EXPR_CONSTANT
)
1057 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
1058 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
1060 return range_check (result
, "DREAL");
1065 gfc_simplify_anint (gfc_expr
*e
, gfc_expr
*k
)
1070 kind
= get_kind (BT_REAL
, k
, "ANINT", e
->ts
.kind
);
1072 return &gfc_bad_expr
;
1074 if (e
->expr_type
!= EXPR_CONSTANT
)
1077 result
= gfc_get_constant_expr (e
->ts
.type
, kind
, &e
->where
);
1078 mpfr_round (result
->value
.real
, e
->value
.real
);
1080 return range_check (result
, "ANINT");
1085 gfc_simplify_and (gfc_expr
*x
, gfc_expr
*y
)
1090 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1093 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
1098 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
1099 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
1100 return range_check (result
, "AND");
1103 return gfc_get_logical_expr (kind
, &x
->where
,
1104 x
->value
.logical
&& y
->value
.logical
);
1113 gfc_simplify_any (gfc_expr
*mask
, gfc_expr
*dim
)
1115 return simplify_transformation (mask
, dim
, NULL
, false, gfc_or
);
1120 gfc_simplify_dnint (gfc_expr
*e
)
1124 if (e
->expr_type
!= EXPR_CONSTANT
)
1127 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &e
->where
);
1128 mpfr_round (result
->value
.real
, e
->value
.real
);
1130 return range_check (result
, "DNINT");
1135 gfc_simplify_asin (gfc_expr
*x
)
1139 if (x
->expr_type
!= EXPR_CONSTANT
)
1145 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
1146 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
1148 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1150 return &gfc_bad_expr
;
1152 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1153 mpfr_asin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1157 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1158 mpc_asin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1162 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1165 return range_check (result
, "ASIN");
1169 /* Convert radians to degrees, i.e., x * 180 / pi. */
1177 mpfr_const_pi (tmp
, GFC_RND_MODE
);
1178 mpfr_mul_ui (x
, x
, 180, GFC_RND_MODE
);
1179 mpfr_div (x
, x
, tmp
, GFC_RND_MODE
);
1184 /* Simplify ACOSD(X) where the returned value has units of degree. */
1187 gfc_simplify_acosd (gfc_expr
*x
)
1191 if (x
->expr_type
!= EXPR_CONSTANT
)
1194 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
1195 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
1197 gfc_error ("Argument of ACOSD at %L must be between -1 and 1",
1199 return &gfc_bad_expr
;
1202 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1203 mpfr_acos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1204 rad2deg (result
->value
.real
);
1206 return range_check (result
, "ACOSD");
1210 /* Simplify asind (x) where the returned value has units of degree. */
1213 gfc_simplify_asind (gfc_expr
*x
)
1217 if (x
->expr_type
!= EXPR_CONSTANT
)
1220 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
1221 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
1223 gfc_error ("Argument of ASIND at %L must be between -1 and 1",
1225 return &gfc_bad_expr
;
1228 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1229 mpfr_asin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1230 rad2deg (result
->value
.real
);
1232 return range_check (result
, "ASIND");
1236 /* Simplify atand (x) where the returned value has units of degree. */
1239 gfc_simplify_atand (gfc_expr
*x
)
1243 if (x
->expr_type
!= EXPR_CONSTANT
)
1246 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1247 mpfr_atan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1248 rad2deg (result
->value
.real
);
1250 return range_check (result
, "ATAND");
1255 gfc_simplify_asinh (gfc_expr
*x
)
1259 if (x
->expr_type
!= EXPR_CONSTANT
)
1262 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1267 mpfr_asinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1271 mpc_asinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1275 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1278 return range_check (result
, "ASINH");
1283 gfc_simplify_atan (gfc_expr
*x
)
1287 if (x
->expr_type
!= EXPR_CONSTANT
)
1290 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1295 mpfr_atan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1299 mpc_atan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1303 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1306 return range_check (result
, "ATAN");
1311 gfc_simplify_atanh (gfc_expr
*x
)
1315 if (x
->expr_type
!= EXPR_CONSTANT
)
1321 if (mpfr_cmp_si (x
->value
.real
, 1) >= 0
1322 || mpfr_cmp_si (x
->value
.real
, -1) <= 0)
1324 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1326 return &gfc_bad_expr
;
1328 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1329 mpfr_atanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1333 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1334 mpc_atanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1338 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1341 return range_check (result
, "ATANH");
1346 gfc_simplify_atan2 (gfc_expr
*y
, gfc_expr
*x
)
1350 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1353 if (mpfr_zero_p (y
->value
.real
) && mpfr_zero_p (x
->value
.real
))
1355 gfc_error ("If first argument of ATAN2 at %L is zero, then the "
1356 "second argument must not be zero", &y
->where
);
1357 return &gfc_bad_expr
;
1360 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1361 mpfr_atan2 (result
->value
.real
, y
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1363 return range_check (result
, "ATAN2");
1368 gfc_simplify_bessel_j0 (gfc_expr
*x
)
1372 if (x
->expr_type
!= EXPR_CONSTANT
)
1375 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1376 mpfr_j0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1378 return range_check (result
, "BESSEL_J0");
1383 gfc_simplify_bessel_j1 (gfc_expr
*x
)
1387 if (x
->expr_type
!= EXPR_CONSTANT
)
1390 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1391 mpfr_j1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1393 return range_check (result
, "BESSEL_J1");
1398 gfc_simplify_bessel_jn (gfc_expr
*order
, gfc_expr
*x
)
1403 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1406 n
= mpz_get_si (order
->value
.integer
);
1407 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1408 mpfr_jn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1410 return range_check (result
, "BESSEL_JN");
1414 /* Simplify transformational form of JN and YN. */
1417 gfc_simplify_bessel_n2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
,
1424 mpfr_t x2rev
, last1
, last2
;
1426 if (x
->expr_type
!= EXPR_CONSTANT
|| order1
->expr_type
!= EXPR_CONSTANT
1427 || order2
->expr_type
!= EXPR_CONSTANT
)
1430 n1
= mpz_get_si (order1
->value
.integer
);
1431 n2
= mpz_get_si (order2
->value
.integer
);
1432 result
= gfc_get_array_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1434 result
->shape
= gfc_get_shape (1);
1435 mpz_init_set_ui (result
->shape
[0], MAX (n2
-n1
+1, 0));
1440 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1441 YN(N, 0.0) = -Inf. */
1443 if (mpfr_cmp_ui (x
->value
.real
, 0.0) == 0)
1445 if (!jn
&& flag_range_check
)
1447 gfc_error ("Result of BESSEL_YN is -INF at %L", &result
->where
);
1448 gfc_free_expr (result
);
1449 return &gfc_bad_expr
;
1454 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1455 mpfr_set_ui (e
->value
.real
, 1, GFC_RND_MODE
);
1456 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1461 for (i
= n1
; i
<= n2
; i
++)
1463 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1465 mpfr_set_ui (e
->value
.real
, 0, GFC_RND_MODE
);
1467 mpfr_set_inf (e
->value
.real
, -1);
1468 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1475 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1476 are stable for downward recursion and Neumann functions are stable
1477 for upward recursion. It is
1479 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1480 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1481 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1483 gfc_set_model_kind (x
->ts
.kind
);
1485 /* Get first recursion anchor. */
1489 mpfr_jn (last1
, n2
, x
->value
.real
, GFC_RND_MODE
);
1491 mpfr_yn (last1
, n1
, x
->value
.real
, GFC_RND_MODE
);
1493 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1494 mpfr_set (e
->value
.real
, last1
, GFC_RND_MODE
);
1495 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1499 gfc_free_expr (result
);
1500 return &gfc_bad_expr
;
1502 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1510 /* Get second recursion anchor. */
1514 mpfr_jn (last2
, n2
-1, x
->value
.real
, GFC_RND_MODE
);
1516 mpfr_yn (last2
, n1
+1, x
->value
.real
, GFC_RND_MODE
);
1518 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1519 mpfr_set (e
->value
.real
, last2
, GFC_RND_MODE
);
1520 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1525 gfc_free_expr (result
);
1526 return &gfc_bad_expr
;
1529 gfc_constructor_insert_expr (&result
->value
.constructor
, e
, &x
->where
, -2);
1531 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1540 /* Start actual recursion. */
1543 mpfr_ui_div (x2rev
, 2, x
->value
.real
, GFC_RND_MODE
);
1545 for (i
= 2; i
<= n2
-n1
; i
++)
1547 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1549 /* Special case: For YN, if the previous N gave -INF, set
1550 also N+1 to -INF. */
1551 if (!jn
&& !flag_range_check
&& mpfr_inf_p (last2
))
1553 mpfr_set_inf (e
->value
.real
, -1);
1554 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1559 mpfr_mul_si (e
->value
.real
, x2rev
, jn
? (n2
-i
+1) : (n1
+i
-1),
1561 mpfr_mul (e
->value
.real
, e
->value
.real
, last2
, GFC_RND_MODE
);
1562 mpfr_sub (e
->value
.real
, e
->value
.real
, last1
, GFC_RND_MODE
);
1564 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1566 /* Range_check frees "e" in that case. */
1572 gfc_constructor_insert_expr (&result
->value
.constructor
, e
, &x
->where
,
1575 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1577 mpfr_set (last1
, last2
, GFC_RND_MODE
);
1578 mpfr_set (last2
, e
->value
.real
, GFC_RND_MODE
);
1591 gfc_free_expr (result
);
1592 return &gfc_bad_expr
;
1597 gfc_simplify_bessel_jn2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
)
1599 return gfc_simplify_bessel_n2 (order1
, order2
, x
, true);
1604 gfc_simplify_bessel_y0 (gfc_expr
*x
)
1608 if (x
->expr_type
!= EXPR_CONSTANT
)
1611 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1612 mpfr_y0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1614 return range_check (result
, "BESSEL_Y0");
1619 gfc_simplify_bessel_y1 (gfc_expr
*x
)
1623 if (x
->expr_type
!= EXPR_CONSTANT
)
1626 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1627 mpfr_y1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1629 return range_check (result
, "BESSEL_Y1");
1634 gfc_simplify_bessel_yn (gfc_expr
*order
, gfc_expr
*x
)
1639 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1642 n
= mpz_get_si (order
->value
.integer
);
1643 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1644 mpfr_yn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1646 return range_check (result
, "BESSEL_YN");
1651 gfc_simplify_bessel_yn2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
)
1653 return gfc_simplify_bessel_n2 (order1
, order2
, x
, false);
1658 gfc_simplify_bit_size (gfc_expr
*e
)
1660 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
1663 if (flag_unsigned
&& e
->ts
.type
== BT_UNSIGNED
)
1664 bit_size
= gfc_unsigned_kinds
[i
].bit_size
;
1666 bit_size
= gfc_integer_kinds
[i
].bit_size
;
1668 return gfc_get_int_expr (e
->ts
.kind
, &e
->where
, bit_size
);
1673 gfc_simplify_btest (gfc_expr
*e
, gfc_expr
*bit
)
1677 if (e
->expr_type
!= EXPR_CONSTANT
|| bit
->expr_type
!= EXPR_CONSTANT
)
1680 if (!gfc_check_bitfcn (e
, bit
))
1681 return &gfc_bad_expr
;
1683 if (gfc_extract_int (bit
, &b
) || b
< 0)
1684 return gfc_get_logical_expr (gfc_default_logical_kind
, &e
->where
, false);
1686 return gfc_get_logical_expr (gfc_default_logical_kind
, &e
->where
,
1687 mpz_tstbit (e
->value
.integer
, b
));
1692 compare_bitwise (gfc_expr
*i
, gfc_expr
*j
)
1697 gcc_assert (i
->ts
.type
== BT_INTEGER
);
1698 gcc_assert (j
->ts
.type
== BT_INTEGER
);
1700 mpz_init_set (x
, i
->value
.integer
);
1701 k
= gfc_validate_kind (i
->ts
.type
, i
->ts
.kind
, false);
1702 gfc_convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
1704 mpz_init_set (y
, j
->value
.integer
);
1705 k
= gfc_validate_kind (j
->ts
.type
, j
->ts
.kind
, false);
1706 gfc_convert_mpz_to_unsigned (y
, gfc_integer_kinds
[k
].bit_size
);
1708 res
= mpz_cmp (x
, y
);
1716 gfc_simplify_bge (gfc_expr
*i
, gfc_expr
*j
)
1720 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1723 if (flag_unsigned
&& i
->ts
.type
== BT_UNSIGNED
)
1724 result
= mpz_cmp (i
->value
.integer
, j
->value
.integer
) >= 0;
1726 result
= compare_bitwise (i
, j
) >= 0;
1728 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1734 gfc_simplify_bgt (gfc_expr
*i
, gfc_expr
*j
)
1738 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1741 if (flag_unsigned
&& i
->ts
.type
== BT_UNSIGNED
)
1742 result
= mpz_cmp (i
->value
.integer
, j
->value
.integer
) > 0;
1744 result
= compare_bitwise (i
, j
) > 0;
1746 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1752 gfc_simplify_ble (gfc_expr
*i
, gfc_expr
*j
)
1756 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1759 if (flag_unsigned
&& i
->ts
.type
== BT_UNSIGNED
)
1760 result
= mpz_cmp (i
->value
.integer
, j
->value
.integer
) <= 0;
1762 result
= compare_bitwise (i
, j
) <= 0;
1764 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1770 gfc_simplify_blt (gfc_expr
*i
, gfc_expr
*j
)
1774 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1777 if (flag_unsigned
&& i
->ts
.type
== BT_UNSIGNED
)
1778 result
= mpz_cmp (i
->value
.integer
, j
->value
.integer
) < 0;
1780 result
= compare_bitwise (i
, j
) < 0;
1782 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1787 gfc_simplify_ceiling (gfc_expr
*e
, gfc_expr
*k
)
1789 gfc_expr
*ceil
, *result
;
1792 kind
= get_kind (BT_INTEGER
, k
, "CEILING", gfc_default_integer_kind
);
1794 return &gfc_bad_expr
;
1796 if (e
->expr_type
!= EXPR_CONSTANT
)
1799 ceil
= gfc_copy_expr (e
);
1800 mpfr_ceil (ceil
->value
.real
, e
->value
.real
);
1802 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
1803 gfc_mpfr_to_mpz (result
->value
.integer
, ceil
->value
.real
, &e
->where
);
1805 gfc_free_expr (ceil
);
1807 return range_check (result
, "CEILING");
1812 gfc_simplify_char (gfc_expr
*e
, gfc_expr
*k
)
1814 return simplify_achar_char (e
, k
, "CHAR", false);
1818 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1821 simplify_cmplx (const char *name
, gfc_expr
*x
, gfc_expr
*y
, int kind
)
1825 if (x
->expr_type
!= EXPR_CONSTANT
1826 || (y
!= NULL
&& y
->expr_type
!= EXPR_CONSTANT
))
1829 result
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &x
->where
);
1835 mpc_set_z (result
->value
.complex, x
->value
.integer
, GFC_MPC_RND_MODE
);
1839 mpc_set_fr (result
->value
.complex, x
->value
.real
, GFC_RND_MODE
);
1843 mpc_set (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1847 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1851 return range_check (result
, name
);
1857 mpfr_set_z (mpc_imagref (result
->value
.complex),
1858 y
->value
.integer
, GFC_RND_MODE
);
1862 mpfr_set (mpc_imagref (result
->value
.complex),
1863 y
->value
.real
, GFC_RND_MODE
);
1867 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1870 return range_check (result
, name
);
1875 gfc_simplify_cmplx (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*k
)
1879 kind
= get_kind (BT_REAL
, k
, "CMPLX", gfc_default_complex_kind
);
1881 return &gfc_bad_expr
;
1883 return simplify_cmplx ("CMPLX", x
, y
, kind
);
1888 gfc_simplify_complex (gfc_expr
*x
, gfc_expr
*y
)
1892 if (x
->ts
.type
== BT_INTEGER
&& y
->ts
.type
== BT_INTEGER
)
1893 kind
= gfc_default_complex_kind
;
1894 else if (x
->ts
.type
== BT_REAL
|| y
->ts
.type
== BT_INTEGER
)
1896 else if (x
->ts
.type
== BT_INTEGER
|| y
->ts
.type
== BT_REAL
)
1898 else if (x
->ts
.type
== BT_REAL
&& y
->ts
.type
== BT_REAL
)
1899 kind
= (x
->ts
.kind
> y
->ts
.kind
) ? x
->ts
.kind
: y
->ts
.kind
;
1903 return simplify_cmplx ("COMPLEX", x
, y
, kind
);
1908 gfc_simplify_conjg (gfc_expr
*e
)
1912 if (e
->expr_type
!= EXPR_CONSTANT
)
1915 result
= gfc_copy_expr (e
);
1916 mpc_conj (result
->value
.complex, result
->value
.complex, GFC_MPC_RND_MODE
);
1918 return range_check (result
, "CONJG");
1922 /* Simplify atan2d (x) where the unit is degree. */
1925 gfc_simplify_atan2d (gfc_expr
*y
, gfc_expr
*x
)
1929 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1932 if (mpfr_zero_p (y
->value
.real
) && mpfr_zero_p (x
->value
.real
))
1934 gfc_error ("If first argument of ATAN2D at %L is zero, then the "
1935 "second argument must not be zero", &y
->where
);
1936 return &gfc_bad_expr
;
1939 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1940 mpfr_atan2 (result
->value
.real
, y
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1941 rad2deg (result
->value
.real
);
1943 return range_check (result
, "ATAN2D");
1948 gfc_simplify_cos (gfc_expr
*x
)
1952 if (x
->expr_type
!= EXPR_CONSTANT
)
1955 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1960 mpfr_cos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1964 gfc_set_model_kind (x
->ts
.kind
);
1965 mpc_cos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1969 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1972 return range_check (result
, "COS");
1982 mpfr_const_pi (d2r
, GFC_RND_MODE
);
1983 mpfr_div_ui (d2r
, d2r
, 180, GFC_RND_MODE
);
1984 mpfr_mul (x
, x
, d2r
, GFC_RND_MODE
);
1989 /* Simplification routines for SIND, COSD, TAND. */
1990 #include "trigd_fe.inc"
1993 /* Simplify COSD(X) where X has the unit of degree. */
1996 gfc_simplify_cosd (gfc_expr
*x
)
2000 if (x
->expr_type
!= EXPR_CONSTANT
)
2003 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2004 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2005 simplify_cosd (result
->value
.real
);
2007 return range_check (result
, "COSD");
2011 /* Simplify SIND(X) where X has the unit of degree. */
2014 gfc_simplify_sind (gfc_expr
*x
)
2018 if (x
->expr_type
!= EXPR_CONSTANT
)
2021 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2022 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2023 simplify_sind (result
->value
.real
);
2025 return range_check (result
, "SIND");
2029 /* Simplify TAND(X) where X has the unit of degree. */
2032 gfc_simplify_tand (gfc_expr
*x
)
2036 if (x
->expr_type
!= EXPR_CONSTANT
)
2039 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2040 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2041 simplify_tand (result
->value
.real
);
2043 return range_check (result
, "TAND");
2047 /* Simplify COTAND(X) where X has the unit of degree. */
2050 gfc_simplify_cotand (gfc_expr
*x
)
2054 if (x
->expr_type
!= EXPR_CONSTANT
)
2057 /* Implement COTAND = -TAND(x+90).
2058 TAND offers correct exact values for multiples of 30 degrees.
2059 This implementation is also compatible with the behavior of some legacy
2060 compilers. Keep this consistent with gfc_conv_intrinsic_cotand. */
2061 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2062 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2063 mpfr_add_ui (result
->value
.real
, result
->value
.real
, 90, GFC_RND_MODE
);
2064 simplify_tand (result
->value
.real
);
2065 mpfr_neg (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
2067 return range_check (result
, "COTAND");
2072 gfc_simplify_cosh (gfc_expr
*x
)
2076 if (x
->expr_type
!= EXPR_CONSTANT
)
2079 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2084 mpfr_cosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2088 mpc_cosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
2095 return range_check (result
, "COSH");
2100 gfc_simplify_count (gfc_expr
*mask
, gfc_expr
*dim
, gfc_expr
*kind
)
2105 size_zero
= gfc_is_size_zero_array (mask
);
2107 if (!(is_constant_array_expr (mask
) || size_zero
)
2108 || !gfc_is_constant_expr (dim
)
2109 || !gfc_is_constant_expr (kind
))
2112 result
= transformational_result (mask
, dim
,
2114 get_kind (BT_INTEGER
, kind
, "COUNT",
2115 gfc_default_integer_kind
),
2118 init_result_expr (result
, 0, NULL
);
2123 /* Passing MASK twice, once as data array, once as mask.
2124 Whenever gfc_count is called, '1' is added to the result. */
2125 return !dim
|| mask
->rank
== 1 ?
2126 simplify_transformation_to_scalar (result
, mask
, mask
, gfc_count
) :
2127 simplify_transformation_to_array (result
, mask
, dim
, mask
, gfc_count
, NULL
);
2130 /* Simplification routine for cshift. This works by copying the array
2131 expressions into a one-dimensional array, shuffling the values into another
2132 one-dimensional array and creating the new array expression from this. The
2133 shuffling part is basically taken from the library routine. */
2136 gfc_simplify_cshift (gfc_expr
*array
, gfc_expr
*shift
, gfc_expr
*dim
)
2140 gfc_expr
**arrayvec
, **resultvec
;
2141 gfc_expr
**rptr
, **sptr
;
2143 size_t arraysize
, shiftsize
, i
;
2144 gfc_constructor
*array_ctor
, *shift_ctor
;
2145 ssize_t
*shiftvec
, *hptr
;
2146 ssize_t shift_val
, len
;
2147 ssize_t count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
2148 hs_ex
[GFC_MAX_DIMENSIONS
+ 1],
2149 hstride
[GFC_MAX_DIMENSIONS
], sstride
[GFC_MAX_DIMENSIONS
],
2150 a_extent
[GFC_MAX_DIMENSIONS
], a_stride
[GFC_MAX_DIMENSIONS
],
2151 h_extent
[GFC_MAX_DIMENSIONS
],
2152 ss_ex
[GFC_MAX_DIMENSIONS
+ 1];
2156 gfc_expr
**src
, **dest
;
2158 if (!is_constant_array_expr (array
))
2161 if (shift
->rank
> 0)
2162 gfc_simplify_expr (shift
, 1);
2164 if (!gfc_is_constant_expr (shift
))
2167 /* Make dim zero-based. */
2170 if (!gfc_is_constant_expr (dim
))
2172 which
= mpz_get_si (dim
->value
.integer
) - 1;
2177 if (array
->shape
== NULL
)
2180 gfc_array_size (array
, &size
);
2181 arraysize
= mpz_get_ui (size
);
2184 result
= gfc_get_array_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
2185 result
->shape
= gfc_copy_shape (array
->shape
, array
->rank
);
2186 result
->rank
= array
->rank
;
2187 result
->ts
.u
.derived
= array
->ts
.u
.derived
;
2192 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
2193 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
2194 for (i
= 0; i
< arraysize
; i
++)
2196 arrayvec
[i
] = array_ctor
->expr
;
2197 array_ctor
= gfc_constructor_next (array_ctor
);
2200 resultvec
= XCNEWVEC (gfc_expr
*, arraysize
);
2206 for (d
=0; d
< array
->rank
; d
++)
2208 a_extent
[d
] = mpz_get_si (array
->shape
[d
]);
2209 a_stride
[d
] = d
== 0 ? 1 : a_stride
[d
-1] * a_extent
[d
-1];
2212 if (shift
->rank
> 0)
2214 gfc_array_size (shift
, &size
);
2215 shiftsize
= mpz_get_ui (size
);
2217 shiftvec
= XCNEWVEC (ssize_t
, shiftsize
);
2218 shift_ctor
= gfc_constructor_first (shift
->value
.constructor
);
2219 for (d
= 0; d
< shift
->rank
; d
++)
2221 h_extent
[d
] = mpz_get_si (shift
->shape
[d
]);
2222 hstride
[d
] = d
== 0 ? 1 : hstride
[d
-1] * h_extent
[d
-1];
2228 /* Shut up compiler */
2233 for (d
=0; d
< array
->rank
; d
++)
2237 rsoffset
= a_stride
[d
];
2243 extent
[n
] = a_extent
[d
];
2244 sstride
[n
] = a_stride
[d
];
2245 ss_ex
[n
] = sstride
[n
] * extent
[n
];
2247 hs_ex
[n
] = hstride
[n
] * extent
[n
];
2256 for (i
= 0; i
< shiftsize
; i
++)
2259 val
= mpz_get_si (shift_ctor
->expr
->value
.integer
);
2264 shift_ctor
= gfc_constructor_next (shift_ctor
);
2270 shift_val
= mpz_get_si (shift
->value
.integer
);
2271 shift_val
= shift_val
% len
;
2276 continue_loop
= true;
2282 while (continue_loop
)
2290 src
= &sptr
[sh
* rsoffset
];
2292 for (n
= 0; n
< len
- sh
; n
++)
2299 for ( n
= 0; n
< sh
; n
++)
2311 while (count
[n
] == extent
[n
])
2321 continue_loop
= false;
2335 for (i
= 0; i
< arraysize
; i
++)
2337 gfc_constructor_append_expr (&result
->value
.constructor
,
2338 gfc_copy_expr (resultvec
[i
]),
2346 gfc_simplify_dcmplx (gfc_expr
*x
, gfc_expr
*y
)
2348 return simplify_cmplx ("DCMPLX", x
, y
, gfc_default_double_kind
);
2353 gfc_simplify_dble (gfc_expr
*e
)
2355 gfc_expr
*result
= NULL
;
2358 if (e
->expr_type
!= EXPR_CONSTANT
)
2361 /* For explicit conversion, turn off -Wconversion and -Wconversion-extra
2363 tmp1
= warn_conversion
;
2364 tmp2
= warn_conversion_extra
;
2365 warn_conversion
= warn_conversion_extra
= 0;
2367 result
= gfc_convert_constant (e
, BT_REAL
, gfc_default_double_kind
);
2369 warn_conversion
= tmp1
;
2370 warn_conversion_extra
= tmp2
;
2372 if (result
== &gfc_bad_expr
)
2373 return &gfc_bad_expr
;
2375 return range_check (result
, "DBLE");
2380 gfc_simplify_digits (gfc_expr
*x
)
2384 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2389 digits
= gfc_integer_kinds
[i
].digits
;
2393 digits
= gfc_unsigned_kinds
[i
].digits
;
2398 digits
= gfc_real_kinds
[i
].digits
;
2405 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, digits
);
2410 gfc_simplify_dim (gfc_expr
*x
, gfc_expr
*y
)
2415 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2418 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
2419 result
= gfc_get_constant_expr (x
->ts
.type
, kind
, &x
->where
);
2424 if (mpz_cmp (x
->value
.integer
, y
->value
.integer
) > 0)
2425 mpz_sub (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2427 mpz_set_ui (result
->value
.integer
, 0);
2432 if (mpfr_cmp (x
->value
.real
, y
->value
.real
) > 0)
2433 mpfr_sub (result
->value
.real
, x
->value
.real
, y
->value
.real
,
2436 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
2441 gfc_internal_error ("gfc_simplify_dim(): Bad type");
2444 return range_check (result
, "DIM");
2449 gfc_simplify_dot_product (gfc_expr
*vector_a
, gfc_expr
*vector_b
)
2451 /* If vector_a is a zero-sized array, the result is 0 for INTEGER,
2452 REAL, and COMPLEX types and .false. for LOGICAL. */
2453 if (vector_a
->shape
&& mpz_get_si (vector_a
->shape
[0]) == 0)
2455 if (vector_a
->ts
.type
== BT_LOGICAL
)
2456 return gfc_get_logical_expr (gfc_default_logical_kind
, NULL
, false);
2458 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, 0);
2461 if (!is_constant_array_expr (vector_a
)
2462 || !is_constant_array_expr (vector_b
))
2465 return compute_dot_product (vector_a
, 1, 0, vector_b
, 1, 0, true);
2470 gfc_simplify_dprod (gfc_expr
*x
, gfc_expr
*y
)
2472 gfc_expr
*a1
, *a2
, *result
;
2474 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2477 a1
= gfc_real2real (x
, gfc_default_double_kind
);
2478 a2
= gfc_real2real (y
, gfc_default_double_kind
);
2480 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &x
->where
);
2481 mpfr_mul (result
->value
.real
, a1
->value
.real
, a2
->value
.real
, GFC_RND_MODE
);
2486 return range_check (result
, "DPROD");
2491 simplify_dshift (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
,
2495 int i
, k
, size
, shift
;
2496 bt type
= BT_INTEGER
;
2498 if (arg1
->expr_type
!= EXPR_CONSTANT
|| arg2
->expr_type
!= EXPR_CONSTANT
2499 || shiftarg
->expr_type
!= EXPR_CONSTANT
)
2502 if (flag_unsigned
&& arg1
->ts
.type
== BT_UNSIGNED
)
2504 k
= gfc_validate_kind (BT_UNSIGNED
, arg1
->ts
.kind
, false);
2505 size
= gfc_unsigned_kinds
[k
].bit_size
;
2510 k
= gfc_validate_kind (BT_INTEGER
, arg1
->ts
.kind
, false);
2511 size
= gfc_integer_kinds
[k
].bit_size
;
2514 gfc_extract_int (shiftarg
, &shift
);
2516 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */
2518 shift
= size
- shift
;
2520 result
= gfc_get_constant_expr (type
, arg1
->ts
.kind
, &arg1
->where
);
2521 mpz_set_ui (result
->value
.integer
, 0);
2523 for (i
= 0; i
< shift
; i
++)
2524 if (mpz_tstbit (arg2
->value
.integer
, size
- shift
+ i
))
2525 mpz_setbit (result
->value
.integer
, i
);
2527 for (i
= 0; i
< size
- shift
; i
++)
2528 if (mpz_tstbit (arg1
->value
.integer
, i
))
2529 mpz_setbit (result
->value
.integer
, shift
+ i
);
2531 /* Convert to a signed value if needed. */
2532 if (type
== BT_INTEGER
)
2533 gfc_convert_mpz_to_signed (result
->value
.integer
, size
);
2535 gfc_reduce_unsigned (result
);
2542 gfc_simplify_dshiftr (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
2544 return simplify_dshift (arg1
, arg2
, shiftarg
, true);
2549 gfc_simplify_dshiftl (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
2551 return simplify_dshift (arg1
, arg2
, shiftarg
, false);
2556 gfc_simplify_eoshift (gfc_expr
*array
, gfc_expr
*shift
, gfc_expr
*boundary
,
2563 gfc_expr
**arrayvec
, **resultvec
;
2564 gfc_expr
**rptr
, **sptr
;
2566 size_t arraysize
, i
;
2567 gfc_constructor
*array_ctor
, *shift_ctor
, *bnd_ctor
;
2568 ssize_t shift_val
, len
;
2569 ssize_t count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
2570 sstride
[GFC_MAX_DIMENSIONS
], a_extent
[GFC_MAX_DIMENSIONS
],
2571 a_stride
[GFC_MAX_DIMENSIONS
], ss_ex
[GFC_MAX_DIMENSIONS
+ 1];
2575 gfc_expr
**src
, **dest
;
2578 if (!is_constant_array_expr (array
))
2581 if (shift
->rank
> 0)
2582 gfc_simplify_expr (shift
, 1);
2584 if (!gfc_is_constant_expr (shift
))
2589 if (boundary
->rank
> 0)
2590 gfc_simplify_expr (boundary
, 1);
2592 if (!gfc_is_constant_expr (boundary
))
2598 if (!gfc_is_constant_expr (dim
))
2600 which
= mpz_get_si (dim
->value
.integer
) - 1;
2606 if (boundary
== NULL
)
2608 temp_boundary
= true;
2609 switch (array
->ts
.type
)
2613 bnd
= gfc_get_int_expr (array
->ts
.kind
, NULL
, 0);
2617 bnd
= gfc_get_logical_expr (array
->ts
.kind
, NULL
, 0);
2621 bnd
= gfc_get_constant_expr (array
->ts
.type
, array
->ts
.kind
, &gfc_current_locus
);
2622 mpfr_set_ui (bnd
->value
.real
, 0, GFC_RND_MODE
);
2626 bnd
= gfc_get_constant_expr (array
->ts
.type
, array
->ts
.kind
, &gfc_current_locus
);
2627 mpc_set_ui (bnd
->value
.complex, 0, GFC_RND_MODE
);
2631 s_len
= mpz_get_ui (array
->ts
.u
.cl
->length
->value
.integer
);
2632 bnd
= gfc_get_character_expr (array
->ts
.kind
, &gfc_current_locus
, NULL
, s_len
);
2642 temp_boundary
= false;
2646 gfc_array_size (array
, &size
);
2647 arraysize
= mpz_get_ui (size
);
2650 result
= gfc_get_array_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
2651 result
->shape
= gfc_copy_shape (array
->shape
, array
->rank
);
2652 result
->rank
= array
->rank
;
2653 result
->ts
= array
->ts
;
2658 if (array
->shape
== NULL
)
2661 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
2662 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
2663 for (i
= 0; i
< arraysize
; i
++)
2665 arrayvec
[i
] = array_ctor
->expr
;
2666 array_ctor
= gfc_constructor_next (array_ctor
);
2669 resultvec
= XCNEWVEC (gfc_expr
*, arraysize
);
2674 for (d
=0; d
< array
->rank
; d
++)
2676 a_extent
[d
] = mpz_get_si (array
->shape
[d
]);
2677 a_stride
[d
] = d
== 0 ? 1 : a_stride
[d
-1] * a_extent
[d
-1];
2680 if (shift
->rank
> 0)
2682 shift_ctor
= gfc_constructor_first (shift
->value
.constructor
);
2688 shift_val
= mpz_get_si (shift
->value
.integer
);
2692 bnd_ctor
= gfc_constructor_first (bnd
->value
.constructor
);
2696 /* Shut up compiler */
2701 for (d
=0; d
< array
->rank
; d
++)
2705 rsoffset
= a_stride
[d
];
2711 extent
[n
] = a_extent
[d
];
2712 sstride
[n
] = a_stride
[d
];
2713 ss_ex
[n
] = sstride
[n
] * extent
[n
];
2719 continue_loop
= true;
2724 while (continue_loop
)
2729 sh
= mpz_get_si (shift_ctor
->expr
->value
.integer
);
2733 if (( sh
>= 0 ? sh
: -sh
) > len
)
2739 delta
= (sh
>= 0) ? sh
: -sh
;
2743 src
= &sptr
[delta
* rsoffset
];
2749 dest
= &rptr
[delta
* rsoffset
];
2752 for (n
= 0; n
< len
- delta
; n
++)
2768 *dest
= gfc_copy_expr (bnd_ctor
->expr
);
2776 *dest
= gfc_copy_expr (bnd
);
2783 shift_ctor
= gfc_constructor_next (shift_ctor
);
2786 bnd_ctor
= gfc_constructor_next (bnd_ctor
);
2790 while (count
[n
] == extent
[n
])
2798 continue_loop
= false;
2810 for (i
= 0; i
< arraysize
; i
++)
2812 gfc_constructor_append_expr (&result
->value
.constructor
,
2813 gfc_copy_expr (resultvec
[i
]),
2819 gfc_free_expr (bnd
);
2825 gfc_simplify_erf (gfc_expr
*x
)
2829 if (x
->expr_type
!= EXPR_CONSTANT
)
2832 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2833 mpfr_erf (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2835 return range_check (result
, "ERF");
2840 gfc_simplify_erfc (gfc_expr
*x
)
2844 if (x
->expr_type
!= EXPR_CONSTANT
)
2847 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2848 mpfr_erfc (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2850 return range_check (result
, "ERFC");
2854 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
2856 #define MAX_ITER 200
2857 #define ARG_LIMIT 12
2859 /* Calculate ERFC_SCALED directly by its definition:
2861 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
2863 using a large precision for intermediate results. This is used for all
2864 but large values of the argument. */
2866 fullprec_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2871 prec
= mpfr_get_default_prec ();
2872 mpfr_set_default_prec (10 * prec
);
2877 mpfr_set (a
, arg
, GFC_RND_MODE
);
2878 mpfr_sqr (b
, a
, GFC_RND_MODE
);
2879 mpfr_exp (b
, b
, GFC_RND_MODE
);
2880 mpfr_erfc (a
, a
, GFC_RND_MODE
);
2881 mpfr_mul (a
, a
, b
, GFC_RND_MODE
);
2883 mpfr_set (res
, a
, GFC_RND_MODE
);
2884 mpfr_set_default_prec (prec
);
2890 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
2892 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
2893 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
2896 This is used for large values of the argument. Intermediate calculations
2897 are performed with twice the precision. We don't do a fixed number of
2898 iterations of the sum, but stop when it has converged to the required
2901 asympt_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2903 mpfr_t sum
, x
, u
, v
, w
, oldsum
, sumtrunc
;
2908 prec
= mpfr_get_default_prec ();
2909 mpfr_set_default_prec (2 * prec
);
2919 mpfr_init (sumtrunc
);
2920 mpfr_set_prec (oldsum
, prec
);
2921 mpfr_set_prec (sumtrunc
, prec
);
2923 mpfr_set (x
, arg
, GFC_RND_MODE
);
2924 mpfr_set_ui (sum
, 1, GFC_RND_MODE
);
2925 mpz_set_ui (num
, 1);
2927 mpfr_set (u
, x
, GFC_RND_MODE
);
2928 mpfr_sqr (u
, u
, GFC_RND_MODE
);
2929 mpfr_mul_ui (u
, u
, 2, GFC_RND_MODE
);
2930 mpfr_pow_si (u
, u
, -1, GFC_RND_MODE
);
2932 for (i
= 1; i
< MAX_ITER
; i
++)
2934 mpfr_set (oldsum
, sum
, GFC_RND_MODE
);
2936 mpz_mul_ui (num
, num
, 2 * i
- 1);
2939 mpfr_set (w
, u
, GFC_RND_MODE
);
2940 mpfr_pow_ui (w
, w
, i
, GFC_RND_MODE
);
2942 mpfr_set_z (v
, num
, GFC_RND_MODE
);
2943 mpfr_mul (v
, v
, w
, GFC_RND_MODE
);
2945 mpfr_add (sum
, sum
, v
, GFC_RND_MODE
);
2947 mpfr_set (sumtrunc
, sum
, GFC_RND_MODE
);
2948 if (mpfr_cmp (sumtrunc
, oldsum
) == 0)
2952 /* We should have converged by now; otherwise, ARG_LIMIT is probably
2954 gcc_assert (i
< MAX_ITER
);
2956 /* Divide by x * sqrt(Pi). */
2957 mpfr_const_pi (u
, GFC_RND_MODE
);
2958 mpfr_sqrt (u
, u
, GFC_RND_MODE
);
2959 mpfr_mul (u
, u
, x
, GFC_RND_MODE
);
2960 mpfr_div (sum
, sum
, u
, GFC_RND_MODE
);
2962 mpfr_set (res
, sum
, GFC_RND_MODE
);
2963 mpfr_set_default_prec (prec
);
2965 mpfr_clears (sum
, x
, u
, v
, w
, oldsum
, sumtrunc
, NULL
);
2971 gfc_simplify_erfc_scaled (gfc_expr
*x
)
2975 if (x
->expr_type
!= EXPR_CONSTANT
)
2978 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2979 if (mpfr_cmp_d (x
->value
.real
, ARG_LIMIT
) >= 0)
2980 asympt_erfc_scaled (result
->value
.real
, x
->value
.real
);
2982 fullprec_erfc_scaled (result
->value
.real
, x
->value
.real
);
2984 return range_check (result
, "ERFC_SCALED");
2992 gfc_simplify_epsilon (gfc_expr
*e
)
2997 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2999 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
3000 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].epsilon
, GFC_RND_MODE
);
3002 return range_check (result
, "EPSILON");
3007 gfc_simplify_exp (gfc_expr
*x
)
3011 if (x
->expr_type
!= EXPR_CONSTANT
)
3014 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3019 mpfr_exp (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
3023 gfc_set_model_kind (x
->ts
.kind
);
3024 mpc_exp (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
3028 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
3031 return range_check (result
, "EXP");
3036 gfc_simplify_exponent (gfc_expr
*x
)
3041 if (x
->expr_type
!= EXPR_CONSTANT
)
3044 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
3047 /* EXPONENT(inf) = EXPONENT(nan) = HUGE(0) */
3048 if (mpfr_inf_p (x
->value
.real
) || mpfr_nan_p (x
->value
.real
))
3050 int i
= gfc_validate_kind (BT_INTEGER
, gfc_default_integer_kind
, false);
3051 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
3055 /* EXPONENT(+/- 0.0) = 0 */
3056 if (mpfr_zero_p (x
->value
.real
))
3058 mpz_set_ui (result
->value
.integer
, 0);
3062 gfc_set_model (x
->value
.real
);
3064 val
= (long int) mpfr_get_exp (x
->value
.real
);
3065 mpz_set_si (result
->value
.integer
, val
);
3067 return range_check (result
, "EXPONENT");
3072 gfc_simplify_failed_or_stopped_images (gfc_expr
*team ATTRIBUTE_UNUSED
,
3075 if (flag_coarray
== GFC_FCOARRAY_NONE
)
3077 gfc_current_locus
= *gfc_current_intrinsic_where
;
3078 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
3079 return &gfc_bad_expr
;
3082 if (flag_coarray
== GFC_FCOARRAY_SINGLE
)
3087 gfc_extract_int (kind
, &actual_kind
);
3089 actual_kind
= gfc_default_integer_kind
;
3091 result
= gfc_get_array_expr (BT_INTEGER
, actual_kind
, &gfc_current_locus
);
3096 /* For fcoarray = lib no simplification is possible, because it is not known
3097 what images failed or are stopped at compile time. */
3103 gfc_simplify_get_team (gfc_expr
*level ATTRIBUTE_UNUSED
)
3105 if (flag_coarray
== GFC_FCOARRAY_NONE
)
3107 gfc_current_locus
= *gfc_current_intrinsic_where
;
3108 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
3109 return &gfc_bad_expr
;
3112 if (flag_coarray
== GFC_FCOARRAY_SINGLE
)
3115 result
= gfc_get_array_expr (BT_INTEGER
, gfc_default_integer_kind
, &gfc_current_locus
);
3120 /* For fcoarray = lib no simplification is possible, because it is not known
3121 what images failed or are stopped at compile time. */
3127 gfc_simplify_float (gfc_expr
*a
)
3131 if (a
->expr_type
!= EXPR_CONSTANT
)
3134 result
= gfc_int2real (a
, gfc_default_real_kind
);
3136 return range_check (result
, "FLOAT");
3141 is_last_ref_vtab (gfc_expr
*e
)
3144 gfc_component
*comp
= NULL
;
3146 if (e
->expr_type
!= EXPR_VARIABLE
)
3149 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
3150 if (ref
->type
== REF_COMPONENT
)
3151 comp
= ref
->u
.c
.component
;
3153 if (!e
->ref
|| !comp
)
3154 return e
->symtree
->n
.sym
->attr
.vtab
;
3156 if (comp
->name
[0] == '_' && strcmp (comp
->name
, "_vptr") == 0)
3164 gfc_simplify_extends_type_of (gfc_expr
*a
, gfc_expr
*mold
)
3166 /* Avoid simplification of resolved symbols. */
3167 if (is_last_ref_vtab (a
) || is_last_ref_vtab (mold
))
3170 if (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_DERIVED
)
3171 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
3172 gfc_type_is_extension_of (mold
->ts
.u
.derived
,
3175 if (UNLIMITED_POLY (a
) || UNLIMITED_POLY (mold
))
3178 if ((a
->ts
.type
== BT_CLASS
&& !gfc_expr_attr (a
).class_ok
)
3179 || (mold
->ts
.type
== BT_CLASS
&& !gfc_expr_attr (mold
).class_ok
))
3182 /* Return .false. if the dynamic type can never be an extension. */
3183 if ((a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_CLASS
3184 && !gfc_type_is_extension_of
3185 (CLASS_DATA (mold
)->ts
.u
.derived
,
3186 CLASS_DATA (a
)->ts
.u
.derived
)
3187 && !gfc_type_is_extension_of
3188 (CLASS_DATA (a
)->ts
.u
.derived
,
3189 CLASS_DATA (mold
)->ts
.u
.derived
))
3190 || (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_CLASS
3191 && !gfc_type_is_extension_of
3192 (CLASS_DATA (mold
)->ts
.u
.derived
,
3194 || (a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_DERIVED
3195 && !gfc_type_is_extension_of
3196 (mold
->ts
.u
.derived
,
3197 CLASS_DATA (a
)->ts
.u
.derived
)
3198 && !gfc_type_is_extension_of
3199 (CLASS_DATA (a
)->ts
.u
.derived
,
3200 mold
->ts
.u
.derived
)))
3201 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
3203 /* Return .true. if the dynamic type is guaranteed to be an extension. */
3204 if (a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_DERIVED
3205 && gfc_type_is_extension_of (mold
->ts
.u
.derived
,
3206 CLASS_DATA (a
)->ts
.u
.derived
))
3207 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, true);
3214 gfc_simplify_same_type_as (gfc_expr
*a
, gfc_expr
*b
)
3216 /* Avoid simplification of resolved symbols. */
3217 if (is_last_ref_vtab (a
) || is_last_ref_vtab (b
))
3220 /* Return .false. if the dynamic type can never be the
3222 if (((a
->ts
.type
== BT_CLASS
&& gfc_expr_attr (a
).class_ok
)
3223 || (b
->ts
.type
== BT_CLASS
&& gfc_expr_attr (b
).class_ok
))
3224 && !gfc_type_compatible (&a
->ts
, &b
->ts
)
3225 && !gfc_type_compatible (&b
->ts
, &a
->ts
))
3226 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
3228 if (a
->ts
.type
!= BT_DERIVED
|| b
->ts
.type
!= BT_DERIVED
)
3231 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
3232 gfc_compare_derived_types (a
->ts
.u
.derived
,
3238 gfc_simplify_floor (gfc_expr
*e
, gfc_expr
*k
)
3244 kind
= get_kind (BT_INTEGER
, k
, "FLOOR", gfc_default_integer_kind
);
3246 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
3248 if (e
->expr_type
!= EXPR_CONSTANT
)
3251 mpfr_init2 (floor
, mpfr_get_prec (e
->value
.real
));
3252 mpfr_floor (floor
, e
->value
.real
);
3254 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
3255 gfc_mpfr_to_mpz (result
->value
.integer
, floor
, &e
->where
);
3259 return range_check (result
, "FLOOR");
3264 gfc_simplify_fraction (gfc_expr
*x
)
3269 if (x
->expr_type
!= EXPR_CONSTANT
)
3272 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
3274 /* FRACTION(inf) = NaN. */
3275 if (mpfr_inf_p (x
->value
.real
))
3277 mpfr_set_nan (result
->value
.real
);
3281 /* mpfr_frexp() correctly handles zeros and NaNs. */
3282 mpfr_frexp (&e
, result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
3284 return range_check (result
, "FRACTION");
3289 gfc_simplify_gamma (gfc_expr
*x
)
3293 if (x
->expr_type
!= EXPR_CONSTANT
)
3296 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3297 mpfr_gamma (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
3299 return range_check (result
, "GAMMA");
3304 gfc_simplify_huge (gfc_expr
*e
)
3309 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3310 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3315 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
3319 mpz_set (result
->value
.integer
, gfc_unsigned_kinds
[i
].huge
);
3323 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
3335 gfc_simplify_hypot (gfc_expr
*x
, gfc_expr
*y
)
3339 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3342 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3343 mpfr_hypot (result
->value
.real
, x
->value
.real
, y
->value
.real
, GFC_RND_MODE
);
3344 return range_check (result
, "HYPOT");
3348 /* We use the processor's collating sequence, because all
3349 systems that gfortran currently works on are ASCII. */
3352 gfc_simplify_iachar (gfc_expr
*e
, gfc_expr
*kind
)
3358 if (e
->expr_type
!= EXPR_CONSTANT
)
3361 if (e
->value
.character
.length
!= 1)
3363 gfc_error ("Argument of IACHAR at %L must be of length one", &e
->where
);
3364 return &gfc_bad_expr
;
3367 index
= e
->value
.character
.string
[0];
3369 if (warn_surprising
&& index
> 127)
3370 gfc_warning (OPT_Wsurprising
,
3371 "Argument of IACHAR function at %L outside of range 0..127",
3374 k
= get_kind (BT_INTEGER
, kind
, "IACHAR", gfc_default_integer_kind
);
3376 return &gfc_bad_expr
;
3378 result
= gfc_get_int_expr (k
, &e
->where
, index
);
3380 return range_check (result
, "IACHAR");
3385 do_bit_and (gfc_expr
*result
, gfc_expr
*e
)
3387 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
3388 gcc_assert (result
->ts
.type
== BT_INTEGER
3389 && result
->expr_type
== EXPR_CONSTANT
);
3391 mpz_and (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
3397 gfc_simplify_iall (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
3399 return simplify_transformation (array
, dim
, mask
, -1, do_bit_and
);
3404 do_bit_ior (gfc_expr
*result
, gfc_expr
*e
)
3406 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
3407 gcc_assert (result
->ts
.type
== BT_INTEGER
3408 && result
->expr_type
== EXPR_CONSTANT
);
3410 mpz_ior (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
3416 gfc_simplify_iany (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
3418 return simplify_transformation (array
, dim
, mask
, 0, do_bit_ior
);
3423 gfc_simplify_iand (gfc_expr
*x
, gfc_expr
*y
)
3428 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3431 type
= x
->ts
.type
== BT_UNSIGNED
? BT_UNSIGNED
: BT_INTEGER
;
3432 result
= gfc_get_constant_expr (type
, x
->ts
.kind
, &x
->where
);
3433 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
3435 return range_check (result
, "IAND");
3440 gfc_simplify_ibclr (gfc_expr
*x
, gfc_expr
*y
)
3445 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3448 if (!gfc_check_bitfcn (x
, y
))
3449 return &gfc_bad_expr
;
3451 gfc_extract_int (y
, &pos
);
3453 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
3455 result
= gfc_copy_expr (x
);
3456 /* Drop any separate memory representation of x to avoid potential
3457 inconsistencies in result. */
3458 if (result
->representation
.string
)
3460 free (result
->representation
.string
);
3461 result
->representation
.string
= NULL
;
3464 if (x
->ts
.type
== BT_INTEGER
)
3466 gfc_convert_mpz_to_unsigned (result
->value
.integer
,
3467 gfc_integer_kinds
[k
].bit_size
);
3469 mpz_clrbit (result
->value
.integer
, pos
);
3471 gfc_convert_mpz_to_signed (result
->value
.integer
,
3472 gfc_integer_kinds
[k
].bit_size
);
3475 mpz_clrbit (result
->value
.integer
, pos
);
3482 gfc_simplify_ibits (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*z
)
3489 if (x
->expr_type
!= EXPR_CONSTANT
3490 || y
->expr_type
!= EXPR_CONSTANT
3491 || z
->expr_type
!= EXPR_CONSTANT
)
3494 if (!gfc_check_ibits (x
, y
, z
))
3495 return &gfc_bad_expr
;
3497 gfc_extract_int (y
, &pos
);
3498 gfc_extract_int (z
, &len
);
3500 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
3502 if (x
->ts
.type
== BT_INTEGER
)
3503 bitsize
= gfc_integer_kinds
[k
].bit_size
;
3505 bitsize
= gfc_unsigned_kinds
[k
].bit_size
;
3508 if (pos
+ len
> bitsize
)
3510 gfc_error ("Sum of second and third arguments of IBITS exceeds "
3511 "bit size at %L", &y
->where
);
3512 return &gfc_bad_expr
;
3515 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3517 if (x
->ts
.type
== BT_INTEGER
)
3518 gfc_convert_mpz_to_unsigned (result
->value
.integer
,
3519 gfc_integer_kinds
[k
].bit_size
);
3521 bits
= XCNEWVEC (int, bitsize
);
3523 for (i
= 0; i
< bitsize
; i
++)
3526 for (i
= 0; i
< len
; i
++)
3527 bits
[i
] = mpz_tstbit (x
->value
.integer
, i
+ pos
);
3529 for (i
= 0; i
< bitsize
; i
++)
3532 mpz_clrbit (result
->value
.integer
, i
);
3533 else if (bits
[i
] == 1)
3534 mpz_setbit (result
->value
.integer
, i
);
3536 gfc_internal_error ("IBITS: Bad bit");
3541 if (x
->ts
.type
== BT_INTEGER
)
3542 gfc_convert_mpz_to_signed (result
->value
.integer
,
3543 gfc_integer_kinds
[k
].bit_size
);
3550 gfc_simplify_ibset (gfc_expr
*x
, gfc_expr
*y
)
3555 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3558 if (!gfc_check_bitfcn (x
, y
))
3559 return &gfc_bad_expr
;
3561 gfc_extract_int (y
, &pos
);
3563 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
3565 result
= gfc_copy_expr (x
);
3566 /* Drop any separate memory representation of x to avoid potential
3567 inconsistencies in result. */
3568 if (result
->representation
.string
)
3570 free (result
->representation
.string
);
3571 result
->representation
.string
= NULL
;
3574 if (x
->ts
.type
== BT_INTEGER
)
3576 gfc_convert_mpz_to_unsigned (result
->value
.integer
,
3577 gfc_integer_kinds
[k
].bit_size
);
3579 mpz_setbit (result
->value
.integer
, pos
);
3581 gfc_convert_mpz_to_signed (result
->value
.integer
,
3582 gfc_integer_kinds
[k
].bit_size
);
3585 mpz_setbit (result
->value
.integer
, pos
);
3592 gfc_simplify_ichar (gfc_expr
*e
, gfc_expr
*kind
)
3598 if (e
->expr_type
!= EXPR_CONSTANT
)
3601 if (e
->value
.character
.length
!= 1)
3603 gfc_error ("Argument of ICHAR at %L must be of length one", &e
->where
);
3604 return &gfc_bad_expr
;
3607 index
= e
->value
.character
.string
[0];
3609 k
= get_kind (BT_INTEGER
, kind
, "ICHAR", gfc_default_integer_kind
);
3611 return &gfc_bad_expr
;
3613 result
= gfc_get_int_expr (k
, &e
->where
, index
);
3615 return range_check (result
, "ICHAR");
3620 gfc_simplify_ieor (gfc_expr
*x
, gfc_expr
*y
)
3625 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3628 type
= x
->ts
.type
== BT_UNSIGNED
? BT_UNSIGNED
: BT_INTEGER
;
3629 result
= gfc_get_constant_expr (type
, x
->ts
.kind
, &x
->where
);
3630 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
3632 return range_check (result
, "IEOR");
3637 gfc_simplify_index (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*b
, gfc_expr
*kind
)
3641 HOST_WIDE_INT len
, lensub
, start
, last
, i
, index
= 0;
3644 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
3645 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
3648 back
= (b
!= NULL
&& b
->value
.logical
!= 0);
3650 k
= get_kind (BT_INTEGER
, kind
, "INDEX", gfc_default_integer_kind
);
3652 return &gfc_bad_expr
;
3654 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &x
->where
);
3656 len
= x
->value
.character
.length
;
3657 lensub
= y
->value
.character
.length
;
3661 mpz_set_si (result
->value
.integer
, 0);
3676 last
= len
+ 1 - lensub
;
3683 start
= len
- lensub
;
3687 for (; start
!= last
; start
+= delta
)
3689 for (i
= 0; i
< lensub
; i
++)
3691 if (x
->value
.character
.string
[start
+ i
]
3692 != y
->value
.character
.string
[i
])
3703 mpz_set_si (result
->value
.integer
, index
);
3704 return range_check (result
, "INDEX");
3708 simplify_intconv (gfc_expr
*e
, int kind
, const char *name
)
3710 gfc_expr
*result
= NULL
;
3713 /* Convert BOZ to integer, and return without range checking. */
3714 if (e
->ts
.type
== BT_BOZ
)
3716 if (!gfc_boz2int (e
, kind
))
3718 result
= gfc_copy_expr (e
);
3722 if (e
->expr_type
!= EXPR_CONSTANT
)
3725 /* For explicit conversion, turn off -Wconversion and -Wconversion-extra
3727 tmp1
= warn_conversion
;
3728 tmp2
= warn_conversion_extra
;
3729 warn_conversion
= warn_conversion_extra
= 0;
3731 result
= gfc_convert_constant (e
, BT_INTEGER
, kind
);
3733 warn_conversion
= tmp1
;
3734 warn_conversion_extra
= tmp2
;
3736 if (result
== &gfc_bad_expr
)
3737 return &gfc_bad_expr
;
3739 return range_check (result
, name
);
3744 gfc_simplify_int (gfc_expr
*e
, gfc_expr
*k
)
3748 kind
= get_kind (BT_INTEGER
, k
, "INT", gfc_default_integer_kind
);
3750 return &gfc_bad_expr
;
3752 return simplify_intconv (e
, kind
, "INT");
3756 gfc_simplify_int2 (gfc_expr
*e
)
3758 return simplify_intconv (e
, 2, "INT2");
3763 gfc_simplify_int8 (gfc_expr
*e
)
3765 return simplify_intconv (e
, 8, "INT8");
3770 gfc_simplify_long (gfc_expr
*e
)
3772 return simplify_intconv (e
, 4, "LONG");
3777 gfc_simplify_ifix (gfc_expr
*e
)
3779 gfc_expr
*rtrunc
, *result
;
3781 if (e
->expr_type
!= EXPR_CONSTANT
)
3784 rtrunc
= gfc_copy_expr (e
);
3785 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
3787 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
3789 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
3791 gfc_free_expr (rtrunc
);
3793 return range_check (result
, "IFIX");
3798 gfc_simplify_idint (gfc_expr
*e
)
3800 gfc_expr
*rtrunc
, *result
;
3802 if (e
->expr_type
!= EXPR_CONSTANT
)
3805 rtrunc
= gfc_copy_expr (e
);
3806 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
3808 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
3810 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
3812 gfc_free_expr (rtrunc
);
3814 return range_check (result
, "IDINT");
3818 gfc_simplify_uint (gfc_expr
*e
, gfc_expr
*k
)
3820 gfc_expr
*result
= NULL
;
3823 /* KIND is always an integer. */
3825 kind
= get_kind (BT_INTEGER
, k
, "INT", gfc_default_integer_kind
);
3827 return &gfc_bad_expr
;
3829 /* Convert BOZ to integer, and return without range checking. */
3830 if (e
->ts
.type
== BT_BOZ
)
3832 if (!gfc_boz2uint (e
, kind
))
3834 result
= gfc_copy_expr (e
);
3838 if (e
->expr_type
!= EXPR_CONSTANT
)
3841 result
= gfc_convert_constant (e
, BT_UNSIGNED
, kind
);
3843 if (result
== &gfc_bad_expr
)
3844 return &gfc_bad_expr
;
3846 return range_check (result
, "UINT");
3851 gfc_simplify_ior (gfc_expr
*x
, gfc_expr
*y
)
3856 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3859 type
= x
->ts
.type
== BT_UNSIGNED
? BT_UNSIGNED
: BT_INTEGER
;
3860 result
= gfc_get_constant_expr (type
, x
->ts
.kind
, &x
->where
);
3861 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
3863 return range_check (result
, "IOR");
3868 do_bit_xor (gfc_expr
*result
, gfc_expr
*e
)
3870 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
3871 gcc_assert (result
->ts
.type
== BT_INTEGER
3872 && result
->expr_type
== EXPR_CONSTANT
);
3874 mpz_xor (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
3880 gfc_simplify_iparity (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
3882 return simplify_transformation (array
, dim
, mask
, 0, do_bit_xor
);
3887 gfc_simplify_is_iostat_end (gfc_expr
*x
)
3889 if (x
->expr_type
!= EXPR_CONSTANT
)
3892 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3893 mpz_cmp_si (x
->value
.integer
,
3894 LIBERROR_END
) == 0);
3899 gfc_simplify_is_iostat_eor (gfc_expr
*x
)
3901 if (x
->expr_type
!= EXPR_CONSTANT
)
3904 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3905 mpz_cmp_si (x
->value
.integer
,
3906 LIBERROR_EOR
) == 0);
3911 gfc_simplify_isnan (gfc_expr
*x
)
3913 if (x
->expr_type
!= EXPR_CONSTANT
)
3916 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3917 mpfr_nan_p (x
->value
.real
));
3921 /* Performs a shift on its first argument. Depending on the last
3922 argument, the shift can be arithmetic, i.e. with filling from the
3923 left like in the SHIFTA intrinsic. */
3925 simplify_shift (gfc_expr
*e
, gfc_expr
*s
, const char *name
,
3926 bool arithmetic
, int direction
)
3929 int ashift
, *bits
, i
, k
, bitsize
, shift
;
3931 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
3934 gfc_extract_int (s
, &shift
);
3936 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3937 if (e
->ts
.type
== BT_INTEGER
)
3938 bitsize
= gfc_integer_kinds
[k
].bit_size
;
3940 bitsize
= gfc_unsigned_kinds
[k
].bit_size
;
3942 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3946 mpz_set (result
->value
.integer
, e
->value
.integer
);
3950 if (direction
> 0 && shift
< 0)
3952 /* Left shift, as in SHIFTL. */
3953 gfc_error ("Second argument of %s is negative at %L", name
, &e
->where
);
3954 return &gfc_bad_expr
;
3956 else if (direction
< 0)
3958 /* Right shift, as in SHIFTR or SHIFTA. */
3961 gfc_error ("Second argument of %s is negative at %L",
3963 return &gfc_bad_expr
;
3969 ashift
= (shift
>= 0 ? shift
: -shift
);
3971 if (ashift
> bitsize
)
3973 gfc_error ("Magnitude of second argument of %s exceeds bit size "
3974 "at %L", name
, &e
->where
);
3975 return &gfc_bad_expr
;
3978 bits
= XCNEWVEC (int, bitsize
);
3980 for (i
= 0; i
< bitsize
; i
++)
3981 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3986 for (i
= 0; i
< shift
; i
++)
3987 mpz_clrbit (result
->value
.integer
, i
);
3989 for (i
= 0; i
< bitsize
- shift
; i
++)
3992 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3994 mpz_setbit (result
->value
.integer
, i
+ shift
);
4000 if (arithmetic
&& bits
[bitsize
- 1])
4001 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
4002 mpz_setbit (result
->value
.integer
, i
);
4004 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
4005 mpz_clrbit (result
->value
.integer
, i
);
4007 for (i
= bitsize
- 1; i
>= ashift
; i
--)
4010 mpz_clrbit (result
->value
.integer
, i
- ashift
);
4012 mpz_setbit (result
->value
.integer
, i
- ashift
);
4016 if (result
->ts
.type
== BT_INTEGER
)
4017 gfc_convert_mpz_to_signed (result
->value
.integer
, bitsize
);
4019 gfc_reduce_unsigned(result
);
4028 gfc_simplify_ishft (gfc_expr
*e
, gfc_expr
*s
)
4030 return simplify_shift (e
, s
, "ISHFT", false, 0);
4035 gfc_simplify_lshift (gfc_expr
*e
, gfc_expr
*s
)
4037 return simplify_shift (e
, s
, "LSHIFT", false, 1);
4042 gfc_simplify_rshift (gfc_expr
*e
, gfc_expr
*s
)
4044 return simplify_shift (e
, s
, "RSHIFT", true, -1);
4049 gfc_simplify_shifta (gfc_expr
*e
, gfc_expr
*s
)
4051 return simplify_shift (e
, s
, "SHIFTA", true, -1);
4056 gfc_simplify_shiftl (gfc_expr
*e
, gfc_expr
*s
)
4058 return simplify_shift (e
, s
, "SHIFTL", false, 1);
4063 gfc_simplify_shiftr (gfc_expr
*e
, gfc_expr
*s
)
4065 return simplify_shift (e
, s
, "SHIFTR", false, -1);
4070 gfc_simplify_ishftc (gfc_expr
*e
, gfc_expr
*s
, gfc_expr
*sz
)
4073 int shift
, ashift
, isize
, ssize
, delta
, k
;
4076 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
4079 gfc_extract_int (s
, &shift
);
4081 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4082 isize
= gfc_integer_kinds
[k
].bit_size
;
4086 if (sz
->expr_type
!= EXPR_CONSTANT
)
4089 gfc_extract_int (sz
, &ssize
);
4091 if (ssize
> isize
|| ssize
<= 0)
4092 return &gfc_bad_expr
;
4105 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
4106 "BIT_SIZE of first argument at %C");
4108 gfc_error ("Absolute value of SHIFT shall be less than or equal "
4110 return &gfc_bad_expr
;
4113 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
4115 mpz_set (result
->value
.integer
, e
->value
.integer
);
4120 if (result
->ts
.type
== BT_INTEGER
)
4121 gfc_convert_mpz_to_unsigned (result
->value
.integer
, isize
);
4123 bits
= XCNEWVEC (int, ssize
);
4125 for (i
= 0; i
< ssize
; i
++)
4126 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
4128 delta
= ssize
- ashift
;
4132 for (i
= 0; i
< delta
; i
++)
4135 mpz_clrbit (result
->value
.integer
, i
+ shift
);
4137 mpz_setbit (result
->value
.integer
, i
+ shift
);
4140 for (i
= delta
; i
< ssize
; i
++)
4143 mpz_clrbit (result
->value
.integer
, i
- delta
);
4145 mpz_setbit (result
->value
.integer
, i
- delta
);
4150 for (i
= 0; i
< ashift
; i
++)
4153 mpz_clrbit (result
->value
.integer
, i
+ delta
);
4155 mpz_setbit (result
->value
.integer
, i
+ delta
);
4158 for (i
= ashift
; i
< ssize
; i
++)
4161 mpz_clrbit (result
->value
.integer
, i
+ shift
);
4163 mpz_setbit (result
->value
.integer
, i
+ shift
);
4167 if (result
->ts
.type
== BT_INTEGER
)
4168 gfc_convert_mpz_to_signed (result
->value
.integer
, isize
);
4176 gfc_simplify_kind (gfc_expr
*e
)
4178 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, e
->ts
.kind
);
4183 simplify_bound_dim (gfc_expr
*array
, gfc_expr
*kind
, int d
, int upper
,
4184 gfc_array_spec
*as
, gfc_ref
*ref
, bool coarray
)
4186 gfc_expr
*l
, *u
, *result
;
4189 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
4190 gfc_default_integer_kind
);
4192 return &gfc_bad_expr
;
4194 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
4196 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
4197 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
4198 if (!coarray
&& array
->expr_type
!= EXPR_VARIABLE
)
4202 gfc_expr
* dim
= result
;
4203 mpz_set_si (dim
->value
.integer
, d
);
4205 result
= simplify_size (array
, dim
, k
);
4206 gfc_free_expr (dim
);
4211 mpz_set_si (result
->value
.integer
, 1);
4216 /* Otherwise, we have a variable expression. */
4217 gcc_assert (array
->expr_type
== EXPR_VARIABLE
);
4220 if (!gfc_resolve_array_spec (as
, 0))
4223 /* The last dimension of an assumed-size array is special. */
4224 if ((!coarray
&& d
== as
->rank
&& as
->type
== AS_ASSUMED_SIZE
&& !upper
)
4225 || (coarray
&& d
== as
->rank
+ as
->corank
4226 && (!upper
|| flag_coarray
== GFC_FCOARRAY_SINGLE
)))
4228 if (as
->lower
[d
-1] && as
->lower
[d
-1]->expr_type
== EXPR_CONSTANT
)
4230 gfc_free_expr (result
);
4231 return gfc_copy_expr (as
->lower
[d
-1]);
4237 /* Then, we need to know the extent of the given dimension. */
4238 if (coarray
|| (ref
->u
.ar
.type
== AR_FULL
&& !ref
->next
))
4240 gfc_expr
*declared_bound
;
4242 bool constant_lbound
, constant_ubound
;
4247 gcc_assert (l
!= NULL
);
4249 constant_lbound
= l
->expr_type
== EXPR_CONSTANT
;
4250 constant_ubound
= u
&& u
->expr_type
== EXPR_CONSTANT
;
4252 empty_bound
= upper
? 0 : 1;
4253 declared_bound
= upper
? u
: l
;
4255 if ((!upper
&& !constant_lbound
)
4256 || (upper
&& !constant_ubound
))
4261 /* For {L,U}BOUND, the value depends on whether the array
4262 is empty. We can nevertheless simplify if the declared bound
4263 has the same value as that of an empty array, in which case
4264 the result isn't dependent on the array emptiness. */
4265 if (mpz_cmp_si (declared_bound
->value
.integer
, empty_bound
) == 0)
4266 mpz_set_si (result
->value
.integer
, empty_bound
);
4267 else if (!constant_lbound
|| !constant_ubound
)
4268 /* Array emptiness can't be determined, we can't simplify. */
4270 else if (mpz_cmp (l
->value
.integer
, u
->value
.integer
) > 0)
4271 mpz_set_si (result
->value
.integer
, empty_bound
);
4273 mpz_set (result
->value
.integer
, declared_bound
->value
.integer
);
4276 mpz_set (result
->value
.integer
, declared_bound
->value
.integer
);
4282 int d2
= 0, cnt
= 0;
4283 for (int idx
= 0; idx
< ref
->u
.ar
.dimen
; ++idx
)
4285 if (ref
->u
.ar
.dimen_type
[idx
] == DIMEN_ELEMENT
)
4287 else if (cnt
< d
- 1)
4292 if (!gfc_ref_dimen_size (&ref
->u
.ar
, d2
+ d
- 1, &result
->value
.integer
, NULL
))
4296 mpz_set_si (result
->value
.integer
, (long int) 1);
4300 return range_check (result
, upper
? "UBOUND" : "LBOUND");
4303 gfc_free_expr (result
);
4309 simplify_bound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
4313 ar_type type
= AR_UNKNOWN
;
4316 if (array
->ts
.type
== BT_CLASS
)
4319 if (array
->expr_type
!= EXPR_VARIABLE
)
4326 /* Do not attempt to resolve if error has already been issued. */
4327 if (array
->symtree
->n
.sym
->error
)
4330 /* Follow any component references. */
4331 as
= array
->symtree
->n
.sym
->as
;
4332 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
4337 type
= ref
->u
.ar
.type
;
4338 switch (ref
->u
.ar
.type
)
4345 /* We're done because 'as' has already been set in the
4346 previous iteration. */
4360 as
= ref
->u
.c
.component
->as
;
4373 if (as
&& (as
->type
== AS_DEFERRED
|| as
->type
== AS_ASSUMED_RANK
4374 || (as
->type
== AS_ASSUMED_SHAPE
&& upper
)))
4377 /* 'array' shall not be an unallocated allocatable variable or a pointer that
4378 is not associated. */
4379 if (array
->expr_type
== EXPR_VARIABLE
4380 && (gfc_expr_attr (array
).allocatable
|| gfc_expr_attr (array
).pointer
))
4384 || (as
->type
!= AS_DEFERRED
4385 && array
->expr_type
== EXPR_VARIABLE
4386 && !gfc_expr_attr (array
).allocatable
4387 && !gfc_expr_attr (array
).pointer
));
4391 /* Multi-dimensional bounds. */
4392 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
4396 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
4397 if (upper
&& type
== AR_FULL
&& as
&& as
->type
== AS_ASSUMED_SIZE
)
4399 /* An error message will be emitted in
4400 check_assumed_size_reference (resolve.cc). */
4401 return &gfc_bad_expr
;
4404 /* Simplify the bounds for each dimension. */
4405 for (d
= 0; d
< array
->rank
; d
++)
4407 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1, upper
, as
, ref
,
4409 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
4413 for (j
= 0; j
< d
; j
++)
4414 gfc_free_expr (bounds
[j
]);
4417 return &gfc_bad_expr
;
4423 /* Allocate the result expression. */
4424 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
4425 gfc_default_integer_kind
);
4427 return &gfc_bad_expr
;
4429 e
= gfc_get_array_expr (BT_INTEGER
, k
, &array
->where
);
4431 /* The result is a rank 1 array; its size is the rank of the first
4432 argument to {L,U}BOUND. */
4434 e
->shape
= gfc_get_shape (1);
4435 mpz_init_set_ui (e
->shape
[0], array
->rank
);
4437 /* Create the constructor for this array. */
4438 for (d
= 0; d
< array
->rank
; d
++)
4439 gfc_constructor_append_expr (&e
->value
.constructor
,
4440 bounds
[d
], &e
->where
);
4446 /* A DIM argument is specified. */
4447 if (dim
->expr_type
!= EXPR_CONSTANT
)
4450 d
= mpz_get_si (dim
->value
.integer
);
4452 if ((d
< 1 || d
> array
->rank
)
4453 || (d
== array
->rank
&& as
&& as
->type
== AS_ASSUMED_SIZE
&& upper
))
4455 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
4456 return &gfc_bad_expr
;
4459 if (as
&& as
->type
== AS_ASSUMED_RANK
)
4462 return simplify_bound_dim (array
, kind
, d
, upper
, as
, ref
, false);
4468 simplify_cobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
4474 if (array
->expr_type
!= EXPR_VARIABLE
)
4477 /* Follow any component references. */
4478 as
= (array
->ts
.type
== BT_CLASS
&& CLASS_DATA (array
))
4479 ? CLASS_DATA (array
)->as
4480 : array
->symtree
->n
.sym
->as
;
4481 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
4486 switch (ref
->u
.ar
.type
)
4489 if (ref
->u
.ar
.as
->corank
> 0)
4491 gcc_assert (as
== ref
->u
.ar
.as
);
4498 /* We're done because 'as' has already been set in the
4499 previous iteration. */
4513 as
= ref
->u
.c
.component
->as
;
4527 if (as
->cotype
== AS_DEFERRED
|| as
->cotype
== AS_ASSUMED_SHAPE
)
4532 /* Multi-dimensional cobounds. */
4533 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
4537 /* Simplify the cobounds for each dimension. */
4538 for (d
= 0; d
< as
->corank
; d
++)
4540 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1 + as
->rank
,
4541 upper
, as
, ref
, true);
4542 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
4546 for (j
= 0; j
< d
; j
++)
4547 gfc_free_expr (bounds
[j
]);
4552 /* Allocate the result expression. */
4553 e
= gfc_get_expr ();
4554 e
->where
= array
->where
;
4555 e
->expr_type
= EXPR_ARRAY
;
4556 e
->ts
.type
= BT_INTEGER
;
4557 k
= get_kind (BT_INTEGER
, kind
, upper
? "UCOBOUND" : "LCOBOUND",
4558 gfc_default_integer_kind
);
4562 return &gfc_bad_expr
;
4566 /* The result is a rank 1 array; its size is the rank of the first
4567 argument to {L,U}COBOUND. */
4569 e
->shape
= gfc_get_shape (1);
4570 mpz_init_set_ui (e
->shape
[0], as
->corank
);
4572 /* Create the constructor for this array. */
4573 for (d
= 0; d
< as
->corank
; d
++)
4574 gfc_constructor_append_expr (&e
->value
.constructor
,
4575 bounds
[d
], &e
->where
);
4580 /* A DIM argument is specified. */
4581 if (dim
->expr_type
!= EXPR_CONSTANT
)
4584 d
= mpz_get_si (dim
->value
.integer
);
4586 if (d
< 1 || d
> as
->corank
)
4588 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
4589 return &gfc_bad_expr
;
4592 return simplify_bound_dim (array
, kind
, d
+as
->rank
, upper
, as
, ref
, true);
4598 gfc_simplify_lbound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
4600 return simplify_bound (array
, dim
, kind
, 0);
4605 gfc_simplify_lcobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
4607 return simplify_cobound (array
, dim
, kind
, 0);
4611 gfc_simplify_leadz (gfc_expr
*e
)
4613 unsigned long lz
, bs
;
4616 if (e
->expr_type
!= EXPR_CONSTANT
)
4619 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4620 bs
= gfc_integer_kinds
[i
].bit_size
;
4621 if (mpz_cmp_si (e
->value
.integer
, 0) == 0)
4623 else if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
4626 lz
= bs
- mpz_sizeinbase (e
->value
.integer
, 2);
4628 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, lz
);
4632 /* Check for constant length of a substring. */
4635 substring_has_constant_len (gfc_expr
*e
)
4638 HOST_WIDE_INT istart
, iend
, length
;
4639 bool equal_length
= false;
4641 if (e
->ts
.type
!= BT_CHARACTER
)
4644 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
4645 if (ref
->type
!= REF_COMPONENT
&& ref
->type
!= REF_ARRAY
)
4649 || ref
->type
!= REF_SUBSTRING
4651 || ref
->u
.ss
.start
->expr_type
!= EXPR_CONSTANT
4653 || ref
->u
.ss
.end
->expr_type
!= EXPR_CONSTANT
)
4656 /* Basic checks on substring starting and ending indices. */
4657 if (!gfc_resolve_substring (ref
, &equal_length
))
4660 istart
= gfc_mpz_get_hwi (ref
->u
.ss
.start
->value
.integer
);
4661 iend
= gfc_mpz_get_hwi (ref
->u
.ss
.end
->value
.integer
);
4664 length
= iend
- istart
+ 1;
4668 /* Fix substring length. */
4669 e
->value
.character
.length
= length
;
4676 gfc_simplify_len (gfc_expr
*e
, gfc_expr
*kind
)
4679 int k
= get_kind (BT_INTEGER
, kind
, "LEN", gfc_default_integer_kind
);
4682 return &gfc_bad_expr
;
4684 if (e
->expr_type
== EXPR_CONSTANT
4685 || substring_has_constant_len (e
))
4687 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &e
->where
);
4688 mpz_set_si (result
->value
.integer
, e
->value
.character
.length
);
4689 return range_check (result
, "LEN");
4691 else if (e
->ts
.u
.cl
!= NULL
&& e
->ts
.u
.cl
->length
!= NULL
4692 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
4693 && e
->ts
.u
.cl
->length
->ts
.type
== BT_INTEGER
)
4695 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &e
->where
);
4696 mpz_set (result
->value
.integer
, e
->ts
.u
.cl
->length
->value
.integer
);
4697 return range_check (result
, "LEN");
4699 else if (e
->expr_type
== EXPR_VARIABLE
&& e
->ts
.type
== BT_CHARACTER
4700 && e
->symtree
->n
.sym
)
4702 if (e
->symtree
->n
.sym
->ts
.type
!= BT_DERIVED
4703 && e
->symtree
->n
.sym
->assoc
&& e
->symtree
->n
.sym
->assoc
->target
4704 && e
->symtree
->n
.sym
->assoc
->target
->ts
.type
== BT_DERIVED
4705 && e
->symtree
->n
.sym
->assoc
->target
->symtree
->n
.sym
4706 && UNLIMITED_POLY (e
->symtree
->n
.sym
->assoc
->target
->symtree
->n
.sym
))
4707 /* The expression in assoc->target points to a ref to the _data
4708 component of the unlimited polymorphic entity. To get the _len
4709 component the last _data ref needs to be stripped and a ref to the
4710 _len component added. */
4711 return gfc_get_len_component (e
->symtree
->n
.sym
->assoc
->target
, k
);
4712 else if (e
->symtree
->n
.sym
->ts
.type
== BT_DERIVED
4713 && e
->ref
&& e
->ref
->type
== REF_COMPONENT
4714 && e
->ref
->u
.c
.component
->attr
.pdt_string
4715 && e
->ref
->u
.c
.component
->ts
.type
== BT_CHARACTER
4716 && e
->ref
->u
.c
.component
->ts
.u
.cl
->length
)
4718 if (gfc_init_expr_flag
)
4721 tmp
= gfc_pdt_find_component_copy_initializer (e
->symtree
->n
.sym
,
4731 gfc_expr
*len_expr
= gfc_copy_expr (e
);
4732 gfc_free_ref_list (len_expr
->ref
);
4733 len_expr
->ref
= NULL
;
4734 gfc_find_component (len_expr
->symtree
->n
.sym
->ts
.u
.derived
, e
->ref
4735 ->u
.c
.component
->ts
.u
.cl
->length
->symtree
4737 false, true, &len_expr
->ref
);
4738 len_expr
->ts
= len_expr
->ref
->u
.c
.component
->ts
;
4748 gfc_simplify_len_trim (gfc_expr
*e
, gfc_expr
*kind
)
4751 size_t count
, len
, i
;
4752 int k
= get_kind (BT_INTEGER
, kind
, "LEN_TRIM", gfc_default_integer_kind
);
4755 return &gfc_bad_expr
;
4757 /* If the expression is either an array element or section, an array
4758 parameter must be built so that the reference can be applied. Constant
4759 references should have already been simplified away. All other cases
4760 can proceed to translation, where kind conversion will occur silently. */
4761 if (e
->expr_type
== EXPR_VARIABLE
4762 && e
->ts
.type
== BT_CHARACTER
4763 && e
->symtree
->n
.sym
->attr
.flavor
== FL_PARAMETER
4764 && e
->ref
&& e
->ref
->type
== REF_ARRAY
4765 && e
->ref
->u
.ar
.type
!= AR_FULL
4766 && e
->symtree
->n
.sym
->value
)
4768 char name
[2*GFC_MAX_SYMBOL_LEN
+ 12];
4769 gfc_namespace
*ns
= e
->symtree
->n
.sym
->ns
;
4776 sprintf (name
, "_len_trim_%s_%s", e
->symtree
->n
.sym
->name
,
4777 ns
->proc_name
->name
);
4778 st
= gfc_find_symtree (ns
->sym_root
, name
);
4782 /* Recursively call this fcn to simplify the constructor elements. */
4783 expr
= gfc_copy_expr (e
->symtree
->n
.sym
->value
);
4784 expr
->ts
.type
= BT_INTEGER
;
4786 expr
->ts
.u
.cl
= NULL
;
4787 c
= gfc_constructor_first (expr
->value
.constructor
);
4788 for (; c
; c
= gfc_constructor_next (c
))
4793 if (c
->expr
&& c
->expr
->ts
.type
== BT_CHARACTER
)
4795 p
= gfc_simplify_len_trim (c
->expr
, kind
);
4798 gfc_replace_expr (c
->expr
, p
);
4805 /* Build a new parameter to take the result. */
4806 st
= gfc_new_symtree (&ns
->sym_root
, name
);
4807 st
->n
.sym
= gfc_new_symbol (st
->name
, ns
);
4808 st
->n
.sym
->value
= expr
;
4809 st
->n
.sym
->ts
= expr
->ts
;
4810 st
->n
.sym
->attr
.dimension
= 1;
4811 st
->n
.sym
->attr
.save
= SAVE_IMPLICIT
;
4812 st
->n
.sym
->attr
.flavor
= FL_PARAMETER
;
4813 st
->n
.sym
->as
= gfc_copy_array_spec (e
->symtree
->n
.sym
->as
);
4814 gfc_set_sym_referenced (st
->n
.sym
);
4816 gfc_commit_symbol (st
->n
.sym
);
4819 /* Build a return expression. */
4820 expr
= gfc_copy_expr (e
);
4821 expr
->ts
= st
->n
.sym
->ts
;
4823 gfc_expression_rank (expr
);
4828 gfc_free_expr (expr
);
4832 if (e
->expr_type
!= EXPR_CONSTANT
)
4835 len
= e
->value
.character
.length
;
4836 for (count
= 0, i
= 1; i
<= len
; i
++)
4837 if (e
->value
.character
.string
[len
- i
] == ' ')
4842 result
= gfc_get_int_expr (k
, &e
->where
, len
- count
);
4843 return range_check (result
, "LEN_TRIM");
4847 gfc_simplify_lgamma (gfc_expr
*x
)
4852 if (x
->expr_type
!= EXPR_CONSTANT
)
4855 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4856 mpfr_lgamma (result
->value
.real
, &sg
, x
->value
.real
, GFC_RND_MODE
);
4858 return range_check (result
, "LGAMMA");
4863 gfc_simplify_lge (gfc_expr
*a
, gfc_expr
*b
)
4865 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4868 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4869 gfc_compare_string (a
, b
) >= 0);
4874 gfc_simplify_lgt (gfc_expr
*a
, gfc_expr
*b
)
4876 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4879 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4880 gfc_compare_string (a
, b
) > 0);
4885 gfc_simplify_lle (gfc_expr
*a
, gfc_expr
*b
)
4887 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4890 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4891 gfc_compare_string (a
, b
) <= 0);
4896 gfc_simplify_llt (gfc_expr
*a
, gfc_expr
*b
)
4898 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4901 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4902 gfc_compare_string (a
, b
) < 0);
4907 gfc_simplify_log (gfc_expr
*x
)
4911 if (x
->expr_type
!= EXPR_CONSTANT
)
4914 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4919 if (mpfr_sgn (x
->value
.real
) <= 0)
4921 gfc_error ("Argument of LOG at %L cannot be less than or equal "
4922 "to zero", &x
->where
);
4923 gfc_free_expr (result
);
4924 return &gfc_bad_expr
;
4927 mpfr_log (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4931 if (mpfr_zero_p (mpc_realref (x
->value
.complex))
4932 && mpfr_zero_p (mpc_imagref (x
->value
.complex)))
4934 gfc_error ("Complex argument of LOG at %L cannot be zero",
4936 gfc_free_expr (result
);
4937 return &gfc_bad_expr
;
4940 gfc_set_model_kind (x
->ts
.kind
);
4941 mpc_log (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
4945 gfc_internal_error ("gfc_simplify_log: bad type");
4948 return range_check (result
, "LOG");
4953 gfc_simplify_log10 (gfc_expr
*x
)
4957 if (x
->expr_type
!= EXPR_CONSTANT
)
4960 if (mpfr_sgn (x
->value
.real
) <= 0)
4962 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
4963 "to zero", &x
->where
);
4964 return &gfc_bad_expr
;
4967 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4968 mpfr_log10 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4970 return range_check (result
, "LOG10");
4975 gfc_simplify_logical (gfc_expr
*e
, gfc_expr
*k
)
4979 kind
= get_kind (BT_LOGICAL
, k
, "LOGICAL", gfc_default_logical_kind
);
4981 return &gfc_bad_expr
;
4983 if (e
->expr_type
!= EXPR_CONSTANT
)
4986 return gfc_get_logical_expr (kind
, &e
->where
, e
->value
.logical
);
4991 gfc_simplify_matmul (gfc_expr
*matrix_a
, gfc_expr
*matrix_b
)
4994 int row
, result_rows
, col
, result_columns
;
4995 int stride_a
, offset_a
, stride_b
, offset_b
;
4997 if (!is_constant_array_expr (matrix_a
)
4998 || !is_constant_array_expr (matrix_b
))
5001 /* MATMUL should do mixed-mode arithmetic. Set the result type. */
5002 if (matrix_a
->ts
.type
!= matrix_b
->ts
.type
)
5005 e
.expr_type
= EXPR_OP
;
5006 gfc_clear_ts (&e
.ts
);
5007 e
.value
.op
.op
= INTRINSIC_NONE
;
5008 e
.value
.op
.op1
= matrix_a
;
5009 e
.value
.op
.op2
= matrix_b
;
5010 gfc_type_convert_binary (&e
, 1);
5011 result
= gfc_get_array_expr (e
.ts
.type
, e
.ts
.kind
, &matrix_a
->where
);
5015 result
= gfc_get_array_expr (matrix_a
->ts
.type
, matrix_a
->ts
.kind
,
5019 if (matrix_a
->rank
== 1 && matrix_b
->rank
== 2)
5022 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
5024 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
5027 result
->shape
= gfc_get_shape (result
->rank
);
5028 mpz_init_set_si (result
->shape
[0], result_columns
);
5030 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 1)
5032 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
5034 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
5038 result
->shape
= gfc_get_shape (result
->rank
);
5039 mpz_init_set_si (result
->shape
[0], result_rows
);
5041 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 2)
5043 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
5044 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
5045 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
5046 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
5049 result
->shape
= gfc_get_shape (result
->rank
);
5050 mpz_init_set_si (result
->shape
[0], result_rows
);
5051 mpz_init_set_si (result
->shape
[1], result_columns
);
5057 for (col
= 0; col
< result_columns
; ++col
)
5061 for (row
= 0; row
< result_rows
; ++row
)
5063 gfc_expr
*e
= compute_dot_product (matrix_a
, stride_a
, offset_a
,
5064 matrix_b
, 1, offset_b
, false);
5065 gfc_constructor_append_expr (&result
->value
.constructor
,
5071 offset_b
+= stride_b
;
5079 gfc_simplify_maskr (gfc_expr
*i
, gfc_expr
*kind_arg
)
5084 if (i
->expr_type
!= EXPR_CONSTANT
)
5087 kind
= get_kind (BT_INTEGER
, kind_arg
, "MASKR", gfc_default_integer_kind
);
5089 return &gfc_bad_expr
;
5090 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
5092 bool fail
= gfc_extract_int (i
, &arg
);
5095 if (!gfc_check_mask (i
, kind_arg
))
5096 return &gfc_bad_expr
;
5098 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &i
->where
);
5100 /* MASKR(n) = 2^n - 1 */
5101 mpz_set_ui (result
->value
.integer
, 1);
5102 mpz_mul_2exp (result
->value
.integer
, result
->value
.integer
, arg
);
5103 mpz_sub_ui (result
->value
.integer
, result
->value
.integer
, 1);
5105 gfc_convert_mpz_to_signed (result
->value
.integer
, gfc_integer_kinds
[k
].bit_size
);
5112 gfc_simplify_maskl (gfc_expr
*i
, gfc_expr
*kind_arg
)
5118 if (i
->expr_type
!= EXPR_CONSTANT
)
5121 kind
= get_kind (BT_INTEGER
, kind_arg
, "MASKL", gfc_default_integer_kind
);
5123 return &gfc_bad_expr
;
5124 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
5126 bool fail
= gfc_extract_int (i
, &arg
);
5129 if (!gfc_check_mask (i
, kind_arg
))
5130 return &gfc_bad_expr
;
5132 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &i
->where
);
5134 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
5135 mpz_init_set_ui (z
, 1);
5136 mpz_mul_2exp (z
, z
, gfc_integer_kinds
[k
].bit_size
);
5137 mpz_set_ui (result
->value
.integer
, 1);
5138 mpz_mul_2exp (result
->value
.integer
, result
->value
.integer
,
5139 gfc_integer_kinds
[k
].bit_size
- arg
);
5140 mpz_sub (result
->value
.integer
, z
, result
->value
.integer
);
5143 gfc_convert_mpz_to_signed (result
->value
.integer
, gfc_integer_kinds
[k
].bit_size
);
5150 gfc_simplify_merge (gfc_expr
*tsource
, gfc_expr
*fsource
, gfc_expr
*mask
)
5153 gfc_constructor
*tsource_ctor
, *fsource_ctor
, *mask_ctor
;
5155 if (mask
->expr_type
== EXPR_CONSTANT
)
5157 /* The standard requires evaluation of all function arguments.
5158 Simplify only when the other dropped argument (FSOURCE or TSOURCE)
5159 is a constant expression. */
5160 if (mask
->value
.logical
)
5162 if (!gfc_is_constant_expr (fsource
))
5164 result
= gfc_copy_expr (tsource
);
5168 if (!gfc_is_constant_expr (tsource
))
5170 result
= gfc_copy_expr (fsource
);
5173 /* Parenthesis is needed to get lower bounds of 1. */
5174 result
= gfc_get_parentheses (result
);
5175 gfc_simplify_expr (result
, 1);
5179 if (!mask
->rank
|| !is_constant_array_expr (mask
)
5180 || !is_constant_array_expr (tsource
) || !is_constant_array_expr (fsource
))
5183 result
= gfc_get_array_expr (tsource
->ts
.type
, tsource
->ts
.kind
,
5185 if (tsource
->ts
.type
== BT_DERIVED
)
5186 result
->ts
.u
.derived
= tsource
->ts
.u
.derived
;
5187 else if (tsource
->ts
.type
== BT_CHARACTER
)
5188 result
->ts
.u
.cl
= tsource
->ts
.u
.cl
;
5190 tsource_ctor
= gfc_constructor_first (tsource
->value
.constructor
);
5191 fsource_ctor
= gfc_constructor_first (fsource
->value
.constructor
);
5192 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
5196 if (mask_ctor
->expr
->value
.logical
)
5197 gfc_constructor_append_expr (&result
->value
.constructor
,
5198 gfc_copy_expr (tsource_ctor
->expr
),
5201 gfc_constructor_append_expr (&result
->value
.constructor
,
5202 gfc_copy_expr (fsource_ctor
->expr
),
5204 tsource_ctor
= gfc_constructor_next (tsource_ctor
);
5205 fsource_ctor
= gfc_constructor_next (fsource_ctor
);
5206 mask_ctor
= gfc_constructor_next (mask_ctor
);
5209 result
->shape
= gfc_get_shape (1);
5210 gfc_array_size (result
, &result
->shape
[0]);
5217 gfc_simplify_merge_bits (gfc_expr
*i
, gfc_expr
*j
, gfc_expr
*mask_expr
)
5219 mpz_t arg1
, arg2
, mask
;
5222 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
5223 || mask_expr
->expr_type
!= EXPR_CONSTANT
)
5226 result
= gfc_get_constant_expr (i
->ts
.type
, i
->ts
.kind
, &i
->where
);
5228 /* Convert all argument to unsigned. */
5229 mpz_init_set (arg1
, i
->value
.integer
);
5230 mpz_init_set (arg2
, j
->value
.integer
);
5231 mpz_init_set (mask
, mask_expr
->value
.integer
);
5233 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
5234 mpz_and (arg1
, arg1
, mask
);
5235 mpz_com (mask
, mask
);
5236 mpz_and (arg2
, arg2
, mask
);
5237 mpz_ior (result
->value
.integer
, arg1
, arg2
);
5247 /* Selects between current value and extremum for simplify_min_max
5248 and simplify_minval_maxval. */
5250 min_max_choose (gfc_expr
*arg
, gfc_expr
*extremum
, int sign
, bool back_val
)
5254 switch (arg
->ts
.type
)
5258 if (extremum
->ts
.kind
< arg
->ts
.kind
)
5259 extremum
->ts
.kind
= arg
->ts
.kind
;
5260 ret
= mpz_cmp (arg
->value
.integer
,
5261 extremum
->value
.integer
) * sign
;
5263 mpz_set (extremum
->value
.integer
, arg
->value
.integer
);
5267 if (extremum
->ts
.kind
< arg
->ts
.kind
)
5268 extremum
->ts
.kind
= arg
->ts
.kind
;
5269 if (mpfr_nan_p (extremum
->value
.real
))
5272 mpfr_set (extremum
->value
.real
, arg
->value
.real
, GFC_RND_MODE
);
5274 else if (mpfr_nan_p (arg
->value
.real
))
5278 ret
= mpfr_cmp (arg
->value
.real
, extremum
->value
.real
) * sign
;
5280 mpfr_set (extremum
->value
.real
, arg
->value
.real
, GFC_RND_MODE
);
5285 #define LENGTH(x) ((x)->value.character.length)
5286 #define STRING(x) ((x)->value.character.string)
5287 if (LENGTH (extremum
) < LENGTH(arg
))
5289 gfc_char_t
*tmp
= STRING(extremum
);
5291 STRING(extremum
) = gfc_get_wide_string (LENGTH(arg
) + 1);
5292 memcpy (STRING(extremum
), tmp
,
5293 LENGTH(extremum
) * sizeof (gfc_char_t
));
5294 gfc_wide_memset (&STRING(extremum
)[LENGTH(extremum
)], ' ',
5295 LENGTH(arg
) - LENGTH(extremum
));
5296 STRING(extremum
)[LENGTH(arg
)] = '\0'; /* For debugger */
5297 LENGTH(extremum
) = LENGTH(arg
);
5300 ret
= gfc_compare_string (arg
, extremum
) * sign
;
5303 free (STRING(extremum
));
5304 STRING(extremum
) = gfc_get_wide_string (LENGTH(extremum
) + 1);
5305 memcpy (STRING(extremum
), STRING(arg
),
5306 LENGTH(arg
) * sizeof (gfc_char_t
));
5307 gfc_wide_memset (&STRING(extremum
)[LENGTH(arg
)], ' ',
5308 LENGTH(extremum
) - LENGTH(arg
));
5309 STRING(extremum
)[LENGTH(extremum
)] = '\0'; /* For debugger */
5316 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
5318 if (back_val
&& ret
== 0)
5325 /* This function is special since MAX() can take any number of
5326 arguments. The simplified expression is a rewritten version of the
5327 argument list containing at most one constant element. Other
5328 constant elements are deleted. Because the argument list has
5329 already been checked, this function always succeeds. sign is 1 for
5330 MAX(), -1 for MIN(). */
5333 simplify_min_max (gfc_expr
*expr
, int sign
)
5336 gfc_actual_arglist
*arg
, *last
, *extremum
;
5337 gfc_expr
*tmp
, *ret
;
5343 arg
= expr
->value
.function
.actual
;
5345 for (; arg
; last
= arg
, arg
= arg
->next
)
5347 if (arg
->expr
->expr_type
!= EXPR_CONSTANT
)
5350 if (extremum
== NULL
)
5356 min_max_choose (arg
->expr
, extremum
->expr
, sign
);
5358 /* Delete the extra constant argument. */
5359 last
->next
= arg
->next
;
5362 gfc_free_actual_arglist (arg
);
5366 /* If there is one value left, replace the function call with the
5368 if (expr
->value
.function
.actual
->next
!= NULL
)
5371 /* Handle special cases of specific functions (min|max)1 and
5374 tmp
= expr
->value
.function
.actual
->expr
;
5375 fname
= expr
->value
.function
.isym
->name
;
5377 if ((tmp
->ts
.type
!= BT_INTEGER
|| tmp
->ts
.kind
!= gfc_integer_4_kind
)
5378 && (strcmp (fname
, "min1") == 0 || strcmp (fname
, "max1") == 0))
5380 /* Explicit conversion, turn off -Wconversion and -Wconversion-extra
5382 tmp1
= warn_conversion
;
5383 tmp2
= warn_conversion_extra
;
5384 warn_conversion
= warn_conversion_extra
= 0;
5386 ret
= gfc_convert_constant (tmp
, BT_INTEGER
, gfc_integer_4_kind
);
5388 warn_conversion
= tmp1
;
5389 warn_conversion_extra
= tmp2
;
5391 else if ((tmp
->ts
.type
!= BT_REAL
|| tmp
->ts
.kind
!= gfc_real_4_kind
)
5392 && (strcmp (fname
, "amin0") == 0 || strcmp (fname
, "amax0") == 0))
5394 ret
= gfc_convert_constant (tmp
, BT_REAL
, gfc_real_4_kind
);
5397 ret
= gfc_copy_expr (tmp
);
5405 gfc_simplify_min (gfc_expr
*e
)
5407 return simplify_min_max (e
, -1);
5412 gfc_simplify_max (gfc_expr
*e
)
5414 return simplify_min_max (e
, 1);
5417 /* Helper function for gfc_simplify_minval. */
5420 gfc_min (gfc_expr
*op1
, gfc_expr
*op2
)
5422 min_max_choose (op1
, op2
, -1);
5423 gfc_free_expr (op1
);
5427 /* Simplify minval for constant arrays. */
5430 gfc_simplify_minval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
5432 return simplify_transformation (array
, dim
, mask
, INT_MAX
, gfc_min
);
5435 /* Helper function for gfc_simplify_maxval. */
5438 gfc_max (gfc_expr
*op1
, gfc_expr
*op2
)
5440 min_max_choose (op1
, op2
, 1);
5441 gfc_free_expr (op1
);
5446 /* Simplify maxval for constant arrays. */
5449 gfc_simplify_maxval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
5451 return simplify_transformation (array
, dim
, mask
, INT_MIN
, gfc_max
);
5455 /* Transform minloc or maxloc of an array, according to MASK,
5456 to the scalar result. This code is mostly identical to
5457 simplify_transformation_to_scalar. */
5460 simplify_minmaxloc_to_scalar (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*mask
,
5461 gfc_expr
*extremum
, int sign
, bool back_val
)
5464 gfc_constructor
*array_ctor
, *mask_ctor
;
5467 mpz_set_si (result
->value
.integer
, 0);
5470 /* Shortcut for constant .FALSE. MASK. */
5472 && mask
->expr_type
== EXPR_CONSTANT
5473 && !mask
->value
.logical
)
5476 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
5477 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
5478 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
5482 mpz_init_set_si (count
, 0);
5485 mpz_add_ui (count
, count
, 1);
5486 a
= array_ctor
->expr
;
5487 array_ctor
= gfc_constructor_next (array_ctor
);
5488 /* A constant MASK equals .TRUE. here and can be ignored. */
5491 m
= mask_ctor
->expr
;
5492 mask_ctor
= gfc_constructor_next (mask_ctor
);
5493 if (!m
->value
.logical
)
5496 if (min_max_choose (a
, extremum
, sign
, back_val
) > 0)
5497 mpz_set (result
->value
.integer
, count
);
5500 gfc_free_expr (extremum
);
5504 /* Simplify minloc / maxloc in the absence of a dim argument. */
5507 simplify_minmaxloc_nodim (gfc_expr
*result
, gfc_expr
*extremum
,
5508 gfc_expr
*array
, gfc_expr
*mask
, int sign
,
5511 ssize_t res
[GFC_MAX_DIMENSIONS
];
5513 gfc_constructor
*result_ctor
, *array_ctor
, *mask_ctor
;
5514 ssize_t count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
5515 sstride
[GFC_MAX_DIMENSIONS
];
5520 for (i
= 0; i
<array
->rank
; i
++)
5523 /* Shortcut for constant .FALSE. MASK. */
5525 && mask
->expr_type
== EXPR_CONSTANT
5526 && !mask
->value
.logical
)
5529 if (array
->shape
== NULL
)
5532 for (i
= 0; i
< array
->rank
; i
++)
5535 sstride
[i
] = (i
== 0) ? 1 : sstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
5536 extent
[i
] = mpz_get_si (array
->shape
[i
]);
5541 continue_loop
= true;
5542 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
5543 if (mask
&& mask
->rank
> 0)
5544 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
5548 /* Loop over the array elements (and mask), keeping track of
5549 the indices to return. */
5550 while (continue_loop
)
5554 a
= array_ctor
->expr
;
5557 m
= mask_ctor
->expr
;
5558 ma
= m
->value
.logical
;
5559 mask_ctor
= gfc_constructor_next (mask_ctor
);
5564 if (ma
&& min_max_choose (a
, extremum
, sign
, back_val
) > 0)
5566 for (i
= 0; i
<array
->rank
; i
++)
5569 array_ctor
= gfc_constructor_next (array_ctor
);
5571 } while (count
[0] != extent
[0]);
5575 /* When we get to the end of a dimension, reset it and increment
5576 the next dimension. */
5579 if (n
>= array
->rank
)
5581 continue_loop
= false;
5586 } while (count
[n
] == extent
[n
]);
5590 gfc_free_expr (extremum
);
5591 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
5592 for (i
= 0; i
<array
->rank
; i
++)
5595 r_expr
= result_ctor
->expr
;
5596 mpz_set_si (r_expr
->value
.integer
, res
[i
] + 1);
5597 result_ctor
= gfc_constructor_next (result_ctor
);
5602 /* Helper function for gfc_simplify_minmaxloc - build an array
5603 expression with n elements. */
5606 new_array (bt type
, int kind
, int n
, locus
*where
)
5611 result
= gfc_get_array_expr (type
, kind
, where
);
5613 result
->shape
= gfc_get_shape(1);
5614 mpz_init_set_si (result
->shape
[0], n
);
5615 for (i
= 0; i
< n
; i
++)
5617 gfc_constructor_append_expr (&result
->value
.constructor
,
5618 gfc_get_constant_expr (type
, kind
, where
),
5625 /* Simplify minloc and maxloc. This code is mostly identical to
5626 simplify_transformation_to_array. */
5629 simplify_minmaxloc_to_array (gfc_expr
*result
, gfc_expr
*array
,
5630 gfc_expr
*dim
, gfc_expr
*mask
,
5631 gfc_expr
*extremum
, int sign
, bool back_val
)
5634 int done
, i
, n
, arraysize
, resultsize
, dim_index
, dim_extent
, dim_stride
;
5635 gfc_expr
**arrayvec
, **resultvec
, **base
, **src
, **dest
;
5636 gfc_constructor
*array_ctor
, *mask_ctor
, *result_ctor
;
5638 int count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
5639 sstride
[GFC_MAX_DIMENSIONS
], dstride
[GFC_MAX_DIMENSIONS
],
5640 tmpstride
[GFC_MAX_DIMENSIONS
];
5642 /* Shortcut for constant .FALSE. MASK. */
5644 && mask
->expr_type
== EXPR_CONSTANT
5645 && !mask
->value
.logical
)
5648 /* Build an indexed table for array element expressions to minimize
5649 linked-list traversal. Masked elements are set to NULL. */
5650 gfc_array_size (array
, &size
);
5651 arraysize
= mpz_get_ui (size
);
5654 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
5656 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
5658 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
5659 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
5661 for (i
= 0; i
< arraysize
; ++i
)
5663 arrayvec
[i
] = array_ctor
->expr
;
5664 array_ctor
= gfc_constructor_next (array_ctor
);
5668 if (!mask_ctor
->expr
->value
.logical
)
5671 mask_ctor
= gfc_constructor_next (mask_ctor
);
5675 /* Same for the result expression. */
5676 gfc_array_size (result
, &size
);
5677 resultsize
= mpz_get_ui (size
);
5680 resultvec
= XCNEWVEC (gfc_expr
*, resultsize
);
5681 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
5682 for (i
= 0; i
< resultsize
; ++i
)
5684 resultvec
[i
] = result_ctor
->expr
;
5685 result_ctor
= gfc_constructor_next (result_ctor
);
5688 gfc_extract_int (dim
, &dim_index
);
5689 dim_index
-= 1; /* zero-base index */
5693 for (i
= 0, n
= 0; i
< array
->rank
; ++i
)
5696 tmpstride
[i
] = (i
== 0) ? 1 : tmpstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
5699 dim_extent
= mpz_get_si (array
->shape
[i
]);
5700 dim_stride
= tmpstride
[i
];
5704 extent
[n
] = mpz_get_si (array
->shape
[i
]);
5705 sstride
[n
] = tmpstride
[i
];
5706 dstride
[n
] = (n
== 0) ? 1 : dstride
[n
-1] * extent
[n
-1];
5710 done
= resultsize
<= 0;
5716 ex
= gfc_copy_expr (extremum
);
5717 for (src
= base
, n
= 0; n
< dim_extent
; src
+= dim_stride
, ++n
)
5719 if (*src
&& min_max_choose (*src
, ex
, sign
, back_val
) > 0)
5720 mpz_set_si ((*dest
)->value
.integer
, n
+ 1);
5729 while (!done
&& count
[n
] == extent
[n
])
5732 base
-= sstride
[n
] * extent
[n
];
5733 dest
-= dstride
[n
] * extent
[n
];
5736 if (n
< result
->rank
)
5738 /* If the nested loop is unrolled GFC_MAX_DIMENSIONS
5739 times, we'd warn for the last iteration, because the
5740 array index will have already been incremented to the
5741 array sizes, and we can't tell that this must make
5742 the test against result->rank false, because ranks
5743 must not exceed GFC_MAX_DIMENSIONS. */
5744 GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray
-bounds
)
5755 /* Place updated expression in result constructor. */
5756 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
5757 for (i
= 0; i
< resultsize
; ++i
)
5759 result_ctor
->expr
= resultvec
[i
];
5760 result_ctor
= gfc_constructor_next (result_ctor
);
5769 /* Simplify minloc and maxloc for constant arrays. */
5772 gfc_simplify_minmaxloc (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
,
5773 gfc_expr
*kind
, gfc_expr
*back
, int sign
)
5779 bool back_val
= false;
5781 if (!is_constant_array_expr (array
)
5782 || !gfc_is_constant_expr (dim
))
5786 && !is_constant_array_expr (mask
)
5787 && mask
->expr_type
!= EXPR_CONSTANT
)
5792 if (gfc_extract_int (kind
, &ikind
, -1))
5796 ikind
= gfc_default_integer_kind
;
5800 if (back
->expr_type
!= EXPR_CONSTANT
)
5803 back_val
= back
->value
.logical
;
5813 extremum
= gfc_get_constant_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
5814 init_result_expr (extremum
, init_val
, array
);
5818 result
= transformational_result (array
, dim
, BT_INTEGER
,
5819 ikind
, &array
->where
);
5820 init_result_expr (result
, 0, array
);
5822 if (array
->rank
== 1)
5823 return simplify_minmaxloc_to_scalar (result
, array
, mask
, extremum
,
5826 return simplify_minmaxloc_to_array (result
, array
, dim
, mask
, extremum
,
5831 result
= new_array (BT_INTEGER
, ikind
, array
->rank
, &array
->where
);
5832 return simplify_minmaxloc_nodim (result
, extremum
, array
, mask
,
5838 gfc_simplify_minloc (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
, gfc_expr
*kind
,
5841 return gfc_simplify_minmaxloc (array
, dim
, mask
, kind
, back
, -1);
5845 gfc_simplify_maxloc (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
, gfc_expr
*kind
,
5848 return gfc_simplify_minmaxloc (array
, dim
, mask
, kind
, back
, 1);
5851 /* Simplify findloc to scalar. Similar to
5852 simplify_minmaxloc_to_scalar. */
5855 simplify_findloc_to_scalar (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*value
,
5856 gfc_expr
*mask
, int back_val
)
5859 gfc_constructor
*array_ctor
, *mask_ctor
;
5862 mpz_set_si (result
->value
.integer
, 0);
5864 /* Shortcut for constant .FALSE. MASK. */
5866 && mask
->expr_type
== EXPR_CONSTANT
5867 && !mask
->value
.logical
)
5870 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
5871 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
5872 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
5876 mpz_init_set_si (count
, 0);
5879 mpz_add_ui (count
, count
, 1);
5880 a
= array_ctor
->expr
;
5881 array_ctor
= gfc_constructor_next (array_ctor
);
5882 /* A constant MASK equals .TRUE. here and can be ignored. */
5885 m
= mask_ctor
->expr
;
5886 mask_ctor
= gfc_constructor_next (mask_ctor
);
5887 if (!m
->value
.logical
)
5890 if (gfc_compare_expr (a
, value
, INTRINSIC_EQ
) == 0)
5892 /* We have a match. If BACK is true, continue so we find
5894 mpz_set (result
->value
.integer
, count
);
5903 /* Simplify findloc in the absence of a dim argument. Similar to
5904 simplify_minmaxloc_nodim. */
5907 simplify_findloc_nodim (gfc_expr
*result
, gfc_expr
*value
, gfc_expr
*array
,
5908 gfc_expr
*mask
, bool back_val
)
5910 ssize_t res
[GFC_MAX_DIMENSIONS
];
5912 gfc_constructor
*result_ctor
, *array_ctor
, *mask_ctor
;
5913 ssize_t count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
5914 sstride
[GFC_MAX_DIMENSIONS
];
5919 for (i
= 0; i
< array
->rank
; i
++)
5922 /* Shortcut for constant .FALSE. MASK. */
5924 && mask
->expr_type
== EXPR_CONSTANT
5925 && !mask
->value
.logical
)
5928 for (i
= 0; i
< array
->rank
; i
++)
5931 sstride
[i
] = (i
== 0) ? 1 : sstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
5932 extent
[i
] = mpz_get_si (array
->shape
[i
]);
5937 continue_loop
= true;
5938 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
5939 if (mask
&& mask
->rank
> 0)
5940 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
5944 /* Loop over the array elements (and mask), keeping track of
5945 the indices to return. */
5946 while (continue_loop
)
5950 a
= array_ctor
->expr
;
5953 m
= mask_ctor
->expr
;
5954 ma
= m
->value
.logical
;
5955 mask_ctor
= gfc_constructor_next (mask_ctor
);
5960 if (ma
&& gfc_compare_expr (a
, value
, INTRINSIC_EQ
) == 0)
5962 for (i
= 0; i
< array
->rank
; i
++)
5967 array_ctor
= gfc_constructor_next (array_ctor
);
5969 } while (count
[0] != extent
[0]);
5973 /* When we get to the end of a dimension, reset it and increment
5974 the next dimension. */
5977 if (n
>= array
->rank
)
5979 continue_loop
= false;
5984 } while (count
[n
] == extent
[n
]);
5988 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
5989 for (i
= 0; i
< array
->rank
; i
++)
5992 r_expr
= result_ctor
->expr
;
5993 mpz_set_si (r_expr
->value
.integer
, res
[i
] + 1);
5994 result_ctor
= gfc_constructor_next (result_ctor
);
6000 /* Simplify findloc to an array. Similar to
6001 simplify_minmaxloc_to_array. */
6004 simplify_findloc_to_array (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*value
,
6005 gfc_expr
*dim
, gfc_expr
*mask
, bool back_val
)
6008 int done
, i
, n
, arraysize
, resultsize
, dim_index
, dim_extent
, dim_stride
;
6009 gfc_expr
**arrayvec
, **resultvec
, **base
, **src
, **dest
;
6010 gfc_constructor
*array_ctor
, *mask_ctor
, *result_ctor
;
6012 int count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
6013 sstride
[GFC_MAX_DIMENSIONS
], dstride
[GFC_MAX_DIMENSIONS
],
6014 tmpstride
[GFC_MAX_DIMENSIONS
];
6016 /* Shortcut for constant .FALSE. MASK. */
6018 && mask
->expr_type
== EXPR_CONSTANT
6019 && !mask
->value
.logical
)
6022 /* Build an indexed table for array element expressions to minimize
6023 linked-list traversal. Masked elements are set to NULL. */
6024 gfc_array_size (array
, &size
);
6025 arraysize
= mpz_get_ui (size
);
6028 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
6030 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
6032 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
6033 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
6035 for (i
= 0; i
< arraysize
; ++i
)
6037 arrayvec
[i
] = array_ctor
->expr
;
6038 array_ctor
= gfc_constructor_next (array_ctor
);
6042 if (!mask_ctor
->expr
->value
.logical
)
6045 mask_ctor
= gfc_constructor_next (mask_ctor
);
6049 /* Same for the result expression. */
6050 gfc_array_size (result
, &size
);
6051 resultsize
= mpz_get_ui (size
);
6054 resultvec
= XCNEWVEC (gfc_expr
*, resultsize
);
6055 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
6056 for (i
= 0; i
< resultsize
; ++i
)
6058 resultvec
[i
] = result_ctor
->expr
;
6059 result_ctor
= gfc_constructor_next (result_ctor
);
6062 gfc_extract_int (dim
, &dim_index
);
6064 dim_index
-= 1; /* Zero-base index. */
6068 for (i
= 0, n
= 0; i
< array
->rank
; ++i
)
6071 tmpstride
[i
] = (i
== 0) ? 1 : tmpstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
6074 dim_extent
= mpz_get_si (array
->shape
[i
]);
6075 dim_stride
= tmpstride
[i
];
6079 extent
[n
] = mpz_get_si (array
->shape
[i
]);
6080 sstride
[n
] = tmpstride
[i
];
6081 dstride
[n
] = (n
== 0) ? 1 : dstride
[n
-1] * extent
[n
-1];
6085 done
= resultsize
<= 0;
6090 for (src
= base
, n
= 0; n
< dim_extent
; src
+= dim_stride
, ++n
)
6092 if (*src
&& gfc_compare_expr (*src
, value
, INTRINSIC_EQ
) == 0)
6094 mpz_set_si ((*dest
)->value
.integer
, n
+ 1);
6105 while (!done
&& count
[n
] == extent
[n
])
6108 base
-= sstride
[n
] * extent
[n
];
6109 dest
-= dstride
[n
] * extent
[n
];
6112 if (n
< result
->rank
)
6114 /* If the nested loop is unrolled GFC_MAX_DIMENSIONS
6115 times, we'd warn for the last iteration, because the
6116 array index will have already been incremented to the
6117 array sizes, and we can't tell that this must make
6118 the test against result->rank false, because ranks
6119 must not exceed GFC_MAX_DIMENSIONS. */
6120 GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray
-bounds
)
6131 /* Place updated expression in result constructor. */
6132 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
6133 for (i
= 0; i
< resultsize
; ++i
)
6135 result_ctor
->expr
= resultvec
[i
];
6136 result_ctor
= gfc_constructor_next (result_ctor
);
6144 /* Simplify findloc. */
6147 gfc_simplify_findloc (gfc_expr
*array
, gfc_expr
*value
, gfc_expr
*dim
,
6148 gfc_expr
*mask
, gfc_expr
*kind
, gfc_expr
*back
)
6152 bool back_val
= false;
6154 if (!is_constant_array_expr (array
)
6155 || array
->shape
== NULL
6156 || !gfc_is_constant_expr (dim
))
6159 if (! gfc_is_constant_expr (value
))
6163 && !is_constant_array_expr (mask
)
6164 && mask
->expr_type
!= EXPR_CONSTANT
)
6169 if (gfc_extract_int (kind
, &ikind
, -1))
6173 ikind
= gfc_default_integer_kind
;
6177 if (back
->expr_type
!= EXPR_CONSTANT
)
6180 back_val
= back
->value
.logical
;
6185 result
= transformational_result (array
, dim
, BT_INTEGER
,
6186 ikind
, &array
->where
);
6187 init_result_expr (result
, 0, array
);
6189 if (array
->rank
== 1)
6190 return simplify_findloc_to_scalar (result
, array
, value
, mask
,
6193 return simplify_findloc_to_array (result
, array
, value
, dim
, mask
,
6198 result
= new_array (BT_INTEGER
, ikind
, array
->rank
, &array
->where
);
6199 return simplify_findloc_nodim (result
, value
, array
, mask
, back_val
);
6205 gfc_simplify_maxexponent (gfc_expr
*x
)
6207 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
6208 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
6209 gfc_real_kinds
[i
].max_exponent
);
6214 gfc_simplify_minexponent (gfc_expr
*x
)
6216 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
6217 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
6218 gfc_real_kinds
[i
].min_exponent
);
6223 gfc_simplify_mod (gfc_expr
*a
, gfc_expr
*p
)
6228 /* First check p. */
6229 if (p
->expr_type
!= EXPR_CONSTANT
)
6232 /* p shall not be 0. */
6237 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
6239 gfc_error ("Argument %qs of MOD at %L shall not be zero",
6241 return &gfc_bad_expr
;
6245 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
6247 gfc_error ("Argument %qs of MOD at %L shall not be zero",
6249 return &gfc_bad_expr
;
6253 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
6256 if (a
->expr_type
!= EXPR_CONSTANT
)
6259 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
6260 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
6262 if (a
->ts
.type
== BT_INTEGER
|| a
->ts
.type
== BT_UNSIGNED
)
6263 mpz_tdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
6266 gfc_set_model_kind (kind
);
6267 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
6271 return range_check (result
, "MOD");
6276 gfc_simplify_modulo (gfc_expr
*a
, gfc_expr
*p
)
6281 /* First check p. */
6282 if (p
->expr_type
!= EXPR_CONSTANT
)
6285 /* p shall not be 0. */
6290 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
6292 gfc_error ("Argument %qs of MODULO at %L shall not be zero",
6294 return &gfc_bad_expr
;
6298 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
6300 gfc_error ("Argument %qs of MODULO at %L shall not be zero",
6302 return &gfc_bad_expr
;
6306 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
6309 if (a
->expr_type
!= EXPR_CONSTANT
)
6312 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
6313 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
6315 if (a
->ts
.type
== BT_INTEGER
|| a
->ts
.type
== BT_UNSIGNED
)
6316 mpz_fdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
6319 gfc_set_model_kind (kind
);
6320 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
6322 if (mpfr_cmp_ui (result
->value
.real
, 0) != 0)
6324 if (mpfr_signbit (a
->value
.real
) != mpfr_signbit (p
->value
.real
))
6325 mpfr_add (result
->value
.real
, result
->value
.real
, p
->value
.real
,
6329 mpfr_copysign (result
->value
.real
, result
->value
.real
,
6330 p
->value
.real
, GFC_RND_MODE
);
6333 return range_check (result
, "MODULO");
6338 gfc_simplify_nearest (gfc_expr
*x
, gfc_expr
*s
)
6341 mpfr_exp_t emin
, emax
;
6344 if (x
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
6347 result
= gfc_copy_expr (x
);
6349 /* Save current values of emin and emax. */
6350 emin
= mpfr_get_emin ();
6351 emax
= mpfr_get_emax ();
6353 /* Set emin and emax for the current model number. */
6354 kind
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, 0);
6355 mpfr_set_emin ((mpfr_exp_t
) gfc_real_kinds
[kind
].min_exponent
-
6356 mpfr_get_prec(result
->value
.real
) + 1);
6357 mpfr_set_emax ((mpfr_exp_t
) gfc_real_kinds
[kind
].max_exponent
);
6358 mpfr_check_range (result
->value
.real
, 0, MPFR_RNDU
);
6360 if (mpfr_sgn (s
->value
.real
) > 0)
6362 mpfr_nextabove (result
->value
.real
);
6363 mpfr_subnormalize (result
->value
.real
, 0, MPFR_RNDU
);
6367 mpfr_nextbelow (result
->value
.real
);
6368 mpfr_subnormalize (result
->value
.real
, 0, MPFR_RNDD
);
6371 mpfr_set_emin (emin
);
6372 mpfr_set_emax (emax
);
6374 /* Only NaN can occur. Do not use range check as it gives an
6375 error for denormal numbers. */
6376 if (mpfr_nan_p (result
->value
.real
) && flag_range_check
)
6378 gfc_error ("Result of NEAREST is NaN at %L", &result
->where
);
6379 gfc_free_expr (result
);
6380 return &gfc_bad_expr
;
6388 simplify_nint (const char *name
, gfc_expr
*e
, gfc_expr
*k
)
6390 gfc_expr
*itrunc
, *result
;
6393 kind
= get_kind (BT_INTEGER
, k
, name
, gfc_default_integer_kind
);
6395 return &gfc_bad_expr
;
6397 if (e
->expr_type
!= EXPR_CONSTANT
)
6400 itrunc
= gfc_copy_expr (e
);
6401 mpfr_round (itrunc
->value
.real
, e
->value
.real
);
6403 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
6404 gfc_mpfr_to_mpz (result
->value
.integer
, itrunc
->value
.real
, &e
->where
);
6406 gfc_free_expr (itrunc
);
6408 return range_check (result
, name
);
6413 gfc_simplify_new_line (gfc_expr
*e
)
6417 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 1);
6418 result
->value
.character
.string
[0] = '\n';
6425 gfc_simplify_nint (gfc_expr
*e
, gfc_expr
*k
)
6427 return simplify_nint ("NINT", e
, k
);
6432 gfc_simplify_idnint (gfc_expr
*e
)
6434 return simplify_nint ("IDNINT", e
, NULL
);
6437 static int norm2_scale
;
6440 norm2_add_squared (gfc_expr
*result
, gfc_expr
*e
)
6444 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
6445 gcc_assert (result
->ts
.type
== BT_REAL
6446 && result
->expr_type
== EXPR_CONSTANT
);
6448 gfc_set_model_kind (result
->ts
.kind
);
6449 int index
= gfc_validate_kind (BT_REAL
, result
->ts
.kind
, false);
6451 if (mpfr_regular_p (result
->value
.real
))
6453 exp
= mpfr_get_exp (result
->value
.real
);
6454 /* If result is getting close to overflowing, scale down. */
6455 if (exp
>= gfc_real_kinds
[index
].max_exponent
- 4
6456 && norm2_scale
<= gfc_real_kinds
[index
].max_exponent
- 2)
6459 mpfr_div_ui (result
->value
.real
, result
->value
.real
, 16,
6465 if (mpfr_regular_p (e
->value
.real
))
6467 exp
= mpfr_get_exp (e
->value
.real
);
6468 /* If e**2 would overflow or close to overflowing, scale down. */
6469 if (exp
- norm2_scale
>= gfc_real_kinds
[index
].max_exponent
/ 2 - 2)
6471 int new_scale
= gfc_real_kinds
[index
].max_exponent
/ 2 + 4;
6472 mpfr_set_ui (tmp
, 1, GFC_RND_MODE
);
6473 mpfr_set_exp (tmp
, new_scale
- norm2_scale
);
6474 mpfr_div (result
->value
.real
, result
->value
.real
, tmp
, GFC_RND_MODE
);
6475 mpfr_div (result
->value
.real
, result
->value
.real
, tmp
, GFC_RND_MODE
);
6476 norm2_scale
= new_scale
;
6481 mpfr_set_ui (tmp
, 1, GFC_RND_MODE
);
6482 mpfr_set_exp (tmp
, norm2_scale
);
6483 mpfr_div (tmp
, e
->value
.real
, tmp
, GFC_RND_MODE
);
6486 mpfr_set (tmp
, e
->value
.real
, GFC_RND_MODE
);
6487 mpfr_pow_ui (tmp
, tmp
, 2, GFC_RND_MODE
);
6488 mpfr_add (result
->value
.real
, result
->value
.real
, tmp
,
6497 norm2_do_sqrt (gfc_expr
*result
, gfc_expr
*e
)
6499 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
6500 gcc_assert (result
->ts
.type
== BT_REAL
6501 && result
->expr_type
== EXPR_CONSTANT
);
6504 mpfr_set (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
6505 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
6506 if (norm2_scale
&& mpfr_regular_p (result
->value
.real
))
6510 mpfr_set_ui (tmp
, 1, GFC_RND_MODE
);
6511 mpfr_set_exp (tmp
, norm2_scale
);
6512 mpfr_mul (result
->value
.real
, result
->value
.real
, tmp
, GFC_RND_MODE
);
6522 gfc_simplify_norm2 (gfc_expr
*e
, gfc_expr
*dim
)
6527 size_zero
= gfc_is_size_zero_array (e
);
6529 if (!(is_constant_array_expr (e
) || size_zero
)
6530 || (dim
!= NULL
&& !gfc_is_constant_expr (dim
)))
6533 result
= transformational_result (e
, dim
, e
->ts
.type
, e
->ts
.kind
, &e
->where
);
6534 init_result_expr (result
, 0, NULL
);
6540 if (!dim
|| e
->rank
== 1)
6542 result
= simplify_transformation_to_scalar (result
, e
, NULL
,
6544 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
6545 if (norm2_scale
&& mpfr_regular_p (result
->value
.real
))
6549 mpfr_set_ui (tmp
, 1, GFC_RND_MODE
);
6550 mpfr_set_exp (tmp
, norm2_scale
);
6551 mpfr_mul (result
->value
.real
, result
->value
.real
, tmp
, GFC_RND_MODE
);
6557 result
= simplify_transformation_to_array (result
, e
, dim
, NULL
,
6566 gfc_simplify_not (gfc_expr
*e
)
6570 if (e
->expr_type
!= EXPR_CONSTANT
)
6573 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
6574 mpz_com (result
->value
.integer
, e
->value
.integer
);
6576 return range_check (result
, "NOT");
6581 gfc_simplify_null (gfc_expr
*mold
)
6587 result
= gfc_copy_expr (mold
);
6588 result
->expr_type
= EXPR_NULL
;
6591 result
= gfc_get_null_expr (NULL
);
6598 gfc_simplify_num_images (gfc_expr
*distance ATTRIBUTE_UNUSED
, gfc_expr
*failed
)
6602 if (flag_coarray
== GFC_FCOARRAY_NONE
)
6604 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
6605 return &gfc_bad_expr
;
6608 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
)
6611 if (failed
&& failed
->expr_type
!= EXPR_CONSTANT
)
6614 /* FIXME: gfc_current_locus is wrong. */
6615 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
6616 &gfc_current_locus
);
6618 if (failed
&& failed
->value
.logical
!= 0)
6619 mpz_set_si (result
->value
.integer
, 0);
6621 mpz_set_si (result
->value
.integer
, 1);
6628 gfc_simplify_or (gfc_expr
*x
, gfc_expr
*y
)
6633 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
6636 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
6641 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
6642 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
6643 return range_check (result
, "OR");
6646 return gfc_get_logical_expr (kind
, &x
->where
,
6647 x
->value
.logical
|| y
->value
.logical
);
6655 gfc_simplify_pack (gfc_expr
*array
, gfc_expr
*mask
, gfc_expr
*vector
)
6658 gfc_constructor
*array_ctor
, *mask_ctor
, *vector_ctor
;
6660 if (!is_constant_array_expr (array
)
6661 || !is_constant_array_expr (vector
)
6662 || (!gfc_is_constant_expr (mask
)
6663 && !is_constant_array_expr (mask
)))
6666 result
= gfc_get_array_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
6667 if (array
->ts
.type
== BT_DERIVED
)
6668 result
->ts
.u
.derived
= array
->ts
.u
.derived
;
6670 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
6671 vector_ctor
= vector
6672 ? gfc_constructor_first (vector
->value
.constructor
)
6675 if (mask
->expr_type
== EXPR_CONSTANT
6676 && mask
->value
.logical
)
6678 /* Copy all elements of ARRAY to RESULT. */
6681 gfc_constructor_append_expr (&result
->value
.constructor
,
6682 gfc_copy_expr (array_ctor
->expr
),
6685 array_ctor
= gfc_constructor_next (array_ctor
);
6686 vector_ctor
= gfc_constructor_next (vector_ctor
);
6689 else if (mask
->expr_type
== EXPR_ARRAY
)
6691 /* Copy only those elements of ARRAY to RESULT whose
6692 MASK equals .TRUE.. */
6693 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
6694 while (mask_ctor
&& array_ctor
)
6696 if (mask_ctor
->expr
->value
.logical
)
6698 gfc_constructor_append_expr (&result
->value
.constructor
,
6699 gfc_copy_expr (array_ctor
->expr
),
6701 vector_ctor
= gfc_constructor_next (vector_ctor
);
6704 array_ctor
= gfc_constructor_next (array_ctor
);
6705 mask_ctor
= gfc_constructor_next (mask_ctor
);
6709 /* Append any left-over elements from VECTOR to RESULT. */
6712 gfc_constructor_append_expr (&result
->value
.constructor
,
6713 gfc_copy_expr (vector_ctor
->expr
),
6715 vector_ctor
= gfc_constructor_next (vector_ctor
);
6718 result
->shape
= gfc_get_shape (1);
6719 gfc_array_size (result
, &result
->shape
[0]);
6721 if (array
->ts
.type
== BT_CHARACTER
)
6722 result
->ts
.u
.cl
= array
->ts
.u
.cl
;
6729 do_xor (gfc_expr
*result
, gfc_expr
*e
)
6731 gcc_assert (e
->ts
.type
== BT_LOGICAL
&& e
->expr_type
== EXPR_CONSTANT
);
6732 gcc_assert (result
->ts
.type
== BT_LOGICAL
6733 && result
->expr_type
== EXPR_CONSTANT
);
6735 result
->value
.logical
= result
->value
.logical
!= e
->value
.logical
;
6741 gfc_simplify_is_contiguous (gfc_expr
*array
)
6743 if (gfc_is_simply_contiguous (array
, false, true))
6744 return gfc_get_logical_expr (gfc_default_logical_kind
, &array
->where
, 1);
6746 if (gfc_is_not_contiguous (array
))
6747 return gfc_get_logical_expr (gfc_default_logical_kind
, &array
->where
, 0);
6754 gfc_simplify_parity (gfc_expr
*e
, gfc_expr
*dim
)
6756 return simplify_transformation (e
, dim
, NULL
, 0, do_xor
);
6761 gfc_simplify_popcnt (gfc_expr
*e
)
6766 if (e
->expr_type
!= EXPR_CONSTANT
)
6769 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
6771 if (flag_unsigned
&& e
->ts
.type
== BT_UNSIGNED
)
6772 res
= mpz_popcount (e
->value
.integer
);
6775 /* Convert argument to unsigned, then count the '1' bits. */
6776 mpz_init_set (x
, e
->value
.integer
);
6777 gfc_convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
6778 res
= mpz_popcount (x
);
6782 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, res
);
6787 gfc_simplify_poppar (gfc_expr
*e
)
6792 if (e
->expr_type
!= EXPR_CONSTANT
)
6795 popcnt
= gfc_simplify_popcnt (e
);
6796 gcc_assert (popcnt
);
6798 bool fail
= gfc_extract_int (popcnt
, &i
);
6801 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
% 2);
6806 gfc_simplify_precision (gfc_expr
*e
)
6808 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
6809 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
,
6810 gfc_real_kinds
[i
].precision
);
6815 gfc_simplify_product (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
6817 return simplify_transformation (array
, dim
, mask
, 1, gfc_multiply
);
6822 gfc_simplify_radix (gfc_expr
*e
)
6825 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
6830 i
= gfc_integer_kinds
[i
].radix
;
6834 i
= gfc_real_kinds
[i
].radix
;
6841 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
6846 gfc_simplify_range (gfc_expr
*e
)
6849 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
6854 i
= gfc_integer_kinds
[i
].range
;
6858 i
= gfc_unsigned_kinds
[i
].range
;
6863 i
= gfc_real_kinds
[i
].range
;
6870 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
6875 gfc_simplify_rank (gfc_expr
*e
)
6881 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, e
->rank
);
6886 gfc_simplify_real (gfc_expr
*e
, gfc_expr
*k
)
6888 gfc_expr
*result
= NULL
;
6889 int kind
, tmp1
, tmp2
;
6891 /* Convert BOZ to real, and return without range checking. */
6892 if (e
->ts
.type
== BT_BOZ
)
6894 /* Determine kind for conversion of the BOZ. */
6896 gfc_extract_int (k
, &kind
);
6898 kind
= gfc_default_real_kind
;
6900 if (!gfc_boz2real (e
, kind
))
6902 result
= gfc_copy_expr (e
);
6906 if (e
->ts
.type
== BT_COMPLEX
)
6907 kind
= get_kind (BT_REAL
, k
, "REAL", e
->ts
.kind
);
6909 kind
= get_kind (BT_REAL
, k
, "REAL", gfc_default_real_kind
);
6912 return &gfc_bad_expr
;
6914 if (e
->expr_type
!= EXPR_CONSTANT
)
6917 /* For explicit conversion, turn off -Wconversion and -Wconversion-extra
6919 tmp1
= warn_conversion
;
6920 tmp2
= warn_conversion_extra
;
6921 warn_conversion
= warn_conversion_extra
= 0;
6923 result
= gfc_convert_constant (e
, BT_REAL
, kind
);
6925 warn_conversion
= tmp1
;
6926 warn_conversion_extra
= tmp2
;
6928 if (result
== &gfc_bad_expr
)
6929 return &gfc_bad_expr
;
6931 return range_check (result
, "REAL");
6936 gfc_simplify_realpart (gfc_expr
*e
)
6940 if (e
->expr_type
!= EXPR_CONSTANT
)
6943 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
6944 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
6946 return range_check (result
, "REALPART");
6950 gfc_simplify_repeat (gfc_expr
*e
, gfc_expr
*n
)
6955 bool have_length
= false;
6957 /* If NCOPIES isn't a constant, there's nothing we can do. */
6958 if (n
->expr_type
!= EXPR_CONSTANT
)
6961 /* If NCOPIES is negative, it's an error. */
6962 if (mpz_sgn (n
->value
.integer
) < 0)
6964 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
6966 return &gfc_bad_expr
;
6969 /* If we don't know the character length, we can do no more. */
6970 if (e
->ts
.u
.cl
&& e
->ts
.u
.cl
->length
6971 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
)
6973 len
= gfc_mpz_get_hwi (e
->ts
.u
.cl
->length
->value
.integer
);
6976 else if (e
->expr_type
== EXPR_CONSTANT
6977 && (e
->ts
.u
.cl
== NULL
|| e
->ts
.u
.cl
->length
== NULL
))
6979 len
= e
->value
.character
.length
;
6984 /* If the source length is 0, any value of NCOPIES is valid
6985 and everything behaves as if NCOPIES == 0. */
6988 mpz_set_ui (ncopies
, 0);
6990 mpz_set (ncopies
, n
->value
.integer
);
6992 /* Check that NCOPIES isn't too large. */
6998 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
7000 i
= gfc_validate_kind (BT_INTEGER
, gfc_charlen_int_kind
, false);
7004 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
,
7005 e
->ts
.u
.cl
->length
->value
.integer
);
7010 gfc_mpz_set_hwi (mlen
, len
);
7011 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
, mlen
);
7015 /* The check itself. */
7016 if (mpz_cmp (ncopies
, max
) > 0)
7019 mpz_clear (ncopies
);
7020 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
7022 return &gfc_bad_expr
;
7027 mpz_clear (ncopies
);
7029 /* For further simplification, we need the character string to be
7031 if (e
->expr_type
!= EXPR_CONSTANT
)
7036 (e
->ts
.u
.cl
->length
&&
7037 mpz_sgn (e
->ts
.u
.cl
->length
->value
.integer
) != 0))
7039 bool fail
= gfc_extract_hwi (n
, &ncop
);
7046 return gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 0);
7048 len
= e
->value
.character
.length
;
7049 gfc_charlen_t nlen
= ncop
* len
;
7051 /* Here's a semi-arbitrary limit. If the string is longer than 1 GB
7052 (2**28 elements * 4 bytes (wide chars) per element) defer to
7053 runtime instead of consuming (unbounded) memory and CPU at
7055 if (nlen
> 268435456)
7057 gfc_warning_now (0, "Evaluation of string longer than 2**28 at %L"
7058 " deferred to runtime, expect bugs", &e
->where
);
7062 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, nlen
);
7063 for (size_t i
= 0; i
< (size_t) ncop
; i
++)
7064 for (size_t j
= 0; j
< (size_t) len
; j
++)
7065 result
->value
.character
.string
[j
+i
*len
]= e
->value
.character
.string
[j
];
7067 result
->value
.character
.string
[nlen
] = '\0'; /* For debugger */
7072 /* This one is a bear, but mainly has to do with shuffling elements. */
7075 gfc_simplify_reshape (gfc_expr
*source
, gfc_expr
*shape_exp
,
7076 gfc_expr
*pad
, gfc_expr
*order_exp
)
7078 int order
[GFC_MAX_DIMENSIONS
], shape
[GFC_MAX_DIMENSIONS
];
7079 int i
, rank
, npad
, x
[GFC_MAX_DIMENSIONS
];
7083 gfc_expr
*e
, *result
;
7084 bool zerosize
= false;
7086 /* Check that argument expression types are OK. */
7087 if (!is_constant_array_expr (source
)
7088 || !is_constant_array_expr (shape_exp
)
7089 || !is_constant_array_expr (pad
)
7090 || !is_constant_array_expr (order_exp
))
7093 if (source
->shape
== NULL
)
7096 /* Proceed with simplification, unpacking the array. */
7101 for (i
= 0; i
< GFC_MAX_DIMENSIONS
; i
++)
7106 e
= gfc_constructor_lookup_expr (shape_exp
->value
.constructor
, rank
);
7110 gfc_extract_int (e
, &shape
[rank
]);
7112 gcc_assert (rank
>= 0 && rank
< GFC_MAX_DIMENSIONS
);
7113 if (shape
[rank
] < 0)
7115 gfc_error ("The SHAPE array for the RESHAPE intrinsic at %L has a "
7116 "negative value %d for dimension %d",
7117 &shape_exp
->where
, shape
[rank
], rank
+1);
7119 return &gfc_bad_expr
;
7125 gcc_assert (rank
> 0);
7127 /* Now unpack the order array if present. */
7128 if (order_exp
== NULL
)
7130 for (i
= 0; i
< rank
; i
++)
7136 int order_size
, shape_size
;
7138 if (order_exp
->rank
!= shape_exp
->rank
)
7140 gfc_error ("Shapes of ORDER at %L and SHAPE at %L are different",
7141 &order_exp
->where
, &shape_exp
->where
);
7143 return &gfc_bad_expr
;
7146 gfc_array_size (shape_exp
, &size
);
7147 shape_size
= mpz_get_ui (size
);
7149 gfc_array_size (order_exp
, &size
);
7150 order_size
= mpz_get_ui (size
);
7152 if (order_size
!= shape_size
)
7154 gfc_error ("Sizes of ORDER at %L and SHAPE at %L are different",
7155 &order_exp
->where
, &shape_exp
->where
);
7157 return &gfc_bad_expr
;
7160 for (i
= 0; i
< rank
; i
++)
7162 e
= gfc_constructor_lookup_expr (order_exp
->value
.constructor
, i
);
7165 gfc_extract_int (e
, &order
[i
]);
7167 if (order
[i
] < 1 || order
[i
] > rank
)
7169 gfc_error ("Element with a value of %d in ORDER at %L must be "
7170 "in the range [1, ..., %d] for the RESHAPE intrinsic "
7171 "near %L", order
[i
], &order_exp
->where
, rank
,
7174 return &gfc_bad_expr
;
7178 if (x
[order
[i
]] != 0)
7180 gfc_error ("ORDER at %L is not a permutation of the size of "
7181 "SHAPE at %L", &order_exp
->where
, &shape_exp
->where
);
7183 return &gfc_bad_expr
;
7189 /* Count the elements in the source and padding arrays. */
7194 gfc_array_size (pad
, &size
);
7195 npad
= mpz_get_ui (size
);
7199 gfc_array_size (source
, &size
);
7200 nsource
= mpz_get_ui (size
);
7203 /* If it weren't for that pesky permutation we could just loop
7204 through the source and round out any shortage with pad elements.
7205 But no, someone just had to have the compiler do something the
7206 user should be doing. */
7208 for (i
= 0; i
< rank
; i
++)
7211 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
7213 if (source
->ts
.type
== BT_DERIVED
)
7214 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
7215 if (source
->ts
.type
== BT_CHARACTER
&& result
->ts
.u
.cl
== NULL
)
7216 result
->ts
= source
->ts
;
7217 result
->rank
= rank
;
7218 result
->shape
= gfc_get_shape (rank
);
7219 for (i
= 0; i
< rank
; i
++)
7221 mpz_init_set_ui (result
->shape
[i
], shape
[i
]);
7229 while (nsource
> 0 || npad
> 0)
7231 /* Figure out which element to extract. */
7232 mpz_set_ui (index
, 0);
7234 for (i
= rank
- 1; i
>= 0; i
--)
7236 mpz_add_ui (index
, index
, x
[order
[i
]]);
7238 mpz_mul_ui (index
, index
, shape
[order
[i
- 1]]);
7241 if (mpz_cmp_ui (index
, INT_MAX
) > 0)
7242 gfc_internal_error ("Reshaped array too large at %C");
7244 j
= mpz_get_ui (index
);
7247 e
= gfc_constructor_lookup_expr (source
->value
.constructor
, j
);
7254 gfc_error ("Without padding, there are not enough elements "
7255 "in the intrinsic RESHAPE source at %L to match "
7256 "the shape", &source
->where
);
7257 gfc_free_expr (result
);
7262 e
= gfc_constructor_lookup_expr (pad
->value
.constructor
, j
);
7266 gfc_constructor_append_expr (&result
->value
.constructor
,
7267 gfc_copy_expr (e
), &e
->where
);
7269 /* Calculate the next element. */
7273 if (++x
[i
] < shape
[i
])
7291 gfc_simplify_rrspacing (gfc_expr
*x
)
7297 if (x
->expr_type
!= EXPR_CONSTANT
)
7300 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
7302 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
7304 /* RRSPACING(+/- 0.0) = 0.0 */
7305 if (mpfr_zero_p (x
->value
.real
))
7307 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
7311 /* RRSPACING(inf) = NaN */
7312 if (mpfr_inf_p (x
->value
.real
))
7314 mpfr_set_nan (result
->value
.real
);
7318 /* RRSPACING(NaN) = same NaN */
7319 if (mpfr_nan_p (x
->value
.real
))
7321 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
7325 /* | x * 2**(-e) | * 2**p. */
7326 mpfr_abs (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
7327 e
= - (long int) mpfr_get_exp (x
->value
.real
);
7328 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, e
, GFC_RND_MODE
);
7330 p
= (long int) gfc_real_kinds
[i
].digits
;
7331 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, p
, GFC_RND_MODE
);
7333 return range_check (result
, "RRSPACING");
7338 gfc_simplify_scale (gfc_expr
*x
, gfc_expr
*i
)
7340 int k
, neg_flag
, power
, exp_range
;
7341 mpfr_t scale
, radix
;
7344 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
7347 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
7349 if (mpfr_zero_p (x
->value
.real
))
7351 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
7355 k
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
7357 exp_range
= gfc_real_kinds
[k
].max_exponent
- gfc_real_kinds
[k
].min_exponent
;
7359 /* This check filters out values of i that would overflow an int. */
7360 if (mpz_cmp_si (i
->value
.integer
, exp_range
+ 2) > 0
7361 || mpz_cmp_si (i
->value
.integer
, -exp_range
- 2) < 0)
7363 gfc_error ("Result of SCALE overflows its kind at %L", &result
->where
);
7364 gfc_free_expr (result
);
7365 return &gfc_bad_expr
;
7368 /* Compute scale = radix ** power. */
7369 power
= mpz_get_si (i
->value
.integer
);
7379 gfc_set_model_kind (x
->ts
.kind
);
7382 mpfr_set_ui (radix
, gfc_real_kinds
[k
].radix
, GFC_RND_MODE
);
7383 mpfr_pow_ui (scale
, radix
, power
, GFC_RND_MODE
);
7386 mpfr_div (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
7388 mpfr_mul (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
7390 mpfr_clears (scale
, radix
, NULL
);
7392 return range_check (result
, "SCALE");
7396 /* Variants of strspn and strcspn that operate on wide characters. */
7399 wide_strspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
7402 const gfc_char_t
*c
;
7406 for (c
= s2
; *c
; c
++)
7420 wide_strcspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
7423 const gfc_char_t
*c
;
7427 for (c
= s2
; *c
; c
++)
7442 gfc_simplify_scan (gfc_expr
*e
, gfc_expr
*c
, gfc_expr
*b
, gfc_expr
*kind
)
7447 size_t indx
, len
, lenc
;
7448 int k
= get_kind (BT_INTEGER
, kind
, "SCAN", gfc_default_integer_kind
);
7451 return &gfc_bad_expr
;
7453 if (e
->expr_type
!= EXPR_CONSTANT
|| c
->expr_type
!= EXPR_CONSTANT
7454 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
7457 if (b
!= NULL
&& b
->value
.logical
!= 0)
7462 len
= e
->value
.character
.length
;
7463 lenc
= c
->value
.character
.length
;
7465 if (len
== 0 || lenc
== 0)
7473 indx
= wide_strcspn (e
->value
.character
.string
,
7474 c
->value
.character
.string
) + 1;
7479 for (indx
= len
; indx
> 0; indx
--)
7481 for (i
= 0; i
< lenc
; i
++)
7483 if (c
->value
.character
.string
[i
]
7484 == e
->value
.character
.string
[indx
- 1])
7492 result
= gfc_get_int_expr (k
, &e
->where
, indx
);
7493 return range_check (result
, "SCAN");
7498 gfc_simplify_selected_char_kind (gfc_expr
*e
)
7502 if (e
->expr_type
!= EXPR_CONSTANT
)
7505 if (gfc_compare_with_Cstring (e
, "ascii", false) == 0
7506 || gfc_compare_with_Cstring (e
, "default", false) == 0)
7508 else if (gfc_compare_with_Cstring (e
, "iso_10646", false) == 0)
7513 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
7518 gfc_simplify_selected_int_kind (gfc_expr
*e
)
7522 if (e
->expr_type
!= EXPR_CONSTANT
|| gfc_extract_int (e
, &range
))
7527 for (i
= 0; gfc_integer_kinds
[i
].kind
!= 0; i
++)
7528 if (gfc_integer_kinds
[i
].range
>= range
7529 && gfc_integer_kinds
[i
].kind
< kind
)
7530 kind
= gfc_integer_kinds
[i
].kind
;
7532 if (kind
== INT_MAX
)
7535 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
7538 /* Same as above, but with unsigneds. */
7541 gfc_simplify_selected_unsigned_kind (gfc_expr
*e
)
7545 if (e
->expr_type
!= EXPR_CONSTANT
|| gfc_extract_int (e
, &range
))
7550 for (i
= 0; gfc_unsigned_kinds
[i
].kind
!= 0; i
++)
7551 if (gfc_unsigned_kinds
[i
].range
>= range
7552 && gfc_unsigned_kinds
[i
].kind
< kind
)
7553 kind
= gfc_unsigned_kinds
[i
].kind
;
7555 if (kind
== INT_MAX
)
7558 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
7563 gfc_simplify_selected_logical_kind (gfc_expr
*e
)
7567 if (e
->expr_type
!= EXPR_CONSTANT
|| gfc_extract_int (e
, &bits
))
7572 for (i
= 0; gfc_logical_kinds
[i
].kind
!= 0; i
++)
7573 if (gfc_logical_kinds
[i
].bit_size
>= bits
7574 && gfc_logical_kinds
[i
].kind
< kind
)
7575 kind
= gfc_logical_kinds
[i
].kind
;
7577 if (kind
== INT_MAX
)
7580 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
7585 gfc_simplify_selected_real_kind (gfc_expr
*p
, gfc_expr
*q
, gfc_expr
*rdx
)
7587 int range
, precision
, radix
, i
, kind
, found_precision
, found_range
,
7589 locus
*loc
= &gfc_current_locus
;
7595 if (p
->expr_type
!= EXPR_CONSTANT
7596 || gfc_extract_int (p
, &precision
))
7605 if (q
->expr_type
!= EXPR_CONSTANT
7606 || gfc_extract_int (q
, &range
))
7617 if (rdx
->expr_type
!= EXPR_CONSTANT
7618 || gfc_extract_int (rdx
, &radix
))
7626 found_precision
= 0;
7630 for (i
= 0; gfc_real_kinds
[i
].kind
!= 0; i
++)
7632 if (gfc_real_kinds
[i
].precision
>= precision
)
7633 found_precision
= 1;
7635 if (gfc_real_kinds
[i
].range
>= range
)
7638 if (radix
== 0 || gfc_real_kinds
[i
].radix
== radix
)
7641 if (gfc_real_kinds
[i
].precision
>= precision
7642 && gfc_real_kinds
[i
].range
>= range
7643 && (radix
== 0 || gfc_real_kinds
[i
].radix
== radix
)
7644 && gfc_real_kinds
[i
].kind
< kind
)
7645 kind
= gfc_real_kinds
[i
].kind
;
7648 if (kind
== INT_MAX
)
7650 if (found_radix
&& found_range
&& !found_precision
)
7652 else if (found_radix
&& found_precision
&& !found_range
)
7654 else if (found_radix
&& !found_precision
&& !found_range
)
7656 else if (found_radix
)
7662 return gfc_get_int_expr (gfc_default_integer_kind
, loc
, kind
);
7667 gfc_simplify_set_exponent (gfc_expr
*x
, gfc_expr
*i
)
7670 mpfr_t exp
, absv
, log2
, pow2
, frac
;
7673 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
7676 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
7678 /* SET_EXPONENT (+/-0.0, I) = +/- 0.0
7679 SET_EXPONENT (NaN) = same NaN */
7680 if (mpfr_zero_p (x
->value
.real
) || mpfr_nan_p (x
->value
.real
))
7682 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
7686 /* SET_EXPONENT (inf) = NaN */
7687 if (mpfr_inf_p (x
->value
.real
))
7689 mpfr_set_nan (result
->value
.real
);
7693 gfc_set_model_kind (x
->ts
.kind
);
7700 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
7701 mpfr_log2 (log2
, absv
, GFC_RND_MODE
);
7703 mpfr_floor (log2
, log2
);
7704 mpfr_add_ui (exp
, log2
, 1, GFC_RND_MODE
);
7706 /* Old exponent value, and fraction. */
7707 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
7709 mpfr_div (frac
, x
->value
.real
, pow2
, GFC_RND_MODE
);
7712 exp2
= mpz_get_si (i
->value
.integer
);
7713 mpfr_mul_2si (result
->value
.real
, frac
, exp2
, GFC_RND_MODE
);
7715 mpfr_clears (absv
, log2
, exp
, pow2
, frac
, NULL
);
7717 return range_check (result
, "SET_EXPONENT");
7722 gfc_simplify_shape (gfc_expr
*source
, gfc_expr
*kind
)
7724 mpz_t shape
[GFC_MAX_DIMENSIONS
];
7725 gfc_expr
*result
, *e
, *f
;
7729 int k
= get_kind (BT_INTEGER
, kind
, "SHAPE", gfc_default_integer_kind
);
7731 if (source
->rank
== -1)
7734 result
= gfc_get_array_expr (BT_INTEGER
, k
, &source
->where
);
7735 result
->shape
= gfc_get_shape (1);
7736 mpz_init (result
->shape
[0]);
7738 if (source
->rank
== 0)
7741 if (source
->expr_type
== EXPR_VARIABLE
)
7743 ar
= gfc_find_array_ref (source
);
7744 t
= gfc_array_ref_shape (ar
, shape
);
7746 else if (source
->shape
)
7749 for (n
= 0; n
< source
->rank
; n
++)
7751 mpz_init (shape
[n
]);
7752 mpz_set (shape
[n
], source
->shape
[n
]);
7758 for (n
= 0; n
< source
->rank
; n
++)
7760 e
= gfc_get_constant_expr (BT_INTEGER
, k
, &source
->where
);
7763 mpz_set (e
->value
.integer
, shape
[n
]);
7766 mpz_set_ui (e
->value
.integer
, n
+ 1);
7768 f
= simplify_size (source
, e
, k
);
7772 gfc_free_expr (result
);
7779 if (e
== &gfc_bad_expr
|| range_check (e
, "SHAPE") == &gfc_bad_expr
)
7781 gfc_free_expr (result
);
7783 gfc_clear_shape (shape
, source
->rank
);
7784 return &gfc_bad_expr
;
7787 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
7791 gfc_clear_shape (shape
, source
->rank
);
7793 mpz_set_si (result
->shape
[0], source
->rank
);
7800 simplify_size (gfc_expr
*array
, gfc_expr
*dim
, int k
)
7803 gfc_expr
*return_value
;
7807 /* For unary operations, the size of the result is given by the size
7808 of the operand. For binary ones, it's the size of the first operand
7809 unless it is scalar, then it is the size of the second. */
7810 if (array
->expr_type
== EXPR_OP
&& !array
->value
.op
.uop
)
7812 gfc_expr
* replacement
;
7813 gfc_expr
* simplified
;
7815 switch (array
->value
.op
.op
)
7817 /* Unary operations. */
7819 case INTRINSIC_UPLUS
:
7820 case INTRINSIC_UMINUS
:
7821 case INTRINSIC_PARENTHESES
:
7822 replacement
= array
->value
.op
.op1
;
7825 /* Binary operations. If any one of the operands is scalar, take
7826 the other one's size. If both of them are arrays, it does not
7827 matter -- try to find one with known shape, if possible. */
7829 if (array
->value
.op
.op1
->rank
== 0)
7830 replacement
= array
->value
.op
.op2
;
7831 else if (array
->value
.op
.op2
->rank
== 0)
7832 replacement
= array
->value
.op
.op1
;
7835 simplified
= simplify_size (array
->value
.op
.op1
, dim
, k
);
7839 replacement
= array
->value
.op
.op2
;
7844 /* Try to reduce it directly if possible. */
7845 simplified
= simplify_size (replacement
, dim
, k
);
7847 /* Otherwise, we build a new SIZE call. This is hopefully at least
7848 simpler than the original one. */
7851 gfc_expr
*kind
= gfc_get_int_expr (gfc_default_integer_kind
, NULL
, k
);
7852 simplified
= gfc_build_intrinsic_call (gfc_current_ns
,
7853 GFC_ISYM_SIZE
, "size",
7855 gfc_copy_expr (replacement
),
7856 gfc_copy_expr (dim
),
7862 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
7863 if (ref
->type
== REF_ARRAY
&& ref
->u
.ar
.as
7864 && !gfc_resolve_array_spec (ref
->u
.ar
.as
, 0))
7869 if (!gfc_array_size (array
, &size
))
7874 if (dim
->expr_type
!= EXPR_CONSTANT
)
7877 if (array
->rank
== -1)
7880 d
= mpz_get_si (dim
->value
.integer
) - 1;
7881 if (d
< 0 || d
> array
->rank
- 1)
7883 gfc_error ("DIM argument (%d) to intrinsic SIZE at %L out of range "
7884 "(1:%d)", d
+1, &array
->where
, array
->rank
);
7885 return &gfc_bad_expr
;
7888 if (!gfc_array_dimen_size (array
, d
, &size
))
7892 return_value
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
7893 mpz_set (return_value
->value
.integer
, size
);
7896 return return_value
;
7901 gfc_simplify_size (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
7904 int k
= get_kind (BT_INTEGER
, kind
, "SIZE", gfc_default_integer_kind
);
7907 return &gfc_bad_expr
;
7909 result
= simplify_size (array
, dim
, k
);
7910 if (result
== NULL
|| result
== &gfc_bad_expr
)
7913 return range_check (result
, "SIZE");
7917 /* SIZEOF and C_SIZEOF return the size in bytes of an array element
7918 multiplied by the array size. */
7921 gfc_simplify_sizeof (gfc_expr
*x
)
7923 gfc_expr
*result
= NULL
;
7927 if (x
->ts
.type
== BT_CLASS
|| x
->ts
.deferred
)
7930 if (x
->ts
.type
== BT_CHARACTER
7931 && (!x
->ts
.u
.cl
|| !x
->ts
.u
.cl
->length
7932 || x
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
))
7935 if (x
->rank
&& x
->expr_type
!= EXPR_ARRAY
)
7937 if (!gfc_array_size (x
, &array_size
))
7940 mpz_clear (array_size
);
7943 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_index_integer_kind
,
7945 gfc_target_expr_size (x
, &res_size
);
7946 mpz_set_si (result
->value
.integer
, res_size
);
7952 /* STORAGE_SIZE returns the size in bits of a single array element. */
7955 gfc_simplify_storage_size (gfc_expr
*x
,
7958 gfc_expr
*result
= NULL
;
7962 if (x
->ts
.type
== BT_CLASS
|| x
->ts
.deferred
)
7965 if (x
->ts
.type
== BT_CHARACTER
&& x
->expr_type
!= EXPR_CONSTANT
7966 && (!x
->ts
.u
.cl
|| !x
->ts
.u
.cl
->length
7967 || x
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
))
7970 k
= get_kind (BT_INTEGER
, kind
, "STORAGE_SIZE", gfc_default_integer_kind
);
7972 return &gfc_bad_expr
;
7974 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &x
->where
);
7976 gfc_element_size (x
, &siz
);
7977 mpz_set_si (result
->value
.integer
, siz
);
7978 mpz_mul_ui (result
->value
.integer
, result
->value
.integer
, BITS_PER_UNIT
);
7980 return range_check (result
, "STORAGE_SIZE");
7985 gfc_simplify_sign (gfc_expr
*x
, gfc_expr
*y
)
7989 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
7992 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
7997 mpz_abs (result
->value
.integer
, x
->value
.integer
);
7998 if (mpz_sgn (y
->value
.integer
) < 0)
7999 mpz_neg (result
->value
.integer
, result
->value
.integer
);
8004 mpfr_copysign (result
->value
.real
, x
->value
.real
, y
->value
.real
,
8007 mpfr_setsign (result
->value
.real
, x
->value
.real
,
8008 mpfr_sgn (y
->value
.real
) < 0 ? 1 : 0, GFC_RND_MODE
);
8012 gfc_internal_error ("Bad type in gfc_simplify_sign");
8020 gfc_simplify_sin (gfc_expr
*x
)
8024 if (x
->expr_type
!= EXPR_CONSTANT
)
8027 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
8032 mpfr_sin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
8036 gfc_set_model (x
->value
.real
);
8037 mpc_sin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
8041 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
8044 return range_check (result
, "SIN");
8049 gfc_simplify_sinh (gfc_expr
*x
)
8053 if (x
->expr_type
!= EXPR_CONSTANT
)
8056 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
8061 mpfr_sinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
8065 mpc_sinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
8072 return range_check (result
, "SINH");
8076 /* The argument is always a double precision real that is converted to
8077 single precision. TODO: Rounding! */
8080 gfc_simplify_sngl (gfc_expr
*a
)
8085 if (a
->expr_type
!= EXPR_CONSTANT
)
8088 /* For explicit conversion, turn off -Wconversion and -Wconversion-extra
8090 tmp1
= warn_conversion
;
8091 tmp2
= warn_conversion_extra
;
8092 warn_conversion
= warn_conversion_extra
= 0;
8094 result
= gfc_real2real (a
, gfc_default_real_kind
);
8096 warn_conversion
= tmp1
;
8097 warn_conversion_extra
= tmp2
;
8099 return range_check (result
, "SNGL");
8104 gfc_simplify_spacing (gfc_expr
*x
)
8110 if (x
->expr_type
!= EXPR_CONSTANT
)
8113 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
8114 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
8116 /* SPACING(+/- 0.0) = SPACING(TINY(0.0)) = TINY(0.0) */
8117 if (mpfr_zero_p (x
->value
.real
))
8119 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
8123 /* SPACING(inf) = NaN */
8124 if (mpfr_inf_p (x
->value
.real
))
8126 mpfr_set_nan (result
->value
.real
);
8130 /* SPACING(NaN) = same NaN */
8131 if (mpfr_nan_p (x
->value
.real
))
8133 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
8137 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
8138 are the radix, exponent of x, and precision. This excludes the
8139 possibility of subnormal numbers. Fortran 2003 states the result is
8140 b**max(e - p, emin - 1). */
8142 ep
= (long int) mpfr_get_exp (x
->value
.real
) - gfc_real_kinds
[i
].digits
;
8143 en
= (long int) gfc_real_kinds
[i
].min_exponent
- 1;
8144 en
= en
> ep
? en
: ep
;
8146 mpfr_set_ui (result
->value
.real
, 1, GFC_RND_MODE
);
8147 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, en
, GFC_RND_MODE
);
8149 return range_check (result
, "SPACING");
8154 gfc_simplify_spread (gfc_expr
*source
, gfc_expr
*dim_expr
, gfc_expr
*ncopies_expr
)
8156 gfc_expr
*result
= NULL
;
8157 int nelem
, i
, j
, dim
, ncopies
;
8160 if ((!gfc_is_constant_expr (source
)
8161 && !is_constant_array_expr (source
))
8162 || !gfc_is_constant_expr (dim_expr
)
8163 || !gfc_is_constant_expr (ncopies_expr
))
8166 gcc_assert (dim_expr
->ts
.type
== BT_INTEGER
);
8167 gfc_extract_int (dim_expr
, &dim
);
8168 dim
-= 1; /* zero-base DIM */
8170 gcc_assert (ncopies_expr
->ts
.type
== BT_INTEGER
);
8171 gfc_extract_int (ncopies_expr
, &ncopies
);
8172 ncopies
= MAX (ncopies
, 0);
8174 /* Do not allow the array size to exceed the limit for an array
8176 if (source
->expr_type
== EXPR_ARRAY
)
8178 if (!gfc_array_size (source
, &size
))
8179 gfc_internal_error ("Failure getting length of a constant array.");
8182 mpz_init_set_ui (size
, 1);
8184 nelem
= mpz_get_si (size
) * ncopies
;
8185 if (nelem
> flag_max_array_constructor
)
8187 if (gfc_init_expr_flag
)
8189 gfc_error ("The number of elements (%d) in the array constructor "
8190 "at %L requires an increase of the allowed %d upper "
8191 "limit. See %<-fmax-array-constructor%> option.",
8192 nelem
, &source
->where
, flag_max_array_constructor
);
8193 return &gfc_bad_expr
;
8199 if (source
->expr_type
== EXPR_CONSTANT
8200 || source
->expr_type
== EXPR_STRUCTURE
)
8202 gcc_assert (dim
== 0);
8204 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
8206 if (source
->ts
.type
== BT_DERIVED
)
8207 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
8209 result
->shape
= gfc_get_shape (result
->rank
);
8210 mpz_init_set_si (result
->shape
[0], ncopies
);
8212 for (i
= 0; i
< ncopies
; ++i
)
8213 gfc_constructor_append_expr (&result
->value
.constructor
,
8214 gfc_copy_expr (source
), NULL
);
8216 else if (source
->expr_type
== EXPR_ARRAY
)
8218 int offset
, rstride
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
];
8219 gfc_constructor
*source_ctor
;
8221 gcc_assert (source
->rank
< GFC_MAX_DIMENSIONS
);
8222 gcc_assert (dim
>= 0 && dim
<= source
->rank
);
8224 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
8226 if (source
->ts
.type
== BT_DERIVED
)
8227 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
8228 result
->rank
= source
->rank
+ 1;
8229 result
->shape
= gfc_get_shape (result
->rank
);
8231 for (i
= 0, j
= 0; i
< result
->rank
; ++i
)
8234 mpz_init_set (result
->shape
[i
], source
->shape
[j
++]);
8236 mpz_init_set_si (result
->shape
[i
], ncopies
);
8238 extent
[i
] = mpz_get_si (result
->shape
[i
]);
8239 rstride
[i
] = (i
== 0) ? 1 : rstride
[i
-1] * extent
[i
-1];
8243 for (source_ctor
= gfc_constructor_first (source
->value
.constructor
);
8244 source_ctor
; source_ctor
= gfc_constructor_next (source_ctor
))
8246 for (i
= 0; i
< ncopies
; ++i
)
8247 gfc_constructor_insert_expr (&result
->value
.constructor
,
8248 gfc_copy_expr (source_ctor
->expr
),
8249 NULL
, offset
+ i
* rstride
[dim
]);
8251 offset
+= (dim
== 0 ? ncopies
: 1);
8256 gfc_error ("Simplification of SPREAD at %C not yet implemented");
8257 return &gfc_bad_expr
;
8260 if (source
->ts
.type
== BT_CHARACTER
)
8261 result
->ts
.u
.cl
= source
->ts
.u
.cl
;
8268 gfc_simplify_sqrt (gfc_expr
*e
)
8270 gfc_expr
*result
= NULL
;
8272 if (e
->expr_type
!= EXPR_CONSTANT
)
8278 if (mpfr_cmp_si (e
->value
.real
, 0) < 0)
8280 gfc_error ("Argument of SQRT at %L has a negative value",
8282 return &gfc_bad_expr
;
8284 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
8285 mpfr_sqrt (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
8289 gfc_set_model (e
->value
.real
);
8291 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
8292 mpc_sqrt (result
->value
.complex, e
->value
.complex, GFC_MPC_RND_MODE
);
8296 gfc_internal_error ("invalid argument of SQRT at %L", &e
->where
);
8299 return range_check (result
, "SQRT");
8304 gfc_simplify_sum (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
8306 return simplify_transformation (array
, dim
, mask
, 0, gfc_add
);
8310 /* Simplify COTAN(X) where X has the unit of radian. */
8313 gfc_simplify_cotan (gfc_expr
*x
)
8318 if (x
->expr_type
!= EXPR_CONSTANT
)
8321 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
8326 mpfr_cot (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
8330 /* There is no builtin mpc_cot, so compute cot = cos / sin. */
8331 val
= &result
->value
.complex;
8332 mpc_init2 (swp
, mpfr_get_default_prec ());
8333 mpc_sin_cos (*val
, swp
, x
->value
.complex, GFC_MPC_RND_MODE
,
8335 mpc_div (*val
, swp
, *val
, GFC_MPC_RND_MODE
);
8343 return range_check (result
, "COTAN");
8348 gfc_simplify_tan (gfc_expr
*x
)
8352 if (x
->expr_type
!= EXPR_CONSTANT
)
8355 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
8360 mpfr_tan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
8364 mpc_tan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
8371 return range_check (result
, "TAN");
8376 gfc_simplify_tanh (gfc_expr
*x
)
8380 if (x
->expr_type
!= EXPR_CONSTANT
)
8383 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
8388 mpfr_tanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
8392 mpc_tanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
8399 return range_check (result
, "TANH");
8404 gfc_simplify_tiny (gfc_expr
*e
)
8409 i
= gfc_validate_kind (BT_REAL
, e
->ts
.kind
, false);
8411 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
8412 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
8419 gfc_simplify_trailz (gfc_expr
*e
)
8421 unsigned long tz
, bs
;
8424 if (e
->expr_type
!= EXPR_CONSTANT
)
8427 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
8428 bs
= gfc_integer_kinds
[i
].bit_size
;
8429 tz
= mpz_scan1 (e
->value
.integer
, 0);
8431 return gfc_get_int_expr (gfc_default_integer_kind
,
8432 &e
->where
, MIN (tz
, bs
));
8437 gfc_simplify_transfer (gfc_expr
*source
, gfc_expr
*mold
, gfc_expr
*size
)
8440 gfc_expr
*mold_element
;
8445 unsigned char *buffer
;
8446 size_t result_length
;
8448 if (!gfc_is_constant_expr (source
) || !gfc_is_constant_expr (size
))
8451 if (!gfc_resolve_expr (mold
))
8453 if (gfc_init_expr_flag
&& !gfc_is_constant_expr (mold
))
8456 if (!gfc_calculate_transfer_sizes (source
, mold
, size
, &source_size
,
8457 &result_size
, &result_length
))
8460 /* Calculate the size of the source. */
8461 if (source
->expr_type
== EXPR_ARRAY
&& !gfc_array_size (source
, &tmp
))
8462 gfc_internal_error ("Failure getting length of a constant array.");
8464 /* Create an empty new expression with the appropriate characteristics. */
8465 result
= gfc_get_constant_expr (mold
->ts
.type
, mold
->ts
.kind
,
8467 result
->ts
= mold
->ts
;
8469 mold_element
= (mold
->expr_type
== EXPR_ARRAY
&& mold
->value
.constructor
)
8470 ? gfc_constructor_first (mold
->value
.constructor
)->expr
8473 /* Set result character length, if needed. Note that this needs to be
8474 set even for array expressions, in order to pass this information into
8475 gfc_target_interpret_expr. */
8476 if (result
->ts
.type
== BT_CHARACTER
&& gfc_is_constant_expr (mold_element
))
8478 result
->value
.character
.length
= mold_element
->value
.character
.length
;
8480 /* Let the typespec of the result inherit the string length.
8481 This is crucial if a resulting array has size zero. */
8482 if (mold_element
->ts
.u
.cl
->length
)
8483 result
->ts
.u
.cl
->length
= gfc_copy_expr (mold_element
->ts
.u
.cl
->length
);
8485 result
->ts
.u
.cl
->length
=
8486 gfc_get_int_expr (gfc_charlen_int_kind
, NULL
,
8487 mold_element
->value
.character
.length
);
8490 /* Set the number of elements in the result, and determine its size. */
8492 if (mold
->expr_type
== EXPR_ARRAY
|| mold
->rank
|| size
)
8494 result
->expr_type
= EXPR_ARRAY
;
8496 result
->shape
= gfc_get_shape (1);
8497 mpz_init_set_ui (result
->shape
[0], result_length
);
8502 /* Allocate the buffer to store the binary version of the source. */
8503 buffer_size
= MAX (source_size
, result_size
);
8504 buffer
= (unsigned char*)alloca (buffer_size
);
8505 memset (buffer
, 0, buffer_size
);
8507 /* Now write source to the buffer. */
8508 gfc_target_encode_expr (source
, buffer
, buffer_size
);
8510 /* And read the buffer back into the new expression. */
8511 gfc_target_interpret_expr (buffer
, buffer_size
, result
, false);
8518 gfc_simplify_transpose (gfc_expr
*matrix
)
8520 int row
, matrix_rows
, col
, matrix_cols
;
8523 if (!is_constant_array_expr (matrix
))
8526 gcc_assert (matrix
->rank
== 2);
8528 if (matrix
->shape
== NULL
)
8531 result
= gfc_get_array_expr (matrix
->ts
.type
, matrix
->ts
.kind
,
8534 result
->shape
= gfc_get_shape (result
->rank
);
8535 mpz_init_set (result
->shape
[0], matrix
->shape
[1]);
8536 mpz_init_set (result
->shape
[1], matrix
->shape
[0]);
8538 if (matrix
->ts
.type
== BT_CHARACTER
)
8539 result
->ts
.u
.cl
= matrix
->ts
.u
.cl
;
8540 else if (matrix
->ts
.type
== BT_DERIVED
)
8541 result
->ts
.u
.derived
= matrix
->ts
.u
.derived
;
8543 matrix_rows
= mpz_get_si (matrix
->shape
[0]);
8544 matrix_cols
= mpz_get_si (matrix
->shape
[1]);
8545 for (row
= 0; row
< matrix_rows
; ++row
)
8546 for (col
= 0; col
< matrix_cols
; ++col
)
8548 gfc_expr
*e
= gfc_constructor_lookup_expr (matrix
->value
.constructor
,
8549 col
* matrix_rows
+ row
);
8550 gfc_constructor_insert_expr (&result
->value
.constructor
,
8551 gfc_copy_expr (e
), &matrix
->where
,
8552 row
* matrix_cols
+ col
);
8560 gfc_simplify_trim (gfc_expr
*e
)
8563 int count
, i
, len
, lentrim
;
8565 if (e
->expr_type
!= EXPR_CONSTANT
)
8568 len
= e
->value
.character
.length
;
8569 for (count
= 0, i
= 1; i
<= len
; ++i
)
8571 if (e
->value
.character
.string
[len
- i
] == ' ')
8577 lentrim
= len
- count
;
8579 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, lentrim
);
8580 for (i
= 0; i
< lentrim
; i
++)
8581 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
];
8588 gfc_simplify_image_index (gfc_expr
*coarray
, gfc_expr
*sub
)
8593 gfc_constructor
*sub_cons
;
8597 if (!is_constant_array_expr (sub
))
8600 /* Follow any component references. */
8601 as
= coarray
->symtree
->n
.sym
->as
;
8602 for (ref
= coarray
->ref
; ref
; ref
= ref
->next
)
8603 if (ref
->type
== REF_COMPONENT
)
8606 if (!as
|| as
->type
== AS_DEFERRED
)
8609 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
8610 the cosubscript addresses the first image. */
8612 sub_cons
= gfc_constructor_first (sub
->value
.constructor
);
8615 for (d
= 1; d
<= as
->corank
; d
++)
8620 gcc_assert (sub_cons
!= NULL
);
8622 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 0, as
,
8624 if (ca_bound
== NULL
)
8627 if (ca_bound
== &gfc_bad_expr
)
8630 cmp
= mpz_cmp (ca_bound
->value
.integer
, sub_cons
->expr
->value
.integer
);
8634 gfc_free_expr (ca_bound
);
8635 sub_cons
= gfc_constructor_next (sub_cons
);
8639 first_image
= false;
8643 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
8644 "SUB has %ld and COARRAY lower bound is %ld)",
8646 mpz_get_si (sub_cons
->expr
->value
.integer
),
8647 mpz_get_si (ca_bound
->value
.integer
));
8648 gfc_free_expr (ca_bound
);
8649 return &gfc_bad_expr
;
8652 gfc_free_expr (ca_bound
);
8654 /* Check whether upperbound is valid for the multi-images case. */
8657 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 1, as
,
8659 if (ca_bound
== &gfc_bad_expr
)
8662 if (ca_bound
&& ca_bound
->expr_type
== EXPR_CONSTANT
8663 && mpz_cmp (ca_bound
->value
.integer
,
8664 sub_cons
->expr
->value
.integer
) < 0)
8666 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
8667 "SUB has %ld and COARRAY upper bound is %ld)",
8669 mpz_get_si (sub_cons
->expr
->value
.integer
),
8670 mpz_get_si (ca_bound
->value
.integer
));
8671 gfc_free_expr (ca_bound
);
8672 return &gfc_bad_expr
;
8676 gfc_free_expr (ca_bound
);
8679 sub_cons
= gfc_constructor_next (sub_cons
);
8682 gcc_assert (sub_cons
== NULL
);
8684 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
&& !first_image
)
8687 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
8688 &gfc_current_locus
);
8690 mpz_set_si (result
->value
.integer
, 1);
8692 mpz_set_si (result
->value
.integer
, 0);
8698 gfc_simplify_image_status (gfc_expr
*image
, gfc_expr
*team ATTRIBUTE_UNUSED
)
8700 if (flag_coarray
== GFC_FCOARRAY_NONE
)
8702 gfc_current_locus
= *gfc_current_intrinsic_where
;
8703 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
8704 return &gfc_bad_expr
;
8707 /* Simplification is possible for fcoarray = single only. For all other modes
8708 the result depends on runtime conditions. */
8709 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
)
8712 if (gfc_is_constant_expr (image
))
8715 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
8717 if (mpz_get_si (image
->value
.integer
) == 1)
8718 mpz_set_si (result
->value
.integer
, 0);
8720 mpz_set_si (result
->value
.integer
, GFC_STAT_STOPPED_IMAGE
);
8729 gfc_simplify_this_image (gfc_expr
*coarray
, gfc_expr
*dim
,
8730 gfc_expr
*distance ATTRIBUTE_UNUSED
)
8732 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
)
8735 /* If no coarray argument has been passed or when the first argument
8736 is actually a distance argument. */
8737 if (coarray
== NULL
|| !gfc_is_coarray (coarray
))
8740 /* FIXME: gfc_current_locus is wrong. */
8741 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
8742 &gfc_current_locus
);
8743 mpz_set_si (result
->value
.integer
, 1);
8747 /* For -fcoarray=single, this_image(A) is the same as lcobound(A). */
8748 return simplify_cobound (coarray
, dim
, NULL
, 0);
8753 gfc_simplify_ubound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
8755 return simplify_bound (array
, dim
, kind
, 1);
8759 gfc_simplify_ucobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
8761 return simplify_cobound (array
, dim
, kind
, 1);
8766 gfc_simplify_unpack (gfc_expr
*vector
, gfc_expr
*mask
, gfc_expr
*field
)
8768 gfc_expr
*result
, *e
;
8769 gfc_constructor
*vector_ctor
, *mask_ctor
, *field_ctor
;
8771 if (!is_constant_array_expr (vector
)
8772 || !is_constant_array_expr (mask
)
8773 || (!gfc_is_constant_expr (field
)
8774 && !is_constant_array_expr (field
)))
8777 result
= gfc_get_array_expr (vector
->ts
.type
, vector
->ts
.kind
,
8779 if (vector
->ts
.type
== BT_DERIVED
)
8780 result
->ts
.u
.derived
= vector
->ts
.u
.derived
;
8781 result
->rank
= mask
->rank
;
8782 result
->shape
= gfc_copy_shape (mask
->shape
, mask
->rank
);
8784 if (vector
->ts
.type
== BT_CHARACTER
)
8785 result
->ts
.u
.cl
= vector
->ts
.u
.cl
;
8787 vector_ctor
= gfc_constructor_first (vector
->value
.constructor
);
8788 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
8790 = field
->expr_type
== EXPR_ARRAY
8791 ? gfc_constructor_first (field
->value
.constructor
)
8796 if (mask_ctor
->expr
->value
.logical
)
8800 e
= gfc_copy_expr (vector_ctor
->expr
);
8801 vector_ctor
= gfc_constructor_next (vector_ctor
);
8805 gfc_free_expr (result
);
8809 else if (field
->expr_type
== EXPR_ARRAY
)
8812 e
= gfc_copy_expr (field_ctor
->expr
);
8815 /* Not enough elements in array FIELD. */
8816 gfc_free_expr (result
);
8817 return &gfc_bad_expr
;
8821 e
= gfc_copy_expr (field
);
8823 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
8825 mask_ctor
= gfc_constructor_next (mask_ctor
);
8826 field_ctor
= gfc_constructor_next (field_ctor
);
8834 gfc_simplify_verify (gfc_expr
*s
, gfc_expr
*set
, gfc_expr
*b
, gfc_expr
*kind
)
8838 size_t index
, len
, lenset
;
8840 int k
= get_kind (BT_INTEGER
, kind
, "VERIFY", gfc_default_integer_kind
);
8843 return &gfc_bad_expr
;
8845 if (s
->expr_type
!= EXPR_CONSTANT
|| set
->expr_type
!= EXPR_CONSTANT
8846 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
8849 if (b
!= NULL
&& b
->value
.logical
!= 0)
8854 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &s
->where
);
8856 len
= s
->value
.character
.length
;
8857 lenset
= set
->value
.character
.length
;
8861 mpz_set_ui (result
->value
.integer
, 0);
8869 mpz_set_ui (result
->value
.integer
, 1);
8873 index
= wide_strspn (s
->value
.character
.string
,
8874 set
->value
.character
.string
) + 1;
8883 mpz_set_ui (result
->value
.integer
, len
);
8886 for (index
= len
; index
> 0; index
--)
8888 for (i
= 0; i
< lenset
; i
++)
8890 if (s
->value
.character
.string
[index
- 1]
8891 == set
->value
.character
.string
[i
])
8899 mpz_set_ui (result
->value
.integer
, index
);
8905 gfc_simplify_xor (gfc_expr
*x
, gfc_expr
*y
)
8910 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
8913 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
8918 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
8919 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
8920 return range_check (result
, "XOR");
8923 return gfc_get_logical_expr (kind
, &x
->where
,
8924 (x
->value
.logical
&& !y
->value
.logical
)
8925 || (!x
->value
.logical
&& y
->value
.logical
));
8933 /****************** Constant simplification *****************/
8935 /* Master function to convert one constant to another. While this is
8936 used as a simplification function, it requires the destination type
8937 and kind information which is supplied by a special case in
8941 gfc_convert_constant (gfc_expr
*e
, bt type
, int kind
)
8943 gfc_expr
*result
, *(*f
) (gfc_expr
*, int);
8944 gfc_constructor
*c
, *t
;
8961 f
= gfc_int2complex
;
8984 f
= gfc_uint2complex
;
9007 f
= gfc_real2complex
;
9018 f
= gfc_complex2int
;
9021 f
= gfc_complex2uint
;
9024 f
= gfc_complex2real
;
9027 f
= gfc_complex2complex
;
9056 f
= gfc_hollerith2int
;
9059 /* Hollerith is for legacy code, we do not currently support
9060 converting this to UNSIGNED. */
9065 f
= gfc_hollerith2real
;
9069 f
= gfc_hollerith2complex
;
9073 f
= gfc_hollerith2character
;
9077 f
= gfc_hollerith2logical
;
9089 f
= gfc_character2int
;
9096 f
= gfc_character2real
;
9100 f
= gfc_character2complex
;
9104 f
= gfc_character2character
;
9108 f
= gfc_character2logical
;
9118 return &gfc_bad_expr
;
9123 switch (e
->expr_type
)
9126 result
= f (e
, kind
);
9128 return &gfc_bad_expr
;
9132 if (!gfc_is_constant_expr (e
))
9135 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
9136 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
9137 result
->rank
= e
->rank
;
9139 for (c
= gfc_constructor_first (e
->value
.constructor
);
9140 c
; c
= gfc_constructor_next (c
))
9143 if (c
->iterator
== NULL
)
9145 if (c
->expr
->expr_type
== EXPR_ARRAY
)
9146 tmp
= gfc_convert_constant (c
->expr
, type
, kind
);
9147 else if (c
->expr
->expr_type
== EXPR_OP
)
9149 if (!gfc_simplify_expr (c
->expr
, 1))
9150 return &gfc_bad_expr
;
9151 tmp
= f (c
->expr
, kind
);
9154 tmp
= f (c
->expr
, kind
);
9157 tmp
= gfc_convert_constant (c
->expr
, type
, kind
);
9159 if (tmp
== NULL
|| tmp
== &gfc_bad_expr
)
9161 gfc_free_expr (result
);
9165 t
= gfc_constructor_append_expr (&result
->value
.constructor
,
9168 t
->iterator
= gfc_copy_iterator (c
->iterator
);
9181 /* Function for converting character constants. */
9183 gfc_convert_char_constant (gfc_expr
*e
, bt type ATTRIBUTE_UNUSED
, int kind
)
9188 if (!gfc_is_constant_expr (e
))
9191 if (e
->expr_type
== EXPR_CONSTANT
)
9193 /* Simple case of a scalar. */
9194 result
= gfc_get_constant_expr (BT_CHARACTER
, kind
, &e
->where
);
9196 return &gfc_bad_expr
;
9198 result
->value
.character
.length
= e
->value
.character
.length
;
9199 result
->value
.character
.string
9200 = gfc_get_wide_string (e
->value
.character
.length
+ 1);
9201 memcpy (result
->value
.character
.string
, e
->value
.character
.string
,
9202 (e
->value
.character
.length
+ 1) * sizeof (gfc_char_t
));
9204 /* Check we only have values representable in the destination kind. */
9205 for (i
= 0; i
< result
->value
.character
.length
; i
++)
9206 if (!gfc_check_character_range (result
->value
.character
.string
[i
],
9209 gfc_error ("Character %qs in string at %L cannot be converted "
9210 "into character kind %d",
9211 gfc_print_wide_char (result
->value
.character
.string
[i
]),
9213 gfc_free_expr (result
);
9214 return &gfc_bad_expr
;
9219 else if (e
->expr_type
== EXPR_ARRAY
)
9221 /* For an array constructor, we convert each constructor element. */
9224 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
9225 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
9226 result
->rank
= e
->rank
;
9227 result
->ts
.u
.cl
= e
->ts
.u
.cl
;
9229 for (c
= gfc_constructor_first (e
->value
.constructor
);
9230 c
; c
= gfc_constructor_next (c
))
9232 gfc_expr
*tmp
= gfc_convert_char_constant (c
->expr
, type
, kind
);
9233 if (tmp
== &gfc_bad_expr
)
9235 gfc_free_expr (result
);
9236 return &gfc_bad_expr
;
9241 gfc_free_expr (result
);
9245 gfc_constructor_append_expr (&result
->value
.constructor
,
9257 gfc_simplify_compiler_options (void)
9262 str
= gfc_get_option_string ();
9263 result
= gfc_get_character_expr (gfc_default_character_kind
,
9264 &gfc_current_locus
, str
, strlen (str
));
9271 gfc_simplify_compiler_version (void)
9276 len
= strlen ("GCC version ") + strlen (version_string
);
9277 buffer
= XALLOCAVEC (char, len
+ 1);
9278 snprintf (buffer
, len
+ 1, "GCC version %s", version_string
);
9279 return gfc_get_character_expr (gfc_default_character_kind
,
9280 &gfc_current_locus
, buffer
, len
);
9283 /* Simplification routines for intrinsics of IEEE modules. */
9286 simplify_ieee_selected_real_kind (gfc_expr
*expr
)
9288 gfc_actual_arglist
*arg
;
9289 gfc_expr
*p
= NULL
, *q
= NULL
, *rdx
= NULL
;
9291 arg
= expr
->value
.function
.actual
;
9295 q
= arg
->next
->expr
;
9296 if (arg
->next
->next
)
9297 rdx
= arg
->next
->next
->expr
;
9300 /* Currently, if IEEE is supported and this module is built, it means
9301 all our floating-point types conform to IEEE. Hence, we simply handle
9302 IEEE_SELECTED_REAL_KIND like SELECTED_REAL_KIND. */
9303 return gfc_simplify_selected_real_kind (p
, q
, rdx
);
9307 simplify_ieee_support (gfc_expr
*expr
)
9309 /* We consider that if the IEEE modules are loaded, we have full support
9310 for flags, halting and rounding, which are the three functions
9311 (IEEE_SUPPORT_{FLAG,HALTING,ROUNDING}) allowed in constant
9312 expressions. One day, we will need libgfortran to detect support and
9313 communicate it back to us, allowing for partial support. */
9315 return gfc_get_logical_expr (gfc_default_logical_kind
, &expr
->where
,
9320 matches_ieee_function_name (gfc_symbol
*sym
, const char *name
)
9322 int n
= strlen(name
);
9324 if (!strncmp(sym
->name
, name
, n
))
9327 /* If a generic was used and renamed, we need more work to find out.
9328 Compare the specific name. */
9329 if (sym
->generic
&& !strncmp(sym
->generic
->sym
->name
, name
, n
))
9336 gfc_simplify_ieee_functions (gfc_expr
*expr
)
9338 gfc_symbol
* sym
= expr
->symtree
->n
.sym
;
9340 if (matches_ieee_function_name(sym
, "ieee_selected_real_kind"))
9341 return simplify_ieee_selected_real_kind (expr
);
9342 else if (matches_ieee_function_name(sym
, "ieee_support_flag")
9343 || matches_ieee_function_name(sym
, "ieee_support_halting")
9344 || matches_ieee_function_name(sym
, "ieee_support_rounding"))
9345 return simplify_ieee_support (expr
);