aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa.h
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2022-12-02 14:52:20 +0100
committerRichard Biener <rguenther@suse.de>2022-12-05 10:22:53 +0100
commit44c8402d35160515b3c09fd2bc239587e0c32a2b (patch)
treef592f253098750358187f2ee53bce15c1b97b175 /gcc/tree-ssa.h
parent824542bec24c09319fa55922a0162209a5f64963 (diff)
downloadgcc-44c8402d35160515b3c09fd2bc239587e0c32a2b.zip
gcc-44c8402d35160515b3c09fd2bc239587e0c32a2b.tar.gz
gcc-44c8402d35160515b3c09fd2bc239587e0c32a2b.tar.bz2
tree-optimization/107833 - invariant motion of uninit uses
The following fixes a wrong-code bug caused by loop invariant motion hoisting an expression using an uninitialized value outside of its controlling condition causing IVOPTs to use that to rewrite a defined value. PR107839 is a similar case involving a bogus uninit diagnostic. PR tree-optimization/107833 PR tree-optimization/107839 * cfghooks.cc: Include tree.h. * tree-ssa-loop-im.cc (movement_possibility): Wrap and make stmts using any ssa_name_maybe_undef_p operand to preserve execution. (loop_invariant_motion_in_fun): Call mark_ssa_maybe_undefs to init maybe-undefined status. * tree-ssa-loop-ivopts.cc (ssa_name_maybe_undef_p, ssa_name_set_maybe_undef, ssa_name_any_use_dominates_bb_p, mark_ssa_maybe_undefs): Move ... * tree-ssa.cc: ... here. * tree-ssa.h (ssa_name_any_use_dominates_bb_p, mark_ssa_maybe_undefs): Declare. (ssa_name_maybe_undef_p, ssa_name_set_maybe_undef): Define. * gcc.dg/torture/pr107833.c: New testcase. * gcc.dg/uninit-pr107839.c: Likewise.
Diffstat (limited to 'gcc/tree-ssa.h')
-rw-r--r--gcc/tree-ssa.h25
1 files changed, 25 insertions, 0 deletions
diff --git a/gcc/tree-ssa.h b/gcc/tree-ssa.h
index 0085354..19c1eed 100644
--- a/gcc/tree-ssa.h
+++ b/gcc/tree-ssa.h
@@ -55,6 +55,31 @@ extern tree find_released_ssa_name (tree *, int *, void *);
extern bool ssa_defined_default_def_p (tree t);
extern bool ssa_undefined_value_p (tree, bool = true);
extern bool gimple_uses_undefined_value_p (gimple *);
+
+
+bool ssa_name_any_use_dominates_bb_p (tree var, basic_block bb);
+extern void mark_ssa_maybe_undefs (void);
+
+/* Return TRUE iff VAR is marked as maybe-undefined. See
+ mark_ssa_maybe_undefs. */
+
+static inline bool
+ssa_name_maybe_undef_p (tree var)
+{
+ gcc_checking_assert (TREE_CODE (var) == SSA_NAME);
+ return TREE_VISITED (var);
+}
+
+/* Set (or clear, depending on VALUE) VAR's maybe-undefined mark. */
+
+static inline void
+ssa_name_set_maybe_undef (tree var, bool value = true)
+{
+ gcc_checking_assert (TREE_CODE (var) == SSA_NAME);
+ TREE_VISITED (var) = value;
+}
+
+
extern void execute_update_addresses_taken (void);
/* Given an edge_var_map V, return the PHI arg definition. */