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.  */

Reply via email to