[Ada] Fold result of invert_truthvalue

Message ID 201010252129.15993.ebotcazou@adacore.com
State New
Headers show

Commit Message

Eric Botcazou Oct. 25, 2010, 7:29 p.m.
invert_truthvalue doesn't fold the result of comparisons, it only inverts them 
so it is sometimes desirable to call fold afterward.

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

2010-10-25  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/utils2.c: Include flags.h and remove prototypes.
	(build_unary_op) <TRUTH_NOT_EXPR>: When not optimizing, fold the result
	of the call to invert_truthvalue_loc.
	* gcc-interface/Make-lang.in (utils2.o): Add $(FLAGS_H).


Index: gcc-interface/Make-lang.in
--- gcc-interface/Make-lang.in	(revision 165926)
+++ gcc-interface/Make-lang.in	(working copy)
@@ -1264,7 +1264,7 @@  ada/utils.o : ada/gcc-interface/utils.c
 ada/utils2.o : ada/gcc-interface/utils2.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
-   $(TM_H) $(TREE_H) output.h $(TREE_INLINE_H) \
+   $(TM_H) $(TREE_H) $(FLAGS_H) output.h $(TREE_INLINE_H) \
    ada/gcc-interface/ada.h ada/types.h ada/atree.h ada/elists.h ada/namet.h \
    ada/nlists.h ada/snames.h ada/stringt.h ada/uintp.h ada/fe.h ada/sinfo.h \
    ada/einfo.h $(ADA_TREE_H) ada/gcc-interface/gigi.h
Index: gcc-interface/utils2.c
--- gcc-interface/utils2.c	(revision 165926)
+++ gcc-interface/utils2.c	(working copy)
@@ -28,6 +28,7 @@ 
 #include "coretypes.h"
 #include "tm.h"
 #include "tree.h"
+#include "flags.h"
 #include "ggc.h"
 #include "output.h"
 #include "tree-inline.h"
@@ -47,11 +48,6 @@ 
 #include "ada-tree.h"
 #include "gigi.h"
-static tree find_common_type (tree, tree);
-static tree compare_arrays (tree, tree, tree);
-static tree nonbinary_modular_operation (enum tree_code, tree, tree, tree);
-static tree build_simple_component_ref (tree, tree, tree, bool);
 /* Return the base type of TYPE.  */
@@ -1024,6 +1020,11 @@  build_unary_op (enum tree_code op_code,
       gcc_assert (TREE_CODE (get_base_type (result_type)) == BOOLEAN_TYPE);
       result = invert_truthvalue_loc (EXPR_LOCATION (operand), operand);
+      /* When not optimizing, fold the result as invert_truthvalue_loc
+	 doesn't fold the result of comparisons.  This is intended to undo
+	 the trick used for boolean rvalues in gnat_to_gnu.  */
+      if (!optimize)
+	result = fold (result);
     case ATTR_ADDR_EXPR: