new file mode 100644
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// { dg-options "-O2 -fdump-tree-dom2-alias" }
+
+typedef __SIZE_TYPE__ size_t;
+
+void saxpy(size_t n)
+{
+ if (n == 0 || n % 8 != 0)
+ __builtin_unreachable();
+
+ extern void foobar (size_t n);
+ foobar (n);
+}
+
+// { dg-final { scan-tree-dump "NONZERO.*fff8" "dom2" } }
@@ -1227,29 +1227,30 @@ void
dom_opt_dom_walker::set_global_ranges_from_unreachable_edges (basic_block bb)
{
edge pred_e = single_pred_edge_ignoring_loop_edges (bb, false);
-
if (!pred_e)
return;
gimple *stmt = last_stmt (pred_e->src);
+ if (!stmt
+ || gimple_code (stmt) != GIMPLE_COND
+ || !assert_unreachable_fallthru_edge_p (pred_e))
+ return;
+
tree name;
- if (stmt
- && gimple_code (stmt) == GIMPLE_COND
- && (name = gimple_cond_lhs (stmt))
- && TREE_CODE (name) == SSA_NAME
- && assert_unreachable_fallthru_edge_p (pred_e)
- && all_uses_feed_or_dominated_by_stmt (name, stmt))
- {
- Value_Range r (TREE_TYPE (name));
+ gori_compute &gori = m_ranger->gori ();
+ FOR_EACH_GORI_EXPORT_NAME (gori, pred_e->src, name)
+ if (all_uses_feed_or_dominated_by_stmt (name, stmt))
+ {
+ Value_Range r (TREE_TYPE (name));
- if (m_ranger->range_on_edge (r, pred_e, name)
- && !r.varying_p ()
- && !r.undefined_p ())
- {
- set_range_info (name, r);
- maybe_set_nonzero_bits (pred_e, name);
- }
- }
+ if (m_ranger->range_on_edge (r, pred_e, name)
+ && !r.varying_p ()
+ && !r.undefined_p ())
+ {
+ set_range_info (name, r);
+ maybe_set_nonzero_bits (pred_e, name);
+ }
+ }
}
/* Record any equivalences created by the incoming edge to BB into