[PATCH] Fix PR/63841: empty constructor doesn't zero-initialize
Teresa Johnson
tejohnson@google.com
Thu Nov 13 20:55:00 GMT 2014
On Thu, Nov 13, 2014 at 7:39 AM, Teresa Johnson <tejohnson@google.com> wrote:
> On Thu, Nov 13, 2014 at 7:12 AM, Jakub Jelinek <jakub@redhat.com> wrote:
>> And for release branches I'd really prefer tree-ssa-strlen.c change.
>
> Ok, I started testing the initializer_zerop change on the 4_9 branch,
> will also test the strlen fix and send that patch for review here when
> it completes.
Here is the more conservative patch for 4_9. Bootstrapped and tested
on x86_64-unknown-linux-gnu. Ok for gcc-4_9 branch?
Thanks,
Teresa
2014-11-13 Teresa Johnson <tejohnson@google.com>
gcc:
PR tree-optimization/63841
* tree-ssa-strlen.c (strlen_optimize_stmt): Ignore clobbers.
2014-11-13 Teresa Johnson <tejohnson@google.com>
gcc/testsuite:
PR tree-optimization/63841
* testsuite/g++.dg/tree-ssa/pr63841.C: New test.
Index: tree-ssa-strlen.c
===================================================================
--- tree-ssa-strlen.c (revision 217503)
+++ tree-ssa-strlen.c (working copy)
@@ -1856,7 +1856,7 @@ strlen_optimize_stmt (gimple_stmt_iterator *gsi)
break;
}
}
- else if (is_gimple_assign (stmt))
+ else if (is_gimple_assign (stmt) && !gimple_clobber_p (stmt))
{
tree lhs = gimple_assign_lhs (stmt);
Index: testsuite/g++.dg/tree-ssa/pr63841.C
===================================================================
--- testsuite/g++.dg/tree-ssa/pr63841.C (revision 0)
+++ testsuite/g++.dg/tree-ssa/pr63841.C (working copy)
@@ -0,0 +1,38 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+#include <cstdio>
+#include <string>
+
+std::string __attribute__ ((noinline)) comp_test_write() {
+ std::string data;
+
+ for (int i = 0; i < 2; ++i) {
+ char b = 1 >> (i * 8);
+ data.append(&b, 1);
+ }
+
+ return data;
+}
+
+std::string __attribute__ ((noinline)) comp_test_write_good() {
+ std::string data;
+
+ char b;
+ for (int i = 0; i < 2; ++i) {
+ b = 1 >> (i * 8);
+ data.append(&b, 1);
+ }
+
+ return data;
+}
+
+int main() {
+ std::string good = comp_test_write_good();
+ printf("expected: %hx\n", *(short*)good.c_str());
+
+ std::string bad = comp_test_write();
+ printf("got: %hx\n", *(short*)bad.c_str());
+
+ return good != bad;
+}
--
Teresa Johnson | Software Engineer | tejohnson@google.com | 408-460-2413
More information about the Gcc-patches
mailing list