mirror of git://gcc.gnu.org/git/gcc.git
re PR target/51681 (ICE in gcc.dg/torture/vshuf-v2si.c on ia64)
PR target/51681 * config/ia64/ia64.c (expand_vec_perm_shrp): Use correct operands for shrp pattern. Correctly handle and fixup shift variable. Return false when shift > nelt for BYTES_BIG_ENDIAN target. From-SVN: r182931
This commit is contained in:
parent
a32e5e9357
commit
2d130b315d
|
@ -1,3 +1,10 @@
|
||||||
|
2012-01-05 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
|
PR target/51681
|
||||||
|
* config/ia64/ia64.c (expand_vec_perm_shrp): Use correct operands
|
||||||
|
for shrp pattern. Correctly handle and fixup shift variable.
|
||||||
|
Return false when shift > nelt for BYTES_BIG_ENDIAN target.
|
||||||
|
|
||||||
2012-01-05 Jakub Jelinek <jakub@redhat.com>
|
2012-01-05 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR debug/51762
|
PR debug/51762
|
||||||
|
@ -42,8 +49,7 @@
|
||||||
2012-01-05 Jakub Jelinek <jakub@redhat.com>
|
2012-01-05 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR middle-end/51761
|
PR middle-end/51761
|
||||||
* gimple.h (struct gimplify_ctx): Add in_cleanup_point_expr
|
* gimple.h (struct gimplify_ctx): Add in_cleanup_point_expr field.
|
||||||
field.
|
|
||||||
* gimplify.c (gimplify_cleanup_point_expr): Save and set
|
* gimplify.c (gimplify_cleanup_point_expr): Save and set
|
||||||
in_cleanup_point_expr before gimplify_stmt call and restore it
|
in_cleanup_point_expr before gimplify_stmt call and restore it
|
||||||
afterwards.
|
afterwards.
|
||||||
|
@ -183,17 +189,15 @@
|
||||||
PR tree-optimization/49651
|
PR tree-optimization/49651
|
||||||
* tree-ssa-structalias.c (type_can_have_subvars): New function.
|
* tree-ssa-structalias.c (type_can_have_subvars): New function.
|
||||||
(var_can_have_subvars): Use it.
|
(var_can_have_subvars): Use it.
|
||||||
(get_constraint_for_1): Only consider subfields if there
|
(get_constraint_for_1): Only consider subfields if there can be any.
|
||||||
can be any.
|
|
||||||
|
|
||||||
2012-01-03 Jakub Jelinek <jakub@redhat.com>
|
2012-01-03 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR bootstrap/51725
|
PR bootstrap/51725
|
||||||
* cselib.c (new_elt_loc_list): When moving locs from one
|
* cselib.c (new_elt_loc_list): When moving locs from one cselib_val
|
||||||
cselib_val to its new canonical_cselib_val and the
|
to its new canonical_cselib_val and the cselib_val was in
|
||||||
cselib_val was in first_containing_mem chain, but
|
first_containing_mem chain, but the canonical_cselib_val was not,
|
||||||
the canonical_cselib_val was not, add the latter into the
|
add the latter into the chain.
|
||||||
chain.
|
|
||||||
(cselib_invalidate_mem): Compare canonical_cselib_val of
|
(cselib_invalidate_mem): Compare canonical_cselib_val of
|
||||||
addr_list chain elt with v.
|
addr_list chain elt with v.
|
||||||
|
|
||||||
|
|
|
@ -11085,7 +11085,7 @@ static bool
|
||||||
expand_vec_perm_shrp (struct expand_vec_perm_d *d)
|
expand_vec_perm_shrp (struct expand_vec_perm_d *d)
|
||||||
{
|
{
|
||||||
unsigned i, nelt = d->nelt, shift, mask;
|
unsigned i, nelt = d->nelt, shift, mask;
|
||||||
rtx tmp, op0, op1;;
|
rtx tmp, hi, lo;
|
||||||
|
|
||||||
/* ??? Don't force V2SFmode into the integer registers. */
|
/* ??? Don't force V2SFmode into the integer registers. */
|
||||||
if (d->vmode == V2SFmode)
|
if (d->vmode == V2SFmode)
|
||||||
|
@ -11094,6 +11094,9 @@ expand_vec_perm_shrp (struct expand_vec_perm_d *d)
|
||||||
mask = (d->one_operand_p ? nelt - 1 : 2 * nelt - 1);
|
mask = (d->one_operand_p ? nelt - 1 : 2 * nelt - 1);
|
||||||
|
|
||||||
shift = d->perm[0];
|
shift = d->perm[0];
|
||||||
|
if (BYTES_BIG_ENDIAN && shift > nelt)
|
||||||
|
return false;
|
||||||
|
|
||||||
for (i = 1; i < nelt; ++i)
|
for (i = 1; i < nelt; ++i)
|
||||||
if (d->perm[i] != ((shift + i) & mask))
|
if (d->perm[i] != ((shift + i) & mask))
|
||||||
return false;
|
return false;
|
||||||
|
@ -11101,6 +11104,11 @@ expand_vec_perm_shrp (struct expand_vec_perm_d *d)
|
||||||
if (d->testing_p)
|
if (d->testing_p)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
hi = shift < nelt ? d->op1 : d->op0;
|
||||||
|
lo = shift < nelt ? d->op0 : d->op1;
|
||||||
|
|
||||||
|
shift %= nelt;
|
||||||
|
|
||||||
shift *= GET_MODE_UNIT_SIZE (d->vmode) * BITS_PER_UNIT;
|
shift *= GET_MODE_UNIT_SIZE (d->vmode) * BITS_PER_UNIT;
|
||||||
|
|
||||||
/* We've eliminated the shift 0 case via expand_vec_perm_identity. */
|
/* We've eliminated the shift 0 case via expand_vec_perm_identity. */
|
||||||
|
@ -11113,11 +11121,9 @@ expand_vec_perm_shrp (struct expand_vec_perm_d *d)
|
||||||
shift = 64 - shift;
|
shift = 64 - shift;
|
||||||
|
|
||||||
tmp = gen_reg_rtx (DImode);
|
tmp = gen_reg_rtx (DImode);
|
||||||
op0 = (shift < nelt ? d->op0 : d->op1);
|
hi = gen_lowpart (DImode, hi);
|
||||||
op1 = (shift < nelt ? d->op1 : d->op0);
|
lo = gen_lowpart (DImode, lo);
|
||||||
op0 = gen_lowpart (DImode, op0);
|
emit_insn (gen_shrp (tmp, hi, lo, GEN_INT (shift)));
|
||||||
op1 = gen_lowpart (DImode, op1);
|
|
||||||
emit_insn (gen_shrp (tmp, op0, op1, GEN_INT (shift)));
|
|
||||||
|
|
||||||
emit_move_insn (d->target, gen_lowpart (d->vmode, tmp));
|
emit_move_insn (d->target, gen_lowpart (d->vmode, tmp));
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in New Issue