1 /* Simplify intrinsic functions at compile-time.
2 Copyright (C) 2000-2017 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"
28 #include "target-memory.h"
29 #include "constructor.h"
30 #include "version.h" /* For version_string. */
34 static int min_max_choose (gfc_expr
*, gfc_expr
*, int);
36 gfc_expr gfc_bad_expr
;
38 static gfc_expr
*simplify_size (gfc_expr
*, gfc_expr
*, int);
41 /* Note that 'simplification' is not just transforming expressions.
42 For functions that are not simplified at compile time, range
43 checking is done if possible.
45 The return convention is that each simplification function returns:
47 A new expression node corresponding to the simplified arguments.
48 The original arguments are destroyed by the caller, and must not
49 be a part of the new expression.
51 NULL pointer indicating that no simplification was possible and
52 the original expression should remain intact.
54 An expression pointer to gfc_bad_expr (a static placeholder)
55 indicating that some error has prevented simplification. The
56 error is generated within the function and should be propagated
59 By the time a simplification function gets control, it has been
60 decided that the function call is really supposed to be the
61 intrinsic. No type checking is strictly necessary, since only
62 valid types will be passed on. On the other hand, a simplification
63 subroutine may have to look at the type of an argument as part of
66 Array arguments are only passed to these subroutines that implement
67 the simplification of transformational intrinsics.
69 The functions in this file don't have much comment with them, but
70 everything is reasonably straight-forward. The Standard, chapter 13
71 is the best comment you'll find for this file anyway. */
73 /* Range checks an expression node. If all goes well, returns the
74 node, otherwise returns &gfc_bad_expr and frees the node. */
77 range_check (gfc_expr
*result
, const char *name
)
82 if (result
->expr_type
!= EXPR_CONSTANT
)
85 switch (gfc_range_check (result
))
91 gfc_error ("Result of %s overflows its kind at %L", name
,
96 gfc_error ("Result of %s underflows its kind at %L", name
,
101 gfc_error ("Result of %s is NaN at %L", name
, &result
->where
);
105 gfc_error ("Result of %s gives range error for its kind at %L", name
,
110 gfc_free_expr (result
);
111 return &gfc_bad_expr
;
115 /* A helper function that gets an optional and possibly missing
116 kind parameter. Returns the kind, -1 if something went wrong. */
119 get_kind (bt type
, gfc_expr
*k
, const char *name
, int default_kind
)
126 if (k
->expr_type
!= EXPR_CONSTANT
)
128 gfc_error ("KIND parameter of %s at %L must be an initialization "
129 "expression", name
, &k
->where
);
133 if (gfc_extract_int (k
, &kind
)
134 || gfc_validate_kind (type
, kind
, true) < 0)
136 gfc_error ("Invalid KIND parameter of %s at %L", name
, &k
->where
);
144 /* Converts an mpz_t signed variable into an unsigned one, assuming
145 two's complement representations and a binary width of bitsize.
146 The conversion is a no-op unless x is negative; otherwise, it can
147 be accomplished by masking out the high bits. */
150 convert_mpz_to_unsigned (mpz_t x
, int bitsize
)
156 /* Confirm that no bits above the signed range are unset if we
157 are doing range checking. */
158 if (flag_range_check
!= 0)
159 gcc_assert (mpz_scan0 (x
, bitsize
-1) == ULONG_MAX
);
161 mpz_init_set_ui (mask
, 1);
162 mpz_mul_2exp (mask
, mask
, bitsize
);
163 mpz_sub_ui (mask
, mask
, 1);
165 mpz_and (x
, x
, mask
);
171 /* Confirm that no bits above the signed range are set. */
172 gcc_assert (mpz_scan1 (x
, bitsize
-1) == ULONG_MAX
);
177 /* Converts an mpz_t unsigned variable into a signed one, assuming
178 two's complement representations and a binary width of bitsize.
179 If the bitsize-1 bit is set, this is taken as a sign bit and
180 the number is converted to the corresponding negative number. */
183 gfc_convert_mpz_to_signed (mpz_t x
, int bitsize
)
187 /* Confirm that no bits above the unsigned range are set if we are
188 doing range checking. */
189 if (flag_range_check
!= 0)
190 gcc_assert (mpz_scan1 (x
, bitsize
) == ULONG_MAX
);
192 if (mpz_tstbit (x
, bitsize
- 1) == 1)
194 mpz_init_set_ui (mask
, 1);
195 mpz_mul_2exp (mask
, mask
, bitsize
);
196 mpz_sub_ui (mask
, mask
, 1);
198 /* We negate the number by hand, zeroing the high bits, that is
199 make it the corresponding positive number, and then have it
200 negated by GMP, giving the correct representation of the
203 mpz_add_ui (x
, x
, 1);
204 mpz_and (x
, x
, mask
);
213 /* In-place convert BOZ to REAL of the specified kind. */
216 convert_boz (gfc_expr
*x
, int kind
)
218 if (x
&& x
->ts
.type
== BT_INTEGER
&& x
->is_boz
)
225 if (!gfc_convert_boz (x
, &ts
))
226 return &gfc_bad_expr
;
233 /* Test that the expression is a constant array, simplifying if
234 we are dealing with a parameter array. */
237 is_constant_array_expr (gfc_expr
*e
)
244 if (e
->expr_type
== EXPR_VARIABLE
&& e
->rank
> 0
245 && e
->symtree
->n
.sym
->attr
.flavor
== FL_PARAMETER
)
246 gfc_simplify_expr (e
, 1);
248 if (e
->expr_type
!= EXPR_ARRAY
|| !gfc_is_constant_expr (e
))
251 for (c
= gfc_constructor_first (e
->value
.constructor
);
252 c
; c
= gfc_constructor_next (c
))
253 if (c
->expr
->expr_type
!= EXPR_CONSTANT
254 && c
->expr
->expr_type
!= EXPR_STRUCTURE
)
261 /* Initialize a transformational result expression with a given value. */
264 init_result_expr (gfc_expr
*e
, int init
, gfc_expr
*array
)
266 if (e
&& e
->expr_type
== EXPR_ARRAY
)
268 gfc_constructor
*ctor
= gfc_constructor_first (e
->value
.constructor
);
271 init_result_expr (ctor
->expr
, init
, array
);
272 ctor
= gfc_constructor_next (ctor
);
275 else if (e
&& e
->expr_type
== EXPR_CONSTANT
)
277 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
284 e
->value
.logical
= (init
? 1 : 0);
289 mpz_set (e
->value
.integer
, gfc_integer_kinds
[i
].min_int
);
290 else if (init
== INT_MAX
)
291 mpz_set (e
->value
.integer
, gfc_integer_kinds
[i
].huge
);
293 mpz_set_si (e
->value
.integer
, init
);
299 mpfr_set (e
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
300 mpfr_neg (e
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
302 else if (init
== INT_MAX
)
303 mpfr_set (e
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
305 mpfr_set_si (e
->value
.real
, init
, GFC_RND_MODE
);
309 mpc_set_si (e
->value
.complex, init
, GFC_MPC_RND_MODE
);
315 gfc_expr
*len
= gfc_simplify_len (array
, NULL
);
316 gfc_extract_int (len
, &length
);
317 string
= gfc_get_wide_string (length
+ 1);
318 gfc_wide_memset (string
, 0, length
);
320 else if (init
== INT_MAX
)
322 gfc_expr
*len
= gfc_simplify_len (array
, NULL
);
323 gfc_extract_int (len
, &length
);
324 string
= gfc_get_wide_string (length
+ 1);
325 gfc_wide_memset (string
, 255, length
);
330 string
= gfc_get_wide_string (1);
333 string
[length
] = '\0';
334 e
->value
.character
.length
= length
;
335 e
->value
.character
.string
= string
;
347 /* Helper function for gfc_simplify_dot_product() and gfc_simplify_matmul;
348 if conj_a is true, the matrix_a is complex conjugated. */
351 compute_dot_product (gfc_expr
*matrix_a
, int stride_a
, int offset_a
,
352 gfc_expr
*matrix_b
, int stride_b
, int offset_b
,
355 gfc_expr
*result
, *a
, *b
, *c
;
357 result
= gfc_get_constant_expr (matrix_a
->ts
.type
, matrix_a
->ts
.kind
,
359 init_result_expr (result
, 0, NULL
);
361 a
= gfc_constructor_lookup_expr (matrix_a
->value
.constructor
, offset_a
);
362 b
= gfc_constructor_lookup_expr (matrix_b
->value
.constructor
, offset_b
);
365 /* Copying of expressions is required as operands are free'd
366 by the gfc_arith routines. */
367 switch (result
->ts
.type
)
370 result
= gfc_or (result
,
371 gfc_and (gfc_copy_expr (a
),
378 if (conj_a
&& a
->ts
.type
== BT_COMPLEX
)
379 c
= gfc_simplify_conjg (a
);
381 c
= gfc_copy_expr (a
);
382 result
= gfc_add (result
, gfc_multiply (c
, gfc_copy_expr (b
)));
389 offset_a
+= stride_a
;
390 a
= gfc_constructor_lookup_expr (matrix_a
->value
.constructor
, offset_a
);
392 offset_b
+= stride_b
;
393 b
= gfc_constructor_lookup_expr (matrix_b
->value
.constructor
, offset_b
);
400 /* Build a result expression for transformational intrinsics,
404 transformational_result (gfc_expr
*array
, gfc_expr
*dim
, bt type
,
405 int kind
, locus
* where
)
410 if (!dim
|| array
->rank
== 1)
411 return gfc_get_constant_expr (type
, kind
, where
);
413 result
= gfc_get_array_expr (type
, kind
, where
);
414 result
->shape
= gfc_copy_shape_excluding (array
->shape
, array
->rank
, dim
);
415 result
->rank
= array
->rank
- 1;
417 /* gfc_array_size() would count the number of elements in the constructor,
418 we have not built those yet. */
420 for (i
= 0; i
< result
->rank
; ++i
)
421 nelem
*= mpz_get_ui (result
->shape
[i
]);
423 for (i
= 0; i
< nelem
; ++i
)
425 gfc_constructor_append_expr (&result
->value
.constructor
,
426 gfc_get_constant_expr (type
, kind
, where
),
434 typedef gfc_expr
* (*transformational_op
)(gfc_expr
*, gfc_expr
*);
436 /* Wrapper function, implements 'op1 += 1'. Only called if MASK
437 of COUNT intrinsic is .TRUE..
439 Interface and implementation mimics arith functions as
440 gfc_add, gfc_multiply, etc. */
443 gfc_count (gfc_expr
*op1
, gfc_expr
*op2
)
447 gcc_assert (op1
->ts
.type
== BT_INTEGER
);
448 gcc_assert (op2
->ts
.type
== BT_LOGICAL
);
449 gcc_assert (op2
->value
.logical
);
451 result
= gfc_copy_expr (op1
);
452 mpz_add_ui (result
->value
.integer
, result
->value
.integer
, 1);
460 /* Transforms an ARRAY with operation OP, according to MASK, to a
461 scalar RESULT. E.g. called if
463 REAL, PARAMETER :: array(n, m) = ...
464 REAL, PARAMETER :: s = SUM(array)
466 where OP == gfc_add(). */
469 simplify_transformation_to_scalar (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*mask
,
470 transformational_op op
)
473 gfc_constructor
*array_ctor
, *mask_ctor
;
475 /* Shortcut for constant .FALSE. MASK. */
477 && mask
->expr_type
== EXPR_CONSTANT
478 && !mask
->value
.logical
)
481 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
483 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
484 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
488 a
= array_ctor
->expr
;
489 array_ctor
= gfc_constructor_next (array_ctor
);
491 /* A constant MASK equals .TRUE. here and can be ignored. */
495 mask_ctor
= gfc_constructor_next (mask_ctor
);
496 if (!m
->value
.logical
)
500 result
= op (result
, gfc_copy_expr (a
));
508 /* Transforms an ARRAY with operation OP, according to MASK, to an
509 array RESULT. E.g. called if
511 REAL, PARAMETER :: array(n, m) = ...
512 REAL, PARAMETER :: s(n) = PROD(array, DIM=1)
514 where OP == gfc_multiply().
515 The result might be post processed using post_op. */
518 simplify_transformation_to_array (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*dim
,
519 gfc_expr
*mask
, transformational_op op
,
520 transformational_op post_op
)
523 int done
, i
, n
, arraysize
, resultsize
, dim_index
, dim_extent
, dim_stride
;
524 gfc_expr
**arrayvec
, **resultvec
, **base
, **src
, **dest
;
525 gfc_constructor
*array_ctor
, *mask_ctor
, *result_ctor
;
527 int count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
528 sstride
[GFC_MAX_DIMENSIONS
], dstride
[GFC_MAX_DIMENSIONS
],
529 tmpstride
[GFC_MAX_DIMENSIONS
];
531 /* Shortcut for constant .FALSE. MASK. */
533 && mask
->expr_type
== EXPR_CONSTANT
534 && !mask
->value
.logical
)
537 /* Build an indexed table for array element expressions to minimize
538 linked-list traversal. Masked elements are set to NULL. */
539 gfc_array_size (array
, &size
);
540 arraysize
= mpz_get_ui (size
);
543 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
545 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
547 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
548 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
550 for (i
= 0; i
< arraysize
; ++i
)
552 arrayvec
[i
] = array_ctor
->expr
;
553 array_ctor
= gfc_constructor_next (array_ctor
);
557 if (!mask_ctor
->expr
->value
.logical
)
560 mask_ctor
= gfc_constructor_next (mask_ctor
);
564 /* Same for the result expression. */
565 gfc_array_size (result
, &size
);
566 resultsize
= mpz_get_ui (size
);
569 resultvec
= XCNEWVEC (gfc_expr
*, resultsize
);
570 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
571 for (i
= 0; i
< resultsize
; ++i
)
573 resultvec
[i
] = result_ctor
->expr
;
574 result_ctor
= gfc_constructor_next (result_ctor
);
577 gfc_extract_int (dim
, &dim_index
);
578 dim_index
-= 1; /* zero-base index */
582 for (i
= 0, n
= 0; i
< array
->rank
; ++i
)
585 tmpstride
[i
] = (i
== 0) ? 1 : tmpstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
588 dim_extent
= mpz_get_si (array
->shape
[i
]);
589 dim_stride
= tmpstride
[i
];
593 extent
[n
] = mpz_get_si (array
->shape
[i
]);
594 sstride
[n
] = tmpstride
[i
];
595 dstride
[n
] = (n
== 0) ? 1 : dstride
[n
-1] * extent
[n
-1];
604 for (src
= base
, n
= 0; n
< dim_extent
; src
+= dim_stride
, ++n
)
606 *dest
= op (*dest
, gfc_copy_expr (*src
));
613 while (!done
&& count
[n
] == extent
[n
])
616 base
-= sstride
[n
] * extent
[n
];
617 dest
-= dstride
[n
] * extent
[n
];
620 if (n
< result
->rank
)
622 /* If the nested loop is unrolled GFC_MAX_DIMENSIONS
623 times, we'd warn for the last iteration, because the
624 array index will have already been incremented to the
625 array sizes, and we can't tell that this must make
626 the test against result->rank false, because ranks
627 must not exceed GFC_MAX_DIMENSIONS. */
628 GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray
-bounds
)
639 /* Place updated expression in result constructor. */
640 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
641 for (i
= 0; i
< resultsize
; ++i
)
644 result_ctor
->expr
= post_op (result_ctor
->expr
, resultvec
[i
]);
646 result_ctor
->expr
= resultvec
[i
];
647 result_ctor
= gfc_constructor_next (result_ctor
);
657 simplify_transformation (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
,
658 int init_val
, transformational_op op
)
662 if (!is_constant_array_expr (array
)
663 || !gfc_is_constant_expr (dim
))
667 && !is_constant_array_expr (mask
)
668 && mask
->expr_type
!= EXPR_CONSTANT
)
671 result
= transformational_result (array
, dim
, array
->ts
.type
,
672 array
->ts
.kind
, &array
->where
);
673 init_result_expr (result
, init_val
, array
);
675 return !dim
|| array
->rank
== 1 ?
676 simplify_transformation_to_scalar (result
, array
, mask
, op
) :
677 simplify_transformation_to_array (result
, array
, dim
, mask
, op
, NULL
);
681 /********************** Simplification functions *****************************/
684 gfc_simplify_abs (gfc_expr
*e
)
688 if (e
->expr_type
!= EXPR_CONSTANT
)
694 result
= gfc_get_constant_expr (BT_INTEGER
, e
->ts
.kind
, &e
->where
);
695 mpz_abs (result
->value
.integer
, e
->value
.integer
);
696 return range_check (result
, "IABS");
699 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
700 mpfr_abs (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
701 return range_check (result
, "ABS");
704 gfc_set_model_kind (e
->ts
.kind
);
705 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
706 mpc_abs (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
707 return range_check (result
, "CABS");
710 gfc_internal_error ("gfc_simplify_abs(): Bad type");
716 simplify_achar_char (gfc_expr
*e
, gfc_expr
*k
, const char *name
, bool ascii
)
720 bool too_large
= false;
722 if (e
->expr_type
!= EXPR_CONSTANT
)
725 kind
= get_kind (BT_CHARACTER
, k
, name
, gfc_default_character_kind
);
727 return &gfc_bad_expr
;
729 if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
731 gfc_error ("Argument of %s function at %L is negative", name
,
733 return &gfc_bad_expr
;
736 if (ascii
&& warn_surprising
&& mpz_cmp_si (e
->value
.integer
, 127) > 0)
737 gfc_warning (OPT_Wsurprising
,
738 "Argument of %s function at %L outside of range [0,127]",
741 if (kind
== 1 && mpz_cmp_si (e
->value
.integer
, 255) > 0)
746 mpz_init_set_ui (t
, 2);
747 mpz_pow_ui (t
, t
, 32);
748 mpz_sub_ui (t
, t
, 1);
749 if (mpz_cmp (e
->value
.integer
, t
) > 0)
756 gfc_error ("Argument of %s function at %L is too large for the "
757 "collating sequence of kind %d", name
, &e
->where
, kind
);
758 return &gfc_bad_expr
;
761 result
= gfc_get_character_expr (kind
, &e
->where
, NULL
, 1);
762 result
->value
.character
.string
[0] = mpz_get_ui (e
->value
.integer
);
769 /* We use the processor's collating sequence, because all
770 systems that gfortran currently works on are ASCII. */
773 gfc_simplify_achar (gfc_expr
*e
, gfc_expr
*k
)
775 return simplify_achar_char (e
, k
, "ACHAR", true);
780 gfc_simplify_acos (gfc_expr
*x
)
784 if (x
->expr_type
!= EXPR_CONSTANT
)
790 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
791 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
793 gfc_error ("Argument of ACOS at %L must be between -1 and 1",
795 return &gfc_bad_expr
;
797 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
798 mpfr_acos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
802 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
803 mpc_acos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
807 gfc_internal_error ("in gfc_simplify_acos(): Bad type");
810 return range_check (result
, "ACOS");
814 gfc_simplify_acosh (gfc_expr
*x
)
818 if (x
->expr_type
!= EXPR_CONSTANT
)
824 if (mpfr_cmp_si (x
->value
.real
, 1) < 0)
826 gfc_error ("Argument of ACOSH at %L must not be less than 1",
828 return &gfc_bad_expr
;
831 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
832 mpfr_acosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
836 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
837 mpc_acosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
841 gfc_internal_error ("in gfc_simplify_acosh(): Bad type");
844 return range_check (result
, "ACOSH");
848 gfc_simplify_adjustl (gfc_expr
*e
)
854 if (e
->expr_type
!= EXPR_CONSTANT
)
857 len
= e
->value
.character
.length
;
859 for (count
= 0, i
= 0; i
< len
; ++i
)
861 ch
= e
->value
.character
.string
[i
];
867 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, len
);
868 for (i
= 0; i
< len
- count
; ++i
)
869 result
->value
.character
.string
[i
] = e
->value
.character
.string
[count
+ i
];
876 gfc_simplify_adjustr (gfc_expr
*e
)
882 if (e
->expr_type
!= EXPR_CONSTANT
)
885 len
= e
->value
.character
.length
;
887 for (count
= 0, i
= len
- 1; i
>= 0; --i
)
889 ch
= e
->value
.character
.string
[i
];
895 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, len
);
896 for (i
= 0; i
< count
; ++i
)
897 result
->value
.character
.string
[i
] = ' ';
899 for (i
= count
; i
< len
; ++i
)
900 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
- count
];
907 gfc_simplify_aimag (gfc_expr
*e
)
911 if (e
->expr_type
!= EXPR_CONSTANT
)
914 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
915 mpfr_set (result
->value
.real
, mpc_imagref (e
->value
.complex), GFC_RND_MODE
);
917 return range_check (result
, "AIMAG");
922 gfc_simplify_aint (gfc_expr
*e
, gfc_expr
*k
)
924 gfc_expr
*rtrunc
, *result
;
927 kind
= get_kind (BT_REAL
, k
, "AINT", e
->ts
.kind
);
929 return &gfc_bad_expr
;
931 if (e
->expr_type
!= EXPR_CONSTANT
)
934 rtrunc
= gfc_copy_expr (e
);
935 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
937 result
= gfc_real2real (rtrunc
, kind
);
939 gfc_free_expr (rtrunc
);
941 return range_check (result
, "AINT");
946 gfc_simplify_all (gfc_expr
*mask
, gfc_expr
*dim
)
948 return simplify_transformation (mask
, dim
, NULL
, true, gfc_and
);
953 gfc_simplify_dint (gfc_expr
*e
)
955 gfc_expr
*rtrunc
, *result
;
957 if (e
->expr_type
!= EXPR_CONSTANT
)
960 rtrunc
= gfc_copy_expr (e
);
961 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
963 result
= gfc_real2real (rtrunc
, gfc_default_double_kind
);
965 gfc_free_expr (rtrunc
);
967 return range_check (result
, "DINT");
972 gfc_simplify_dreal (gfc_expr
*e
)
974 gfc_expr
*result
= NULL
;
976 if (e
->expr_type
!= EXPR_CONSTANT
)
979 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
980 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
982 return range_check (result
, "DREAL");
987 gfc_simplify_anint (gfc_expr
*e
, gfc_expr
*k
)
992 kind
= get_kind (BT_REAL
, k
, "ANINT", e
->ts
.kind
);
994 return &gfc_bad_expr
;
996 if (e
->expr_type
!= EXPR_CONSTANT
)
999 result
= gfc_get_constant_expr (e
->ts
.type
, kind
, &e
->where
);
1000 mpfr_round (result
->value
.real
, e
->value
.real
);
1002 return range_check (result
, "ANINT");
1007 gfc_simplify_and (gfc_expr
*x
, gfc_expr
*y
)
1012 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1015 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
1020 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
1021 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
1022 return range_check (result
, "AND");
1025 return gfc_get_logical_expr (kind
, &x
->where
,
1026 x
->value
.logical
&& y
->value
.logical
);
1035 gfc_simplify_any (gfc_expr
*mask
, gfc_expr
*dim
)
1037 return simplify_transformation (mask
, dim
, NULL
, false, gfc_or
);
1042 gfc_simplify_dnint (gfc_expr
*e
)
1046 if (e
->expr_type
!= EXPR_CONSTANT
)
1049 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &e
->where
);
1050 mpfr_round (result
->value
.real
, e
->value
.real
);
1052 return range_check (result
, "DNINT");
1057 gfc_simplify_asin (gfc_expr
*x
)
1061 if (x
->expr_type
!= EXPR_CONSTANT
)
1067 if (mpfr_cmp_si (x
->value
.real
, 1) > 0
1068 || mpfr_cmp_si (x
->value
.real
, -1) < 0)
1070 gfc_error ("Argument of ASIN at %L must be between -1 and 1",
1072 return &gfc_bad_expr
;
1074 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1075 mpfr_asin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1079 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1080 mpc_asin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1084 gfc_internal_error ("in gfc_simplify_asin(): Bad type");
1087 return range_check (result
, "ASIN");
1092 gfc_simplify_asinh (gfc_expr
*x
)
1096 if (x
->expr_type
!= EXPR_CONSTANT
)
1099 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1104 mpfr_asinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1108 mpc_asinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1112 gfc_internal_error ("in gfc_simplify_asinh(): Bad type");
1115 return range_check (result
, "ASINH");
1120 gfc_simplify_atan (gfc_expr
*x
)
1124 if (x
->expr_type
!= EXPR_CONSTANT
)
1127 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1132 mpfr_atan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1136 mpc_atan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1140 gfc_internal_error ("in gfc_simplify_atan(): Bad type");
1143 return range_check (result
, "ATAN");
1148 gfc_simplify_atanh (gfc_expr
*x
)
1152 if (x
->expr_type
!= EXPR_CONSTANT
)
1158 if (mpfr_cmp_si (x
->value
.real
, 1) >= 0
1159 || mpfr_cmp_si (x
->value
.real
, -1) <= 0)
1161 gfc_error ("Argument of ATANH at %L must be inside the range -1 "
1163 return &gfc_bad_expr
;
1165 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1166 mpfr_atanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1170 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1171 mpc_atanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1175 gfc_internal_error ("in gfc_simplify_atanh(): Bad type");
1178 return range_check (result
, "ATANH");
1183 gfc_simplify_atan2 (gfc_expr
*y
, gfc_expr
*x
)
1187 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
1190 if (mpfr_zero_p (y
->value
.real
) && mpfr_zero_p (x
->value
.real
))
1192 gfc_error ("If first argument of ATAN2 %L is zero, then the "
1193 "second argument must not be zero", &x
->where
);
1194 return &gfc_bad_expr
;
1197 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1198 mpfr_atan2 (result
->value
.real
, y
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1200 return range_check (result
, "ATAN2");
1205 gfc_simplify_bessel_j0 (gfc_expr
*x
)
1209 if (x
->expr_type
!= EXPR_CONSTANT
)
1212 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1213 mpfr_j0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1215 return range_check (result
, "BESSEL_J0");
1220 gfc_simplify_bessel_j1 (gfc_expr
*x
)
1224 if (x
->expr_type
!= EXPR_CONSTANT
)
1227 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1228 mpfr_j1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1230 return range_check (result
, "BESSEL_J1");
1235 gfc_simplify_bessel_jn (gfc_expr
*order
, gfc_expr
*x
)
1240 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1243 n
= mpz_get_si (order
->value
.integer
);
1244 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1245 mpfr_jn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1247 return range_check (result
, "BESSEL_JN");
1251 /* Simplify transformational form of JN and YN. */
1254 gfc_simplify_bessel_n2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
,
1261 mpfr_t x2rev
, last1
, last2
;
1263 if (x
->expr_type
!= EXPR_CONSTANT
|| order1
->expr_type
!= EXPR_CONSTANT
1264 || order2
->expr_type
!= EXPR_CONSTANT
)
1267 n1
= mpz_get_si (order1
->value
.integer
);
1268 n2
= mpz_get_si (order2
->value
.integer
);
1269 result
= gfc_get_array_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1271 result
->shape
= gfc_get_shape (1);
1272 mpz_init_set_ui (result
->shape
[0], MAX (n2
-n1
+1, 0));
1277 /* Special case: x == 0; it is J0(0.0) == 1, JN(N > 0, 0.0) == 0; and
1278 YN(N, 0.0) = -Inf. */
1280 if (mpfr_cmp_ui (x
->value
.real
, 0.0) == 0)
1282 if (!jn
&& flag_range_check
)
1284 gfc_error ("Result of BESSEL_YN is -INF at %L", &result
->where
);
1285 gfc_free_expr (result
);
1286 return &gfc_bad_expr
;
1291 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1292 mpfr_set_ui (e
->value
.real
, 1, GFC_RND_MODE
);
1293 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1298 for (i
= n1
; i
<= n2
; i
++)
1300 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1302 mpfr_set_ui (e
->value
.real
, 0, GFC_RND_MODE
);
1304 mpfr_set_inf (e
->value
.real
, -1);
1305 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1312 /* Use the faster but more verbose recurrence algorithm. Bessel functions
1313 are stable for downward recursion and Neumann functions are stable
1314 for upward recursion. It is
1316 J(N-1, x) = x2rev * N * J(N, x) - J(N+1, x),
1317 Y(N+1, x) = x2rev * N * Y(N, x) - Y(N-1, x).
1318 Cf. http://dlmf.nist.gov/10.74#iv and http://dlmf.nist.gov/10.6#E1 */
1320 gfc_set_model_kind (x
->ts
.kind
);
1322 /* Get first recursion anchor. */
1326 mpfr_jn (last1
, n2
, x
->value
.real
, GFC_RND_MODE
);
1328 mpfr_yn (last1
, n1
, x
->value
.real
, GFC_RND_MODE
);
1330 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1331 mpfr_set (e
->value
.real
, last1
, GFC_RND_MODE
);
1332 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1336 gfc_free_expr (result
);
1337 return &gfc_bad_expr
;
1339 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1347 /* Get second recursion anchor. */
1351 mpfr_jn (last2
, n2
-1, x
->value
.real
, GFC_RND_MODE
);
1353 mpfr_yn (last2
, n1
+1, x
->value
.real
, GFC_RND_MODE
);
1355 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1356 mpfr_set (e
->value
.real
, last2
, GFC_RND_MODE
);
1357 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1362 gfc_free_expr (result
);
1363 return &gfc_bad_expr
;
1366 gfc_constructor_insert_expr (&result
->value
.constructor
, e
, &x
->where
, -2);
1368 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1377 /* Start actual recursion. */
1380 mpfr_ui_div (x2rev
, 2, x
->value
.real
, GFC_RND_MODE
);
1382 for (i
= 2; i
<= n2
-n1
; i
++)
1384 e
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1386 /* Special case: For YN, if the previous N gave -INF, set
1387 also N+1 to -INF. */
1388 if (!jn
&& !flag_range_check
&& mpfr_inf_p (last2
))
1390 mpfr_set_inf (e
->value
.real
, -1);
1391 gfc_constructor_append_expr (&result
->value
.constructor
, e
,
1396 mpfr_mul_si (e
->value
.real
, x2rev
, jn
? (n2
-i
+1) : (n1
+i
-1),
1398 mpfr_mul (e
->value
.real
, e
->value
.real
, last2
, GFC_RND_MODE
);
1399 mpfr_sub (e
->value
.real
, e
->value
.real
, last1
, GFC_RND_MODE
);
1401 if (range_check (e
, jn
? "BESSEL_JN" : "BESSEL_YN") == &gfc_bad_expr
)
1403 /* Range_check frees "e" in that case. */
1409 gfc_constructor_insert_expr (&result
->value
.constructor
, e
, &x
->where
,
1412 gfc_constructor_append_expr (&result
->value
.constructor
, e
, &x
->where
);
1414 mpfr_set (last1
, last2
, GFC_RND_MODE
);
1415 mpfr_set (last2
, e
->value
.real
, GFC_RND_MODE
);
1428 gfc_free_expr (result
);
1429 return &gfc_bad_expr
;
1434 gfc_simplify_bessel_jn2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
)
1436 return gfc_simplify_bessel_n2 (order1
, order2
, x
, true);
1441 gfc_simplify_bessel_y0 (gfc_expr
*x
)
1445 if (x
->expr_type
!= EXPR_CONSTANT
)
1448 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1449 mpfr_y0 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1451 return range_check (result
, "BESSEL_Y0");
1456 gfc_simplify_bessel_y1 (gfc_expr
*x
)
1460 if (x
->expr_type
!= EXPR_CONSTANT
)
1463 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1464 mpfr_y1 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1466 return range_check (result
, "BESSEL_Y1");
1471 gfc_simplify_bessel_yn (gfc_expr
*order
, gfc_expr
*x
)
1476 if (x
->expr_type
!= EXPR_CONSTANT
|| order
->expr_type
!= EXPR_CONSTANT
)
1479 n
= mpz_get_si (order
->value
.integer
);
1480 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1481 mpfr_yn (result
->value
.real
, n
, x
->value
.real
, GFC_RND_MODE
);
1483 return range_check (result
, "BESSEL_YN");
1488 gfc_simplify_bessel_yn2 (gfc_expr
*order1
, gfc_expr
*order2
, gfc_expr
*x
)
1490 return gfc_simplify_bessel_n2 (order1
, order2
, x
, false);
1495 gfc_simplify_bit_size (gfc_expr
*e
)
1497 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
1498 return gfc_get_int_expr (e
->ts
.kind
, &e
->where
,
1499 gfc_integer_kinds
[i
].bit_size
);
1504 gfc_simplify_btest (gfc_expr
*e
, gfc_expr
*bit
)
1508 if (e
->expr_type
!= EXPR_CONSTANT
|| bit
->expr_type
!= EXPR_CONSTANT
)
1511 if (gfc_extract_int (bit
, &b
) || b
< 0)
1512 return gfc_get_logical_expr (gfc_default_logical_kind
, &e
->where
, false);
1514 return gfc_get_logical_expr (gfc_default_logical_kind
, &e
->where
,
1515 mpz_tstbit (e
->value
.integer
, b
));
1520 compare_bitwise (gfc_expr
*i
, gfc_expr
*j
)
1525 gcc_assert (i
->ts
.type
== BT_INTEGER
);
1526 gcc_assert (j
->ts
.type
== BT_INTEGER
);
1528 mpz_init_set (x
, i
->value
.integer
);
1529 k
= gfc_validate_kind (i
->ts
.type
, i
->ts
.kind
, false);
1530 convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
1532 mpz_init_set (y
, j
->value
.integer
);
1533 k
= gfc_validate_kind (j
->ts
.type
, j
->ts
.kind
, false);
1534 convert_mpz_to_unsigned (y
, gfc_integer_kinds
[k
].bit_size
);
1536 res
= mpz_cmp (x
, y
);
1544 gfc_simplify_bge (gfc_expr
*i
, gfc_expr
*j
)
1546 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1549 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1550 compare_bitwise (i
, j
) >= 0);
1555 gfc_simplify_bgt (gfc_expr
*i
, gfc_expr
*j
)
1557 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1560 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1561 compare_bitwise (i
, j
) > 0);
1566 gfc_simplify_ble (gfc_expr
*i
, gfc_expr
*j
)
1568 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1571 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1572 compare_bitwise (i
, j
) <= 0);
1577 gfc_simplify_blt (gfc_expr
*i
, gfc_expr
*j
)
1579 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
)
1582 return gfc_get_logical_expr (gfc_default_logical_kind
, &i
->where
,
1583 compare_bitwise (i
, j
) < 0);
1588 gfc_simplify_ceiling (gfc_expr
*e
, gfc_expr
*k
)
1590 gfc_expr
*ceil
, *result
;
1593 kind
= get_kind (BT_INTEGER
, k
, "CEILING", gfc_default_integer_kind
);
1595 return &gfc_bad_expr
;
1597 if (e
->expr_type
!= EXPR_CONSTANT
)
1600 ceil
= gfc_copy_expr (e
);
1601 mpfr_ceil (ceil
->value
.real
, e
->value
.real
);
1603 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
1604 gfc_mpfr_to_mpz (result
->value
.integer
, ceil
->value
.real
, &e
->where
);
1606 gfc_free_expr (ceil
);
1608 return range_check (result
, "CEILING");
1613 gfc_simplify_char (gfc_expr
*e
, gfc_expr
*k
)
1615 return simplify_achar_char (e
, k
, "CHAR", false);
1619 /* Common subroutine for simplifying CMPLX, COMPLEX and DCMPLX. */
1622 simplify_cmplx (const char *name
, gfc_expr
*x
, gfc_expr
*y
, int kind
)
1626 if (convert_boz (x
, kind
) == &gfc_bad_expr
)
1627 return &gfc_bad_expr
;
1629 if (convert_boz (y
, kind
) == &gfc_bad_expr
)
1630 return &gfc_bad_expr
;
1632 if (x
->expr_type
!= EXPR_CONSTANT
1633 || (y
!= NULL
&& y
->expr_type
!= EXPR_CONSTANT
))
1636 result
= gfc_get_constant_expr (BT_COMPLEX
, kind
, &x
->where
);
1641 mpc_set_z (result
->value
.complex, x
->value
.integer
, GFC_MPC_RND_MODE
);
1645 mpc_set_fr (result
->value
.complex, x
->value
.real
, GFC_RND_MODE
);
1649 mpc_set (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1653 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (x)");
1657 return range_check (result
, name
);
1662 mpfr_set_z (mpc_imagref (result
->value
.complex),
1663 y
->value
.integer
, GFC_RND_MODE
);
1667 mpfr_set (mpc_imagref (result
->value
.complex),
1668 y
->value
.real
, GFC_RND_MODE
);
1672 gfc_internal_error ("gfc_simplify_dcmplx(): Bad type (y)");
1675 return range_check (result
, name
);
1680 gfc_simplify_cmplx (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*k
)
1684 kind
= get_kind (BT_REAL
, k
, "CMPLX", gfc_default_complex_kind
);
1686 return &gfc_bad_expr
;
1688 return simplify_cmplx ("CMPLX", x
, y
, kind
);
1693 gfc_simplify_complex (gfc_expr
*x
, gfc_expr
*y
)
1697 if (x
->ts
.type
== BT_INTEGER
&& y
->ts
.type
== BT_INTEGER
)
1698 kind
= gfc_default_complex_kind
;
1699 else if (x
->ts
.type
== BT_REAL
|| y
->ts
.type
== BT_INTEGER
)
1701 else if (x
->ts
.type
== BT_INTEGER
|| y
->ts
.type
== BT_REAL
)
1703 else if (x
->ts
.type
== BT_REAL
&& y
->ts
.type
== BT_REAL
)
1704 kind
= (x
->ts
.kind
> y
->ts
.kind
) ? x
->ts
.kind
: y
->ts
.kind
;
1708 return simplify_cmplx ("COMPLEX", x
, y
, kind
);
1713 gfc_simplify_conjg (gfc_expr
*e
)
1717 if (e
->expr_type
!= EXPR_CONSTANT
)
1720 result
= gfc_copy_expr (e
);
1721 mpc_conj (result
->value
.complex, result
->value
.complex, GFC_MPC_RND_MODE
);
1723 return range_check (result
, "CONJG");
1726 /* Return the simplification of the constant expression in icall, or NULL
1727 if the expression is not constant. */
1730 simplify_trig_call (gfc_expr
*icall
)
1732 gfc_isym_id func
= icall
->value
.function
.isym
->id
;
1733 gfc_expr
*x
= icall
->value
.function
.actual
->expr
;
1735 /* The actual simplifiers will return NULL for non-constant x. */
1739 return gfc_simplify_acos (x
);
1741 return gfc_simplify_asin (x
);
1743 return gfc_simplify_atan (x
);
1745 return gfc_simplify_cos (x
);
1746 case GFC_ISYM_COTAN
:
1747 return gfc_simplify_cotan (x
);
1749 return gfc_simplify_sin (x
);
1751 return gfc_simplify_tan (x
);
1753 gfc_internal_error ("in simplify_trig_call(): Bad intrinsic");
1757 /* Convert a floating-point number from radians to degrees. */
1760 degrees_f (mpfr_t x
, mp_rnd_t rnd_mode
)
1765 /* Set x = x % 2pi to avoid offsets with large angles. */
1766 mpfr_const_pi (tmp
, rnd_mode
);
1767 mpfr_mul_ui (tmp
, tmp
, 2, rnd_mode
);
1768 mpfr_fmod (tmp
, x
, tmp
, rnd_mode
);
1770 /* Set x = x * 180. */
1771 mpfr_mul_ui (x
, x
, 180, rnd_mode
);
1773 /* Set x = x / pi. */
1774 mpfr_const_pi (tmp
, rnd_mode
);
1775 mpfr_div (x
, x
, tmp
, rnd_mode
);
1780 /* Convert a floating-point number from degrees to radians. */
1783 radians_f (mpfr_t x
, mp_rnd_t rnd_mode
)
1788 /* Set x = x % 360 to avoid offsets with large angles. */
1789 mpfr_set_ui (tmp
, 360, rnd_mode
);
1790 mpfr_fmod (tmp
, x
, tmp
, rnd_mode
);
1792 /* Set x = x * pi. */
1793 mpfr_const_pi (tmp
, rnd_mode
);
1794 mpfr_mul (x
, x
, tmp
, rnd_mode
);
1796 /* Set x = x / 180. */
1797 mpfr_div_ui (x
, x
, 180, rnd_mode
);
1803 /* Convert argument to radians before calling a trig function. */
1806 gfc_simplify_trigd (gfc_expr
*icall
)
1810 arg
= icall
->value
.function
.actual
->expr
;
1812 if (arg
->ts
.type
!= BT_REAL
)
1813 gfc_internal_error ("in gfc_simplify_trigd(): Bad type");
1815 if (arg
->expr_type
== EXPR_CONSTANT
)
1816 /* Convert constant to radians before passing off to simplifier. */
1817 radians_f (arg
->value
.real
, GFC_RND_MODE
);
1819 /* Let the usual simplifier take over - we just simplified the arg. */
1820 return simplify_trig_call (icall
);
1823 /* Convert result of an inverse trig function to degrees. */
1826 gfc_simplify_atrigd (gfc_expr
*icall
)
1830 if (icall
->value
.function
.actual
->expr
->ts
.type
!= BT_REAL
)
1831 gfc_internal_error ("in gfc_simplify_atrigd(): Bad type");
1833 /* See if another simplifier has work to do first. */
1834 result
= simplify_trig_call (icall
);
1836 if (result
&& result
->expr_type
== EXPR_CONSTANT
)
1838 /* Convert constant to degrees after passing off to actual simplifier. */
1839 degrees_f (result
->value
.real
, GFC_RND_MODE
);
1843 /* Let gfc_resolve_atrigd take care of the non-constant case. */
1847 /* Convert the result of atan2 to degrees. */
1850 gfc_simplify_atan2d (gfc_expr
*y
, gfc_expr
*x
)
1854 if (x
->ts
.type
!= BT_REAL
|| y
->ts
.type
!= BT_REAL
)
1855 gfc_internal_error ("in gfc_simplify_atan2d(): Bad type");
1857 if (x
->expr_type
== EXPR_CONSTANT
&& y
->expr_type
== EXPR_CONSTANT
)
1859 result
= gfc_simplify_atan2 (y
, x
);
1862 degrees_f (result
->value
.real
, GFC_RND_MODE
);
1867 /* Let gfc_resolve_atan2d take care of the non-constant case. */
1872 gfc_simplify_cos (gfc_expr
*x
)
1876 if (x
->expr_type
!= EXPR_CONSTANT
)
1879 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1884 mpfr_cos (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1888 gfc_set_model_kind (x
->ts
.kind
);
1889 mpc_cos (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1893 gfc_internal_error ("in gfc_simplify_cos(): Bad type");
1896 return range_check (result
, "COS");
1901 gfc_simplify_cosh (gfc_expr
*x
)
1905 if (x
->expr_type
!= EXPR_CONSTANT
)
1908 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
1913 mpfr_cosh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
1917 mpc_cosh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
1924 return range_check (result
, "COSH");
1929 gfc_simplify_count (gfc_expr
*mask
, gfc_expr
*dim
, gfc_expr
*kind
)
1933 if (!is_constant_array_expr (mask
)
1934 || !gfc_is_constant_expr (dim
)
1935 || !gfc_is_constant_expr (kind
))
1938 result
= transformational_result (mask
, dim
,
1940 get_kind (BT_INTEGER
, kind
, "COUNT",
1941 gfc_default_integer_kind
),
1944 init_result_expr (result
, 0, NULL
);
1946 /* Passing MASK twice, once as data array, once as mask.
1947 Whenever gfc_count is called, '1' is added to the result. */
1948 return !dim
|| mask
->rank
== 1 ?
1949 simplify_transformation_to_scalar (result
, mask
, mask
, gfc_count
) :
1950 simplify_transformation_to_array (result
, mask
, dim
, mask
, gfc_count
, NULL
);
1953 /* Simplification routine for cshift. This works by copying the array
1954 expressions into a one-dimensional array, shuffling the values into another
1955 one-dimensional array and creating the new array expression from this. The
1956 shuffling part is basically taken from the library routine. */
1959 gfc_simplify_cshift (gfc_expr
*array
, gfc_expr
*shift
, gfc_expr
*dim
)
1963 gfc_expr
**arrayvec
, **resultvec
;
1964 gfc_expr
**rptr
, **sptr
;
1966 size_t arraysize
, shiftsize
, i
;
1967 gfc_constructor
*array_ctor
, *shift_ctor
;
1968 ssize_t
*shiftvec
, *hptr
;
1969 ssize_t shift_val
, len
;
1970 ssize_t count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
1971 hs_ex
[GFC_MAX_DIMENSIONS
],
1972 hstride
[GFC_MAX_DIMENSIONS
], sstride
[GFC_MAX_DIMENSIONS
],
1973 a_extent
[GFC_MAX_DIMENSIONS
], a_stride
[GFC_MAX_DIMENSIONS
],
1974 h_extent
[GFC_MAX_DIMENSIONS
],
1975 ss_ex
[GFC_MAX_DIMENSIONS
];
1979 gfc_expr
**src
, **dest
;
1981 if (!is_constant_array_expr (array
))
1984 if (shift
->rank
> 0)
1985 gfc_simplify_expr (shift
, 1);
1987 if (!gfc_is_constant_expr (shift
))
1990 /* Make dim zero-based. */
1993 if (!gfc_is_constant_expr (dim
))
1995 which
= mpz_get_si (dim
->value
.integer
) - 1;
2000 gfc_array_size (array
, &size
);
2001 arraysize
= mpz_get_ui (size
);
2004 result
= gfc_get_array_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
2005 result
->shape
= gfc_copy_shape (array
->shape
, array
->rank
);
2006 result
->rank
= array
->rank
;
2007 result
->ts
.u
.derived
= array
->ts
.u
.derived
;
2012 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
2013 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
2014 for (i
= 0; i
< arraysize
; i
++)
2016 arrayvec
[i
] = array_ctor
->expr
;
2017 array_ctor
= gfc_constructor_next (array_ctor
);
2020 resultvec
= XCNEWVEC (gfc_expr
*, arraysize
);
2025 for (d
=0; d
< array
->rank
; d
++)
2027 a_extent
[d
] = mpz_get_si (array
->shape
[d
]);
2028 a_stride
[d
] = d
== 0 ? 1 : a_stride
[d
-1] * a_extent
[d
-1];
2031 if (shift
->rank
> 0)
2033 gfc_array_size (shift
, &size
);
2034 shiftsize
= mpz_get_ui (size
);
2036 shiftvec
= XCNEWVEC (ssize_t
, shiftsize
);
2037 shift_ctor
= gfc_constructor_first (shift
->value
.constructor
);
2038 for (d
= 0; d
< shift
->rank
; d
++)
2040 h_extent
[d
] = mpz_get_si (shift
->shape
[d
]);
2041 hstride
[d
] = d
== 0 ? 1 : hstride
[d
-1] * h_extent
[d
-1];
2047 /* Shut up compiler */
2052 for (d
=0; d
< array
->rank
; d
++)
2056 rsoffset
= a_stride
[d
];
2062 extent
[n
] = a_extent
[d
];
2063 sstride
[n
] = a_stride
[d
];
2064 ss_ex
[n
] = sstride
[n
] * extent
[n
];
2066 hs_ex
[n
] = hstride
[n
] * extent
[n
];
2073 for (i
= 0; i
< shiftsize
; i
++)
2076 val
= mpz_get_si (shift_ctor
->expr
->value
.integer
);
2081 shift_ctor
= gfc_constructor_next (shift_ctor
);
2087 shift_val
= mpz_get_si (shift
->value
.integer
);
2088 shift_val
= shift_val
% len
;
2093 continue_loop
= true;
2099 while (continue_loop
)
2107 src
= &sptr
[sh
* rsoffset
];
2109 for (n
= 0; n
< len
- sh
; n
++)
2116 for ( n
= 0; n
< sh
; n
++)
2128 while (count
[n
] == extent
[n
])
2138 continue_loop
= false;
2152 for (i
= 0; i
< arraysize
; i
++)
2154 gfc_constructor_append_expr (&result
->value
.constructor
,
2155 gfc_copy_expr (resultvec
[i
]),
2163 gfc_simplify_dcmplx (gfc_expr
*x
, gfc_expr
*y
)
2165 return simplify_cmplx ("DCMPLX", x
, y
, gfc_default_double_kind
);
2170 gfc_simplify_dble (gfc_expr
*e
)
2172 gfc_expr
*result
= NULL
;
2174 if (e
->expr_type
!= EXPR_CONSTANT
)
2177 if (convert_boz (e
, gfc_default_double_kind
) == &gfc_bad_expr
)
2178 return &gfc_bad_expr
;
2180 result
= gfc_convert_constant (e
, BT_REAL
, gfc_default_double_kind
);
2181 if (result
== &gfc_bad_expr
)
2182 return &gfc_bad_expr
;
2184 return range_check (result
, "DBLE");
2189 gfc_simplify_digits (gfc_expr
*x
)
2193 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2198 digits
= gfc_integer_kinds
[i
].digits
;
2203 digits
= gfc_real_kinds
[i
].digits
;
2210 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, digits
);
2215 gfc_simplify_dim (gfc_expr
*x
, gfc_expr
*y
)
2220 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2223 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
2224 result
= gfc_get_constant_expr (x
->ts
.type
, kind
, &x
->where
);
2229 if (mpz_cmp (x
->value
.integer
, y
->value
.integer
) > 0)
2230 mpz_sub (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2232 mpz_set_ui (result
->value
.integer
, 0);
2237 if (mpfr_cmp (x
->value
.real
, y
->value
.real
) > 0)
2238 mpfr_sub (result
->value
.real
, x
->value
.real
, y
->value
.real
,
2241 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
2246 gfc_internal_error ("gfc_simplify_dim(): Bad type");
2249 return range_check (result
, "DIM");
2254 gfc_simplify_dot_product (gfc_expr
*vector_a
, gfc_expr
*vector_b
)
2259 if (!is_constant_array_expr (vector_a
)
2260 || !is_constant_array_expr (vector_b
))
2263 gcc_assert (vector_a
->rank
== 1);
2264 gcc_assert (vector_b
->rank
== 1);
2266 temp
.expr_type
= EXPR_OP
;
2267 gfc_clear_ts (&temp
.ts
);
2268 temp
.value
.op
.op
= INTRINSIC_NONE
;
2269 temp
.value
.op
.op1
= vector_a
;
2270 temp
.value
.op
.op2
= vector_b
;
2271 gfc_type_convert_binary (&temp
, 1);
2273 return compute_dot_product (vector_a
, 1, 0, vector_b
, 1, 0, true);
2278 gfc_simplify_dprod (gfc_expr
*x
, gfc_expr
*y
)
2280 gfc_expr
*a1
, *a2
, *result
;
2282 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2285 a1
= gfc_real2real (x
, gfc_default_double_kind
);
2286 a2
= gfc_real2real (y
, gfc_default_double_kind
);
2288 result
= gfc_get_constant_expr (BT_REAL
, gfc_default_double_kind
, &x
->where
);
2289 mpfr_mul (result
->value
.real
, a1
->value
.real
, a2
->value
.real
, GFC_RND_MODE
);
2294 return range_check (result
, "DPROD");
2299 simplify_dshift (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
,
2303 int i
, k
, size
, shift
;
2305 if (arg1
->expr_type
!= EXPR_CONSTANT
|| arg2
->expr_type
!= EXPR_CONSTANT
2306 || shiftarg
->expr_type
!= EXPR_CONSTANT
)
2309 k
= gfc_validate_kind (BT_INTEGER
, arg1
->ts
.kind
, false);
2310 size
= gfc_integer_kinds
[k
].bit_size
;
2312 gfc_extract_int (shiftarg
, &shift
);
2314 /* DSHIFTR(I,J,SHIFT) = DSHIFTL(I,J,SIZE-SHIFT). */
2316 shift
= size
- shift
;
2318 result
= gfc_get_constant_expr (BT_INTEGER
, arg1
->ts
.kind
, &arg1
->where
);
2319 mpz_set_ui (result
->value
.integer
, 0);
2321 for (i
= 0; i
< shift
; i
++)
2322 if (mpz_tstbit (arg2
->value
.integer
, size
- shift
+ i
))
2323 mpz_setbit (result
->value
.integer
, i
);
2325 for (i
= 0; i
< size
- shift
; i
++)
2326 if (mpz_tstbit (arg1
->value
.integer
, i
))
2327 mpz_setbit (result
->value
.integer
, shift
+ i
);
2329 /* Convert to a signed value. */
2330 gfc_convert_mpz_to_signed (result
->value
.integer
, size
);
2337 gfc_simplify_dshiftr (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
2339 return simplify_dshift (arg1
, arg2
, shiftarg
, true);
2344 gfc_simplify_dshiftl (gfc_expr
*arg1
, gfc_expr
*arg2
, gfc_expr
*shiftarg
)
2346 return simplify_dshift (arg1
, arg2
, shiftarg
, false);
2351 gfc_simplify_erf (gfc_expr
*x
)
2355 if (x
->expr_type
!= EXPR_CONSTANT
)
2358 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2359 mpfr_erf (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2361 return range_check (result
, "ERF");
2366 gfc_simplify_erfc (gfc_expr
*x
)
2370 if (x
->expr_type
!= EXPR_CONSTANT
)
2373 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2374 mpfr_erfc (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2376 return range_check (result
, "ERFC");
2380 /* Helper functions to simplify ERFC_SCALED(x) = ERFC(x) * EXP(X**2). */
2382 #define MAX_ITER 200
2383 #define ARG_LIMIT 12
2385 /* Calculate ERFC_SCALED directly by its definition:
2387 ERFC_SCALED(x) = ERFC(x) * EXP(X**2)
2389 using a large precision for intermediate results. This is used for all
2390 but large values of the argument. */
2392 fullprec_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2397 prec
= mpfr_get_default_prec ();
2398 mpfr_set_default_prec (10 * prec
);
2403 mpfr_set (a
, arg
, GFC_RND_MODE
);
2404 mpfr_sqr (b
, a
, GFC_RND_MODE
);
2405 mpfr_exp (b
, b
, GFC_RND_MODE
);
2406 mpfr_erfc (a
, a
, GFC_RND_MODE
);
2407 mpfr_mul (a
, a
, b
, GFC_RND_MODE
);
2409 mpfr_set (res
, a
, GFC_RND_MODE
);
2410 mpfr_set_default_prec (prec
);
2416 /* Calculate ERFC_SCALED using a power series expansion in 1/arg:
2418 ERFC_SCALED(x) = 1 / (x * sqrt(pi))
2419 * (1 + Sum_n (-1)**n * (1 * 3 * 5 * ... * (2n-1))
2422 This is used for large values of the argument. Intermediate calculations
2423 are performed with twice the precision. We don't do a fixed number of
2424 iterations of the sum, but stop when it has converged to the required
2427 asympt_erfc_scaled (mpfr_t res
, mpfr_t arg
)
2429 mpfr_t sum
, x
, u
, v
, w
, oldsum
, sumtrunc
;
2434 prec
= mpfr_get_default_prec ();
2435 mpfr_set_default_prec (2 * prec
);
2445 mpfr_init (sumtrunc
);
2446 mpfr_set_prec (oldsum
, prec
);
2447 mpfr_set_prec (sumtrunc
, prec
);
2449 mpfr_set (x
, arg
, GFC_RND_MODE
);
2450 mpfr_set_ui (sum
, 1, GFC_RND_MODE
);
2451 mpz_set_ui (num
, 1);
2453 mpfr_set (u
, x
, GFC_RND_MODE
);
2454 mpfr_sqr (u
, u
, GFC_RND_MODE
);
2455 mpfr_mul_ui (u
, u
, 2, GFC_RND_MODE
);
2456 mpfr_pow_si (u
, u
, -1, GFC_RND_MODE
);
2458 for (i
= 1; i
< MAX_ITER
; i
++)
2460 mpfr_set (oldsum
, sum
, GFC_RND_MODE
);
2462 mpz_mul_ui (num
, num
, 2 * i
- 1);
2465 mpfr_set (w
, u
, GFC_RND_MODE
);
2466 mpfr_pow_ui (w
, w
, i
, GFC_RND_MODE
);
2468 mpfr_set_z (v
, num
, GFC_RND_MODE
);
2469 mpfr_mul (v
, v
, w
, GFC_RND_MODE
);
2471 mpfr_add (sum
, sum
, v
, GFC_RND_MODE
);
2473 mpfr_set (sumtrunc
, sum
, GFC_RND_MODE
);
2474 if (mpfr_cmp (sumtrunc
, oldsum
) == 0)
2478 /* We should have converged by now; otherwise, ARG_LIMIT is probably
2480 gcc_assert (i
< MAX_ITER
);
2482 /* Divide by x * sqrt(Pi). */
2483 mpfr_const_pi (u
, GFC_RND_MODE
);
2484 mpfr_sqrt (u
, u
, GFC_RND_MODE
);
2485 mpfr_mul (u
, u
, x
, GFC_RND_MODE
);
2486 mpfr_div (sum
, sum
, u
, GFC_RND_MODE
);
2488 mpfr_set (res
, sum
, GFC_RND_MODE
);
2489 mpfr_set_default_prec (prec
);
2491 mpfr_clears (sum
, x
, u
, v
, w
, oldsum
, sumtrunc
, NULL
);
2497 gfc_simplify_erfc_scaled (gfc_expr
*x
)
2501 if (x
->expr_type
!= EXPR_CONSTANT
)
2504 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2505 if (mpfr_cmp_d (x
->value
.real
, ARG_LIMIT
) >= 0)
2506 asympt_erfc_scaled (result
->value
.real
, x
->value
.real
);
2508 fullprec_erfc_scaled (result
->value
.real
, x
->value
.real
);
2510 return range_check (result
, "ERFC_SCALED");
2518 gfc_simplify_epsilon (gfc_expr
*e
)
2523 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2525 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
2526 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].epsilon
, GFC_RND_MODE
);
2528 return range_check (result
, "EPSILON");
2533 gfc_simplify_exp (gfc_expr
*x
)
2537 if (x
->expr_type
!= EXPR_CONSTANT
)
2540 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2545 mpfr_exp (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2549 gfc_set_model_kind (x
->ts
.kind
);
2550 mpc_exp (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
2554 gfc_internal_error ("in gfc_simplify_exp(): Bad type");
2557 return range_check (result
, "EXP");
2562 gfc_simplify_exponent (gfc_expr
*x
)
2567 if (x
->expr_type
!= EXPR_CONSTANT
)
2570 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
2573 /* EXPONENT(inf) = EXPONENT(nan) = HUGE(0) */
2574 if (mpfr_inf_p (x
->value
.real
) || mpfr_nan_p (x
->value
.real
))
2576 int i
= gfc_validate_kind (BT_INTEGER
, gfc_default_integer_kind
, false);
2577 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
2581 /* EXPONENT(+/- 0.0) = 0 */
2582 if (mpfr_zero_p (x
->value
.real
))
2584 mpz_set_ui (result
->value
.integer
, 0);
2588 gfc_set_model (x
->value
.real
);
2590 val
= (long int) mpfr_get_exp (x
->value
.real
);
2591 mpz_set_si (result
->value
.integer
, val
);
2593 return range_check (result
, "EXPONENT");
2598 gfc_simplify_failed_or_stopped_images (gfc_expr
*team ATTRIBUTE_UNUSED
,
2601 if (flag_coarray
== GFC_FCOARRAY_NONE
)
2603 gfc_current_locus
= *gfc_current_intrinsic_where
;
2604 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
2605 return &gfc_bad_expr
;
2608 if (flag_coarray
== GFC_FCOARRAY_SINGLE
)
2613 gfc_extract_int (kind
, &actual_kind
);
2615 actual_kind
= gfc_default_integer_kind
;
2617 result
= gfc_get_array_expr (BT_INTEGER
, actual_kind
, &gfc_current_locus
);
2622 /* For fcoarray = lib no simplification is possible, because it is not known
2623 what images failed or are stopped at compile time. */
2629 gfc_simplify_float (gfc_expr
*a
)
2633 if (a
->expr_type
!= EXPR_CONSTANT
)
2638 if (convert_boz (a
, gfc_default_real_kind
) == &gfc_bad_expr
)
2639 return &gfc_bad_expr
;
2641 result
= gfc_copy_expr (a
);
2644 result
= gfc_int2real (a
, gfc_default_real_kind
);
2646 return range_check (result
, "FLOAT");
2651 is_last_ref_vtab (gfc_expr
*e
)
2654 gfc_component
*comp
= NULL
;
2656 if (e
->expr_type
!= EXPR_VARIABLE
)
2659 for (ref
= e
->ref
; ref
; ref
= ref
->next
)
2660 if (ref
->type
== REF_COMPONENT
)
2661 comp
= ref
->u
.c
.component
;
2663 if (!e
->ref
|| !comp
)
2664 return e
->symtree
->n
.sym
->attr
.vtab
;
2666 if (comp
->name
[0] == '_' && strcmp (comp
->name
, "_vptr") == 0)
2674 gfc_simplify_extends_type_of (gfc_expr
*a
, gfc_expr
*mold
)
2676 /* Avoid simplification of resolved symbols. */
2677 if (is_last_ref_vtab (a
) || is_last_ref_vtab (mold
))
2680 if (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_DERIVED
)
2681 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
2682 gfc_type_is_extension_of (mold
->ts
.u
.derived
,
2685 if (UNLIMITED_POLY (a
) || UNLIMITED_POLY (mold
))
2688 /* Return .false. if the dynamic type can never be an extension. */
2689 if ((a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_CLASS
2690 && !gfc_type_is_extension_of
2691 (mold
->ts
.u
.derived
->components
->ts
.u
.derived
,
2692 a
->ts
.u
.derived
->components
->ts
.u
.derived
)
2693 && !gfc_type_is_extension_of
2694 (a
->ts
.u
.derived
->components
->ts
.u
.derived
,
2695 mold
->ts
.u
.derived
->components
->ts
.u
.derived
))
2696 || (a
->ts
.type
== BT_DERIVED
&& mold
->ts
.type
== BT_CLASS
2697 && !gfc_type_is_extension_of
2698 (mold
->ts
.u
.derived
->components
->ts
.u
.derived
,
2700 || (a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_DERIVED
2701 && !gfc_type_is_extension_of
2702 (mold
->ts
.u
.derived
,
2703 a
->ts
.u
.derived
->components
->ts
.u
.derived
)
2704 && !gfc_type_is_extension_of
2705 (a
->ts
.u
.derived
->components
->ts
.u
.derived
,
2706 mold
->ts
.u
.derived
)))
2707 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
2709 /* Return .true. if the dynamic type is guaranteed to be an extension. */
2710 if (a
->ts
.type
== BT_CLASS
&& mold
->ts
.type
== BT_DERIVED
2711 && gfc_type_is_extension_of (mold
->ts
.u
.derived
,
2712 a
->ts
.u
.derived
->components
->ts
.u
.derived
))
2713 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, true);
2720 gfc_simplify_same_type_as (gfc_expr
*a
, gfc_expr
*b
)
2722 /* Avoid simplification of resolved symbols. */
2723 if (is_last_ref_vtab (a
) || is_last_ref_vtab (b
))
2726 /* Return .false. if the dynamic type can never be the
2728 if (((a
->ts
.type
== BT_CLASS
&& gfc_expr_attr (a
).class_ok
)
2729 || (b
->ts
.type
== BT_CLASS
&& gfc_expr_attr (b
).class_ok
))
2730 && !gfc_type_compatible (&a
->ts
, &b
->ts
)
2731 && !gfc_type_compatible (&b
->ts
, &a
->ts
))
2732 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
, false);
2734 if (a
->ts
.type
!= BT_DERIVED
|| b
->ts
.type
!= BT_DERIVED
)
2737 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
2738 gfc_compare_derived_types (a
->ts
.u
.derived
,
2744 gfc_simplify_floor (gfc_expr
*e
, gfc_expr
*k
)
2750 kind
= get_kind (BT_INTEGER
, k
, "FLOOR", gfc_default_integer_kind
);
2752 gfc_internal_error ("gfc_simplify_floor(): Bad kind");
2754 if (e
->expr_type
!= EXPR_CONSTANT
)
2757 mpfr_init2 (floor
, mpfr_get_prec (e
->value
.real
));
2758 mpfr_floor (floor
, e
->value
.real
);
2760 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
2761 gfc_mpfr_to_mpz (result
->value
.integer
, floor
, &e
->where
);
2765 return range_check (result
, "FLOOR");
2770 gfc_simplify_fraction (gfc_expr
*x
)
2774 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
2775 mpfr_t absv
, exp
, pow2
;
2780 if (x
->expr_type
!= EXPR_CONSTANT
)
2783 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
2785 /* FRACTION(inf) = NaN. */
2786 if (mpfr_inf_p (x
->value
.real
))
2788 mpfr_set_nan (result
->value
.real
);
2792 #if MPFR_VERSION < MPFR_VERSION_NUM(3,1,0)
2794 /* MPFR versions before 3.1.0 do not include mpfr_frexp.
2795 TODO: remove the kludge when MPFR 3.1.0 or newer will be required */
2797 if (mpfr_sgn (x
->value
.real
) == 0)
2799 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2803 gfc_set_model_kind (x
->ts
.kind
);
2808 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
2809 mpfr_log2 (exp
, absv
, GFC_RND_MODE
);
2811 mpfr_trunc (exp
, exp
);
2812 mpfr_add_ui (exp
, exp
, 1, GFC_RND_MODE
);
2814 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
2816 mpfr_div (result
->value
.real
, x
->value
.real
, pow2
, GFC_RND_MODE
);
2818 mpfr_clears (exp
, absv
, pow2
, NULL
);
2822 /* mpfr_frexp() correctly handles zeros and NaNs. */
2823 mpfr_frexp (&e
, result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2827 return range_check (result
, "FRACTION");
2832 gfc_simplify_gamma (gfc_expr
*x
)
2836 if (x
->expr_type
!= EXPR_CONSTANT
)
2839 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2840 mpfr_gamma (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
2842 return range_check (result
, "GAMMA");
2847 gfc_simplify_huge (gfc_expr
*e
)
2852 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
2853 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
2858 mpz_set (result
->value
.integer
, gfc_integer_kinds
[i
].huge
);
2862 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].huge
, GFC_RND_MODE
);
2874 gfc_simplify_hypot (gfc_expr
*x
, gfc_expr
*y
)
2878 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2881 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
2882 mpfr_hypot (result
->value
.real
, x
->value
.real
, y
->value
.real
, GFC_RND_MODE
);
2883 return range_check (result
, "HYPOT");
2887 /* We use the processor's collating sequence, because all
2888 systems that gfortran currently works on are ASCII. */
2891 gfc_simplify_iachar (gfc_expr
*e
, gfc_expr
*kind
)
2897 if (e
->expr_type
!= EXPR_CONSTANT
)
2900 if (e
->value
.character
.length
!= 1)
2902 gfc_error ("Argument of IACHAR at %L must be of length one", &e
->where
);
2903 return &gfc_bad_expr
;
2906 index
= e
->value
.character
.string
[0];
2908 if (warn_surprising
&& index
> 127)
2909 gfc_warning (OPT_Wsurprising
,
2910 "Argument of IACHAR function at %L outside of range 0..127",
2913 k
= get_kind (BT_INTEGER
, kind
, "IACHAR", gfc_default_integer_kind
);
2915 return &gfc_bad_expr
;
2917 result
= gfc_get_int_expr (k
, &e
->where
, index
);
2919 return range_check (result
, "IACHAR");
2924 do_bit_and (gfc_expr
*result
, gfc_expr
*e
)
2926 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
2927 gcc_assert (result
->ts
.type
== BT_INTEGER
2928 && result
->expr_type
== EXPR_CONSTANT
);
2930 mpz_and (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
2936 gfc_simplify_iall (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
2938 return simplify_transformation (array
, dim
, mask
, -1, do_bit_and
);
2943 do_bit_ior (gfc_expr
*result
, gfc_expr
*e
)
2945 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
2946 gcc_assert (result
->ts
.type
== BT_INTEGER
2947 && result
->expr_type
== EXPR_CONSTANT
);
2949 mpz_ior (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
2955 gfc_simplify_iany (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
2957 return simplify_transformation (array
, dim
, mask
, 0, do_bit_ior
);
2962 gfc_simplify_iand (gfc_expr
*x
, gfc_expr
*y
)
2966 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2969 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
2970 mpz_and (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
2972 return range_check (result
, "IAND");
2977 gfc_simplify_ibclr (gfc_expr
*x
, gfc_expr
*y
)
2982 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
2985 gfc_extract_int (y
, &pos
);
2987 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
2989 result
= gfc_copy_expr (x
);
2991 convert_mpz_to_unsigned (result
->value
.integer
,
2992 gfc_integer_kinds
[k
].bit_size
);
2994 mpz_clrbit (result
->value
.integer
, pos
);
2996 gfc_convert_mpz_to_signed (result
->value
.integer
,
2997 gfc_integer_kinds
[k
].bit_size
);
3004 gfc_simplify_ibits (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*z
)
3011 if (x
->expr_type
!= EXPR_CONSTANT
3012 || y
->expr_type
!= EXPR_CONSTANT
3013 || z
->expr_type
!= EXPR_CONSTANT
)
3016 gfc_extract_int (y
, &pos
);
3017 gfc_extract_int (z
, &len
);
3019 k
= gfc_validate_kind (BT_INTEGER
, x
->ts
.kind
, false);
3021 bitsize
= gfc_integer_kinds
[k
].bit_size
;
3023 if (pos
+ len
> bitsize
)
3025 gfc_error ("Sum of second and third arguments of IBITS exceeds "
3026 "bit size at %L", &y
->where
);
3027 return &gfc_bad_expr
;
3030 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
3031 convert_mpz_to_unsigned (result
->value
.integer
,
3032 gfc_integer_kinds
[k
].bit_size
);
3034 bits
= XCNEWVEC (int, bitsize
);
3036 for (i
= 0; i
< bitsize
; i
++)
3039 for (i
= 0; i
< len
; i
++)
3040 bits
[i
] = mpz_tstbit (x
->value
.integer
, i
+ pos
);
3042 for (i
= 0; i
< bitsize
; i
++)
3045 mpz_clrbit (result
->value
.integer
, i
);
3046 else if (bits
[i
] == 1)
3047 mpz_setbit (result
->value
.integer
, i
);
3049 gfc_internal_error ("IBITS: Bad bit");
3054 gfc_convert_mpz_to_signed (result
->value
.integer
,
3055 gfc_integer_kinds
[k
].bit_size
);
3062 gfc_simplify_ibset (gfc_expr
*x
, gfc_expr
*y
)
3067 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3070 gfc_extract_int (y
, &pos
);
3072 k
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
3074 result
= gfc_copy_expr (x
);
3076 convert_mpz_to_unsigned (result
->value
.integer
,
3077 gfc_integer_kinds
[k
].bit_size
);
3079 mpz_setbit (result
->value
.integer
, pos
);
3081 gfc_convert_mpz_to_signed (result
->value
.integer
,
3082 gfc_integer_kinds
[k
].bit_size
);
3089 gfc_simplify_ichar (gfc_expr
*e
, gfc_expr
*kind
)
3095 if (e
->expr_type
!= EXPR_CONSTANT
)
3098 if (e
->value
.character
.length
!= 1)
3100 gfc_error ("Argument of ICHAR at %L must be of length one", &e
->where
);
3101 return &gfc_bad_expr
;
3104 index
= e
->value
.character
.string
[0];
3106 k
= get_kind (BT_INTEGER
, kind
, "ICHAR", gfc_default_integer_kind
);
3108 return &gfc_bad_expr
;
3110 result
= gfc_get_int_expr (k
, &e
->where
, index
);
3112 return range_check (result
, "ICHAR");
3117 gfc_simplify_ieor (gfc_expr
*x
, gfc_expr
*y
)
3121 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3124 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
3125 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
3127 return range_check (result
, "IEOR");
3132 gfc_simplify_index (gfc_expr
*x
, gfc_expr
*y
, gfc_expr
*b
, gfc_expr
*kind
)
3135 int back
, len
, lensub
;
3136 int i
, j
, k
, count
, index
= 0, start
;
3138 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
3139 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
3142 if (b
!= NULL
&& b
->value
.logical
!= 0)
3147 k
= get_kind (BT_INTEGER
, kind
, "INDEX", gfc_default_integer_kind
);
3149 return &gfc_bad_expr
;
3151 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &x
->where
);
3153 len
= x
->value
.character
.length
;
3154 lensub
= y
->value
.character
.length
;
3158 mpz_set_si (result
->value
.integer
, 0);
3166 mpz_set_si (result
->value
.integer
, 1);
3169 else if (lensub
== 1)
3171 for (i
= 0; i
< len
; i
++)
3173 for (j
= 0; j
< lensub
; j
++)
3175 if (y
->value
.character
.string
[j
]
3176 == x
->value
.character
.string
[i
])
3186 for (i
= 0; i
< len
; i
++)
3188 for (j
= 0; j
< lensub
; j
++)
3190 if (y
->value
.character
.string
[j
]
3191 == x
->value
.character
.string
[i
])
3196 for (k
= 0; k
< lensub
; k
++)
3198 if (y
->value
.character
.string
[k
]
3199 == x
->value
.character
.string
[k
+ start
])
3203 if (count
== lensub
)
3218 mpz_set_si (result
->value
.integer
, len
+ 1);
3221 else if (lensub
== 1)
3223 for (i
= 0; i
< len
; i
++)
3225 for (j
= 0; j
< lensub
; j
++)
3227 if (y
->value
.character
.string
[j
]
3228 == x
->value
.character
.string
[len
- i
])
3230 index
= len
- i
+ 1;
3238 for (i
= 0; i
< len
; i
++)
3240 for (j
= 0; j
< lensub
; j
++)
3242 if (y
->value
.character
.string
[j
]
3243 == x
->value
.character
.string
[len
- i
])
3246 if (start
<= len
- lensub
)
3249 for (k
= 0; k
< lensub
; k
++)
3250 if (y
->value
.character
.string
[k
]
3251 == x
->value
.character
.string
[k
+ start
])
3254 if (count
== lensub
)
3271 mpz_set_si (result
->value
.integer
, index
);
3272 return range_check (result
, "INDEX");
3277 simplify_intconv (gfc_expr
*e
, int kind
, const char *name
)
3279 gfc_expr
*result
= NULL
;
3281 if (e
->expr_type
!= EXPR_CONSTANT
)
3284 result
= gfc_convert_constant (e
, BT_INTEGER
, kind
);
3285 if (result
== &gfc_bad_expr
)
3286 return &gfc_bad_expr
;
3288 return range_check (result
, name
);
3293 gfc_simplify_int (gfc_expr
*e
, gfc_expr
*k
)
3297 kind
= get_kind (BT_INTEGER
, k
, "INT", gfc_default_integer_kind
);
3299 return &gfc_bad_expr
;
3301 return simplify_intconv (e
, kind
, "INT");
3305 gfc_simplify_int2 (gfc_expr
*e
)
3307 return simplify_intconv (e
, 2, "INT2");
3312 gfc_simplify_int8 (gfc_expr
*e
)
3314 return simplify_intconv (e
, 8, "INT8");
3319 gfc_simplify_long (gfc_expr
*e
)
3321 return simplify_intconv (e
, 4, "LONG");
3326 gfc_simplify_ifix (gfc_expr
*e
)
3328 gfc_expr
*rtrunc
, *result
;
3330 if (e
->expr_type
!= EXPR_CONSTANT
)
3333 rtrunc
= gfc_copy_expr (e
);
3334 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
3336 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
3338 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
3340 gfc_free_expr (rtrunc
);
3342 return range_check (result
, "IFIX");
3347 gfc_simplify_idint (gfc_expr
*e
)
3349 gfc_expr
*rtrunc
, *result
;
3351 if (e
->expr_type
!= EXPR_CONSTANT
)
3354 rtrunc
= gfc_copy_expr (e
);
3355 mpfr_trunc (rtrunc
->value
.real
, e
->value
.real
);
3357 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
3359 gfc_mpfr_to_mpz (result
->value
.integer
, rtrunc
->value
.real
, &e
->where
);
3361 gfc_free_expr (rtrunc
);
3363 return range_check (result
, "IDINT");
3368 gfc_simplify_ior (gfc_expr
*x
, gfc_expr
*y
)
3372 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
3375 result
= gfc_get_constant_expr (BT_INTEGER
, x
->ts
.kind
, &x
->where
);
3376 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
3378 return range_check (result
, "IOR");
3383 do_bit_xor (gfc_expr
*result
, gfc_expr
*e
)
3385 gcc_assert (e
->ts
.type
== BT_INTEGER
&& e
->expr_type
== EXPR_CONSTANT
);
3386 gcc_assert (result
->ts
.type
== BT_INTEGER
3387 && result
->expr_type
== EXPR_CONSTANT
);
3389 mpz_xor (result
->value
.integer
, result
->value
.integer
, e
->value
.integer
);
3395 gfc_simplify_iparity (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
3397 return simplify_transformation (array
, dim
, mask
, 0, do_bit_xor
);
3402 gfc_simplify_is_iostat_end (gfc_expr
*x
)
3404 if (x
->expr_type
!= EXPR_CONSTANT
)
3407 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3408 mpz_cmp_si (x
->value
.integer
,
3409 LIBERROR_END
) == 0);
3414 gfc_simplify_is_iostat_eor (gfc_expr
*x
)
3416 if (x
->expr_type
!= EXPR_CONSTANT
)
3419 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3420 mpz_cmp_si (x
->value
.integer
,
3421 LIBERROR_EOR
) == 0);
3426 gfc_simplify_isnan (gfc_expr
*x
)
3428 if (x
->expr_type
!= EXPR_CONSTANT
)
3431 return gfc_get_logical_expr (gfc_default_logical_kind
, &x
->where
,
3432 mpfr_nan_p (x
->value
.real
));
3436 /* Performs a shift on its first argument. Depending on the last
3437 argument, the shift can be arithmetic, i.e. with filling from the
3438 left like in the SHIFTA intrinsic. */
3440 simplify_shift (gfc_expr
*e
, gfc_expr
*s
, const char *name
,
3441 bool arithmetic
, int direction
)
3444 int ashift
, *bits
, i
, k
, bitsize
, shift
;
3446 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
3449 gfc_extract_int (s
, &shift
);
3451 k
= gfc_validate_kind (BT_INTEGER
, e
->ts
.kind
, false);
3452 bitsize
= gfc_integer_kinds
[k
].bit_size
;
3454 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3458 mpz_set (result
->value
.integer
, e
->value
.integer
);
3462 if (direction
> 0 && shift
< 0)
3464 /* Left shift, as in SHIFTL. */
3465 gfc_error ("Second argument of %s is negative at %L", name
, &e
->where
);
3466 return &gfc_bad_expr
;
3468 else if (direction
< 0)
3470 /* Right shift, as in SHIFTR or SHIFTA. */
3473 gfc_error ("Second argument of %s is negative at %L",
3475 return &gfc_bad_expr
;
3481 ashift
= (shift
>= 0 ? shift
: -shift
);
3483 if (ashift
> bitsize
)
3485 gfc_error ("Magnitude of second argument of %s exceeds bit size "
3486 "at %L", name
, &e
->where
);
3487 return &gfc_bad_expr
;
3490 bits
= XCNEWVEC (int, bitsize
);
3492 for (i
= 0; i
< bitsize
; i
++)
3493 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3498 for (i
= 0; i
< shift
; i
++)
3499 mpz_clrbit (result
->value
.integer
, i
);
3501 for (i
= 0; i
< bitsize
- shift
; i
++)
3504 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3506 mpz_setbit (result
->value
.integer
, i
+ shift
);
3512 if (arithmetic
&& bits
[bitsize
- 1])
3513 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
3514 mpz_setbit (result
->value
.integer
, i
);
3516 for (i
= bitsize
- 1; i
>= bitsize
- ashift
; i
--)
3517 mpz_clrbit (result
->value
.integer
, i
);
3519 for (i
= bitsize
- 1; i
>= ashift
; i
--)
3522 mpz_clrbit (result
->value
.integer
, i
- ashift
);
3524 mpz_setbit (result
->value
.integer
, i
- ashift
);
3528 gfc_convert_mpz_to_signed (result
->value
.integer
, bitsize
);
3536 gfc_simplify_ishft (gfc_expr
*e
, gfc_expr
*s
)
3538 return simplify_shift (e
, s
, "ISHFT", false, 0);
3543 gfc_simplify_lshift (gfc_expr
*e
, gfc_expr
*s
)
3545 return simplify_shift (e
, s
, "LSHIFT", false, 1);
3550 gfc_simplify_rshift (gfc_expr
*e
, gfc_expr
*s
)
3552 return simplify_shift (e
, s
, "RSHIFT", true, -1);
3557 gfc_simplify_shifta (gfc_expr
*e
, gfc_expr
*s
)
3559 return simplify_shift (e
, s
, "SHIFTA", true, -1);
3564 gfc_simplify_shiftl (gfc_expr
*e
, gfc_expr
*s
)
3566 return simplify_shift (e
, s
, "SHIFTL", false, 1);
3571 gfc_simplify_shiftr (gfc_expr
*e
, gfc_expr
*s
)
3573 return simplify_shift (e
, s
, "SHIFTR", false, -1);
3578 gfc_simplify_ishftc (gfc_expr
*e
, gfc_expr
*s
, gfc_expr
*sz
)
3581 int shift
, ashift
, isize
, ssize
, delta
, k
;
3584 if (e
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
3587 gfc_extract_int (s
, &shift
);
3589 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
3590 isize
= gfc_integer_kinds
[k
].bit_size
;
3594 if (sz
->expr_type
!= EXPR_CONSTANT
)
3597 gfc_extract_int (sz
, &ssize
);
3610 gfc_error ("Magnitude of second argument of ISHFTC exceeds "
3611 "BIT_SIZE of first argument at %C");
3613 gfc_error ("Absolute value of SHIFT shall be less than or equal "
3615 return &gfc_bad_expr
;
3618 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
3620 mpz_set (result
->value
.integer
, e
->value
.integer
);
3625 convert_mpz_to_unsigned (result
->value
.integer
, isize
);
3627 bits
= XCNEWVEC (int, ssize
);
3629 for (i
= 0; i
< ssize
; i
++)
3630 bits
[i
] = mpz_tstbit (e
->value
.integer
, i
);
3632 delta
= ssize
- ashift
;
3636 for (i
= 0; i
< delta
; i
++)
3639 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3641 mpz_setbit (result
->value
.integer
, i
+ shift
);
3644 for (i
= delta
; i
< ssize
; i
++)
3647 mpz_clrbit (result
->value
.integer
, i
- delta
);
3649 mpz_setbit (result
->value
.integer
, i
- delta
);
3654 for (i
= 0; i
< ashift
; i
++)
3657 mpz_clrbit (result
->value
.integer
, i
+ delta
);
3659 mpz_setbit (result
->value
.integer
, i
+ delta
);
3662 for (i
= ashift
; i
< ssize
; i
++)
3665 mpz_clrbit (result
->value
.integer
, i
+ shift
);
3667 mpz_setbit (result
->value
.integer
, i
+ shift
);
3671 gfc_convert_mpz_to_signed (result
->value
.integer
, isize
);
3679 gfc_simplify_kind (gfc_expr
*e
)
3681 return gfc_get_int_expr (gfc_default_integer_kind
, NULL
, e
->ts
.kind
);
3686 simplify_bound_dim (gfc_expr
*array
, gfc_expr
*kind
, int d
, int upper
,
3687 gfc_array_spec
*as
, gfc_ref
*ref
, bool coarray
)
3689 gfc_expr
*l
, *u
, *result
;
3692 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
3693 gfc_default_integer_kind
);
3695 return &gfc_bad_expr
;
3697 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
3699 /* For non-variables, LBOUND(expr, DIM=n) = 1 and
3700 UBOUND(expr, DIM=n) = SIZE(expr, DIM=n). */
3701 if (!coarray
&& array
->expr_type
!= EXPR_VARIABLE
)
3705 gfc_expr
* dim
= result
;
3706 mpz_set_si (dim
->value
.integer
, d
);
3708 result
= simplify_size (array
, dim
, k
);
3709 gfc_free_expr (dim
);
3714 mpz_set_si (result
->value
.integer
, 1);
3719 /* Otherwise, we have a variable expression. */
3720 gcc_assert (array
->expr_type
== EXPR_VARIABLE
);
3723 if (!gfc_resolve_array_spec (as
, 0))
3726 /* The last dimension of an assumed-size array is special. */
3727 if ((!coarray
&& d
== as
->rank
&& as
->type
== AS_ASSUMED_SIZE
&& !upper
)
3728 || (coarray
&& d
== as
->rank
+ as
->corank
3729 && (!upper
|| flag_coarray
== GFC_FCOARRAY_SINGLE
)))
3731 if (as
->lower
[d
-1]->expr_type
== EXPR_CONSTANT
)
3733 gfc_free_expr (result
);
3734 return gfc_copy_expr (as
->lower
[d
-1]);
3740 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
3742 /* Then, we need to know the extent of the given dimension. */
3743 if (coarray
|| (ref
->u
.ar
.type
== AR_FULL
&& !ref
->next
))
3745 gfc_expr
*declared_bound
;
3747 bool constant_lbound
, constant_ubound
;
3752 gcc_assert (l
!= NULL
);
3754 constant_lbound
= l
->expr_type
== EXPR_CONSTANT
;
3755 constant_ubound
= u
&& u
->expr_type
== EXPR_CONSTANT
;
3757 empty_bound
= upper
? 0 : 1;
3758 declared_bound
= upper
? u
: l
;
3760 if ((!upper
&& !constant_lbound
)
3761 || (upper
&& !constant_ubound
))
3766 /* For {L,U}BOUND, the value depends on whether the array
3767 is empty. We can nevertheless simplify if the declared bound
3768 has the same value as that of an empty array, in which case
3769 the result isn't dependent on the array emptyness. */
3770 if (mpz_cmp_si (declared_bound
->value
.integer
, empty_bound
) == 0)
3771 mpz_set_si (result
->value
.integer
, empty_bound
);
3772 else if (!constant_lbound
|| !constant_ubound
)
3773 /* Array emptyness can't be determined, we can't simplify. */
3775 else if (mpz_cmp (l
->value
.integer
, u
->value
.integer
) > 0)
3776 mpz_set_si (result
->value
.integer
, empty_bound
);
3778 mpz_set (result
->value
.integer
, declared_bound
->value
.integer
);
3781 mpz_set (result
->value
.integer
, declared_bound
->value
.integer
);
3787 if (!gfc_ref_dimen_size (&ref
->u
.ar
, d
- 1, &result
->value
.integer
, NULL
))
3791 mpz_set_si (result
->value
.integer
, (long int) 1);
3795 return range_check (result
, upper
? "UBOUND" : "LBOUND");
3798 gfc_free_expr (result
);
3804 simplify_bound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
3810 if (array
->ts
.type
== BT_CLASS
)
3813 if (array
->expr_type
!= EXPR_VARIABLE
)
3820 /* Follow any component references. */
3821 as
= array
->symtree
->n
.sym
->as
;
3822 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
3827 switch (ref
->u
.ar
.type
)
3834 /* We're done because 'as' has already been set in the
3835 previous iteration. */
3849 as
= ref
->u
.c
.component
->as
;
3861 if (as
&& (as
->type
== AS_DEFERRED
|| as
->type
== AS_ASSUMED_RANK
3862 || (as
->type
== AS_ASSUMED_SHAPE
&& upper
)))
3866 || (as
->type
!= AS_DEFERRED
3867 && array
->expr_type
== EXPR_VARIABLE
3868 && !gfc_expr_attr (array
).allocatable
3869 && !gfc_expr_attr (array
).pointer
));
3873 /* Multi-dimensional bounds. */
3874 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
3878 /* UBOUND(ARRAY) is not valid for an assumed-size array. */
3879 if (upper
&& as
&& as
->type
== AS_ASSUMED_SIZE
)
3881 /* An error message will be emitted in
3882 check_assumed_size_reference (resolve.c). */
3883 return &gfc_bad_expr
;
3886 /* Simplify the bounds for each dimension. */
3887 for (d
= 0; d
< array
->rank
; d
++)
3889 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1, upper
, as
, ref
,
3891 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
3895 for (j
= 0; j
< d
; j
++)
3896 gfc_free_expr (bounds
[j
]);
3901 /* Allocate the result expression. */
3902 k
= get_kind (BT_INTEGER
, kind
, upper
? "UBOUND" : "LBOUND",
3903 gfc_default_integer_kind
);
3905 return &gfc_bad_expr
;
3907 e
= gfc_get_array_expr (BT_INTEGER
, k
, &array
->where
);
3909 /* The result is a rank 1 array; its size is the rank of the first
3910 argument to {L,U}BOUND. */
3912 e
->shape
= gfc_get_shape (1);
3913 mpz_init_set_ui (e
->shape
[0], array
->rank
);
3915 /* Create the constructor for this array. */
3916 for (d
= 0; d
< array
->rank
; d
++)
3917 gfc_constructor_append_expr (&e
->value
.constructor
,
3918 bounds
[d
], &e
->where
);
3924 /* A DIM argument is specified. */
3925 if (dim
->expr_type
!= EXPR_CONSTANT
)
3928 d
= mpz_get_si (dim
->value
.integer
);
3930 if ((d
< 1 || d
> array
->rank
)
3931 || (d
== array
->rank
&& as
&& as
->type
== AS_ASSUMED_SIZE
&& upper
))
3933 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
3934 return &gfc_bad_expr
;
3937 if (as
&& as
->type
== AS_ASSUMED_RANK
)
3940 return simplify_bound_dim (array
, kind
, d
, upper
, as
, ref
, false);
3946 simplify_cobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
, int upper
)
3952 if (array
->expr_type
!= EXPR_VARIABLE
)
3955 /* Follow any component references. */
3956 as
= (array
->ts
.type
== BT_CLASS
&& array
->ts
.u
.derived
->components
)
3957 ? array
->ts
.u
.derived
->components
->as
3958 : array
->symtree
->n
.sym
->as
;
3959 for (ref
= array
->ref
; ref
; ref
= ref
->next
)
3964 switch (ref
->u
.ar
.type
)
3967 if (ref
->u
.ar
.as
->corank
> 0)
3969 gcc_assert (as
== ref
->u
.ar
.as
);
3976 /* We're done because 'as' has already been set in the
3977 previous iteration. */
3991 as
= ref
->u
.c
.component
->as
;
4004 if (as
->cotype
== AS_DEFERRED
|| as
->cotype
== AS_ASSUMED_SHAPE
)
4009 /* Multi-dimensional cobounds. */
4010 gfc_expr
*bounds
[GFC_MAX_DIMENSIONS
];
4014 /* Simplify the cobounds for each dimension. */
4015 for (d
= 0; d
< as
->corank
; d
++)
4017 bounds
[d
] = simplify_bound_dim (array
, kind
, d
+ 1 + as
->rank
,
4018 upper
, as
, ref
, true);
4019 if (bounds
[d
] == NULL
|| bounds
[d
] == &gfc_bad_expr
)
4023 for (j
= 0; j
< d
; j
++)
4024 gfc_free_expr (bounds
[j
]);
4029 /* Allocate the result expression. */
4030 e
= gfc_get_expr ();
4031 e
->where
= array
->where
;
4032 e
->expr_type
= EXPR_ARRAY
;
4033 e
->ts
.type
= BT_INTEGER
;
4034 k
= get_kind (BT_INTEGER
, kind
, upper
? "UCOBOUND" : "LCOBOUND",
4035 gfc_default_integer_kind
);
4039 return &gfc_bad_expr
;
4043 /* The result is a rank 1 array; its size is the rank of the first
4044 argument to {L,U}COBOUND. */
4046 e
->shape
= gfc_get_shape (1);
4047 mpz_init_set_ui (e
->shape
[0], as
->corank
);
4049 /* Create the constructor for this array. */
4050 for (d
= 0; d
< as
->corank
; d
++)
4051 gfc_constructor_append_expr (&e
->value
.constructor
,
4052 bounds
[d
], &e
->where
);
4057 /* A DIM argument is specified. */
4058 if (dim
->expr_type
!= EXPR_CONSTANT
)
4061 d
= mpz_get_si (dim
->value
.integer
);
4063 if (d
< 1 || d
> as
->corank
)
4065 gfc_error ("DIM argument at %L is out of bounds", &dim
->where
);
4066 return &gfc_bad_expr
;
4069 return simplify_bound_dim (array
, kind
, d
+as
->rank
, upper
, as
, ref
, true);
4075 gfc_simplify_lbound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
4077 return simplify_bound (array
, dim
, kind
, 0);
4082 gfc_simplify_lcobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
4084 return simplify_cobound (array
, dim
, kind
, 0);
4088 gfc_simplify_leadz (gfc_expr
*e
)
4090 unsigned long lz
, bs
;
4093 if (e
->expr_type
!= EXPR_CONSTANT
)
4096 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
4097 bs
= gfc_integer_kinds
[i
].bit_size
;
4098 if (mpz_cmp_si (e
->value
.integer
, 0) == 0)
4100 else if (mpz_cmp_si (e
->value
.integer
, 0) < 0)
4103 lz
= bs
- mpz_sizeinbase (e
->value
.integer
, 2);
4105 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, lz
);
4110 gfc_simplify_len (gfc_expr
*e
, gfc_expr
*kind
)
4113 int k
= get_kind (BT_INTEGER
, kind
, "LEN", gfc_default_integer_kind
);
4116 return &gfc_bad_expr
;
4118 if (e
->expr_type
== EXPR_CONSTANT
)
4120 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &e
->where
);
4121 mpz_set_si (result
->value
.integer
, e
->value
.character
.length
);
4122 return range_check (result
, "LEN");
4124 else if (e
->ts
.u
.cl
!= NULL
&& e
->ts
.u
.cl
->length
!= NULL
4125 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
4126 && e
->ts
.u
.cl
->length
->ts
.type
== BT_INTEGER
)
4128 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &e
->where
);
4129 mpz_set (result
->value
.integer
, e
->ts
.u
.cl
->length
->value
.integer
);
4130 return range_check (result
, "LEN");
4132 else if (e
->expr_type
== EXPR_VARIABLE
&& e
->ts
.type
== BT_CHARACTER
4133 && e
->symtree
->n
.sym
4134 && e
->symtree
->n
.sym
->ts
.type
!= BT_DERIVED
4135 && e
->symtree
->n
.sym
->assoc
&& e
->symtree
->n
.sym
->assoc
->target
4136 && e
->symtree
->n
.sym
->assoc
->target
->ts
.type
== BT_DERIVED
4137 && e
->symtree
->n
.sym
->assoc
->target
->symtree
->n
.sym
4138 && UNLIMITED_POLY (e
->symtree
->n
.sym
->assoc
->target
->symtree
->n
.sym
))
4140 /* The expression in assoc->target points to a ref to the _data component
4141 of the unlimited polymorphic entity. To get the _len component the last
4142 _data ref needs to be stripped and a ref to the _len component added. */
4143 return gfc_get_len_component (e
->symtree
->n
.sym
->assoc
->target
);
4150 gfc_simplify_len_trim (gfc_expr
*e
, gfc_expr
*kind
)
4154 int k
= get_kind (BT_INTEGER
, kind
, "LEN_TRIM", gfc_default_integer_kind
);
4157 return &gfc_bad_expr
;
4159 if (e
->expr_type
!= EXPR_CONSTANT
)
4162 len
= e
->value
.character
.length
;
4163 for (count
= 0, i
= 1; i
<= len
; i
++)
4164 if (e
->value
.character
.string
[len
- i
] == ' ')
4169 result
= gfc_get_int_expr (k
, &e
->where
, len
- count
);
4170 return range_check (result
, "LEN_TRIM");
4174 gfc_simplify_lgamma (gfc_expr
*x
)
4179 if (x
->expr_type
!= EXPR_CONSTANT
)
4182 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4183 mpfr_lgamma (result
->value
.real
, &sg
, x
->value
.real
, GFC_RND_MODE
);
4185 return range_check (result
, "LGAMMA");
4190 gfc_simplify_lge (gfc_expr
*a
, gfc_expr
*b
)
4192 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4195 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4196 gfc_compare_string (a
, b
) >= 0);
4201 gfc_simplify_lgt (gfc_expr
*a
, gfc_expr
*b
)
4203 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4206 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4207 gfc_compare_string (a
, b
) > 0);
4212 gfc_simplify_lle (gfc_expr
*a
, gfc_expr
*b
)
4214 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4217 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4218 gfc_compare_string (a
, b
) <= 0);
4223 gfc_simplify_llt (gfc_expr
*a
, gfc_expr
*b
)
4225 if (a
->expr_type
!= EXPR_CONSTANT
|| b
->expr_type
!= EXPR_CONSTANT
)
4228 return gfc_get_logical_expr (gfc_default_logical_kind
, &a
->where
,
4229 gfc_compare_string (a
, b
) < 0);
4234 gfc_simplify_log (gfc_expr
*x
)
4238 if (x
->expr_type
!= EXPR_CONSTANT
)
4241 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4246 if (mpfr_sgn (x
->value
.real
) <= 0)
4248 gfc_error ("Argument of LOG at %L cannot be less than or equal "
4249 "to zero", &x
->where
);
4250 gfc_free_expr (result
);
4251 return &gfc_bad_expr
;
4254 mpfr_log (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4258 if (mpfr_zero_p (mpc_realref (x
->value
.complex))
4259 && mpfr_zero_p (mpc_imagref (x
->value
.complex)))
4261 gfc_error ("Complex argument of LOG at %L cannot be zero",
4263 gfc_free_expr (result
);
4264 return &gfc_bad_expr
;
4267 gfc_set_model_kind (x
->ts
.kind
);
4268 mpc_log (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
4272 gfc_internal_error ("gfc_simplify_log: bad type");
4275 return range_check (result
, "LOG");
4280 gfc_simplify_log10 (gfc_expr
*x
)
4284 if (x
->expr_type
!= EXPR_CONSTANT
)
4287 if (mpfr_sgn (x
->value
.real
) <= 0)
4289 gfc_error ("Argument of LOG10 at %L cannot be less than or equal "
4290 "to zero", &x
->where
);
4291 return &gfc_bad_expr
;
4294 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
4295 mpfr_log10 (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
4297 return range_check (result
, "LOG10");
4302 gfc_simplify_logical (gfc_expr
*e
, gfc_expr
*k
)
4306 kind
= get_kind (BT_LOGICAL
, k
, "LOGICAL", gfc_default_logical_kind
);
4308 return &gfc_bad_expr
;
4310 if (e
->expr_type
!= EXPR_CONSTANT
)
4313 return gfc_get_logical_expr (kind
, &e
->where
, e
->value
.logical
);
4318 gfc_simplify_matmul (gfc_expr
*matrix_a
, gfc_expr
*matrix_b
)
4321 int row
, result_rows
, col
, result_columns
;
4322 int stride_a
, offset_a
, stride_b
, offset_b
;
4324 if (!is_constant_array_expr (matrix_a
)
4325 || !is_constant_array_expr (matrix_b
))
4328 gcc_assert (gfc_compare_types (&matrix_a
->ts
, &matrix_b
->ts
));
4329 result
= gfc_get_array_expr (matrix_a
->ts
.type
,
4333 if (matrix_a
->rank
== 1 && matrix_b
->rank
== 2)
4336 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
4338 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
4341 result
->shape
= gfc_get_shape (result
->rank
);
4342 mpz_init_set_si (result
->shape
[0], result_columns
);
4344 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 1)
4346 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
4348 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
4352 result
->shape
= gfc_get_shape (result
->rank
);
4353 mpz_init_set_si (result
->shape
[0], result_rows
);
4355 else if (matrix_a
->rank
== 2 && matrix_b
->rank
== 2)
4357 result_rows
= mpz_get_si (matrix_a
->shape
[0]);
4358 result_columns
= mpz_get_si (matrix_b
->shape
[1]);
4359 stride_a
= mpz_get_si (matrix_a
->shape
[0]);
4360 stride_b
= mpz_get_si (matrix_b
->shape
[0]);
4363 result
->shape
= gfc_get_shape (result
->rank
);
4364 mpz_init_set_si (result
->shape
[0], result_rows
);
4365 mpz_init_set_si (result
->shape
[1], result_columns
);
4370 offset_a
= offset_b
= 0;
4371 for (col
= 0; col
< result_columns
; ++col
)
4375 for (row
= 0; row
< result_rows
; ++row
)
4377 gfc_expr
*e
= compute_dot_product (matrix_a
, stride_a
, offset_a
,
4378 matrix_b
, 1, offset_b
, false);
4379 gfc_constructor_append_expr (&result
->value
.constructor
,
4385 offset_b
+= stride_b
;
4393 gfc_simplify_maskr (gfc_expr
*i
, gfc_expr
*kind_arg
)
4398 if (i
->expr_type
!= EXPR_CONSTANT
)
4401 kind
= get_kind (BT_INTEGER
, kind_arg
, "MASKR", gfc_default_integer_kind
);
4403 return &gfc_bad_expr
;
4404 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
4406 bool fail
= gfc_extract_int (i
, &arg
);
4409 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &i
->where
);
4411 /* MASKR(n) = 2^n - 1 */
4412 mpz_set_ui (result
->value
.integer
, 1);
4413 mpz_mul_2exp (result
->value
.integer
, result
->value
.integer
, arg
);
4414 mpz_sub_ui (result
->value
.integer
, result
->value
.integer
, 1);
4416 gfc_convert_mpz_to_signed (result
->value
.integer
, gfc_integer_kinds
[k
].bit_size
);
4423 gfc_simplify_maskl (gfc_expr
*i
, gfc_expr
*kind_arg
)
4429 if (i
->expr_type
!= EXPR_CONSTANT
)
4432 kind
= get_kind (BT_INTEGER
, kind_arg
, "MASKL", gfc_default_integer_kind
);
4434 return &gfc_bad_expr
;
4435 k
= gfc_validate_kind (BT_INTEGER
, kind
, false);
4437 bool fail
= gfc_extract_int (i
, &arg
);
4440 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &i
->where
);
4442 /* MASKL(n) = 2^bit_size - 2^(bit_size - n) */
4443 mpz_init_set_ui (z
, 1);
4444 mpz_mul_2exp (z
, z
, gfc_integer_kinds
[k
].bit_size
);
4445 mpz_set_ui (result
->value
.integer
, 1);
4446 mpz_mul_2exp (result
->value
.integer
, result
->value
.integer
,
4447 gfc_integer_kinds
[k
].bit_size
- arg
);
4448 mpz_sub (result
->value
.integer
, z
, result
->value
.integer
);
4451 gfc_convert_mpz_to_signed (result
->value
.integer
, gfc_integer_kinds
[k
].bit_size
);
4458 gfc_simplify_merge (gfc_expr
*tsource
, gfc_expr
*fsource
, gfc_expr
*mask
)
4461 gfc_constructor
*tsource_ctor
, *fsource_ctor
, *mask_ctor
;
4463 if (mask
->expr_type
== EXPR_CONSTANT
)
4464 return gfc_get_parentheses (gfc_copy_expr (mask
->value
.logical
4465 ? tsource
: fsource
));
4467 if (!mask
->rank
|| !is_constant_array_expr (mask
)
4468 || !is_constant_array_expr (tsource
) || !is_constant_array_expr (fsource
))
4471 result
= gfc_get_array_expr (tsource
->ts
.type
, tsource
->ts
.kind
,
4473 if (tsource
->ts
.type
== BT_DERIVED
)
4474 result
->ts
.u
.derived
= tsource
->ts
.u
.derived
;
4475 else if (tsource
->ts
.type
== BT_CHARACTER
)
4476 result
->ts
.u
.cl
= tsource
->ts
.u
.cl
;
4478 tsource_ctor
= gfc_constructor_first (tsource
->value
.constructor
);
4479 fsource_ctor
= gfc_constructor_first (fsource
->value
.constructor
);
4480 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
4484 if (mask_ctor
->expr
->value
.logical
)
4485 gfc_constructor_append_expr (&result
->value
.constructor
,
4486 gfc_copy_expr (tsource_ctor
->expr
),
4489 gfc_constructor_append_expr (&result
->value
.constructor
,
4490 gfc_copy_expr (fsource_ctor
->expr
),
4492 tsource_ctor
= gfc_constructor_next (tsource_ctor
);
4493 fsource_ctor
= gfc_constructor_next (fsource_ctor
);
4494 mask_ctor
= gfc_constructor_next (mask_ctor
);
4497 result
->shape
= gfc_get_shape (1);
4498 gfc_array_size (result
, &result
->shape
[0]);
4505 gfc_simplify_merge_bits (gfc_expr
*i
, gfc_expr
*j
, gfc_expr
*mask_expr
)
4507 mpz_t arg1
, arg2
, mask
;
4510 if (i
->expr_type
!= EXPR_CONSTANT
|| j
->expr_type
!= EXPR_CONSTANT
4511 || mask_expr
->expr_type
!= EXPR_CONSTANT
)
4514 result
= gfc_get_constant_expr (BT_INTEGER
, i
->ts
.kind
, &i
->where
);
4516 /* Convert all argument to unsigned. */
4517 mpz_init_set (arg1
, i
->value
.integer
);
4518 mpz_init_set (arg2
, j
->value
.integer
);
4519 mpz_init_set (mask
, mask_expr
->value
.integer
);
4521 /* MERGE_BITS(I,J,MASK) = IOR (IAND (I, MASK), IAND (J, NOT (MASK))). */
4522 mpz_and (arg1
, arg1
, mask
);
4523 mpz_com (mask
, mask
);
4524 mpz_and (arg2
, arg2
, mask
);
4525 mpz_ior (result
->value
.integer
, arg1
, arg2
);
4535 /* Selects between current value and extremum for simplify_min_max
4536 and simplify_minval_maxval. */
4538 min_max_choose (gfc_expr
*arg
, gfc_expr
*extremum
, int sign
)
4542 switch (arg
->ts
.type
)
4545 ret
= mpz_cmp (arg
->value
.integer
,
4546 extremum
->value
.integer
) * sign
;
4548 mpz_set (extremum
->value
.integer
, arg
->value
.integer
);
4552 if (mpfr_nan_p (extremum
->value
.real
))
4555 mpfr_set (extremum
->value
.real
, arg
->value
.real
, GFC_RND_MODE
);
4557 else if (mpfr_nan_p (arg
->value
.real
))
4561 ret
= mpfr_cmp (arg
->value
.real
, extremum
->value
.real
) * sign
;
4563 mpfr_set (extremum
->value
.real
, arg
->value
.real
, GFC_RND_MODE
);
4568 #define LENGTH(x) ((x)->value.character.length)
4569 #define STRING(x) ((x)->value.character.string)
4570 if (LENGTH (extremum
) < LENGTH(arg
))
4572 gfc_char_t
*tmp
= STRING(extremum
);
4574 STRING(extremum
) = gfc_get_wide_string (LENGTH(arg
) + 1);
4575 memcpy (STRING(extremum
), tmp
,
4576 LENGTH(extremum
) * sizeof (gfc_char_t
));
4577 gfc_wide_memset (&STRING(extremum
)[LENGTH(extremum
)], ' ',
4578 LENGTH(arg
) - LENGTH(extremum
));
4579 STRING(extremum
)[LENGTH(arg
)] = '\0'; /* For debugger */
4580 LENGTH(extremum
) = LENGTH(arg
);
4583 ret
= gfc_compare_string (arg
, extremum
) * sign
;
4586 free (STRING(extremum
));
4587 STRING(extremum
) = gfc_get_wide_string (LENGTH(extremum
) + 1);
4588 memcpy (STRING(extremum
), STRING(arg
),
4589 LENGTH(arg
) * sizeof (gfc_char_t
));
4590 gfc_wide_memset (&STRING(extremum
)[LENGTH(arg
)], ' ',
4591 LENGTH(extremum
) - LENGTH(arg
));
4592 STRING(extremum
)[LENGTH(extremum
)] = '\0'; /* For debugger */
4599 gfc_internal_error ("simplify_min_max(): Bad type in arglist");
4605 /* This function is special since MAX() can take any number of
4606 arguments. The simplified expression is a rewritten version of the
4607 argument list containing at most one constant element. Other
4608 constant elements are deleted. Because the argument list has
4609 already been checked, this function always succeeds. sign is 1 for
4610 MAX(), -1 for MIN(). */
4613 simplify_min_max (gfc_expr
*expr
, int sign
)
4615 gfc_actual_arglist
*arg
, *last
, *extremum
;
4616 gfc_intrinsic_sym
* specific
;
4620 specific
= expr
->value
.function
.isym
;
4622 arg
= expr
->value
.function
.actual
;
4624 for (; arg
; last
= arg
, arg
= arg
->next
)
4626 if (arg
->expr
->expr_type
!= EXPR_CONSTANT
)
4629 if (extremum
== NULL
)
4635 min_max_choose (arg
->expr
, extremum
->expr
, sign
);
4637 /* Delete the extra constant argument. */
4638 last
->next
= arg
->next
;
4641 gfc_free_actual_arglist (arg
);
4645 /* If there is one value left, replace the function call with the
4647 if (expr
->value
.function
.actual
->next
!= NULL
)
4650 /* Convert to the correct type and kind. */
4651 if (expr
->ts
.type
!= BT_UNKNOWN
)
4652 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
4653 expr
->ts
.type
, expr
->ts
.kind
);
4655 if (specific
->ts
.type
!= BT_UNKNOWN
)
4656 return gfc_convert_constant (expr
->value
.function
.actual
->expr
,
4657 specific
->ts
.type
, specific
->ts
.kind
);
4659 return gfc_copy_expr (expr
->value
.function
.actual
->expr
);
4664 gfc_simplify_min (gfc_expr
*e
)
4666 return simplify_min_max (e
, -1);
4671 gfc_simplify_max (gfc_expr
*e
)
4673 return simplify_min_max (e
, 1);
4676 /* Helper function for gfc_simplify_minval. */
4679 gfc_min (gfc_expr
*op1
, gfc_expr
*op2
)
4681 min_max_choose (op1
, op2
, -1);
4682 gfc_free_expr (op1
);
4686 /* Simplify minval for constant arrays. */
4689 gfc_simplify_minval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
4691 return simplify_transformation (array
, dim
, mask
, INT_MAX
, gfc_min
);
4694 /* Helper function for gfc_simplify_maxval. */
4697 gfc_max (gfc_expr
*op1
, gfc_expr
*op2
)
4699 min_max_choose (op1
, op2
, 1);
4700 gfc_free_expr (op1
);
4705 /* Simplify maxval for constant arrays. */
4708 gfc_simplify_maxval (gfc_expr
*array
, gfc_expr
* dim
, gfc_expr
*mask
)
4710 return simplify_transformation (array
, dim
, mask
, INT_MIN
, gfc_max
);
4714 /* Transform minloc or maxloc of an array, according to MASK,
4715 to the scalar result. This code is mostly identical to
4716 simplify_transformation_to_scalar. */
4719 simplify_minmaxloc_to_scalar (gfc_expr
*result
, gfc_expr
*array
, gfc_expr
*mask
,
4720 gfc_expr
*extremum
, int sign
)
4723 gfc_constructor
*array_ctor
, *mask_ctor
;
4726 mpz_set_si (result
->value
.integer
, 0);
4729 /* Shortcut for constant .FALSE. MASK. */
4731 && mask
->expr_type
== EXPR_CONSTANT
4732 && !mask
->value
.logical
)
4735 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
4736 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
4737 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
4741 mpz_init_set_si (count
, 0);
4744 mpz_add_ui (count
, count
, 1);
4745 a
= array_ctor
->expr
;
4746 array_ctor
= gfc_constructor_next (array_ctor
);
4747 /* A constant MASK equals .TRUE. here and can be ignored. */
4750 m
= mask_ctor
->expr
;
4751 mask_ctor
= gfc_constructor_next (mask_ctor
);
4752 if (!m
->value
.logical
)
4755 if (min_max_choose (a
, extremum
, sign
) > 0)
4756 mpz_set (result
->value
.integer
, count
);
4759 gfc_free_expr (extremum
);
4763 /* Simplify minloc / maxloc in the absence of a dim argument. */
4766 simplify_minmaxloc_nodim (gfc_expr
*result
, gfc_expr
*extremum
,
4767 gfc_expr
*array
, gfc_expr
*mask
, int sign
)
4769 ssize_t res
[GFC_MAX_DIMENSIONS
];
4771 gfc_constructor
*result_ctor
, *array_ctor
, *mask_ctor
;
4772 ssize_t count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
4773 sstride
[GFC_MAX_DIMENSIONS
];
4778 for (i
= 0; i
<array
->rank
; i
++)
4781 /* Shortcut for constant .FALSE. MASK. */
4783 && mask
->expr_type
== EXPR_CONSTANT
4784 && !mask
->value
.logical
)
4787 for (i
= 0; i
< array
->rank
; i
++)
4790 sstride
[i
] = (i
== 0) ? 1 : sstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
4791 extent
[i
] = mpz_get_si (array
->shape
[i
]);
4796 continue_loop
= true;
4797 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
4798 if (mask
&& mask
->rank
> 0)
4799 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
4803 /* Loop over the array elements (and mask), keeping track of
4804 the indices to return. */
4805 while (continue_loop
)
4809 a
= array_ctor
->expr
;
4812 m
= mask_ctor
->expr
;
4813 ma
= m
->value
.logical
;
4814 mask_ctor
= gfc_constructor_next (mask_ctor
);
4819 if (ma
&& min_max_choose (a
, extremum
, sign
) > 0)
4821 for (i
= 0; i
<array
->rank
; i
++)
4824 array_ctor
= gfc_constructor_next (array_ctor
);
4826 } while (count
[0] != extent
[0]);
4830 /* When we get to the end of a dimension, reset it and increment
4831 the next dimension. */
4834 if (n
>= array
->rank
)
4836 continue_loop
= false;
4841 } while (count
[n
] == extent
[n
]);
4845 gfc_free_expr (extremum
);
4846 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
4847 for (i
= 0; i
<array
->rank
; i
++)
4850 r_expr
= result_ctor
->expr
;
4851 mpz_set_si (r_expr
->value
.integer
, res
[i
] + 1);
4852 result_ctor
= gfc_constructor_next (result_ctor
);
4857 /* Helper function for gfc_simplify_minmaxloc - build an array
4858 expression with n elements. */
4861 new_array (bt type
, int kind
, int n
, locus
*where
)
4866 result
= gfc_get_array_expr (type
, kind
, where
);
4868 result
->shape
= gfc_get_shape(1);
4869 mpz_init_set_si (result
->shape
[0], n
);
4870 for (i
= 0; i
< n
; i
++)
4872 gfc_constructor_append_expr (&result
->value
.constructor
,
4873 gfc_get_constant_expr (type
, kind
, where
),
4880 /* Simplify minloc and maxloc. This code is mostly identical to
4881 simplify_transformation_to_array. */
4884 simplify_minmaxloc_to_array (gfc_expr
*result
, gfc_expr
*array
,
4885 gfc_expr
*dim
, gfc_expr
*mask
,
4886 gfc_expr
*extremum
, int sign
)
4889 int done
, i
, n
, arraysize
, resultsize
, dim_index
, dim_extent
, dim_stride
;
4890 gfc_expr
**arrayvec
, **resultvec
, **base
, **src
, **dest
;
4891 gfc_constructor
*array_ctor
, *mask_ctor
, *result_ctor
;
4893 int count
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
],
4894 sstride
[GFC_MAX_DIMENSIONS
], dstride
[GFC_MAX_DIMENSIONS
],
4895 tmpstride
[GFC_MAX_DIMENSIONS
];
4897 /* Shortcut for constant .FALSE. MASK. */
4899 && mask
->expr_type
== EXPR_CONSTANT
4900 && !mask
->value
.logical
)
4903 /* Build an indexed table for array element expressions to minimize
4904 linked-list traversal. Masked elements are set to NULL. */
4905 gfc_array_size (array
, &size
);
4906 arraysize
= mpz_get_ui (size
);
4909 arrayvec
= XCNEWVEC (gfc_expr
*, arraysize
);
4911 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
4913 if (mask
&& mask
->expr_type
== EXPR_ARRAY
)
4914 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
4916 for (i
= 0; i
< arraysize
; ++i
)
4918 arrayvec
[i
] = array_ctor
->expr
;
4919 array_ctor
= gfc_constructor_next (array_ctor
);
4923 if (!mask_ctor
->expr
->value
.logical
)
4926 mask_ctor
= gfc_constructor_next (mask_ctor
);
4930 /* Same for the result expression. */
4931 gfc_array_size (result
, &size
);
4932 resultsize
= mpz_get_ui (size
);
4935 resultvec
= XCNEWVEC (gfc_expr
*, resultsize
);
4936 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
4937 for (i
= 0; i
< resultsize
; ++i
)
4939 resultvec
[i
] = result_ctor
->expr
;
4940 result_ctor
= gfc_constructor_next (result_ctor
);
4943 gfc_extract_int (dim
, &dim_index
);
4944 dim_index
-= 1; /* zero-base index */
4948 for (i
= 0, n
= 0; i
< array
->rank
; ++i
)
4951 tmpstride
[i
] = (i
== 0) ? 1 : tmpstride
[i
-1] * mpz_get_si (array
->shape
[i
-1]);
4954 dim_extent
= mpz_get_si (array
->shape
[i
]);
4955 dim_stride
= tmpstride
[i
];
4959 extent
[n
] = mpz_get_si (array
->shape
[i
]);
4960 sstride
[n
] = tmpstride
[i
];
4961 dstride
[n
] = (n
== 0) ? 1 : dstride
[n
-1] * extent
[n
-1];
4971 ex
= gfc_copy_expr (extremum
);
4972 for (src
= base
, n
= 0; n
< dim_extent
; src
+= dim_stride
, ++n
)
4974 if (*src
&& min_max_choose (*src
, ex
, sign
) > 0)
4975 mpz_set_si ((*dest
)->value
.integer
, n
+ 1);
4984 while (!done
&& count
[n
] == extent
[n
])
4987 base
-= sstride
[n
] * extent
[n
];
4988 dest
-= dstride
[n
] * extent
[n
];
4991 if (n
< result
->rank
)
4993 /* If the nested loop is unrolled GFC_MAX_DIMENSIONS
4994 times, we'd warn for the last iteration, because the
4995 array index will have already been incremented to the
4996 array sizes, and we can't tell that this must make
4997 the test against result->rank false, because ranks
4998 must not exceed GFC_MAX_DIMENSIONS. */
4999 GCC_DIAGNOSTIC_PUSH_IGNORED (-Warray
-bounds
)
5010 /* Place updated expression in result constructor. */
5011 result_ctor
= gfc_constructor_first (result
->value
.constructor
);
5012 for (i
= 0; i
< resultsize
; ++i
)
5014 result_ctor
->expr
= resultvec
[i
];
5015 result_ctor
= gfc_constructor_next (result_ctor
);
5024 /* Simplify minloc and maxloc for constant arrays. */
5027 gfc_simplify_minmaxloc (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
,
5028 gfc_expr
*kind
, int sign
)
5035 if (!is_constant_array_expr (array
)
5036 || !gfc_is_constant_expr (dim
))
5040 && !is_constant_array_expr (mask
)
5041 && mask
->expr_type
!= EXPR_CONSTANT
)
5046 if (gfc_extract_int (kind
, &ikind
, -1))
5050 ikind
= gfc_default_integer_kind
;
5059 extremum
= gfc_get_constant_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
5060 init_result_expr (extremum
, init_val
, array
);
5064 result
= transformational_result (array
, dim
, BT_INTEGER
,
5065 ikind
, &array
->where
);
5066 init_result_expr (result
, 0, array
);
5068 if (array
->rank
== 1)
5069 return simplify_minmaxloc_to_scalar (result
, array
, mask
, extremum
, sign
);
5071 return simplify_minmaxloc_to_array (result
, array
, dim
, mask
, extremum
, sign
);
5075 result
= new_array (BT_INTEGER
, ikind
, array
->rank
, &array
->where
);
5076 return simplify_minmaxloc_nodim (result
, extremum
, array
, mask
, sign
);
5081 gfc_simplify_minloc (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
, gfc_expr
*kind
)
5083 return gfc_simplify_minmaxloc (array
, dim
, mask
, kind
, -1);
5087 gfc_simplify_maxloc (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
, gfc_expr
*kind
)
5089 return gfc_simplify_minmaxloc (array
, dim
, mask
, kind
, 1);
5093 gfc_simplify_maxexponent (gfc_expr
*x
)
5095 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
5096 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
5097 gfc_real_kinds
[i
].max_exponent
);
5102 gfc_simplify_minexponent (gfc_expr
*x
)
5104 int i
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
5105 return gfc_get_int_expr (gfc_default_integer_kind
, &x
->where
,
5106 gfc_real_kinds
[i
].min_exponent
);
5111 gfc_simplify_mod (gfc_expr
*a
, gfc_expr
*p
)
5116 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
5119 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
5120 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
5125 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
5127 /* Result is processor-dependent. */
5128 gfc_error ("Second argument MOD at %L is zero", &a
->where
);
5129 gfc_free_expr (result
);
5130 return &gfc_bad_expr
;
5132 mpz_tdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
5136 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
5138 /* Result is processor-dependent. */
5139 gfc_error ("Second argument of MOD at %L is zero", &p
->where
);
5140 gfc_free_expr (result
);
5141 return &gfc_bad_expr
;
5144 gfc_set_model_kind (kind
);
5145 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
5150 gfc_internal_error ("gfc_simplify_mod(): Bad arguments");
5153 return range_check (result
, "MOD");
5158 gfc_simplify_modulo (gfc_expr
*a
, gfc_expr
*p
)
5163 if (a
->expr_type
!= EXPR_CONSTANT
|| p
->expr_type
!= EXPR_CONSTANT
)
5166 kind
= a
->ts
.kind
> p
->ts
.kind
? a
->ts
.kind
: p
->ts
.kind
;
5167 result
= gfc_get_constant_expr (a
->ts
.type
, kind
, &a
->where
);
5172 if (mpz_cmp_ui (p
->value
.integer
, 0) == 0)
5174 /* Result is processor-dependent. This processor just opts
5175 to not handle it at all. */
5176 gfc_error ("Second argument of MODULO at %L is zero", &a
->where
);
5177 gfc_free_expr (result
);
5178 return &gfc_bad_expr
;
5180 mpz_fdiv_r (result
->value
.integer
, a
->value
.integer
, p
->value
.integer
);
5185 if (mpfr_cmp_ui (p
->value
.real
, 0) == 0)
5187 /* Result is processor-dependent. */
5188 gfc_error ("Second argument of MODULO at %L is zero", &p
->where
);
5189 gfc_free_expr (result
);
5190 return &gfc_bad_expr
;
5193 gfc_set_model_kind (kind
);
5194 mpfr_fmod (result
->value
.real
, a
->value
.real
, p
->value
.real
,
5196 if (mpfr_cmp_ui (result
->value
.real
, 0) != 0)
5198 if (mpfr_signbit (a
->value
.real
) != mpfr_signbit (p
->value
.real
))
5199 mpfr_add (result
->value
.real
, result
->value
.real
, p
->value
.real
,
5203 mpfr_copysign (result
->value
.real
, result
->value
.real
,
5204 p
->value
.real
, GFC_RND_MODE
);
5208 gfc_internal_error ("gfc_simplify_modulo(): Bad arguments");
5211 return range_check (result
, "MODULO");
5216 gfc_simplify_nearest (gfc_expr
*x
, gfc_expr
*s
)
5219 mp_exp_t emin
, emax
;
5222 if (x
->expr_type
!= EXPR_CONSTANT
|| s
->expr_type
!= EXPR_CONSTANT
)
5225 result
= gfc_copy_expr (x
);
5227 /* Save current values of emin and emax. */
5228 emin
= mpfr_get_emin ();
5229 emax
= mpfr_get_emax ();
5231 /* Set emin and emax for the current model number. */
5232 kind
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, 0);
5233 mpfr_set_emin ((mp_exp_t
) gfc_real_kinds
[kind
].min_exponent
-
5234 mpfr_get_prec(result
->value
.real
) + 1);
5235 mpfr_set_emax ((mp_exp_t
) gfc_real_kinds
[kind
].max_exponent
- 1);
5236 mpfr_check_range (result
->value
.real
, 0, GMP_RNDU
);
5238 if (mpfr_sgn (s
->value
.real
) > 0)
5240 mpfr_nextabove (result
->value
.real
);
5241 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDU
);
5245 mpfr_nextbelow (result
->value
.real
);
5246 mpfr_subnormalize (result
->value
.real
, 0, GMP_RNDD
);
5249 mpfr_set_emin (emin
);
5250 mpfr_set_emax (emax
);
5252 /* Only NaN can occur. Do not use range check as it gives an
5253 error for denormal numbers. */
5254 if (mpfr_nan_p (result
->value
.real
) && flag_range_check
)
5256 gfc_error ("Result of NEAREST is NaN at %L", &result
->where
);
5257 gfc_free_expr (result
);
5258 return &gfc_bad_expr
;
5266 simplify_nint (const char *name
, gfc_expr
*e
, gfc_expr
*k
)
5268 gfc_expr
*itrunc
, *result
;
5271 kind
= get_kind (BT_INTEGER
, k
, name
, gfc_default_integer_kind
);
5273 return &gfc_bad_expr
;
5275 if (e
->expr_type
!= EXPR_CONSTANT
)
5278 itrunc
= gfc_copy_expr (e
);
5279 mpfr_round (itrunc
->value
.real
, e
->value
.real
);
5281 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &e
->where
);
5282 gfc_mpfr_to_mpz (result
->value
.integer
, itrunc
->value
.real
, &e
->where
);
5284 gfc_free_expr (itrunc
);
5286 return range_check (result
, name
);
5291 gfc_simplify_new_line (gfc_expr
*e
)
5295 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 1);
5296 result
->value
.character
.string
[0] = '\n';
5303 gfc_simplify_nint (gfc_expr
*e
, gfc_expr
*k
)
5305 return simplify_nint ("NINT", e
, k
);
5310 gfc_simplify_idnint (gfc_expr
*e
)
5312 return simplify_nint ("IDNINT", e
, NULL
);
5317 add_squared (gfc_expr
*result
, gfc_expr
*e
)
5321 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
5322 gcc_assert (result
->ts
.type
== BT_REAL
5323 && result
->expr_type
== EXPR_CONSTANT
);
5325 gfc_set_model_kind (result
->ts
.kind
);
5327 mpfr_pow_ui (tmp
, e
->value
.real
, 2, GFC_RND_MODE
);
5328 mpfr_add (result
->value
.real
, result
->value
.real
, tmp
,
5337 do_sqrt (gfc_expr
*result
, gfc_expr
*e
)
5339 gcc_assert (e
->ts
.type
== BT_REAL
&& e
->expr_type
== EXPR_CONSTANT
);
5340 gcc_assert (result
->ts
.type
== BT_REAL
5341 && result
->expr_type
== EXPR_CONSTANT
);
5343 mpfr_set (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
5344 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
5350 gfc_simplify_norm2 (gfc_expr
*e
, gfc_expr
*dim
)
5354 if (!is_constant_array_expr (e
)
5355 || (dim
!= NULL
&& !gfc_is_constant_expr (dim
)))
5358 result
= transformational_result (e
, dim
, e
->ts
.type
, e
->ts
.kind
, &e
->where
);
5359 init_result_expr (result
, 0, NULL
);
5361 if (!dim
|| e
->rank
== 1)
5363 result
= simplify_transformation_to_scalar (result
, e
, NULL
,
5365 mpfr_sqrt (result
->value
.real
, result
->value
.real
, GFC_RND_MODE
);
5368 result
= simplify_transformation_to_array (result
, e
, dim
, NULL
,
5369 add_squared
, &do_sqrt
);
5376 gfc_simplify_not (gfc_expr
*e
)
5380 if (e
->expr_type
!= EXPR_CONSTANT
)
5383 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
5384 mpz_com (result
->value
.integer
, e
->value
.integer
);
5386 return range_check (result
, "NOT");
5391 gfc_simplify_null (gfc_expr
*mold
)
5397 result
= gfc_copy_expr (mold
);
5398 result
->expr_type
= EXPR_NULL
;
5401 result
= gfc_get_null_expr (NULL
);
5408 gfc_simplify_num_images (gfc_expr
*distance ATTRIBUTE_UNUSED
, gfc_expr
*failed
)
5412 if (flag_coarray
== GFC_FCOARRAY_NONE
)
5414 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
5415 return &gfc_bad_expr
;
5418 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
)
5421 if (failed
&& failed
->expr_type
!= EXPR_CONSTANT
)
5424 /* FIXME: gfc_current_locus is wrong. */
5425 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
5426 &gfc_current_locus
);
5428 if (failed
&& failed
->value
.logical
!= 0)
5429 mpz_set_si (result
->value
.integer
, 0);
5431 mpz_set_si (result
->value
.integer
, 1);
5438 gfc_simplify_or (gfc_expr
*x
, gfc_expr
*y
)
5443 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
5446 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
5451 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
5452 mpz_ior (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
5453 return range_check (result
, "OR");
5456 return gfc_get_logical_expr (kind
, &x
->where
,
5457 x
->value
.logical
|| y
->value
.logical
);
5465 gfc_simplify_pack (gfc_expr
*array
, gfc_expr
*mask
, gfc_expr
*vector
)
5468 gfc_constructor
*array_ctor
, *mask_ctor
, *vector_ctor
;
5470 if (!is_constant_array_expr (array
)
5471 || !is_constant_array_expr (vector
)
5472 || (!gfc_is_constant_expr (mask
)
5473 && !is_constant_array_expr (mask
)))
5476 result
= gfc_get_array_expr (array
->ts
.type
, array
->ts
.kind
, &array
->where
);
5477 if (array
->ts
.type
== BT_DERIVED
)
5478 result
->ts
.u
.derived
= array
->ts
.u
.derived
;
5480 array_ctor
= gfc_constructor_first (array
->value
.constructor
);
5481 vector_ctor
= vector
5482 ? gfc_constructor_first (vector
->value
.constructor
)
5485 if (mask
->expr_type
== EXPR_CONSTANT
5486 && mask
->value
.logical
)
5488 /* Copy all elements of ARRAY to RESULT. */
5491 gfc_constructor_append_expr (&result
->value
.constructor
,
5492 gfc_copy_expr (array_ctor
->expr
),
5495 array_ctor
= gfc_constructor_next (array_ctor
);
5496 vector_ctor
= gfc_constructor_next (vector_ctor
);
5499 else if (mask
->expr_type
== EXPR_ARRAY
)
5501 /* Copy only those elements of ARRAY to RESULT whose
5502 MASK equals .TRUE.. */
5503 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
5506 if (mask_ctor
->expr
->value
.logical
)
5508 gfc_constructor_append_expr (&result
->value
.constructor
,
5509 gfc_copy_expr (array_ctor
->expr
),
5511 vector_ctor
= gfc_constructor_next (vector_ctor
);
5514 array_ctor
= gfc_constructor_next (array_ctor
);
5515 mask_ctor
= gfc_constructor_next (mask_ctor
);
5519 /* Append any left-over elements from VECTOR to RESULT. */
5522 gfc_constructor_append_expr (&result
->value
.constructor
,
5523 gfc_copy_expr (vector_ctor
->expr
),
5525 vector_ctor
= gfc_constructor_next (vector_ctor
);
5528 result
->shape
= gfc_get_shape (1);
5529 gfc_array_size (result
, &result
->shape
[0]);
5531 if (array
->ts
.type
== BT_CHARACTER
)
5532 result
->ts
.u
.cl
= array
->ts
.u
.cl
;
5539 do_xor (gfc_expr
*result
, gfc_expr
*e
)
5541 gcc_assert (e
->ts
.type
== BT_LOGICAL
&& e
->expr_type
== EXPR_CONSTANT
);
5542 gcc_assert (result
->ts
.type
== BT_LOGICAL
5543 && result
->expr_type
== EXPR_CONSTANT
);
5545 result
->value
.logical
= result
->value
.logical
!= e
->value
.logical
;
5552 gfc_simplify_parity (gfc_expr
*e
, gfc_expr
*dim
)
5554 return simplify_transformation (e
, dim
, NULL
, 0, do_xor
);
5559 gfc_simplify_popcnt (gfc_expr
*e
)
5564 if (e
->expr_type
!= EXPR_CONSTANT
)
5567 k
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5569 /* Convert argument to unsigned, then count the '1' bits. */
5570 mpz_init_set (x
, e
->value
.integer
);
5571 convert_mpz_to_unsigned (x
, gfc_integer_kinds
[k
].bit_size
);
5572 res
= mpz_popcount (x
);
5575 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, res
);
5580 gfc_simplify_poppar (gfc_expr
*e
)
5585 if (e
->expr_type
!= EXPR_CONSTANT
)
5588 popcnt
= gfc_simplify_popcnt (e
);
5589 gcc_assert (popcnt
);
5591 bool fail
= gfc_extract_int (popcnt
, &i
);
5594 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
% 2);
5599 gfc_simplify_precision (gfc_expr
*e
)
5601 int i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5602 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
,
5603 gfc_real_kinds
[i
].precision
);
5608 gfc_simplify_product (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
5610 return simplify_transformation (array
, dim
, mask
, 1, gfc_multiply
);
5615 gfc_simplify_radix (gfc_expr
*e
)
5618 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5623 i
= gfc_integer_kinds
[i
].radix
;
5627 i
= gfc_real_kinds
[i
].radix
;
5634 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
5639 gfc_simplify_range (gfc_expr
*e
)
5642 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
5647 i
= gfc_integer_kinds
[i
].range
;
5652 i
= gfc_real_kinds
[i
].range
;
5659 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, i
);
5664 gfc_simplify_rank (gfc_expr
*e
)
5670 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, e
->rank
);
5675 gfc_simplify_real (gfc_expr
*e
, gfc_expr
*k
)
5677 gfc_expr
*result
= NULL
;
5680 if (e
->ts
.type
== BT_COMPLEX
)
5681 kind
= get_kind (BT_REAL
, k
, "REAL", e
->ts
.kind
);
5683 kind
= get_kind (BT_REAL
, k
, "REAL", gfc_default_real_kind
);
5686 return &gfc_bad_expr
;
5688 if (e
->expr_type
!= EXPR_CONSTANT
)
5691 if (convert_boz (e
, kind
) == &gfc_bad_expr
)
5692 return &gfc_bad_expr
;
5694 result
= gfc_convert_constant (e
, BT_REAL
, kind
);
5695 if (result
== &gfc_bad_expr
)
5696 return &gfc_bad_expr
;
5698 return range_check (result
, "REAL");
5703 gfc_simplify_realpart (gfc_expr
*e
)
5707 if (e
->expr_type
!= EXPR_CONSTANT
)
5710 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
5711 mpc_real (result
->value
.real
, e
->value
.complex, GFC_RND_MODE
);
5713 return range_check (result
, "REALPART");
5717 gfc_simplify_repeat (gfc_expr
*e
, gfc_expr
*n
)
5720 int i
, j
, len
, ncop
, nlen
;
5722 bool have_length
= false;
5724 /* If NCOPIES isn't a constant, there's nothing we can do. */
5725 if (n
->expr_type
!= EXPR_CONSTANT
)
5728 /* If NCOPIES is negative, it's an error. */
5729 if (mpz_sgn (n
->value
.integer
) < 0)
5731 gfc_error ("Argument NCOPIES of REPEAT intrinsic is negative at %L",
5733 return &gfc_bad_expr
;
5736 /* If we don't know the character length, we can do no more. */
5737 if (e
->ts
.u
.cl
&& e
->ts
.u
.cl
->length
5738 && e
->ts
.u
.cl
->length
->expr_type
== EXPR_CONSTANT
)
5740 len
= mpz_get_si (e
->ts
.u
.cl
->length
->value
.integer
);
5743 else if (e
->expr_type
== EXPR_CONSTANT
5744 && (e
->ts
.u
.cl
== NULL
|| e
->ts
.u
.cl
->length
== NULL
))
5746 len
= e
->value
.character
.length
;
5751 /* If the source length is 0, any value of NCOPIES is valid
5752 and everything behaves as if NCOPIES == 0. */
5755 mpz_set_ui (ncopies
, 0);
5757 mpz_set (ncopies
, n
->value
.integer
);
5759 /* Check that NCOPIES isn't too large. */
5765 /* Compute the maximum value allowed for NCOPIES: huge(cl) / len. */
5767 i
= gfc_validate_kind (BT_INTEGER
, gfc_charlen_int_kind
, false);
5771 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
,
5772 e
->ts
.u
.cl
->length
->value
.integer
);
5776 mpz_init_set_si (mlen
, len
);
5777 mpz_tdiv_q (max
, gfc_integer_kinds
[i
].huge
, mlen
);
5781 /* The check itself. */
5782 if (mpz_cmp (ncopies
, max
) > 0)
5785 mpz_clear (ncopies
);
5786 gfc_error ("Argument NCOPIES of REPEAT intrinsic is too large at %L",
5788 return &gfc_bad_expr
;
5793 mpz_clear (ncopies
);
5795 /* For further simplification, we need the character string to be
5797 if (e
->expr_type
!= EXPR_CONSTANT
)
5801 (e
->ts
.u
.cl
->length
&&
5802 mpz_sgn (e
->ts
.u
.cl
->length
->value
.integer
) != 0))
5804 bool fail
= gfc_extract_int (n
, &ncop
);
5811 return gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, 0);
5813 len
= e
->value
.character
.length
;
5816 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, nlen
);
5817 for (i
= 0; i
< ncop
; i
++)
5818 for (j
= 0; j
< len
; j
++)
5819 result
->value
.character
.string
[j
+i
*len
]= e
->value
.character
.string
[j
];
5821 result
->value
.character
.string
[nlen
] = '\0'; /* For debugger */
5826 /* This one is a bear, but mainly has to do with shuffling elements. */
5829 gfc_simplify_reshape (gfc_expr
*source
, gfc_expr
*shape_exp
,
5830 gfc_expr
*pad
, gfc_expr
*order_exp
)
5832 int order
[GFC_MAX_DIMENSIONS
], shape
[GFC_MAX_DIMENSIONS
];
5833 int i
, rank
, npad
, x
[GFC_MAX_DIMENSIONS
];
5837 gfc_expr
*e
, *result
;
5839 /* Check that argument expression types are OK. */
5840 if (!is_constant_array_expr (source
)
5841 || !is_constant_array_expr (shape_exp
)
5842 || !is_constant_array_expr (pad
)
5843 || !is_constant_array_expr (order_exp
))
5846 if (source
->shape
== NULL
)
5849 /* Proceed with simplification, unpacking the array. */
5856 e
= gfc_constructor_lookup_expr (shape_exp
->value
.constructor
, rank
);
5860 gfc_extract_int (e
, &shape
[rank
]);
5862 gcc_assert (rank
>= 0 && rank
< GFC_MAX_DIMENSIONS
);
5863 gcc_assert (shape
[rank
] >= 0);
5868 gcc_assert (rank
> 0);
5870 /* Now unpack the order array if present. */
5871 if (order_exp
== NULL
)
5873 for (i
= 0; i
< rank
; i
++)
5878 for (i
= 0; i
< rank
; i
++)
5881 for (i
= 0; i
< rank
; i
++)
5883 e
= gfc_constructor_lookup_expr (order_exp
->value
.constructor
, i
);
5886 gfc_extract_int (e
, &order
[i
]);
5888 gcc_assert (order
[i
] >= 1 && order
[i
] <= rank
);
5890 gcc_assert (x
[order
[i
]] == 0);
5895 /* Count the elements in the source and padding arrays. */
5900 gfc_array_size (pad
, &size
);
5901 npad
= mpz_get_ui (size
);
5905 gfc_array_size (source
, &size
);
5906 nsource
= mpz_get_ui (size
);
5909 /* If it weren't for that pesky permutation we could just loop
5910 through the source and round out any shortage with pad elements.
5911 But no, someone just had to have the compiler do something the
5912 user should be doing. */
5914 for (i
= 0; i
< rank
; i
++)
5917 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
5919 if (source
->ts
.type
== BT_DERIVED
)
5920 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
5921 result
->rank
= rank
;
5922 result
->shape
= gfc_get_shape (rank
);
5923 for (i
= 0; i
< rank
; i
++)
5924 mpz_init_set_ui (result
->shape
[i
], shape
[i
]);
5926 while (nsource
> 0 || npad
> 0)
5928 /* Figure out which element to extract. */
5929 mpz_set_ui (index
, 0);
5931 for (i
= rank
- 1; i
>= 0; i
--)
5933 mpz_add_ui (index
, index
, x
[order
[i
]]);
5935 mpz_mul_ui (index
, index
, shape
[order
[i
- 1]]);
5938 if (mpz_cmp_ui (index
, INT_MAX
) > 0)
5939 gfc_internal_error ("Reshaped array too large at %C");
5941 j
= mpz_get_ui (index
);
5944 e
= gfc_constructor_lookup_expr (source
->value
.constructor
, j
);
5954 e
= gfc_constructor_lookup_expr (pad
->value
.constructor
, j
);
5958 gfc_constructor_append_expr (&result
->value
.constructor
,
5959 gfc_copy_expr (e
), &e
->where
);
5961 /* Calculate the next element. */
5965 if (++x
[i
] < shape
[i
])
5981 gfc_simplify_rrspacing (gfc_expr
*x
)
5987 if (x
->expr_type
!= EXPR_CONSTANT
)
5990 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
5992 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
5994 /* RRSPACING(+/- 0.0) = 0.0 */
5995 if (mpfr_zero_p (x
->value
.real
))
5997 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
6001 /* RRSPACING(inf) = NaN */
6002 if (mpfr_inf_p (x
->value
.real
))
6004 mpfr_set_nan (result
->value
.real
);
6008 /* RRSPACING(NaN) = same NaN */
6009 if (mpfr_nan_p (x
->value
.real
))
6011 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6015 /* | x * 2**(-e) | * 2**p. */
6016 mpfr_abs (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6017 e
= - (long int) mpfr_get_exp (x
->value
.real
);
6018 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, e
, GFC_RND_MODE
);
6020 p
= (long int) gfc_real_kinds
[i
].digits
;
6021 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, p
, GFC_RND_MODE
);
6023 return range_check (result
, "RRSPACING");
6028 gfc_simplify_scale (gfc_expr
*x
, gfc_expr
*i
)
6030 int k
, neg_flag
, power
, exp_range
;
6031 mpfr_t scale
, radix
;
6034 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
6037 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
6039 if (mpfr_zero_p (x
->value
.real
))
6041 mpfr_set_ui (result
->value
.real
, 0, GFC_RND_MODE
);
6045 k
= gfc_validate_kind (BT_REAL
, x
->ts
.kind
, false);
6047 exp_range
= gfc_real_kinds
[k
].max_exponent
- gfc_real_kinds
[k
].min_exponent
;
6049 /* This check filters out values of i that would overflow an int. */
6050 if (mpz_cmp_si (i
->value
.integer
, exp_range
+ 2) > 0
6051 || mpz_cmp_si (i
->value
.integer
, -exp_range
- 2) < 0)
6053 gfc_error ("Result of SCALE overflows its kind at %L", &result
->where
);
6054 gfc_free_expr (result
);
6055 return &gfc_bad_expr
;
6058 /* Compute scale = radix ** power. */
6059 power
= mpz_get_si (i
->value
.integer
);
6069 gfc_set_model_kind (x
->ts
.kind
);
6072 mpfr_set_ui (radix
, gfc_real_kinds
[k
].radix
, GFC_RND_MODE
);
6073 mpfr_pow_ui (scale
, radix
, power
, GFC_RND_MODE
);
6076 mpfr_div (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
6078 mpfr_mul (result
->value
.real
, x
->value
.real
, scale
, GFC_RND_MODE
);
6080 mpfr_clears (scale
, radix
, NULL
);
6082 return range_check (result
, "SCALE");
6086 /* Variants of strspn and strcspn that operate on wide characters. */
6089 wide_strspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
6092 const gfc_char_t
*c
;
6096 for (c
= s2
; *c
; c
++)
6110 wide_strcspn (const gfc_char_t
*s1
, const gfc_char_t
*s2
)
6113 const gfc_char_t
*c
;
6117 for (c
= s2
; *c
; c
++)
6132 gfc_simplify_scan (gfc_expr
*e
, gfc_expr
*c
, gfc_expr
*b
, gfc_expr
*kind
)
6137 size_t indx
, len
, lenc
;
6138 int k
= get_kind (BT_INTEGER
, kind
, "SCAN", gfc_default_integer_kind
);
6141 return &gfc_bad_expr
;
6143 if (e
->expr_type
!= EXPR_CONSTANT
|| c
->expr_type
!= EXPR_CONSTANT
6144 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
6147 if (b
!= NULL
&& b
->value
.logical
!= 0)
6152 len
= e
->value
.character
.length
;
6153 lenc
= c
->value
.character
.length
;
6155 if (len
== 0 || lenc
== 0)
6163 indx
= wide_strcspn (e
->value
.character
.string
,
6164 c
->value
.character
.string
) + 1;
6171 for (indx
= len
; indx
> 0; indx
--)
6173 for (i
= 0; i
< lenc
; i
++)
6175 if (c
->value
.character
.string
[i
]
6176 == e
->value
.character
.string
[indx
- 1])
6185 result
= gfc_get_int_expr (k
, &e
->where
, indx
);
6186 return range_check (result
, "SCAN");
6191 gfc_simplify_selected_char_kind (gfc_expr
*e
)
6195 if (e
->expr_type
!= EXPR_CONSTANT
)
6198 if (gfc_compare_with_Cstring (e
, "ascii", false) == 0
6199 || gfc_compare_with_Cstring (e
, "default", false) == 0)
6201 else if (gfc_compare_with_Cstring (e
, "iso_10646", false) == 0)
6206 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
6211 gfc_simplify_selected_int_kind (gfc_expr
*e
)
6215 if (e
->expr_type
!= EXPR_CONSTANT
|| gfc_extract_int (e
, &range
))
6220 for (i
= 0; gfc_integer_kinds
[i
].kind
!= 0; i
++)
6221 if (gfc_integer_kinds
[i
].range
>= range
6222 && gfc_integer_kinds
[i
].kind
< kind
)
6223 kind
= gfc_integer_kinds
[i
].kind
;
6225 if (kind
== INT_MAX
)
6228 return gfc_get_int_expr (gfc_default_integer_kind
, &e
->where
, kind
);
6233 gfc_simplify_selected_real_kind (gfc_expr
*p
, gfc_expr
*q
, gfc_expr
*rdx
)
6235 int range
, precision
, radix
, i
, kind
, found_precision
, found_range
,
6237 locus
*loc
= &gfc_current_locus
;
6243 if (p
->expr_type
!= EXPR_CONSTANT
6244 || gfc_extract_int (p
, &precision
))
6253 if (q
->expr_type
!= EXPR_CONSTANT
6254 || gfc_extract_int (q
, &range
))
6265 if (rdx
->expr_type
!= EXPR_CONSTANT
6266 || gfc_extract_int (rdx
, &radix
))
6274 found_precision
= 0;
6278 for (i
= 0; gfc_real_kinds
[i
].kind
!= 0; i
++)
6280 if (gfc_real_kinds
[i
].precision
>= precision
)
6281 found_precision
= 1;
6283 if (gfc_real_kinds
[i
].range
>= range
)
6286 if (radix
== 0 || gfc_real_kinds
[i
].radix
== radix
)
6289 if (gfc_real_kinds
[i
].precision
>= precision
6290 && gfc_real_kinds
[i
].range
>= range
6291 && (radix
== 0 || gfc_real_kinds
[i
].radix
== radix
)
6292 && gfc_real_kinds
[i
].kind
< kind
)
6293 kind
= gfc_real_kinds
[i
].kind
;
6296 if (kind
== INT_MAX
)
6298 if (found_radix
&& found_range
&& !found_precision
)
6300 else if (found_radix
&& found_precision
&& !found_range
)
6302 else if (found_radix
&& !found_precision
&& !found_range
)
6304 else if (found_radix
)
6310 return gfc_get_int_expr (gfc_default_integer_kind
, loc
, kind
);
6315 gfc_simplify_set_exponent (gfc_expr
*x
, gfc_expr
*i
)
6318 mpfr_t exp
, absv
, log2
, pow2
, frac
;
6321 if (x
->expr_type
!= EXPR_CONSTANT
|| i
->expr_type
!= EXPR_CONSTANT
)
6324 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
6326 /* SET_EXPONENT (+/-0.0, I) = +/- 0.0
6327 SET_EXPONENT (NaN) = same NaN */
6328 if (mpfr_zero_p (x
->value
.real
) || mpfr_nan_p (x
->value
.real
))
6330 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6334 /* SET_EXPONENT (inf) = NaN */
6335 if (mpfr_inf_p (x
->value
.real
))
6337 mpfr_set_nan (result
->value
.real
);
6341 gfc_set_model_kind (x
->ts
.kind
);
6348 mpfr_abs (absv
, x
->value
.real
, GFC_RND_MODE
);
6349 mpfr_log2 (log2
, absv
, GFC_RND_MODE
);
6351 mpfr_trunc (log2
, log2
);
6352 mpfr_add_ui (exp
, log2
, 1, GFC_RND_MODE
);
6354 /* Old exponent value, and fraction. */
6355 mpfr_ui_pow (pow2
, 2, exp
, GFC_RND_MODE
);
6357 mpfr_div (frac
, absv
, pow2
, GFC_RND_MODE
);
6360 exp2
= (unsigned long) mpz_get_d (i
->value
.integer
);
6361 mpfr_mul_2exp (result
->value
.real
, frac
, exp2
, GFC_RND_MODE
);
6363 mpfr_clears (absv
, log2
, pow2
, frac
, NULL
);
6365 return range_check (result
, "SET_EXPONENT");
6370 gfc_simplify_shape (gfc_expr
*source
, gfc_expr
*kind
)
6372 mpz_t shape
[GFC_MAX_DIMENSIONS
];
6373 gfc_expr
*result
, *e
, *f
;
6377 int k
= get_kind (BT_INTEGER
, kind
, "SHAPE", gfc_default_integer_kind
);
6379 if (source
->rank
== -1)
6382 result
= gfc_get_array_expr (BT_INTEGER
, k
, &source
->where
);
6384 if (source
->rank
== 0)
6387 if (source
->expr_type
== EXPR_VARIABLE
)
6389 ar
= gfc_find_array_ref (source
);
6390 t
= gfc_array_ref_shape (ar
, shape
);
6392 else if (source
->shape
)
6395 for (n
= 0; n
< source
->rank
; n
++)
6397 mpz_init (shape
[n
]);
6398 mpz_set (shape
[n
], source
->shape
[n
]);
6404 for (n
= 0; n
< source
->rank
; n
++)
6406 e
= gfc_get_constant_expr (BT_INTEGER
, k
, &source
->where
);
6409 mpz_set (e
->value
.integer
, shape
[n
]);
6412 mpz_set_ui (e
->value
.integer
, n
+ 1);
6414 f
= simplify_size (source
, e
, k
);
6418 gfc_free_expr (result
);
6425 if (e
== &gfc_bad_expr
|| range_check (e
, "SHAPE") == &gfc_bad_expr
)
6427 gfc_free_expr (result
);
6429 gfc_clear_shape (shape
, source
->rank
);
6430 return &gfc_bad_expr
;
6433 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
6437 gfc_clear_shape (shape
, source
->rank
);
6444 simplify_size (gfc_expr
*array
, gfc_expr
*dim
, int k
)
6447 gfc_expr
*return_value
;
6450 /* For unary operations, the size of the result is given by the size
6451 of the operand. For binary ones, it's the size of the first operand
6452 unless it is scalar, then it is the size of the second. */
6453 if (array
->expr_type
== EXPR_OP
&& !array
->value
.op
.uop
)
6455 gfc_expr
* replacement
;
6456 gfc_expr
* simplified
;
6458 switch (array
->value
.op
.op
)
6460 /* Unary operations. */
6462 case INTRINSIC_UPLUS
:
6463 case INTRINSIC_UMINUS
:
6464 case INTRINSIC_PARENTHESES
:
6465 replacement
= array
->value
.op
.op1
;
6468 /* Binary operations. If any one of the operands is scalar, take
6469 the other one's size. If both of them are arrays, it does not
6470 matter -- try to find one with known shape, if possible. */
6472 if (array
->value
.op
.op1
->rank
== 0)
6473 replacement
= array
->value
.op
.op2
;
6474 else if (array
->value
.op
.op2
->rank
== 0)
6475 replacement
= array
->value
.op
.op1
;
6478 simplified
= simplify_size (array
->value
.op
.op1
, dim
, k
);
6482 replacement
= array
->value
.op
.op2
;
6487 /* Try to reduce it directly if possible. */
6488 simplified
= simplify_size (replacement
, dim
, k
);
6490 /* Otherwise, we build a new SIZE call. This is hopefully at least
6491 simpler than the original one. */
6494 gfc_expr
*kind
= gfc_get_int_expr (gfc_default_integer_kind
, NULL
, k
);
6495 simplified
= gfc_build_intrinsic_call (gfc_current_ns
,
6496 GFC_ISYM_SIZE
, "size",
6498 gfc_copy_expr (replacement
),
6499 gfc_copy_expr (dim
),
6507 if (!gfc_array_size (array
, &size
))
6512 if (dim
->expr_type
!= EXPR_CONSTANT
)
6515 d
= mpz_get_ui (dim
->value
.integer
) - 1;
6516 if (!gfc_array_dimen_size (array
, d
, &size
))
6520 return_value
= gfc_get_constant_expr (BT_INTEGER
, k
, &array
->where
);
6521 mpz_set (return_value
->value
.integer
, size
);
6524 return return_value
;
6529 gfc_simplify_size (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
6532 int k
= get_kind (BT_INTEGER
, kind
, "SIZE", gfc_default_integer_kind
);
6535 return &gfc_bad_expr
;
6537 result
= simplify_size (array
, dim
, k
);
6538 if (result
== NULL
|| result
== &gfc_bad_expr
)
6541 return range_check (result
, "SIZE");
6545 /* SIZEOF and C_SIZEOF return the size in bytes of an array element
6546 multiplied by the array size. */
6549 gfc_simplify_sizeof (gfc_expr
*x
)
6551 gfc_expr
*result
= NULL
;
6554 if (x
->ts
.type
== BT_CLASS
|| x
->ts
.deferred
)
6557 if (x
->ts
.type
== BT_CHARACTER
6558 && (!x
->ts
.u
.cl
|| !x
->ts
.u
.cl
->length
6559 || x
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
))
6562 if (x
->rank
&& x
->expr_type
!= EXPR_ARRAY
6563 && !gfc_array_size (x
, &array_size
))
6566 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_index_integer_kind
,
6568 mpz_set_si (result
->value
.integer
, gfc_target_expr_size (x
));
6574 /* STORAGE_SIZE returns the size in bits of a single array element. */
6577 gfc_simplify_storage_size (gfc_expr
*x
,
6580 gfc_expr
*result
= NULL
;
6583 if (x
->ts
.type
== BT_CLASS
|| x
->ts
.deferred
)
6586 if (x
->ts
.type
== BT_CHARACTER
&& x
->expr_type
!= EXPR_CONSTANT
6587 && (!x
->ts
.u
.cl
|| !x
->ts
.u
.cl
->length
6588 || x
->ts
.u
.cl
->length
->expr_type
!= EXPR_CONSTANT
))
6591 k
= get_kind (BT_INTEGER
, kind
, "STORAGE_SIZE", gfc_default_integer_kind
);
6593 return &gfc_bad_expr
;
6595 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &x
->where
);
6597 mpz_set_si (result
->value
.integer
, gfc_element_size (x
));
6598 mpz_mul_ui (result
->value
.integer
, result
->value
.integer
, BITS_PER_UNIT
);
6600 return range_check (result
, "STORAGE_SIZE");
6605 gfc_simplify_sign (gfc_expr
*x
, gfc_expr
*y
)
6609 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
6612 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6617 mpz_abs (result
->value
.integer
, x
->value
.integer
);
6618 if (mpz_sgn (y
->value
.integer
) < 0)
6619 mpz_neg (result
->value
.integer
, result
->value
.integer
);
6624 mpfr_copysign (result
->value
.real
, x
->value
.real
, y
->value
.real
,
6627 mpfr_setsign (result
->value
.real
, x
->value
.real
,
6628 mpfr_sgn (y
->value
.real
) < 0 ? 1 : 0, GFC_RND_MODE
);
6632 gfc_internal_error ("Bad type in gfc_simplify_sign");
6640 gfc_simplify_sin (gfc_expr
*x
)
6644 if (x
->expr_type
!= EXPR_CONSTANT
)
6647 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6652 mpfr_sin (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6656 gfc_set_model (x
->value
.real
);
6657 mpc_sin (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6661 gfc_internal_error ("in gfc_simplify_sin(): Bad type");
6664 return range_check (result
, "SIN");
6669 gfc_simplify_sinh (gfc_expr
*x
)
6673 if (x
->expr_type
!= EXPR_CONSTANT
)
6676 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6681 mpfr_sinh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6685 mpc_sinh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6692 return range_check (result
, "SINH");
6696 /* The argument is always a double precision real that is converted to
6697 single precision. TODO: Rounding! */
6700 gfc_simplify_sngl (gfc_expr
*a
)
6704 if (a
->expr_type
!= EXPR_CONSTANT
)
6707 result
= gfc_real2real (a
, gfc_default_real_kind
);
6708 return range_check (result
, "SNGL");
6713 gfc_simplify_spacing (gfc_expr
*x
)
6719 if (x
->expr_type
!= EXPR_CONSTANT
)
6722 i
= gfc_validate_kind (x
->ts
.type
, x
->ts
.kind
, false);
6723 result
= gfc_get_constant_expr (BT_REAL
, x
->ts
.kind
, &x
->where
);
6725 /* SPACING(+/- 0.0) = SPACING(TINY(0.0)) = TINY(0.0) */
6726 if (mpfr_zero_p (x
->value
.real
))
6728 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
6732 /* SPACING(inf) = NaN */
6733 if (mpfr_inf_p (x
->value
.real
))
6735 mpfr_set_nan (result
->value
.real
);
6739 /* SPACING(NaN) = same NaN */
6740 if (mpfr_nan_p (x
->value
.real
))
6742 mpfr_set (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6746 /* In the Fortran 95 standard, the result is b**(e - p) where b, e, and p
6747 are the radix, exponent of x, and precision. This excludes the
6748 possibility of subnormal numbers. Fortran 2003 states the result is
6749 b**max(e - p, emin - 1). */
6751 ep
= (long int) mpfr_get_exp (x
->value
.real
) - gfc_real_kinds
[i
].digits
;
6752 en
= (long int) gfc_real_kinds
[i
].min_exponent
- 1;
6753 en
= en
> ep
? en
: ep
;
6755 mpfr_set_ui (result
->value
.real
, 1, GFC_RND_MODE
);
6756 mpfr_mul_2si (result
->value
.real
, result
->value
.real
, en
, GFC_RND_MODE
);
6758 return range_check (result
, "SPACING");
6763 gfc_simplify_spread (gfc_expr
*source
, gfc_expr
*dim_expr
, gfc_expr
*ncopies_expr
)
6765 gfc_expr
*result
= NULL
;
6766 int nelem
, i
, j
, dim
, ncopies
;
6769 if ((!gfc_is_constant_expr (source
)
6770 && !is_constant_array_expr (source
))
6771 || !gfc_is_constant_expr (dim_expr
)
6772 || !gfc_is_constant_expr (ncopies_expr
))
6775 gcc_assert (dim_expr
->ts
.type
== BT_INTEGER
);
6776 gfc_extract_int (dim_expr
, &dim
);
6777 dim
-= 1; /* zero-base DIM */
6779 gcc_assert (ncopies_expr
->ts
.type
== BT_INTEGER
);
6780 gfc_extract_int (ncopies_expr
, &ncopies
);
6781 ncopies
= MAX (ncopies
, 0);
6783 /* Do not allow the array size to exceed the limit for an array
6785 if (source
->expr_type
== EXPR_ARRAY
)
6787 if (!gfc_array_size (source
, &size
))
6788 gfc_internal_error ("Failure getting length of a constant array.");
6791 mpz_init_set_ui (size
, 1);
6793 nelem
= mpz_get_si (size
) * ncopies
;
6794 if (nelem
> flag_max_array_constructor
)
6796 if (gfc_current_ns
->sym_root
->n
.sym
->attr
.flavor
== FL_PARAMETER
)
6798 gfc_error ("The number of elements (%d) in the array constructor "
6799 "at %L requires an increase of the allowed %d upper "
6800 "limit. See %<-fmax-array-constructor%> option.",
6801 nelem
, &source
->where
, flag_max_array_constructor
);
6802 return &gfc_bad_expr
;
6808 if (source
->expr_type
== EXPR_CONSTANT
)
6810 gcc_assert (dim
== 0);
6812 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
6814 if (source
->ts
.type
== BT_DERIVED
)
6815 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
6817 result
->shape
= gfc_get_shape (result
->rank
);
6818 mpz_init_set_si (result
->shape
[0], ncopies
);
6820 for (i
= 0; i
< ncopies
; ++i
)
6821 gfc_constructor_append_expr (&result
->value
.constructor
,
6822 gfc_copy_expr (source
), NULL
);
6824 else if (source
->expr_type
== EXPR_ARRAY
)
6826 int offset
, rstride
[GFC_MAX_DIMENSIONS
], extent
[GFC_MAX_DIMENSIONS
];
6827 gfc_constructor
*source_ctor
;
6829 gcc_assert (source
->rank
< GFC_MAX_DIMENSIONS
);
6830 gcc_assert (dim
>= 0 && dim
<= source
->rank
);
6832 result
= gfc_get_array_expr (source
->ts
.type
, source
->ts
.kind
,
6834 if (source
->ts
.type
== BT_DERIVED
)
6835 result
->ts
.u
.derived
= source
->ts
.u
.derived
;
6836 result
->rank
= source
->rank
+ 1;
6837 result
->shape
= gfc_get_shape (result
->rank
);
6839 for (i
= 0, j
= 0; i
< result
->rank
; ++i
)
6842 mpz_init_set (result
->shape
[i
], source
->shape
[j
++]);
6844 mpz_init_set_si (result
->shape
[i
], ncopies
);
6846 extent
[i
] = mpz_get_si (result
->shape
[i
]);
6847 rstride
[i
] = (i
== 0) ? 1 : rstride
[i
-1] * extent
[i
-1];
6851 for (source_ctor
= gfc_constructor_first (source
->value
.constructor
);
6852 source_ctor
; source_ctor
= gfc_constructor_next (source_ctor
))
6854 for (i
= 0; i
< ncopies
; ++i
)
6855 gfc_constructor_insert_expr (&result
->value
.constructor
,
6856 gfc_copy_expr (source_ctor
->expr
),
6857 NULL
, offset
+ i
* rstride
[dim
]);
6859 offset
+= (dim
== 0 ? ncopies
: 1);
6864 gfc_error ("Simplification of SPREAD at %C not yet implemented");
6865 return &gfc_bad_expr
;
6868 if (source
->ts
.type
== BT_CHARACTER
)
6869 result
->ts
.u
.cl
= source
->ts
.u
.cl
;
6876 gfc_simplify_sqrt (gfc_expr
*e
)
6878 gfc_expr
*result
= NULL
;
6880 if (e
->expr_type
!= EXPR_CONSTANT
)
6886 if (mpfr_cmp_si (e
->value
.real
, 0) < 0)
6888 gfc_error ("Argument of SQRT at %L has a negative value",
6890 return &gfc_bad_expr
;
6892 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
6893 mpfr_sqrt (result
->value
.real
, e
->value
.real
, GFC_RND_MODE
);
6897 gfc_set_model (e
->value
.real
);
6899 result
= gfc_get_constant_expr (e
->ts
.type
, e
->ts
.kind
, &e
->where
);
6900 mpc_sqrt (result
->value
.complex, e
->value
.complex, GFC_MPC_RND_MODE
);
6904 gfc_internal_error ("invalid argument of SQRT at %L", &e
->where
);
6907 return range_check (result
, "SQRT");
6912 gfc_simplify_sum (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*mask
)
6914 return simplify_transformation (array
, dim
, mask
, 0, gfc_add
);
6919 gfc_simplify_cotan (gfc_expr
*x
)
6924 if (x
->expr_type
!= EXPR_CONSTANT
)
6927 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6932 mpfr_cot (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6936 /* There is no builtin mpc_cot, so compute cot = cos / sin. */
6937 val
= &result
->value
.complex;
6938 mpc_init2 (swp
, mpfr_get_default_prec ());
6939 mpc_cos (swp
, x
->value
.complex, GFC_MPC_RND_MODE
);
6940 mpc_sin (*val
, x
->value
.complex, GFC_MPC_RND_MODE
);
6941 mpc_div (*val
, swp
, *val
, GFC_MPC_RND_MODE
);
6949 return range_check (result
, "COTAN");
6954 gfc_simplify_tan (gfc_expr
*x
)
6958 if (x
->expr_type
!= EXPR_CONSTANT
)
6961 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6966 mpfr_tan (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6970 mpc_tan (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
6977 return range_check (result
, "TAN");
6982 gfc_simplify_tanh (gfc_expr
*x
)
6986 if (x
->expr_type
!= EXPR_CONSTANT
)
6989 result
= gfc_get_constant_expr (x
->ts
.type
, x
->ts
.kind
, &x
->where
);
6994 mpfr_tanh (result
->value
.real
, x
->value
.real
, GFC_RND_MODE
);
6998 mpc_tanh (result
->value
.complex, x
->value
.complex, GFC_MPC_RND_MODE
);
7005 return range_check (result
, "TANH");
7010 gfc_simplify_tiny (gfc_expr
*e
)
7015 i
= gfc_validate_kind (BT_REAL
, e
->ts
.kind
, false);
7017 result
= gfc_get_constant_expr (BT_REAL
, e
->ts
.kind
, &e
->where
);
7018 mpfr_set (result
->value
.real
, gfc_real_kinds
[i
].tiny
, GFC_RND_MODE
);
7025 gfc_simplify_trailz (gfc_expr
*e
)
7027 unsigned long tz
, bs
;
7030 if (e
->expr_type
!= EXPR_CONSTANT
)
7033 i
= gfc_validate_kind (e
->ts
.type
, e
->ts
.kind
, false);
7034 bs
= gfc_integer_kinds
[i
].bit_size
;
7035 tz
= mpz_scan1 (e
->value
.integer
, 0);
7037 return gfc_get_int_expr (gfc_default_integer_kind
,
7038 &e
->where
, MIN (tz
, bs
));
7043 gfc_simplify_transfer (gfc_expr
*source
, gfc_expr
*mold
, gfc_expr
*size
)
7046 gfc_expr
*mold_element
;
7051 unsigned char *buffer
;
7052 size_t result_length
;
7055 if (!gfc_is_constant_expr (source
)
7056 || (gfc_init_expr_flag
&& !gfc_is_constant_expr (mold
))
7057 || !gfc_is_constant_expr (size
))
7060 if (!gfc_calculate_transfer_sizes (source
, mold
, size
, &source_size
,
7061 &result_size
, &result_length
))
7064 /* Calculate the size of the source. */
7065 if (source
->expr_type
== EXPR_ARRAY
&& !gfc_array_size (source
, &tmp
))
7066 gfc_internal_error ("Failure getting length of a constant array.");
7068 /* Create an empty new expression with the appropriate characteristics. */
7069 result
= gfc_get_constant_expr (mold
->ts
.type
, mold
->ts
.kind
,
7071 result
->ts
= mold
->ts
;
7073 mold_element
= (mold
->expr_type
== EXPR_ARRAY
&& mold
->value
.constructor
)
7074 ? gfc_constructor_first (mold
->value
.constructor
)->expr
7077 /* Set result character length, if needed. Note that this needs to be
7078 set even for array expressions, in order to pass this information into
7079 gfc_target_interpret_expr. */
7080 if (result
->ts
.type
== BT_CHARACTER
&& gfc_is_constant_expr (mold_element
))
7081 result
->value
.character
.length
= mold_element
->value
.character
.length
;
7083 /* Set the number of elements in the result, and determine its size. */
7085 if (mold
->expr_type
== EXPR_ARRAY
|| mold
->rank
|| size
)
7087 result
->expr_type
= EXPR_ARRAY
;
7089 result
->shape
= gfc_get_shape (1);
7090 mpz_init_set_ui (result
->shape
[0], result_length
);
7095 /* Allocate the buffer to store the binary version of the source. */
7096 buffer_size
= MAX (source_size
, result_size
);
7097 buffer
= (unsigned char*)alloca (buffer_size
);
7098 memset (buffer
, 0, buffer_size
);
7100 /* Now write source to the buffer. */
7101 gfc_target_encode_expr (source
, buffer
, buffer_size
);
7103 /* And read the buffer back into the new expression. */
7104 gfc_target_interpret_expr (buffer
, buffer_size
, result
, false);
7111 gfc_simplify_transpose (gfc_expr
*matrix
)
7113 int row
, matrix_rows
, col
, matrix_cols
;
7116 if (!is_constant_array_expr (matrix
))
7119 gcc_assert (matrix
->rank
== 2);
7121 result
= gfc_get_array_expr (matrix
->ts
.type
, matrix
->ts
.kind
,
7124 result
->shape
= gfc_get_shape (result
->rank
);
7125 mpz_set (result
->shape
[0], matrix
->shape
[1]);
7126 mpz_set (result
->shape
[1], matrix
->shape
[0]);
7128 if (matrix
->ts
.type
== BT_CHARACTER
)
7129 result
->ts
.u
.cl
= matrix
->ts
.u
.cl
;
7130 else if (matrix
->ts
.type
== BT_DERIVED
)
7131 result
->ts
.u
.derived
= matrix
->ts
.u
.derived
;
7133 matrix_rows
= mpz_get_si (matrix
->shape
[0]);
7134 matrix_cols
= mpz_get_si (matrix
->shape
[1]);
7135 for (row
= 0; row
< matrix_rows
; ++row
)
7136 for (col
= 0; col
< matrix_cols
; ++col
)
7138 gfc_expr
*e
= gfc_constructor_lookup_expr (matrix
->value
.constructor
,
7139 col
* matrix_rows
+ row
);
7140 gfc_constructor_insert_expr (&result
->value
.constructor
,
7141 gfc_copy_expr (e
), &matrix
->where
,
7142 row
* matrix_cols
+ col
);
7150 gfc_simplify_trim (gfc_expr
*e
)
7153 int count
, i
, len
, lentrim
;
7155 if (e
->expr_type
!= EXPR_CONSTANT
)
7158 len
= e
->value
.character
.length
;
7159 for (count
= 0, i
= 1; i
<= len
; ++i
)
7161 if (e
->value
.character
.string
[len
- i
] == ' ')
7167 lentrim
= len
- count
;
7169 result
= gfc_get_character_expr (e
->ts
.kind
, &e
->where
, NULL
, lentrim
);
7170 for (i
= 0; i
< lentrim
; i
++)
7171 result
->value
.character
.string
[i
] = e
->value
.character
.string
[i
];
7178 gfc_simplify_image_index (gfc_expr
*coarray
, gfc_expr
*sub
)
7183 gfc_constructor
*sub_cons
;
7187 if (!is_constant_array_expr (sub
))
7190 /* Follow any component references. */
7191 as
= coarray
->symtree
->n
.sym
->as
;
7192 for (ref
= coarray
->ref
; ref
; ref
= ref
->next
)
7193 if (ref
->type
== REF_COMPONENT
)
7196 if (as
->type
== AS_DEFERRED
)
7199 /* "valid sequence of cosubscripts" are required; thus, return 0 unless
7200 the cosubscript addresses the first image. */
7202 sub_cons
= gfc_constructor_first (sub
->value
.constructor
);
7205 for (d
= 1; d
<= as
->corank
; d
++)
7210 gcc_assert (sub_cons
!= NULL
);
7212 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 0, as
,
7214 if (ca_bound
== NULL
)
7217 if (ca_bound
== &gfc_bad_expr
)
7220 cmp
= mpz_cmp (ca_bound
->value
.integer
, sub_cons
->expr
->value
.integer
);
7224 gfc_free_expr (ca_bound
);
7225 sub_cons
= gfc_constructor_next (sub_cons
);
7229 first_image
= false;
7233 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
7234 "SUB has %ld and COARRAY lower bound is %ld)",
7236 mpz_get_si (sub_cons
->expr
->value
.integer
),
7237 mpz_get_si (ca_bound
->value
.integer
));
7238 gfc_free_expr (ca_bound
);
7239 return &gfc_bad_expr
;
7242 gfc_free_expr (ca_bound
);
7244 /* Check whether upperbound is valid for the multi-images case. */
7247 ca_bound
= simplify_bound_dim (coarray
, NULL
, d
+ as
->rank
, 1, as
,
7249 if (ca_bound
== &gfc_bad_expr
)
7252 if (ca_bound
&& ca_bound
->expr_type
== EXPR_CONSTANT
7253 && mpz_cmp (ca_bound
->value
.integer
,
7254 sub_cons
->expr
->value
.integer
) < 0)
7256 gfc_error ("Out of bounds in IMAGE_INDEX at %L for dimension %d, "
7257 "SUB has %ld and COARRAY upper bound is %ld)",
7259 mpz_get_si (sub_cons
->expr
->value
.integer
),
7260 mpz_get_si (ca_bound
->value
.integer
));
7261 gfc_free_expr (ca_bound
);
7262 return &gfc_bad_expr
;
7266 gfc_free_expr (ca_bound
);
7269 sub_cons
= gfc_constructor_next (sub_cons
);
7272 gcc_assert (sub_cons
== NULL
);
7274 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
&& !first_image
)
7277 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
7278 &gfc_current_locus
);
7280 mpz_set_si (result
->value
.integer
, 1);
7282 mpz_set_si (result
->value
.integer
, 0);
7288 gfc_simplify_image_status (gfc_expr
*image
, gfc_expr
*team ATTRIBUTE_UNUSED
)
7290 if (flag_coarray
== GFC_FCOARRAY_NONE
)
7292 gfc_current_locus
= *gfc_current_intrinsic_where
;
7293 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
7294 return &gfc_bad_expr
;
7297 /* Simplification is possible for fcoarray = single only. For all other modes
7298 the result depends on runtime conditions. */
7299 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
)
7302 if (gfc_is_constant_expr (image
))
7305 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
7307 if (mpz_get_si (image
->value
.integer
) == 1)
7308 mpz_set_si (result
->value
.integer
, 0);
7310 mpz_set_si (result
->value
.integer
, GFC_STAT_STOPPED_IMAGE
);
7319 gfc_simplify_this_image (gfc_expr
*coarray
, gfc_expr
*dim
,
7320 gfc_expr
*distance ATTRIBUTE_UNUSED
)
7322 if (flag_coarray
!= GFC_FCOARRAY_SINGLE
)
7325 /* If no coarray argument has been passed or when the first argument
7326 is actually a distance argment. */
7327 if (coarray
== NULL
|| !gfc_is_coarray (coarray
))
7330 /* FIXME: gfc_current_locus is wrong. */
7331 result
= gfc_get_constant_expr (BT_INTEGER
, gfc_default_integer_kind
,
7332 &gfc_current_locus
);
7333 mpz_set_si (result
->value
.integer
, 1);
7337 /* For -fcoarray=single, this_image(A) is the same as lcobound(A). */
7338 return simplify_cobound (coarray
, dim
, NULL
, 0);
7343 gfc_simplify_ubound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
7345 return simplify_bound (array
, dim
, kind
, 1);
7349 gfc_simplify_ucobound (gfc_expr
*array
, gfc_expr
*dim
, gfc_expr
*kind
)
7351 return simplify_cobound (array
, dim
, kind
, 1);
7356 gfc_simplify_unpack (gfc_expr
*vector
, gfc_expr
*mask
, gfc_expr
*field
)
7358 gfc_expr
*result
, *e
;
7359 gfc_constructor
*vector_ctor
, *mask_ctor
, *field_ctor
;
7361 if (!is_constant_array_expr (vector
)
7362 || !is_constant_array_expr (mask
)
7363 || (!gfc_is_constant_expr (field
)
7364 && !is_constant_array_expr (field
)))
7367 result
= gfc_get_array_expr (vector
->ts
.type
, vector
->ts
.kind
,
7369 if (vector
->ts
.type
== BT_DERIVED
)
7370 result
->ts
.u
.derived
= vector
->ts
.u
.derived
;
7371 result
->rank
= mask
->rank
;
7372 result
->shape
= gfc_copy_shape (mask
->shape
, mask
->rank
);
7374 if (vector
->ts
.type
== BT_CHARACTER
)
7375 result
->ts
.u
.cl
= vector
->ts
.u
.cl
;
7377 vector_ctor
= gfc_constructor_first (vector
->value
.constructor
);
7378 mask_ctor
= gfc_constructor_first (mask
->value
.constructor
);
7380 = field
->expr_type
== EXPR_ARRAY
7381 ? gfc_constructor_first (field
->value
.constructor
)
7386 if (mask_ctor
->expr
->value
.logical
)
7388 gcc_assert (vector_ctor
);
7389 e
= gfc_copy_expr (vector_ctor
->expr
);
7390 vector_ctor
= gfc_constructor_next (vector_ctor
);
7392 else if (field
->expr_type
== EXPR_ARRAY
)
7393 e
= gfc_copy_expr (field_ctor
->expr
);
7395 e
= gfc_copy_expr (field
);
7397 gfc_constructor_append_expr (&result
->value
.constructor
, e
, NULL
);
7399 mask_ctor
= gfc_constructor_next (mask_ctor
);
7400 field_ctor
= gfc_constructor_next (field_ctor
);
7408 gfc_simplify_verify (gfc_expr
*s
, gfc_expr
*set
, gfc_expr
*b
, gfc_expr
*kind
)
7412 size_t index
, len
, lenset
;
7414 int k
= get_kind (BT_INTEGER
, kind
, "VERIFY", gfc_default_integer_kind
);
7417 return &gfc_bad_expr
;
7419 if (s
->expr_type
!= EXPR_CONSTANT
|| set
->expr_type
!= EXPR_CONSTANT
7420 || ( b
!= NULL
&& b
->expr_type
!= EXPR_CONSTANT
))
7423 if (b
!= NULL
&& b
->value
.logical
!= 0)
7428 result
= gfc_get_constant_expr (BT_INTEGER
, k
, &s
->where
);
7430 len
= s
->value
.character
.length
;
7431 lenset
= set
->value
.character
.length
;
7435 mpz_set_ui (result
->value
.integer
, 0);
7443 mpz_set_ui (result
->value
.integer
, 1);
7447 index
= wide_strspn (s
->value
.character
.string
,
7448 set
->value
.character
.string
) + 1;
7457 mpz_set_ui (result
->value
.integer
, len
);
7460 for (index
= len
; index
> 0; index
--)
7462 for (i
= 0; i
< lenset
; i
++)
7464 if (s
->value
.character
.string
[index
- 1]
7465 == set
->value
.character
.string
[i
])
7473 mpz_set_ui (result
->value
.integer
, index
);
7479 gfc_simplify_xor (gfc_expr
*x
, gfc_expr
*y
)
7484 if (x
->expr_type
!= EXPR_CONSTANT
|| y
->expr_type
!= EXPR_CONSTANT
)
7487 kind
= x
->ts
.kind
> y
->ts
.kind
? x
->ts
.kind
: y
->ts
.kind
;
7492 result
= gfc_get_constant_expr (BT_INTEGER
, kind
, &x
->where
);
7493 mpz_xor (result
->value
.integer
, x
->value
.integer
, y
->value
.integer
);
7494 return range_check (result
, "XOR");
7497 return gfc_get_logical_expr (kind
, &x
->where
,
7498 (x
->value
.logical
&& !y
->value
.logical
)
7499 || (!x
->value
.logical
&& y
->value
.logical
));
7507 /****************** Constant simplification *****************/
7509 /* Master function to convert one constant to another. While this is
7510 used as a simplification function, it requires the destination type
7511 and kind information which is supplied by a special case in
7515 gfc_convert_constant (gfc_expr
*e
, bt type
, int kind
)
7517 gfc_expr
*g
, *result
, *(*f
) (gfc_expr
*, int);
7532 f
= gfc_int2complex
;
7552 f
= gfc_real2complex
;
7563 f
= gfc_complex2int
;
7566 f
= gfc_complex2real
;
7569 f
= gfc_complex2complex
;
7595 f
= gfc_hollerith2int
;
7599 f
= gfc_hollerith2real
;
7603 f
= gfc_hollerith2complex
;
7607 f
= gfc_hollerith2character
;
7611 f
= gfc_hollerith2logical
;
7620 if (type
== BT_CHARACTER
)
7621 f
= gfc_character2character
;
7628 gfc_internal_error ("gfc_convert_constant(): Unexpected type");
7633 switch (e
->expr_type
)
7636 result
= f (e
, kind
);
7638 return &gfc_bad_expr
;
7642 if (!gfc_is_constant_expr (e
))
7645 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
7646 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
7647 result
->rank
= e
->rank
;
7649 for (c
= gfc_constructor_first (e
->value
.constructor
);
7650 c
; c
= gfc_constructor_next (c
))
7653 if (c
->iterator
== NULL
)
7654 tmp
= f (c
->expr
, kind
);
7657 g
= gfc_convert_constant (c
->expr
, type
, kind
);
7658 if (g
== &gfc_bad_expr
)
7660 gfc_free_expr (result
);
7668 gfc_free_expr (result
);
7672 gfc_constructor_append_expr (&result
->value
.constructor
,
7686 /* Function for converting character constants. */
7688 gfc_convert_char_constant (gfc_expr
*e
, bt type ATTRIBUTE_UNUSED
, int kind
)
7693 if (!gfc_is_constant_expr (e
))
7696 if (e
->expr_type
== EXPR_CONSTANT
)
7698 /* Simple case of a scalar. */
7699 result
= gfc_get_constant_expr (BT_CHARACTER
, kind
, &e
->where
);
7701 return &gfc_bad_expr
;
7703 result
->value
.character
.length
= e
->value
.character
.length
;
7704 result
->value
.character
.string
7705 = gfc_get_wide_string (e
->value
.character
.length
+ 1);
7706 memcpy (result
->value
.character
.string
, e
->value
.character
.string
,
7707 (e
->value
.character
.length
+ 1) * sizeof (gfc_char_t
));
7709 /* Check we only have values representable in the destination kind. */
7710 for (i
= 0; i
< result
->value
.character
.length
; i
++)
7711 if (!gfc_check_character_range (result
->value
.character
.string
[i
],
7714 gfc_error ("Character %qs in string at %L cannot be converted "
7715 "into character kind %d",
7716 gfc_print_wide_char (result
->value
.character
.string
[i
]),
7718 gfc_free_expr (result
);
7719 return &gfc_bad_expr
;
7724 else if (e
->expr_type
== EXPR_ARRAY
)
7726 /* For an array constructor, we convert each constructor element. */
7729 result
= gfc_get_array_expr (type
, kind
, &e
->where
);
7730 result
->shape
= gfc_copy_shape (e
->shape
, e
->rank
);
7731 result
->rank
= e
->rank
;
7732 result
->ts
.u
.cl
= e
->ts
.u
.cl
;
7734 for (c
= gfc_constructor_first (e
->value
.constructor
);
7735 c
; c
= gfc_constructor_next (c
))
7737 gfc_expr
*tmp
= gfc_convert_char_constant (c
->expr
, type
, kind
);
7738 if (tmp
== &gfc_bad_expr
)
7740 gfc_free_expr (result
);
7741 return &gfc_bad_expr
;
7746 gfc_free_expr (result
);
7750 gfc_constructor_append_expr (&result
->value
.constructor
,
7762 gfc_simplify_compiler_options (void)
7767 str
= gfc_get_option_string ();
7768 result
= gfc_get_character_expr (gfc_default_character_kind
,
7769 &gfc_current_locus
, str
, strlen (str
));
7776 gfc_simplify_compiler_version (void)
7781 len
= strlen ("GCC version ") + strlen (version_string
);
7782 buffer
= XALLOCAVEC (char, len
+ 1);
7783 snprintf (buffer
, len
+ 1, "GCC version %s", version_string
);
7784 return gfc_get_character_expr (gfc_default_character_kind
,
7785 &gfc_current_locus
, buffer
, len
);
7788 /* Simplification routines for intrinsics of IEEE modules. */
7791 simplify_ieee_selected_real_kind (gfc_expr
*expr
)
7793 gfc_actual_arglist
*arg
;
7794 gfc_expr
*p
= NULL
, *q
= NULL
, *rdx
= NULL
;
7796 arg
= expr
->value
.function
.actual
;
7800 q
= arg
->next
->expr
;
7801 if (arg
->next
->next
)
7802 rdx
= arg
->next
->next
->expr
;
7805 /* Currently, if IEEE is supported and this module is built, it means
7806 all our floating-point types conform to IEEE. Hence, we simply handle
7807 IEEE_SELECTED_REAL_KIND like SELECTED_REAL_KIND. */
7808 return gfc_simplify_selected_real_kind (p
, q
, rdx
);
7812 simplify_ieee_support (gfc_expr
*expr
)
7814 /* We consider that if the IEEE modules are loaded, we have full support
7815 for flags, halting and rounding, which are the three functions
7816 (IEEE_SUPPORT_{FLAG,HALTING,ROUNDING}) allowed in constant
7817 expressions. One day, we will need libgfortran to detect support and
7818 communicate it back to us, allowing for partial support. */
7820 return gfc_get_logical_expr (gfc_default_logical_kind
, &expr
->where
,
7825 matches_ieee_function_name (gfc_symbol
*sym
, const char *name
)
7827 int n
= strlen(name
);
7829 if (!strncmp(sym
->name
, name
, n
))
7832 /* If a generic was used and renamed, we need more work to find out.
7833 Compare the specific name. */
7834 if (sym
->generic
&& !strncmp(sym
->generic
->sym
->name
, name
, n
))
7841 gfc_simplify_ieee_functions (gfc_expr
*expr
)
7843 gfc_symbol
* sym
= expr
->symtree
->n
.sym
;
7845 if (matches_ieee_function_name(sym
, "ieee_selected_real_kind"))
7846 return simplify_ieee_selected_real_kind (expr
);
7847 else if (matches_ieee_function_name(sym
, "ieee_support_flag")
7848 || matches_ieee_function_name(sym
, "ieee_support_halting")
7849 || matches_ieee_function_name(sym
, "ieee_support_rounding"))
7850 return simplify_ieee_support (expr
);