re PR target/69454 (ix86_expand_prologue internal compiler error: Segmentation fault)

PR target/69454
	* config/i386/i386.c (convert_scalars_to_vector): Remove
	stack alignment fixes.
	(ix86_option_override_internal): Disable TARGET_STV if stack
	might not be aligned enough.
	(ix86_minimum_alignment): Assert that TARGET_STV is false.

	* gcc.target/i386/pr69454-1.c: New test.
	* gcc.target/i386/pr69454-2.c: New test.

From-SVN: r233128
This commit is contained in:
Jakub Jelinek 2016-02-04 10:02:01 +01:00
parent 07d88205a6
commit 61f727fe02
5 changed files with 52 additions and 11 deletions

View File

@ -1,3 +1,14 @@
2016-02-04 Jakub Jelinek <jakub@redhat.com>
Ilya Enkovich <enkovich.gnu@gmail.com>
H.J. Lu <hongjiu.lu@intel.com>
PR target/69454
* config/i386/i386.c (convert_scalars_to_vector): Remove
stack alignment fixes.
(ix86_option_override_internal): Disable TARGET_STV if stack
might not be aligned enough.
(ix86_minimum_alignment): Assert that TARGET_STV is false.
2016-02-04 Victoria Stepanyan <victoria.stepanyan@amd.com>
* gcc/config/i386/x86-tune.def: Disable default prefetching

View File

@ -3588,16 +3588,6 @@ convert_scalars_to_vector ()
bitmap_obstack_release (NULL);
df_process_deferred_rescans ();
/* Conversion means we may have 128bit register spills/fills
which require aligned stack. */
if (converted_insns)
{
if (crtl->stack_alignment_needed < 128)
crtl->stack_alignment_needed = 128;
if (crtl->stack_alignment_estimated < 128)
crtl->stack_alignment_estimated = 128;
}
return 0;
}
@ -5453,6 +5443,13 @@ ix86_option_override_internal (bool main_args_p,
opts->x_target_flags |= MASK_VZEROUPPER;
if (!(opts_set->x_target_flags & MASK_STV))
opts->x_target_flags |= MASK_STV;
/* Disable STV if -mpreferred-stack-boundary=2 or
-mincoming-stack-boundary=2 - the needed
stack realignment will be extra cost the pass doesn't take into
account and the pass can't realign the stack. */
if (ix86_preferred_stack_boundary < 64
|| ix86_incoming_stack_boundary < 64)
opts->x_target_flags &= ~MASK_STV;
if (!ix86_tune_features[X86_TUNE_AVX256_UNALIGNED_LOAD_OPTIMAL]
&& !(opts_set->x_target_flags & MASK_AVX256_SPLIT_UNALIGNED_LOAD))
opts->x_target_flags |= MASK_AVX256_SPLIT_UNALIGNED_LOAD;
@ -29323,7 +29320,10 @@ ix86_minimum_alignment (tree exp, machine_mode mode,
if ((mode == DImode || (type && TYPE_MODE (type) == DImode))
&& (!type || !TYPE_USER_ALIGN (type))
&& (!decl || !DECL_USER_ALIGN (decl)))
return 32;
{
gcc_checking_assert (!TARGET_STV);
return 32;
}
return align;
}

View File

@ -1,3 +1,9 @@
2016-02-04 Ilya Enkovich <enkovich.gnu@gmail.com>
PR target/69454
* gcc.target/i386/pr69454-1.c: New test.
* gcc.target/i386/pr69454-2.c: New test.
2016-02-03 Martin Sebor <msebor@redhat.com>
PR c++/69251

View File

@ -0,0 +1,11 @@
/* { dg-do compile { target { ia32 } } } */
/* { dg-options "-O2 -msse2 -mno-accumulate-outgoing-args -mpreferred-stack-boundary=2" } */
typedef struct { long long w64[2]; } V128;
extern V128* fn2(void);
long long a;
V128 b;
void fn1() {
V128 *c = fn2();
c->w64[0] = a ^ b.w64[0];
}

View File

@ -0,0 +1,13 @@
/* { dg-do compile { target { ia32 } } } */
/* { dg-options "-O2 -mpreferred-stack-boundary=2" } */
extern void fn2 ();
long long a, b;
void fn1 ()
{
long long c = a;
a = b ^ a;
fn2 ();
a = c;
}