From ae929441677ea4b1bb8b5d3f64a54c1fcf84b94e Mon Sep 17 00:00:00 2001 From: ebotcazou Date: Fri, 18 Jun 2010 16:38:29 +0000 Subject: [PATCH] PR rtl-optimization/40900 * expr.c (expand_expr_real_1) : Fix long line. Save the original expression for later reuse. : Use promote_function_mode to compute the signedness of the promoted RTL for a SSA_NAME on the LHS of a call statement. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@161006 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 +++++++ gcc/expr.c | 40 +++++++++++++++++++++------------- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.target/arm/pr40900.c | 12 ++++++++++ 4 files changed, 49 insertions(+), 15 deletions(-) create mode 100644 gcc/testsuite/gcc.target/arm/pr40900.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 14bdc45..d03212c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-06-18 Eric Botcazou + + PR rtl-optimization/40900 + * expr.c (expand_expr_real_1) : Fix long line. Save the + original expression for later reuse. + : Use promote_function_mode to compute the signedness + of the promoted RTL for a SSA_NAME on the LHS of a call statement. + 2010-06-18 Anatoly Sokolov * double-int.h (double_int_to_shwi, double_int_to_uhwi, diff --git a/gcc/expr.c b/gcc/expr.c index 08efff7..ab761d3 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -8301,6 +8301,8 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, location_t loc = EXPR_LOCATION (exp); struct separate_ops ops; tree treeop0, treeop1, treeop2; + tree ssa_name = NULL_TREE; + gimple g; type = TREE_TYPE (exp); mode = TYPE_MODE (type); @@ -8413,15 +8415,17 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, base variable. This unnecessarily allocates a pseudo, see how we can reuse it, if partition base vars have it set already. */ if (!currently_expanding_to_rtl) - return expand_expr_real_1 (SSA_NAME_VAR (exp), target, tmode, modifier, NULL); - { - gimple g = get_gimple_for_ssa_name (exp); - if (g) - return expand_expr_real (gimple_assign_rhs_to_tree (g), target, - tmode, modifier, NULL); - } - decl_rtl = get_rtx_for_ssa_name (exp); - exp = SSA_NAME_VAR (exp); + return expand_expr_real_1 (SSA_NAME_VAR (exp), target, tmode, modifier, + NULL); + + g = get_gimple_for_ssa_name (exp); + if (g) + return expand_expr_real (gimple_assign_rhs_to_tree (g), target, tmode, + modifier, NULL); + + ssa_name = exp; + decl_rtl = get_rtx_for_ssa_name (ssa_name); + exp = SSA_NAME_VAR (ssa_name); goto expand_decl_rtl; case PARM_DECL: @@ -8523,15 +8527,21 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, /* If the mode of DECL_RTL does not match that of the decl, it must be a promoted value. We return a SUBREG of the wanted mode, but mark it so that we know that it was already extended. */ - - if (REG_P (decl_rtl) - && GET_MODE (decl_rtl) != DECL_MODE (exp)) + if (REG_P (decl_rtl) && GET_MODE (decl_rtl) != DECL_MODE (exp)) { enum machine_mode pmode; - /* Get the signedness used for this variable. Ensure we get the - same mode we got when the variable was declared. */ - pmode = promote_decl_mode (exp, &unsignedp); + /* Get the signedness to be used for this variable. Ensure we get + the same mode we got when the variable was declared. */ + if (code == SSA_NAME + && (g = SSA_NAME_DEF_STMT (ssa_name)) + && gimple_code (g) == GIMPLE_CALL) + pmode = promote_function_mode (type, mode, &unsignedp, + TREE_TYPE + (TREE_TYPE (gimple_call_fn (g))), + 2); + else + pmode = promote_decl_mode (exp, &unsignedp); gcc_assert (GET_MODE (decl_rtl) == pmode); temp = gen_lowpart_SUBREG (mode, decl_rtl); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 737cc21..ce75762 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-06-18 Bernd Schmidt + + * gcc.target/arm/pr40900.c: New test. + 2010-06-18 Arnaud Charlet * gnat.dg/class_wide2.adb: Remove bogus message, no longer generated. diff --git a/gcc/testsuite/gcc.target/arm/pr40900.c b/gcc/testsuite/gcc.target/arm/pr40900.c new file mode 100644 index 0000000..278bc37 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/pr40900.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fno-optimize-sibling-calls" } */ + +extern short shortv2(); +short shortv1() +{ + return shortv2(); +} + +/* { dg-final { scan-assembler-not "lsl" } } */ +/* { dg-final { scan-assembler-not "asr" } } */ +/* { dg-final { scan-assembler-not "sxth" } } */ -- 2.7.4