Patchwork [Ada] Small tweak to 'for' loop translation

login
register
mail settings
Submitter Eric Botcazou
Date Dec. 13, 2010, 5:50 p.m.
Message ID <201012131850.35981.ebotcazou@adacore.com>
Download mbox | patch
Permalink /patch/75383/
State New
Headers show

Comments

Eric Botcazou - Dec. 13, 2010, 5:50 p.m.
This avoids generating useless entry tests for 'for' loops in some cases.

Tested on i586-suse-linux, applied on the mainline.


2010-12-13  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/trans.c (can_be_lower_p): New predicate.
	(Loop_Statement_to_gnu): Do not generate the entry condition if we know
	that it will be true.

Patch

Index: gcc-interface/trans.c
===================================================================
--- gcc-interface/trans.c	(revision 167721)
+++ gcc-interface/trans.c	(working copy)
@@ -2130,6 +2130,26 @@  can_equal_max_val_p (tree val, tree type
   return can_equal_min_or_max_val_p (val, type, !reverse);
 }
 
+/* Return true if VAL1 can be lower than VAL2.  */
+
+static bool
+can_be_lower_p (tree val1, tree val2)
+{
+  if (TREE_CODE (val1) == NOP_EXPR)
+    val1 = TYPE_MIN_VALUE (TREE_TYPE (TREE_OPERAND (val1, 0)));
+
+  if (TREE_CODE (val1) != INTEGER_CST)
+    return true;
+
+  if (TREE_CODE (val2) == NOP_EXPR)
+    val2 = TYPE_MAX_VALUE (TREE_TYPE (TREE_OPERAND (val2, 0)));
+
+  if (TREE_CODE (val2) != INTEGER_CST)
+    return true;
+
+  return tree_int_cst_lt (val1, val2);
+}
+
 /* Subroutine of gnat_to_gnu to translate gnat_node, an N_Loop_Statement,
    to a GCC tree, which is returned.  */
 
@@ -2297,16 +2317,19 @@  Loop_Statement_to_gnu (Node_Id gnat_node
 	LOOP_STMT_BOTTOM_COND_P (gnu_loop_stmt) = 1;
 
       /* If we use the BOTTOM_COND, we can turn the test into an inequality
-	 test but we have to add an ENTRY_COND to protect the empty loop.  */
+	 test but we may have to add ENTRY_COND to protect the empty loop.  */
       if (LOOP_STMT_BOTTOM_COND_P (gnu_loop_stmt))
 	{
 	  test_code = NE_EXPR;
-	  gnu_cond_expr
-	    = build3 (COND_EXPR, void_type_node,
-		      build_binary_op (LE_EXPR, boolean_type_node,
-				       gnu_low, gnu_high),
-		      NULL_TREE, alloc_stmt_list ());
-	  set_expr_location_from_node (gnu_cond_expr, gnat_loop_spec);
+	  if (can_be_lower_p (gnu_high, gnu_low))
+	    {
+	      gnu_cond_expr
+		= build3 (COND_EXPR, void_type_node,
+			  build_binary_op (LE_EXPR, boolean_type_node,
+					   gnu_low, gnu_high),
+			  NULL_TREE, alloc_stmt_list ());
+	      set_expr_location_from_node (gnu_cond_expr, gnat_loop_spec);
+	    }
 	}
 
       /* Open a new nesting level that will surround the loop to declare the