https://gcc.gnu.org/g:f364a431d5b44ebde2c20ebe5fff22291c7d12db
commit r13-9001-gf364a431d5b44ebde2c20ebe5fff22291c7d12db Author: Vineet Gupta <vine...@rivosinc.com> Date: Wed Nov 1 14:46:33 2023 -0700 RISC-V: fix TARGET_PROMOTE_FUNCTION_MODE hook for libcalls Fixes: 3496ca4e6566 ("RISC-V: Add runtime invariant support") riscv_promote_function_mode doesn't promote a SI to DI for libcalls case. It intends to do that however the code is broken (regression). The fix is what generic promote_mode () in explow.cc does. I really don't understand why the old code didn't work, but stepping thru the debugger shows old code didn't and fixed does. This showed up when testing Ajit's REE ABI extension series which probes the ABI (using a NULL tree type) and ends up hitting the libcall code path. gcc/ChangeLog: * config/riscv/riscv.cc (riscv_promote_function_mode): Fix mode returned for libcall case. Tested-by: Patrick O'Neill <patr...@rivosinc.com> # pre-commit-CI #526 Signed-off-by: Vineet Gupta <vine...@rivosinc.com> Diff: --- gcc/config/riscv/riscv.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index 4501bf78c1e9..ca3eae2abf38 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -6794,9 +6794,10 @@ riscv_promote_function_mode (const_tree type ATTRIBUTE_UNUSED, return promote_mode (type, mode, punsignedp); unsignedp = *punsignedp; - PROMOTE_MODE (as_a <scalar_mode> (mode), unsignedp, type); + scalar_mode smode = as_a <scalar_mode> (mode); + PROMOTE_MODE (smode, unsignedp, type); *punsignedp = unsignedp; - return mode; + return smode; } /* Implement TARGET_MACHINE_DEPENDENT_REORG. */