re PR tree-optimization/78847 (pointer arithmetic from c++ ranged-based for loop...
authorRichard Biener <rguenther@suse.de>
Fri, 21 Apr 2017 12:09:20 +0000 (12:09 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 21 Apr 2017 12:09:20 +0000 (12:09 +0000)
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

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tree-ssa/pr78847.C [new file with mode: 0644]

index 370d0b4d1b1cc8160605ce49083eb2d15e8b2dba..359273ef092765a28f8894fdf0dc37d51ea2c6b6 100644 (file)
@@ -1,3 +1,8 @@
+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.
index 770162251f2e270e75bb7978b5c43cc60d0d411c..4ae21fb0d2ff8ca5f7599982e7bb43fdb5b4bde1 100644 (file)
@@ -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);
index a40f9ffda33ab82af4e90e5ff5cc2d6d322e945c..414f27972bf773b50d1caa0eae9c006cf30d1fe5 100644 (file)
@@ -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 (file)
index 0000000..d5a8394
--- /dev/null
@@ -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" } } */