https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119241
--- Comment #8 from Richard Biener <rguenth at gcc dot gnu.org> --- I see odd code like // For some reason, using FLOAT128 in the build_pointer_type causes // a SEGFAULT. So, we'll use other types with equivalent sizes. I // am speculating that the use of floating-point types causes the -O0 // compilation to move things using the mmx registers. So, I am using // intxx types in the hope that they are simpler. case 4: { // The following generated code is the exact equivalent // of the C code: // *(float *)dest = (float)data.value _Float32 src = (_Float32)sourceref.field->data.value; tree tsrc = build_string_literal(sizeof(src), (char *)&src); gg_assign(gg_indirect(gg_cast(build_pointer_type(INT), tdest)), gg_indirect(gg_cast(build_pointer_type(INT), tsrc ))); break; that most definitely is weird because it uses the host representation and endianess. The comment writes float data while the code generates integer type accesses. I have a partial patch that replaces sourceref.field->data.value with a tree which then enables simpler case 4: { // The following generated code is the exact equivalent // of the C code: // *(float *)dest = (float)data.value gg_assign(gg_indirect(gg_cast(build_pointer_type(FLOAT), tdest)), fold_convert (FLOAT, sourceref.field->data.value)); break;