This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug debug/54693] VTA guality issues with loops
- From: "jakub at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Fri, 19 Oct 2012 13:49:03 +0000
- Subject: [Bug debug/54693] VTA guality issues with loops
- Auto-submitted: auto-generated
- References: <bug-54693-4@http.gcc.gnu.org/bugzilla/>
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);