]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fix some gimple_ctrl_altering_p mistakes
authorRichard Biener <rguenther@suse.de>
Wed, 7 Sep 2022 10:01:34 +0000 (12:01 +0200)
committerRichard Biener <rguenther@suse.de>
Thu, 8 Sep 2022 14:05:17 +0000 (16:05 +0200)
CFG cleanup resets the control altering flag for noreturn functions
when they are ECF_LEAF (like __builtin_unreachable ()).  The
.ABNORMAL_DISPATCHER call built during CFG construction is not
marked as control altering.  Several passes inserting traps or
unreachables fail to set the flag.  And more.

PR middle-end/106870
* gimple-harden-conditionals.cc (insert_check_and_trap):
Set the control-altering flag on the built IFN_TRAP.
* gimple.cc (gimple_build_builtin_unreachable): Likewise.
* tree-cfg.cc (handle_abnormal_edges): Set the control-altering
flag on the .ABNORMAL_DISPATCHER call.
* tree-cfgcleanup.cc (cleanup_call_ctrl_altering_flag): Avoid
resetting the control altering flag for ECF_NORETURN calls.
(cleanup_control_flow_bb): Set the control altering flag on
discovered noreturn calls.
* symtab-thunks.cc (expand_thunk): Set the control altering
flag for the noreturn tailcall case.
* tree-eh.cc (lower_resx): Likewisw for trap and unwind_resume
calls.

gcc/gimple-harden-conditionals.cc
gcc/gimple.cc
gcc/symtab-thunks.cc
gcc/tree-cfg.cc
gcc/tree-cfgcleanup.cc
gcc/tree-eh.cc

index 4ca6776fca71dd5125e740c8d59df646c4c139c6..1b3dd563baaae05eec058cb1862fd9d5a4242b31 100644 (file)
@@ -238,6 +238,7 @@ insert_check_and_trap (location_t loc, gimple_stmt_iterator *gsip,
 
   gimple_stmt_iterator gsit = gsi_after_labels (trp);
   gcall *trap = gimple_build_call (builtin_decl_explicit (BUILT_IN_TRAP), 0);
+  gimple_call_set_ctrl_altering (trap, true);
   gimple_set_location (trap, loc);
   gsi_insert_before (&gsit, trap, GSI_SAME_STMT);
 
index cd5ad0c718ba91f7d992b57e266fd7b76b838001..4d45311b45cdd77e8d8e54c9635c1f1b15cb7d9d 100644 (file)
@@ -440,6 +440,7 @@ gimple_build_builtin_unreachable (location_t loc)
       gcc_checking_assert (data == NULL_TREE);
       g = gimple_build_call_internal (IFN_TRAP, 0);
     }
+  gimple_call_set_ctrl_altering (g, true);
   gimple_set_location (g, loc);
   return g;
 }
index b04397022303d74c41d0662aae862a12ef3b0ac7..bd50c6897619b48f754e3c361d667c4bff5bf6c2 100644 (file)
@@ -635,6 +635,7 @@ expand_thunk (cgraph_node *node, bool output_asm_thunks,
        }
       else
        {
+         gimple_call_set_ctrl_altering (call, true);
          gimple_call_set_tail (call, true);
          cfun->tail_call_marked = true;
          remove_edge (single_succ_edge (bb));
index bbe08357d6ecbe47702297a542b012ab18e96891..e39d9471220d220adad961cedda346b5d6d51c10 100644 (file)
@@ -821,8 +821,9 @@ handle_abnormal_edges (basic_block *dispatcher_bbs, basic_block for_bb,
       else
        {
          tree arg = inner ? boolean_true_node : boolean_false_node;
-         gimple *g = gimple_build_call_internal (IFN_ABNORMAL_DISPATCHER,
+         gcall *g = gimple_build_call_internal (IFN_ABNORMAL_DISPATCHER,
                                                 1, arg);
+         gimple_call_set_ctrl_altering (g, true);
          gimple_stmt_iterator gsi = gsi_after_labels (*dispatcher);
          gsi_insert_after (&gsi, g, GSI_NEW_STMT);
 
index 3535a7e28a4e7d746ee07adf2063710a16bbee80..b4869aee78d100559e060bfefb41d49896bf7199 100644 (file)
@@ -220,9 +220,10 @@ cleanup_call_ctrl_altering_flag (basic_block bb, gimple *bb_end)
     return;
 
   int flags = gimple_call_flags (bb_end);
-  if (((flags & (ECF_CONST | ECF_PURE))
-       && !(flags & ECF_LOOPING_CONST_OR_PURE))
-      || (flags & ECF_LEAF))
+  if (!(flags & ECF_NORETURN)
+      && (((flags & (ECF_CONST | ECF_PURE))
+          && !(flags & ECF_LOOPING_CONST_OR_PURE))
+         || (flags & ECF_LEAF)))
     gimple_call_set_ctrl_altering (bb_end, false);
   else
     {
@@ -328,6 +329,10 @@ cleanup_control_flow_bb (basic_block bb)
        gsi_remove (&gsi, true);
       if (remove_fallthru_edge (bb->succs))
        retval = true;
+      tree lhs = gimple_call_lhs (stmt);
+      if (!lhs
+         || !should_remove_lhs_p (lhs))
+       gimple_call_set_ctrl_altering (stmt, true);
     }
 
   return retval;
index 076ecd3ec9ab728b7366a0e13b50e60bf56fcf34..ae8fa21d9a37225b06465cee0c4359f6e108dcf3 100644 (file)
@@ -3321,7 +3321,7 @@ lower_resx (basic_block bb, gresx *stmt,
   int lp_nr;
   eh_region src_r, dst_r;
   gimple_stmt_iterator gsi;
-  gimple *x;
+  gcall *x;
   tree fn, src_nr;
   bool ret = false;
 
@@ -3346,6 +3346,7 @@ lower_resx (basic_block bb, gresx *stmt,
 
       fn = builtin_decl_implicit (BUILT_IN_TRAP);
       x = gimple_build_call (fn, 0);
+      gimple_call_set_ctrl_altering (x, true);
       gsi_insert_before (&gsi, x, GSI_SAME_STMT);
 
       while (EDGE_COUNT (bb->succs) > 0)
@@ -3463,6 +3464,7 @@ lower_resx (basic_block bb, gresx *stmt,
 
          fn = builtin_decl_implicit (BUILT_IN_UNWIND_RESUME);
          x = gimple_build_call (fn, 1, var);
+         gimple_call_set_ctrl_altering (x, true);
          gsi_insert_before (&gsi, x, GSI_SAME_STMT);
        }