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:
parent
d403fc9a7b
commit
62041cfc09
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
62
gcc/testsuite/g++.dg/opt/pr69432.C
Normal file
62
gcc/testsuite/g++.dg/opt/pr69432.C
Normal 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);
|
||||
}
|
Loading…
Reference in New Issue
Block a user