1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000-2018 Free Software Foundation, Inc.
3 Contributed by Andy Vaught & Katherine Holcomb
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
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 convert_mpz_to_unsigned (mpz_t x
, int bitsize
)
157 /* Confirm that no bits above the signed range are unset if we
158 are doing range checking. */
159 if (flag_range_check
!= 0)
160 gcc_assert (mpz_scan0 (x
, bitsize
-1) == ULONG_MAX
);
162 mpz_init_set_ui (mask
, 1);
163 mpz_mul_2exp (mask
, mask
, bitsize
);
164 mpz_sub_ui (mask
, mask
, 1);
166 mpz_and (x
, x
, mask
);
172 /* Confirm that no bits above the signed range are set. */
173 gcc_assert (mpz_scan1 (x
, bitsize
-1) == ULONG_MAX
);
178 /* Converts an mpz_t unsigned variable into a signed one, assuming
179 two's complement representations and a binary width of bitsize.
180 If the bitsize-1 bit is set, this is taken as a sign bit and
181 the number is converted to the corresponding negative number. */
184 gfc_convert_mpz_to_signed (mpz_t x
, int bitsize
)
188 /* Confirm that no bits above the unsigned range are set if we are
189 doing range checking. */
190 if (flag_range_check
!= 0)
191 gcc_assert (mpz_scan1 (x
, bitsize
) == ULONG_MAX
);
193 if (mpz_tstbit (x
, bitsize
- 1) == 1)
195 mpz_init_set_ui (mask
, 1);
196 mpz_mul_2exp (mask
, mask
, bitsize
);
197 mpz_sub_ui (mask
, mask
, 1);
199 /* We negate the number by hand, zeroing the high bits, that is
200 make it the corresponding positive number, and then have it
201 negated by GMP, giving the correct representation of the
204 mpz_add_ui (x
, x
, 1);
205 mpz_and (x
, x
, mask
);
214 /* In-place convert BOZ to REAL of the specified kind. */
217 convert_boz (gfc_expr
*x
, int kind
)
219 if (x
&& x
->ts
.type
== BT_INTEGER
&& x
->is_boz
)
226 if (!gfc_convert_boz (x
, &ts
))
227 return &gfc_bad_expr
;
234 /* Test that the expression is a constant array, simplifying if
235 we are dealing with a parameter array. */
238 is_constant_array_expr (gfc_expr
*e
)
245 if (e
->expr_type
== EXPR_VARIABLE
&& e
->rank
> 0
246 && e
->symtree
->n
.sym
->attr
.flavor
== FL_PARAMETER
)
247 gfc_simplify_expr (e
, 1);
249 if (e
->expr_type
!= EXPR_ARRAY
|| !gfc_is_constant_expr (e
))
252 for (c
= gfc_constructor_first (e
->value
.constructor
);
253 c
; c
= gfc_constructor_next (c
))
254 if (c
->expr
->expr_type
!= EXPR_CONSTANT
255 && c
->expr
->expr_type
!= EXPR_STRUCTURE
)
261 /* Test for a size zero array. */
263 gfc_is_size_zero_array (gfc_expr
*array
)
266 if (array
->rank
== 0)
269 if (array
->expr_type
== EXPR_VARIABLE
&& array
->rank
> 0
270 && array
->symtree
->n
.sym
->attr
.flavor
== FL_PARAMETER
271 && array
->shape
!= NULL
)
273 for (int i
= 0; i
< array
->rank
; i
++)
274 if (mpz_cmp_si (array
->shape
[i
], 0) <= 0)
280 if (array
->expr_type
== EXPR_ARRAY
)
281 return array
->value
.constructor
== NULL
;
287 /* Initialize a transformational result expression with a given value. */
290 init_result_expr (gfc_expr
*e
, int init
, gfc_expr
*array
)
292 if (e
&& e
->expr_type
== EXPR_ARRAY
)
294 gfc_constructor
*ctor
= gfc_constructor_first (e
->value
.constructor
);
297 init_result_expr (ctor
->expr
, init
, array
);
298 ctor
= gfc_constructor_next (ctor
);
301 else if (e
&& e
->expr_type
== EXPR_CONSTANT
)
303 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
304 HOST_WIDE_INT length
;
310 e
->value
.logical
= (init
? 1 : 0);
315 mpz_set (e
->value
.integer
, gfc_integer_kinds
[i
].min_int
);
316 else if (init
== INT_MAX
)
317 mpz_set (e
->value
.integer
, gfc_integer_kinds
[i
].huge
);
319 mpz_set_si (e
->value
.integer
, init
);
325 mpfr_set (e
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
326 mpfr_neg (e
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
328 else if (init
== INT_MAX
)
329 mpfr_set (e
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
331 mpfr_set_si (e
->value
.real
, init
, GFC_RND_MODE
);
335 mpc_set_si (e
->value
.complex, init
, GFC_MPC_RND_MODE
);
341 gfc_expr
*len
= gfc_simplify_len (array
, NULL
);
342 gfc_extract_hwi (len
, &length
);
343 string
= gfc_get_wide_string (length
+ 1);
344 gfc_wide_memset (string
, 0, length
);
346 else if (init
== INT_MAX
)
348 gfc_expr
*len
= gfc_simplify_len (array
, NULL
);
349 gfc_extract_hwi (len
, &length
);
350 string
= gfc_get_wide_string (length
+ 1);
351 gfc_wide_memset (string
, 255, length
);
356 string
= gfc_get_wide_string (1);
359 string
[length
] = '\0';
360 e
->value
.character
.length
= length
;
361 e
->value
.character
.string
= string
;
373 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul;
374 if conj_a is true, the matrix_a is complex conjugated. */
377 compute_dot_product (gfc_expr
*matrix_a
, int stride_a
, int offset_a
,
378 gfc_expr
*matrix_b
, int stride_b
, int offset_b
,
381 gfc_expr
*result
, *a
, *b
, *c
;
383 /* Set result to an INTEGER(1) 0 for numeric types and .false. for
384 LOGICAL. Mixed-mode math in the loop will promote result to the
385 correct type and kind. */
386 if (matrix_a
->ts
.type
== BT_LOGICAL
)
387 result
= gfc_get_logical_expr (gfc_default_logical_kind
, NULL
, false);
389 result
= gfc_get_int_expr (1, NULL
, 0);
390 result
->where
= matrix_a
->where
;
392 a
= gfc_constructor_lookup_expr (matrix_a
->value
.constructor
, offset_a
);
393 b
= gfc_constructor_lookup_expr (matrix_b
->value
.constructor
, offset_b
);
396 /* Copying of expressions is required as operands are free'd
397 by the gfc_arith routines. */
398 switch (result
->ts
.type
)
401 result
= gfc_or (result
,
402 gfc_and (gfc_copy_expr (a
),
409 if (conj_a
&& a
->ts
.type
== BT_COMPLEX
)
410 c
= gfc_simplify_conjg (a
);
412 c
= gfc_copy_expr (a
);
413 result
= gfc_add (result
, gfc_multiply (c
, gfc_copy_expr (b
)));
420 offset_a
+= stride_a
;
421 a
= gfc_constructor_lookup_expr (matrix_a
->value
.constructor
, offset_a
);
423 offset_b
+= stride_b
;
424 b
= gfc_constructor_lookup_expr (matrix_b
->value
.constructor
, offset_b
);
431 /* Build a result expression for transformational intrinsics,
435 transformational_result (gfc_expr
*array
, gfc_expr
*dim
, bt type
,
436 int kind
, locus
* where
)
441 if (!dim
|| array
->rank
== 1)
442 return gfc_get_constant_expr (type
, kind
, where
);
444 result
= gfc_get_array_expr (type
, kind
, where
);
445 result
->shape
= gfc_copy_shape_excluding (array
->shape
, array
->rank
, dim
);
446 result
->rank
= array
->rank
- 1;
448 /* gfc_array_size() would count the number of elements in the constructor,
449 we have not built those yet. */
451 for (i
= 0; i
< result
->rank
; ++i
)
452 nelem
*= mpz_get_ui (result
->shape
[i
]);
454 for (i
= 0; i
< nelem
; ++i
)
456 gfc_constructor_append_expr (&result
->value
.constructor
,
457 gfc_get_constant_expr (type
, kind
, where
),
465 typedef gfc_expr
* (*transformational_op
)(gfc_expr
*, gfc_expr
*);
467 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
468 of COUNT intrinsic is .TRUE..
470 Interface and implementation mimics arith functions as
471 gfc_add, gfc_multiply, etc. */
474 gfc_count (gfc_expr
*op1
, gfc_expr
*op2
)
478 gcc_assert (op1
->ts
.type
== BT_INTEGER
);
479 gcc_assert (op2
->ts
.type
== BT_LOGICAL
);
480 gcc_assert (op2
->value
.logical
);
482 result
= gfc_copy_expr (op1
);
483 mpz_add_ui (result
->value
.integer
, result
->value
.integer
, 1);
491 /* Transforms an ARRAY with operation OP, according to MASK, to a
492 scalar RESULT. E.g. called if
494 REAL, PARAMETER :: array(n, m) = ...
495 REAL, PARAMETER :: s = SUM(array)
497 where OP == gfc_add(). */
500 simplify_transformation_to_scalar (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*mask
,
501 transformational_op op
)
504 gfc_constructor
*array_ctor
, *mask_ctor
;
506 /* Shortcut for constant .FALSE. MASK. */
508 && mask
->expr_type
== EXPR_CONSTANT
509 && !mask
->value
.logical
)
512 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
514 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
515 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
519 a
= array_ctor
->expr
;
520 array_ctor
= gfc_constructor_next (array_ctor
);
522 /* A constant MASK equals .TRUE. here and can be ignored. */
526 mask_ctor
= gfc_constructor_next (mask_ctor
);
527 if (!m
->value
.logical
)
531 result
= op (result
, gfc_copy_expr (a
));
539 /* Transforms an ARRAY with operation OP, according to MASK, to an
540 array RESULT. E.g. called if
542 REAL, PARAMETER :: array(n, m) = ...
543 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
545 where OP == gfc_multiply().
546 The result might be post processed using post_op. */
549 simplify_transformation_to_array (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*dim
,
550 gfc_expr
*mask
, transformational_op op
,
551 transformational_op post_op
)
554 int done
, i
, n
, arraysize
, resultsize
, dim_index
, dim_extent
, dim_stride
;
555 gfc_expr
**arrayvec
, **resultvec
, **base
, **src
, **dest
;
556 gfc_constructor
*array_ctor
, *mask_ctor
, *result_ctor
;
558 int count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
559 sstride
[GFC_MAX_DIMENSIONS
], dstride
[GFC_MAX_DIMENSIONS
],
560 tmpstride
[GFC_MAX_DIMENSIONS
];
562 /* Shortcut for constant .FALSE. MASK. */
564 && mask
->expr_type
== EXPR_CONSTANT
565 && !mask
->value
.logical
)
568 /* Build an indexed table for array element expressions to minimize
569 linked-list traversal. Masked elements are set to NULL. */
570 gfc_array_size (array
, &size
);
571 arraysize
= mpz_get_ui (size
);
574 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
576 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
578 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
579 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
581 for (i
= 0; i
< arraysize
; ++i
)
583 arrayvec
[i
] = array_ctor
->expr
;
584 array_ctor
= gfc_constructor_next (array_ctor
);
588 if (!mask_ctor
->expr
->value
.logical
)
591 mask_ctor
= gfc_constructor_next (mask_ctor
);
595 /* Same for the result expression. */
596 gfc_array_size (result
, &size
);
597 resultsize
= mpz_get_ui (size
);
600 resultvec
= XCNEWVEC (gfc_expr
*, resultsize
);
601 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
602 for (i
= 0; i
< resultsize
; ++i
)
604 resultvec
[i
] = result_ctor
->expr
;
605 result_ctor
= gfc_constructor_next (result_ctor
);
608 gfc_extract_int (dim
, &dim_index
);
609 dim_index
-= 1; /* zero-base index */
613 for (i
= 0, n
= 0; i
< array
->rank
; ++i
)
616 tmpstride
[i
] = (i
== 0) ? 1 : tmpstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
619 dim_extent
= mpz_get_si (array
->shape
[i
]);
620 dim_stride
= tmpstride
[i
];
624 extent
[n
] = mpz_get_si (array
->shape
[i
]);
625 sstride
[n
] = tmpstride
[i
];
626 dstride
[n
] = (n
== 0) ? 1 : dstride
[n
-1] * extent
[n
-1];
630 done
= resultsize
<= 0;
635 for (src
= base
, n
= 0; n
< dim_extent
; src
+= dim_stride
, ++n
)
637 *dest
= op (*dest
, gfc_copy_expr (*src
));
644 while (!done
&& count
[n
] == extent
[n
])
647 base
-= sstride
[n
] * extent
[n
];
648 dest
-= dstride
[n
] * extent
[n
];
651 if (n
< result
->rank
)
653 /* If the nested loop is unrolled GFC_MAX_DIMENSIONS
654 times, we'd warn for the last iteration, because the
655 array index will have already been incremented to the
656 array sizes, and we can't tell that this must make
657 the test against result->rank false, because ranks
658 must not exceed GFC_MAX_DIMENSIONS. */
659 GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray
-bounds
)
670 /* Place updated expression in result constructor. */
671 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
672 for (i
= 0; i
< resultsize
; ++i
)
675 result_ctor
->expr
= post_op (result_ctor
->expr
, resultvec
[i
]);
677 result_ctor
->expr
= resultvec
[i
];
678 result_ctor
= gfc_constructor_next (result_ctor
);
688 simplify_transformation (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
,
689 int init_val
, transformational_op op
)
694 size_zero
= gfc_is_size_zero_array (array
);
696 if (!(is_constant_array_expr (array
) || size_zero
)
697 || !gfc_is_constant_expr (dim
))
701 && !is_constant_array_expr (mask
)
702 && mask
->expr_type
!= EXPR_CONSTANT
)
705 result
= transformational_result (array
, dim
, array
->ts
.type
,
706 array
->ts
.kind
, &array
->where
);
707 init_result_expr (result
, init_val
, array
);
712 return !dim
|| array
->rank
== 1 ?
713 simplify_transformation_to_scalar (result
, array
, mask
, op
) :
714 simplify_transformation_to_array (result
, array
, dim
, mask
, op
, NULL
);
718 /********************** Simplification functions *****************************/
721 gfc_simplify_abs (gfc_expr
*e
)
725 if (e
->expr_type
!= EXPR_CONSTANT
)
731 result
= gfc_get_constant_expr (BT_INTEGER
, e
->ts
.kind
, &e
->where
);
732 mpz_abs (result
->value
.integer
, e
->value
.integer
);
733 return range_check (result
, "IABS");
736 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
737 mpfr_abs (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
738 return range_check (result
, "ABS");
741 gfc_set_model_kind (e
->ts
.kind
);
742 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
743 mpc_abs (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
744 return range_check (result
, "CABS");
747 gfc_internal_error ("gfc_simplify_abs(): Bad type");
753 simplify_achar_char (gfc_expr
*e
, gfc_expr
*k
, const char *name
, bool ascii
)
757 bool too_large
= false;
759 if (e
->expr_type
!= EXPR_CONSTANT
)
762 kind
= get_kind (BT_CHARACTER
, k
, name
, gfc_default_character_kind
);
764 return &gfc_bad_expr
;
766 if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
768 gfc_error ("Argument of %s function at %L is negative", name
,
770 return &gfc_bad_expr
;
773 if (ascii
&& warn_surprising
&& mpz_cmp_si (e
->value
.integer
, 127) > 0)
774 gfc_warning (OPT_Wsurprising
,
775 "Argument of %s function at %L outside of range [0,127]",
778 if (kind
== 1 && mpz_cmp_si (e
->value
.integer
, 255) > 0)
783 mpz_init_set_ui (t
, 2);
784 mpz_pow_ui (t
, t
, 32);
785 mpz_sub_ui (t
, t
, 1);
786 if (mpz_cmp (e
->value
.integer
, t
) > 0)
793 gfc_error ("Argument of %s function at %L is too large for the "
794 "collating sequence of kind %d", name
, &e
->where
, kind
);
795 return &gfc_bad_expr
;
798 result
= gfc_get_character_expr (kind
, &e
->where
, NULL
, 1);
799 result
->value
.character
.string
[0] = mpz_get_ui (e
->value
.integer
);
806 /* We use the processor's collating sequence, because all
807 systems that gfortran currently works on are ASCII. */
810 gfc_simplify_achar (gfc_expr
*e
, gfc_expr
*k
)
812 return simplify_achar_char (e
, k
, "ACHAR", true);
817 gfc_simplify_acos (gfc_expr
*x
)
821 if (x
->expr_type
!= EXPR_CONSTANT
)
827 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
828 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
830 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
832 return &gfc_bad_expr
;
834 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
835 mpfr_acos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
839 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
840 mpc_acos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
844 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
847 return range_check (result
, "ACOS");
851 gfc_simplify_acosh (gfc_expr
*x
)
855 if (x
->expr_type
!= EXPR_CONSTANT
)
861 if (mpfr_cmp_si (x
->value
.real
, 1) < 0)
863 gfc_error ("Argument of ACOSH at %L must not be less than 1",
865 return &gfc_bad_expr
;
868 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
869 mpfr_acosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
873 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
874 mpc_acosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
878 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
881 return range_check (result
, "ACOSH");
885 gfc_simplify_adjustl (gfc_expr
*e
)
891 if (e
->expr_type
!= EXPR_CONSTANT
)
894 len
= e
->value
.character
.length
;
896 for (count
= 0, i
= 0; i
< len
; ++i
)
898 ch
= e
->value
.character
.string
[i
];
904 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, len
);
905 for (i
= 0; i
< len
- count
; ++i
)
906 result
->value
.character
.string
[i
] = e
->value
.character
.string
[count
+ i
];
913 gfc_simplify_adjustr (gfc_expr
*e
)
919 if (e
->expr_type
!= EXPR_CONSTANT
)
922 len
= e
->value
.character
.length
;
924 for (count
= 0, i
= len
- 1; i
>= 0; --i
)
926 ch
= e
->value
.character
.string
[i
];
932 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, len
);
933 for (i
= 0; i
< count
; ++i
)
934 result
->value
.character
.string
[i
] = ' ';
936 for (i
= count
; i
< len
; ++i
)
937 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
- count
];
944 gfc_simplify_aimag (gfc_expr
*e
)
948 if (e
->expr_type
!= EXPR_CONSTANT
)
951 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
952 mpfr_set (result
->value
.real
, mpc_imagref (e
->value
.complex), GFC_RND_MODE
);
954 return range_check (result
, "AIMAG");
959 gfc_simplify_aint (gfc_expr
*e
, gfc_expr
*k
)
961 gfc_expr
*rtrunc
, *result
;
964 kind
= get_kind (BT_REAL
, k
, "AINT", e
->ts
.kind
);
966 return &gfc_bad_expr
;
968 if (e
->expr_type
!= EXPR_CONSTANT
)
971 rtrunc
= gfc_copy_expr (e
);
972 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
974 result
= gfc_real2real (rtrunc
, kind
);
976 gfc_free_expr (rtrunc
);
978 return range_check (result
, "AINT");
983 gfc_simplify_all (gfc_expr
*mask
, gfc_expr
*dim
)
985 return simplify_transformation (mask
, dim
, NULL
, true, gfc_and
);
990 gfc_simplify_dint (gfc_expr
*e
)
992 gfc_expr
*rtrunc
, *result
;
994 if (e
->expr_type
!= EXPR_CONSTANT
)
997 rtrunc
= gfc_copy_expr (e
);
998 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
1000 result
= gfc_real2real (rtrunc
, gfc_default_double_kind
);
1002 gfc_free_expr (rtrunc
);
1004 return range_check (result
, "DINT");
1009 gfc_simplify_dreal (gfc_expr
*e
)
1011 gfc_expr
*result
= NULL
;
1013 if (e
->expr_type
!= EXPR_CONSTANT
)
1016 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
1017 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
1019 return range_check (result
, "DREAL");
1024 gfc_simplify_anint (gfc_expr
*e
, gfc_expr
*k
)
1029 kind
= get_kind (BT_REAL
, k
, "ANINT", e
->ts
.kind
);
1031 return &gfc_bad_expr
;
1033 if (e
->expr_type
!= EXPR_CONSTANT
)
1036 result
= gfc_get_constant_expr (e
->ts
.type
, kind
, &e
->where
);
1037 mpfr_round (result
->value
.real
, e
->value
.real
);
1039 return range_check (result
, "ANINT");
1044 gfc_simplify_and (gfc_expr
*x
, gfc_expr
*y
)
1049 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1052 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
1057 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
1058 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
1059 return range_check (result
, "AND");
1062 return gfc_get_logical_expr (kind
, &x
->where
,
1063 x
->value
.logical
&& y
->value
.logical
);
1072 gfc_simplify_any (gfc_expr
*mask
, gfc_expr
*dim
)
1074 return simplify_transformation (mask
, dim
, NULL
, false, gfc_or
);
1079 gfc_simplify_dnint (gfc_expr
*e
)
1083 if (e
->expr_type
!= EXPR_CONSTANT
)
1086 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &e
->where
);
1087 mpfr_round (result
->value
.real
, e
->value
.real
);
1089 return range_check (result
, "DNINT");
1094 gfc_simplify_asin (gfc_expr
*x
)
1098 if (x
->expr_type
!= EXPR_CONSTANT
)
1104 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
1105 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
1107 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1109 return &gfc_bad_expr
;
1111 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1112 mpfr_asin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1116 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1117 mpc_asin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1121 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1124 return range_check (result
, "ASIN");
1129 gfc_simplify_asinh (gfc_expr
*x
)
1133 if (x
->expr_type
!= EXPR_CONSTANT
)
1136 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1141 mpfr_asinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1145 mpc_asinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1149 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1152 return range_check (result
, "ASINH");
1157 gfc_simplify_atan (gfc_expr
*x
)
1161 if (x
->expr_type
!= EXPR_CONSTANT
)
1164 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1169 mpfr_atan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1173 mpc_atan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1177 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1180 return range_check (result
, "ATAN");
1185 gfc_simplify_atanh (gfc_expr
*x
)
1189 if (x
->expr_type
!= EXPR_CONSTANT
)
1195 if (mpfr_cmp_si (x
->value
.real
, 1) >= 0
1196 || mpfr_cmp_si (x
->value
.real
, -1) <= 0)
1198 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1200 return &gfc_bad_expr
;
1202 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1203 mpfr_atanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1207 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1208 mpc_atanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1212 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1215 return range_check (result
, "ATANH");
1220 gfc_simplify_atan2 (gfc_expr
*y
, gfc_expr
*x
)
1224 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1227 if (mpfr_zero_p (y
->value
.real
) && mpfr_zero_p (x
->value
.real
))
1229 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1230 "second argument must not be zero", &x
->where
);
1231 return &gfc_bad_expr
;
1234 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1235 mpfr_atan2 (result
->value
.real
, y
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1237 return range_check (result
, "ATAN2");
1242 gfc_simplify_bessel_j0 (gfc_expr
*x
)
1246 if (x
->expr_type
!= EXPR_CONSTANT
)
1249 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1250 mpfr_j0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1252 return range_check (result
, "BESSEL_J0");
1257 gfc_simplify_bessel_j1 (gfc_expr
*x
)
1261 if (x
->expr_type
!= EXPR_CONSTANT
)
1264 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1265 mpfr_j1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1267 return range_check (result
, "BESSEL_J1");
1272 gfc_simplify_bessel_jn (gfc_expr
*order
, gfc_expr
*x
)
1277 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1280 n
= mpz_get_si (order
->value
.integer
);
1281 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1282 mpfr_jn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1284 return range_check (result
, "BESSEL_JN");
1288 /* Simplify transformational form of JN and YN. */
1291 gfc_simplify_bessel_n2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
,
1298 mpfr_t x2rev
, last1
, last2
;
1300 if (x
->expr_type
!= EXPR_CONSTANT
|| order1
->expr_type
!= EXPR_CONSTANT
1301 || order2
->expr_type
!= EXPR_CONSTANT
)
1304 n1
= mpz_get_si (order1
->value
.integer
);
1305 n2
= mpz_get_si (order2
->value
.integer
);
1306 result
= gfc_get_array_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1308 result
->shape
= gfc_get_shape (1);
1309 mpz_init_set_ui (result
->shape
[0], MAX (n2
-n1
+1, 0));
1314 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1315 YN(N, 0.0) = -Inf. */
1317 if (mpfr_cmp_ui (x
->value
.real
, 0.0) == 0)
1319 if (!jn
&& flag_range_check
)
1321 gfc_error ("Result of BESSEL_YN is -INF at %L", &result
->where
);
1322 gfc_free_expr (result
);
1323 return &gfc_bad_expr
;
1328 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1329 mpfr_set_ui (e
->value
.real
, 1, GFC_RND_MODE
);
1330 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1335 for (i
= n1
; i
<= n2
; i
++)
1337 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1339 mpfr_set_ui (e
->value
.real
, 0, GFC_RND_MODE
);
1341 mpfr_set_inf (e
->value
.real
, -1);
1342 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1349 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1350 are stable for downward recursion and Neumann functions are stable
1351 for upward recursion. It is
1353 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1354 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1355 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1357 gfc_set_model_kind (x
->ts
.kind
);
1359 /* Get first recursion anchor. */
1363 mpfr_jn (last1
, n2
, x
->value
.real
, GFC_RND_MODE
);
1365 mpfr_yn (last1
, n1
, x
->value
.real
, GFC_RND_MODE
);
1367 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1368 mpfr_set (e
->value
.real
, last1
, GFC_RND_MODE
);
1369 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1373 gfc_free_expr (result
);
1374 return &gfc_bad_expr
;
1376 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1384 /* Get second recursion anchor. */
1388 mpfr_jn (last2
, n2
-1, x
->value
.real
, GFC_RND_MODE
);
1390 mpfr_yn (last2
, n1
+1, x
->value
.real
, GFC_RND_MODE
);
1392 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1393 mpfr_set (e
->value
.real
, last2
, GFC_RND_MODE
);
1394 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1399 gfc_free_expr (result
);
1400 return &gfc_bad_expr
;
1403 gfc_constructor_insert_expr (&result
->value
.constructor
, e
, &x
->where
, -2);
1405 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1414 /* Start actual recursion. */
1417 mpfr_ui_div (x2rev
, 2, x
->value
.real
, GFC_RND_MODE
);
1419 for (i
= 2; i
<= n2
-n1
; i
++)
1421 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1423 /* Special case: For YN, if the previous N gave -INF, set
1424 also N+1 to -INF. */
1425 if (!jn
&& !flag_range_check
&& mpfr_inf_p (last2
))
1427 mpfr_set_inf (e
->value
.real
, -1);
1428 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1433 mpfr_mul_si (e
->value
.real
, x2rev
, jn
? (n2
-i
+1) : (n1
+i
-1),
1435 mpfr_mul (e
->value
.real
, e
->value
.real
, last2
, GFC_RND_MODE
);
1436 mpfr_sub (e
->value
.real
, e
->value
.real
, last1
, GFC_RND_MODE
);
1438 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1440 /* Range_check frees "e" in that case. */
1446 gfc_constructor_insert_expr (&result
->value
.constructor
, e
, &x
->where
,
1449 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1451 mpfr_set (last1
, last2
, GFC_RND_MODE
);
1452 mpfr_set (last2
, e
->value
.real
, GFC_RND_MODE
);
1465 gfc_free_expr (result
);
1466 return &gfc_bad_expr
;
1471 gfc_simplify_bessel_jn2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
)
1473 return gfc_simplify_bessel_n2 (order1
, order2
, x
, true);
1478 gfc_simplify_bessel_y0 (gfc_expr
*x
)
1482 if (x
->expr_type
!= EXPR_CONSTANT
)
1485 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1486 mpfr_y0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1488 return range_check (result
, "BESSEL_Y0");
1493 gfc_simplify_bessel_y1 (gfc_expr
*x
)
1497 if (x
->expr_type
!= EXPR_CONSTANT
)
1500 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1501 mpfr_y1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1503 return range_check (result
, "BESSEL_Y1");
1508 gfc_simplify_bessel_yn (gfc_expr
*order
, gfc_expr
*x
)
1513 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1516 n
= mpz_get_si (order
->value
.integer
);
1517 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1518 mpfr_yn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1520 return range_check (result
, "BESSEL_YN");
1525 gfc_simplify_bessel_yn2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
)
1527 return gfc_simplify_bessel_n2 (order1
, order2
, x
, false);
1532 gfc_simplify_bit_size (gfc_expr
*e
)
1534 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
1535 return gfc_get_int_expr (e
->ts
.kind
, &e
->where
,
1536 gfc_integer_kinds
[i
].bit_size
);
1541 gfc_simplify_btest (gfc_expr
*e
, gfc_expr
*bit
)
1545 if (e
->expr_type
!= EXPR_CONSTANT
|| bit
->expr_type
!= EXPR_CONSTANT
)
1548 if (gfc_extract_int (bit
, &b
) || b
< 0)
1549 return gfc_get_logical_expr (gfc_default_logical_kind
, &e
->where
, false);
1551 return gfc_get_logical_expr (gfc_default_logical_kind
, &e
->where
,
1552 mpz_tstbit (e
->value
.integer
, b
));
1557 compare_bitwise (gfc_expr
*i
, gfc_expr
*j
)
1562 gcc_assert (i
->ts
.type
== BT_INTEGER
);
1563 gcc_assert (j
->ts
.type
== BT_INTEGER
);
1565 mpz_init_set (x
, i
->value
.integer
);
1566 k
= gfc_validate_kind (i
->ts
.type
, i
->ts
.kind
, false);
1567 convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
1569 mpz_init_set (y
, j
->value
.integer
);
1570 k
= gfc_validate_kind (j
->ts
.type
, j
->ts
.kind
, false);
1571 convert_mpz_to_unsigned (y
, gfc_integer_kinds
[k
].bit_size
);
1573 res
= mpz_cmp (x
, y
);
1581 gfc_simplify_bge (gfc_expr
*i
, gfc_expr
*j
)
1583 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1586 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1587 compare_bitwise (i
, j
) >= 0);
1592 gfc_simplify_bgt (gfc_expr
*i
, gfc_expr
*j
)
1594 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1597 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1598 compare_bitwise (i
, j
) > 0);
1603 gfc_simplify_ble (gfc_expr
*i
, gfc_expr
*j
)
1605 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1608 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1609 compare_bitwise (i
, j
) <= 0);
1614 gfc_simplify_blt (gfc_expr
*i
, gfc_expr
*j
)
1616 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1619 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1620 compare_bitwise (i
, j
) < 0);
1625 gfc_simplify_ceiling (gfc_expr
*e
, gfc_expr
*k
)
1627 gfc_expr
*ceil
, *result
;
1630 kind
= get_kind (BT_INTEGER
, k
, "CEILING", gfc_default_integer_kind
);
1632 return &gfc_bad_expr
;
1634 if (e
->expr_type
!= EXPR_CONSTANT
)
1637 ceil
= gfc_copy_expr (e
);
1638 mpfr_ceil (ceil
->value
.real
, e
->value
.real
);
1640 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
1641 gfc_mpfr_to_mpz (result
->value
.integer
, ceil
->value
.real
, &e
->where
);
1643 gfc_free_expr (ceil
);
1645 return range_check (result
, "CEILING");
1650 gfc_simplify_char (gfc_expr
*e
, gfc_expr
*k
)
1652 return simplify_achar_char (e
, k
, "CHAR", false);
1656 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1659 simplify_cmplx (const char *name
, gfc_expr
*x
, gfc_expr
*y
, int kind
)
1663 if (convert_boz (x
, kind
) == &gfc_bad_expr
)
1664 return &gfc_bad_expr
;
1666 if (convert_boz (y
, kind
) == &gfc_bad_expr
)
1667 return &gfc_bad_expr
;
1669 if (x
->expr_type
!= EXPR_CONSTANT
1670 || (y
!= NULL
&& y
->expr_type
!= EXPR_CONSTANT
))
1673 result
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &x
->where
);
1678 mpc_set_z (result
->value
.complex, x
->value
.integer
, GFC_MPC_RND_MODE
);
1682 mpc_set_fr (result
->value
.complex, x
->value
.real
, GFC_RND_MODE
);
1686 mpc_set (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1690 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1694 return range_check (result
, name
);
1699 mpfr_set_z (mpc_imagref (result
->value
.complex),
1700 y
->value
.integer
, GFC_RND_MODE
);
1704 mpfr_set (mpc_imagref (result
->value
.complex),
1705 y
->value
.real
, GFC_RND_MODE
);
1709 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1712 return range_check (result
, name
);
1717 gfc_simplify_cmplx (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*k
)
1721 kind
= get_kind (BT_REAL
, k
, "CMPLX", gfc_default_complex_kind
);
1723 return &gfc_bad_expr
;
1725 return simplify_cmplx ("CMPLX", x
, y
, kind
);
1730 gfc_simplify_complex (gfc_expr
*x
, gfc_expr
*y
)
1734 if (x
->ts
.type
== BT_INTEGER
&& y
->ts
.type
== BT_INTEGER
)
1735 kind
= gfc_default_complex_kind
;
1736 else if (x
->ts
.type
== BT_REAL
|| y
->ts
.type
== BT_INTEGER
)
1738 else if (x
->ts
.type
== BT_INTEGER
|| y
->ts
.type
== BT_REAL
)
1740 else if (x
->ts
.type
== BT_REAL
&& y
->ts
.type
== BT_REAL
)
1741 kind
= (x
->ts
.kind
> y
->ts
.kind
) ? x
->ts
.kind
: y
->ts
.kind
;
1745 return simplify_cmplx ("COMPLEX", x
, y
, kind
);
1750 gfc_simplify_conjg (gfc_expr
*e
)
1754 if (e
->expr_type
!= EXPR_CONSTANT
)
1757 result
= gfc_copy_expr (e
);
1758 mpc_conj (result
->value
.complex, result
->value
.complex, GFC_MPC_RND_MODE
);
1760 return range_check (result
, "CONJG");
1763 /* Return the simplification of the constant expression in icall, or NULL
1764 if the expression is not constant. */
1767 simplify_trig_call (gfc_expr
*icall
)
1769 gfc_isym_id func
= icall
->value
.function
.isym
->id
;
1770 gfc_expr
*x
= icall
->value
.function
.actual
->expr
;
1772 /* The actual simplifiers will return NULL for non-constant x. */
1776 return gfc_simplify_acos (x
);
1778 return gfc_simplify_asin (x
);
1780 return gfc_simplify_atan (x
);
1782 return gfc_simplify_cos (x
);
1783 case GFC_ISYM_COTAN
:
1784 return gfc_simplify_cotan (x
);
1786 return gfc_simplify_sin (x
);
1788 return gfc_simplify_tan (x
);
1790 gfc_internal_error ("in simplify_trig_call(): Bad intrinsic");
1794 /* Convert a floating-point number from radians to degrees. */
1797 degrees_f (mpfr_t x
, mp_rnd_t rnd_mode
)
1802 /* Set x = x % 2pi to avoid offsets with large angles. */
1803 mpfr_const_pi (tmp
, rnd_mode
);
1804 mpfr_mul_ui (tmp
, tmp
, 2, rnd_mode
);
1805 mpfr_fmod (tmp
, x
, tmp
, rnd_mode
);
1807 /* Set x = x * 180. */
1808 mpfr_mul_ui (x
, x
, 180, rnd_mode
);
1810 /* Set x = x / pi. */
1811 mpfr_const_pi (tmp
, rnd_mode
);
1812 mpfr_div (x
, x
, tmp
, rnd_mode
);
1817 /* Convert a floating-point number from degrees to radians. */
1820 radians_f (mpfr_t x
, mp_rnd_t rnd_mode
)
1825 /* Set x = x % 360 to avoid offsets with large angles. */
1826 mpfr_set_ui (tmp
, 360, rnd_mode
);
1827 mpfr_fmod (tmp
, x
, tmp
, rnd_mode
);
1829 /* Set x = x * pi. */
1830 mpfr_const_pi (tmp
, rnd_mode
);
1831 mpfr_mul (x
, x
, tmp
, rnd_mode
);
1833 /* Set x = x / 180. */
1834 mpfr_div_ui (x
, x
, 180, rnd_mode
);
1840 /* Convert argument to radians before calling a trig function. */
1843 gfc_simplify_trigd (gfc_expr
*icall
)
1847 arg
= icall
->value
.function
.actual
->expr
;
1849 if (arg
->ts
.type
!= BT_REAL
)
1850 gfc_internal_error ("in gfc_simplify_trigd(): Bad type");
1852 if (arg
->expr_type
== EXPR_CONSTANT
)
1853 /* Convert constant to radians before passing off to simplifier. */
1854 radians_f (arg
->value
.real
, GFC_RND_MODE
);
1856 /* Let the usual simplifier take over - we just simplified the arg. */
1857 return simplify_trig_call (icall
);
1860 /* Convert result of an inverse trig function to degrees. */
1863 gfc_simplify_atrigd (gfc_expr
*icall
)
1867 if (icall
->value
.function
.actual
->expr
->ts
.type
!= BT_REAL
)
1868 gfc_internal_error ("in gfc_simplify_atrigd(): Bad type");
1870 /* See if another simplifier has work to do first. */
1871 result
= simplify_trig_call (icall
);
1873 if (result
&& result
->expr_type
== EXPR_CONSTANT
)
1875 /* Convert constant to degrees after passing off to actual simplifier. */
1876 degrees_f (result
->value
.real
, GFC_RND_MODE
);
1880 /* Let gfc_resolve_atrigd take care of the non-constant case. */
1884 /* Convert the result of atan2 to degrees. */
1887 gfc_simplify_atan2d (gfc_expr
*y
, gfc_expr
*x
)
1891 if (x
->ts
.type
!= BT_REAL
|| y
->ts
.type
!= BT_REAL
)
1892 gfc_internal_error ("in gfc_simplify_atan2d(): Bad type");
1894 if (x
->expr_type
== EXPR_CONSTANT
&& y
->expr_type
== EXPR_CONSTANT
)
1896 result
= gfc_simplify_atan2 (y
, x
);
1899 degrees_f (result
->value
.real
, GFC_RND_MODE
);
1904 /* Let gfc_resolve_atan2d take care of the non-constant case. */
1909 gfc_simplify_cos (gfc_expr
*x
)
1913 if (x
->expr_type
!= EXPR_CONSTANT
)
1916 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1921 mpfr_cos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1925 gfc_set_model_kind (x
->ts
.kind
);
1926 mpc_cos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1930 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1933 return range_check (result
, "COS");
1938 gfc_simplify_cosh (gfc_expr
*x
)
1942 if (x
->expr_type
!= EXPR_CONSTANT
)
1945 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1950 mpfr_cosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1954 mpc_cosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1961 return range_check (result
, "COSH");
1966 gfc_simplify_count (gfc_expr
*mask
, gfc_expr
*dim
, gfc_expr
*kind
)
1971 size_zero
= gfc_is_size_zero_array (mask
);
1973 if (!(is_constant_array_expr (mask
) || size_zero
)
1974 || !gfc_is_constant_expr (dim
)
1975 || !gfc_is_constant_expr (kind
))
1978 result
= transformational_result (mask
, dim
,
1980 get_kind (BT_INTEGER
, kind
, "COUNT",
1981 gfc_default_integer_kind
),
1984 init_result_expr (result
, 0, NULL
);
1989 /* Passing MASK twice, once as data array, once as mask.
1990 Whenever gfc_count is called, '1' is added to the result. */
1991 return !dim
|| mask
->rank
== 1 ?
1992 simplify_transformation_to_scalar (result
, mask
, mask
, gfc_count
) :
1993 simplify_transformation_to_array (result
, mask
, dim
, mask
, gfc_count
, NULL
);
1996 /* Simplification routine for cshift. This works by copying the array
1997 expressions into a one-dimensional array, shuffling the values into another
1998 one-dimensional array and creating the new array expression from this. The
1999 shuffling part is basically taken from the library routine. */
2002 gfc_simplify_cshift (gfc_expr
*array
, gfc_expr
*shift
, gfc_expr
*dim
)
2006 gfc_expr
**arrayvec
, **resultvec
;
2007 gfc_expr
**rptr
, **sptr
;
2009 size_t arraysize
, shiftsize
, i
;
2010 gfc_constructor
*array_ctor
, *shift_ctor
;
2011 ssize_t
*shiftvec
, *hptr
;
2012 ssize_t shift_val
, len
;
2013 ssize_t count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
2014 hs_ex
[GFC_MAX_DIMENSIONS
],
2015 hstride
[GFC_MAX_DIMENSIONS
], sstride
[GFC_MAX_DIMENSIONS
],
2016 a_extent
[GFC_MAX_DIMENSIONS
], a_stride
[GFC_MAX_DIMENSIONS
],
2017 h_extent
[GFC_MAX_DIMENSIONS
],
2018 ss_ex
[GFC_MAX_DIMENSIONS
];
2022 gfc_expr
**src
, **dest
;
2024 if (!is_constant_array_expr (array
))
2027 if (shift
->rank
> 0)
2028 gfc_simplify_expr (shift
, 1);
2030 if (!gfc_is_constant_expr (shift
))
2033 /* Make dim zero-based. */
2036 if (!gfc_is_constant_expr (dim
))
2038 which
= mpz_get_si (dim
->value
.integer
) - 1;
2043 gfc_array_size (array
, &size
);
2044 arraysize
= mpz_get_ui (size
);
2047 result
= gfc_get_array_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
2048 result
->shape
= gfc_copy_shape (array
->shape
, array
->rank
);
2049 result
->rank
= array
->rank
;
2050 result
->ts
.u
.derived
= array
->ts
.u
.derived
;
2055 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
2056 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
2057 for (i
= 0; i
< arraysize
; i
++)
2059 arrayvec
[i
] = array_ctor
->expr
;
2060 array_ctor
= gfc_constructor_next (array_ctor
);
2063 resultvec
= XCNEWVEC (gfc_expr
*, arraysize
);
2068 for (d
=0; d
< array
->rank
; d
++)
2070 a_extent
[d
] = mpz_get_si (array
->shape
[d
]);
2071 a_stride
[d
] = d
== 0 ? 1 : a_stride
[d
-1] * a_extent
[d
-1];
2074 if (shift
->rank
> 0)
2076 gfc_array_size (shift
, &size
);
2077 shiftsize
= mpz_get_ui (size
);
2079 shiftvec
= XCNEWVEC (ssize_t
, shiftsize
);
2080 shift_ctor
= gfc_constructor_first (shift
->value
.constructor
);
2081 for (d
= 0; d
< shift
->rank
; d
++)
2083 h_extent
[d
] = mpz_get_si (shift
->shape
[d
]);
2084 hstride
[d
] = d
== 0 ? 1 : hstride
[d
-1] * h_extent
[d
-1];
2090 /* Shut up compiler */
2095 for (d
=0; d
< array
->rank
; d
++)
2099 rsoffset
= a_stride
[d
];
2105 extent
[n
] = a_extent
[d
];
2106 sstride
[n
] = a_stride
[d
];
2107 ss_ex
[n
] = sstride
[n
] * extent
[n
];
2109 hs_ex
[n
] = hstride
[n
] * extent
[n
];
2116 for (i
= 0; i
< shiftsize
; i
++)
2119 val
= mpz_get_si (shift_ctor
->expr
->value
.integer
);
2124 shift_ctor
= gfc_constructor_next (shift_ctor
);
2130 shift_val
= mpz_get_si (shift
->value
.integer
);
2131 shift_val
= shift_val
% len
;
2136 continue_loop
= true;
2142 while (continue_loop
)
2150 src
= &sptr
[sh
* rsoffset
];
2152 for (n
= 0; n
< len
- sh
; n
++)
2159 for ( n
= 0; n
< sh
; n
++)
2171 while (count
[n
] == extent
[n
])
2181 continue_loop
= false;
2195 for (i
= 0; i
< arraysize
; i
++)
2197 gfc_constructor_append_expr (&result
->value
.constructor
,
2198 gfc_copy_expr (resultvec
[i
]),
2206 gfc_simplify_dcmplx (gfc_expr
*x
, gfc_expr
*y
)
2208 return simplify_cmplx ("DCMPLX", x
, y
, gfc_default_double_kind
);
2213 gfc_simplify_dble (gfc_expr
*e
)
2215 gfc_expr
*result
= NULL
;
2217 if (e
->expr_type
!= EXPR_CONSTANT
)
2220 if (convert_boz (e
, gfc_default_double_kind
) == &gfc_bad_expr
)
2221 return &gfc_bad_expr
;
2223 result
= gfc_convert_constant (e
, BT_REAL
, gfc_default_double_kind
);
2224 if (result
== &gfc_bad_expr
)
2225 return &gfc_bad_expr
;
2227 return range_check (result
, "DBLE");
2232 gfc_simplify_digits (gfc_expr
*x
)
2236 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2241 digits
= gfc_integer_kinds
[i
].digits
;
2246 digits
= gfc_real_kinds
[i
].digits
;
2253 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, digits
);
2258 gfc_simplify_dim (gfc_expr
*x
, gfc_expr
*y
)
2263 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2266 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
2267 result
= gfc_get_constant_expr (x
->ts
.type
, kind
, &x
->where
);
2272 if (mpz_cmp (x
->value
.integer
, y
->value
.integer
) > 0)
2273 mpz_sub (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2275 mpz_set_ui (result
->value
.integer
, 0);
2280 if (mpfr_cmp (x
->value
.real
, y
->value
.real
) > 0)
2281 mpfr_sub (result
->value
.real
, x
->value
.real
, y
->value
.real
,
2284 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
2289 gfc_internal_error ("gfc_simplify_dim(): Bad type");
2292 return range_check (result
, "DIM");
2297 gfc_simplify_dot_product (gfc_expr
*vector_a
, gfc_expr
*vector_b
)
2299 /* If vector_a is a zero-sized array, the result is 0 for INTEGER,
2300 REAL, and COMPLEX types and .false. for LOGICAL. */
2301 if (vector_a
->shape
&& mpz_get_si (vector_a
->shape
[0]) == 0)
2303 if (vector_a
->ts
.type
== BT_LOGICAL
)
2304 return gfc_get_logical_expr (gfc_default_logical_kind
, NULL
, false);
2306 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, 0);
2309 if (!is_constant_array_expr (vector_a
)
2310 || !is_constant_array_expr (vector_b
))
2313 return compute_dot_product (vector_a
, 1, 0, vector_b
, 1, 0, true);
2318 gfc_simplify_dprod (gfc_expr
*x
, gfc_expr
*y
)
2320 gfc_expr
*a1
, *a2
, *result
;
2322 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2325 a1
= gfc_real2real (x
, gfc_default_double_kind
);
2326 a2
= gfc_real2real (y
, gfc_default_double_kind
);
2328 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &x
->where
);
2329 mpfr_mul (result
->value
.real
, a1
->value
.real
, a2
->value
.real
, GFC_RND_MODE
);
2334 return range_check (result
, "DPROD");
2339 simplify_dshift (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
,
2343 int i
, k
, size
, shift
;
2345 if (arg1
->expr_type
!= EXPR_CONSTANT
|| arg2
->expr_type
!= EXPR_CONSTANT
2346 || shiftarg
->expr_type
!= EXPR_CONSTANT
)
2349 k
= gfc_validate_kind (BT_INTEGER
, arg1
->ts
.kind
, false);
2350 size
= gfc_integer_kinds
[k
].bit_size
;
2352 gfc_extract_int (shiftarg
, &shift
);
2354 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */
2356 shift
= size
- shift
;
2358 result
= gfc_get_constant_expr (BT_INTEGER
, arg1
->ts
.kind
, &arg1
->where
);
2359 mpz_set_ui (result
->value
.integer
, 0);
2361 for (i
= 0; i
< shift
; i
++)
2362 if (mpz_tstbit (arg2
->value
.integer
, size
- shift
+ i
))
2363 mpz_setbit (result
->value
.integer
, i
);
2365 for (i
= 0; i
< size
- shift
; i
++)
2366 if (mpz_tstbit (arg1
->value
.integer
, i
))
2367 mpz_setbit (result
->value
.integer
, shift
+ i
);
2369 /* Convert to a signed value. */
2370 gfc_convert_mpz_to_signed (result
->value
.integer
, size
);
2377 gfc_simplify_dshiftr (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
2379 return simplify_dshift (arg1
, arg2
, shiftarg
, true);
2384 gfc_simplify_dshiftl (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
2386 return simplify_dshift (arg1
, arg2
, shiftarg
, false);
2391 gfc_simplify_eoshift (gfc_expr
*array
, gfc_expr
*shift
, gfc_expr
*boundary
,
2398 gfc_expr
**arrayvec
, **resultvec
;
2399 gfc_expr
**rptr
, **sptr
;
2401 size_t arraysize
, i
;
2402 gfc_constructor
*array_ctor
, *shift_ctor
, *bnd_ctor
;
2403 ssize_t shift_val
, len
;
2404 ssize_t count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
2405 sstride
[GFC_MAX_DIMENSIONS
], a_extent
[GFC_MAX_DIMENSIONS
],
2406 a_stride
[GFC_MAX_DIMENSIONS
], ss_ex
[GFC_MAX_DIMENSIONS
];
2410 gfc_expr
**src
, **dest
;
2413 if (!is_constant_array_expr (array
))
2416 if (shift
->rank
> 0)
2417 gfc_simplify_expr (shift
, 1);
2419 if (!gfc_is_constant_expr (shift
))
2424 if (boundary
->rank
> 0)
2425 gfc_simplify_expr (boundary
, 1);
2427 if (!gfc_is_constant_expr (boundary
))
2433 if (!gfc_is_constant_expr (dim
))
2435 which
= mpz_get_si (dim
->value
.integer
) - 1;
2441 if (boundary
== NULL
)
2443 temp_boundary
= true;
2444 switch (array
->ts
.type
)
2448 bnd
= gfc_get_int_expr (array
->ts
.kind
, NULL
, 0);
2452 bnd
= gfc_get_logical_expr (array
->ts
.kind
, NULL
, 0);
2456 bnd
= gfc_get_constant_expr (array
->ts
.type
, array
->ts
.kind
, &gfc_current_locus
);
2457 mpfr_set_ui (bnd
->value
.real
, 0, GFC_RND_MODE
);
2461 bnd
= gfc_get_constant_expr (array
->ts
.type
, array
->ts
.kind
, &gfc_current_locus
);
2462 mpc_set_ui (bnd
->value
.complex, 0, GFC_RND_MODE
);
2466 s_len
= mpz_get_ui (array
->ts
.u
.cl
->length
->value
.integer
);
2467 bnd
= gfc_get_character_expr (array
->ts
.kind
, &gfc_current_locus
, NULL
, s_len
);
2477 temp_boundary
= false;
2481 gfc_array_size (array
, &size
);
2482 arraysize
= mpz_get_ui (size
);
2485 result
= gfc_get_array_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
2486 result
->shape
= gfc_copy_shape (array
->shape
, array
->rank
);
2487 result
->rank
= array
->rank
;
2488 result
->ts
= array
->ts
;
2493 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
2494 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
2495 for (i
= 0; i
< arraysize
; i
++)
2497 arrayvec
[i
] = array_ctor
->expr
;
2498 array_ctor
= gfc_constructor_next (array_ctor
);
2501 resultvec
= XCNEWVEC (gfc_expr
*, arraysize
);
2506 for (d
=0; d
< array
->rank
; d
++)
2508 a_extent
[d
] = mpz_get_si (array
->shape
[d
]);
2509 a_stride
[d
] = d
== 0 ? 1 : a_stride
[d
-1] * a_extent
[d
-1];
2512 if (shift
->rank
> 0)
2514 shift_ctor
= gfc_constructor_first (shift
->value
.constructor
);
2520 shift_val
= mpz_get_si (shift
->value
.integer
);
2524 bnd_ctor
= gfc_constructor_first (bnd
->value
.constructor
);
2528 /* Shut up compiler */
2533 for (d
=0; d
< array
->rank
; d
++)
2537 rsoffset
= a_stride
[d
];
2543 extent
[n
] = a_extent
[d
];
2544 sstride
[n
] = a_stride
[d
];
2545 ss_ex
[n
] = sstride
[n
] * extent
[n
];
2550 continue_loop
= true;
2555 while (continue_loop
)
2560 sh
= mpz_get_si (shift_ctor
->expr
->value
.integer
);
2564 if (( sh
>= 0 ? sh
: -sh
) > len
)
2570 delta
= (sh
>= 0) ? sh
: -sh
;
2574 src
= &sptr
[delta
* rsoffset
];
2580 dest
= &rptr
[delta
* rsoffset
];
2583 for (n
= 0; n
< len
- delta
; n
++)
2599 *dest
= gfc_copy_expr (bnd_ctor
->expr
);
2607 *dest
= gfc_copy_expr (bnd
);
2614 shift_ctor
= gfc_constructor_next (shift_ctor
);
2617 bnd_ctor
= gfc_constructor_next (bnd_ctor
);
2621 while (count
[n
] == extent
[n
])
2629 continue_loop
= false;
2641 for (i
= 0; i
< arraysize
; i
++)
2643 gfc_constructor_append_expr (&result
->value
.constructor
,
2644 gfc_copy_expr (resultvec
[i
]),
2650 gfc_free_expr (bnd
);
2656 gfc_simplify_erf (gfc_expr
*x
)
2660 if (x
->expr_type
!= EXPR_CONSTANT
)
2663 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2664 mpfr_erf (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2666 return range_check (result
, "ERF");
2671 gfc_simplify_erfc (gfc_expr
*x
)
2675 if (x
->expr_type
!= EXPR_CONSTANT
)
2678 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2679 mpfr_erfc (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2681 return range_check (result
, "ERFC");
2685 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
2687 #define MAX_ITER 200
2688 #define ARG_LIMIT 12
2690 /* Calculate ERFC_SCALED directly by its definition:
2692 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
2694 using a large precision for intermediate results. This is used for all
2695 but large values of the argument. */
2697 fullprec_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2702 prec
= mpfr_get_default_prec ();
2703 mpfr_set_default_prec (10 * prec
);
2708 mpfr_set (a
, arg
, GFC_RND_MODE
);
2709 mpfr_sqr (b
, a
, GFC_RND_MODE
);
2710 mpfr_exp (b
, b
, GFC_RND_MODE
);
2711 mpfr_erfc (a
, a
, GFC_RND_MODE
);
2712 mpfr_mul (a
, a
, b
, GFC_RND_MODE
);
2714 mpfr_set (res
, a
, GFC_RND_MODE
);
2715 mpfr_set_default_prec (prec
);
2721 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
2723 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
2724 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
2727 This is used for large values of the argument. Intermediate calculations
2728 are performed with twice the precision. We don't do a fixed number of
2729 iterations of the sum, but stop when it has converged to the required
2732 asympt_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2734 mpfr_t sum
, x
, u
, v
, w
, oldsum
, sumtrunc
;
2739 prec
= mpfr_get_default_prec ();
2740 mpfr_set_default_prec (2 * prec
);
2750 mpfr_init (sumtrunc
);
2751 mpfr_set_prec (oldsum
, prec
);
2752 mpfr_set_prec (sumtrunc
, prec
);
2754 mpfr_set (x
, arg
, GFC_RND_MODE
);
2755 mpfr_set_ui (sum
, 1, GFC_RND_MODE
);
2756 mpz_set_ui (num
, 1);
2758 mpfr_set (u
, x
, GFC_RND_MODE
);
2759 mpfr_sqr (u
, u
, GFC_RND_MODE
);
2760 mpfr_mul_ui (u
, u
, 2, GFC_RND_MODE
);
2761 mpfr_pow_si (u
, u
, -1, GFC_RND_MODE
);
2763 for (i
= 1; i
< MAX_ITER
; i
++)
2765 mpfr_set (oldsum
, sum
, GFC_RND_MODE
);
2767 mpz_mul_ui (num
, num
, 2 * i
- 1);
2770 mpfr_set (w
, u
, GFC_RND_MODE
);
2771 mpfr_pow_ui (w
, w
, i
, GFC_RND_MODE
);
2773 mpfr_set_z (v
, num
, GFC_RND_MODE
);
2774 mpfr_mul (v
, v
, w
, GFC_RND_MODE
);
2776 mpfr_add (sum
, sum
, v
, GFC_RND_MODE
);
2778 mpfr_set (sumtrunc
, sum
, GFC_RND_MODE
);
2779 if (mpfr_cmp (sumtrunc
, oldsum
) == 0)
2783 /* We should have converged by now; otherwise, ARG_LIMIT is probably
2785 gcc_assert (i
< MAX_ITER
);
2787 /* Divide by x * sqrt(Pi). */
2788 mpfr_const_pi (u
, GFC_RND_MODE
);
2789 mpfr_sqrt (u
, u
, GFC_RND_MODE
);
2790 mpfr_mul (u
, u
, x
, GFC_RND_MODE
);
2791 mpfr_div (sum
, sum
, u
, GFC_RND_MODE
);
2793 mpfr_set (res
, sum
, GFC_RND_MODE
);
2794 mpfr_set_default_prec (prec
);
2796 mpfr_clears (sum
, x
, u
, v
, w
, oldsum
, sumtrunc
, NULL
);
2802 gfc_simplify_erfc_scaled (gfc_expr
*x
)
2806 if (x
->expr_type
!= EXPR_CONSTANT
)
2809 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2810 if (mpfr_cmp_d (x
->value
.real
, ARG_LIMIT
) >= 0)
2811 asympt_erfc_scaled (result
->value
.real
, x
->value
.real
);
2813 fullprec_erfc_scaled (result
->value
.real
, x
->value
.real
);
2815 return range_check (result
, "ERFC_SCALED");
2823 gfc_simplify_epsilon (gfc_expr
*e
)
2828 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2830 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
2831 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].epsilon
, GFC_RND_MODE
);
2833 return range_check (result
, "EPSILON");
2838 gfc_simplify_exp (gfc_expr
*x
)
2842 if (x
->expr_type
!= EXPR_CONSTANT
)
2845 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2850 mpfr_exp (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2854 gfc_set_model_kind (x
->ts
.kind
);
2855 mpc_exp (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
2859 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2862 return range_check (result
, "EXP");
2867 gfc_simplify_exponent (gfc_expr
*x
)
2872 if (x
->expr_type
!= EXPR_CONSTANT
)
2875 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
2878 /* EXPONENT(inf) = EXPONENT(nan) = HUGE(0) */
2879 if (mpfr_inf_p (x
->value
.real
) || mpfr_nan_p (x
->value
.real
))
2881 int i
= gfc_validate_kind (BT_INTEGER
, gfc_default_integer_kind
, false);
2882 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
2886 /* EXPONENT(+/- 0.0) = 0 */
2887 if (mpfr_zero_p (x
->value
.real
))
2889 mpz_set_ui (result
->value
.integer
, 0);
2893 gfc_set_model (x
->value
.real
);
2895 val
= (long int) mpfr_get_exp (x
->value
.real
);
2896 mpz_set_si (result
->value
.integer
, val
);
2898 return range_check (result
, "EXPONENT");
2903 gfc_simplify_failed_or_stopped_images (gfc_expr
*team ATTRIBUTE_UNUSED
,
2906 if (flag_coarray
== GFC_FCOARRAY_NONE
)
2908 gfc_current_locus
= *gfc_current_intrinsic_where
;
2909 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
2910 return &gfc_bad_expr
;
2913 if (flag_coarray
== GFC_FCOARRAY_SINGLE
)
2918 gfc_extract_int (kind
, &actual_kind
);
2920 actual_kind
= gfc_default_integer_kind
;
2922 result
= gfc_get_array_expr (BT_INTEGER
, actual_kind
, &gfc_current_locus
);
2927 /* For fcoarray = lib no simplification is possible, because it is not known
2928 what images failed or are stopped at compile time. */
2934 gfc_simplify_get_team (gfc_expr
*level ATTRIBUTE_UNUSED
)
2936 if (flag_coarray
== GFC_FCOARRAY_NONE
)
2938 gfc_current_locus
= *gfc_current_intrinsic_where
;
2939 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
2940 return &gfc_bad_expr
;
2943 if (flag_coarray
== GFC_FCOARRAY_SINGLE
)
2946 result
= gfc_get_array_expr (BT_INTEGER
, gfc_default_integer_kind
, &gfc_current_locus
);
2951 /* For fcoarray = lib no simplification is possible, because it is not known
2952 what images failed or are stopped at compile time. */
2958 gfc_simplify_float (gfc_expr
*a
)
2962 if (a
->expr_type
!= EXPR_CONSTANT
)
2967 if (convert_boz (a
, gfc_default_real_kind
) == &gfc_bad_expr
)
2968 return &gfc_bad_expr
;
2970 result
= gfc_copy_expr (a
);
2973 result
= gfc_int2real (a
, gfc_default_real_kind
);
2975 return range_check (result
, "FLOAT");
2980 is_last_ref_vtab (gfc_expr
*e
)
2983 gfc_component
*comp
= NULL
;
2985 if (e
->expr_type
!= EXPR_VARIABLE
)
2988 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
2989 if (ref
->type
== REF_COMPONENT
)
2990 comp
= ref
->u
.c
.component
;
2992 if (!e
->ref
|| !comp
)
2993 return e
->symtree
->n
.sym
->attr
.vtab
;
2995 if (comp
->name
[0] == '_' && strcmp (comp
->name
, "_vptr") == 0)
3003 gfc_simplify_extends_type_of (gfc_expr
*a
, gfc_expr
*mold
)
3005 /* Avoid simplification of resolved symbols. */
3006 if (is_last_ref_vtab (a
) || is_last_ref_vtab (mold
))
3009 if (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_DERIVED
)
3010 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
3011 gfc_type_is_extension_of (mold
->ts
.u
.derived
,
3014 if (UNLIMITED_POLY (a
) || UNLIMITED_POLY (mold
))
3017 /* Return .false. if the dynamic type can never be an extension. */
3018 if ((a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_CLASS
3019 && !gfc_type_is_extension_of
3020 (mold
->ts
.u
.derived
->components
->ts
.u
.derived
,
3021 a
->ts
.u
.derived
->components
->ts
.u
.derived
)
3022 && !gfc_type_is_extension_of
3023 (a
->ts
.u
.derived
->components
->ts
.u
.derived
,
3024 mold
->ts
.u
.derived
->components
->ts
.u
.derived
))
3025 || (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_CLASS
3026 && !gfc_type_is_extension_of
3027 (mold
->ts
.u
.derived
->components
->ts
.u
.derived
,
3029 || (a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_DERIVED
3030 && !gfc_type_is_extension_of
3031 (mold
->ts
.u
.derived
,
3032 a
->ts
.u
.derived
->components
->ts
.u
.derived
)
3033 && !gfc_type_is_extension_of
3034 (a
->ts
.u
.derived
->components
->ts
.u
.derived
,
3035 mold
->ts
.u
.derived
)))
3036 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
3038 /* Return .true. if the dynamic type is guaranteed to be an extension. */
3039 if (a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_DERIVED
3040 && gfc_type_is_extension_of (mold
->ts
.u
.derived
,
3041 a
->ts
.u
.derived
->components
->ts
.u
.derived
))
3042 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, true);
3049 gfc_simplify_same_type_as (gfc_expr
*a
, gfc_expr
*b
)
3051 /* Avoid simplification of resolved symbols. */
3052 if (is_last_ref_vtab (a
) || is_last_ref_vtab (b
))
3055 /* Return .false. if the dynamic type can never be the
3057 if (((a
->ts
.type
== BT_CLASS
&& gfc_expr_attr (a
).class_ok
)
3058 || (b
->ts
.type
== BT_CLASS
&& gfc_expr_attr (b
).class_ok
))
3059 && !gfc_type_compatible (&a
->ts
, &b
->ts
)
3060 && !gfc_type_compatible (&b
->ts
, &a
->ts
))
3061 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
3063 if (a
->ts
.type
!= BT_DERIVED
|| b
->ts
.type
!= BT_DERIVED
)
3066 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
3067 gfc_compare_derived_types (a
->ts
.u
.derived
,
3073 gfc_simplify_floor (gfc_expr
*e
, gfc_expr
*k
)
3079 kind
= get_kind (BT_INTEGER
, k
, "FLOOR", gfc_default_integer_kind
);
3081 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
3083 if (e
->expr_type
!= EXPR_CONSTANT
)
3086 mpfr_init2 (floor
, mpfr_get_prec (e
->value
.real
));
3087 mpfr_floor (floor
, e
->value
.real
);
3089 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
3090 gfc_mpfr_to_mpz (result
->value
.integer
, floor
, &e
->where
);
3094 return range_check (result
, "FLOOR");
3099 gfc_simplify_fraction (gfc_expr
*x
)
3103 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
3104 mpfr_t absv
, exp
, pow2
;
3109 if (x
->expr_type
!= EXPR_CONSTANT
)
3112 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
3114 /* FRACTION(inf) = NaN. */
3115 if (mpfr_inf_p (x
->value
.real
))
3117 mpfr_set_nan (result
->value
.real
);
3121 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
3123 /* MPFR versions before 3.1.0 do not include mpfr_frexp.
3124 TODO: remove the kludge when MPFR 3.1.0 or newer will be required */
3126 if (mpfr_sgn (x
->value
.real
) == 0)
3128 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
3132 gfc_set_model_kind (x
->ts
.kind
);
3137 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
3138 mpfr_log2 (exp
, absv
, GFC_RND_MODE
);
3140 mpfr_trunc (exp
, exp
);
3141 mpfr_add_ui (exp
, exp
, 1, GFC_RND_MODE
);
3143 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
3145 mpfr_div (result
->value
.real
, x
->value
.real
, pow2
, GFC_RND_MODE
);
3147 mpfr_clears (exp
, absv
, pow2
, NULL
);
3151 /* mpfr_frexp() correctly handles zeros and NaNs. */
3152 mpfr_frexp (&e
, result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
3156 return range_check (result
, "FRACTION");
3161 gfc_simplify_gamma (gfc_expr
*x
)
3165 if (x
->expr_type
!= EXPR_CONSTANT
)
3168 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3169 mpfr_gamma (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
3171 return range_check (result
, "GAMMA");
3176 gfc_simplify_huge (gfc_expr
*e
)
3181 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3182 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3187 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
3191 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
3203 gfc_simplify_hypot (gfc_expr
*x
, gfc_expr
*y
)
3207 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3210 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3211 mpfr_hypot (result
->value
.real
, x
->value
.real
, y
->value
.real
, GFC_RND_MODE
);
3212 return range_check (result
, "HYPOT");
3216 /* We use the processor's collating sequence, because all
3217 systems that gfortran currently works on are ASCII. */
3220 gfc_simplify_iachar (gfc_expr
*e
, gfc_expr
*kind
)
3226 if (e
->expr_type
!= EXPR_CONSTANT
)
3229 if (e
->value
.character
.length
!= 1)
3231 gfc_error ("Argument of IACHAR at %L must be of length one", &e
->where
);
3232 return &gfc_bad_expr
;
3235 index
= e
->value
.character
.string
[0];
3237 if (warn_surprising
&& index
> 127)
3238 gfc_warning (OPT_Wsurprising
,
3239 "Argument of IACHAR function at %L outside of range 0..127",
3242 k
= get_kind (BT_INTEGER
, kind
, "IACHAR", gfc_default_integer_kind
);
3244 return &gfc_bad_expr
;
3246 result
= gfc_get_int_expr (k
, &e
->where
, index
);
3248 return range_check (result
, "IACHAR");
3253 do_bit_and (gfc_expr
*result
, gfc_expr
*e
)
3255 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
3256 gcc_assert (result
->ts
.type
== BT_INTEGER
3257 && result
->expr_type
== EXPR_CONSTANT
);
3259 mpz_and (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
3265 gfc_simplify_iall (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
3267 return simplify_transformation (array
, dim
, mask
, -1, do_bit_and
);
3272 do_bit_ior (gfc_expr
*result
, gfc_expr
*e
)
3274 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
3275 gcc_assert (result
->ts
.type
== BT_INTEGER
3276 && result
->expr_type
== EXPR_CONSTANT
);
3278 mpz_ior (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
3284 gfc_simplify_iany (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
3286 return simplify_transformation (array
, dim
, mask
, 0, do_bit_ior
);
3291 gfc_simplify_iand (gfc_expr
*x
, gfc_expr
*y
)
3295 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3298 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
3299 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
3301 return range_check (result
, "IAND");
3306 gfc_simplify_ibclr (gfc_expr
*x
, gfc_expr
*y
)
3311 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3314 gfc_extract_int (y
, &pos
);
3316 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
3318 result
= gfc_copy_expr (x
);
3320 convert_mpz_to_unsigned (result
->value
.integer
,
3321 gfc_integer_kinds
[k
].bit_size
);
3323 mpz_clrbit (result
->value
.integer
, pos
);
3325 gfc_convert_mpz_to_signed (result
->value
.integer
,
3326 gfc_integer_kinds
[k
].bit_size
);
3333 gfc_simplify_ibits (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*z
)
3340 if (x
->expr_type
!= EXPR_CONSTANT
3341 || y
->expr_type
!= EXPR_CONSTANT
3342 || z
->expr_type
!= EXPR_CONSTANT
)
3345 gfc_extract_int (y
, &pos
);
3346 gfc_extract_int (z
, &len
);
3348 k
= gfc_validate_kind (BT_INTEGER
, x
->ts
.kind
, false);
3350 bitsize
= gfc_integer_kinds
[k
].bit_size
;
3352 if (pos
+ len
> bitsize
)
3354 gfc_error ("Sum of second and third arguments of IBITS exceeds "
3355 "bit size at %L", &y
->where
);
3356 return &gfc_bad_expr
;
3359 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3360 convert_mpz_to_unsigned (result
->value
.integer
,
3361 gfc_integer_kinds
[k
].bit_size
);
3363 bits
= XCNEWVEC (int, bitsize
);
3365 for (i
= 0; i
< bitsize
; i
++)
3368 for (i
= 0; i
< len
; i
++)
3369 bits
[i
] = mpz_tstbit (x
->value
.integer
, i
+ pos
);
3371 for (i
= 0; i
< bitsize
; i
++)
3374 mpz_clrbit (result
->value
.integer
, i
);
3375 else if (bits
[i
] == 1)
3376 mpz_setbit (result
->value
.integer
, i
);
3378 gfc_internal_error ("IBITS: Bad bit");
3383 gfc_convert_mpz_to_signed (result
->value
.integer
,
3384 gfc_integer_kinds
[k
].bit_size
);
3391 gfc_simplify_ibset (gfc_expr
*x
, gfc_expr
*y
)
3396 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3399 gfc_extract_int (y
, &pos
);
3401 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
3403 result
= gfc_copy_expr (x
);
3405 convert_mpz_to_unsigned (result
->value
.integer
,
3406 gfc_integer_kinds
[k
].bit_size
);
3408 mpz_setbit (result
->value
.integer
, pos
);
3410 gfc_convert_mpz_to_signed (result
->value
.integer
,
3411 gfc_integer_kinds
[k
].bit_size
);
3418 gfc_simplify_ichar (gfc_expr
*e
, gfc_expr
*kind
)
3424 if (e
->expr_type
!= EXPR_CONSTANT
)
3427 if (e
->value
.character
.length
!= 1)
3429 gfc_error ("Argument of ICHAR at %L must be of length one", &e
->where
);
3430 return &gfc_bad_expr
;
3433 index
= e
->value
.character
.string
[0];
3435 k
= get_kind (BT_INTEGER
, kind
, "ICHAR", gfc_default_integer_kind
);
3437 return &gfc_bad_expr
;
3439 result
= gfc_get_int_expr (k
, &e
->where
, index
);
3441 return range_check (result
, "ICHAR");
3446 gfc_simplify_ieor (gfc_expr
*x
, gfc_expr
*y
)
3450 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3453 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
3454 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
3456 return range_check (result
, "IEOR");
3461 gfc_simplify_index (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*b
, gfc_expr
*kind
)
3464 int back
, len
, lensub
;
3465 int i
, j
, k
, count
, index
= 0, start
;
3467 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
3468 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
3471 if (b
!= NULL
&& b
->value
.logical
!= 0)
3476 k
= get_kind (BT_INTEGER
, kind
, "INDEX", gfc_default_integer_kind
);
3478 return &gfc_bad_expr
;
3480 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &x
->where
);
3482 len
= x
->value
.character
.length
;
3483 lensub
= y
->value
.character
.length
;
3487 mpz_set_si (result
->value
.integer
, 0);
3495 mpz_set_si (result
->value
.integer
, 1);
3498 else if (lensub
== 1)
3500 for (i
= 0; i
< len
; i
++)
3502 for (j
= 0; j
< lensub
; j
++)
3504 if (y
->value
.character
.string
[j
]
3505 == x
->value
.character
.string
[i
])
3515 for (i
= 0; i
< len
; i
++)
3517 for (j
= 0; j
< lensub
; j
++)
3519 if (y
->value
.character
.string
[j
]
3520 == x
->value
.character
.string
[i
])
3525 for (k
= 0; k
< lensub
; k
++)
3527 if (y
->value
.character
.string
[k
]
3528 == x
->value
.character
.string
[k
+ start
])
3532 if (count
== lensub
)
3547 mpz_set_si (result
->value
.integer
, len
+ 1);
3550 else if (lensub
== 1)
3552 for (i
= 0; i
< len
; i
++)
3554 for (j
= 0; j
< lensub
; j
++)
3556 if (y
->value
.character
.string
[j
]
3557 == x
->value
.character
.string
[len
- i
])
3559 index
= len
- i
+ 1;
3567 for (i
= 0; i
< len
; i
++)
3569 for (j
= 0; j
< lensub
; j
++)
3571 if (y
->value
.character
.string
[j
]
3572 == x
->value
.character
.string
[len
- i
])
3575 if (start
<= len
- lensub
)
3578 for (k
= 0; k
< lensub
; k
++)
3579 if (y
->value
.character
.string
[k
]
3580 == x
->value
.character
.string
[k
+ start
])
3583 if (count
== lensub
)
3600 mpz_set_si (result
->value
.integer
, index
);
3601 return range_check (result
, "INDEX");
3606 simplify_intconv (gfc_expr
*e
, int kind
, const char *name
)
3608 gfc_expr
*result
= NULL
;
3610 if (e
->expr_type
!= EXPR_CONSTANT
)
3613 result
= gfc_convert_constant (e
, BT_INTEGER
, kind
);
3614 if (result
== &gfc_bad_expr
)
3615 return &gfc_bad_expr
;
3617 return range_check (result
, name
);
3622 gfc_simplify_int (gfc_expr
*e
, gfc_expr
*k
)
3626 kind
= get_kind (BT_INTEGER
, k
, "INT", gfc_default_integer_kind
);
3628 return &gfc_bad_expr
;
3630 return simplify_intconv (e
, kind
, "INT");
3634 gfc_simplify_int2 (gfc_expr
*e
)
3636 return simplify_intconv (e
, 2, "INT2");
3641 gfc_simplify_int8 (gfc_expr
*e
)
3643 return simplify_intconv (e
, 8, "INT8");
3648 gfc_simplify_long (gfc_expr
*e
)
3650 return simplify_intconv (e
, 4, "LONG");
3655 gfc_simplify_ifix (gfc_expr
*e
)
3657 gfc_expr
*rtrunc
, *result
;
3659 if (e
->expr_type
!= EXPR_CONSTANT
)
3662 rtrunc
= gfc_copy_expr (e
);
3663 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
3665 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
3667 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
3669 gfc_free_expr (rtrunc
);
3671 return range_check (result
, "IFIX");
3676 gfc_simplify_idint (gfc_expr
*e
)
3678 gfc_expr
*rtrunc
, *result
;
3680 if (e
->expr_type
!= EXPR_CONSTANT
)
3683 rtrunc
= gfc_copy_expr (e
);
3684 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
3686 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
3688 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
3690 gfc_free_expr (rtrunc
);
3692 return range_check (result
, "IDINT");
3697 gfc_simplify_ior (gfc_expr
*x
, gfc_expr
*y
)
3701 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3704 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
3705 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
3707 return range_check (result
, "IOR");
3712 do_bit_xor (gfc_expr
*result
, gfc_expr
*e
)
3714 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
3715 gcc_assert (result
->ts
.type
== BT_INTEGER
3716 && result
->expr_type
== EXPR_CONSTANT
);
3718 mpz_xor (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
3724 gfc_simplify_iparity (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
3726 return simplify_transformation (array
, dim
, mask
, 0, do_bit_xor
);
3731 gfc_simplify_is_iostat_end (gfc_expr
*x
)
3733 if (x
->expr_type
!= EXPR_CONSTANT
)
3736 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3737 mpz_cmp_si (x
->value
.integer
,
3738 LIBERROR_END
) == 0);
3743 gfc_simplify_is_iostat_eor (gfc_expr
*x
)
3745 if (x
->expr_type
!= EXPR_CONSTANT
)
3748 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3749 mpz_cmp_si (x
->value
.integer
,
3750 LIBERROR_EOR
) == 0);
3755 gfc_simplify_isnan (gfc_expr
*x
)
3757 if (x
->expr_type
!= EXPR_CONSTANT
)
3760 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3761 mpfr_nan_p (x
->value
.real
));
3765 /* Performs a shift on its first argument. Depending on the last
3766 argument, the shift can be arithmetic, i.e. with filling from the
3767 left like in the SHIFTA intrinsic. */
3769 simplify_shift (gfc_expr
*e
, gfc_expr
*s
, const char *name
,
3770 bool arithmetic
, int direction
)
3773 int ashift
, *bits
, i
, k
, bitsize
, shift
;
3775 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
3778 gfc_extract_int (s
, &shift
);
3780 k
= gfc_validate_kind (BT_INTEGER
, e
->ts
.kind
, false);
3781 bitsize
= gfc_integer_kinds
[k
].bit_size
;
3783 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3787 mpz_set (result
->value
.integer
, e
->value
.integer
);
3791 if (direction
> 0 && shift
< 0)
3793 /* Left shift, as in SHIFTL. */
3794 gfc_error ("Second argument of %s is negative at %L", name
, &e
->where
);
3795 return &gfc_bad_expr
;
3797 else if (direction
< 0)
3799 /* Right shift, as in SHIFTR or SHIFTA. */
3802 gfc_error ("Second argument of %s is negative at %L",
3804 return &gfc_bad_expr
;
3810 ashift
= (shift
>= 0 ? shift
: -shift
);
3812 if (ashift
> bitsize
)
3814 gfc_error ("Magnitude of second argument of %s exceeds bit size "
3815 "at %L", name
, &e
->where
);
3816 return &gfc_bad_expr
;
3819 bits
= XCNEWVEC (int, bitsize
);
3821 for (i
= 0; i
< bitsize
; i
++)
3822 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3827 for (i
= 0; i
< shift
; i
++)
3828 mpz_clrbit (result
->value
.integer
, i
);
3830 for (i
= 0; i
< bitsize
- shift
; i
++)
3833 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3835 mpz_setbit (result
->value
.integer
, i
+ shift
);
3841 if (arithmetic
&& bits
[bitsize
- 1])
3842 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
3843 mpz_setbit (result
->value
.integer
, i
);
3845 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
3846 mpz_clrbit (result
->value
.integer
, i
);
3848 for (i
= bitsize
- 1; i
>= ashift
; i
--)
3851 mpz_clrbit (result
->value
.integer
, i
- ashift
);
3853 mpz_setbit (result
->value
.integer
, i
- ashift
);
3857 gfc_convert_mpz_to_signed (result
->value
.integer
, bitsize
);
3865 gfc_simplify_ishft (gfc_expr
*e
, gfc_expr
*s
)
3867 return simplify_shift (e
, s
, "ISHFT", false, 0);
3872 gfc_simplify_lshift (gfc_expr
*e
, gfc_expr
*s
)
3874 return simplify_shift (e
, s
, "LSHIFT", false, 1);
3879 gfc_simplify_rshift (gfc_expr
*e
, gfc_expr
*s
)
3881 return simplify_shift (e
, s
, "RSHIFT", true, -1);
3886 gfc_simplify_shifta (gfc_expr
*e
, gfc_expr
*s
)
3888 return simplify_shift (e
, s
, "SHIFTA", true, -1);
3893 gfc_simplify_shiftl (gfc_expr
*e
, gfc_expr
*s
)
3895 return simplify_shift (e
, s
, "SHIFTL", false, 1);
3900 gfc_simplify_shiftr (gfc_expr
*e
, gfc_expr
*s
)
3902 return simplify_shift (e
, s
, "SHIFTR", false, -1);
3907 gfc_simplify_ishftc (gfc_expr
*e
, gfc_expr
*s
, gfc_expr
*sz
)
3910 int shift
, ashift
, isize
, ssize
, delta
, k
;
3913 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
3916 gfc_extract_int (s
, &shift
);
3918 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3919 isize
= gfc_integer_kinds
[k
].bit_size
;
3923 if (sz
->expr_type
!= EXPR_CONSTANT
)
3926 gfc_extract_int (sz
, &ssize
);
3939 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3940 "BIT_SIZE of first argument at %C");
3942 gfc_error ("Absolute value of SHIFT shall be less than or equal "
3944 return &gfc_bad_expr
;
3947 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3949 mpz_set (result
->value
.integer
, e
->value
.integer
);
3954 convert_mpz_to_unsigned (result
->value
.integer
, isize
);
3956 bits
= XCNEWVEC (int, ssize
);
3958 for (i
= 0; i
< ssize
; i
++)
3959 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3961 delta
= ssize
- ashift
;
3965 for (i
= 0; i
< delta
; i
++)
3968 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3970 mpz_setbit (result
->value
.integer
, i
+ shift
);
3973 for (i
= delta
; i
< ssize
; i
++)
3976 mpz_clrbit (result
->value
.integer
, i
- delta
);
3978 mpz_setbit (result
->value
.integer
, i
- delta
);
3983 for (i
= 0; i
< ashift
; i
++)
3986 mpz_clrbit (result
->value
.integer
, i
+ delta
);
3988 mpz_setbit (result
->value
.integer
, i
+ delta
);
3991 for (i
= ashift
; i
< ssize
; i
++)
3994 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3996 mpz_setbit (result
->value
.integer
, i
+ shift
);
4000 gfc_convert_mpz_to_signed (result
->value
.integer
, isize
);
4008 gfc_simplify_kind (gfc_expr
*e
)
4010 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, e
->ts
.kind
);
4015 simplify_bound_dim (gfc_expr
*array
, gfc_expr
*kind
, int d
, int upper
,
4016 gfc_array_spec
*as
, gfc_ref
*ref
, bool coarray
)
4018 gfc_expr
*l
, *u
, *result
;
4021 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
4022 gfc_default_integer_kind
);
4024 return &gfc_bad_expr
;
4026 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
4028 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
4029 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
4030 if (!coarray
&& array
->expr_type
!= EXPR_VARIABLE
)
4034 gfc_expr
* dim
= result
;
4035 mpz_set_si (dim
->value
.integer
, d
);
4037 result
= simplify_size (array
, dim
, k
);
4038 gfc_free_expr (dim
);
4043 mpz_set_si (result
->value
.integer
, 1);
4048 /* Otherwise, we have a variable expression. */
4049 gcc_assert (array
->expr_type
== EXPR_VARIABLE
);
4052 if (!gfc_resolve_array_spec (as
, 0))
4055 /* The last dimension of an assumed-size array is special. */
4056 if ((!coarray
&& d
== as
->rank
&& as
->type
== AS_ASSUMED_SIZE
&& !upper
)
4057 || (coarray
&& d
== as
->rank
+ as
->corank
4058 && (!upper
|| flag_coarray
== GFC_FCOARRAY_SINGLE
)))
4060 if (as
->lower
[d
-1]->expr_type
== EXPR_CONSTANT
)
4062 gfc_free_expr (result
);
4063 return gfc_copy_expr (as
->lower
[d
-1]);
4069 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
4071 /* Then, we need to know the extent of the given dimension. */
4072 if (coarray
|| (ref
->u
.ar
.type
== AR_FULL
&& !ref
->next
))
4074 gfc_expr
*declared_bound
;
4076 bool constant_lbound
, constant_ubound
;
4081 gcc_assert (l
!= NULL
);
4083 constant_lbound
= l
->expr_type
== EXPR_CONSTANT
;
4084 constant_ubound
= u
&& u
->expr_type
== EXPR_CONSTANT
;
4086 empty_bound
= upper
? 0 : 1;
4087 declared_bound
= upper
? u
: l
;
4089 if ((!upper
&& !constant_lbound
)
4090 || (upper
&& !constant_ubound
))
4095 /* For {L,U}BOUND, the value depends on whether the array
4096 is empty. We can nevertheless simplify if the declared bound
4097 has the same value as that of an empty array, in which case
4098 the result isn't dependent on the array emptyness. */
4099 if (mpz_cmp_si (declared_bound
->value
.integer
, empty_bound
) == 0)
4100 mpz_set_si (result
->value
.integer
, empty_bound
);
4101 else if (!constant_lbound
|| !constant_ubound
)
4102 /* Array emptyness can't be determined, we can't simplify. */
4104 else if (mpz_cmp (l
->value
.integer
, u
->value
.integer
) > 0)
4105 mpz_set_si (result
->value
.integer
, empty_bound
);
4107 mpz_set (result
->value
.integer
, declared_bound
->value
.integer
);
4110 mpz_set (result
->value
.integer
, declared_bound
->value
.integer
);
4116 if (!gfc_ref_dimen_size (&ref
->u
.ar
, d
- 1, &result
->value
.integer
, NULL
))
4120 mpz_set_si (result
->value
.integer
, (long int) 1);
4124 return range_check (result
, upper
? "UBOUND" : "LBOUND");
4127 gfc_free_expr (result
);
4133 simplify_bound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
4139 if (array
->ts
.type
== BT_CLASS
)
4142 if (array
->expr_type
!= EXPR_VARIABLE
)
4149 /* Follow any component references. */
4150 as
= array
->symtree
->n
.sym
->as
;
4151 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
4156 switch (ref
->u
.ar
.type
)
4163 /* We're done because 'as' has already been set in the
4164 previous iteration. */
4178 as
= ref
->u
.c
.component
->as
;
4190 if (as
&& (as
->type
== AS_DEFERRED
|| as
->type
== AS_ASSUMED_RANK
4191 || (as
->type
== AS_ASSUMED_SHAPE
&& upper
)))
4195 || (as
->type
!= AS_DEFERRED
4196 && array
->expr_type
== EXPR_VARIABLE
4197 && !gfc_expr_attr (array
).allocatable
4198 && !gfc_expr_attr (array
).pointer
));
4202 /* Multi-dimensional bounds. */
4203 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
4207 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
4208 if (upper
&& as
&& as
->type
== AS_ASSUMED_SIZE
)
4210 /* An error message will be emitted in
4211 check_assumed_size_reference (resolve.c). */
4212 return &gfc_bad_expr
;
4215 /* Simplify the bounds for each dimension. */
4216 for (d
= 0; d
< array
->rank
; d
++)
4218 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1, upper
, as
, ref
,
4220 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
4224 for (j
= 0; j
< d
; j
++)
4225 gfc_free_expr (bounds
[j
]);
4230 /* Allocate the result expression. */
4231 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
4232 gfc_default_integer_kind
);
4234 return &gfc_bad_expr
;
4236 e
= gfc_get_array_expr (BT_INTEGER
, k
, &array
->where
);
4238 /* The result is a rank 1 array; its size is the rank of the first
4239 argument to {L,U}BOUND. */
4241 e
->shape
= gfc_get_shape (1);
4242 mpz_init_set_ui (e
->shape
[0], array
->rank
);
4244 /* Create the constructor for this array. */
4245 for (d
= 0; d
< array
->rank
; d
++)
4246 gfc_constructor_append_expr (&e
->value
.constructor
,
4247 bounds
[d
], &e
->where
);
4253 /* A DIM argument is specified. */
4254 if (dim
->expr_type
!= EXPR_CONSTANT
)
4257 d
= mpz_get_si (dim
->value
.integer
);
4259 if ((d
< 1 || d
> array
->rank
)
4260 || (d
== array
->rank
&& as
&& as
->type
== AS_ASSUMED_SIZE
&& upper
))
4262 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
4263 return &gfc_bad_expr
;
4266 if (as
&& as
->type
== AS_ASSUMED_RANK
)
4269 return simplify_bound_dim (array
, kind
, d
, upper
, as
, ref
, false);
4275 simplify_cobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
4281 if (array
->expr_type
!= EXPR_VARIABLE
)
4284 /* Follow any component references. */
4285 as
= (array
->ts
.type
== BT_CLASS
&& array
->ts
.u
.derived
->components
)
4286 ? array
->ts
.u
.derived
->components
->as
4287 : array
->symtree
->n
.sym
->as
;
4288 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
4293 switch (ref
->u
.ar
.type
)
4296 if (ref
->u
.ar
.as
->corank
> 0)
4298 gcc_assert (as
== ref
->u
.ar
.as
);
4305 /* We're done because 'as' has already been set in the
4306 previous iteration. */
4320 as
= ref
->u
.c
.component
->as
;
4333 if (as
->cotype
== AS_DEFERRED
|| as
->cotype
== AS_ASSUMED_SHAPE
)
4338 /* Multi-dimensional cobounds. */
4339 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
4343 /* Simplify the cobounds for each dimension. */
4344 for (d
= 0; d
< as
->corank
; d
++)
4346 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1 + as
->rank
,
4347 upper
, as
, ref
, true);
4348 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
4352 for (j
= 0; j
< d
; j
++)
4353 gfc_free_expr (bounds
[j
]);
4358 /* Allocate the result expression. */
4359 e
= gfc_get_expr ();
4360 e
->where
= array
->where
;
4361 e
->expr_type
= EXPR_ARRAY
;
4362 e
->ts
.type
= BT_INTEGER
;
4363 k
= get_kind (BT_INTEGER
, kind
, upper
? "UCOBOUND" : "LCOBOUND",
4364 gfc_default_integer_kind
);
4368 return &gfc_bad_expr
;
4372 /* The result is a rank 1 array; its size is the rank of the first
4373 argument to {L,U}COBOUND. */
4375 e
->shape
= gfc_get_shape (1);
4376 mpz_init_set_ui (e
->shape
[0], as
->corank
);
4378 /* Create the constructor for this array. */
4379 for (d
= 0; d
< as
->corank
; d
++)
4380 gfc_constructor_append_expr (&e
->value
.constructor
,
4381 bounds
[d
], &e
->where
);
4386 /* A DIM argument is specified. */
4387 if (dim
->expr_type
!= EXPR_CONSTANT
)
4390 d
= mpz_get_si (dim
->value
.integer
);
4392 if (d
< 1 || d
> as
->corank
)
4394 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
4395 return &gfc_bad_expr
;
4398 return simplify_bound_dim (array
, kind
, d
+as
->rank
, upper
, as
, ref
, true);
4404 gfc_simplify_lbound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
4406 return simplify_bound (array
, dim
, kind
, 0);
4411 gfc_simplify_lcobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
4413 return simplify_cobound (array
, dim
, kind
, 0);
4417 gfc_simplify_leadz (gfc_expr
*e
)
4419 unsigned long lz
, bs
;
4422 if (e
->expr_type
!= EXPR_CONSTANT
)
4425 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4426 bs
= gfc_integer_kinds
[i
].bit_size
;
4427 if (mpz_cmp_si (e
->value
.integer
, 0) == 0)
4429 else if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
4432 lz
= bs
- mpz_sizeinbase (e
->value
.integer
, 2);
4434 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, lz
);
4439 gfc_simplify_len (gfc_expr
*e
, gfc_expr
*kind
)
4442 int k
= get_kind (BT_INTEGER
, kind
, "LEN", gfc_default_integer_kind
);
4445 return &gfc_bad_expr
;
4447 if (e
->expr_type
== EXPR_CONSTANT
)
4449 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &e
->where
);
4450 mpz_set_si (result
->value
.integer
, e
->value
.character
.length
);
4451 return range_check (result
, "LEN");
4453 else if (e
->ts
.u
.cl
!= NULL
&& e
->ts
.u
.cl
->length
!= NULL
4454 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
4455 && e
->ts
.u
.cl
->length
->ts
.type
== BT_INTEGER
)
4457 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &e
->where
);
4458 mpz_set (result
->value
.integer
, e
->ts
.u
.cl
->length
->value
.integer
);
4459 return range_check (result
, "LEN");
4461 else if (e
->expr_type
== EXPR_VARIABLE
&& e
->ts
.type
== BT_CHARACTER
4462 && e
->symtree
->n
.sym
4463 && e
->symtree
->n
.sym
->ts
.type
!= BT_DERIVED
4464 && e
->symtree
->n
.sym
->assoc
&& e
->symtree
->n
.sym
->assoc
->target
4465 && e
->symtree
->n
.sym
->assoc
->target
->ts
.type
== BT_DERIVED
4466 && e
->symtree
->n
.sym
->assoc
->target
->symtree
->n
.sym
4467 && UNLIMITED_POLY (e
->symtree
->n
.sym
->assoc
->target
->symtree
->n
.sym
))
4469 /* The expression in assoc->target points to a ref to the _data component
4470 of the unlimited polymorphic entity. To get the _len component the last
4471 _data ref needs to be stripped and a ref to the _len component added. */
4472 return gfc_get_len_component (e
->symtree
->n
.sym
->assoc
->target
);
4479 gfc_simplify_len_trim (gfc_expr
*e
, gfc_expr
*kind
)
4482 size_t count
, len
, i
;
4483 int k
= get_kind (BT_INTEGER
, kind
, "LEN_TRIM", gfc_default_integer_kind
);
4486 return &gfc_bad_expr
;
4488 if (e
->expr_type
!= EXPR_CONSTANT
)
4491 len
= e
->value
.character
.length
;
4492 for (count
= 0, i
= 1; i
<= len
; i
++)
4493 if (e
->value
.character
.string
[len
- i
] == ' ')
4498 result
= gfc_get_int_expr (k
, &e
->where
, len
- count
);
4499 return range_check (result
, "LEN_TRIM");
4503 gfc_simplify_lgamma (gfc_expr
*x
)
4508 if (x
->expr_type
!= EXPR_CONSTANT
)
4511 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4512 mpfr_lgamma (result
->value
.real
, &sg
, x
->value
.real
, GFC_RND_MODE
);
4514 return range_check (result
, "LGAMMA");
4519 gfc_simplify_lge (gfc_expr
*a
, gfc_expr
*b
)
4521 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4524 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4525 gfc_compare_string (a
, b
) >= 0);
4530 gfc_simplify_lgt (gfc_expr
*a
, gfc_expr
*b
)
4532 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4535 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4536 gfc_compare_string (a
, b
) > 0);
4541 gfc_simplify_lle (gfc_expr
*a
, gfc_expr
*b
)
4543 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4546 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4547 gfc_compare_string (a
, b
) <= 0);
4552 gfc_simplify_llt (gfc_expr
*a
, gfc_expr
*b
)
4554 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4557 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4558 gfc_compare_string (a
, b
) < 0);
4563 gfc_simplify_log (gfc_expr
*x
)
4567 if (x
->expr_type
!= EXPR_CONSTANT
)
4570 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4575 if (mpfr_sgn (x
->value
.real
) <= 0)
4577 gfc_error ("Argument of LOG at %L cannot be less than or equal "
4578 "to zero", &x
->where
);
4579 gfc_free_expr (result
);
4580 return &gfc_bad_expr
;
4583 mpfr_log (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4587 if (mpfr_zero_p (mpc_realref (x
->value
.complex))
4588 && mpfr_zero_p (mpc_imagref (x
->value
.complex)))
4590 gfc_error ("Complex argument of LOG at %L cannot be zero",
4592 gfc_free_expr (result
);
4593 return &gfc_bad_expr
;
4596 gfc_set_model_kind (x
->ts
.kind
);
4597 mpc_log (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
4601 gfc_internal_error ("gfc_simplify_log: bad type");
4604 return range_check (result
, "LOG");
4609 gfc_simplify_log10 (gfc_expr
*x
)
4613 if (x
->expr_type
!= EXPR_CONSTANT
)
4616 if (mpfr_sgn (x
->value
.real
) <= 0)
4618 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
4619 "to zero", &x
->where
);
4620 return &gfc_bad_expr
;
4623 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4624 mpfr_log10 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4626 return range_check (result
, "LOG10");
4631 gfc_simplify_logical (gfc_expr
*e
, gfc_expr
*k
)
4635 kind
= get_kind (BT_LOGICAL
, k
, "LOGICAL", gfc_default_logical_kind
);
4637 return &gfc_bad_expr
;
4639 if (e
->expr_type
!= EXPR_CONSTANT
)
4642 return gfc_get_logical_expr (kind
, &e
->where
, e
->value
.logical
);
4647 gfc_simplify_matmul (gfc_expr
*matrix_a
, gfc_expr
*matrix_b
)
4650 int row
, result_rows
, col
, result_columns
;
4651 int stride_a
, offset_a
, stride_b
, offset_b
;
4653 if (!is_constant_array_expr (matrix_a
)
4654 || !is_constant_array_expr (matrix_b
))
4657 /* MATMUL should do mixed-mode arithmetic. Set the result type. */
4658 if (matrix_a
->ts
.type
!= matrix_b
->ts
.type
)
4661 e
.expr_type
= EXPR_OP
;
4662 gfc_clear_ts (&e
.ts
);
4663 e
.value
.op
.op
= INTRINSIC_NONE
;
4664 e
.value
.op
.op1
= matrix_a
;
4665 e
.value
.op
.op2
= matrix_b
;
4666 gfc_type_convert_binary (&e
, 1);
4667 result
= gfc_get_array_expr (e
.ts
.type
, e
.ts
.kind
, &matrix_a
->where
);
4671 result
= gfc_get_array_expr (matrix_a
->ts
.type
, matrix_a
->ts
.kind
,
4675 if (matrix_a
->rank
== 1 && matrix_b
->rank
== 2)
4678 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
4680 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
4683 result
->shape
= gfc_get_shape (result
->rank
);
4684 mpz_init_set_si (result
->shape
[0], result_columns
);
4686 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 1)
4688 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
4690 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
4694 result
->shape
= gfc_get_shape (result
->rank
);
4695 mpz_init_set_si (result
->shape
[0], result_rows
);
4697 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 2)
4699 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
4700 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
4701 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
4702 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
4705 result
->shape
= gfc_get_shape (result
->rank
);
4706 mpz_init_set_si (result
->shape
[0], result_rows
);
4707 mpz_init_set_si (result
->shape
[1], result_columns
);
4712 offset_a
= offset_b
= 0;
4713 for (col
= 0; col
< result_columns
; ++col
)
4717 for (row
= 0; row
< result_rows
; ++row
)
4719 gfc_expr
*e
= compute_dot_product (matrix_a
, stride_a
, offset_a
,
4720 matrix_b
, 1, offset_b
, false);
4721 gfc_constructor_append_expr (&result
->value
.constructor
,
4727 offset_b
+= stride_b
;
4735 gfc_simplify_maskr (gfc_expr
*i
, gfc_expr
*kind_arg
)
4740 if (i
->expr_type
!= EXPR_CONSTANT
)
4743 kind
= get_kind (BT_INTEGER
, kind_arg
, "MASKR", gfc_default_integer_kind
);
4745 return &gfc_bad_expr
;
4746 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
4748 bool fail
= gfc_extract_int (i
, &arg
);
4751 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &i
->where
);
4753 /* MASKR(n) = 2^n - 1 */
4754 mpz_set_ui (result
->value
.integer
, 1);
4755 mpz_mul_2exp (result
->value
.integer
, result
->value
.integer
, arg
);
4756 mpz_sub_ui (result
->value
.integer
, result
->value
.integer
, 1);
4758 gfc_convert_mpz_to_signed (result
->value
.integer
, gfc_integer_kinds
[k
].bit_size
);
4765 gfc_simplify_maskl (gfc_expr
*i
, gfc_expr
*kind_arg
)
4771 if (i
->expr_type
!= EXPR_CONSTANT
)
4774 kind
= get_kind (BT_INTEGER
, kind_arg
, "MASKL", gfc_default_integer_kind
);
4776 return &gfc_bad_expr
;
4777 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
4779 bool fail
= gfc_extract_int (i
, &arg
);
4782 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &i
->where
);
4784 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
4785 mpz_init_set_ui (z
, 1);
4786 mpz_mul_2exp (z
, z
, gfc_integer_kinds
[k
].bit_size
);
4787 mpz_set_ui (result
->value
.integer
, 1);
4788 mpz_mul_2exp (result
->value
.integer
, result
->value
.integer
,
4789 gfc_integer_kinds
[k
].bit_size
- arg
);
4790 mpz_sub (result
->value
.integer
, z
, result
->value
.integer
);
4793 gfc_convert_mpz_to_signed (result
->value
.integer
, gfc_integer_kinds
[k
].bit_size
);
4800 gfc_simplify_merge (gfc_expr
*tsource
, gfc_expr
*fsource
, gfc_expr
*mask
)
4803 gfc_constructor
*tsource_ctor
, *fsource_ctor
, *mask_ctor
;
4805 if (mask
->expr_type
== EXPR_CONSTANT
)
4806 return gfc_get_parentheses (gfc_copy_expr (mask
->value
.logical
4807 ? tsource
: fsource
));
4809 if (!mask
->rank
|| !is_constant_array_expr (mask
)
4810 || !is_constant_array_expr (tsource
) || !is_constant_array_expr (fsource
))
4813 result
= gfc_get_array_expr (tsource
->ts
.type
, tsource
->ts
.kind
,
4815 if (tsource
->ts
.type
== BT_DERIVED
)
4816 result
->ts
.u
.derived
= tsource
->ts
.u
.derived
;
4817 else if (tsource
->ts
.type
== BT_CHARACTER
)
4818 result
->ts
.u
.cl
= tsource
->ts
.u
.cl
;
4820 tsource_ctor
= gfc_constructor_first (tsource
->value
.constructor
);
4821 fsource_ctor
= gfc_constructor_first (fsource
->value
.constructor
);
4822 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
4826 if (mask_ctor
->expr
->value
.logical
)
4827 gfc_constructor_append_expr (&result
->value
.constructor
,
4828 gfc_copy_expr (tsource_ctor
->expr
),
4831 gfc_constructor_append_expr (&result
->value
.constructor
,
4832 gfc_copy_expr (fsource_ctor
->expr
),
4834 tsource_ctor
= gfc_constructor_next (tsource_ctor
);
4835 fsource_ctor
= gfc_constructor_next (fsource_ctor
);
4836 mask_ctor
= gfc_constructor_next (mask_ctor
);
4839 result
->shape
= gfc_get_shape (1);
4840 gfc_array_size (result
, &result
->shape
[0]);
4847 gfc_simplify_merge_bits (gfc_expr
*i
, gfc_expr
*j
, gfc_expr
*mask_expr
)
4849 mpz_t arg1
, arg2
, mask
;
4852 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
4853 || mask_expr
->expr_type
!= EXPR_CONSTANT
)
4856 result
= gfc_get_constant_expr (BT_INTEGER
, i
->ts
.kind
, &i
->where
);
4858 /* Convert all argument to unsigned. */
4859 mpz_init_set (arg1
, i
->value
.integer
);
4860 mpz_init_set (arg2
, j
->value
.integer
);
4861 mpz_init_set (mask
, mask_expr
->value
.integer
);
4863 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
4864 mpz_and (arg1
, arg1
, mask
);
4865 mpz_com (mask
, mask
);
4866 mpz_and (arg2
, arg2
, mask
);
4867 mpz_ior (result
->value
.integer
, arg1
, arg2
);
4877 /* Selects between current value and extremum for simplify_min_max
4878 and simplify_minval_maxval. */
4880 min_max_choose (gfc_expr
*arg
, gfc_expr
*extremum
, int sign
, bool back_val
)
4884 switch (arg
->ts
.type
)
4887 ret
= mpz_cmp (arg
->value
.integer
,
4888 extremum
->value
.integer
) * sign
;
4890 mpz_set (extremum
->value
.integer
, arg
->value
.integer
);
4894 if (mpfr_nan_p (extremum
->value
.real
))
4897 mpfr_set (extremum
->value
.real
, arg
->value
.real
, GFC_RND_MODE
);
4899 else if (mpfr_nan_p (arg
->value
.real
))
4903 ret
= mpfr_cmp (arg
->value
.real
, extremum
->value
.real
) * sign
;
4905 mpfr_set (extremum
->value
.real
, arg
->value
.real
, GFC_RND_MODE
);
4910 #define LENGTH(x) ((x)->value.character.length)
4911 #define STRING(x) ((x)->value.character.string)
4912 if (LENGTH (extremum
) < LENGTH(arg
))
4914 gfc_char_t
*tmp
= STRING(extremum
);
4916 STRING(extremum
) = gfc_get_wide_string (LENGTH(arg
) + 1);
4917 memcpy (STRING(extremum
), tmp
,
4918 LENGTH(extremum
) * sizeof (gfc_char_t
));
4919 gfc_wide_memset (&STRING(extremum
)[LENGTH(extremum
)], ' ',
4920 LENGTH(arg
) - LENGTH(extremum
));
4921 STRING(extremum
)[LENGTH(arg
)] = '\0'; /* For debugger */
4922 LENGTH(extremum
) = LENGTH(arg
);
4925 ret
= gfc_compare_string (arg
, extremum
) * sign
;
4928 free (STRING(extremum
));
4929 STRING(extremum
) = gfc_get_wide_string (LENGTH(extremum
) + 1);
4930 memcpy (STRING(extremum
), STRING(arg
),
4931 LENGTH(arg
) * sizeof (gfc_char_t
));
4932 gfc_wide_memset (&STRING(extremum
)[LENGTH(arg
)], ' ',
4933 LENGTH(extremum
) - LENGTH(arg
));
4934 STRING(extremum
)[LENGTH(extremum
)] = '\0'; /* For debugger */
4941 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
4943 if (back_val
&& ret
== 0)
4950 /* This function is special since MAX() can take any number of
4951 arguments. The simplified expression is a rewritten version of the
4952 argument list containing at most one constant element. Other
4953 constant elements are deleted. Because the argument list has
4954 already been checked, this function always succeeds. sign is 1 for
4955 MAX(), -1 for MIN(). */
4958 simplify_min_max (gfc_expr
*expr
, int sign
)
4960 gfc_actual_arglist
*arg
, *last
, *extremum
;
4961 gfc_intrinsic_sym
* specific
;
4965 specific
= expr
->value
.function
.isym
;
4967 arg
= expr
->value
.function
.actual
;
4969 for (; arg
; last
= arg
, arg
= arg
->next
)
4971 if (arg
->expr
->expr_type
!= EXPR_CONSTANT
)
4974 if (extremum
== NULL
)
4980 min_max_choose (arg
->expr
, extremum
->expr
, sign
);
4982 /* Delete the extra constant argument. */
4983 last
->next
= arg
->next
;
4986 gfc_free_actual_arglist (arg
);
4990 /* If there is one value left, replace the function call with the
4992 if (expr
->value
.function
.actual
->next
!= NULL
)
4995 /* Convert to the correct type and kind. */
4996 if (expr
->ts
.type
!= BT_UNKNOWN
)
4997 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
4998 expr
->ts
.type
, expr
->ts
.kind
);
5000 if (specific
->ts
.type
!= BT_UNKNOWN
)
5001 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
5002 specific
->ts
.type
, specific
->ts
.kind
);
5004 return gfc_copy_expr (expr
->value
.function
.actual
->expr
);
5009 gfc_simplify_min (gfc_expr
*e
)
5011 return simplify_min_max (e
, -1);
5016 gfc_simplify_max (gfc_expr
*e
)
5018 return simplify_min_max (e
, 1);
5021 /* Helper function for gfc_simplify_minval. */
5024 gfc_min (gfc_expr
*op1
, gfc_expr
*op2
)
5026 min_max_choose (op1
, op2
, -1);
5027 gfc_free_expr (op1
);
5031 /* Simplify minval for constant arrays. */
5034 gfc_simplify_minval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
5036 return simplify_transformation (array
, dim
, mask
, INT_MAX
, gfc_min
);
5039 /* Helper function for gfc_simplify_maxval. */
5042 gfc_max (gfc_expr
*op1
, gfc_expr
*op2
)
5044 min_max_choose (op1
, op2
, 1);
5045 gfc_free_expr (op1
);
5050 /* Simplify maxval for constant arrays. */
5053 gfc_simplify_maxval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
5055 return simplify_transformation (array
, dim
, mask
, INT_MIN
, gfc_max
);
5059 /* Transform minloc or maxloc of an array, according to MASK,
5060 to the scalar result. This code is mostly identical to
5061 simplify_transformation_to_scalar. */
5064 simplify_minmaxloc_to_scalar (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*mask
,
5065 gfc_expr
*extremum
, int sign
, bool back_val
)
5068 gfc_constructor
*array_ctor
, *mask_ctor
;
5071 mpz_set_si (result
->value
.integer
, 0);
5074 /* Shortcut for constant .FALSE. MASK. */
5076 && mask
->expr_type
== EXPR_CONSTANT
5077 && !mask
->value
.logical
)
5080 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
5081 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
5082 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
5086 mpz_init_set_si (count
, 0);
5089 mpz_add_ui (count
, count
, 1);
5090 a
= array_ctor
->expr
;
5091 array_ctor
= gfc_constructor_next (array_ctor
);
5092 /* A constant MASK equals .TRUE. here and can be ignored. */
5095 m
= mask_ctor
->expr
;
5096 mask_ctor
= gfc_constructor_next (mask_ctor
);
5097 if (!m
->value
.logical
)
5100 if (min_max_choose (a
, extremum
, sign
, back_val
) > 0)
5101 mpz_set (result
->value
.integer
, count
);
5104 gfc_free_expr (extremum
);
5108 /* Simplify minloc / maxloc in the absence of a dim argument. */
5111 simplify_minmaxloc_nodim (gfc_expr
*result
, gfc_expr
*extremum
,
5112 gfc_expr
*array
, gfc_expr
*mask
, int sign
,
5115 ssize_t res
[GFC_MAX_DIMENSIONS
];
5117 gfc_constructor
*result_ctor
, *array_ctor
, *mask_ctor
;
5118 ssize_t count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
5119 sstride
[GFC_MAX_DIMENSIONS
];
5124 for (i
= 0; i
<array
->rank
; i
++)
5127 /* Shortcut for constant .FALSE. MASK. */
5129 && mask
->expr_type
== EXPR_CONSTANT
5130 && !mask
->value
.logical
)
5133 for (i
= 0; i
< array
->rank
; i
++)
5136 sstride
[i
] = (i
== 0) ? 1 : sstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
5137 extent
[i
] = mpz_get_si (array
->shape
[i
]);
5142 continue_loop
= true;
5143 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
5144 if (mask
&& mask
->rank
> 0)
5145 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
5149 /* Loop over the array elements (and mask), keeping track of
5150 the indices to return. */
5151 while (continue_loop
)
5155 a
= array_ctor
->expr
;
5158 m
= mask_ctor
->expr
;
5159 ma
= m
->value
.logical
;
5160 mask_ctor
= gfc_constructor_next (mask_ctor
);
5165 if (ma
&& min_max_choose (a
, extremum
, sign
, back_val
) > 0)
5167 for (i
= 0; i
<array
->rank
; i
++)
5170 array_ctor
= gfc_constructor_next (array_ctor
);
5172 } while (count
[0] != extent
[0]);
5176 /* When we get to the end of a dimension, reset it and increment
5177 the next dimension. */
5180 if (n
>= array
->rank
)
5182 continue_loop
= false;
5187 } while (count
[n
] == extent
[n
]);
5191 gfc_free_expr (extremum
);
5192 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
5193 for (i
= 0; i
<array
->rank
; i
++)
5196 r_expr
= result_ctor
->expr
;
5197 mpz_set_si (r_expr
->value
.integer
, res
[i
] + 1);
5198 result_ctor
= gfc_constructor_next (result_ctor
);
5203 /* Helper function for gfc_simplify_minmaxloc - build an array
5204 expression with n elements. */
5207 new_array (bt type
, int kind
, int n
, locus
*where
)
5212 result
= gfc_get_array_expr (type
, kind
, where
);
5214 result
->shape
= gfc_get_shape(1);
5215 mpz_init_set_si (result
->shape
[0], n
);
5216 for (i
= 0; i
< n
; i
++)
5218 gfc_constructor_append_expr (&result
->value
.constructor
,
5219 gfc_get_constant_expr (type
, kind
, where
),
5226 /* Simplify minloc and maxloc. This code is mostly identical to
5227 simplify_transformation_to_array. */
5230 simplify_minmaxloc_to_array (gfc_expr
*result
, gfc_expr
*array
,
5231 gfc_expr
*dim
, gfc_expr
*mask
,
5232 gfc_expr
*extremum
, int sign
, bool back_val
)
5235 int done
, i
, n
, arraysize
, resultsize
, dim_index
, dim_extent
, dim_stride
;
5236 gfc_expr
**arrayvec
, **resultvec
, **base
, **src
, **dest
;
5237 gfc_constructor
*array_ctor
, *mask_ctor
, *result_ctor
;
5239 int count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
5240 sstride
[GFC_MAX_DIMENSIONS
], dstride
[GFC_MAX_DIMENSIONS
],
5241 tmpstride
[GFC_MAX_DIMENSIONS
];
5243 /* Shortcut for constant .FALSE. MASK. */
5245 && mask
->expr_type
== EXPR_CONSTANT
5246 && !mask
->value
.logical
)
5249 /* Build an indexed table for array element expressions to minimize
5250 linked-list traversal. Masked elements are set to NULL. */
5251 gfc_array_size (array
, &size
);
5252 arraysize
= mpz_get_ui (size
);
5255 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
5257 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
5259 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
5260 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
5262 for (i
= 0; i
< arraysize
; ++i
)
5264 arrayvec
[i
] = array_ctor
->expr
;
5265 array_ctor
= gfc_constructor_next (array_ctor
);
5269 if (!mask_ctor
->expr
->value
.logical
)
5272 mask_ctor
= gfc_constructor_next (mask_ctor
);
5276 /* Same for the result expression. */
5277 gfc_array_size (result
, &size
);
5278 resultsize
= mpz_get_ui (size
);
5281 resultvec
= XCNEWVEC (gfc_expr
*, resultsize
);
5282 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
5283 for (i
= 0; i
< resultsize
; ++i
)
5285 resultvec
[i
] = result_ctor
->expr
;
5286 result_ctor
= gfc_constructor_next (result_ctor
);
5289 gfc_extract_int (dim
, &dim_index
);
5290 dim_index
-= 1; /* zero-base index */
5294 for (i
= 0, n
= 0; i
< array
->rank
; ++i
)
5297 tmpstride
[i
] = (i
== 0) ? 1 : tmpstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
5300 dim_extent
= mpz_get_si (array
->shape
[i
]);
5301 dim_stride
= tmpstride
[i
];
5305 extent
[n
] = mpz_get_si (array
->shape
[i
]);
5306 sstride
[n
] = tmpstride
[i
];
5307 dstride
[n
] = (n
== 0) ? 1 : dstride
[n
-1] * extent
[n
-1];
5311 done
= resultsize
<= 0;
5317 ex
= gfc_copy_expr (extremum
);
5318 for (src
= base
, n
= 0; n
< dim_extent
; src
+= dim_stride
, ++n
)
5320 if (*src
&& min_max_choose (*src
, ex
, sign
, back_val
) > 0)
5321 mpz_set_si ((*dest
)->value
.integer
, n
+ 1);
5330 while (!done
&& count
[n
] == extent
[n
])
5333 base
-= sstride
[n
] * extent
[n
];
5334 dest
-= dstride
[n
] * extent
[n
];
5337 if (n
< result
->rank
)
5339 /* If the nested loop is unrolled GFC_MAX_DIMENSIONS
5340 times, we'd warn for the last iteration, because the
5341 array index will have already been incremented to the
5342 array sizes, and we can't tell that this must make
5343 the test against result->rank false, because ranks
5344 must not exceed GFC_MAX_DIMENSIONS. */
5345 GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray
-bounds
)
5356 /* Place updated expression in result constructor. */
5357 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
5358 for (i
= 0; i
< resultsize
; ++i
)
5360 result_ctor
->expr
= resultvec
[i
];
5361 result_ctor
= gfc_constructor_next (result_ctor
);
5370 /* Simplify minloc and maxloc for constant arrays. */
5373 gfc_simplify_minmaxloc (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
,
5374 gfc_expr
*kind
, gfc_expr
*back
, int sign
)
5380 bool back_val
= false;
5382 if (!is_constant_array_expr (array
)
5383 || !gfc_is_constant_expr (dim
))
5387 && !is_constant_array_expr (mask
)
5388 && mask
->expr_type
!= EXPR_CONSTANT
)
5393 if (gfc_extract_int (kind
, &ikind
, -1))
5397 ikind
= gfc_default_integer_kind
;
5401 if (back
->expr_type
!= EXPR_CONSTANT
)
5404 back_val
= back
->value
.logical
;
5414 extremum
= gfc_get_constant_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
5415 init_result_expr (extremum
, init_val
, array
);
5419 result
= transformational_result (array
, dim
, BT_INTEGER
,
5420 ikind
, &array
->where
);
5421 init_result_expr (result
, 0, array
);
5423 if (array
->rank
== 1)
5424 return simplify_minmaxloc_to_scalar (result
, array
, mask
, extremum
,
5427 return simplify_minmaxloc_to_array (result
, array
, dim
, mask
, extremum
,
5432 result
= new_array (BT_INTEGER
, ikind
, array
->rank
, &array
->where
);
5433 return simplify_minmaxloc_nodim (result
, extremum
, array
, mask
,
5439 gfc_simplify_minloc (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
, gfc_expr
*kind
,
5442 return gfc_simplify_minmaxloc (array
, dim
, mask
, kind
, back
, -1);
5446 gfc_simplify_maxloc (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
, gfc_expr
*kind
,
5449 return gfc_simplify_minmaxloc (array
, dim
, mask
, kind
, back
, 1);
5453 gfc_simplify_maxexponent (gfc_expr
*x
)
5455 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
5456 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
5457 gfc_real_kinds
[i
].max_exponent
);
5462 gfc_simplify_minexponent (gfc_expr
*x
)
5464 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
5465 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
5466 gfc_real_kinds
[i
].min_exponent
);
5471 gfc_simplify_mod (gfc_expr
*a
, gfc_expr
*p
)
5476 /* First check p. */
5477 if (p
->expr_type
!= EXPR_CONSTANT
)
5480 /* p shall not be 0. */
5484 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
5486 gfc_error ("Argument %qs of MOD at %L shall not be zero",
5488 return &gfc_bad_expr
;
5492 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
5494 gfc_error ("Argument %qs of MOD at %L shall not be zero",
5496 return &gfc_bad_expr
;
5500 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
5503 if (a
->expr_type
!= EXPR_CONSTANT
)
5506 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
5507 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
5509 if (a
->ts
.type
== BT_INTEGER
)
5510 mpz_tdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
5513 gfc_set_model_kind (kind
);
5514 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
5518 return range_check (result
, "MOD");
5523 gfc_simplify_modulo (gfc_expr
*a
, gfc_expr
*p
)
5528 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
5531 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
5532 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
5537 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
5539 /* Result is processor-dependent. This processor just opts
5540 to not handle it at all. */
5541 gfc_error ("Second argument of MODULO at %L is zero", &a
->where
);
5542 gfc_free_expr (result
);
5543 return &gfc_bad_expr
;
5545 mpz_fdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
5550 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
5552 /* Result is processor-dependent. */
5553 gfc_error ("Second argument of MODULO at %L is zero", &p
->where
);
5554 gfc_free_expr (result
);
5555 return &gfc_bad_expr
;
5558 gfc_set_model_kind (kind
);
5559 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
5561 if (mpfr_cmp_ui (result
->value
.real
, 0) != 0)
5563 if (mpfr_signbit (a
->value
.real
) != mpfr_signbit (p
->value
.real
))
5564 mpfr_add (result
->value
.real
, result
->value
.real
, p
->value
.real
,
5568 mpfr_copysign (result
->value
.real
, result
->value
.real
,
5569 p
->value
.real
, GFC_RND_MODE
);
5573 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
5576 return range_check (result
, "MODULO");
5581 gfc_simplify_nearest (gfc_expr
*x
, gfc_expr
*s
)
5584 mp_exp_t emin
, emax
;
5587 if (x
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
5590 result
= gfc_copy_expr (x
);
5592 /* Save current values of emin and emax. */
5593 emin
= mpfr_get_emin ();
5594 emax
= mpfr_get_emax ();
5596 /* Set emin and emax for the current model number. */
5597 kind
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, 0);
5598 mpfr_set_emin ((mp_exp_t
) gfc_real_kinds
[kind
].min_exponent
-
5599 mpfr_get_prec(result
->value
.real
) + 1);
5600 mpfr_set_emax ((mp_exp_t
) gfc_real_kinds
[kind
].max_exponent
- 1);
5601 mpfr_check_range (result
->value
.real
, 0, GMP_RNDU
);
5603 if (mpfr_sgn (s
->value
.real
) > 0)
5605 mpfr_nextabove (result
->value
.real
);
5606 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDU
);
5610 mpfr_nextbelow (result
->value
.real
);
5611 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDD
);
5614 mpfr_set_emin (emin
);
5615 mpfr_set_emax (emax
);
5617 /* Only NaN can occur. Do not use range check as it gives an
5618 error for denormal numbers. */
5619 if (mpfr_nan_p (result
->value
.real
) && flag_range_check
)
5621 gfc_error ("Result of NEAREST is NaN at %L", &result
->where
);
5622 gfc_free_expr (result
);
5623 return &gfc_bad_expr
;
5631 simplify_nint (const char *name
, gfc_expr
*e
, gfc_expr
*k
)
5633 gfc_expr
*itrunc
, *result
;
5636 kind
= get_kind (BT_INTEGER
, k
, name
, gfc_default_integer_kind
);
5638 return &gfc_bad_expr
;
5640 if (e
->expr_type
!= EXPR_CONSTANT
)
5643 itrunc
= gfc_copy_expr (e
);
5644 mpfr_round (itrunc
->value
.real
, e
->value
.real
);
5646 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
5647 gfc_mpfr_to_mpz (result
->value
.integer
, itrunc
->value
.real
, &e
->where
);
5649 gfc_free_expr (itrunc
);
5651 return range_check (result
, name
);
5656 gfc_simplify_new_line (gfc_expr
*e
)
5660 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 1);
5661 result
->value
.character
.string
[0] = '\n';
5668 gfc_simplify_nint (gfc_expr
*e
, gfc_expr
*k
)
5670 return simplify_nint ("NINT", e
, k
);
5675 gfc_simplify_idnint (gfc_expr
*e
)
5677 return simplify_nint ("IDNINT", e
, NULL
);
5682 add_squared (gfc_expr
*result
, gfc_expr
*e
)
5686 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
5687 gcc_assert (result
->ts
.type
== BT_REAL
5688 && result
->expr_type
== EXPR_CONSTANT
);
5690 gfc_set_model_kind (result
->ts
.kind
);
5692 mpfr_pow_ui (tmp
, e
->value
.real
, 2, GFC_RND_MODE
);
5693 mpfr_add (result
->value
.real
, result
->value
.real
, tmp
,
5702 do_sqrt (gfc_expr
*result
, gfc_expr
*e
)
5704 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
5705 gcc_assert (result
->ts
.type
== BT_REAL
5706 && result
->expr_type
== EXPR_CONSTANT
);
5708 mpfr_set (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
5709 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
5715 gfc_simplify_norm2 (gfc_expr
*e
, gfc_expr
*dim
)
5720 size_zero
= gfc_is_size_zero_array (e
);
5722 if (!(is_constant_array_expr (e
) || size_zero
)
5723 || (dim
!= NULL
&& !gfc_is_constant_expr (dim
)))
5726 result
= transformational_result (e
, dim
, e
->ts
.type
, e
->ts
.kind
, &e
->where
);
5727 init_result_expr (result
, 0, NULL
);
5732 if (!dim
|| e
->rank
== 1)
5734 result
= simplify_transformation_to_scalar (result
, e
, NULL
,
5736 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
5739 result
= simplify_transformation_to_array (result
, e
, dim
, NULL
,
5740 add_squared
, &do_sqrt
);
5747 gfc_simplify_not (gfc_expr
*e
)
5751 if (e
->expr_type
!= EXPR_CONSTANT
)
5754 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
5755 mpz_com (result
->value
.integer
, e
->value
.integer
);
5757 return range_check (result
, "NOT");
5762 gfc_simplify_null (gfc_expr
*mold
)
5768 result
= gfc_copy_expr (mold
);
5769 result
->expr_type
= EXPR_NULL
;
5772 result
= gfc_get_null_expr (NULL
);
5779 gfc_simplify_num_images (gfc_expr
*distance ATTRIBUTE_UNUSED
, gfc_expr
*failed
)
5783 if (flag_coarray
== GFC_FCOARRAY_NONE
)
5785 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
5786 return &gfc_bad_expr
;
5789 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
)
5792 if (failed
&& failed
->expr_type
!= EXPR_CONSTANT
)
5795 /* FIXME: gfc_current_locus is wrong. */
5796 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
5797 &gfc_current_locus
);
5799 if (failed
&& failed
->value
.logical
!= 0)
5800 mpz_set_si (result
->value
.integer
, 0);
5802 mpz_set_si (result
->value
.integer
, 1);
5809 gfc_simplify_or (gfc_expr
*x
, gfc_expr
*y
)
5814 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
5817 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
5822 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
5823 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
5824 return range_check (result
, "OR");
5827 return gfc_get_logical_expr (kind
, &x
->where
,
5828 x
->value
.logical
|| y
->value
.logical
);
5836 gfc_simplify_pack (gfc_expr
*array
, gfc_expr
*mask
, gfc_expr
*vector
)
5839 gfc_constructor
*array_ctor
, *mask_ctor
, *vector_ctor
;
5841 if (!is_constant_array_expr (array
)
5842 || !is_constant_array_expr (vector
)
5843 || (!gfc_is_constant_expr (mask
)
5844 && !is_constant_array_expr (mask
)))
5847 result
= gfc_get_array_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
5848 if (array
->ts
.type
== BT_DERIVED
)
5849 result
->ts
.u
.derived
= array
->ts
.u
.derived
;
5851 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
5852 vector_ctor
= vector
5853 ? gfc_constructor_first (vector
->value
.constructor
)
5856 if (mask
->expr_type
== EXPR_CONSTANT
5857 && mask
->value
.logical
)
5859 /* Copy all elements of ARRAY to RESULT. */
5862 gfc_constructor_append_expr (&result
->value
.constructor
,
5863 gfc_copy_expr (array_ctor
->expr
),
5866 array_ctor
= gfc_constructor_next (array_ctor
);
5867 vector_ctor
= gfc_constructor_next (vector_ctor
);
5870 else if (mask
->expr_type
== EXPR_ARRAY
)
5872 /* Copy only those elements of ARRAY to RESULT whose
5873 MASK equals .TRUE.. */
5874 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
5877 if (mask_ctor
->expr
->value
.logical
)
5879 gfc_constructor_append_expr (&result
->value
.constructor
,
5880 gfc_copy_expr (array_ctor
->expr
),
5882 vector_ctor
= gfc_constructor_next (vector_ctor
);
5885 array_ctor
= gfc_constructor_next (array_ctor
);
5886 mask_ctor
= gfc_constructor_next (mask_ctor
);
5890 /* Append any left-over elements from VECTOR to RESULT. */
5893 gfc_constructor_append_expr (&result
->value
.constructor
,
5894 gfc_copy_expr (vector_ctor
->expr
),
5896 vector_ctor
= gfc_constructor_next (vector_ctor
);
5899 result
->shape
= gfc_get_shape (1);
5900 gfc_array_size (result
, &result
->shape
[0]);
5902 if (array
->ts
.type
== BT_CHARACTER
)
5903 result
->ts
.u
.cl
= array
->ts
.u
.cl
;
5910 do_xor (gfc_expr
*result
, gfc_expr
*e
)
5912 gcc_assert (e
->ts
.type
== BT_LOGICAL
&& e
->expr_type
== EXPR_CONSTANT
);
5913 gcc_assert (result
->ts
.type
== BT_LOGICAL
5914 && result
->expr_type
== EXPR_CONSTANT
);
5916 result
->value
.logical
= result
->value
.logical
!= e
->value
.logical
;
5923 gfc_simplify_parity (gfc_expr
*e
, gfc_expr
*dim
)
5925 return simplify_transformation (e
, dim
, NULL
, 0, do_xor
);
5930 gfc_simplify_popcnt (gfc_expr
*e
)
5935 if (e
->expr_type
!= EXPR_CONSTANT
)
5938 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5940 /* Convert argument to unsigned, then count the '1' bits. */
5941 mpz_init_set (x
, e
->value
.integer
);
5942 convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
5943 res
= mpz_popcount (x
);
5946 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, res
);
5951 gfc_simplify_poppar (gfc_expr
*e
)
5956 if (e
->expr_type
!= EXPR_CONSTANT
)
5959 popcnt
= gfc_simplify_popcnt (e
);
5960 gcc_assert (popcnt
);
5962 bool fail
= gfc_extract_int (popcnt
, &i
);
5965 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
% 2);
5970 gfc_simplify_precision (gfc_expr
*e
)
5972 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5973 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
,
5974 gfc_real_kinds
[i
].precision
);
5979 gfc_simplify_product (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
5981 return simplify_transformation (array
, dim
, mask
, 1, gfc_multiply
);
5986 gfc_simplify_radix (gfc_expr
*e
)
5989 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5994 i
= gfc_integer_kinds
[i
].radix
;
5998 i
= gfc_real_kinds
[i
].radix
;
6005 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
6010 gfc_simplify_range (gfc_expr
*e
)
6013 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
6018 i
= gfc_integer_kinds
[i
].range
;
6023 i
= gfc_real_kinds
[i
].range
;
6030 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
6035 gfc_simplify_rank (gfc_expr
*e
)
6041 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, e
->rank
);
6046 gfc_simplify_real (gfc_expr
*e
, gfc_expr
*k
)
6048 gfc_expr
*result
= NULL
;
6051 if (e
->ts
.type
== BT_COMPLEX
)
6052 kind
= get_kind (BT_REAL
, k
, "REAL", e
->ts
.kind
);
6054 kind
= get_kind (BT_REAL
, k
, "REAL", gfc_default_real_kind
);
6057 return &gfc_bad_expr
;
6059 if (e
->expr_type
!= EXPR_CONSTANT
)
6062 if (convert_boz (e
, kind
) == &gfc_bad_expr
)
6063 return &gfc_bad_expr
;
6065 result
= gfc_convert_constant (e
, BT_REAL
, kind
);
6066 if (result
== &gfc_bad_expr
)
6067 return &gfc_bad_expr
;
6069 return range_check (result
, "REAL");
6074 gfc_simplify_realpart (gfc_expr
*e
)
6078 if (e
->expr_type
!= EXPR_CONSTANT
)
6081 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
6082 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
6084 return range_check (result
, "REALPART");
6088 gfc_simplify_repeat (gfc_expr
*e
, gfc_expr
*n
)
6093 bool have_length
= false;
6095 /* If NCOPIES isn't a constant, there's nothing we can do. */
6096 if (n
->expr_type
!= EXPR_CONSTANT
)
6099 /* If NCOPIES is negative, it's an error. */
6100 if (mpz_sgn (n
->value
.integer
) < 0)
6102 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
6104 return &gfc_bad_expr
;
6107 /* If we don't know the character length, we can do no more. */
6108 if (e
->ts
.u
.cl
&& e
->ts
.u
.cl
->length
6109 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
)
6111 len
= gfc_mpz_get_hwi (e
->ts
.u
.cl
->length
->value
.integer
);
6114 else if (e
->expr_type
== EXPR_CONSTANT
6115 && (e
->ts
.u
.cl
== NULL
|| e
->ts
.u
.cl
->length
== NULL
))
6117 len
= e
->value
.character
.length
;
6122 /* If the source length is 0, any value of NCOPIES is valid
6123 and everything behaves as if NCOPIES == 0. */
6126 mpz_set_ui (ncopies
, 0);
6128 mpz_set (ncopies
, n
->value
.integer
);
6130 /* Check that NCOPIES isn't too large. */
6136 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
6138 i
= gfc_validate_kind (BT_INTEGER
, gfc_charlen_int_kind
, false);
6142 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
,
6143 e
->ts
.u
.cl
->length
->value
.integer
);
6148 gfc_mpz_set_hwi (mlen
, len
);
6149 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
, mlen
);
6153 /* The check itself. */
6154 if (mpz_cmp (ncopies
, max
) > 0)
6157 mpz_clear (ncopies
);
6158 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
6160 return &gfc_bad_expr
;
6165 mpz_clear (ncopies
);
6167 /* For further simplification, we need the character string to be
6169 if (e
->expr_type
!= EXPR_CONSTANT
)
6174 (e
->ts
.u
.cl
->length
&&
6175 mpz_sgn (e
->ts
.u
.cl
->length
->value
.integer
) != 0))
6177 bool fail
= gfc_extract_hwi (n
, &ncop
);
6184 return gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 0);
6186 len
= e
->value
.character
.length
;
6187 gfc_charlen_t nlen
= ncop
* len
;
6189 /* Here's a semi-arbitrary limit. If the string is longer than 1 GB
6190 (2**28 elements * 4 bytes (wide chars) per element) defer to
6191 runtime instead of consuming (unbounded) memory and CPU at
6193 if (nlen
> 268435456)
6195 gfc_warning_now (0, "Evaluation of string longer than 2**28 at %L"
6196 " deferred to runtime, expect bugs", &e
->where
);
6200 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, nlen
);
6201 for (size_t i
= 0; i
< (size_t) ncop
; i
++)
6202 for (size_t j
= 0; j
< (size_t) len
; j
++)
6203 result
->value
.character
.string
[j
+i
*len
]= e
->value
.character
.string
[j
];
6205 result
->value
.character
.string
[nlen
] = '\0'; /* For debugger */
6210 /* This one is a bear, but mainly has to do with shuffling elements. */
6213 gfc_simplify_reshape (gfc_expr
*source
, gfc_expr
*shape_exp
,
6214 gfc_expr
*pad
, gfc_expr
*order_exp
)
6216 int order
[GFC_MAX_DIMENSIONS
], shape
[GFC_MAX_DIMENSIONS
];
6217 int i
, rank
, npad
, x
[GFC_MAX_DIMENSIONS
];
6221 gfc_expr
*e
, *result
;
6223 /* Check that argument expression types are OK. */
6224 if (!is_constant_array_expr (source
)
6225 || !is_constant_array_expr (shape_exp
)
6226 || !is_constant_array_expr (pad
)
6227 || !is_constant_array_expr (order_exp
))
6230 if (source
->shape
== NULL
)
6233 /* Proceed with simplification, unpacking the array. */
6240 e
= gfc_constructor_lookup_expr (shape_exp
->value
.constructor
, rank
);
6244 gfc_extract_int (e
, &shape
[rank
]);
6246 gcc_assert (rank
>= 0 && rank
< GFC_MAX_DIMENSIONS
);
6247 gcc_assert (shape
[rank
] >= 0);
6252 gcc_assert (rank
> 0);
6254 /* Now unpack the order array if present. */
6255 if (order_exp
== NULL
)
6257 for (i
= 0; i
< rank
; i
++)
6262 for (i
= 0; i
< rank
; i
++)
6265 for (i
= 0; i
< rank
; i
++)
6267 e
= gfc_constructor_lookup_expr (order_exp
->value
.constructor
, i
);
6270 gfc_extract_int (e
, &order
[i
]);
6272 gcc_assert (order
[i
] >= 1 && order
[i
] <= rank
);
6274 gcc_assert (x
[order
[i
]] == 0);
6279 /* Count the elements in the source and padding arrays. */
6284 gfc_array_size (pad
, &size
);
6285 npad
= mpz_get_ui (size
);
6289 gfc_array_size (source
, &size
);
6290 nsource
= mpz_get_ui (size
);
6293 /* If it weren't for that pesky permutation we could just loop
6294 through the source and round out any shortage with pad elements.
6295 But no, someone just had to have the compiler do something the
6296 user should be doing. */
6298 for (i
= 0; i
< rank
; i
++)
6301 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
6303 if (source
->ts
.type
== BT_DERIVED
)
6304 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
6305 result
->rank
= rank
;
6306 result
->shape
= gfc_get_shape (rank
);
6307 for (i
= 0; i
< rank
; i
++)
6308 mpz_init_set_ui (result
->shape
[i
], shape
[i
]);
6310 while (nsource
> 0 || npad
> 0)
6312 /* Figure out which element to extract. */
6313 mpz_set_ui (index
, 0);
6315 for (i
= rank
- 1; i
>= 0; i
--)
6317 mpz_add_ui (index
, index
, x
[order
[i
]]);
6319 mpz_mul_ui (index
, index
, shape
[order
[i
- 1]]);
6322 if (mpz_cmp_ui (index
, INT_MAX
) > 0)
6323 gfc_internal_error ("Reshaped array too large at %C");
6325 j
= mpz_get_ui (index
);
6328 e
= gfc_constructor_lookup_expr (source
->value
.constructor
, j
);
6338 e
= gfc_constructor_lookup_expr (pad
->value
.constructor
, j
);
6342 gfc_constructor_append_expr (&result
->value
.constructor
,
6343 gfc_copy_expr (e
), &e
->where
);
6345 /* Calculate the next element. */
6349 if (++x
[i
] < shape
[i
])
6365 gfc_simplify_rrspacing (gfc_expr
*x
)
6371 if (x
->expr_type
!= EXPR_CONSTANT
)
6374 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
6376 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
6378 /* RRSPACING(+/- 0.0) = 0.0 */
6379 if (mpfr_zero_p (x
->value
.real
))
6381 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
6385 /* RRSPACING(inf) = NaN */
6386 if (mpfr_inf_p (x
->value
.real
))
6388 mpfr_set_nan (result
->value
.real
);
6392 /* RRSPACING(NaN) = same NaN */
6393 if (mpfr_nan_p (x
->value
.real
))
6395 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6399 /* | x * 2**(-e) | * 2**p. */
6400 mpfr_abs (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6401 e
= - (long int) mpfr_get_exp (x
->value
.real
);
6402 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, e
, GFC_RND_MODE
);
6404 p
= (long int) gfc_real_kinds
[i
].digits
;
6405 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, p
, GFC_RND_MODE
);
6407 return range_check (result
, "RRSPACING");
6412 gfc_simplify_scale (gfc_expr
*x
, gfc_expr
*i
)
6414 int k
, neg_flag
, power
, exp_range
;
6415 mpfr_t scale
, radix
;
6418 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
6421 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
6423 if (mpfr_zero_p (x
->value
.real
))
6425 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
6429 k
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
6431 exp_range
= gfc_real_kinds
[k
].max_exponent
- gfc_real_kinds
[k
].min_exponent
;
6433 /* This check filters out values of i that would overflow an int. */
6434 if (mpz_cmp_si (i
->value
.integer
, exp_range
+ 2) > 0
6435 || mpz_cmp_si (i
->value
.integer
, -exp_range
- 2) < 0)
6437 gfc_error ("Result of SCALE overflows its kind at %L", &result
->where
);
6438 gfc_free_expr (result
);
6439 return &gfc_bad_expr
;
6442 /* Compute scale = radix ** power. */
6443 power
= mpz_get_si (i
->value
.integer
);
6453 gfc_set_model_kind (x
->ts
.kind
);
6456 mpfr_set_ui (radix
, gfc_real_kinds
[k
].radix
, GFC_RND_MODE
);
6457 mpfr_pow_ui (scale
, radix
, power
, GFC_RND_MODE
);
6460 mpfr_div (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
6462 mpfr_mul (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
6464 mpfr_clears (scale
, radix
, NULL
);
6466 return range_check (result
, "SCALE");
6470 /* Variants of strspn and strcspn that operate on wide characters. */
6473 wide_strspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
6476 const gfc_char_t
*c
;
6480 for (c
= s2
; *c
; c
++)
6494 wide_strcspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
6497 const gfc_char_t
*c
;
6501 for (c
= s2
; *c
; c
++)
6516 gfc_simplify_scan (gfc_expr
*e
, gfc_expr
*c
, gfc_expr
*b
, gfc_expr
*kind
)
6521 size_t indx
, len
, lenc
;
6522 int k
= get_kind (BT_INTEGER
, kind
, "SCAN", gfc_default_integer_kind
);
6525 return &gfc_bad_expr
;
6527 if (e
->expr_type
!= EXPR_CONSTANT
|| c
->expr_type
!= EXPR_CONSTANT
6528 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
6531 if (b
!= NULL
&& b
->value
.logical
!= 0)
6536 len
= e
->value
.character
.length
;
6537 lenc
= c
->value
.character
.length
;
6539 if (len
== 0 || lenc
== 0)
6547 indx
= wide_strcspn (e
->value
.character
.string
,
6548 c
->value
.character
.string
) + 1;
6555 for (indx
= len
; indx
> 0; indx
--)
6557 for (i
= 0; i
< lenc
; i
++)
6559 if (c
->value
.character
.string
[i
]
6560 == e
->value
.character
.string
[indx
- 1])
6569 result
= gfc_get_int_expr (k
, &e
->where
, indx
);
6570 return range_check (result
, "SCAN");
6575 gfc_simplify_selected_char_kind (gfc_expr
*e
)
6579 if (e
->expr_type
!= EXPR_CONSTANT
)
6582 if (gfc_compare_with_Cstring (e
, "ascii", false) == 0
6583 || gfc_compare_with_Cstring (e
, "default", false) == 0)
6585 else if (gfc_compare_with_Cstring (e
, "iso_10646", false) == 0)
6590 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
6595 gfc_simplify_selected_int_kind (gfc_expr
*e
)
6599 if (e
->expr_type
!= EXPR_CONSTANT
|| gfc_extract_int (e
, &range
))
6604 for (i
= 0; gfc_integer_kinds
[i
].kind
!= 0; i
++)
6605 if (gfc_integer_kinds
[i
].range
>= range
6606 && gfc_integer_kinds
[i
].kind
< kind
)
6607 kind
= gfc_integer_kinds
[i
].kind
;
6609 if (kind
== INT_MAX
)
6612 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
6617 gfc_simplify_selected_real_kind (gfc_expr
*p
, gfc_expr
*q
, gfc_expr
*rdx
)
6619 int range
, precision
, radix
, i
, kind
, found_precision
, found_range
,
6621 locus
*loc
= &gfc_current_locus
;
6627 if (p
->expr_type
!= EXPR_CONSTANT
6628 || gfc_extract_int (p
, &precision
))
6637 if (q
->expr_type
!= EXPR_CONSTANT
6638 || gfc_extract_int (q
, &range
))
6649 if (rdx
->expr_type
!= EXPR_CONSTANT
6650 || gfc_extract_int (rdx
, &radix
))
6658 found_precision
= 0;
6662 for (i
= 0; gfc_real_kinds
[i
].kind
!= 0; i
++)
6664 if (gfc_real_kinds
[i
].precision
>= precision
)
6665 found_precision
= 1;
6667 if (gfc_real_kinds
[i
].range
>= range
)
6670 if (radix
== 0 || gfc_real_kinds
[i
].radix
== radix
)
6673 if (gfc_real_kinds
[i
].precision
>= precision
6674 && gfc_real_kinds
[i
].range
>= range
6675 && (radix
== 0 || gfc_real_kinds
[i
].radix
== radix
)
6676 && gfc_real_kinds
[i
].kind
< kind
)
6677 kind
= gfc_real_kinds
[i
].kind
;
6680 if (kind
== INT_MAX
)
6682 if (found_radix
&& found_range
&& !found_precision
)
6684 else if (found_radix
&& found_precision
&& !found_range
)
6686 else if (found_radix
&& !found_precision
&& !found_range
)
6688 else if (found_radix
)
6694 return gfc_get_int_expr (gfc_default_integer_kind
, loc
, kind
);
6699 gfc_simplify_set_exponent (gfc_expr
*x
, gfc_expr
*i
)
6702 mpfr_t exp
, absv
, log2
, pow2
, frac
;
6705 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
6708 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
6710 /* SET_EXPONENT (+/-0.0, I) = +/- 0.0
6711 SET_EXPONENT (NaN) = same NaN */
6712 if (mpfr_zero_p (x
->value
.real
) || mpfr_nan_p (x
->value
.real
))
6714 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6718 /* SET_EXPONENT (inf) = NaN */
6719 if (mpfr_inf_p (x
->value
.real
))
6721 mpfr_set_nan (result
->value
.real
);
6725 gfc_set_model_kind (x
->ts
.kind
);
6732 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
6733 mpfr_log2 (log2
, absv
, GFC_RND_MODE
);
6735 mpfr_trunc (log2
, log2
);
6736 mpfr_add_ui (exp
, log2
, 1, GFC_RND_MODE
);
6738 /* Old exponent value, and fraction. */
6739 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
6741 mpfr_div (frac
, absv
, pow2
, GFC_RND_MODE
);
6744 exp2
= (unsigned long) mpz_get_d (i
->value
.integer
);
6745 mpfr_mul_2exp (result
->value
.real
, frac
, exp2
, GFC_RND_MODE
);
6747 mpfr_clears (absv
, log2
, pow2
, frac
, NULL
);
6749 return range_check (result
, "SET_EXPONENT");
6754 gfc_simplify_shape (gfc_expr
*source
, gfc_expr
*kind
)
6756 mpz_t shape
[GFC_MAX_DIMENSIONS
];
6757 gfc_expr
*result
, *e
, *f
;
6761 int k
= get_kind (BT_INTEGER
, kind
, "SHAPE", gfc_default_integer_kind
);
6763 if (source
->rank
== -1)
6766 result
= gfc_get_array_expr (BT_INTEGER
, k
, &source
->where
);
6768 if (source
->rank
== 0)
6771 if (source
->expr_type
== EXPR_VARIABLE
)
6773 ar
= gfc_find_array_ref (source
);
6774 t
= gfc_array_ref_shape (ar
, shape
);
6776 else if (source
->shape
)
6779 for (n
= 0; n
< source
->rank
; n
++)
6781 mpz_init (shape
[n
]);
6782 mpz_set (shape
[n
], source
->shape
[n
]);
6788 for (n
= 0; n
< source
->rank
; n
++)
6790 e
= gfc_get_constant_expr (BT_INTEGER
, k
, &source
->where
);
6793 mpz_set (e
->value
.integer
, shape
[n
]);
6796 mpz_set_ui (e
->value
.integer
, n
+ 1);
6798 f
= simplify_size (source
, e
, k
);
6802 gfc_free_expr (result
);
6809 if (e
== &gfc_bad_expr
|| range_check (e
, "SHAPE") == &gfc_bad_expr
)
6811 gfc_free_expr (result
);
6813 gfc_clear_shape (shape
, source
->rank
);
6814 return &gfc_bad_expr
;
6817 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
6821 gfc_clear_shape (shape
, source
->rank
);
6828 simplify_size (gfc_expr
*array
, gfc_expr
*dim
, int k
)
6831 gfc_expr
*return_value
;
6834 /* For unary operations, the size of the result is given by the size
6835 of the operand. For binary ones, it's the size of the first operand
6836 unless it is scalar, then it is the size of the second. */
6837 if (array
->expr_type
== EXPR_OP
&& !array
->value
.op
.uop
)
6839 gfc_expr
* replacement
;
6840 gfc_expr
* simplified
;
6842 switch (array
->value
.op
.op
)
6844 /* Unary operations. */
6846 case INTRINSIC_UPLUS
:
6847 case INTRINSIC_UMINUS
:
6848 case INTRINSIC_PARENTHESES
:
6849 replacement
= array
->value
.op
.op1
;
6852 /* Binary operations. If any one of the operands is scalar, take
6853 the other one's size. If both of them are arrays, it does not
6854 matter -- try to find one with known shape, if possible. */
6856 if (array
->value
.op
.op1
->rank
== 0)
6857 replacement
= array
->value
.op
.op2
;
6858 else if (array
->value
.op
.op2
->rank
== 0)
6859 replacement
= array
->value
.op
.op1
;
6862 simplified
= simplify_size (array
->value
.op
.op1
, dim
, k
);
6866 replacement
= array
->value
.op
.op2
;
6871 /* Try to reduce it directly if possible. */
6872 simplified
= simplify_size (replacement
, dim
, k
);
6874 /* Otherwise, we build a new SIZE call. This is hopefully at least
6875 simpler than the original one. */
6878 gfc_expr
*kind
= gfc_get_int_expr (gfc_default_integer_kind
, NULL
, k
);
6879 simplified
= gfc_build_intrinsic_call (gfc_current_ns
,
6880 GFC_ISYM_SIZE
, "size",
6882 gfc_copy_expr (replacement
),
6883 gfc_copy_expr (dim
),
6891 if (!gfc_array_size (array
, &size
))
6896 if (dim
->expr_type
!= EXPR_CONSTANT
)
6899 d
= mpz_get_ui (dim
->value
.integer
) - 1;
6900 if (!gfc_array_dimen_size (array
, d
, &size
))
6904 return_value
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
6905 mpz_set (return_value
->value
.integer
, size
);
6908 return return_value
;
6913 gfc_simplify_size (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
6916 int k
= get_kind (BT_INTEGER
, kind
, "SIZE", gfc_default_integer_kind
);
6919 return &gfc_bad_expr
;
6921 result
= simplify_size (array
, dim
, k
);
6922 if (result
== NULL
|| result
== &gfc_bad_expr
)
6925 return range_check (result
, "SIZE");
6929 /* SIZEOF and C_SIZEOF return the size in bytes of an array element
6930 multiplied by the array size. */
6933 gfc_simplify_sizeof (gfc_expr
*x
)
6935 gfc_expr
*result
= NULL
;
6938 if (x
->ts
.type
== BT_CLASS
|| x
->ts
.deferred
)
6941 if (x
->ts
.type
== BT_CHARACTER
6942 && (!x
->ts
.u
.cl
|| !x
->ts
.u
.cl
->length
6943 || x
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
))
6946 if (x
->rank
&& x
->expr_type
!= EXPR_ARRAY
6947 && !gfc_array_size (x
, &array_size
))
6950 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_index_integer_kind
,
6952 mpz_set_si (result
->value
.integer
, gfc_target_expr_size (x
));
6958 /* STORAGE_SIZE returns the size in bits of a single array element. */
6961 gfc_simplify_storage_size (gfc_expr
*x
,
6964 gfc_expr
*result
= NULL
;
6967 if (x
->ts
.type
== BT_CLASS
|| x
->ts
.deferred
)
6970 if (x
->ts
.type
== BT_CHARACTER
&& x
->expr_type
!= EXPR_CONSTANT
6971 && (!x
->ts
.u
.cl
|| !x
->ts
.u
.cl
->length
6972 || x
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
))
6975 k
= get_kind (BT_INTEGER
, kind
, "STORAGE_SIZE", gfc_default_integer_kind
);
6977 return &gfc_bad_expr
;
6979 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &x
->where
);
6981 mpz_set_si (result
->value
.integer
, gfc_element_size (x
));
6982 mpz_mul_ui (result
->value
.integer
, result
->value
.integer
, BITS_PER_UNIT
);
6984 return range_check (result
, "STORAGE_SIZE");
6989 gfc_simplify_sign (gfc_expr
*x
, gfc_expr
*y
)
6993 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
6996 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
7001 mpz_abs (result
->value
.integer
, x
->value
.integer
);
7002 if (mpz_sgn (y
->value
.integer
) < 0)
7003 mpz_neg (result
->value
.integer
, result
->value
.integer
);
7008 mpfr_copysign (result
->value
.real
, x
->value
.real
, y
->value
.real
,
7011 mpfr_setsign (result
->value
.real
, x
->value
.real
,
7012 mpfr_sgn (y
->value
.real
) < 0 ? 1 : 0, GFC_RND_MODE
);
7016 gfc_internal_error ("Bad type in gfc_simplify_sign");
7024 gfc_simplify_sin (gfc_expr
*x
)
7028 if (x
->expr_type
!= EXPR_CONSTANT
)
7031 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
7036 mpfr_sin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
7040 gfc_set_model (x
->value
.real
);
7041 mpc_sin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
7045 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
7048 return range_check (result
, "SIN");
7053 gfc_simplify_sinh (gfc_expr
*x
)
7057 if (x
->expr_type
!= EXPR_CONSTANT
)
7060 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
7065 mpfr_sinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
7069 mpc_sinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
7076 return range_check (result
, "SINH");
7080 /* The argument is always a double precision real that is converted to
7081 single precision. TODO: Rounding! */
7084 gfc_simplify_sngl (gfc_expr
*a
)
7088 if (a
->expr_type
!= EXPR_CONSTANT
)
7091 result
= gfc_real2real (a
, gfc_default_real_kind
);
7092 return range_check (result
, "SNGL");
7097 gfc_simplify_spacing (gfc_expr
*x
)
7103 if (x
->expr_type
!= EXPR_CONSTANT
)
7106 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
7107 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
7109 /* SPACING(+/- 0.0) = SPACING(TINY(0.0)) = TINY(0.0) */
7110 if (mpfr_zero_p (x
->value
.real
))
7112 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
7116 /* SPACING(inf) = NaN */
7117 if (mpfr_inf_p (x
->value
.real
))
7119 mpfr_set_nan (result
->value
.real
);
7123 /* SPACING(NaN) = same NaN */
7124 if (mpfr_nan_p (x
->value
.real
))
7126 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
7130 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
7131 are the radix, exponent of x, and precision. This excludes the
7132 possibility of subnormal numbers. Fortran 2003 states the result is
7133 b**max(e - p, emin - 1). */
7135 ep
= (long int) mpfr_get_exp (x
->value
.real
) - gfc_real_kinds
[i
].digits
;
7136 en
= (long int) gfc_real_kinds
[i
].min_exponent
- 1;
7137 en
= en
> ep
? en
: ep
;
7139 mpfr_set_ui (result
->value
.real
, 1, GFC_RND_MODE
);
7140 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, en
, GFC_RND_MODE
);
7142 return range_check (result
, "SPACING");
7147 gfc_simplify_spread (gfc_expr
*source
, gfc_expr
*dim_expr
, gfc_expr
*ncopies_expr
)
7149 gfc_expr
*result
= NULL
;
7150 int nelem
, i
, j
, dim
, ncopies
;
7153 if ((!gfc_is_constant_expr (source
)
7154 && !is_constant_array_expr (source
))
7155 || !gfc_is_constant_expr (dim_expr
)
7156 || !gfc_is_constant_expr (ncopies_expr
))
7159 gcc_assert (dim_expr
->ts
.type
== BT_INTEGER
);
7160 gfc_extract_int (dim_expr
, &dim
);
7161 dim
-= 1; /* zero-base DIM */
7163 gcc_assert (ncopies_expr
->ts
.type
== BT_INTEGER
);
7164 gfc_extract_int (ncopies_expr
, &ncopies
);
7165 ncopies
= MAX (ncopies
, 0);
7167 /* Do not allow the array size to exceed the limit for an array
7169 if (source
->expr_type
== EXPR_ARRAY
)
7171 if (!gfc_array_size (source
, &size
))
7172 gfc_internal_error ("Failure getting length of a constant array.");
7175 mpz_init_set_ui (size
, 1);
7177 nelem
= mpz_get_si (size
) * ncopies
;
7178 if (nelem
> flag_max_array_constructor
)
7180 if (gfc_current_ns
->sym_root
->n
.sym
->attr
.flavor
== FL_PARAMETER
)
7182 gfc_error ("The number of elements (%d) in the array constructor "
7183 "at %L requires an increase of the allowed %d upper "
7184 "limit. See %<-fmax-array-constructor%> option.",
7185 nelem
, &source
->where
, flag_max_array_constructor
);
7186 return &gfc_bad_expr
;
7192 if (source
->expr_type
== EXPR_CONSTANT
)
7194 gcc_assert (dim
== 0);
7196 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
7198 if (source
->ts
.type
== BT_DERIVED
)
7199 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
7201 result
->shape
= gfc_get_shape (result
->rank
);
7202 mpz_init_set_si (result
->shape
[0], ncopies
);
7204 for (i
= 0; i
< ncopies
; ++i
)
7205 gfc_constructor_append_expr (&result
->value
.constructor
,
7206 gfc_copy_expr (source
), NULL
);
7208 else if (source
->expr_type
== EXPR_ARRAY
)
7210 int offset
, rstride
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
];
7211 gfc_constructor
*source_ctor
;
7213 gcc_assert (source
->rank
< GFC_MAX_DIMENSIONS
);
7214 gcc_assert (dim
>= 0 && dim
<= source
->rank
);
7216 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
7218 if (source
->ts
.type
== BT_DERIVED
)
7219 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
7220 result
->rank
= source
->rank
+ 1;
7221 result
->shape
= gfc_get_shape (result
->rank
);
7223 for (i
= 0, j
= 0; i
< result
->rank
; ++i
)
7226 mpz_init_set (result
->shape
[i
], source
->shape
[j
++]);
7228 mpz_init_set_si (result
->shape
[i
], ncopies
);
7230 extent
[i
] = mpz_get_si (result
->shape
[i
]);
7231 rstride
[i
] = (i
== 0) ? 1 : rstride
[i
-1] * extent
[i
-1];
7235 for (source_ctor
= gfc_constructor_first (source
->value
.constructor
);
7236 source_ctor
; source_ctor
= gfc_constructor_next (source_ctor
))
7238 for (i
= 0; i
< ncopies
; ++i
)
7239 gfc_constructor_insert_expr (&result
->value
.constructor
,
7240 gfc_copy_expr (source_ctor
->expr
),
7241 NULL
, offset
+ i
* rstride
[dim
]);
7243 offset
+= (dim
== 0 ? ncopies
: 1);
7248 gfc_error ("Simplification of SPREAD at %C not yet implemented");
7249 return &gfc_bad_expr
;
7252 if (source
->ts
.type
== BT_CHARACTER
)
7253 result
->ts
.u
.cl
= source
->ts
.u
.cl
;
7260 gfc_simplify_sqrt (gfc_expr
*e
)
7262 gfc_expr
*result
= NULL
;
7264 if (e
->expr_type
!= EXPR_CONSTANT
)
7270 if (mpfr_cmp_si (e
->value
.real
, 0) < 0)
7272 gfc_error ("Argument of SQRT at %L has a negative value",
7274 return &gfc_bad_expr
;
7276 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
7277 mpfr_sqrt (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
7281 gfc_set_model (e
->value
.real
);
7283 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
7284 mpc_sqrt (result
->value
.complex, e
->value
.complex, GFC_MPC_RND_MODE
);
7288 gfc_internal_error ("invalid argument of SQRT at %L", &e
->where
);
7291 return range_check (result
, "SQRT");
7296 gfc_simplify_sum (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
7298 return simplify_transformation (array
, dim
, mask
, 0, gfc_add
);
7303 gfc_simplify_cotan (gfc_expr
*x
)
7308 if (x
->expr_type
!= EXPR_CONSTANT
)
7311 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
7316 mpfr_cot (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
7320 /* There is no builtin mpc_cot, so compute cot = cos / sin. */
7321 val
= &result
->value
.complex;
7322 mpc_init2 (swp
, mpfr_get_default_prec ());
7323 mpc_cos (swp
, x
->value
.complex, GFC_MPC_RND_MODE
);
7324 mpc_sin (*val
, x
->value
.complex, GFC_MPC_RND_MODE
);
7325 mpc_div (*val
, swp
, *val
, GFC_MPC_RND_MODE
);
7333 return range_check (result
, "COTAN");
7338 gfc_simplify_tan (gfc_expr
*x
)
7342 if (x
->expr_type
!= EXPR_CONSTANT
)
7345 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
7350 mpfr_tan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
7354 mpc_tan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
7361 return range_check (result
, "TAN");
7366 gfc_simplify_tanh (gfc_expr
*x
)
7370 if (x
->expr_type
!= EXPR_CONSTANT
)
7373 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
7378 mpfr_tanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
7382 mpc_tanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
7389 return range_check (result
, "TANH");
7394 gfc_simplify_tiny (gfc_expr
*e
)
7399 i
= gfc_validate_kind (BT_REAL
, e
->ts
.kind
, false);
7401 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
7402 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
7409 gfc_simplify_trailz (gfc_expr
*e
)
7411 unsigned long tz
, bs
;
7414 if (e
->expr_type
!= EXPR_CONSTANT
)
7417 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
7418 bs
= gfc_integer_kinds
[i
].bit_size
;
7419 tz
= mpz_scan1 (e
->value
.integer
, 0);
7421 return gfc_get_int_expr (gfc_default_integer_kind
,
7422 &e
->where
, MIN (tz
, bs
));
7427 gfc_simplify_transfer (gfc_expr
*source
, gfc_expr
*mold
, gfc_expr
*size
)
7430 gfc_expr
*mold_element
;
7435 unsigned char *buffer
;
7436 size_t result_length
;
7438 if (!gfc_is_constant_expr (source
) || !gfc_is_constant_expr (size
))
7441 if (!gfc_resolve_expr (mold
))
7443 if (gfc_init_expr_flag
&& !gfc_is_constant_expr (mold
))
7446 if (!gfc_calculate_transfer_sizes (source
, mold
, size
, &source_size
,
7447 &result_size
, &result_length
))
7450 /* Calculate the size of the source. */
7451 if (source
->expr_type
== EXPR_ARRAY
&& !gfc_array_size (source
, &tmp
))
7452 gfc_internal_error ("Failure getting length of a constant array.");
7454 /* Create an empty new expression with the appropriate characteristics. */
7455 result
= gfc_get_constant_expr (mold
->ts
.type
, mold
->ts
.kind
,
7457 result
->ts
= mold
->ts
;
7459 mold_element
= (mold
->expr_type
== EXPR_ARRAY
&& mold
->value
.constructor
)
7460 ? gfc_constructor_first (mold
->value
.constructor
)->expr
7463 /* Set result character length, if needed. Note that this needs to be
7464 set even for array expressions, in order to pass this information into
7465 gfc_target_interpret_expr. */
7466 if (result
->ts
.type
== BT_CHARACTER
&& gfc_is_constant_expr (mold_element
))
7467 result
->value
.character
.length
= mold_element
->value
.character
.length
;
7469 /* Set the number of elements in the result, and determine its size. */
7471 if (mold
->expr_type
== EXPR_ARRAY
|| mold
->rank
|| size
)
7473 result
->expr_type
= EXPR_ARRAY
;
7475 result
->shape
= gfc_get_shape (1);
7476 mpz_init_set_ui (result
->shape
[0], result_length
);
7481 /* Allocate the buffer to store the binary version of the source. */
7482 buffer_size
= MAX (source_size
, result_size
);
7483 buffer
= (unsigned char*)alloca (buffer_size
);
7484 memset (buffer
, 0, buffer_size
);
7486 /* Now write source to the buffer. */
7487 gfc_target_encode_expr (source
, buffer
, buffer_size
);
7489 /* And read the buffer back into the new expression. */
7490 gfc_target_interpret_expr (buffer
, buffer_size
, result
, false);
7497 gfc_simplify_transpose (gfc_expr
*matrix
)
7499 int row
, matrix_rows
, col
, matrix_cols
;
7502 if (!is_constant_array_expr (matrix
))
7505 gcc_assert (matrix
->rank
== 2);
7507 result
= gfc_get_array_expr (matrix
->ts
.type
, matrix
->ts
.kind
,
7510 result
->shape
= gfc_get_shape (result
->rank
);
7511 mpz_set (result
->shape
[0], matrix
->shape
[1]);
7512 mpz_set (result
->shape
[1], matrix
->shape
[0]);
7514 if (matrix
->ts
.type
== BT_CHARACTER
)
7515 result
->ts
.u
.cl
= matrix
->ts
.u
.cl
;
7516 else if (matrix
->ts
.type
== BT_DERIVED
)
7517 result
->ts
.u
.derived
= matrix
->ts
.u
.derived
;
7519 matrix_rows
= mpz_get_si (matrix
->shape
[0]);
7520 matrix_cols
= mpz_get_si (matrix
->shape
[1]);
7521 for (row
= 0; row
< matrix_rows
; ++row
)
7522 for (col
= 0; col
< matrix_cols
; ++col
)
7524 gfc_expr
*e
= gfc_constructor_lookup_expr (matrix
->value
.constructor
,
7525 col
* matrix_rows
+ row
);
7526 gfc_constructor_insert_expr (&result
->value
.constructor
,
7527 gfc_copy_expr (e
), &matrix
->where
,
7528 row
* matrix_cols
+ col
);
7536 gfc_simplify_trim (gfc_expr
*e
)
7539 int count
, i
, len
, lentrim
;
7541 if (e
->expr_type
!= EXPR_CONSTANT
)
7544 len
= e
->value
.character
.length
;
7545 for (count
= 0, i
= 1; i
<= len
; ++i
)
7547 if (e
->value
.character
.string
[len
- i
] == ' ')
7553 lentrim
= len
- count
;
7555 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, lentrim
);
7556 for (i
= 0; i
< lentrim
; i
++)
7557 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
];
7564 gfc_simplify_image_index (gfc_expr
*coarray
, gfc_expr
*sub
)
7569 gfc_constructor
*sub_cons
;
7573 if (!is_constant_array_expr (sub
))
7576 /* Follow any component references. */
7577 as
= coarray
->symtree
->n
.sym
->as
;
7578 for (ref
= coarray
->ref
; ref
; ref
= ref
->next
)
7579 if (ref
->type
== REF_COMPONENT
)
7582 if (as
->type
== AS_DEFERRED
)
7585 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
7586 the cosubscript addresses the first image. */
7588 sub_cons
= gfc_constructor_first (sub
->value
.constructor
);
7591 for (d
= 1; d
<= as
->corank
; d
++)
7596 gcc_assert (sub_cons
!= NULL
);
7598 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 0, as
,
7600 if (ca_bound
== NULL
)
7603 if (ca_bound
== &gfc_bad_expr
)
7606 cmp
= mpz_cmp (ca_bound
->value
.integer
, sub_cons
->expr
->value
.integer
);
7610 gfc_free_expr (ca_bound
);
7611 sub_cons
= gfc_constructor_next (sub_cons
);
7615 first_image
= false;
7619 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
7620 "SUB has %ld and COARRAY lower bound is %ld)",
7622 mpz_get_si (sub_cons
->expr
->value
.integer
),
7623 mpz_get_si (ca_bound
->value
.integer
));
7624 gfc_free_expr (ca_bound
);
7625 return &gfc_bad_expr
;
7628 gfc_free_expr (ca_bound
);
7630 /* Check whether upperbound is valid for the multi-images case. */
7633 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 1, as
,
7635 if (ca_bound
== &gfc_bad_expr
)
7638 if (ca_bound
&& ca_bound
->expr_type
== EXPR_CONSTANT
7639 && mpz_cmp (ca_bound
->value
.integer
,
7640 sub_cons
->expr
->value
.integer
) < 0)
7642 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
7643 "SUB has %ld and COARRAY upper bound is %ld)",
7645 mpz_get_si (sub_cons
->expr
->value
.integer
),
7646 mpz_get_si (ca_bound
->value
.integer
));
7647 gfc_free_expr (ca_bound
);
7648 return &gfc_bad_expr
;
7652 gfc_free_expr (ca_bound
);
7655 sub_cons
= gfc_constructor_next (sub_cons
);
7658 gcc_assert (sub_cons
== NULL
);
7660 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
&& !first_image
)
7663 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
7664 &gfc_current_locus
);
7666 mpz_set_si (result
->value
.integer
, 1);
7668 mpz_set_si (result
->value
.integer
, 0);
7674 gfc_simplify_image_status (gfc_expr
*image
, gfc_expr
*team ATTRIBUTE_UNUSED
)
7676 if (flag_coarray
== GFC_FCOARRAY_NONE
)
7678 gfc_current_locus
= *gfc_current_intrinsic_where
;
7679 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
7680 return &gfc_bad_expr
;
7683 /* Simplification is possible for fcoarray = single only. For all other modes
7684 the result depends on runtime conditions. */
7685 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
)
7688 if (gfc_is_constant_expr (image
))
7691 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
7693 if (mpz_get_si (image
->value
.integer
) == 1)
7694 mpz_set_si (result
->value
.integer
, 0);
7696 mpz_set_si (result
->value
.integer
, GFC_STAT_STOPPED_IMAGE
);
7705 gfc_simplify_this_image (gfc_expr
*coarray
, gfc_expr
*dim
,
7706 gfc_expr
*distance ATTRIBUTE_UNUSED
)
7708 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
)
7711 /* If no coarray argument has been passed or when the first argument
7712 is actually a distance argment. */
7713 if (coarray
== NULL
|| !gfc_is_coarray (coarray
))
7716 /* FIXME: gfc_current_locus is wrong. */
7717 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
7718 &gfc_current_locus
);
7719 mpz_set_si (result
->value
.integer
, 1);
7723 /* For -fcoarray=single, this_image(A) is the same as lcobound(A). */
7724 return simplify_cobound (coarray
, dim
, NULL
, 0);
7729 gfc_simplify_ubound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
7731 return simplify_bound (array
, dim
, kind
, 1);
7735 gfc_simplify_ucobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
7737 return simplify_cobound (array
, dim
, kind
, 1);
7742 gfc_simplify_unpack (gfc_expr
*vector
, gfc_expr
*mask
, gfc_expr
*field
)
7744 gfc_expr
*result
, *e
;
7745 gfc_constructor
*vector_ctor
, *mask_ctor
, *field_ctor
;
7747 if (!is_constant_array_expr (vector
)
7748 || !is_constant_array_expr (mask
)
7749 || (!gfc_is_constant_expr (field
)
7750 && !is_constant_array_expr (field
)))
7753 result
= gfc_get_array_expr (vector
->ts
.type
, vector
->ts
.kind
,
7755 if (vector
->ts
.type
== BT_DERIVED
)
7756 result
->ts
.u
.derived
= vector
->ts
.u
.derived
;
7757 result
->rank
= mask
->rank
;
7758 result
->shape
= gfc_copy_shape (mask
->shape
, mask
->rank
);
7760 if (vector
->ts
.type
== BT_CHARACTER
)
7761 result
->ts
.u
.cl
= vector
->ts
.u
.cl
;
7763 vector_ctor
= gfc_constructor_first (vector
->value
.constructor
);
7764 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
7766 = field
->expr_type
== EXPR_ARRAY
7767 ? gfc_constructor_first (field
->value
.constructor
)
7772 if (mask_ctor
->expr
->value
.logical
)
7774 gcc_assert (vector_ctor
);
7775 e
= gfc_copy_expr (vector_ctor
->expr
);
7776 vector_ctor
= gfc_constructor_next (vector_ctor
);
7778 else if (field
->expr_type
== EXPR_ARRAY
)
7779 e
= gfc_copy_expr (field_ctor
->expr
);
7781 e
= gfc_copy_expr (field
);
7783 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
7785 mask_ctor
= gfc_constructor_next (mask_ctor
);
7786 field_ctor
= gfc_constructor_next (field_ctor
);
7794 gfc_simplify_verify (gfc_expr
*s
, gfc_expr
*set
, gfc_expr
*b
, gfc_expr
*kind
)
7798 size_t index
, len
, lenset
;
7800 int k
= get_kind (BT_INTEGER
, kind
, "VERIFY", gfc_default_integer_kind
);
7803 return &gfc_bad_expr
;
7805 if (s
->expr_type
!= EXPR_CONSTANT
|| set
->expr_type
!= EXPR_CONSTANT
7806 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
7809 if (b
!= NULL
&& b
->value
.logical
!= 0)
7814 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &s
->where
);
7816 len
= s
->value
.character
.length
;
7817 lenset
= set
->value
.character
.length
;
7821 mpz_set_ui (result
->value
.integer
, 0);
7829 mpz_set_ui (result
->value
.integer
, 1);
7833 index
= wide_strspn (s
->value
.character
.string
,
7834 set
->value
.character
.string
) + 1;
7843 mpz_set_ui (result
->value
.integer
, len
);
7846 for (index
= len
; index
> 0; index
--)
7848 for (i
= 0; i
< lenset
; i
++)
7850 if (s
->value
.character
.string
[index
- 1]
7851 == set
->value
.character
.string
[i
])
7859 mpz_set_ui (result
->value
.integer
, index
);
7865 gfc_simplify_xor (gfc_expr
*x
, gfc_expr
*y
)
7870 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
7873 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
7878 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
7879 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
7880 return range_check (result
, "XOR");
7883 return gfc_get_logical_expr (kind
, &x
->where
,
7884 (x
->value
.logical
&& !y
->value
.logical
)
7885 || (!x
->value
.logical
&& y
->value
.logical
));
7893 /****************** Constant simplification *****************/
7895 /* Master function to convert one constant to another. While this is
7896 used as a simplification function, it requires the destination type
7897 and kind information which is supplied by a special case in
7901 gfc_convert_constant (gfc_expr
*e
, bt type
, int kind
)
7903 gfc_expr
*result
, *(*f
) (gfc_expr
*, int);
7904 gfc_constructor
*c
, *t
;
7918 f
= gfc_int2complex
;
7938 f
= gfc_real2complex
;
7949 f
= gfc_complex2int
;
7952 f
= gfc_complex2real
;
7955 f
= gfc_complex2complex
;
7981 f
= gfc_hollerith2int
;
7985 f
= gfc_hollerith2real
;
7989 f
= gfc_hollerith2complex
;
7993 f
= gfc_hollerith2character
;
7997 f
= gfc_hollerith2logical
;
8006 if (type
== BT_CHARACTER
)
8007 f
= gfc_character2character
;
8014 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
8019 switch (e
->expr_type
)
8022 result
= f (e
, kind
);
8024 return &gfc_bad_expr
;
8028 if (!gfc_is_constant_expr (e
))
8031 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
8032 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
8033 result
->rank
= e
->rank
;
8035 for (c
= gfc_constructor_first (e
->value
.constructor
);
8036 c
; c
= gfc_constructor_next (c
))
8039 if (c
->iterator
== NULL
)
8041 if (c
->expr
->expr_type
== EXPR_ARRAY
)
8042 tmp
= gfc_convert_constant (c
->expr
, type
, kind
);
8044 tmp
= f (c
->expr
, kind
);
8047 tmp
= gfc_convert_constant (c
->expr
, type
, kind
);
8049 if (tmp
== NULL
|| tmp
== &gfc_bad_expr
)
8051 gfc_free_expr (result
);
8055 t
= gfc_constructor_append_expr (&result
->value
.constructor
,
8058 t
->iterator
= gfc_copy_iterator (c
->iterator
);
8071 /* Function for converting character constants. */
8073 gfc_convert_char_constant (gfc_expr
*e
, bt type ATTRIBUTE_UNUSED
, int kind
)
8078 if (!gfc_is_constant_expr (e
))
8081 if (e
->expr_type
== EXPR_CONSTANT
)
8083 /* Simple case of a scalar. */
8084 result
= gfc_get_constant_expr (BT_CHARACTER
, kind
, &e
->where
);
8086 return &gfc_bad_expr
;
8088 result
->value
.character
.length
= e
->value
.character
.length
;
8089 result
->value
.character
.string
8090 = gfc_get_wide_string (e
->value
.character
.length
+ 1);
8091 memcpy (result
->value
.character
.string
, e
->value
.character
.string
,
8092 (e
->value
.character
.length
+ 1) * sizeof (gfc_char_t
));
8094 /* Check we only have values representable in the destination kind. */
8095 for (i
= 0; i
< result
->value
.character
.length
; i
++)
8096 if (!gfc_check_character_range (result
->value
.character
.string
[i
],
8099 gfc_error ("Character %qs in string at %L cannot be converted "
8100 "into character kind %d",
8101 gfc_print_wide_char (result
->value
.character
.string
[i
]),
8103 gfc_free_expr (result
);
8104 return &gfc_bad_expr
;
8109 else if (e
->expr_type
== EXPR_ARRAY
)
8111 /* For an array constructor, we convert each constructor element. */
8114 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
8115 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
8116 result
->rank
= e
->rank
;
8117 result
->ts
.u
.cl
= e
->ts
.u
.cl
;
8119 for (c
= gfc_constructor_first (e
->value
.constructor
);
8120 c
; c
= gfc_constructor_next (c
))
8122 gfc_expr
*tmp
= gfc_convert_char_constant (c
->expr
, type
, kind
);
8123 if (tmp
== &gfc_bad_expr
)
8125 gfc_free_expr (result
);
8126 return &gfc_bad_expr
;
8131 gfc_free_expr (result
);
8135 gfc_constructor_append_expr (&result
->value
.constructor
,
8147 gfc_simplify_compiler_options (void)
8152 str
= gfc_get_option_string ();
8153 result
= gfc_get_character_expr (gfc_default_character_kind
,
8154 &gfc_current_locus
, str
, strlen (str
));
8161 gfc_simplify_compiler_version (void)
8166 len
= strlen ("GCC version ") + strlen (version_string
);
8167 buffer
= XALLOCAVEC (char, len
+ 1);
8168 snprintf (buffer
, len
+ 1, "GCC version %s", version_string
);
8169 return gfc_get_character_expr (gfc_default_character_kind
,
8170 &gfc_current_locus
, buffer
, len
);
8173 /* Simplification routines for intrinsics of IEEE modules. */
8176 simplify_ieee_selected_real_kind (gfc_expr
*expr
)
8178 gfc_actual_arglist
*arg
;
8179 gfc_expr
*p
= NULL
, *q
= NULL
, *rdx
= NULL
;
8181 arg
= expr
->value
.function
.actual
;
8185 q
= arg
->next
->expr
;
8186 if (arg
->next
->next
)
8187 rdx
= arg
->next
->next
->expr
;
8190 /* Currently, if IEEE is supported and this module is built, it means
8191 all our floating-point types conform to IEEE. Hence, we simply handle
8192 IEEE_SELECTED_REAL_KIND like SELECTED_REAL_KIND. */
8193 return gfc_simplify_selected_real_kind (p
, q
, rdx
);
8197 simplify_ieee_support (gfc_expr
*expr
)
8199 /* We consider that if the IEEE modules are loaded, we have full support
8200 for flags, halting and rounding, which are the three functions
8201 (IEEE_SUPPORT_{FLAG,HALTING,ROUNDING}) allowed in constant
8202 expressions. One day, we will need libgfortran to detect support and
8203 communicate it back to us, allowing for partial support. */
8205 return gfc_get_logical_expr (gfc_default_logical_kind
, &expr
->where
,
8210 matches_ieee_function_name (gfc_symbol
*sym
, const char *name
)
8212 int n
= strlen(name
);
8214 if (!strncmp(sym
->name
, name
, n
))
8217 /* If a generic was used and renamed, we need more work to find out.
8218 Compare the specific name. */
8219 if (sym
->generic
&& !strncmp(sym
->generic
->sym
->name
, name
, n
))
8226 gfc_simplify_ieee_functions (gfc_expr
*expr
)
8228 gfc_symbol
* sym
= expr
->symtree
->n
.sym
;
8230 if (matches_ieee_function_name(sym
, "ieee_selected_real_kind"))
8231 return simplify_ieee_selected_real_kind (expr
);
8232 else if (matches_ieee_function_name(sym
, "ieee_support_flag")
8233 || matches_ieee_function_name(sym
, "ieee_support_halting")
8234 || matches_ieee_function_name(sym
, "ieee_support_rounding"))
8235 return simplify_ieee_support (expr
);