re PR target/90723 (pr88598-2.c segfaults with -msve-vector-bits=256)
2019-07-15 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org> PR target/90723 * recog.h (temporary_volatile_ok): New class. * config/aarch64/aarch64.c (aarch64_emit_sve_pred_move): Set volatile_ok temporarily to true using temporary_volatile_ok. * expr.c (emit_block_move_via_cpymem): Likewise. * optabs.c (maybe_legitimize_operand): Likewise. From-SVN: r273466
This commit is contained in:
parent
1a888209de
commit
f2b29269c4
5 changed files with 33 additions and 14 deletions
|
@ -1,3 +1,12 @@
|
|||
2019-07-14 Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
|
||||
|
||||
PR target/90723
|
||||
* recog.h (temporary_volatile_ok): New class.
|
||||
* config/aarch64/aarch64.c (aarch64_emit_sve_pred_move): Set
|
||||
volatile_ok temporarily to true using temporary_volatile_ok.
|
||||
* expr.c (emit_block_move_via_cpymem): Likewise.
|
||||
* optabs.c (maybe_legitimize_operand): Likewise.
|
||||
|
||||
2019-07-13 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* gimplify.c (struct gimplify_omp_ctx): Add order_concurrent member.
|
||||
|
|
|
@ -3457,6 +3457,7 @@ aarch64_emit_sve_pred_move (rtx dest, rtx pred, rtx src)
|
|||
create_output_operand (&ops[0], dest, mode);
|
||||
create_input_operand (&ops[1], pred, GET_MODE(pred));
|
||||
create_input_operand (&ops[2], src, mode);
|
||||
temporary_volatile_ok v (true);
|
||||
expand_insn (code_for_aarch64_pred_mov (mode), 3, ops);
|
||||
}
|
||||
|
||||
|
|
10
gcc/expr.c
10
gcc/expr.c
|
@ -1732,8 +1732,6 @@ emit_block_move_via_cpymem (rtx x, rtx y, rtx size, unsigned int align,
|
|||
unsigned HOST_WIDE_INT max_size,
|
||||
unsigned HOST_WIDE_INT probable_max_size)
|
||||
{
|
||||
int save_volatile_ok = volatile_ok;
|
||||
|
||||
if (expected_align < align)
|
||||
expected_align = align;
|
||||
if (expected_size != -1)
|
||||
|
@ -1745,7 +1743,7 @@ emit_block_move_via_cpymem (rtx x, rtx y, rtx size, unsigned int align,
|
|||
}
|
||||
|
||||
/* Since this is a move insn, we don't care about volatility. */
|
||||
volatile_ok = 1;
|
||||
temporary_volatile_ok v (true);
|
||||
|
||||
/* Try the most limited insn first, because there's no point
|
||||
including more than one in the machine description unless
|
||||
|
@ -1809,14 +1807,10 @@ emit_block_move_via_cpymem (rtx x, rtx y, rtx size, unsigned int align,
|
|||
create_fixed_operand (&ops[8], NULL);
|
||||
}
|
||||
if (maybe_expand_insn (code, nops, ops))
|
||||
{
|
||||
volatile_ok = save_volatile_ok;
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
volatile_ok = save_volatile_ok;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
10
gcc/optabs.c
10
gcc/optabs.c
|
@ -7202,17 +7202,15 @@ maybe_legitimize_operand (enum insn_code icode, unsigned int opno,
|
|||
class expand_operand *op)
|
||||
{
|
||||
machine_mode mode, imode;
|
||||
bool old_volatile_ok, result;
|
||||
|
||||
mode = op->mode;
|
||||
switch (op->type)
|
||||
{
|
||||
case EXPAND_FIXED:
|
||||
old_volatile_ok = volatile_ok;
|
||||
volatile_ok = true;
|
||||
result = maybe_legitimize_operand_same_code (icode, opno, op);
|
||||
volatile_ok = old_volatile_ok;
|
||||
return result;
|
||||
{
|
||||
temporary_volatile_ok v (true);
|
||||
return maybe_legitimize_operand_same_code (icode, opno, op);
|
||||
}
|
||||
|
||||
case EXPAND_OUTPUT:
|
||||
gcc_assert (mode != VOIDmode);
|
||||
|
|
17
gcc/recog.h
17
gcc/recog.h
|
@ -186,6 +186,23 @@ skip_alternative (const char *p)
|
|||
/* Nonzero means volatile operands are recognized. */
|
||||
extern int volatile_ok;
|
||||
|
||||
/* RAII class for temporarily setting volatile_ok. */
|
||||
|
||||
class temporary_volatile_ok
|
||||
{
|
||||
public:
|
||||
temporary_volatile_ok (int value) : save_volatile_ok (volatile_ok)
|
||||
{
|
||||
volatile_ok = value;
|
||||
}
|
||||
|
||||
~temporary_volatile_ok () { volatile_ok = save_volatile_ok; }
|
||||
|
||||
private:
|
||||
temporary_volatile_ok (const temporary_volatile_ok &);
|
||||
int save_volatile_ok;
|
||||
};
|
||||
|
||||
/* Set by constrain_operands to the number of the alternative that
|
||||
matched. */
|
||||
extern int which_alternative;
|
||||
|
|
Loading…
Add table
Reference in a new issue