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