From f2b29269c407f10718bc935b3dd5c7e8641b6847 Mon Sep 17 00:00:00 2001 From: Prathamesh Kulkarni Date: Sat, 13 Jul 2019 08:28:33 +0000 Subject: [PATCH] re PR target/90723 (pr88598-2.c segfaults with -msve-vector-bits=256) 2019-07-15 Prathamesh Kulkarni 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 --- gcc/ChangeLog | 9 +++++++++ gcc/config/aarch64/aarch64.c | 1 + gcc/expr.c | 10 ++-------- gcc/optabs.c | 10 ++++------ gcc/recog.h | 17 +++++++++++++++++ 5 files changed, 33 insertions(+), 14 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1c6f4adfd06..f41e07a4789 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2019-07-14 Prathamesh Kulkarni + + 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 * gimplify.c (struct gimplify_omp_ctx): Add order_concurrent member. diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index e4e9e3fb02c..5bf182ccc0c 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -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); } diff --git a/gcc/expr.c b/gcc/expr.c index ff1f224d6ce..20e3f9ce337 100644 --- a/gcc/expr.c +++ b/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; } diff --git a/gcc/optabs.c b/gcc/optabs.c index 193cd9135b7..4b39ff61193 100644 --- a/gcc/optabs.c +++ b/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); diff --git a/gcc/recog.h b/gcc/recog.h index 75cbbdc10ad..e09b27c5be1 100644 --- a/gcc/recog.h +++ b/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; -- 2.30.2