From 0916f876074b952b3003300a273baa14e6dab8af Mon Sep 17 00:00:00 2001 From: Yufeng Zhang Date: Wed, 2 Oct 2013 10:21:33 +0000 Subject: [PATCH] gimple-ssa-strength-reduction.c (legal_cast_p_1): Forward declaration. gcc/ * gimple-ssa-strength-reduction.c (legal_cast_p_1): Forward declaration. (backtrace_base_for_ref): Call get_unwidened with 'base_in' if 'base_in' represent a conversion and legal_cast_p_1 holds; set 'base_in' with the returned value from get_unwidened. gcc/testsuite/ * gcc.dg/tree-ssa/slsr-40.c: New test. From-SVN: r203107 --- gcc/ChangeLog | 9 +++++++++ gcc/gimple-ssa-strength-reduction.c | 9 +++++++++ gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/tree-ssa/slsr-40.c | 27 +++++++++++++++++++++++++ 4 files changed, 49 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/slsr-40.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7dc504bbf3b0..76d188f491d0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2013-10-02 Bill Schmidt + Yufeng Zhang + + * gimple-ssa-strength-reduction.c (legal_cast_p_1): Forward + declaration. + (backtrace_base_for_ref): Call get_unwidened with 'base_in' if + 'base_in' represent a conversion and legal_cast_p_1 holds; set + 'base_in' with the returned value from get_unwidened. + 2013-10-02 Kyrylo Tkachov * config/arm/arm.c (arm_legitimize_reload_address): Explain why diff --git a/gcc/gimple-ssa-strength-reduction.c b/gcc/gimple-ssa-strength-reduction.c index 139a4a164729..9a5072c71bdc 100644 --- a/gcc/gimple-ssa-strength-reduction.c +++ b/gcc/gimple-ssa-strength-reduction.c @@ -379,6 +379,7 @@ static bool address_arithmetic_p; /* Forward function declarations. */ static slsr_cand_t base_cand_from_table (tree); static tree introduce_cast_before_cand (slsr_cand_t, tree, tree); +static bool legal_cast_p_1 (tree, tree); /* Produce a pointer to the IDX'th candidate in the candidate vector. */ @@ -768,6 +769,14 @@ backtrace_base_for_ref (tree *pbase) slsr_cand_t base_cand; STRIP_NOPS (base_in); + + /* Strip off widening conversion(s) to handle cases where + e.g. 'B' is widened from an 'int' in order to calculate + a 64-bit address. */ + if (CONVERT_EXPR_P (base_in) + && legal_cast_p_1 (base_in, TREE_OPERAND (base_in, 0))) + base_in = get_unwidened (base_in, NULL_TREE); + if (TREE_CODE (base_in) != SSA_NAME) return tree_to_double_int (integer_zero_node); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cb2f58c3fb47..2fb3cc63e5c4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-10-02 Yufeng Zhang + + * gcc.dg/tree-ssa/slsr-40.c: New test. + 2013-10-01 Paolo Carlini PR c++/58563 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/slsr-40.c b/gcc/testsuite/gcc.dg/tree-ssa/slsr-40.c new file mode 100644 index 000000000000..72726a3aa3bb --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/slsr-40.c @@ -0,0 +1,27 @@ +/* Verify straight-line strength reduction for array + subscripting. + + elems[n-1] is reduced to elems + n * 4 + 0xffffffff * 4, only when + pointers are of the same size as that of int (assuming 4 bytes). */ + +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +struct data +{ + unsigned long elms[1]; +} gData; + +void __attribute__((noinline)) +foo (struct data *dst, unsigned int n) +{ + dst->elms[n - 1] &= 1; +} + +int +main () +{ + foo (&gData, 1); + return 0; +} + -- 2.43.5