Module Name:    src
Committed By:   kalvisd
Date:           Sun Sep 29 11:45:32 UTC 2024

Modified Files:
        src/external/gpl3/gcc/dist/gcc: rtlanal.cc target.def targhooks.cc
            targhooks.h
        src/external/gpl3/gcc/dist/gcc/config/vax: vax.cc
        src/external/gpl3/gcc/dist/gcc/doc: tm.texi tm.texi.in

Log Message:
gcc: vax: indicate to GCC that bitfield instructions may trap on VAX

    Bitfield instructions will generate a reserved operand fault if the
    operands are not reasonable (size > 32, position > 31 and size not
    zero and field in a register).  GCC generates code to test for these
    conditions but in certain circumstances, the optimiser may decide that
    a bitfield extraction instruction is invariant and move it ahead of
    the instructions testing its arguments.

    Introduce a new target hook to indicate to GCC that a bitfield
    instruction may trap and update may_trap_p_1()

    OK rin@


To generate a diff of this commit:
cvs rdiff -u -r1.1.1.2 -r1.2 src/external/gpl3/gcc/dist/gcc/rtlanal.cc
cvs rdiff -u -r1.1.1.11 -r1.2 src/external/gpl3/gcc/dist/gcc/target.def \
    src/external/gpl3/gcc/dist/gcc/targhooks.h
cvs rdiff -u -r1.2 -r1.3 src/external/gpl3/gcc/dist/gcc/targhooks.cc
cvs rdiff -u -r1.7 -r1.8 src/external/gpl3/gcc/dist/gcc/config/vax/vax.cc
cvs rdiff -u -r1.1.1.14 -r1.2 src/external/gpl3/gcc/dist/gcc/doc/tm.texi
cvs rdiff -u -r1.1.1.13 -r1.2 src/external/gpl3/gcc/dist/gcc/doc/tm.texi.in

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/external/gpl3/gcc/dist/gcc/rtlanal.cc
diff -u src/external/gpl3/gcc/dist/gcc/rtlanal.cc:1.1.1.2 src/external/gpl3/gcc/dist/gcc/rtlanal.cc:1.2
--- src/external/gpl3/gcc/dist/gcc/rtlanal.cc:1.1.1.2	Sun Jun 30 07:35:57 2024
+++ src/external/gpl3/gcc/dist/gcc/rtlanal.cc	Sun Sep 29 11:45:31 2024
@@ -3280,6 +3280,15 @@ may_trap_p_1 (const_rtx x, unsigned flag
       /* These operations don't trap even with floating point.  */
       break;
 
+    case SIGN_EXTRACT:
+      if (targetm.have_extv ())
+	return targetm.bitfield_may_trap_p (x, flags);
+      break;
+    case ZERO_EXTRACT:
+      if (targetm.have_extzv ())
+	return targetm.bitfield_may_trap_p (x, flags);
+      break;
+
     default:
       /* Any floating arithmetic may trap.  */
       if (FLOAT_MODE_P (GET_MODE (x)) && flag_trapping_math)

Index: src/external/gpl3/gcc/dist/gcc/target.def
diff -u src/external/gpl3/gcc/dist/gcc/target.def:1.1.1.11 src/external/gpl3/gcc/dist/gcc/target.def:1.2
--- src/external/gpl3/gcc/dist/gcc/target.def:1.1.1.11	Sun Jul 30 05:20:51 2023
+++ src/external/gpl3/gcc/dist/gcc/target.def	Sun Sep 29 11:45:32 2024
@@ -3976,6 +3976,20 @@ passed along.",
  int, (const_rtx x, unsigned flags),
  default_unspec_may_trap_p)
 
+/* Return nonzero if evaluating SIGN_EXTRACT X or ZERO_EXTRACT X might
+   cause a trap.  FLAGS has the same meaning as in rtlanal.c:
+   may_trap_p_1. */
+DEFHOOK
+(bitfield_may_trap_p,
+ "This target hook returns nonzero if @var{x}, an @code{sign_extract} or\n\
+@code{zero_extract} operation, might cause a trap.  Targets can use\n\
+this hook to enhance precision of analysis for @code{sign_extract} and\n\
+@code{zero_extract} operations.  You may call @code{may_trap_p_1}\n\
+to analyze inner elements of @var{x} in which case @var{flags} should be\n\
+passed along.",
+ int, (const_rtx x, unsigned flags),
+ default_bitfield_may_trap_p)
+
 /* Given a register, this hook should return a parallel of registers
    to represent where to find the register pieces.  Define this hook
    if the register and its mode are represented in Dwarf in
Index: src/external/gpl3/gcc/dist/gcc/targhooks.h
diff -u src/external/gpl3/gcc/dist/gcc/targhooks.h:1.1.1.11 src/external/gpl3/gcc/dist/gcc/targhooks.h:1.2
--- src/external/gpl3/gcc/dist/gcc/targhooks.h:1.1.1.11	Sun Jul 30 05:20:47 2023
+++ src/external/gpl3/gcc/dist/gcc/targhooks.h	Sun Sep 29 11:45:32 2024
@@ -29,6 +29,7 @@ extern bool default_legitimize_address_d
 extern bool default_const_not_ok_for_debug_p (rtx);
 
 extern int default_unspec_may_trap_p (const_rtx, unsigned);
+extern int default_bitfield_may_trap_p (const_rtx, unsigned);
 extern machine_mode default_promote_function_mode (const_tree, machine_mode,
 							int *, const_tree, int);
 extern machine_mode default_promote_function_mode_always_promote

Index: src/external/gpl3/gcc/dist/gcc/targhooks.cc
diff -u src/external/gpl3/gcc/dist/gcc/targhooks.cc:1.2 src/external/gpl3/gcc/dist/gcc/targhooks.cc:1.3
--- src/external/gpl3/gcc/dist/gcc/targhooks.cc:1.2	Sun Jul 30 06:15:16 2023
+++ src/external/gpl3/gcc/dist/gcc/targhooks.cc	Sun Sep 29 11:45:32 2024
@@ -136,6 +136,12 @@ default_unspec_may_trap_p (const_rtx x, 
   return 0;
 }
 
+int
+default_bitfield_may_trap_p (const_rtx x, unsigned flags)
+{
+  return 0;
+}
+
 machine_mode
 default_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
 			       machine_mode mode,

Index: src/external/gpl3/gcc/dist/gcc/config/vax/vax.cc
diff -u src/external/gpl3/gcc/dist/gcc/config/vax/vax.cc:1.7 src/external/gpl3/gcc/dist/gcc/config/vax/vax.cc:1.8
--- src/external/gpl3/gcc/dist/gcc/config/vax/vax.cc:1.7	Sun Sep 29 09:32:36 2024
+++ src/external/gpl3/gcc/dist/gcc/config/vax/vax.cc	Sun Sep 29 11:45:31 2024
@@ -68,6 +68,7 @@ static void vax_trampoline_init (rtx, tr
 static poly_int64 vax_return_pops_args (tree, tree, poly_int64);
 static bool vax_mode_dependent_address_p (const_rtx, addr_space_t);
 static HOST_WIDE_INT vax_starting_frame_offset (void);
+static int vax_bitfield_may_trap_p (const_rtx, unsigned);
 
 /* Initialize the GCC target structure.  */
 #undef TARGET_ASM_ALIGNED_HI_OP
@@ -141,6 +142,9 @@ static HOST_WIDE_INT vax_starting_frame_
 #undef TARGET_HAVE_SPECULATION_SAFE_VALUE
 #define TARGET_HAVE_SPECULATION_SAFE_VALUE speculation_safe_value_not_needed
 
+#undef TARGET_BITFIELD_MAY_TRAP_P
+#define TARGET_BITFIELD_MAY_TRAP_P vax_bitfield_may_trap_p
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 /* Set global variables as needed for the options enabled.  */
@@ -2328,3 +2332,33 @@ vax_starting_frame_offset (void)
   return TARGET_ELF ? -4 : 0;
 }
 
+/* Return 1 if a bitfield instruction (extv/extzv) may trap */
+static int
+vax_bitfield_may_trap_p (const_rtx x, unsigned flags)
+{
+  /* per the VARM
+   * Bitfield instructions may trap if
+   * size (arg1) GTRU 32
+   * size (arg1) NEQ 0, pos (arg 2) GTRU 31 and the field is in a register
+   * i.e. REG_P(operands[0]) is true
+   *
+   * GCC can only determine that a bitfield instruction will not trap
+   * if the size and position arguments are constants; if they aren't,
+   * the instruction must be assumed to trap.
+   */
+  rtx field = XEXP (x, 0);
+  rtx size = XEXP (x, 1);
+  rtx pos = XEXP (x, 2);
+  int retval = 0;
+
+  if (!CONST_INT_P (size) || !CONST_INT_P (pos))
+    retval = 1;
+  else if (INTVAL (size) < 0 || INTVAL (size) > GET_MODE_BITSIZE ( SImode ))
+    retval = 1;
+  else if (REG_P (field) && INTVAL (size) != 0
+	   && (INTVAL (pos) < 0 || INTVAL (pos) >= GET_MODE_BITSIZE ( SImode )))
+    retval = 1;
+  else
+    retval = 0;
+  return retval;
+}

Index: src/external/gpl3/gcc/dist/gcc/doc/tm.texi
diff -u src/external/gpl3/gcc/dist/gcc/doc/tm.texi:1.1.1.14 src/external/gpl3/gcc/dist/gcc/doc/tm.texi:1.2
--- src/external/gpl3/gcc/dist/gcc/doc/tm.texi:1.1.1.14	Sun Jul 30 05:21:01 2023
+++ src/external/gpl3/gcc/dist/gcc/doc/tm.texi	Sun Sep 29 11:45:31 2024
@@ -12073,6 +12073,15 @@ to analyze inner elements of @var{x} in 
 passed along.
 @end deftypefn
 
+@deftypefn {Target Hook} int TARGET_BITFIELD_MAY_TRAP_P (const_rtx @var{x}, unsigned @var{flags})
+This target hook returns nonzero if @var{x}, an @code{sign_extract} or
+@code{zero_extract} operation, might cause a trap.  Targets can use
+this hook to enhance precision of analysis for @code{sign_extract} and
+@code{zero_extract} operations.  You may call @code{may_trap_p_1}
+to analyze inner elements of @var{x} in which case @var{flags} should be
+passed along.
+@end deftypefn
+
 @deftypefn {Target Hook} void TARGET_SET_CURRENT_FUNCTION (tree @var{decl})
 The compiler invokes this hook whenever it changes its current function
 context (@code{cfun}).  You can define this function if

Index: src/external/gpl3/gcc/dist/gcc/doc/tm.texi.in
diff -u src/external/gpl3/gcc/dist/gcc/doc/tm.texi.in:1.1.1.13 src/external/gpl3/gcc/dist/gcc/doc/tm.texi.in:1.2
--- src/external/gpl3/gcc/dist/gcc/doc/tm.texi.in:1.1.1.13	Sun Jul 30 05:21:01 2023
+++ src/external/gpl3/gcc/dist/gcc/doc/tm.texi.in	Sun Sep 29 11:45:31 2024
@@ -7954,6 +7954,8 @@ to by @var{ce_info}.
 
 @hook TARGET_UNSPEC_MAY_TRAP_P
 
+@hook TARGET_BITFIELD_MAY_TRAP_P
+
 @hook TARGET_SET_CURRENT_FUNCTION
 
 @defmac TARGET_OBJECT_SUFFIX

Reply via email to