https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84823
Bug ID: 84823
Summary: [6 Regression?] x86 LRA hang on valid code (no ICE)
with -fno-omit-frame-pointer
Product: gcc
Version: 6.4.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: middle-end
Assignee: unassigned at gcc dot gnu.org
Reporter: awilfox at adelielinux dot org
Target Milestone: ---
Created attachment 43626
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=43626&action=edit
preprocessed source that fails
Environment:
Adélie Linux 1.0-alpha5
Intel(R) Pentium(R) 4 CPU 2.40GHz [15/2/9; HT enabled]
gcc (Adelie 6.4.0) 6.4.0
musl libc 1.1.19
Scenario:
Compiling WINE 3.0 for the x86 architecture of Adélie on our builder. Target
arch is Pentium MMX.
Actual result:
cc1 hung for almost 16 hours while compiling ntdll/server.c. Trying again with
-fchecking -Q made no difference; three hours later, no ICE was generated.
Output was:
__FLOAT_BITS __DOUBLE_BITS __islessf __isless __islessl __islessequalf
__islessequal __islessequall __islessgreaterf __islessgreater __islessgreaterl
__isgreaterf __isgreater __isgreaterl __isgreaterequalf __isgreaterequal
__isgreaterequall __bswap16 __bswap32 __bswap64 __fortify_FD_CLR
__fortify_FD_SET bcopy bzero memcpy memmove memset stpcpy stpncpy strcat strcpy
strncat strncpy mempcpy strlcat strlcpy realpath confstr getcwd getdomainname
getgroups gethostname getlogin_r pread read readlink readlinkat ttyname_r write
memcpy_unaligned interlocked_cmpxchg interlocked_cmpxchg_ptr interlocked_xchg
interlocked_xchg_ptr interlocked_xchg_add interlocked_cmpxchg64 __isspace fgets
fread fwrite vsnprintf vsprintf snprintf sprintf recv recvfrom send sendto
NtCurrentTeb RtlSecureZeroMemory HRESULT_FROM_WIN32 lstrcpynW lstrcpynA
lstrlenW lstrlenA lstrcpyW lstrcpyA lstrcatW lstrcatA
InterlockedCompareExchangePointer InterlockedExchangePointer GetLastError
GetCurrentProcessId GetCurrentThreadId SetLastError GetProcessHeap
wine_ldt_set_base wine_ldt_set_limit wine_ldt_get_base wine_ldt_get_limit
wine_ldt_set_flags wine_ldt_get_flags wine_ldt_is_empty wine_get_cs wine_get_ds
wine_get_es wine_get_fs wine_get_gs wine_get_ss wine_set_fs wine_set_gs
DbgBreakPoint DbgUserBreakPoint RtlCheckBit RtlUshortByteSwap RtlUlongByteSwap
RemoveHeadList RemoveTailList get_vm86_teb_info wine_server_call_err
wine_server_reply_size wine_server_add_data wine_server_set_reply
wine_server_obj_handle wine_server_user_handle wine_server_ptr_handle
wine_server_client_ptr wine_server_get_ptr wine_dbgstr_a wine_dbgstr_w
wine_dbgstr_guid wine_dbgstr_point wine_dbgstr_rect wine_dbgstr_longlong
debugstr_an debugstr_wn debugstr_guid debugstr_a debugstr_w __CPU_AND_S
__CPU_OR_S __CPU_XOR_S ntdll_get_thread_data interlocked_xchg64 fatal_error
fatal_perror server_protocol_error server_protocol_perror send_request
read_reply_data wait_reply server_call_unlocked wine_server_call
server_enter_uninterrupted_section server_leave_uninterrupted_section
wait_select_reply invoke_apc server_select server_queue_process_apc
wine_server_send_fd receive_fd handle_to_index add_fd_to_cache get_cached_fd
server_remove_fd_from_cache server_get_unix_fd wine_server_fd_to_handle
wine_server_handle_to_fd wine_server_release_fd server_pipe start_server
setup_config_dir server_connect_error server_connect get_unix_tid
server_init_process server_init_process_done server_init_thread
Analyzing compilation unit
Performing interprocedural optimizations
<*free_lang_data> <visibility> <build_ssa_passes> <opt_local_passes>
<targetclone> <free-inline-summary> <whole-program> <profile_estimate> <icf>
<devirt> <cp> <inline> <pure-const> <static-var> <single-use>
<comdats>Assembling functions:
<simdclone> server_protocol_error server_protocol_perror read_reply_data
wait_select_reply invoke_apc receive_fd add_fd_to_cache fatal_perror
fatal_error start_server server_connect server_call_unlocked wine_server_call
server_enter_uninterrupted_section server_leave_uninterrupted_section
server_select server_queue_process_apc wine_server_send_fd
server_remove_fd_from_cache server_get_unix_fd
Expected result:
Compilation of ntdll/server.c translation unit.
CFLAGS in use at the time (incl. WINE package defaults and Adélie overrides):
gcc -c -o server.o server.c -I. -I../../include -D__WINESRC__ -D_NTSYSTEM_
-D_REENTRANT -fPIC -Wall -pipe -fno-strict-aliasing
-Wdeclaration-after-statement -Wempty-body -Wignored-qualifiers
-Wn-packed-not-aligned -Wshift-overflow=2 -Wstrict-prototypes -Wtype-limits
-Wunused-but-set-parameter -Wvla -Wwrite-strings -Wpointer-arith -Wlogical-op
-gdwarf-2 -gstrict-dwarf -fno-omit-frame-pointer -O2 -march=pentium-mmx
-mtune=pentium-m -fno-omit-frame-pointer -g -U_FORTIFY_SOURCE
-D_FORTIFY_SOURCE=0
If -fno-omit-frame-pointer is removed, compilation succeeds. If -O2 is
replaced with -O0, compilation succeeds. It feels like a rehash of 55396 but
that was solved back in the 4.x days. I will note that when we built WINE 2.x
last year with GCC 5.3.0 this issue did not occur, and -fno-omit-frame-pointer
was active then; hence, this may be a regression in 6. (The WINE code doesn't
appear to have been touched since 2016.) However, I do not know if LRA was on
by default on x86 in the 5.x series.
Attached is the .i from a run that failed.