]> gcc.gnu.org Git - gcc.git/commitdiff
Fortran: Add gfc_simple_for_loop aux function
authorTobias Burnus <tobias@codesourcery.com>
Wed, 22 Sep 2021 09:13:28 +0000 (11:13 +0200)
committerTobias Burnus <tobias@codesourcery.com>
Wed, 22 Sep 2021 09:13:28 +0000 (11:13 +0200)
Function to generate a simple loop (to be used internally).
Callers will be added in follow-up commits.

gcc/fortran/
* trans-expr.c (gfc_simple_for_loop): New.
* trans.h (gfc_simple_for_loop): New prototype.

(cherry picked from commit 424a4a463ac5932830a83560cf929f9c2f4564d8)

gcc/ChangeLog.omp
gcc/fortran/trans-expr.c
gcc/fortran/trans.h

index e62ff21c2785ef9bfd87bcfc21a5fcd74622ef36..b5476c750a7f8094dda05921f88b2e55c38ff9e2 100644 (file)
@@ -1,3 +1,11 @@
+2021-09-22  Tobias Burnus  <tobias@codesourcery.com>
+
+       Backported from master:
+       2021-09-22  Tobias Burnus  <tobias@codesourcery.com>
+
+       * trans-expr.c (gfc_simple_for_loop): New.
+       * trans.h (gfc_simple_for_loop): New prototype.
+
 2021-09-22  Tobias Burnus  <tobias@codesourcery.com>
 
        Backported from master:
index ef7989c231ac7d8a9f63a3b548a9306b7ef8d9e1..dfad07ccb2c5a5adc288b2ed57489a206d990169 100644 (file)
@@ -11728,3 +11728,37 @@ gfc_trans_assign (gfc_code * code)
 {
   return gfc_trans_assignment (code->expr1, code->expr2, false, true);
 }
+
+/* Generate a simple loop for internal use of the form
+   for (var = begin; var <cond> end; var += step)
+      body;  */
+void
+gfc_simple_for_loop (stmtblock_t *block, tree var, tree begin, tree end,
+                    enum tree_code cond, tree step, tree body)
+{
+  tree tmp;
+
+  /* var = begin. */
+  gfc_add_modify (block, var, begin);
+
+  /* Loop: for (var = begin; var <cond> end; var += step).  */
+  tree label_loop = gfc_build_label_decl (NULL_TREE);
+  tree label_cond = gfc_build_label_decl (NULL_TREE);
+  TREE_USED (label_loop) = 1;
+  TREE_USED (label_cond) = 1;
+
+  gfc_add_expr_to_block (block, build1_v (GOTO_EXPR, label_cond));
+  gfc_add_expr_to_block (block, build1_v (LABEL_EXPR, label_loop));
+
+  /* Loop body.  */
+  gfc_add_expr_to_block (block, body);
+
+  /* End of loop body.  */
+  tmp = fold_build2_loc (input_location, PLUS_EXPR, TREE_TYPE (var), var, step);
+  gfc_add_modify (block, var, tmp);
+  gfc_add_expr_to_block (block, build1_v (LABEL_EXPR, label_cond));
+  tmp = fold_build2_loc (input_location, cond, boolean_type_node, var, end);
+  tmp = build3_v (COND_EXPR, tmp, build1_v (GOTO_EXPR, label_loop),
+                 build_empty_stmt (input_location));
+  gfc_add_expr_to_block (block, tmp);
+}
index 5a32f1a43a9f7aa343a7df691a41090266837536..604ae20c858f1e1d0be66c9dea3aecbfff20ac59 100644 (file)
@@ -518,6 +518,8 @@ tree gfc_string_to_single_character (tree len, tree str, int kind);
 tree gfc_get_tree_for_caf_expr (gfc_expr *);
 void gfc_get_caf_token_offset (gfc_se*, tree *, tree *, tree, tree, gfc_expr *);
 tree gfc_caf_get_image_index (stmtblock_t *, gfc_expr *, tree);
+void gfc_simple_for_loop (stmtblock_t *, tree, tree, tree, enum tree_code, tree,
+                         tree);
 
 /* Find the decl containing the auxiliary variables for assigned variables.  */
 void gfc_conv_label_variable (gfc_se * se, gfc_expr * expr);
This page took 0.073345 seconds and 5 git commands to generate.