https://gcc.gnu.org/g:e333ad4ed82cdfb1b660e9666895641ef3ffaddb

commit r15-7738-ge333ad4ed82cdfb1b660e9666895641ef3ffaddb
Author: Thomas Schwinge <tschwi...@baylibre.com>
Date:   Wed Feb 26 15:39:37 2025 +0100

    nvptx: '#define MAX_FIXED_MODE_SIZE 128'
    
    ... instead of 64 via 'gcc/defaults.h':
    
        MAX_FIXED_MODE_SIZE GET_MODE_BITSIZE (DImode)
    
    This fixes ICEs:
    
        [-FAIL: c-c++-common/pr111309-1.c  -Wc++-compat  (internal compiler 
error: in expand_fn_using_insn, at internal-fn.cc:268)-]
        [-FAIL:-]{+PASS:+} c-c++-common/pr111309-1.c  -Wc++-compat  (test for 
excess errors)
        [-UNRESOLVED:-]{+PASS:+} c-c++-common/pr111309-1.c  -Wc++-compat  
[-compilation failed to produce executable-]{+execution test+}
    
        [-FAIL: c-c++-common/pr111309-1.c  -std=gnu++17 (internal compiler 
error: in expand_fn_using_insn, at internal-fn.cc:268)-]
        [-FAIL:-]{+PASS:+} c-c++-common/pr111309-1.c  -std=gnu++17 (test for 
excess errors)
        [-UNRESOLVED:-]{+PASS:+} c-c++-common/pr111309-1.c  -std=gnu++17 
[-compilation failed to produce executable-]{+execution test+}
        [-FAIL: c-c++-common/pr111309-1.c  -std=gnu++26 (internal compiler 
error: in expand_fn_using_insn, at internal-fn.cc:268)-]
        [-FAIL:-]{+PASS:+} c-c++-common/pr111309-1.c  -std=gnu++26 (test for 
excess errors)
        [-UNRESOLVED:-]{+PASS:+} c-c++-common/pr111309-1.c  -std=gnu++26 
[-compilation failed to produce executable-]{+execution test+}
        [-FAIL: c-c++-common/pr111309-1.c  -std=gnu++98 (internal compiler 
error: in expand_fn_using_insn, at internal-fn.cc:268)-]
        [-FAIL:-]{+PASS:+} c-c++-common/pr111309-1.c  -std=gnu++98 (test for 
excess errors)
        [-UNRESOLVED:-]{+PASS:+} c-c++-common/pr111309-1.c  -std=gnu++98 
[-compilation failed to produce executable-]{+execution test+}
    
        [-FAIL: gcc.dg/torture/pr116480-1.c   -O0  (internal compiler error: in 
expand_fn_using_insn, at internal-fn.cc:268)-]
        [-FAIL:-]{+PASS:+} gcc.dg/torture/pr116480-1.c   -O0  (test for excess 
errors)
        [-FAIL: gcc.dg/torture/pr116480-1.c   -O1  (internal compiler error: in 
expand_fn_using_insn, at internal-fn.cc:268)-]
        [-FAIL:-]{+PASS:+} gcc.dg/torture/pr116480-1.c   -O1  (test for excess 
errors)
        PASS: gcc.dg/torture/pr116480-1.c   -O2  (test for excess errors)
        PASS: gcc.dg/torture/pr116480-1.c   -O3 -g  (test for excess errors)
        PASS: gcc.dg/torture/pr116480-1.c   -Os  (test for excess errors)
    
    ..., where we ran into 'gcc_assert (icode != CODE_FOR_nothing);' in
    'gcc/internal-fn.cc:expand_fn_using_insn' for '__int128' '__builtin_clzg' 
etc.:
    
        during RTL pass: expand
        [...]/c-c++-common/pr111309-1.c: In function 'clzI':
        [...]/c-c++-common/pr111309-1.c:69:10: internal compiler error: in 
expand_fn_using_insn, at internal-fn.cc:268
        0x120ec2cf internal_error(char const*, ...)
                [...]/gcc/diagnostic-global-context.cc:517
        0x102c7c5b fancy_abort(char const*, int, char const*)
                [...]/gcc/diagnostic.cc:1722
        0x109708eb expand_fn_using_insn
                [...]/gcc/internal-fn.cc:268
        0x1098114f expand_internal_call(internal_fn, gcall*)
                [...]/gcc/internal-fn.cc:5273
        0x1098114f expand_internal_call(gcall*)
                [...]/gcc/internal-fn.cc:5281
        0x10594fc7 expand_call_stmt
                [...]/gcc/cfgexpand.cc:3049
        [...]
    
    Likewise, as of commit e8ad697a75b0870a833366daf687668a57cabb6e
    "libstdc++: Use new type-generic built-ins in <bit> [PR118855]",
    the libstdc++ target library build ICEd in the same way.
    
    Additionally, this change fixes:
    
        [-FAIL:-]{+PASS:+} gcc.dg/pr105094.c (test for excess errors)
    
    ..., which was:
    
        [...]/gcc.dg/pr105094.c: In function 'foo':
        [...]/gcc.dg/pr105094.c:11:12: error: size of variable 's' is too large
    
    And, finally, regarding 'gcc.target/nvptx/stack_frame-1.c'.  Before, in
    'gcc/cfgexpand.cc': 'expand_used_vars' -> 'expand_used_vars_for_block' ->
    'expand_one_var' for 'ww' -> 'gcc/function.cc:use_register_for_decl' due to
    'DECL_MODE (decl) == BLKmode' did 'return false;', thus -> 'add_stack_var'
    (even if 'ww' wasn't then actually living on the stack).  Now, 'ww' has
    'TImode' and 'use_register_for_decl' does 'return true;', thus ->
    'expand_one_register_var', and therefore no unused stack frame emitted.
    
            gcc/
            * config/nvptx/nvptx.h (MAX_FIXED_MODE_SIZE): '#define'.
            gcc/testsuite/
            * gcc.target/nvptx/stack_frame-1.c: Adjust.

Diff:
---
 gcc/config/nvptx/nvptx.h                       | 2 ++
 gcc/testsuite/gcc.target/nvptx/stack_frame-1.c | 7 ++-----
 2 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/gcc/config/nvptx/nvptx.h b/gcc/config/nvptx/nvptx.h
index c21e7cb960d3..1ec5f60fea7e 100644
--- a/gcc/config/nvptx/nvptx.h
+++ b/gcc/config/nvptx/nvptx.h
@@ -77,6 +77,8 @@
 #define LONG_LONG_TYPE_SIZE 64
 #define TARGET_SUPPORTS_WIDE_INT 1
 
+#define MAX_FIXED_MODE_SIZE 128
+
 #undef SIZE_TYPE
 #define SIZE_TYPE (TARGET_ABI64 ? "long unsigned int" : "unsigned int")
 #undef PTRDIFF_TYPE
diff --git a/gcc/testsuite/gcc.target/nvptx/stack_frame-1.c 
b/gcc/testsuite/gcc.target/nvptx/stack_frame-1.c
index 476d0ac93ed0..cca89b530a83 100644
--- a/gcc/testsuite/gcc.target/nvptx/stack_frame-1.c
+++ b/gcc/testsuite/gcc.target/nvptx/stack_frame-1.c
@@ -1,11 +1,11 @@
-/* GCC emits an unused stack frame.  */
+/* GCC used to emit an unused stack frame.  */
 
 /* { dg-do assemble } */
 /* { dg-options {-O2 -mno-soft-stack} } */
 /* { dg-additional-options -save-temps } */
 /* { dg-final { check-function-bodies {** } {} } } */
 
-/* Greatly reduced from libgcc code, where this issue is visible for
+/* Greatly reduced from libgcc code, where this issue was visible for
    '_divdi3.o:__divti3', '_divmoddi4.o:__divmodti4', '_moddi3.o:__modti3',
    '_udivdi3.o:__udivti3', '_udivmoddi4.o:__udivmodti4',
    '_umoddi3.o:__umodti3'.  */
@@ -25,9 +25,6 @@ int f (int n)
 **     \.reg\.u32 %value;
 **     \.reg\.u32 %ar0;
 **     ld\.param\.u32 %ar0, \[%in_ar0\];
-**     \.local \.align 16 \.b8 %frame_ar\[16\];
-**     \.reg\.u64 %frame;
-**     cvta\.local\.u64 %frame, %frame_ar;
 **             mov\.u32        %value, %ar0;
 **     st\.param\.u32  \[%value_out\], %value;
 **     ret;

Reply via email to