aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/aarch64/aarch64.c1
-rw-r--r--gcc/expr.c10
-rw-r--r--gcc/optabs.c10
-rw-r--r--gcc/recog.h17
5 files changed, 33 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1c6f4ad..f41e07a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index e4e9e3f..5bf182c 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 ff1f224..20e3f9c 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 193cd91..4b39ff6 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 75cbbdc..e09b27c 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;