https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103771
--- Comment #25 from Hongtao.liu <crazylht at gmail dot com> ---
in fold_unary_loc
---cut from fold-const.cc-----
9276 else if (TREE_CODE (arg0) == COND_EXPR)
9277 {
9278 tree arg01 = TREE_OPERAND (arg0, 1);
9279 tree arg02 = TREE_OPERAND (arg0, 2);
9280 if (! VOID_TYPE_P (TREE_TYPE (arg01)))
9281 arg01 = fold_build1_loc (loc, code, type,
9282 fold_convert_loc (loc,
9283 TREE_TYPE (op0),
arg01));
9284 if (! VOID_TYPE_P (TREE_TYPE (arg02)))
9285 arg02 = fold_build1_loc (loc, code, type,
9286 fold_convert_loc (loc,
9287 TREE_TYPE (op0),
arg02));
9288=> tem = fold_build3_loc (loc, COND_EXPR, type, TREE_OPERAND (arg0,
0),
9289 arg01, arg02);
-----------end---------------
gcc always tries to simplify (convert (cond (cmp a b) c d) ---- > (cond (cmp a
b) (convert c) (convert d)), exactly the opposite of what this case wants.