Commit e419fe91 by Roger Sayle Committed by Roger Sayle

fold-const.c (fold_convert): Make function extern/public.


	* fold-const.c (fold_convert): Make function extern/public.
	* tree.h (fold_convert): Prototype here.
	* builtins.c (expand_builtin_strstr, expand_builtin_strchr,
	expand_builtin_strrchr, expand_builtin_strpbrk,
	expand_builtin_mempcpy, expand_builtin_bcopy,
	expand_builtin_bzero, expand_builtin_memcmp,
	expand_builtin_strcmp, expand_builtin_strncmp,
	stabilize_va_list, expand_builtin_sprintf,
	fold_trunc_transparent_mathfn, fold_builtin_logarithm,
	fold_builtin_exponent, fold_builtin_mempcpy,
	fold_builtin_strcpy, fold_builtin_strcmp, fold_builtin_strncmp,
	fold_builtin_signbit, fold_builtin_isdigit, fold_builtin): Prefer
	fold_convert to "convert" or "fold (build1 (NOP_EXPR, ...))".

From-SVN: r80878
parent 60c90ad1
2004-04-19 Roger Sayle <roger@eyesopen.com>
* fold-const.c (fold_convert): Make function extern/public.
* tree.h (fold_convert): Prototype here.
* builtins.c (expand_builtin_strstr, expand_builtin_strchr,
expand_builtin_strrchr, expand_builtin_strpbrk,
expand_builtin_mempcpy, expand_builtin_bcopy,
expand_builtin_bzero, expand_builtin_memcmp,
expand_builtin_strcmp, expand_builtin_strncmp,
stabilize_va_list, expand_builtin_sprintf,
fold_trunc_transparent_mathfn, fold_builtin_logarithm,
fold_builtin_exponent, fold_builtin_mempcpy,
fold_builtin_strcpy, fold_builtin_strcmp, fold_builtin_strncmp,
fold_builtin_signbit, fold_builtin_isdigit, fold_builtin): Prefer
fold_convert to "convert" or "fold (build1 (NOP_EXPR, ...))".
2004-04-19 Aldy Hernandez <aldyh@redhat.com> 2004-04-19 Aldy Hernandez <aldyh@redhat.com>
* config/rs6000/rs6000.md (UNSPEC_MV_CR_GT): New constant. * config/rs6000/rs6000.md (UNSPEC_MV_CR_GT): New constant.
......
...@@ -2339,8 +2339,8 @@ expand_builtin_strstr (tree arglist, rtx target, enum machine_mode mode) ...@@ -2339,8 +2339,8 @@ expand_builtin_strstr (tree arglist, rtx target, enum machine_mode mode)
return const0_rtx; return const0_rtx;
/* Return an offset into the constant string argument. */ /* Return an offset into the constant string argument. */
return expand_expr (fold (build (PLUS_EXPR, TREE_TYPE (s1), return expand_expr (fold (build (PLUS_EXPR, TREE_TYPE (s1), s1,
s1, convert (TREE_TYPE (s1), fold_convert (TREE_TYPE (s1),
ssize_int (r - p1)))), ssize_int (r - p1)))),
target, mode, EXPAND_NORMAL); target, mode, EXPAND_NORMAL);
} }
...@@ -2397,8 +2397,8 @@ expand_builtin_strchr (tree arglist, rtx target, enum machine_mode mode) ...@@ -2397,8 +2397,8 @@ expand_builtin_strchr (tree arglist, rtx target, enum machine_mode mode)
return const0_rtx; return const0_rtx;
/* Return an offset into the constant string argument. */ /* Return an offset into the constant string argument. */
return expand_expr (fold (build (PLUS_EXPR, TREE_TYPE (s1), return expand_expr (fold (build (PLUS_EXPR, TREE_TYPE (s1), s1,
s1, convert (TREE_TYPE (s1), fold_convert (TREE_TYPE (s1),
ssize_int (r - p1)))), ssize_int (r - p1)))),
target, mode, EXPAND_NORMAL); target, mode, EXPAND_NORMAL);
} }
...@@ -2442,8 +2442,8 @@ expand_builtin_strrchr (tree arglist, rtx target, enum machine_mode mode) ...@@ -2442,8 +2442,8 @@ expand_builtin_strrchr (tree arglist, rtx target, enum machine_mode mode)
return const0_rtx; return const0_rtx;
/* Return an offset into the constant string argument. */ /* Return an offset into the constant string argument. */
return expand_expr (fold (build (PLUS_EXPR, TREE_TYPE (s1), return expand_expr (fold (build (PLUS_EXPR, TREE_TYPE (s1), s1,
s1, convert (TREE_TYPE (s1), fold_convert (TREE_TYPE (s1),
ssize_int (r - p1)))), ssize_int (r - p1)))),
target, mode, EXPAND_NORMAL); target, mode, EXPAND_NORMAL);
} }
...@@ -2489,8 +2489,8 @@ expand_builtin_strpbrk (tree arglist, rtx target, enum machine_mode mode) ...@@ -2489,8 +2489,8 @@ expand_builtin_strpbrk (tree arglist, rtx target, enum machine_mode mode)
return const0_rtx; return const0_rtx;
/* Return an offset into the constant string argument. */ /* Return an offset into the constant string argument. */
return expand_expr (fold (build (PLUS_EXPR, TREE_TYPE (s1), return expand_expr (fold (build (PLUS_EXPR, TREE_TYPE (s1), s1,
s1, convert (TREE_TYPE (s1), fold_convert (TREE_TYPE (s1),
ssize_int (r - p1)))), ssize_int (r - p1)))),
target, mode, EXPAND_NORMAL); target, mode, EXPAND_NORMAL);
} }
...@@ -2679,7 +2679,7 @@ expand_builtin_mempcpy (tree arglist, rtx target, enum machine_mode mode, ...@@ -2679,7 +2679,7 @@ expand_builtin_mempcpy (tree arglist, rtx target, enum machine_mode mode,
if (endp == 2) if (endp == 2)
len = fold (build (MINUS_EXPR, TREE_TYPE (len), dest, len = fold (build (MINUS_EXPR, TREE_TYPE (len), dest,
integer_one_node)); integer_one_node));
len = convert (TREE_TYPE (dest), len); len = fold_convert (TREE_TYPE (dest), len);
expr = fold (build (PLUS_EXPR, TREE_TYPE (dest), dest, len)); expr = fold (build (PLUS_EXPR, TREE_TYPE (dest), dest, len));
return expand_expr (expr, target, mode, EXPAND_NORMAL); return expand_expr (expr, target, mode, EXPAND_NORMAL);
} }
...@@ -2823,7 +2823,7 @@ expand_builtin_bcopy (tree arglist) ...@@ -2823,7 +2823,7 @@ expand_builtin_bcopy (tree arglist)
so that if it isn't expanded inline, we fallback to so that if it isn't expanded inline, we fallback to
calling bcopy instead of memmove. */ calling bcopy instead of memmove. */
newarglist = build_tree_list (NULL_TREE, convert (sizetype, size)); newarglist = build_tree_list (NULL_TREE, fold_convert (sizetype, size));
newarglist = tree_cons (NULL_TREE, src, newarglist); newarglist = tree_cons (NULL_TREE, src, newarglist);
newarglist = tree_cons (NULL_TREE, dest, newarglist); newarglist = tree_cons (NULL_TREE, dest, newarglist);
...@@ -3161,7 +3161,7 @@ expand_builtin_bzero (tree arglist) ...@@ -3161,7 +3161,7 @@ expand_builtin_bzero (tree arglist)
so that if it isn't expanded inline, we fallback to so that if it isn't expanded inline, we fallback to
calling bzero instead of memset. */ calling bzero instead of memset. */
newarglist = build_tree_list (NULL_TREE, convert (sizetype, size)); newarglist = build_tree_list (NULL_TREE, fold_convert (sizetype, size));
newarglist = tree_cons (NULL_TREE, integer_zero_node, newarglist); newarglist = tree_cons (NULL_TREE, integer_zero_node, newarglist);
newarglist = tree_cons (NULL_TREE, dest, newarglist); newarglist = tree_cons (NULL_TREE, dest, newarglist);
...@@ -3229,11 +3229,11 @@ expand_builtin_memcmp (tree exp ATTRIBUTE_UNUSED, tree arglist, rtx target, ...@@ -3229,11 +3229,11 @@ expand_builtin_memcmp (tree exp ATTRIBUTE_UNUSED, tree arglist, rtx target,
tree ind1 = tree ind1 =
fold (build1 (CONVERT_EXPR, integer_type_node, fold (build1 (CONVERT_EXPR, integer_type_node,
build1 (INDIRECT_REF, cst_uchar_node, build1 (INDIRECT_REF, cst_uchar_node,
build1 (NOP_EXPR, cst_uchar_ptr_node, arg1)))); fold_convert (cst_uchar_ptr_node, arg1))));
tree ind2 = tree ind2 =
fold (build1 (CONVERT_EXPR, integer_type_node, fold (build1 (CONVERT_EXPR, integer_type_node,
build1 (INDIRECT_REF, cst_uchar_node, build1 (INDIRECT_REF, cst_uchar_node,
build1 (NOP_EXPR, cst_uchar_ptr_node, arg2)))); fold_convert (cst_uchar_ptr_node, arg2))));
tree result = fold (build (MINUS_EXPR, integer_type_node, ind1, ind2)); tree result = fold (build (MINUS_EXPR, integer_type_node, ind1, ind2));
return expand_expr (result, target, mode, EXPAND_NORMAL); return expand_expr (result, target, mode, EXPAND_NORMAL);
} }
...@@ -3357,11 +3357,11 @@ expand_builtin_strcmp (tree exp, rtx target, enum machine_mode mode) ...@@ -3357,11 +3357,11 @@ expand_builtin_strcmp (tree exp, rtx target, enum machine_mode mode)
tree ind1 = tree ind1 =
fold (build1 (CONVERT_EXPR, integer_type_node, fold (build1 (CONVERT_EXPR, integer_type_node,
build1 (INDIRECT_REF, cst_uchar_node, build1 (INDIRECT_REF, cst_uchar_node,
build1 (NOP_EXPR, cst_uchar_ptr_node, arg1)))); fold_convert (cst_uchar_ptr_node, arg1))));
tree ind2 = tree ind2 =
fold (build1 (CONVERT_EXPR, integer_type_node, fold (build1 (CONVERT_EXPR, integer_type_node,
build1 (INDIRECT_REF, cst_uchar_node, build1 (INDIRECT_REF, cst_uchar_node,
build1 (NOP_EXPR, cst_uchar_ptr_node, arg2)))); fold_convert (cst_uchar_ptr_node, arg2))));
tree result = fold (build (MINUS_EXPR, integer_type_node, ind1, ind2)); tree result = fold (build (MINUS_EXPR, integer_type_node, ind1, ind2));
return expand_expr (result, target, mode, EXPAND_NORMAL); return expand_expr (result, target, mode, EXPAND_NORMAL);
} }
...@@ -3522,11 +3522,11 @@ expand_builtin_strncmp (tree exp, rtx target, enum machine_mode mode) ...@@ -3522,11 +3522,11 @@ expand_builtin_strncmp (tree exp, rtx target, enum machine_mode mode)
tree ind1 = tree ind1 =
fold (build1 (CONVERT_EXPR, integer_type_node, fold (build1 (CONVERT_EXPR, integer_type_node,
build1 (INDIRECT_REF, cst_uchar_node, build1 (INDIRECT_REF, cst_uchar_node,
build1 (NOP_EXPR, cst_uchar_ptr_node, arg1)))); fold_convert (cst_uchar_ptr_node, arg1))));
tree ind2 = tree ind2 =
fold (build1 (CONVERT_EXPR, integer_type_node, fold (build1 (CONVERT_EXPR, integer_type_node,
build1 (INDIRECT_REF, cst_uchar_node, build1 (INDIRECT_REF, cst_uchar_node,
build1 (NOP_EXPR, cst_uchar_ptr_node, arg2)))); fold_convert (cst_uchar_ptr_node, arg2))));
tree result = fold (build (MINUS_EXPR, integer_type_node, ind1, ind2)); tree result = fold (build (MINUS_EXPR, integer_type_node, ind1, ind2));
return expand_expr (result, target, mode, EXPAND_NORMAL); return expand_expr (result, target, mode, EXPAND_NORMAL);
} }
...@@ -3967,7 +3967,7 @@ stabilize_va_list (tree valist, int needs_lvalue) ...@@ -3967,7 +3967,7 @@ stabilize_va_list (tree valist, int needs_lvalue)
tree p2 = build_pointer_type (va_list_type_node); tree p2 = build_pointer_type (va_list_type_node);
valist = build1 (ADDR_EXPR, p2, valist); valist = build1 (ADDR_EXPR, p2, valist);
valist = fold (build1 (NOP_EXPR, p1, valist)); valist = fold_convert (p1, valist);
} }
} }
else else
...@@ -4942,7 +4942,7 @@ expand_builtin_sprintf (tree arglist, rtx target, enum machine_mode mode) ...@@ -4942,7 +4942,7 @@ expand_builtin_sprintf (tree arglist, rtx target, enum machine_mode mode)
if (target == const0_rtx) if (target == const0_rtx)
return const0_rtx; return const0_rtx;
exp = build_int_2 (strlen (fmt_str), 0); exp = build_int_2 (strlen (fmt_str), 0);
exp = fold (build1 (NOP_EXPR, integer_type_node, exp)); exp = fold_convert (integer_type_node, exp);
return expand_expr (exp, target, mode, EXPAND_NORMAL); return expand_expr (exp, target, mode, EXPAND_NORMAL);
} }
/* If the format is "%s", use strcpy if the result isn't used. */ /* If the format is "%s", use strcpy if the result isn't used. */
...@@ -5931,8 +5931,8 @@ fold_trunc_transparent_mathfn (tree exp) ...@@ -5931,8 +5931,8 @@ fold_trunc_transparent_mathfn (tree exp)
&& (decl = mathfn_built_in (newtype, fcode))) && (decl = mathfn_built_in (newtype, fcode)))
{ {
arglist = arglist =
build_tree_list (NULL_TREE, fold (convert (newtype, arg0))); build_tree_list (NULL_TREE, fold_convert (newtype, arg0));
return convert (ftype, return fold_convert (ftype,
build_function_call_expr (decl, arglist)); build_function_call_expr (decl, arglist));
} }
} }
...@@ -6303,7 +6303,7 @@ fold_builtin_logarithm (tree exp, const REAL_VALUE_TYPE *value) ...@@ -6303,7 +6303,7 @@ fold_builtin_logarithm (tree exp, const REAL_VALUE_TYPE *value)
|| fcode == BUILT_IN_EXP2F || fcode == BUILT_IN_EXP2F
|| fcode == BUILT_IN_EXP2L)) || fcode == BUILT_IN_EXP2L))
|| (value == &dconst10 && (BUILTIN_EXP10_P (fcode))))) || (value == &dconst10 && (BUILTIN_EXP10_P (fcode)))))
return convert (type, TREE_VALUE (TREE_OPERAND (arg, 1))); return fold_convert (type, TREE_VALUE (TREE_OPERAND (arg, 1)));
/* Optimize logN(func()) for various exponential functions. We /* Optimize logN(func()) for various exponential functions. We
want to determine the value "x" and the power "exponent" in want to determine the value "x" and the power "exponent" in
...@@ -6446,7 +6446,7 @@ fold_builtin_exponent (tree exp, const REAL_VALUE_TYPE *value) ...@@ -6446,7 +6446,7 @@ fold_builtin_exponent (tree exp, const REAL_VALUE_TYPE *value)
&& (fcode == BUILT_IN_LOG10 && (fcode == BUILT_IN_LOG10
|| fcode == BUILT_IN_LOG10F || fcode == BUILT_IN_LOG10F
|| fcode == BUILT_IN_LOG10L))) || fcode == BUILT_IN_LOG10L)))
return convert (type, TREE_VALUE (TREE_OPERAND (arg, 1))); return fold_convert (type, TREE_VALUE (TREE_OPERAND (arg, 1)));
} }
} }
...@@ -6505,9 +6505,9 @@ fold_builtin_mempcpy (tree exp) ...@@ -6505,9 +6505,9 @@ fold_builtin_mempcpy (tree exp)
/* If SRC and DEST are the same (and not volatile), return DEST+LEN. */ /* If SRC and DEST are the same (and not volatile), return DEST+LEN. */
if (operand_equal_p (src, dest, 0)) if (operand_equal_p (src, dest, 0))
{ {
tree temp = convert (TREE_TYPE (dest), len); tree temp = fold_convert (TREE_TYPE (dest), len);
temp = fold (build (PLUS_EXPR, TREE_TYPE (dest), dest, len)); temp = fold (build (PLUS_EXPR, TREE_TYPE (dest), dest, temp));
return convert (TREE_TYPE (exp), temp); return fold_convert (TREE_TYPE (exp), temp);
} }
return 0; return 0;
...@@ -6559,7 +6559,7 @@ fold_builtin_strcpy (tree exp) ...@@ -6559,7 +6559,7 @@ fold_builtin_strcpy (tree exp)
/* If SRC and DEST are the same (and not volatile), return DEST. */ /* If SRC and DEST are the same (and not volatile), return DEST. */
if (operand_equal_p (src, dest, 0)) if (operand_equal_p (src, dest, 0))
return convert (TREE_TYPE (exp), dest); return fold_convert (TREE_TYPE (exp), dest);
return 0; return 0;
} }
...@@ -6638,7 +6638,7 @@ fold_builtin_strcmp (tree exp) ...@@ -6638,7 +6638,7 @@ fold_builtin_strcmp (tree exp)
/* If ARG1 and ARG2 are the same (and not volatile), return zero. */ /* If ARG1 and ARG2 are the same (and not volatile), return zero. */
if (operand_equal_p (arg1, arg2, 0)) if (operand_equal_p (arg1, arg2, 0))
return convert (TREE_TYPE (exp), integer_zero_node); return fold_convert (TREE_TYPE (exp), integer_zero_node);
p1 = c_getstr (arg1); p1 = c_getstr (arg1);
p2 = c_getstr (arg2); p2 = c_getstr (arg2);
...@@ -6653,7 +6653,7 @@ fold_builtin_strcmp (tree exp) ...@@ -6653,7 +6653,7 @@ fold_builtin_strcmp (tree exp)
temp = integer_one_node; temp = integer_one_node;
else else
temp = integer_zero_node; temp = integer_zero_node;
return convert (TREE_TYPE (exp), temp); return fold_convert (TREE_TYPE (exp), temp);
} }
return 0; return 0;
...@@ -6701,7 +6701,7 @@ fold_builtin_strncmp (tree exp) ...@@ -6701,7 +6701,7 @@ fold_builtin_strncmp (tree exp)
temp = integer_one_node; temp = integer_one_node;
else else
temp = integer_zero_node; temp = integer_zero_node;
return convert (TREE_TYPE (exp), temp); return fold_convert (TREE_TYPE (exp), temp);
} }
return 0; return 0;
...@@ -6729,7 +6729,7 @@ fold_builtin_signbit (tree exp) ...@@ -6729,7 +6729,7 @@ fold_builtin_signbit (tree exp)
c = TREE_REAL_CST (arg); c = TREE_REAL_CST (arg);
temp = REAL_VALUE_NEGATIVE (c) ? integer_one_node : integer_zero_node; temp = REAL_VALUE_NEGATIVE (c) ? integer_one_node : integer_zero_node;
return convert (TREE_TYPE (exp), temp); return fold_convert (TREE_TYPE (exp), temp);
} }
/* If ARG is non-negative, the result is always zero. */ /* If ARG is non-negative, the result is always zero. */
...@@ -6793,13 +6793,12 @@ fold_builtin_isdigit (tree arglist) ...@@ -6793,13 +6793,12 @@ fold_builtin_isdigit (tree arglist)
/* Transform isdigit(c) -> (unsigned)(c) - '0' <= 9. */ /* Transform isdigit(c) -> (unsigned)(c) - '0' <= 9. */
/* According to the C standard, isdigit is unaffected by locale. */ /* According to the C standard, isdigit is unaffected by locale. */
tree arg = TREE_VALUE (arglist); tree arg = TREE_VALUE (arglist);
arg = build1 (NOP_EXPR, unsigned_type_node, arg); arg = fold_convert (unsigned_type_node, arg);
arg = build (MINUS_EXPR, unsigned_type_node, arg, arg = build (MINUS_EXPR, unsigned_type_node, arg,
fold (build1 (NOP_EXPR, unsigned_type_node, fold_convert (unsigned_type_node,
build_int_2 (TARGET_DIGIT0, 0)))); build_int_2 (TARGET_DIGIT0, 0)));
arg = build (LE_EXPR, integer_type_node, arg, arg = build (LE_EXPR, integer_type_node, arg,
fold (build1 (NOP_EXPR, unsigned_type_node, fold_convert (unsigned_type_node, build_int_2 (9, 0)));
build_int_2 (9, 0))));
return fold (arg); return fold (arg);
} }
} }
...@@ -6833,7 +6832,7 @@ fold_builtin (tree exp) ...@@ -6833,7 +6832,7 @@ fold_builtin (tree exp)
{ {
/* Convert from the internal "sizetype" type to "size_t". */ /* Convert from the internal "sizetype" type to "size_t". */
if (size_type_node) if (size_type_node)
len = convert (size_type_node, len); len = fold_convert (size_type_node, len);
return len; return len;
} }
} }
......
...@@ -70,7 +70,6 @@ static tree const_binop (enum tree_code, tree, tree, int); ...@@ -70,7 +70,6 @@ static tree const_binop (enum tree_code, tree, tree, int);
static hashval_t size_htab_hash (const void *); static hashval_t size_htab_hash (const void *);
static int size_htab_eq (const void *, const void *); static int size_htab_eq (const void *, const void *);
static tree fold_convert_const (enum tree_code, tree, tree); static tree fold_convert_const (enum tree_code, tree, tree);
static tree fold_convert (tree, tree);
static enum tree_code invert_tree_comparison (enum tree_code); static enum tree_code invert_tree_comparison (enum tree_code);
static enum tree_code swap_tree_comparison (enum tree_code); static enum tree_code swap_tree_comparison (enum tree_code);
static int comparison_to_compcode (enum tree_code); static int comparison_to_compcode (enum tree_code);
...@@ -1875,7 +1874,7 @@ fold_convert_const (enum tree_code code, tree type, tree arg1) ...@@ -1875,7 +1874,7 @@ fold_convert_const (enum tree_code code, tree type, tree arg1)
/* Convert expression ARG to type TYPE. Used by the middle-end for /* Convert expression ARG to type TYPE. Used by the middle-end for
simple conversions in preference to calling the front-end's convert. */ simple conversions in preference to calling the front-end's convert. */
static tree tree
fold_convert (tree type, tree arg) fold_convert (tree type, tree arg)
{ {
tree orig = TREE_TYPE (arg); tree orig = TREE_TYPE (arg);
......
...@@ -2940,6 +2940,7 @@ extern void using_eh_for_cleanups (void); ...@@ -2940,6 +2940,7 @@ extern void using_eh_for_cleanups (void);
extern tree fold (tree); extern tree fold (tree);
extern tree fold_initializer (tree); extern tree fold_initializer (tree);
extern tree fold_convert (tree, tree);
extern tree fold_single_bit_test (enum tree_code, tree, tree, tree); extern tree fold_single_bit_test (enum tree_code, tree, tree, tree);
extern int force_fit_type (tree, int); extern int force_fit_type (tree, int);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment