The more you dig into the UNSPEC_VOLATILE/asm volatile business, the more you
find that the manual, the code and the comments entirely disagree about them.
At least something is consistent: as documented in rtl.def, UNSPEC_VOLATILE
can trap. That's why it was wrong for the unspec_may_trap_p hook to handle
them in addition to regular UNSPECs. Fortunately, only IA-64 defines the hook
and it doesn't do anything for UNSPEC_VOLATILEs.
Tested on x86-64/Linux and IA-64/Linux, applied on the mainline.
2012-12-21 Eric Botcazou <ebotca...@adacore.com>
* rtlanal.c (volatile_insn_p): Delete commented out code.
(side_effects_p): Likewise.
(may_trap_p_1) <UNSPEC_VOLATILE>: Return 1 again.
* target.def (unspec_may_trap_p): Adjust comment.
* targhooks.c (default_unspec_may_trap_p): Don't handle UNSPEC_VOLATILE.
* config/ia64/ia64.c (ia64_unspec_may_trap_p): Adjust to above change.
--
Eric Botcazou
Index: targhooks.c
===================================================================
--- targhooks.c (revision 194669)
+++ targhooks.c (working copy)
@@ -102,10 +102,8 @@ default_unspec_may_trap_p (const_rtx x,
{
int i;
- if (GET_CODE (x) == UNSPEC_VOLATILE
- /* Any floating arithmetic may trap. */
- || (SCALAR_FLOAT_MODE_P (GET_MODE (x))
- && flag_trapping_math))
+ /* Any floating arithmetic may trap. */
+ if ((SCALAR_FLOAT_MODE_P (GET_MODE (x)) && flag_trapping_math))
return 1;
for (i = 0; i < XVECLEN (x, 0); ++i)
Index: target.def
===================================================================
--- target.def (revision 194669)
+++ target.def (working copy)
@@ -1816,7 +1816,7 @@ DEFHOOK
"",
rtx, (rtx hard_reg), NULL)
-/* Return nonzero if evaluating UNSPEC[_VOLATILE] X might cause a trap.
+/* Return nonzero if evaluating UNSPEC X might cause a trap.
FLAGS has the same meaning as in rtlanal.c: may_trap_p_1. */
DEFHOOK
(unspec_may_trap_p,
Index: rtlanal.c
===================================================================
--- rtlanal.c (revision 194669)
+++ rtlanal.c (working copy)
@@ -2107,7 +2107,6 @@ volatile_insn_p (const_rtx x)
return 0;
case UNSPEC_VOLATILE:
- /* case TRAP_IF: This isn't clear yet. */
return 1;
case ASM_INPUT:
@@ -2240,7 +2239,6 @@ side_effects_p (const_rtx x)
case POST_MODIFY:
case CALL:
case UNSPEC_VOLATILE:
- /* case TRAP_IF: This isn't clear yet. */
return 1;
case MEM:
@@ -2312,9 +2310,9 @@ may_trap_p_1 (const_rtx x, unsigned flag
return 0;
case UNSPEC:
- case UNSPEC_VOLATILE:
return targetm.unspec_may_trap_p (x, flags);
+ case UNSPEC_VOLATILE:
case ASM_INPUT:
case TRAP_IF:
return 1;
@@ -2406,8 +2404,7 @@ may_trap_p_1 (const_rtx x, unsigned flag
default:
/* Any floating arithmetic may trap. */
- if (SCALAR_FLOAT_MODE_P (GET_MODE (x))
- && flag_trapping_math)
+ if (SCALAR_FLOAT_MODE_P (GET_MODE (x)) && flag_trapping_math)
return 1;
}
Index: config/ia64/ia64.c
===================================================================
--- config/ia64/ia64.c (revision 194669)
+++ config/ia64/ia64.c (working copy)
@@ -5845,19 +5845,16 @@ ia64_secondary_reload_class (enum reg_cl
static int
ia64_unspec_may_trap_p (const_rtx x, unsigned flags)
{
- if (GET_CODE (x) == UNSPEC)
+ switch (XINT (x, 1))
{
- switch (XINT (x, 1))
- {
- case UNSPEC_LDA:
- case UNSPEC_LDS:
- case UNSPEC_LDSA:
- case UNSPEC_LDCCLR:
- case UNSPEC_CHKACLR:
- case UNSPEC_CHKS:
- /* These unspecs are just wrappers. */
- return may_trap_p_1 (XVECEXP (x, 0, 0), flags);
- }
+ case UNSPEC_LDA:
+ case UNSPEC_LDS:
+ case UNSPEC_LDSA:
+ case UNSPEC_LDCCLR:
+ case UNSPEC_CHKACLR:
+ case UNSPEC_CHKS:
+ /* These unspecs are just wrappers. */
+ return may_trap_p_1 (XVECEXP (x, 0, 0), flags);
}
return default_unspec_may_trap_p (x, flags);