A number of testcases currently fail on nvptx with the ICE: during RTL pass: final openmp-simd-2.c: In function 'foo': openmp-simd-2.c:28:1: internal compiler error: in get_personality_function, at expr.cc:14037 28 | } | ^ 0x98a38f get_personality_function(tree_node*) /home/roger/GCC/nvptx-none/gcc/gcc/expr.cc:14037 0x969d3b output_function_exception_table(int) /home/roger/GCC/nvptx-none/gcc/gcc/except.cc:3226 0x9b760d rest_of_handle_final /home/roger/GCC/nvptx-none/gcc/gcc/final.cc:4252
The simple oversight in output_function_exception_table is that it calls get_personality_function (immediately) before checking the target's except_unwind_info hook (which on nvptx always returns UI_NONE). The (perhaps obvious) fix is to move the assignments of fname and personality after the tests that they are needed, and before their first use. This patch has been tested on nvptx-none hosted on x86_64-pc-linux-gnu with no new failures in the testsuite, and ~220 fewer FAILs. Ok for mainline? 2024-05-22 Roger Sayle <ro...@nextmovesoftware.com> gcc/ChangeLog * except.cc (output_function_exception_table): Move call to get_personality_function after targetm_common.except_unwind_info check, to avoid ICE on targets that don't support exceptions. Thanks in advance, Roger --
diff --git a/gcc/except.cc b/gcc/except.cc index 2080fcc..b5886e9 100644 --- a/gcc/except.cc +++ b/gcc/except.cc @@ -3222,9 +3222,6 @@ output_one_function_exception_table (int section) void output_function_exception_table (int section) { - const char *fnname = get_fnname_from_decl (current_function_decl); - rtx personality = get_personality_function (current_function_decl); - /* Not all functions need anything. */ if (!crtl->uses_eh_lsda || targetm_common.except_unwind_info (&global_options) == UI_NONE) @@ -3234,6 +3231,9 @@ output_function_exception_table (int section) if (section == 1 && !crtl->eh.call_site_record_v[1]) return; + const char *fnname = get_fnname_from_decl (current_function_decl); + rtx personality = get_personality_function (current_function_decl); + if (personality) { assemble_external_libcall (personality);