re PR target/90723 (pr88598-2.c segfaults with -msve-vector-bits=256)
authorPrathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
Sat, 13 Jul 2019 08:28:33 +0000 (08:28 +0000)
committerPrathamesh Kulkarni <prathamesh3492@gcc.gnu.org>
Sat, 13 Jul 2019 08:28:33 +0000 (08:28 +0000)
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

gcc/ChangeLog
gcc/config/aarch64/aarch64.c
gcc/expr.c
gcc/optabs.c
gcc/recog.h

index 1c6f4adfd064a75b264664d86c9c9000cf1396ef..f41e07a4789775fd78ccc8b96764fa19a0fa156b 100644 (file)
@@ -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.
index e4e9e3fb02cf49c4bfb0c7cdb208381f65346ee3..5bf182ccc0c3db9940c2d811374e5de012e64904 100644 (file)
@@ -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);
 }
 
index ff1f224d6ce1a38beeb3c4c53147770c4ba61970..20e3f9ce33751703c1e6f4a897f61c1f968dc9a8 100644 (file)
@@ -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;
 }
 
index 193cd9135b7de16d20eff9b191efe6a12818d00d..4b39ff61193ccb256f76883b4e73d33040514c80 100644 (file)
@@ -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);
index 75cbbdc10ad7c5bbf6035b9d70066b5e4b3afcde..e09b27c5be1e22fc6e11b365d07101ea6de32832 100644 (file)
@@ -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;