mirror of git://gcc.gnu.org/git/gcc.git
backport: re PR middle-end/71626 (ICE at -O1 and above on x86_64-linux-gnu (in output_constant_pool_2, at varasm.c:3837))
Backported from mainline 2016-06-28 Jakub Jelinek <jakub@redhat.com> PR middle-end/71626 * config/i386/i386.c (ix86_expand_vector_move): For SUBREG of a constant, force its SUBREG_REG into memory or register instead of whole op1. * gcc.c-torture/execute/pr71626-1.c: New test. * gcc.c-torture/execute/pr71626-2.c: New test. From-SVN: r238101
This commit is contained in:
parent
b5af6820de
commit
a51922e1e6
|
|
@ -1,6 +1,13 @@
|
||||||
2016-07-07 Jakub Jelinek <jakub@redhat.com>
|
2016-07-07 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
Backported from mainline
|
Backported from mainline
|
||||||
|
2016-06-28 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR middle-end/71626
|
||||||
|
* config/i386/i386.c (ix86_expand_vector_move): For SUBREG of
|
||||||
|
a constant, force its SUBREG_REG into memory or register instead
|
||||||
|
of whole op1.
|
||||||
|
|
||||||
2016-06-21 Jakub Jelinek <jakub@redhat.com>
|
2016-06-21 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR tree-optimization/71588
|
PR tree-optimization/71588
|
||||||
|
|
|
||||||
|
|
@ -17599,12 +17599,29 @@ ix86_expand_vector_move (machine_mode mode, rtx operands[])
|
||||||
of the register, once we have that information we may be able
|
of the register, once we have that information we may be able
|
||||||
to handle some of them more efficiently. */
|
to handle some of them more efficiently. */
|
||||||
if (can_create_pseudo_p ()
|
if (can_create_pseudo_p ()
|
||||||
&& register_operand (op0, mode)
|
|
||||||
&& (CONSTANT_P (op1)
|
&& (CONSTANT_P (op1)
|
||||||
|| (GET_CODE (op1) == SUBREG
|
|| (GET_CODE (op1) == SUBREG
|
||||||
&& CONSTANT_P (SUBREG_REG (op1))))
|
&& CONSTANT_P (SUBREG_REG (op1))))
|
||||||
&& !standard_sse_constant_p (op1))
|
&& ((register_operand (op0, mode)
|
||||||
op1 = validize_mem (force_const_mem (mode, op1));
|
&& !standard_sse_constant_p (op1))
|
||||||
|
/* ix86_expand_vector_move_misalign() does not like constants. */
|
||||||
|
|| (SSE_REG_MODE_P (mode)
|
||||||
|
&& MEM_P (op0)
|
||||||
|
&& MEM_ALIGN (op0) < align)))
|
||||||
|
{
|
||||||
|
if (SUBREG_P (op1))
|
||||||
|
{
|
||||||
|
machine_mode imode = GET_MODE (SUBREG_REG (op1));
|
||||||
|
rtx r = force_const_mem (imode, SUBREG_REG (op1));
|
||||||
|
if (r)
|
||||||
|
r = validize_mem (r);
|
||||||
|
else
|
||||||
|
r = force_reg (imode, SUBREG_REG (op1));
|
||||||
|
op1 = simplify_gen_subreg (mode, r, imode, SUBREG_BYTE (op1));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
op1 = validize_mem (force_const_mem (mode, op1));
|
||||||
|
}
|
||||||
|
|
||||||
/* We need to check memory alignment for SSE mode since attribute
|
/* We need to check memory alignment for SSE mode since attribute
|
||||||
can make operands unaligned. */
|
can make operands unaligned. */
|
||||||
|
|
@ -17615,13 +17632,8 @@ ix86_expand_vector_move (machine_mode mode, rtx operands[])
|
||||||
{
|
{
|
||||||
rtx tmp[2];
|
rtx tmp[2];
|
||||||
|
|
||||||
/* ix86_expand_vector_move_misalign() does not like constants ... */
|
/* ix86_expand_vector_move_misalign() does not like both
|
||||||
if (CONSTANT_P (op1)
|
arguments in memory. */
|
||||||
|| (GET_CODE (op1) == SUBREG
|
|
||||||
&& CONSTANT_P (SUBREG_REG (op1))))
|
|
||||||
op1 = validize_mem (force_const_mem (mode, op1));
|
|
||||||
|
|
||||||
/* ... nor both arguments in memory. */
|
|
||||||
if (!register_operand (op0, mode)
|
if (!register_operand (op0, mode)
|
||||||
&& !register_operand (op1, mode))
|
&& !register_operand (op1, mode))
|
||||||
op1 = force_reg (mode, op1);
|
op1 = force_reg (mode, op1);
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,12 @@
|
||||||
2016-07-07 Jakub Jelinek <jakub@redhat.com>
|
2016-07-07 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
Backported from mainline
|
Backported from mainline
|
||||||
|
2016-06-28 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
|
PR middle-end/71626
|
||||||
|
* gcc.c-torture/execute/pr71626-1.c: New test.
|
||||||
|
* gcc.c-torture/execute/pr71626-2.c: New test.
|
||||||
|
|
||||||
2016-06-21 Jakub Jelinek <jakub@redhat.com>
|
2016-06-21 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR tree-optimization/71588
|
PR tree-optimization/71588
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
/* PR middle-end/71626 */
|
||||||
|
|
||||||
|
typedef __INTPTR_TYPE__ V __attribute__((__vector_size__(sizeof (__INTPTR_TYPE__))));
|
||||||
|
|
||||||
|
__attribute__((noinline, noclone)) V
|
||||||
|
foo ()
|
||||||
|
{
|
||||||
|
V v = { (__INTPTR_TYPE__) foo };
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
V v = foo ();
|
||||||
|
if (v[0] != (__INTPTR_TYPE__) foo)
|
||||||
|
__builtin_abort ();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
/* PR middle-end/71626 */
|
||||||
|
/* { dg-additional-options "-fpic" { target fpic } } */
|
||||||
|
|
||||||
|
#include "pr71626-1.c"
|
||||||
Loading…
Reference in New Issue