diff options
Diffstat (limited to 'gcc/expr.c')
-rw-r--r-- | gcc/expr.c | 34 |
1 files changed, 11 insertions, 23 deletions
diff --git a/gcc/expr.c b/gcc/expr.c index 42cb253e72e..1c2ff13fa17 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -1355,7 +1355,7 @@ rtx emit_block_move_via_libcall (rtx dst, rtx src, rtx size, bool tailcall) { rtx dst_addr, src_addr; - tree call_expr, arg_list, fn, src_tree, dst_tree, size_tree; + tree call_expr, fn, src_tree, dst_tree, size_tree; enum machine_mode size_mode; rtx retval; @@ -1386,14 +1386,7 @@ emit_block_move_via_libcall (rtx dst, rtx src, rtx size, bool tailcall) size_tree = make_tree (sizetype, size); fn = emit_block_move_libcall_fn (true); - arg_list = tree_cons (NULL_TREE, size_tree, NULL_TREE); - arg_list = tree_cons (NULL_TREE, src_tree, arg_list); - arg_list = tree_cons (NULL_TREE, dst_tree, arg_list); - - /* Now we have to build up the CALL_EXPR itself. */ - call_expr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn); - call_expr = build3 (CALL_EXPR, TREE_TYPE (TREE_TYPE (fn)), - call_expr, arg_list, NULL_TREE); + call_expr = build_call_expr (fn, 3, dst_tree, src_tree, size_tree); CALL_EXPR_TAILCALL (call_expr) = tailcall; retval = expand_normal (call_expr); @@ -2576,7 +2569,7 @@ clear_storage (rtx object, rtx size, enum block_op_methods method) rtx set_storage_via_libcall (rtx object, rtx size, rtx val, bool tailcall) { - tree call_expr, arg_list, fn, object_tree, size_tree, val_tree; + tree call_expr, fn, object_tree, size_tree, val_tree; enum machine_mode size_mode; rtx retval; @@ -2602,14 +2595,8 @@ set_storage_via_libcall (rtx object, rtx size, rtx val, bool tailcall) val_tree = make_tree (integer_type_node, val); fn = clear_storage_libcall_fn (true); - arg_list = tree_cons (NULL_TREE, size_tree, NULL_TREE); - arg_list = tree_cons (NULL_TREE, val_tree, arg_list); - arg_list = tree_cons (NULL_TREE, object_tree, arg_list); - - /* Now we have to build up the CALL_EXPR itself. */ - call_expr = build1 (ADDR_EXPR, build_pointer_type (TREE_TYPE (fn)), fn); - call_expr = build3 (CALL_EXPR, TREE_TYPE (TREE_TYPE (fn)), - call_expr, arg_list, NULL_TREE); + call_expr = build_call_expr (fn, 3, + object_tree, integer_zero_node, size_tree); CALL_EXPR_TAILCALL (call_expr) = tailcall; retval = expand_normal (call_expr); @@ -6225,6 +6212,7 @@ safe_from_p (rtx x, tree exp, int top_p) case tcc_expression: case tcc_reference: + case tcc_vl_exp: /* Now do code-specific tests. EXP_RTL is set to any rtx we find in the expression. If it is set, we conflict iff we are that rtx or both are in memory. Otherwise, we check all operands of the @@ -6287,7 +6275,7 @@ safe_from_p (rtx x, tree exp, int top_p) if (exp_rtl) break; - nops = TREE_CODE_LENGTH (TREE_CODE (exp)); + nops = TREE_OPERAND_LENGTH (exp); for (i = 0; i < nops; i++) if (TREE_OPERAND (exp, i) != 0 && ! safe_from_p (x, TREE_OPERAND (exp, i), 0)) @@ -7769,12 +7757,12 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, case CALL_EXPR: /* Check for a built-in function. */ - if (TREE_CODE (TREE_OPERAND (exp, 0)) == ADDR_EXPR - && (TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) + if (TREE_CODE (CALL_EXPR_FN (exp)) == ADDR_EXPR + && (TREE_CODE (TREE_OPERAND (CALL_EXPR_FN (exp), 0)) == FUNCTION_DECL) - && DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))) + && DECL_BUILT_IN (TREE_OPERAND (CALL_EXPR_FN (exp), 0))) { - if (DECL_BUILT_IN_CLASS (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)) + if (DECL_BUILT_IN_CLASS (TREE_OPERAND (CALL_EXPR_FN (exp), 0)) == BUILT_IN_FRONTEND) return lang_hooks.expand_expr (exp, original_target, tmode, modifier, |