https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68870
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
The right (TM) fix:
Index: gcc/tree-cfgcleanup.c
===================================================================
--- gcc/tree-cfgcleanup.c (revision 231617)
+++ gcc/tree-cfgcleanup.c (working copy)
@@ -95,15 +95,9 @@ cleanup_control_expr_graph (basic_block
switch (gimple_code (stmt))
{
case GIMPLE_COND:
- {
- code_helper rcode;
- tree ops[3] = {};
- if (gimple_simplify (stmt, &rcode, ops, NULL, no_follow_ssa_edges,
- no_follow_ssa_edges)
- && rcode == INTEGER_CST)
- val = ops[0];
- break;
- }
+ val = const_binop (gimple_cond_code (stmt), boolean_type_node,
+ gimple_cond_lhs (stmt), gimple_cond_rhs (stmt));
+ break;
case GIMPLE_SWITCH:
val = gimple_switch_index (as_a <gswitch *> (stmt));
and the following shows the regressions:
Index: gcc/tree-cfgcleanup.c
===================================================================
--- gcc/tree-cfgcleanup.c (revision 231617)
+++ gcc/tree-cfgcleanup.c (working copy)
@@ -95,15 +95,18 @@ cleanup_control_expr_graph (basic_block
switch (gimple_code (stmt))
{
case GIMPLE_COND:
- {
- code_helper rcode;
- tree ops[3] = {};
- if (gimple_simplify (stmt, &rcode, ops, NULL, no_follow_ssa_edges,
- no_follow_ssa_edges)
- && rcode == INTEGER_CST)
- val = ops[0];
- break;
- }
+ val = const_binop (gimple_cond_code (stmt), boolean_type_node,
+ gimple_cond_lhs (stmt), gimple_cond_rhs (stmt));
+ if (!val)
+ {
+ code_helper rcode;
+ tree ops[3] = {};
+ if (gimple_simplify (stmt, &rcode, ops, NULL,
no_follow_ssa_edges,
+ no_follow_ssa_edges)
+ && rcode == INTEGER_CST)
+ gcc_unreachable ();
+ }
+ break;
case GIMPLE_SWITCH:
val = gimple_switch_index (as_a <gswitch *> (stmt));