This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/66375] [4.8/4.9/5 Regression] wrong code at -O2 and -O3 on x86_64-linux-gnu
- From: "rguenth at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Tue, 02 Jun 2015 11:56:25 +0000
- Subject: [Bug middle-end/66375] [4.8/4.9/5 Regression] wrong code at -O2 and -O3 on x86_64-linux-gnu
- Auto-submitted: auto-generated
- References: <bug-66375-4 at http dot gcc dot gnu dot org/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66375
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC|law at gcc dot gnu.org |spop at gcc dot gnu.org
--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> ---
Sebastian - it seems that we have to somehow tell the analysis phase that we
are analyzing an evolution, not just an initial value. Like instead of
/* Match an assignment under the form:
"a = b + ...". */
res = follow_ssa_edge
(loop, SSA_NAME_DEF_STMT (rhs0), halting_phi,
evolution_of_loop, limit);
if (res == t_true)
*evolution_of_loop = add_to_evolution
(loop->num, chrec_convert (type, *evolution_of_loop,
at_stmt),
code, rhs1, at_stmt);
doing the add_to_evolution first and only then following the SSA edge.
That seems to kind-of work, though the debug output is strange:
(analyze_scalar_evolution
(loop_nb = 1)
(scalar = c_1)
(get_scalar_evolution
(scalar = c_1)
(scalar_evolution = ))
(analyze_initial_condition
(loop_phi_node =
c_1 = PHI <0(2), c_7(3)>
)
(init_cond = 0))
(analyze_evolution_in_loop
(loop_phi_node = c_1 = PHI <0(2), c_7(3)>
)
(add_to_evolution
(loop_nb = 1)
(chrec_before = 0)
(to_add = -11)
(res = {0, +, -11}_1))
... computing niter, from chrec_convert stuff I guess
(evolution_function = (int) (signed char) {0, +, 245}_1))
(that 245 looks wrong)
but at least the scalar evolution ends up (correctly) as being not know...
That is with
Index: tree-scalar-evolution.c
===================================================================
--- tree-scalar-evolution.c (revision 224013)
+++ tree-scalar-evolution.c (working copy)
@@ -991,15 +991,15 @@ follow_ssa_edge_binary (struct loop *loo
{
/* Match an assignment under the form:
"a = b + ...". */
+ *evolution_of_loop = add_to_evolution
+ (loop->num, chrec_convert (type, *evolution_of_loop,
+ at_stmt),
+ code, rhs1, at_stmt);
res = follow_ssa_edge
(loop, SSA_NAME_DEF_STMT (rhs0), halting_phi,
evolution_of_loop, limit);
if (res == t_true)
- *evolution_of_loop = add_to_evolution
- (loop->num, chrec_convert (type, *evolution_of_loop,
- at_stmt),
- code, rhs1, at_stmt);
-
+ ;
else if (res == t_dont_know)
*evolution_of_loop = chrec_dont_know;
}
but as said, I don't think this is correct ...? (just thrown it to testing)