https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110200
Bug ID: 110200 Summary: genmatch generating questionable code with convert and ! Product: gcc Version: 14.0 Status: UNCONFIRMED Keywords: build Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: pinskia at gcc dot gnu.org Target Milestone: --- Add these two patterns to match.pd: ``` /* (convert)(a ? b : CST) -> (a ? (convert)b : CST1) */ (simplify (convert (cond @0 @1 CONSTANT_CLASS_P@2)) (cond @0 (convert @1) (convert! @2))) /* (convert)(a ? CST : b) -> (a ? CST1 : (convert)b) */ (simplify (convert (cond @0 CONSTANT_CLASS_P@1 @2)) (cond @0 (convert! @1) (convert @2))) ``` And the code produced by genmatch for generic is: ``` { tree _o1[1], _r1; _o1[0] = captures[2]; if (TREE_TYPE (_o1[0]) != type) _r1 = fold_build1_loc (loc, NOP_EXPR, type, _o1[0]); if (EXPR_P (_r1)) goto next_after_fail867; else _r1 = _o1[0]; res_op2 = _r1; } ``` I think there is a missing `{`/`}` pair around the fold_build1_loc/if/goto statements.