Canonicalize asm volatility earlier
authorRichard Henderson <rth@redhat.com>
Mon, 11 May 2015 23:33:17 +0000 (16:33 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Mon, 11 May 2015 23:33:17 +0000 (16:33 -0700)
If gimple_asm_volatile_p is correct, no point re-checking.
This is also done by the C and C++ front ends, but not Ada.
So we can't yet trust ASM_VOLATILE_P from the front end.

From-SVN: r223024

gcc/ChangeLog
gcc/cfgexpand.c
gcc/gimplify.c

index f544900002549a7928f631863f0a23c3100f2843..81b71bcc10587a4479c5240ff834cb1d4f299264 100644 (file)
@@ -1,5 +1,9 @@
 2015-05-11  Richard Henderson  <rth@redhat.com>
 
+       * gimplify.c (gimplify_asm_expr): Set gimple_asm_volatile_p
+       if noutputs is zero.
+       * cfgexpand.c (expand_asm_stmt): Use gimple_asm_volatile_p unchanged.
+
        * cfgexpand.c (expand_asm_operands): Merge into...
        (expand_asm_stmt): ... here.
 
index 5d44c48b6c4daca55f74212e5c284d3951469a92..0479279b596b362cfef2ffa329a19da61ceb1823 100644 (file)
@@ -2587,8 +2587,6 @@ expand_asm_stmt (gasm *stmt)
   for (i = 0; i < noutputs; ++i)
     orig_outputs[i] = TREE_VALUE (gimple_asm_output_op (stmt, i));
 
-  bool vol = gimple_asm_volatile_p (stmt);
-
   rtvec argvec, constraintvec, labelvec;
   rtx body;
   int ninout;
@@ -2603,10 +2601,6 @@ expand_asm_stmt (gasm *stmt)
   int old_generating_concat_p = generating_concat_p;
   rtx_code_label *fallthru_label = NULL;
 
-  /* An ASM with no outputs needs to be treated as volatile, for now.  */
-  if (noutputs == 0)
-    vol = 1;
-
   if (! check_operand_nalternatives (outputs, inputs))
     return;
 
@@ -2815,7 +2809,7 @@ expand_asm_stmt (gasm *stmt)
                               empty_string, 0, argvec, constraintvec,
                               labelvec, locus);
 
-  MEM_VOLATILE_P (body) = vol;
+  MEM_VOLATILE_P (body) = gimple_asm_volatile_p (stmt);
 
   /* Eval the inputs and put them into ARGVEC.
      Put their constraints into ASM_INPUTs and store in CONSTRAINTS.  */
@@ -2963,7 +2957,8 @@ expand_asm_stmt (gasm *stmt)
                            ggc_strdup (constraints[i]),
                            i, argvec, constraintvec, labelvec, locus));
 
-         MEM_VOLATILE_P (SET_SRC (XVECEXP (body, 0, i))) = vol;
+         MEM_VOLATILE_P (SET_SRC (XVECEXP (body, 0, i)))
+           = gimple_asm_volatile_p (stmt);
        }
 
       /* If there are no outputs (but there are some clobbers)
index 9ce3dd973ccb84ebedc28d47d9c713374398e07f..623d33dee7736b2eedfd66cc3a34e05b67f979c7 100644 (file)
@@ -5272,7 +5272,7 @@ gimplify_asm_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
       stmt = gimple_build_asm_vec (TREE_STRING_POINTER (ASM_STRING (expr)),
                                   inputs, outputs, clobbers, labels);
 
-      gimple_asm_set_volatile (stmt, ASM_VOLATILE_P (expr));
+      gimple_asm_set_volatile (stmt, ASM_VOLATILE_P (expr) || noutputs == 0);
       gimple_asm_set_input (stmt, ASM_INPUT_P (expr));
 
       gimplify_seq_add_stmt (pre_p, stmt);