re PR other/69432 (ICE in connect_traces, at dwarf2cfi.c with -O3 -m32 -minline-stringops-dynamically)

PR target/69432
	* config/i386/i386.c: Include dojump.h.
	(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: r232754
This commit is contained in:
Jakub Jelinek 2016-01-23 00:14:27 +01:00 committed by Jakub Jelinek
parent d403fc9a7b
commit 62041cfc09
4 changed files with 88 additions and 3 deletions

View File

@ -1,3 +1,13 @@
2016-01-22 Jakub Jelinek <jakub@redhat.com>
PR target/69432
* config/i386/i386.c: Include dojump.h.
(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 Jeff Law <law@redhat.com>
PR middle-end/69347

View File

@ -75,6 +75,7 @@ along with GCC; see the file COPYING3. If not see
#include "dbgcnt.h"
#include "case-cfn-macros.h"
#include "regrename.h"
#include "dojump.h"
/* This file should be included last. */
#include "target-def.h"
@ -25700,7 +25701,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:
@ -25875,8 +25876,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);
@ -26469,6 +26470,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;

View File

@ -1,3 +1,8 @@
2016-01-22 Jakub Jelinek <jakub@redhat.com>
PR target/69432
* g++.dg/opt/pr69432.C: New test.
2016-01-22 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* gcc.target/powerpc/pr63354c: Adjust target selector to include

View File

@ -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 <typename S, typename T, typename U>
void
f1 (S x, T y, U z)
{
for (; y; --y, ++x)
*x = z;
}
template <typename S, typename T, typename U>
void f2 (S x, T y, U z)
{
f1 (x, y, z);
}
struct A {};
struct B { static char f3 (A, unsigned); };
template <typename S, typename U>
void f4 (S, U);
struct C
{
template <typename S, typename T, typename U>
static S f5 (S x, T y, U z) { f2 (x, y, z); }
};
template <typename S, typename T, typename U>
void f6 (S x, T y, U z) { C::f5 (x, y, z); }
template <typename S, typename T, typename U, typename V>
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);
}