[PATCH] Reorganize the conversion stripping macros
Adam Nemet
anemet@caviumnetworks.com
Fri Jun 12 06:51:00 GMT 2009
This is my patch to address Jakub's concerns from here:
http://gcc.gnu.org/ml/gcc-patches/2009-06/msg00885.html
As I said in my response STRIP_USELESS_TYPE_CONVERSION suffers from the same
problem so I'd like to propose this incremental patch on top of my previous
patch to change all three macros.
I didn't remove the macros themselves mainly not to create problems for the
branches before the big merges; I can of course do that if people feel
strongly about it.
Bootstrapped and regtested on x86_64-linux.
OK to install after the previous patch is in?
Adam
* tree.h (STRIP_NOPS, STRIP_SIGN_NOPS,
STRIP_USELESS_TYPE_CONVERSION): Use tree_strip_nop_conversions,
tree_strip_sign_nop_conversions and
tree_ssa_strip_useless_type_conversions rather than stripping
the operations here.
(tree_nop_conversion, tree_sign_nop_conversion): Remove
declarations.
(tree_strip_nop_conversions, tree_strip_sign_nop_conversions):
Declare them.
* gimple.h (tree_ssa_strip_useless_type_conversions): Declare it.
* tree-ssa.c (tree_ssa_strip_useless_type_conversions): New function.
* tree.c (tree_strip_nop_conversions,
tree_strip_sign_nop_conversions): New functions.
(tree_nop_conversion): Make it static and inline.
(tree_sign_nop_conversion): Make it static.
Index: gcc/tree.h
===================================================================
--- gcc.orig/tree.h 2009-06-11 10:35:57.000000000 -0700
+++ gcc/tree.h 2009-06-11 16:31:14.000000000 -0700
@@ -964,18 +964,17 @@ extern void omp_clause_range_check_faile
case NOP_EXPR: \
case CONVERT_EXPR
-/* Given an expression as a tree, strip any conversion that generates no
- instruction. */
+/* Given an expression as a tree, strip any conversion that generates
+ no instruction. Accepts both tree and const_tree arguments since
+ we are not modifying the tree itself. */
-#define STRIP_NOPS(EXP) \
- while (tree_nop_conversion (EXP)) \
- (EXP) = TREE_OPERAND (EXP, 0)
+#define STRIP_NOPS(EXP) \
+ (EXP) = tree_strip_nop_conversions (CONST_CAST_TREE (EXP))
/* Like STRIP_NOPS, but don't let the signedness change either. */
-#define STRIP_SIGN_NOPS(EXP) \
- while (tree_sign_nop_conversion (EXP)) \
- (EXP) = TREE_OPERAND (EXP, 0)
+#define STRIP_SIGN_NOPS(EXP) \
+ (EXP) = tree_strip_sign_nop_conversions (CONST_CAST_TREE (EXP))
/* Like STRIP_NOPS, but don't alter the TREE_TYPE either. */
@@ -990,9 +989,8 @@ extern void omp_clause_range_check_faile
/* Remove unnecessary type conversions according to
tree_ssa_useless_type_conversion. */
-#define STRIP_USELESS_TYPE_CONVERSION(EXP) \
- while (tree_ssa_useless_type_conversion (EXP)) \
- EXP = TREE_OPERAND (EXP, 0)
+#define STRIP_USELESS_TYPE_CONVERSION(EXP) \
+ (EXP) = tree_ssa_strip_useless_type_conversions (EXP)
/* Nonzero if TYPE represents an integral type. Note that we do not
include COMPLEX types here. Keep these checks in ascending code
@@ -4616,8 +4614,8 @@ extern bool stdarg_p (tree);
extern bool prototype_p (tree);
extern bool auto_var_in_fn_p (const_tree, const_tree);
extern tree build_low_bits_mask (tree, unsigned);
-extern bool tree_nop_conversion (const_tree);
-extern bool tree_sign_nop_conversion (const_tree);
+extern tree tree_strip_nop_conversions (tree);
+extern tree tree_strip_sign_nop_conversions (tree);
/* In cgraph.c */
extern void change_decl_assembler_name (tree, tree);
Index: gcc/gimple.h
===================================================================
--- gcc.orig/gimple.h 2009-06-11 10:41:34.000000000 -0700
+++ gcc/gimple.h 2009-06-11 16:15:58.000000000 -0700
@@ -997,6 +997,7 @@ extern bool validate_gimple_arglist (con
/* In tree-ssa.c */
extern bool tree_ssa_useless_type_conversion (tree);
+extern tree tree_ssa_strip_useless_type_conversions (tree);
extern bool useless_type_conversion_p (tree, tree);
extern bool types_compatible_p (tree, tree);
Index: gcc/tree-ssa.c
===================================================================
--- gcc.orig/tree-ssa.c 2009-06-11 10:40:36.000000000 -0700
+++ gcc/tree-ssa.c 2009-06-11 16:20:58.000000000 -0700
@@ -1079,6 +1079,18 @@ tree_ssa_useless_type_conversion (tree e
return false;
}
+/* Strip conversions from EXP according to
+ tree_ssa_useless_type_conversion and return the resulting
+ expression. */
+
+tree
+tree_ssa_strip_useless_type_conversions (tree exp)
+{
+ while (tree_ssa_useless_type_conversion (exp))
+ exp = TREE_OPERAND (exp, 0);
+ return exp;
+}
+
/* Internal helper for walk_use_def_chains. VAR, FN and DATA are as
described in walk_use_def_chains.
Index: gcc/tree.c
===================================================================
--- gcc.orig/tree.c 2009-06-11 10:35:57.000000000 -0700
+++ gcc/tree.c 2009-06-11 17:00:48.000000000 -0700
@@ -9437,9 +9437,11 @@ list_equal_p (const_tree t1, const_tree
return !t1 && !t2;
}
-/* Return true iff conversion in EXP generates no instruction. */
+/* Return true iff conversion in EXP generates no instruction. Mark
+ it inline so that we fully inline into the stripping functions even
+ though we have two uses of this function. */
-bool
+static inline bool
tree_nop_conversion (const_tree exp)
{
tree outer_type, inner_type;
@@ -9497,7 +9499,7 @@ tree_nop_conversion (const_tree exp)
/* Return true iff conversion in EXP generates no instruction. Don't
consider conversions changing the signedness. */
-bool
+static bool
tree_sign_nop_conversion (const_tree exp)
{
tree outer_type, inner_type;
@@ -9512,5 +9514,27 @@ tree_sign_nop_conversion (const_tree exp
&& POINTER_TYPE_P (outer_type) == POINTER_TYPE_P (inner_type));
}
+/* Strip conversions from EXP according to tree_nop_conversion and
+ return the resulting expression. */
+
+tree
+tree_strip_nop_conversions (tree exp)
+{
+ while (tree_nop_conversion (exp))
+ exp = TREE_OPERAND (exp, 0);
+ return exp;
+}
+
+/* Strip conversions from EXP according to tree_sign_nop_conversion
+ and return the resulting expression. */
+
+tree
+tree_strip_sign_nop_conversions (tree exp)
+{
+ while (tree_sign_nop_conversion (exp))
+ exp = TREE_OPERAND (exp, 0);
+ return exp;
+}
+
#include "gt-tree.h"
More information about the Gcc-patches
mailing list