aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple.cc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2022-09-07 12:01:34 +0200
committerRichard Biener <rguenther@suse.de>2022-09-08 16:05:17 +0200
commit78ef801b7263606d27a6a752a40cbeecc584fb3d (patch)
treeb523e083051e0bed3f186cc7716ece05e98c280f /gcc/gimple.cc
parent4db3cb781c355341fa041e6b5bbbfc495c6a0fdb (diff)
downloadgcc-78ef801b7263606d27a6a752a40cbeecc584fb3d.zip
gcc-78ef801b7263606d27a6a752a40cbeecc584fb3d.tar.gz
gcc-78ef801b7263606d27a6a752a40cbeecc584fb3d.tar.bz2
Fix some gimple_ctrl_altering_p mistakes
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.
Diffstat (limited to 'gcc/gimple.cc')
-rw-r--r--gcc/gimple.cc1
1 files changed, 1 insertions, 0 deletions
diff --git a/gcc/gimple.cc b/gcc/gimple.cc
index cd5ad0c..4d45311 100644
--- a/gcc/gimple.cc
+++ b/gcc/gimple.cc
@@ -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;
}