+2007-05-07 Eric Botcazou <ebotcazou@adacore.com>
+
+ * tree-ssa-dom.c (tree_ssa_dominator_optimize): Reset cfg_altered.
+ Free dominance info before purging EH edges as well as after.
+ (eliminate_degenerate_phis): Likewise.
+ (propagate_rhs_into_lhs): Set cfg_altered to true instead of 1.
+
2007-05-07 Jan Hubicka <jh@suse.cz>
* gimplify.c (gimplify_expr): Do not crash when folding
--- /dev/null
+-- { dg-do compile }
+-- { dg-options "-O -gnatws" }
+
+package body Opt1 is
+
+ function De_Linear_Index
+ (Index : Natural;
+ D : Natural;
+ Ind_Lengths : Dimention_Length)
+ return Dimension_Indexes
+ is
+ Len : Natural := 1;
+ Tmp_Ind : Natural := Index;
+ Tmp_Res : Natural;
+ Result : Dimension_Indexes (1 .. D);
+ begin
+ for J in 1 .. D loop
+ Len := Len * Ind_Lengths (J);
+ end loop;
+
+ for J in Result'Range loop
+ Result (J) := Tmp_Res;
+ Tmp_Ind := Tmp_Ind - Len * (Result (J) - 1);
+ end loop;
+
+ return Result;
+ end;
+
+end Opt1;
init_walk_dominator_tree (&walk_data);
calculate_dominance_info (CDI_DOMINATORS);
+ cfg_altered = false;
/* We need to know which edges exit loops so that we can
aggressively thread through loop headers to an exit
/* Thread jumps, creating duplicate blocks as needed. */
cfg_altered |= thread_through_all_blocks ();
+ if (cfg_altered)
+ free_dominance_info (CDI_DOMINATORS);
+
/* Removal of statements may make some EH edges dead. Purge
such edges from the CFG as needed. */
if (!bitmap_empty_p (need_eh_cleanup))
{
- cfg_altered |= tree_purge_all_dead_eh_edges (need_eh_cleanup);
+ if (tree_purge_all_dead_eh_edges (need_eh_cleanup))
+ free_dominance_info (CDI_DOMINATORS);
bitmap_zero (need_eh_cleanup);
}
- if (cfg_altered)
- free_dominance_info (CDI_DOMINATORS);
-
/* Finally, remove everything except invariants in SSA_NAME_VALUE.
Long term we will be able to let everything in SSA_NAME_VALUE
te->count += e->count;
remove_edge (e);
- cfg_altered = 1;
+ cfg_altered = true;
}
else
ei_next (&ei);
interesting_names = BITMAP_ALLOC (NULL);
interesting_names1 = BITMAP_ALLOC (NULL);
+ calculate_dominance_info (CDI_DOMINATORS);
+ cfg_altered = false;
+
/* First phase. Eliminate degenerate PHIs via a dominator
walk of the CFG.
phase in dominator order. Presumably this is because walking
in dominator order leaves fewer PHIs for later examination
by the worklist phase. */
- calculate_dominance_info (CDI_DOMINATORS);
eliminate_degenerate_phis_1 (ENTRY_BLOCK_PTR, interesting_names);
/* Second phase. Eliminate second order degenerate PHIs as well
}
}
+ if (cfg_altered)
+ free_dominance_info (CDI_DOMINATORS);
+
/* Propagation of const and copies may make some EH edges dead. Purge
such edges from the CFG as needed. */
if (!bitmap_empty_p (need_eh_cleanup))
{
- cfg_altered |= tree_purge_all_dead_eh_edges (need_eh_cleanup);
+ if (tree_purge_all_dead_eh_edges (need_eh_cleanup))
+ free_dominance_info (CDI_DOMINATORS);
BITMAP_FREE (need_eh_cleanup);
}
BITMAP_FREE (interesting_names);
BITMAP_FREE (interesting_names1);
- if (cfg_altered)
- free_dominance_info (CDI_DOMINATORS);
return 0;
}