Commit d6dc556b by Roger Sayle Committed by Roger Sayle

builtins.c (expand_builtin_strstr, [...]): Replace calls to build with calls to…

builtins.c (expand_builtin_strstr, [...]): Replace calls to build with calls to build2, build3 or omit_one_operand.


	* builtins.c (expand_builtin_strstr, expand_builtin_strchr,
	expand_builtin_strrchr, expand_builtin_strpbrk,
	expand_builtin_mempcpy, expand_builtin_memcmp,
	expand_builtin_strcmp, expand_builtin_strncmp,
	expand_builtin_strcat, std_expand_builtin_va_start,
	std_expand_builtin_va_arg, expand_builtin_va_copy,
	expand_builtin_signbit, fold_builtin_cabs,
	fold_builtin_logarithm, fold_builtin_mempcpy,
	fold_builtin_signbit, fold_builtin_isascii,
	fold_builtin_toascii, fold_builtin_isdigit,
	fold_builtin_1, build_function_call_expr,
	simplify_builtin_strchr, simplify_builtin_strrchr,
	simplify_builtin_strpbrk, simplify_builtin_strncpy,
	simplify_builtin_memcmp, simplify_builtin_strcmp,
	simplify_builtin_strncmp, simplify_builtin_strncat,
	simplify_builtin_strspn, simplify_builtin_strcspn,
	simplify_builtin_fputs, simplify_builtin_sprintf): Replace calls
	to build with calls to build2, build3 or omit_one_operand.

From-SVN: r82151
parent f4a1faa5
2004-05-22 Roger Sayle <roger@eyesopen.com>
* builtins.c (expand_builtin_strstr, expand_builtin_strchr,
expand_builtin_strrchr, expand_builtin_strpbrk,
expand_builtin_mempcpy, expand_builtin_memcmp,
expand_builtin_strcmp, expand_builtin_strncmp,
expand_builtin_strcat, std_expand_builtin_va_start,
std_expand_builtin_va_arg, expand_builtin_va_copy,
expand_builtin_signbit, fold_builtin_cabs,
fold_builtin_logarithm, fold_builtin_mempcpy,
fold_builtin_signbit, fold_builtin_isascii,
fold_builtin_toascii, fold_builtin_isdigit,
fold_builtin_1, build_function_call_expr,
simplify_builtin_strchr, simplify_builtin_strrchr,
simplify_builtin_strpbrk, simplify_builtin_strncpy,
simplify_builtin_memcmp, simplify_builtin_strcmp,
simplify_builtin_strncmp, simplify_builtin_strncat,
simplify_builtin_strspn, simplify_builtin_strcspn,
simplify_builtin_fputs, simplify_builtin_sprintf): Replace calls
to build with calls to build2, build3 or omit_one_operand.
2004-05-22 Richard Sandiford <rsandifo@redhat.com> 2004-05-22 Richard Sandiford <rsandifo@redhat.com>
* config/mips/mips.c (mips_file_start): Emit a .gcc_compiled_longXX * config/mips/mips.c (mips_file_start): Emit a .gcc_compiled_longXX
......
...@@ -2458,7 +2458,7 @@ expand_builtin_strstr (tree arglist, rtx target, enum machine_mode mode) ...@@ -2458,7 +2458,7 @@ expand_builtin_strstr (tree arglist, rtx target, enum machine_mode mode)
else else
{ {
tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist)); tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
tree fn; tree fn, tmp;
const char *p1, *p2; const char *p1, *p2;
p2 = c_getstr (s2); p2 = c_getstr (s2);
...@@ -2474,10 +2474,10 @@ expand_builtin_strstr (tree arglist, rtx target, enum machine_mode mode) ...@@ -2474,10 +2474,10 @@ 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), s1, tmp = fold (build2 (PLUS_EXPR, TREE_TYPE (s1), s1,
fold_convert (TREE_TYPE (s1), fold_convert (TREE_TYPE (s1),
ssize_int (r - p1)))), ssize_int (r - p1))));
target, mode, EXPAND_NORMAL); return expand_expr (tmp, target, mode, EXPAND_NORMAL);
} }
if (p2[0] == '\0') if (p2[0] == '\0')
...@@ -2522,6 +2522,7 @@ expand_builtin_strchr (tree arglist, rtx target, enum machine_mode mode) ...@@ -2522,6 +2522,7 @@ expand_builtin_strchr (tree arglist, rtx target, enum machine_mode mode)
{ {
char c; char c;
const char *r; const char *r;
tree tmp;
if (target_char_cast (s2, &c)) if (target_char_cast (s2, &c))
return 0; return 0;
...@@ -2532,10 +2533,10 @@ expand_builtin_strchr (tree arglist, rtx target, enum machine_mode mode) ...@@ -2532,10 +2533,10 @@ 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), s1, tmp = fold (build2 (PLUS_EXPR, TREE_TYPE (s1), s1,
fold_convert (TREE_TYPE (s1), fold_convert (TREE_TYPE (s1),
ssize_int (r - p1)))), ssize_int (r - p1))));
target, mode, EXPAND_NORMAL); return expand_expr (tmp, target, mode, EXPAND_NORMAL);
} }
/* FIXME: Should use here strchrM optab so that ports can optimize /* FIXME: Should use here strchrM optab so that ports can optimize
...@@ -2556,7 +2557,7 @@ expand_builtin_strrchr (tree arglist, rtx target, enum machine_mode mode) ...@@ -2556,7 +2557,7 @@ expand_builtin_strrchr (tree arglist, rtx target, enum machine_mode mode)
else else
{ {
tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist)); tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
tree fn; tree fn, tmp;
const char *p1; const char *p1;
if (TREE_CODE (s2) != INTEGER_CST) if (TREE_CODE (s2) != INTEGER_CST)
...@@ -2577,10 +2578,10 @@ expand_builtin_strrchr (tree arglist, rtx target, enum machine_mode mode) ...@@ -2577,10 +2578,10 @@ 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), s1, tmp = fold (build2 (PLUS_EXPR, TREE_TYPE (s1), s1,
fold_convert (TREE_TYPE (s1), fold_convert (TREE_TYPE (s1),
ssize_int (r - p1)))), ssize_int (r - p1))));
target, mode, EXPAND_NORMAL); return expand_expr (tmp, target, mode, EXPAND_NORMAL);
} }
if (! integer_zerop (s2)) if (! integer_zerop (s2))
...@@ -2608,7 +2609,7 @@ expand_builtin_strpbrk (tree arglist, rtx target, enum machine_mode mode) ...@@ -2608,7 +2609,7 @@ expand_builtin_strpbrk (tree arglist, rtx target, enum machine_mode mode)
else else
{ {
tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist)); tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
tree fn; tree fn, tmp;
const char *p1, *p2; const char *p1, *p2;
p2 = c_getstr (s2); p2 = c_getstr (s2);
...@@ -2624,10 +2625,10 @@ expand_builtin_strpbrk (tree arglist, rtx target, enum machine_mode mode) ...@@ -2624,10 +2625,10 @@ 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), s1, tmp = fold (build2 (PLUS_EXPR, TREE_TYPE (s1), s1,
fold_convert (TREE_TYPE (s1), fold_convert (TREE_TYPE (s1),
ssize_int (r - p1)))), ssize_int (r - p1))));
target, mode, EXPAND_NORMAL); return expand_expr (tmp, target, mode, EXPAND_NORMAL);
} }
if (p2[0] == '\0') if (p2[0] == '\0')
...@@ -2812,10 +2813,10 @@ expand_builtin_mempcpy (tree arglist, rtx target, enum machine_mode mode, ...@@ -2812,10 +2813,10 @@ 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 (build2 (MINUS_EXPR, TREE_TYPE (len), len,
integer_one_node)); integer_one_node));
len = fold_convert (TREE_TYPE (dest), len); len = fold_convert (TREE_TYPE (dest), len);
expr = fold (build (PLUS_EXPR, TREE_TYPE (dest), dest, len)); expr = fold (build2 (PLUS_EXPR, TREE_TYPE (dest), dest, len));
return expand_expr (expr, target, mode, EXPAND_NORMAL); return expand_expr (expr, target, mode, EXPAND_NORMAL);
} }
...@@ -3369,7 +3370,7 @@ expand_builtin_memcmp (tree exp ATTRIBUTE_UNUSED, tree arglist, rtx target, ...@@ -3369,7 +3370,7 @@ expand_builtin_memcmp (tree exp ATTRIBUTE_UNUSED, tree arglist, rtx target,
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,
fold_convert (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 (build2 (MINUS_EXPR, integer_type_node, ind1, ind2));
return expand_expr (result, target, mode, EXPAND_NORMAL); return expand_expr (result, target, mode, EXPAND_NORMAL);
} }
...@@ -3497,7 +3498,7 @@ expand_builtin_strcmp (tree exp, rtx target, enum machine_mode mode) ...@@ -3497,7 +3498,7 @@ expand_builtin_strcmp (tree exp, rtx target, enum machine_mode mode)
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,
fold_convert (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 (build2 (MINUS_EXPR, integer_type_node, ind1, ind2));
return expand_expr (result, target, mode, EXPAND_NORMAL); return expand_expr (result, target, mode, EXPAND_NORMAL);
} }
...@@ -3662,7 +3663,7 @@ expand_builtin_strncmp (tree exp, rtx target, enum machine_mode mode) ...@@ -3662,7 +3663,7 @@ expand_builtin_strncmp (tree exp, rtx target, enum machine_mode mode)
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,
fold_convert (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 (build2 (MINUS_EXPR, integer_type_node, ind1, ind2));
return expand_expr (result, target, mode, EXPAND_NORMAL); return expand_expr (result, target, mode, EXPAND_NORMAL);
} }
...@@ -3721,7 +3722,7 @@ expand_builtin_strncmp (tree exp, rtx target, enum machine_mode mode) ...@@ -3721,7 +3722,7 @@ expand_builtin_strncmp (tree exp, rtx target, enum machine_mode mode)
return 0; return 0;
/* The actual new length parameter is MIN(len,arg3). */ /* The actual new length parameter is MIN(len,arg3). */
len = fold (build (MIN_EXPR, TREE_TYPE (len), len, arg3)); len = fold (build2 (MIN_EXPR, TREE_TYPE (len), len, arg3));
/* If we don't have POINTER_TYPE, call the function. */ /* If we don't have POINTER_TYPE, call the function. */
if (arg1_align == 0 || arg2_align == 0) if (arg1_align == 0 || arg2_align == 0)
...@@ -3815,7 +3816,7 @@ expand_builtin_strcat (tree arglist, rtx target, enum machine_mode mode) ...@@ -3815,7 +3816,7 @@ expand_builtin_strcat (tree arglist, rtx target, enum machine_mode mode)
build_tree_list (NULL_TREE, build_tree_list (NULL_TREE,
dst))); dst)));
/* Create (dst + strlen (dst)). */ /* Create (dst + strlen (dst)). */
newdst = fold (build (PLUS_EXPR, TREE_TYPE (dst), dst, newdst)); newdst = fold (build2 (PLUS_EXPR, TREE_TYPE (dst), dst, newdst));
/* Prepend the new dst argument. */ /* Prepend the new dst argument. */
arglist = tree_cons (NULL_TREE, newdst, arglist); arglist = tree_cons (NULL_TREE, newdst, arglist);
...@@ -4144,8 +4145,8 @@ std_expand_builtin_va_start (tree valist, rtx nextarg) ...@@ -4144,8 +4145,8 @@ std_expand_builtin_va_start (tree valist, rtx nextarg)
{ {
tree t; tree t;
t = build (MODIFY_EXPR, TREE_TYPE (valist), valist, t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist,
make_tree (ptr_type_node, nextarg)); make_tree (ptr_type_node, nextarg));
TREE_SIDE_EFFECTS (t) = 1; TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
...@@ -4200,15 +4201,15 @@ std_expand_builtin_va_arg (tree valist, tree type) ...@@ -4200,15 +4201,15 @@ std_expand_builtin_va_arg (tree valist, tree type)
{ {
if (!PAD_VARARGS_DOWN) if (!PAD_VARARGS_DOWN)
{ {
t = build (MODIFY_EXPR, TREE_TYPE (valist), valist, t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist,
build (PLUS_EXPR, TREE_TYPE (valist), valist, build2 (PLUS_EXPR, TREE_TYPE (valist), valist,
build_int_2 (boundary / BITS_PER_UNIT - 1, 0))); build_int_2 (boundary / BITS_PER_UNIT - 1, 0)));
TREE_SIDE_EFFECTS (t) = 1; TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
} }
t = build (MODIFY_EXPR, TREE_TYPE (valist), valist, t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist,
build (BIT_AND_EXPR, TREE_TYPE (valist), valist, build2 (BIT_AND_EXPR, TREE_TYPE (valist), valist,
build_int_2 (~(boundary / BITS_PER_UNIT - 1), -1))); build_int_2 (~(boundary / BITS_PER_UNIT - 1), -1)));
TREE_SIDE_EFFECTS (t) = 1; TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
} }
...@@ -4217,27 +4218,29 @@ std_expand_builtin_va_arg (tree valist, tree type) ...@@ -4217,27 +4218,29 @@ std_expand_builtin_va_arg (tree valist, tree type)
|| TREE_OVERFLOW (type_size)) || TREE_OVERFLOW (type_size))
rounded_size = size_zero_node; rounded_size = size_zero_node;
else else
rounded_size = fold (build (MULT_EXPR, sizetype, {
fold (build (TRUNC_DIV_EXPR, sizetype, rounded_size = fold (build2 (PLUS_EXPR, sizetype, type_size, alignm1));
fold (build (PLUS_EXPR, sizetype, rounded_size = fold (build2 (TRUNC_DIV_EXPR, sizetype,
type_size, alignm1)), rounded_size, align));
align)), rounded_size = fold (build2 (MULT_EXPR, sizetype,
align)); rounded_size, align));
}
/* Get AP. */ /* Get AP. */
addr_tree = valist; addr_tree = valist;
if (PAD_VARARGS_DOWN && ! integer_zerop (rounded_size)) if (PAD_VARARGS_DOWN && ! integer_zerop (rounded_size))
{ {
/* Small args are padded downward. */ /* Small args are padded downward. */
addr_tree = fold (build (PLUS_EXPR, TREE_TYPE (addr_tree), addr_tree, addr_tree = fold (build2 (PLUS_EXPR, TREE_TYPE (addr_tree), addr_tree,
fold (build (COND_EXPR, sizetype, fold (build3 (COND_EXPR, sizetype,
fold (build (GT_EXPR, sizetype, fold (build2 (GT_EXPR, sizetype,
rounded_size, rounded_size,
align)), align)),
size_zero_node, size_zero_node,
fold (build (MINUS_EXPR, sizetype, fold (build2 (MINUS_EXPR,
rounded_size, sizetype,
type_size)))))); rounded_size,
type_size))))));
} }
addr = expand_expr (addr_tree, NULL_RTX, Pmode, EXPAND_NORMAL); addr = expand_expr (addr_tree, NULL_RTX, Pmode, EXPAND_NORMAL);
...@@ -4246,9 +4249,9 @@ std_expand_builtin_va_arg (tree valist, tree type) ...@@ -4246,9 +4249,9 @@ std_expand_builtin_va_arg (tree valist, tree type)
/* Compute new value for AP. */ /* Compute new value for AP. */
if (! integer_zerop (rounded_size)) if (! integer_zerop (rounded_size))
{ {
t = build (MODIFY_EXPR, TREE_TYPE (valist), valist, t = build2 (MODIFY_EXPR, TREE_TYPE (valist), valist,
build (PLUS_EXPR, TREE_TYPE (valist), valist, build2 (PLUS_EXPR, TREE_TYPE (valist), valist,
rounded_size)); rounded_size));
TREE_SIDE_EFFECTS (t) = 1; TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
} }
...@@ -4387,7 +4390,7 @@ expand_builtin_va_copy (tree arglist) ...@@ -4387,7 +4390,7 @@ expand_builtin_va_copy (tree arglist)
if (TREE_CODE (va_list_type_node) != ARRAY_TYPE) if (TREE_CODE (va_list_type_node) != ARRAY_TYPE)
{ {
t = build (MODIFY_EXPR, va_list_type_node, dst, src); t = build2 (MODIFY_EXPR, va_list_type_node, dst, src);
TREE_SIDE_EFFECTS (t) = 1; TREE_SIDE_EFFECTS (t) = 1;
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
} }
...@@ -5261,8 +5264,8 @@ expand_builtin_signbit (tree exp, rtx target) ...@@ -5261,8 +5264,8 @@ expand_builtin_signbit (tree exp, rtx target)
if (fmt->has_signed_zero && HONOR_SIGNED_ZEROS (fmode)) if (fmt->has_signed_zero && HONOR_SIGNED_ZEROS (fmode))
return 0; return 0;
arg = fold (build (LT_EXPR, TREE_TYPE (exp), arg, arg = fold (build2 (LT_EXPR, TREE_TYPE (exp), arg,
build_real (TREE_TYPE (arg), dconst0))); build_real (TREE_TYPE (arg), dconst0)));
return expand_expr (arg, target, VOIDmode, EXPAND_NORMAL); return expand_expr (arg, target, VOIDmode, EXPAND_NORMAL);
} }
...@@ -6458,11 +6461,11 @@ fold_builtin_cabs (tree arglist, tree type) ...@@ -6458,11 +6461,11 @@ fold_builtin_cabs (tree arglist, tree type)
rpart = builtin_save_expr (rpart); rpart = builtin_save_expr (rpart);
ipart = builtin_save_expr (ipart); ipart = builtin_save_expr (ipart);
result = fold (build (PLUS_EXPR, type, result = fold (build2 (PLUS_EXPR, type,
fold (build (MULT_EXPR, type, fold (build2 (MULT_EXPR, type,
rpart, rpart)), rpart, rpart)),
fold (build (MULT_EXPR, type, fold (build2 (MULT_EXPR, type,
ipart, ipart)))); ipart, ipart))));
arglist = build_tree_list (NULL_TREE, result); arglist = build_tree_list (NULL_TREE, result);
return build_function_call_expr (sqrtfn, arglist); return build_function_call_expr (sqrtfn, arglist);
...@@ -6864,7 +6867,7 @@ fold_builtin_logarithm (tree exp, const REAL_VALUE_TYPE *value) ...@@ -6864,7 +6867,7 @@ fold_builtin_logarithm (tree exp, const REAL_VALUE_TYPE *value)
tree logfn; tree logfn;
arglist = build_tree_list (NULL_TREE, x); arglist = build_tree_list (NULL_TREE, x);
logfn = build_function_call_expr (fndecl, arglist); logfn = build_function_call_expr (fndecl, arglist);
return fold (build (MULT_EXPR, type, exponent, logfn)); return fold (build2 (MULT_EXPR, type, exponent, logfn));
} }
} }
} }
...@@ -6999,7 +7002,7 @@ fold_builtin_mempcpy (tree exp) ...@@ -6999,7 +7002,7 @@ fold_builtin_mempcpy (tree exp)
if (operand_equal_p (src, dest, 0)) if (operand_equal_p (src, dest, 0))
{ {
tree temp = fold_convert (TREE_TYPE (dest), len); tree temp = fold_convert (TREE_TYPE (dest), len);
temp = fold (build (PLUS_EXPR, TREE_TYPE (dest), dest, temp)); temp = fold (build2 (PLUS_EXPR, TREE_TYPE (dest), dest, temp));
return fold_convert (TREE_TYPE (exp), temp); return fold_convert (TREE_TYPE (exp), temp);
} }
...@@ -7231,8 +7234,8 @@ fold_builtin_signbit (tree exp) ...@@ -7231,8 +7234,8 @@ fold_builtin_signbit (tree exp)
/* If ARG's format doesn't have signed zeros, return "arg < 0.0". */ /* If ARG's format doesn't have signed zeros, return "arg < 0.0". */
if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg)))) if (!HONOR_SIGNED_ZEROS (TYPE_MODE (TREE_TYPE (arg))))
return fold (build (LT_EXPR, TREE_TYPE (exp), arg, return fold (build2 (LT_EXPR, TREE_TYPE (exp), arg,
build_real (TREE_TYPE (arg), dconst0))); build_real (TREE_TYPE (arg), dconst0)));
return NULL_TREE; return NULL_TREE;
} }
...@@ -7249,11 +7252,11 @@ fold_builtin_isascii (tree arglist) ...@@ -7249,11 +7252,11 @@ fold_builtin_isascii (tree arglist)
/* Transform isascii(c) -> ((c & ~0x7f) == 0). */ /* Transform isascii(c) -> ((c & ~0x7f) == 0). */
tree arg = TREE_VALUE (arglist); tree arg = TREE_VALUE (arglist);
arg = fold (build (EQ_EXPR, integer_type_node, arg = fold (build2 (EQ_EXPR, integer_type_node,
build (BIT_AND_EXPR, integer_type_node, arg, build2 (BIT_AND_EXPR, integer_type_node, arg,
build_int_2 (~ (unsigned HOST_WIDE_INT) 0x7f, build_int_2 (~ (unsigned HOST_WIDE_INT) 0x7f,
~ (HOST_WIDE_INT) 0)), ~ (HOST_WIDE_INT) 0)),
integer_zero_node)); integer_zero_node));
if (in_gimple_form && !TREE_CONSTANT (arg)) if (in_gimple_form && !TREE_CONSTANT (arg))
return NULL_TREE; return NULL_TREE;
...@@ -7274,8 +7277,8 @@ fold_builtin_toascii (tree arglist) ...@@ -7274,8 +7277,8 @@ fold_builtin_toascii (tree arglist)
/* Transform toascii(c) -> (c & 0x7f). */ /* Transform toascii(c) -> (c & 0x7f). */
tree arg = TREE_VALUE (arglist); tree arg = TREE_VALUE (arglist);
return fold (build (BIT_AND_EXPR, integer_type_node, arg, return fold (build2 (BIT_AND_EXPR, integer_type_node, arg,
build_int_2 (0x7f, 0))); build_int_2 (0x7f, 0)));
} }
} }
...@@ -7292,11 +7295,11 @@ fold_builtin_isdigit (tree arglist) ...@@ -7292,11 +7295,11 @@ fold_builtin_isdigit (tree arglist)
/* 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 = fold_convert (unsigned_type_node, arg); arg = fold_convert (unsigned_type_node, arg);
arg = build (MINUS_EXPR, unsigned_type_node, arg, arg = build2 (MINUS_EXPR, unsigned_type_node, arg,
fold_convert (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 = build2 (LE_EXPR, integer_type_node, arg,
fold_convert (unsigned_type_node, build_int_2 (9, 0))); fold_convert (unsigned_type_node, build_int_2 (9, 0)));
arg = fold (arg); arg = fold (arg);
if (in_gimple_form && !TREE_CONSTANT (arg)) if (in_gimple_form && !TREE_CONSTANT (arg))
return NULL_TREE; return NULL_TREE;
...@@ -7380,9 +7383,9 @@ fold_builtin_1 (tree exp) ...@@ -7380,9 +7383,9 @@ fold_builtin_1 (tree exp)
if (flag_unsafe_math_optimizations && BUILTIN_EXPONENT_P (fcode)) if (flag_unsafe_math_optimizations && BUILTIN_EXPONENT_P (fcode))
{ {
tree expfn = TREE_OPERAND (TREE_OPERAND (arg, 0), 0); tree expfn = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
arg = fold (build (MULT_EXPR, type, arg = fold (build2 (MULT_EXPR, type,
TREE_VALUE (TREE_OPERAND (arg, 1)), TREE_VALUE (TREE_OPERAND (arg, 1)),
build_real (type, dconsthalf))); build_real (type, dconsthalf)));
arglist = build_tree_list (NULL_TREE, arg); arglist = build_tree_list (NULL_TREE, arg);
return build_function_call_expr (expfn, arglist); return build_function_call_expr (expfn, arglist);
} }
...@@ -7419,8 +7422,8 @@ fold_builtin_1 (tree exp) ...@@ -7419,8 +7422,8 @@ fold_builtin_1 (tree exp)
tree powfn = TREE_OPERAND (TREE_OPERAND (arg, 0), 0); tree powfn = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
tree arg0 = TREE_VALUE (TREE_OPERAND (arg, 1)); tree arg0 = TREE_VALUE (TREE_OPERAND (arg, 1));
tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg, 1))); tree arg1 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg, 1)));
tree narg1 = fold (build (MULT_EXPR, type, arg1, tree narg1 = fold (build2 (MULT_EXPR, type, arg1,
build_real (type, dconsthalf))); build_real (type, dconsthalf)));
arglist = tree_cons (NULL_TREE, arg0, arglist = tree_cons (NULL_TREE, arg0,
build_tree_list (NULL_TREE, narg1)); build_tree_list (NULL_TREE, narg1));
return build_function_call_expr (powfn, arglist); return build_function_call_expr (powfn, arglist);
...@@ -7446,9 +7449,9 @@ fold_builtin_1 (tree exp) ...@@ -7446,9 +7449,9 @@ fold_builtin_1 (tree exp)
tree expfn = TREE_OPERAND (TREE_OPERAND (arg, 0), 0); tree expfn = TREE_OPERAND (TREE_OPERAND (arg, 0), 0);
const REAL_VALUE_TYPE third_trunc = const REAL_VALUE_TYPE third_trunc =
real_value_truncate (TYPE_MODE (type), dconstthird); real_value_truncate (TYPE_MODE (type), dconstthird);
arg = fold (build (MULT_EXPR, type, arg = fold (build2 (MULT_EXPR, type,
TREE_VALUE (TREE_OPERAND (arg, 1)), TREE_VALUE (TREE_OPERAND (arg, 1)),
build_real (type, third_trunc))); build_real (type, third_trunc)));
arglist = build_tree_list (NULL_TREE, arg); arglist = build_tree_list (NULL_TREE, arg);
return build_function_call_expr (expfn, arglist); return build_function_call_expr (expfn, arglist);
} }
...@@ -7618,9 +7621,8 @@ fold_builtin_1 (tree exp) ...@@ -7618,9 +7621,8 @@ fold_builtin_1 (tree exp)
/* Optimize pow(x,-1.0) = 1.0/x. */ /* Optimize pow(x,-1.0) = 1.0/x. */
if (REAL_VALUES_EQUAL (c, dconstm1)) if (REAL_VALUES_EQUAL (c, dconstm1))
return fold (build (RDIV_EXPR, type, return fold (build2 (RDIV_EXPR, type,
build_real (type, dconst1), build_real (type, dconst1), arg0));
arg0));
/* Optimize pow(x,0.5) = sqrt(x). */ /* Optimize pow(x,0.5) = sqrt(x). */
if (flag_unsafe_math_optimizations if (flag_unsafe_math_optimizations
...@@ -7664,7 +7666,7 @@ fold_builtin_1 (tree exp) ...@@ -7664,7 +7666,7 @@ fold_builtin_1 (tree exp)
{ {
tree expfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0); tree expfn = TREE_OPERAND (TREE_OPERAND (arg0, 0), 0);
tree arg = TREE_VALUE (TREE_OPERAND (arg0, 1)); tree arg = TREE_VALUE (TREE_OPERAND (arg0, 1));
arg = fold (build (MULT_EXPR, type, arg, arg1)); arg = fold (build2 (MULT_EXPR, type, arg, arg1));
arglist = build_tree_list (NULL_TREE, arg); arglist = build_tree_list (NULL_TREE, arg);
return build_function_call_expr (expfn, arglist); return build_function_call_expr (expfn, arglist);
} }
...@@ -7673,8 +7675,8 @@ fold_builtin_1 (tree exp) ...@@ -7673,8 +7675,8 @@ fold_builtin_1 (tree exp)
if (flag_unsafe_math_optimizations && BUILTIN_SQRT_P (fcode)) if (flag_unsafe_math_optimizations && BUILTIN_SQRT_P (fcode))
{ {
tree narg0 = TREE_VALUE (TREE_OPERAND (arg0, 1)); tree narg0 = TREE_VALUE (TREE_OPERAND (arg0, 1));
tree narg1 = fold (build (MULT_EXPR, type, arg1, tree narg1 = fold (build2 (MULT_EXPR, type, arg1,
build_real (type, dconsthalf))); build_real (type, dconsthalf)));
arglist = tree_cons (NULL_TREE, narg0, arglist = tree_cons (NULL_TREE, narg0,
build_tree_list (NULL_TREE, narg1)); build_tree_list (NULL_TREE, narg1));
...@@ -7689,7 +7691,7 @@ fold_builtin_1 (tree exp) ...@@ -7689,7 +7691,7 @@ fold_builtin_1 (tree exp)
{ {
tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1)); tree arg00 = TREE_VALUE (TREE_OPERAND (arg0, 1));
tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0, 1))); tree arg01 = TREE_VALUE (TREE_CHAIN (TREE_OPERAND (arg0, 1)));
tree narg1 = fold (build (MULT_EXPR, type, arg01, arg1)); tree narg1 = fold (build2 (MULT_EXPR, type, arg01, arg1));
arglist = tree_cons (NULL_TREE, arg00, arglist = tree_cons (NULL_TREE, arg00,
build_tree_list (NULL_TREE, narg1)); build_tree_list (NULL_TREE, narg1));
return build_function_call_expr (fndecl, arglist); return build_function_call_expr (fndecl, arglist);
...@@ -7849,8 +7851,8 @@ build_function_call_expr (tree fn, tree arglist) ...@@ -7849,8 +7851,8 @@ build_function_call_expr (tree fn, tree arglist)
tree call_expr; tree call_expr;
call_expr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn); call_expr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn);
call_expr = build (CALL_EXPR, TREE_TYPE (TREE_TYPE (fn)), call_expr = build3 (CALL_EXPR, TREE_TYPE (TREE_TYPE (fn)),
call_expr, arglist, NULL_TREE); call_expr, arglist, NULL_TREE);
return fold (call_expr); return fold (call_expr);
} }
...@@ -8133,9 +8135,9 @@ simplify_builtin_strchr (tree arglist) ...@@ -8133,9 +8135,9 @@ simplify_builtin_strchr (tree arglist)
return fold_convert (TREE_TYPE (s1), integer_zero_node); return fold_convert (TREE_TYPE (s1), integer_zero_node);
/* Return an offset into the constant string argument. */ /* Return an offset into the constant string argument. */
return fold (build (PLUS_EXPR, TREE_TYPE (s1), return fold (build2 (PLUS_EXPR, TREE_TYPE (s1),
s1, fold_convert (TREE_TYPE (s1), s1, fold_convert (TREE_TYPE (s1),
ssize_int (r - p1)))); ssize_int (r - p1))));
} }
/* FIXME: Should use here strchrM optab so that ports can optimize /* FIXME: Should use here strchrM optab so that ports can optimize
...@@ -8190,9 +8192,9 @@ simplify_builtin_strrchr (tree arglist) ...@@ -8190,9 +8192,9 @@ simplify_builtin_strrchr (tree arglist)
return fold_convert (TREE_TYPE (s1), integer_zero_node); return fold_convert (TREE_TYPE (s1), integer_zero_node);
/* Return an offset into the constant string argument. */ /* Return an offset into the constant string argument. */
return fold (build (PLUS_EXPR, TREE_TYPE (s1), return fold (build2 (PLUS_EXPR, TREE_TYPE (s1),
s1, fold_convert (TREE_TYPE (s1), s1, fold_convert (TREE_TYPE (s1),
ssize_int (r - p1)))); ssize_int (r - p1))));
} }
if (! integer_zerop (s2)) if (! integer_zerop (s2))
...@@ -8248,19 +8250,15 @@ simplify_builtin_strpbrk (tree arglist) ...@@ -8248,19 +8250,15 @@ simplify_builtin_strpbrk (tree arglist)
return fold_convert (TREE_TYPE (s1), integer_zero_node); return fold_convert (TREE_TYPE (s1), integer_zero_node);
/* Return an offset into the constant string argument. */ /* Return an offset into the constant string argument. */
return fold (build (PLUS_EXPR, TREE_TYPE (s1), return fold (build2 (PLUS_EXPR, TREE_TYPE (s1),
s1, fold_convert (TREE_TYPE (s1), s1, fold_convert (TREE_TYPE (s1),
ssize_int (r - p1)))); ssize_int (r - p1))));
} }
if (p2[0] == '\0') if (p2[0] == '\0')
{ /* strpbrk(x, "") == NULL.
/* strpbrk(x, "") == NULL. Evaluate and ignore s1 in case it had side-effects. */
Evaluate and ignore the arguments in case they had return omit_one_operand (TREE_TYPE (s1), integer_zero_node, s1);
side-effects. */
return build (COMPOUND_EXPR, integer_type_node, s1,
integer_zero_node);
}
if (p2[1] != '\0') if (p2[1] != '\0')
return 0; /* Really call strpbrk. */ return 0; /* Really call strpbrk. */
...@@ -8358,13 +8356,11 @@ simplify_builtin_strncpy (tree arglist, tree slen) ...@@ -8358,13 +8356,11 @@ simplify_builtin_strncpy (tree arglist, tree slen)
/* If the len parameter is zero, return the dst parameter. */ /* If the len parameter is zero, return the dst parameter. */
if (integer_zerop (len)) if (integer_zerop (len))
{ /* Evaluate and ignore the src argument in case it has
/* Evaluate and ignore the src argument in case it has side-effects and return the dst parameter. */
side-effects and return the dst parameter. */ return omit_one_operand (TREE_TYPE (TREE_VALUE (arglist)),
return build (COMPOUND_EXPR, TREE_TYPE (TREE_VALUE (arglist)), TREE_VALUE (arglist),
TREE_VALUE (TREE_CHAIN (arglist)), TREE_VALUE (TREE_CHAIN (arglist)));
TREE_VALUE (arglist));
}
if (!slen) if (!slen)
slen = c_strlen (TREE_VALUE (TREE_CHAIN (arglist)), 0); slen = c_strlen (TREE_VALUE (TREE_CHAIN (arglist)), 0);
...@@ -8425,9 +8421,9 @@ simplify_builtin_memcmp (tree arglist) ...@@ -8425,9 +8421,9 @@ simplify_builtin_memcmp (tree arglist)
{ {
/* Evaluate and ignore arg1 and arg2 in case they have /* Evaluate and ignore arg1 and arg2 in case they have
side-effects. */ side-effects. */
return build (COMPOUND_EXPR, integer_type_node, arg1, return build2 (COMPOUND_EXPR, integer_type_node, arg1,
build (COMPOUND_EXPR, integer_type_node, build2 (COMPOUND_EXPR, integer_type_node,
arg2, integer_zero_node)); arg2, integer_zero_node));
} }
p1 = c_getstr (arg1); p1 = c_getstr (arg1);
...@@ -8460,7 +8456,7 @@ simplify_builtin_memcmp (tree arglist) ...@@ -8460,7 +8456,7 @@ simplify_builtin_memcmp (tree arglist)
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)))); build1 (NOP_EXPR, cst_uchar_ptr_node, arg2))));
return fold (build (MINUS_EXPR, integer_type_node, ind1, ind2)); return fold (build2 (MINUS_EXPR, integer_type_node, ind1, ind2));
} }
return 0; return 0;
...@@ -8524,7 +8520,7 @@ simplify_builtin_strcmp (tree arglist) ...@@ -8524,7 +8520,7 @@ simplify_builtin_strcmp (tree arglist)
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)))); build1 (NOP_EXPR, cst_uchar_ptr_node, arg2))));
return fold (build (MINUS_EXPR, integer_type_node, ind1, ind2)); return fold (build2 (MINUS_EXPR, integer_type_node, ind1, ind2));
} }
return 0; return 0;
...@@ -8566,17 +8562,15 @@ simplify_builtin_strncmp (tree arglist) ...@@ -8566,17 +8562,15 @@ simplify_builtin_strncmp (tree arglist)
{ {
/* Evaluate and ignore arg1 and arg2 in case they have /* Evaluate and ignore arg1 and arg2 in case they have
side-effects. */ side-effects. */
return build (COMPOUND_EXPR, integer_type_node, arg1, return build2 (COMPOUND_EXPR, integer_type_node, arg1,
build (COMPOUND_EXPR, integer_type_node, build2 (COMPOUND_EXPR, integer_type_node,
arg2, integer_zero_node)); arg2, integer_zero_node));
} }
/* If arg1 and arg2 are equal (and not volatile), return zero. */ /* If arg1 and arg2 are equal (and not volatile), return zero. */
if (operand_equal_p (arg1, arg2, 0)) if (operand_equal_p (arg1, arg2, 0))
{ /* Evaluate and ignore arg3 in case it has side-effects. */
/* Evaluate and ignore arg3 in case it has side-effects. */ return omit_one_operand (integer_type_node, integer_zero_node, arg3);
return build (COMPOUND_EXPR, integer_type_node, arg3, integer_zero_node);
}
p1 = c_getstr (arg1); p1 = c_getstr (arg1);
p2 = c_getstr (arg2); p2 = c_getstr (arg2);
...@@ -8607,7 +8601,7 @@ simplify_builtin_strncmp (tree arglist) ...@@ -8607,7 +8601,7 @@ simplify_builtin_strncmp (tree arglist)
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)))); build1 (NOP_EXPR, cst_uchar_ptr_node, arg2))));
return fold (build (MINUS_EXPR, integer_type_node, ind1, ind2)); return fold (build2 (MINUS_EXPR, integer_type_node, ind1, ind2));
} }
return 0; return 0;
...@@ -8682,8 +8676,8 @@ simplify_builtin_strncat (tree arglist) ...@@ -8682,8 +8676,8 @@ simplify_builtin_strncat (tree arglist)
/* If the requested length is zero, or the src parameter string /* If the requested length is zero, or the src parameter string
length is zero, return the dst parameter. */ length is zero, return the dst parameter. */
if (integer_zerop (len) || (p && *p == '\0')) if (integer_zerop (len) || (p && *p == '\0'))
return build (COMPOUND_EXPR, TREE_TYPE (dst), src, return build2 (COMPOUND_EXPR, TREE_TYPE (dst), src,
build (COMPOUND_EXPR, integer_type_node, len, dst)); build2 (COMPOUND_EXPR, integer_type_node, len, dst));
/* If the requested len is greater than or equal to the string /* If the requested len is greater than or equal to the string
length, call strcat. */ length, call strcat. */
...@@ -8744,9 +8738,9 @@ simplify_builtin_strspn (tree arglist) ...@@ -8744,9 +8738,9 @@ simplify_builtin_strspn (tree arglist)
{ {
/* Evaluate and ignore both arguments in case either one has /* Evaluate and ignore both arguments in case either one has
side-effects. */ side-effects. */
return build (COMPOUND_EXPR, integer_type_node, s1, return build2 (COMPOUND_EXPR, integer_type_node, s1,
build (COMPOUND_EXPR, integer_type_node, build2 (COMPOUND_EXPR, integer_type_node,
s2, integer_zero_node)); s2, integer_zero_node));
} }
return 0; return 0;
} }
...@@ -8791,8 +8785,8 @@ simplify_builtin_strcspn (tree arglist) ...@@ -8791,8 +8785,8 @@ simplify_builtin_strcspn (tree arglist)
{ {
/* Evaluate and ignore argument s2 in case it has /* Evaluate and ignore argument s2 in case it has
side-effects. */ side-effects. */
return build (COMPOUND_EXPR, integer_type_node, return omit_one_operand (integer_type_node,
s2, integer_zero_node); integer_zero_node, s2);
} }
/* If the second argument is "", return __builtin_strlen(s1). */ /* If the second argument is "", return __builtin_strlen(s1). */
...@@ -8862,10 +8856,9 @@ simplify_builtin_fputs (tree arglist, int ignore, int unlocked, tree known_len) ...@@ -8862,10 +8856,9 @@ simplify_builtin_fputs (tree arglist, int ignore, int unlocked, tree known_len)
switch (compare_tree_int (len, 1)) switch (compare_tree_int (len, 1))
{ {
case -1: /* length is 0, delete the call entirely . */ case -1: /* length is 0, delete the call entirely . */
{ return omit_one_operand (integer_type_node, integer_zero_node,
return build (COMPOUND_EXPR, integer_type_node, TREE_VALUE (TREE_CHAIN (arglist)));
TREE_VALUE (TREE_CHAIN (arglist)), integer_zero_node);
}
case 0: /* length is 1, call fputc. */ case 0: /* length is 1, call fputc. */
{ {
const char *p = c_getstr (TREE_VALUE (arglist)); const char *p = c_getstr (TREE_VALUE (arglist));
...@@ -9028,7 +9021,7 @@ simplify_builtin_sprintf (tree arglist, int ignored) ...@@ -9028,7 +9021,7 @@ simplify_builtin_sprintf (tree arglist, int ignored)
retval = convert retval = convert
(TREE_TYPE (TREE_TYPE (implicit_built_in_decls[BUILT_IN_SPRINTF])), (TREE_TYPE (TREE_TYPE (implicit_built_in_decls[BUILT_IN_SPRINTF])),
retval); retval);
return build (COMPOUND_EXPR, TREE_TYPE (retval), call, retval); return build2 (COMPOUND_EXPR, TREE_TYPE (retval), call, retval);
} }
else else
return call; return call;
......
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