------- Comment #15 from rguenth at gcc dot gnu dot org 2009-11-30 15:05 ------- The issue with the boolean_type_node is that the middle-end does not have a type for a comparison result but implicitly assumes boolean_type_node.
So for D.xxxx_16 = (boolean) D.xxxx_6; if (D.xxxx_16 != 0) with a re-set boolean_type_node we fold this to D.xxxx_6 != 0, with the original Ada boolean_type_node we do not. The C frontend for decaying to bool always produces a comparison btw, not the truncation we see above (and it only truncates to 8 bits). In the end we want to unconditionally use a canonical boolean_type_node in the middle-end, but this forces us to mangle all decls early (as the mangler looks for boolean_type_node trees). While the patch in comment #14 now bootstraps ok it has testsuite fails. FAIL: g++.dg/pch/system-2.C -O2 -g assembly comparison I think for 4.5 we should admit defeat and disable free-lang-data unconditionally if not using LTO. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42088