Patchwork Minor fix for UNSPEC_VOLATILE

login
register
mail settings
Submitter Eric Botcazou
Date Dec. 21, 2012, 9:36 p.m.
Message ID <1851911.cImv7d0m3y@polaris>
Download mbox | patch
Permalink /patch/207878/
State New
Headers show

Comments

Eric Botcazou - Dec. 21, 2012, 9:36 p.m.
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  <ebotcazou@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.

Patch

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);