Bug#1063882: gcc: Internal error from ternary cond as inline asm parameter
Package: gcc
Version: 4:12.2.0-3
Severity: normal
X-Debbugs-Cc: knodewaeee+debbugs@gmail.com
Dear Maintainer,
I wanted to dynamically select registers for use in an inline assembly statement, so I tried the questionmark conditional operator, as in this minimal example:
namespace gpr {
volatile register int64_t r12 asm("r12");
volatile register int64_t r13 asm("r13");
...
asm volatile ("mov %0, blah" : "+r"((reg) ? gpr::r13 : gpr::r12));
This generates an internal error:
$ g++ bug.cpp
during RTL pass: expand
bug.cpp: In function ‘void move(uint8_t, int64_t)’:
bug.cpp:11:47: internal compiler error: in expand_expr_addr_expr_1, at expr.cc:8435
11 | asm volatile ("mov %0, blah" : "+r"((reg) ? gpr::r13 : gpr::r12));
| ~~~~~~^~~~~~~~~~~~~~~~~~~~~
g++ -freport-bug did not deem the bug reproducible, but godbolt.org produces the following backtrace
0x264bdbc internal_error(char const*, ...)
???:0
0xa523e3 fancy_abort(char const*, int, char const*)
???:0
0xf62e6e expand_expr_real_1(tree_node*, rtx_def*, machine_mode, expand_modifier, rtx_def**, bool)
???:0
0xf703ae store_expr(tree_node*, rtx_def*, int, bool, bool)
???:0
I expected:
Realistically, a proper compiler error
Optimistically, generation of appropriate branches
I will apply an alternative solution in the meantime, but the latter behaviour would be very nice to have.
Perhaps other builtins also generate improper errors when used with a conditional operator? (I have not tried)
First time Debian/GCC bugreport, please forgive any relevant blunders :)
-- System Information:
Debian Release: 12.5
APT prefers stable-updates
APT policy: (500, 'stable-updates'), (500, 'stable-security'), (500, 'stable')
Architecture: amd64 (x86_64)
Foreign Architectures: i386, arm64
Kernel: Linux 6.1.0-17-amd64 (SMP w/12 CPU threads; PREEMPT)
Kernel taint flags: TAINT_PROPRIETARY_MODULE, TAINT_OOT_MODULE, TAINT_UNSIGNED_MODULE
Locale: LANG=en_GB.UTF-8, LC_CTYPE=en_GB.UTF-8 (charmap=UTF-8), LANGUAGE=en_GB:en
Shell: /bin/sh linked to /usr/bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
Versions of packages gcc depends on:
ii cpp 4:12.2.0-3
ii gcc-12 12.2.0-14
Versions of packages gcc recommends:
ii libc6-dev [libc-dev] 2.36-9+deb12u4
Versions of packages gcc suggests:
ii autoconf 2.71-3
ii automake 1:1.16.5-1.3
ii bison 2:3.8.2+dfsg-1+b1
ii flex 2.6.4-8.2
pn gcc-doc <none>
pn gcc-multilib <none>
ii gdb-minimal [gdb] 13.1-3
ii libtool 2.4.7-5
ii make 4.3-4.1
ii manpages-dev 6.03-2
-- no debconf information
Reply to: