diff options
author | Richard Stallman <rms@gnu.org> | 1993-10-19 04:42:55 +0000 |
---|---|---|
committer | Richard Stallman <rms@gnu.org> | 1993-10-19 04:42:55 +0000 |
commit | 2b067faf78b3441ec3b13deb94536c3e903fffd0 (patch) | |
tree | cd9a9a35fd671ec307b152f7f3ffe2f48f754058 /gcc/rtlanal.c | |
parent | 4b2cb4a29542e58e001ac110a9969925ece7065a (diff) | |
download | gcc-2b067faf78b3441ec3b13deb94536c3e903fffd0.tar.gz |
(volatile_insn_p): New function.
From-SVN: r5803
Diffstat (limited to 'gcc/rtlanal.c')
-rw-r--r-- | gcc/rtlanal.c | 65 |
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. */ |