diff options
author | Mikael Morin <mikael.morin@sfr.fr> | 2011-09-08 17:30:39 +0200 |
---|---|---|
committer | Mikael Morin <mikael@gcc.gnu.org> | 2011-09-08 15:30:39 +0000 |
commit | 26f7753013e52c93c6d63bb678b1544da43a2384 (patch) | |
tree | bf1d67ae319908ea0112fe103dc2c1d5de388cdc /gcc/fortran/trans-array.c | |
parent | a1ae4f435fc547fcae4bf04b6c4efcc310328b3e (diff) | |
download | gcc-26f7753013e52c93c6d63bb678b1544da43a2384.zip gcc-26f7753013e52c93c6d63bb678b1544da43a2384.tar.gz gcc-26f7753013e52c93c6d63bb678b1544da43a2384.tar.bz2 |
trans-array.h (gfc_get_scalar_ss): New prototype.
2011-09-08 Mikael Morin <mikael.morin@sfr.fr>
* trans-array.h (gfc_get_scalar_ss): New prototype.
* trans-array.c (gfc_get_scalar_ss): New function.
(gfc_walk_variable_expr, gfc_walk_op_expr,
gfc_walk_elemental_function_args): Re-use gfc_get_scalar_ss.
* trans-expr.c (gfc_trans_subarray_assign): Ditto.
(gfc_trans_assignment_1): Ditto.
* trans-stmt.c (compute_inner_temp_size, gfc_trans_where_assign,
gfc_trans_where_3): Ditto.
From-SVN: r178697
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r-- | gcc/fortran/trans-array.c | 58 |
1 files changed, 24 insertions, 34 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 5f02c87..80a6fe6 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -550,6 +550,22 @@ gfc_get_temp_ss (tree type, tree string_length, int dimen) return ss; } + + +/* Creates and initializes a scalar type gfc_ss struct. */ + +gfc_ss * +gfc_get_scalar_ss (gfc_ss *next, gfc_expr *expr) +{ + gfc_ss *ss; + + ss = gfc_get_ss (); + ss->next = next; + ss->type = GFC_SS_SCALAR; + ss->expr = expr; + + return ss; +} /* Free all the SS associated with a loop. */ @@ -7597,17 +7613,8 @@ gfc_walk_variable_expr (gfc_ss * ss, gfc_expr * expr) { if (ref->type == REF_SUBSTRING) { - newss = gfc_get_ss (); - newss->type = GFC_SS_SCALAR; - newss->expr = ref->u.ss.start; - newss->next = ss; - ss = newss; - - newss = gfc_get_ss (); - newss->type = GFC_SS_SCALAR; - newss->expr = ref->u.ss.end; - newss->next = ss; - ss = newss; + ss = gfc_get_scalar_ss (ss, ref->u.ss.start); + ss = gfc_get_scalar_ss (ss, ref->u.ss.end); } /* We're only interested in array sections from now on. */ @@ -7626,13 +7633,7 @@ gfc_walk_variable_expr (gfc_ss * ss, gfc_expr * expr) { case AR_ELEMENT: for (n = ar->dimen + ar->codimen - 1; n >= 0; n--) - { - newss = gfc_get_ss (); - newss->type = GFC_SS_SCALAR; - newss->expr = ar->start[n]; - newss->next = ss; - ss = newss; - } + ss = gfc_get_scalar_ss (ss, ar->start[n]); break; case AR_FULL: @@ -7678,10 +7679,7 @@ gfc_walk_variable_expr (gfc_ss * ss, gfc_expr * expr) case DIMEN_ELEMENT: /* Add SS for elemental (scalar) subscripts. */ gcc_assert (ar->start[n]); - indexss = gfc_get_ss (); - indexss->type = GFC_SS_SCALAR; - indexss->expr = ar->start[n]; - indexss->next = gfc_ss_terminator; + indexss = gfc_get_scalar_ss (gfc_ss_terminator, ar->start[n]); indexss->loop_chain = gfc_ss_terminator; newss->data.info.subscript[n] = indexss; break; @@ -7736,7 +7734,6 @@ gfc_walk_op_expr (gfc_ss * ss, gfc_expr * expr) { gfc_ss *head; gfc_ss *head2; - gfc_ss *newss; head = gfc_walk_subexpr (ss, expr->value.op.op1); if (expr->value.op.op2 == NULL) @@ -7754,8 +7751,6 @@ gfc_walk_op_expr (gfc_ss * ss, gfc_expr * expr) /* One of the operands needs scalarization, the other is scalar. Create a gfc_ss for the scalar expression. */ - newss = gfc_get_ss (); - newss->type = GFC_SS_SCALAR; if (head == ss) { /* First operand is scalar. We build the chain in reverse order, so @@ -7765,17 +7760,13 @@ gfc_walk_op_expr (gfc_ss * ss, gfc_expr * expr) head = head->next; /* Check we haven't somehow broken the chain. */ gcc_assert (head); - newss->next = ss; - head->next = newss; - newss->expr = expr->value.op.op1; + head->next = gfc_get_scalar_ss (ss, expr->value.op.op1); } else /* head2 == head */ { gcc_assert (head2 == head); /* Second operand is scalar. */ - newss->next = head2; - head2 = newss; - newss->expr = expr->value.op.op2; + head2 = gfc_get_scalar_ss (head2, expr->value.op.op2); } return head2; @@ -7830,10 +7821,9 @@ gfc_walk_elemental_function_args (gfc_ss * ss, gfc_actual_arglist *arg, if (newss == head) { /* Scalar argument. */ - newss = gfc_get_ss (); + gcc_assert (type == GFC_SS_SCALAR || type == GFC_SS_REFERENCE); + newss = gfc_get_scalar_ss (head, arg->expr); newss->type = type; - newss->expr = arg->expr; - newss->next = head; } else scalar = 0; |