Here is a discussion we did some time ago regarding the defect. https://gcc.gnu.org/pipermail/gcc/2019-January/227834.html please see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88877 for testcase behavior.
We incorporating below Jakub's suggestion in this patch series. Jakub wrote: "" Yeah, all the callers of emit_library_call* would need to be changed to pass triplets rtx, machine_mode, int/bool /*unsignedp*/, instead of just rtx_mode_t pair. "" In this patch series trying to address same by creating a struct Tuple which bundles existing rtx and machine_mode and added one more bool member which store unsigned_p which by default is false. This patch does not change underlying behavior yet. This will be done in follow up patches. ChangeLog Entry: 2020-05-24 Kamlesh Kumar <kamleshbha...@gmail.com> * rtl.h (Tuple): Defined and typedefed to rtx_mode_t. (emit_library_call): Added default arg unsigned_p. (emit_library_call_value): Added default arg unsigned_p. --- gcc/rtl.h | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/gcc/rtl.h b/gcc/rtl.h index b0b1aac..ee42de7 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -2238,10 +2238,20 @@ struct address_info { enum rtx_code base_outer_code; }; -/* This is used to bundle an rtx and a mode together so that the pair - can be used with the wi:: routines. If we ever put modes into rtx - integer constants, this should go away and then just pass an rtx in. */ -typedef std::pair <rtx, machine_mode> rtx_mode_t; +/* This is used to bundle an rtx and a mode and unsignedness together so + that the tuple can be used with the wi:: routines. If we ever put modes + into rtx integer constants, this should go away and then just pass an rtx in. */ +typedef struct Tuple { + rtx first; + machine_mode second; + /* unsigned_p */ + bool third; + Tuple (rtx f, machine_mode s, bool t = false) { + first = f; + second = s; + third = t; + } +} rtx_mode_t; namespace wi { @@ -4176,9 +4186,9 @@ emit_library_call (rtx fun, libcall_type fn_type, machine_mode outmode) inline void emit_library_call (rtx fun, libcall_type fn_type, machine_mode outmode, - rtx arg1, machine_mode arg1_mode) + rtx arg1, machine_mode arg1_mode, bool unsigned_p = false) { - rtx_mode_t args[] = { rtx_mode_t (arg1, arg1_mode) }; + rtx_mode_t args[] = { rtx_mode_t (arg1, arg1_mode, unsigned_p) }; emit_library_call_value_1 (0, fun, NULL_RTX, fn_type, outmode, 1, args); } @@ -4238,9 +4248,9 @@ emit_library_call_value (rtx fun, rtx value, libcall_type fn_type, inline rtx emit_library_call_value (rtx fun, rtx value, libcall_type fn_type, machine_mode outmode, - rtx arg1, machine_mode arg1_mode) + rtx arg1, machine_mode arg1_mode, bool unsigned_p = false) { - rtx_mode_t args[] = { rtx_mode_t (arg1, arg1_mode) }; + rtx_mode_t args[] = { rtx_mode_t (arg1, arg1_mode, unsigned_p) }; return emit_library_call_value_1 (1, fun, value, fn_type, outmode, 1, args); } -- 2.7.4