summaryrefslogtreecommitdiff
path: root/gcc/rtlanal.c
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1993-10-19 04:42:55 +0000
committerRichard Stallman <rms@gnu.org>1993-10-19 04:42:55 +0000
commit2b067faf78b3441ec3b13deb94536c3e903fffd0 (patch)
treecd9a9a35fd671ec307b152f7f3ffe2f48f754058 /gcc/rtlanal.c
parent4b2cb4a29542e58e001ac110a9969925ece7065a (diff)
downloadgcc-2b067faf78b3441ec3b13deb94536c3e903fffd0.tar.gz
(volatile_insn_p): New function.
From-SVN: r5803
Diffstat (limited to 'gcc/rtlanal.c')
-rw-r--r--gcc/rtlanal.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c
index 2ef3d43cfe6..48aa6f9d688 100644
--- a/gcc/rtlanal.c
+++ b/gcc/rtlanal.c
@@ -1259,6 +1259,71 @@ remove_note (insn, note)
abort ();
}
+/* Nonzero if X contains any volatile instructions. These are instructions
+ which may cause unpredictable machine state instructions, and thus no
+ instructions should be moved or combined across them. This includes
+ only volatile asms and UNSPEC_VOLATILE instructions. */
+
+int
+volatile_insn_p (x)
+ rtx x;
+{
+ register RTX_CODE code;
+
+ code = GET_CODE (x);
+ switch (code)
+ {
+ case LABEL_REF:
+ case SYMBOL_REF:
+ case CONST_INT:
+ case CONST:
+ case CONST_DOUBLE:
+ case CC0:
+ case PC:
+ case REG:
+ case SCRATCH:
+ case CLOBBER:
+ case ASM_INPUT:
+ case ADDR_VEC:
+ case ADDR_DIFF_VEC:
+ case CALL:
+ case MEM:
+ return 0;
+
+ case UNSPEC_VOLATILE:
+ /* case TRAP_IF: This isn't clear yet. */
+ return 1;
+
+ case ASM_OPERANDS:
+ if (MEM_VOLATILE_P (x))
+ return 1;
+ }
+
+ /* Recursively scan the operands of this expression. */
+
+ {
+ register char *fmt = GET_RTX_FORMAT (code);
+ register int i;
+
+ for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
+ {
+ if (fmt[i] == 'e')
+ {
+ if (volatile_refs_p (XEXP (x, i)))
+ return 1;
+ }
+ if (fmt[i] == 'E')
+ {
+ register int j;
+ for (j = 0; j < XVECLEN (x, i); j++)
+ if (volatile_refs_p (XVECEXP (x, i, j)))
+ return 1;
+ }
+ }
+ }
+ return 0;
+}
+
/* Nonzero if X contains any volatile memory references
UNSPEC_VOLATILE operations or volatile ASM_OPERANDS expressions. */