aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/fold-const.c7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr78847.C26
4 files changed, 41 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 370d0b4..359273e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,10 @@
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.
(build_distinct_type_copy): Likewise.
(build_variant_type_copy): Likewise.
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 7701622..4ae21fb 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -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
the value is not affected. For reals, the value might be
affected, so we can't. */
- && ((code == PLUS_EXPR && TREE_CODE (in) == MINUS_EXPR)
- || (code == MINUS_EXPR && TREE_CODE (in) == PLUS_EXPR))))
+ && ((code == PLUS_EXPR && TREE_CODE (in) == POINTER_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 op1 = TREE_OPERAND (in, 1);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a40f9ff..414f279 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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>
PR c/80468
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr78847.C b/gcc/testsuite/g++.dg/tree-ssa/pr78847.C
new file mode 100644
index 0000000..d5a8394
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr78847.C
@@ -0,0 +1,26 @@
+/* { 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" } } */