Commit 51bd28ed by Richard Biener Committed by Richard Biener

re PR middle-end/81719 (Range-based for loop on short fixed size array generates…

re PR middle-end/81719 (Range-based for loop on short fixed size array generates long unrolled loop)

2017-08-08  Richard Biener  <rguenther@suse.de>

	PR middle-end/81719
	* tree-ssa-loop-niter.c: Include tree-dfa.h.
	(expand_simple_operations): Also look through ADDR_EXPRs with
	MEM_REF bases treating them as POINTER_PLUS_EXPR.

	* g++.dg/tree-ssa/pr81719.C: New testcase.

From-SVN: r250954
parent 26d66f28
2017-08-08 Richard Biener <rguenther@suse.de>
PR middle-end/81719
* tree-ssa-loop-niter.c: Include tree-dfa.h.
(expand_simple_operations): Also look through ADDR_EXPRs with
MEM_REF bases treating them as POINTER_PLUS_EXPR.
2017-08-08 Richard Biener <rguenther@suse.de>
PR tree-optimization/81723
* tree-vect-slp.c (struct bst_traits): New hash traits.
(bst_fail): New global.
......
2017-08-08 Richard Biener <rguenther@suse.de>
PR middle-end/81719
* g++.dg/tree-ssa/pr81719.C: New testcase.
2017-08-08 Richard Biener <rguenther@suse.de>
PR tree-optimization/81723
* gfortran.dg/pr81723.f: New testcase.
......
/* { dg-do compile { target c++11 } } */
/* { dg-options "-O3 -fdump-tree-optimized" } */
typedef int Items[2];
struct ItemArray
{
Items items;
int sum_x2() const;
};
int ItemArray::sum_x2() const
{
int total = 0;
for (int item : items)
{
total += item;
}
return total;
}
/* We should be able to compute the number of iterations to two, unroll
the loop and end up with a single basic-block in sum_x2. */
/* { dg-final { scan-tree-dump-times "bb" 1 "optimized" } } */
......@@ -42,6 +42,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-chrec.h"
#include "tree-scalar-evolution.h"
#include "params.h"
#include "tree-dfa.h"
/* The maximum number of dominator BBs we search for conditions
......@@ -1980,6 +1981,21 @@ expand_simple_operations (tree expr, tree stop)
if (code == SSA_NAME)
return expand_simple_operations (e, stop);
else if (code == ADDR_EXPR)
{
HOST_WIDE_INT offset;
tree base = get_addr_base_and_unit_offset (TREE_OPERAND (e, 0),
&offset);
if (base
&& TREE_CODE (base) == MEM_REF)
{
ee = expand_simple_operations (TREE_OPERAND (base, 0), stop);
return fold_build2 (POINTER_PLUS_EXPR, TREE_TYPE (expr), ee,
wide_int_to_tree (sizetype,
mem_ref_offset (base)
+ offset));
}
}
return expr;
}
......
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