#include register long double F80 __asm__("st"); typedef void (*inst_t)(uint32_t *ip); void exec_inst(uint32_t *ip) { ((inst_t) (uint64_t) ip[0])(ip); } int main() { return 0; } At -O2 and above gcc generates: register_long_double_ICE.c:3:1: warning: call-clobbered register used for global register variable register_long_double_ICE.c: In function ‘exec_inst’: register_long_double_ICE.c:9:1: internal compiler error: in compensate_edge, at reg-stack.c:2789 Please submit a full bug report, with preprocessed source if appropriate. See for instructions. -- Summary: register long double ICE at -O2, -Os, -O3 Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: adam at consulting dot net dot nz http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45296