mirror of git://gcc.gnu.org/git/gcc.git
re PR rtl-optimization/55151 (ICE: in assign_by_spills, at lra-assigns.c:1217 with -fPIC)
2012-11-05 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/55151 * lra-constraints.c (process_alt_operands): Permit putting reg value into memory. Increase reject for this case. 2012-11-05 Vladimir Makarov <vmakarov@redhat.com> PR rtl-optimization/55151 * gcc.dg/pr55151.c: New test. From-SVN: r193170
This commit is contained in:
parent
48866799f1
commit
1bdc4b116e
|
|
@ -1,3 +1,9 @@
|
||||||
|
2012-11-05 Vladimir Makarov <vmakarov@redhat.com>
|
||||||
|
|
||||||
|
PR rtl-optimization/55151
|
||||||
|
* lra-constraints.c (process_alt_operands): Permit putting reg
|
||||||
|
value into memory. Increase reject for this case.
|
||||||
|
|
||||||
2012-11-05 Dehao Chen <dehao@google.com>
|
2012-11-05 Dehao Chen <dehao@google.com>
|
||||||
|
|
||||||
* final.c (reemit_insn_block_notes): Do not change scope if insn
|
* final.c (reemit_insn_block_notes): Do not change scope if insn
|
||||||
|
|
|
||||||
|
|
@ -1581,7 +1581,9 @@ process_alt_operands (int only_alternative)
|
||||||
case TARGET_MEM_CONSTRAINT:
|
case TARGET_MEM_CONSTRAINT:
|
||||||
if (MEM_P (op) || spilled_pseudo_p (op))
|
if (MEM_P (op) || spilled_pseudo_p (op))
|
||||||
win = true;
|
win = true;
|
||||||
if (CONST_POOL_OK_P (mode, op))
|
/* We can put constant or pseudo value into memory
|
||||||
|
to satisfy the constraint. */
|
||||||
|
if (CONST_POOL_OK_P (mode, op) || REG_P (op))
|
||||||
badop = false;
|
badop = false;
|
||||||
constmemok = true;
|
constmemok = true;
|
||||||
break;
|
break;
|
||||||
|
|
@ -1613,7 +1615,10 @@ process_alt_operands (int only_alternative)
|
||||||
&& offsettable_nonstrict_memref_p (op))
|
&& offsettable_nonstrict_memref_p (op))
|
||||||
|| spilled_pseudo_p (op))
|
|| spilled_pseudo_p (op))
|
||||||
win = true;
|
win = true;
|
||||||
if (CONST_POOL_OK_P (mode, op) || MEM_P (op))
|
/* We can put constant or pseudo value into memory
|
||||||
|
or make memory address offsetable to satisfy the
|
||||||
|
constraint. */
|
||||||
|
if (CONST_POOL_OK_P (mode, op) || MEM_P (op) || REG_P (op))
|
||||||
badop = false;
|
badop = false;
|
||||||
constmemok = true;
|
constmemok = true;
|
||||||
offmemok = true;
|
offmemok = true;
|
||||||
|
|
@ -1638,6 +1643,7 @@ process_alt_operands (int only_alternative)
|
||||||
if (CONST_INT_P (op)
|
if (CONST_INT_P (op)
|
||||||
|| (GET_CODE (op) == CONST_DOUBLE && mode == VOIDmode))
|
|| (GET_CODE (op) == CONST_DOUBLE && mode == VOIDmode))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'i':
|
case 'i':
|
||||||
if (general_constant_p (op))
|
if (general_constant_p (op))
|
||||||
win = true;
|
win = true;
|
||||||
|
|
@ -1702,10 +1708,12 @@ process_alt_operands (int only_alternative)
|
||||||
win = true;
|
win = true;
|
||||||
|
|
||||||
/* If we didn't already win, we can reload
|
/* If we didn't already win, we can reload
|
||||||
constants via force_const_mem, and other
|
constants via force_const_mem or put the
|
||||||
MEMs by reloading the address like for
|
pseudo value into memory, or make other
|
||||||
|
memory by reloading the address like for
|
||||||
'o'. */
|
'o'. */
|
||||||
if (CONST_POOL_OK_P (mode, op) || MEM_P (op))
|
if (CONST_POOL_OK_P (mode, op)
|
||||||
|
|| MEM_P (op) || REG_P (op))
|
||||||
badop = false;
|
badop = false;
|
||||||
constmemok = true;
|
constmemok = true;
|
||||||
offmemok = true;
|
offmemok = true;
|
||||||
|
|
@ -1919,6 +1927,13 @@ process_alt_operands (int only_alternative)
|
||||||
+= ira_reg_class_max_nregs[this_alternative][mode];
|
+= ira_reg_class_max_nregs[this_alternative][mode];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* We are trying to spill pseudo into memory. It is
|
||||||
|
usually more costly than moving to a hard register
|
||||||
|
although it might takes the same number of
|
||||||
|
reloads. */
|
||||||
|
if (no_regs_p && REG_P (op))
|
||||||
|
reject++;
|
||||||
|
|
||||||
/* Input reloads can be inherited more often than output
|
/* Input reloads can be inherited more often than output
|
||||||
reloads can be removed, so penalize output
|
reloads can be removed, so penalize output
|
||||||
reloads. */
|
reloads. */
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,8 @@
|
||||||
|
2012-11-05 Vladimir Makarov <vmakarov@redhat.com>
|
||||||
|
|
||||||
|
PR rtl-optimization/55151
|
||||||
|
* gcc.dg/pr55151.c: New test.
|
||||||
|
|
||||||
2012-11-05 Jakub Jelinek <jakub@redhat.com>
|
2012-11-05 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR debug/54970
|
PR debug/54970
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
/* PR rtl-optimization/55151 */
|
||||||
|
/* { dg-do compile } */
|
||||||
|
/* { dg-options "-fPIC" } */
|
||||||
|
|
||||||
|
int a, b, c, d, e, f, g, h, i, j, k, l;
|
||||||
|
void f4 (void)
|
||||||
|
{
|
||||||
|
__asm__ volatile ("":[a] "=r,m" (a),[b] "=r,m" (b),[c] "=r,m" (c),
|
||||||
|
[d] "=r,m" (d),[e] "=r,m" (e),[f] "=r,m" (f),
|
||||||
|
[g] "=r,m" (g),[h] "=r,m" (h),[i] "=r,m" (i),
|
||||||
|
[j] "=r,m" (j),[k] "=r,m" (k),[l] "=r,m" (l):"[a],m" (a),
|
||||||
|
"[j],m" (j), "[k],m" (k), "[l],m" (l));
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue