Commit bb1bc604 by Richard Biener Committed by Richard Biener

re PR tree-optimization/78847 (pointer arithmetic from c++ ranged-based for loop not optimized)

2017-04-21  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/78847
	* fold-const.c (split_tree): Handle POINTER_PLUS_EXPR.

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

From-SVN: r247061
parent e1478a0e
2017-04-21 Richard Biener <rguenther@suse.de> 2017-04-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/78847
* fold-const.c (split_tree): Handle POINTER_PLUS_EXPR.
2017-04-21 Richard Biener <rguenther@suse.de>
* tree.h (build_qualified_type): Annotate with CXX_MEM_STAT_INFO. * tree.h (build_qualified_type): Annotate with CXX_MEM_STAT_INFO.
(build_distinct_type_copy): Likewise. (build_distinct_type_copy): Likewise.
(build_variant_type_copy): Likewise. (build_variant_type_copy): Likewise.
......
...@@ -798,8 +798,11 @@ split_tree (location_t loc, tree in, tree type, enum tree_code code, ...@@ -798,8 +798,11 @@ split_tree (location_t loc, tree in, tree type, enum tree_code code,
though the C standard doesn't say so) for integers because though the C standard doesn't say so) for integers because
the value is not affected. For reals, the value might be the value is not affected. For reals, the value might be
affected, so we can't. */ affected, so we can't. */
&& ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR) && ((code == PLUS_EXPR && TREE_CODE (in) == POINTER_PLUS_EXPR)
|| (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR)))) || (code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
|| (code == MINUS_EXPR
&& (TREE_CODE (in) == PLUS_EXPR
|| TREE_CODE (in) == POINTER_PLUS_EXPR)))))
{ {
tree op0 = TREE_OPERAND (in, 0); tree op0 = TREE_OPERAND (in, 0);
tree op1 = TREE_OPERAND (in, 1); tree op1 = TREE_OPERAND (in, 1);
......
2017-04-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/78847
* g++.dg/tree-ssa/pr78847.C: New testcase.
2017-04-21 Jakub Jelinek <jakub@redhat.com> 2017-04-21 Jakub Jelinek <jakub@redhat.com>
PR c/80468 PR c/80468
......
/* { dg-do compile } */
/* { dg-require-effective-target c++14 } */
/* { dg-options "-O3 -fdump-tree-ldist" } */
#include <stddef.h>
#include <cstring>
#include <experimental/string_view>
using string_view = std::experimental::string_view;
class Foo {
constexpr static size_t Length = 9;
char ascii_[Length];
public:
Foo();
string_view view() const {
return string_view(ascii_, Length);
}
};
void testWithLoopValue(const Foo foo, size_t ptr, char *buf_) {
for (auto c : foo.view())
buf_[ptr++] = c;
}
/* { dg-final { scan-tree-dump "memcpy\[^\n\r\]*, 9\\);" "ldist" } } */
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