On Thu, Nov 13, 2014 at 7:39 AM, Teresa Johnson <tejohn...@google.com> wrote: > On Thu, Nov 13, 2014 at 7:12 AM, Jakub Jelinek <ja...@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 <tejohn...@google.com> gcc: PR tree-optimization/63841 * tree-ssa-strlen.c (strlen_optimize_stmt): Ignore clobbers. 2014-11-13 Teresa Johnson <tejohn...@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 | tejohn...@google.com | 408-460-2413