Commit 62041cfc by Jakub Jelinek Committed by Jakub Jelinek

re PR other/69432 (ICE in connect_traces, at dwarf2cfi.c with -O3 -m32…

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
parent d403fc9a
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> 2016-01-21 Jeff Law <law@redhat.com>
PR middle-end/69347 PR middle-end/69347
......
...@@ -75,6 +75,7 @@ along with GCC; see the file COPYING3. If not see ...@@ -75,6 +75,7 @@ along with GCC; see the file COPYING3. If not see
#include "dbgcnt.h" #include "dbgcnt.h"
#include "case-cfn-macros.h" #include "case-cfn-macros.h"
#include "regrename.h" #include "regrename.h"
#include "dojump.h"
/* This file should be included last. */ /* This file should be included last. */
#include "target-def.h" #include "target-def.h"
...@@ -25700,7 +25701,7 @@ expand_small_movmem_or_setmem (rtx destmem, rtx srcmem, ...@@ -25700,7 +25701,7 @@ expand_small_movmem_or_setmem (rtx destmem, rtx srcmem,
if (DYNAMIC_CHECK) if (DYNAMIC_CHECK)
Round COUNT down to multiple of SIZE Round COUNT down to multiple of SIZE
<< optional caller supplied zero size guard is here >> << 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 >> << caller supplied main copy loop is here >>
} }
done_label: done_label:
...@@ -25875,8 +25876,8 @@ expand_set_or_movmem_prologue_epilogue_by_misaligned_moves (rtx destmem, rtx src ...@@ -25875,8 +25876,8 @@ expand_set_or_movmem_prologue_epilogue_by_misaligned_moves (rtx destmem, rtx src
else else
*min_size = 0; *min_size = 0;
/* Our loops always round down the bock size, but for dispatch to library /* Our loops always round down the block size, but for dispatch to
we need precise value. */ library we need precise value. */
if (dynamic_check) if (dynamic_check)
*count = expand_simple_binop (GET_MODE (*count), AND, *count, *count = expand_simple_binop (GET_MODE (*count), AND, *count,
GEN_INT (-size), *count, 1, OPTAB_DIRECT); 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, ...@@ -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; size_needed = GET_MODE_SIZE (move_mode) * unroll_factor;
epilogue_size_needed = size_needed; 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); desired_align = decide_alignment (align, alg, expected_size, move_mode);
if (!TARGET_ALIGN_STRINGOPS || noalign) if (!TARGET_ALIGN_STRINGOPS || noalign)
align = desired_align; align = desired_align;
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> 2016-01-22 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* gcc.target/powerpc/pr63354c: Adjust target selector to include * gcc.target/powerpc/pr63354c: Adjust target selector to include
......
// 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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment