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