[Bug debug/54693] VTA guality issues with loops
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Oct 19 13:49:00 GMT 2012
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54693
--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> 2012-10-19 13:49:03 UTC ---
What I had in mind for ivopts is roughly this. Not sure about the last
argument to get_computation_at. For normal statements I'd hope it shouldn't
make a difference, the stmt that initializes the unused iv should hopefully not
be in any way related to the place where increment of the new iv will happen,
for phis it needs more investigation.
And I don't see any infrastructure to gimplify a larger expression into several
debug temporaries with simpler expressions.
--- gcc/tree-ssa-loop-ivopts.c.jj 2012-09-12 10:57:02.629762526 +0200
+++ gcc/tree-ssa-loop-ivopts.c 2012-10-19 15:35:19.631230006 +0200
@@ -6422,7 +6422,76 @@ remove_unused_ivs (struct ivopts_data *d
&& !info->inv_id
&& !info->iv->have_use_for
&& !info->preserve_biv)
- bitmap_set_bit (toremove, SSA_NAME_VERSION (info->iv->ssa_name));
+ {
+ bitmap_set_bit (toremove, SSA_NAME_VERSION (info->iv->ssa_name));
+
+ if (MAY_HAVE_DEBUG_STMTS
+ && SSA_NAME_DEF_STMT (info->iv->ssa_name))
+ {
+ tree comp = NULL_TREE;
+ imm_use_iterator imm_iter;
+ use_operand_p use_p;
+ gimple stmt;
+
+ FOR_EACH_IMM_USE_STMT (stmt, imm_iter, info->iv->ssa_name)
+ {
+ if (!gimple_debug_bind_p (stmt))
+ continue;
+
+ if (comp == NULL_TREE)
+ {
+ struct iv_use dummy_use;
+ struct iv_cand *best_cand = NULL, *cand;
+ unsigned i, best_pref = 0, cand_pref;
+
+ memset (&dummy_use, 0, sizeof (dummy_use));
+ dummy_use.iv = info->iv;
+ for (i = 0; i < n_iv_uses (data) && i < 64; i++)
+ {
+ cand = iv_use (data, i)->selected;
+ if (cand == best_cand)
+ continue;
+ cand_pref = operand_equal_p (cand->iv->step,
+ info->iv->step, 0)
+ ? 4 : 0;
+ cand_pref
+ += TYPE_MODE (TREE_TYPE (cand->iv->base))
+ == TYPE_MODE (TREE_TYPE (info->iv->base))
+ ? 2 : 0;
+ cand_pref
+ += TREE_CODE (cand->iv->base) == INTEGER_CST
+ ? 1 : 0;
+ if (best_cand == NULL || best_pref < cand_pref)
+ {
+ best_cand = cand;
+ best_pref = cand_pref;
+ }
+ }
+ if (best_cand == NULL)
+ BREAK_FROM_IMM_USE_STMT (imm_iter);
+
+ comp = get_computation_at (data->current_loop,
+ &dummy_use, best_cand,
+ SSA_NAME_DEF_STMT (info->iv->ssa_name));
+ if (comp == NULL_TREE)
+ BREAK_FROM_IMM_USE_STMT (imm_iter);
+ /* "gimplify" into DEBUG temporaries expression comp,
+ insert immediately after
+ SSA_NAME_DEF_STMT (info->iv->ssa_name).
+ Set comp to the final DEBUG_EXPR_DECL. */
+#if 1
+ (void) comp;
+ BREAK_FROM_IMM_USE_STMT (imm_iter);
+#endif
+ }
+
+ FOR_EACH_IMM_USE_ON_STMT (use_p, imm_iter)
+ SET_USE (use_p, comp);
+
+ update_stmt (stmt);
+ }
+ }
+ }
}
release_defs_bitset (toremove);
More information about the Gcc-bugs
mailing list