From: Jakub Jelinek Date: Thu, 11 Feb 2016 09:26:31 +0000 (+0100) Subject: backport: re PR other/69432 (ICE in connect_traces, at dwarf2cfi.c with -O3 -m32... X-Git-Tag: releases/gcc-4.9.4~333 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f6b42bcd9fbd890f32a13b8b5dfb69b0b7721c66;p=thirdparty%2Fgcc.git backport: re PR other/69432 (ICE in connect_traces, at dwarf2cfi.c with -O3 -m32 -minline-stringops-dynamically) Backported from mainline 2016-01-22 Jakub Jelinek PR target/69432 * config/i386/i386.c (expand_small_movmem_or_setmem, expand_set_or_movmem_prologue_epilogue_by_misaligned_moves): Spelling fixes. (ix86_expand_set_or_movmem): Call do_pending_stack_adjust () early if dynamic_check != -1. * g++.dg/opt/pr69432.C: New test. From-SVN: r233334 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f32e2e74a4c2..2ae4cb90f0cc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,15 @@ 2016-02-11 Jakub Jelinek Backported from mainline + 2016-01-22 Jakub Jelinek + + PR target/69432 + * config/i386/i386.c (expand_small_movmem_or_setmem, + expand_set_or_movmem_prologue_epilogue_by_misaligned_moves): Spelling + fixes. + (ix86_expand_set_or_movmem): Call do_pending_stack_adjust () early + if dynamic_check != -1. + 2016-01-21 Jakub Jelinek PR middle-end/67653 diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index c20c32c4826a..a41efa4d97ca 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -23605,7 +23605,7 @@ expand_small_movmem_or_setmem (rtx destmem, rtx srcmem, if (DYNAMIC_CHECK) Round COUNT down to multiple of SIZE << optional caller supplied zero size guard is here >> - << optional caller suppplied dynamic check is here >> + << optional caller supplied dynamic check is here >> << caller supplied main copy loop is here >> } done_label: @@ -23779,8 +23779,8 @@ expand_set_or_movmem_prologue_epilogue_by_misaligned_moves (rtx destmem, rtx src else *min_size = 0; - /* Our loops always round down the bock size, but for dispatch to library - we need precise value. */ + /* Our loops always round down the block size, but for dispatch to + library we need precise value. */ if (dynamic_check) *count = expand_simple_binop (GET_MODE (*count), AND, *count, GEN_INT (-size), *count, 1, OPTAB_DIRECT); @@ -24358,6 +24358,13 @@ ix86_expand_set_or_movmem (rtx dst, rtx src, rtx count_exp, rtx val_exp, size_needed = GET_MODE_SIZE (move_mode) * unroll_factor; epilogue_size_needed = size_needed; + /* If we are going to call any library calls conditionally, make sure any + pending stack adjustment happen before the first conditional branch, + otherwise they will be emitted before the library call only and won't + happen from the other branches. */ + if (dynamic_check != -1) + do_pending_stack_adjust (); + desired_align = decide_alignment (align, alg, expected_size, move_mode); if (!TARGET_ALIGN_STRINGOPS || noalign) align = desired_align; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 138f7460c787..65e4b56d5086 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,11 @@ 2016-02-11 Jakub Jelinek Backported from mainline + 2016-01-22 Jakub Jelinek + + PR target/69432 + * g++.dg/opt/pr69432.C: New test. + 2016-01-21 Jakub Jelinek PR middle-end/67653 diff --git a/gcc/testsuite/g++.dg/opt/pr69432.C b/gcc/testsuite/g++.dg/opt/pr69432.C new file mode 100644 index 000000000000..1f23f2cedd61 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr69432.C @@ -0,0 +1,62 @@ +// PR target/69432 +// { dg-do compile } +// { dg-options "-O3" } +// { dg-additional-options "-minline-stringops-dynamically" { target i?86-*-* x86_64-*-* } } + +template +void +f1 (S x, T y, U z) +{ + for (; y; --y, ++x) + *x = z; +} + +template +void f2 (S x, T y, U z) +{ + f1 (x, y, z); +} + +struct A {}; +struct B { static char f3 (A, unsigned); }; + +template +void f4 (S, U); + +struct C +{ + template + static S f5 (S x, T y, U z) { f2 (x, y, z); } +}; + +template +void f6 (S x, T y, U z) { C::f5 (x, y, z); } + +template +void f7 (S x, T y, U z, V) { f6 (x, y, z); } + +struct E +{ + struct D : A { char e; D (A); }; + A f; + E (int x) : g(f) { f8 (x); } + ~E (); + D g; + void f9 (int x) { x ? B::f3 (g, x) : char (); } + void f8 (int x) { f9 (x); } +}; + +struct F : E +{ + F (int x) : E(x) { f10 (x); f4 (this, 0); } + char h; + void f10 (int x) { f7 (&g.e, x, h, 0); } +}; + +long a; + +void +test () +{ + F b(a); +}