https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105368
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Last reconfirmed| |2022-04-25 Status|UNCONFIRMED |ASSIGNED Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Zdenek Sojka from comment #3) > I think the issue might be in the: > > > 1463 > > 1464 /* Ignore the reciprocal when calculating the cost. */ > > 1465 val = (n < 0) ? -n : n; > > expression, for the case n == LONG_MIN, but I am not a language lawyer. (-n > is not representable in the (promoted) signed type) Ah, good point. diff --git a/gcc/tree-ssa-math-opts.cc b/gcc/tree-ssa-math-opts.cc index 102b7a2cc99..7555793948e 100644 --- a/gcc/tree-ssa-math-opts.cc +++ b/gcc/tree-ssa-math-opts.cc @@ -1462,7 +1462,7 @@ powi_cost (HOST_WIDE_INT n) return 0; /* Ignore the reciprocal when calculating the cost. */ - val = (n < 0) ? -n : n; + val = absu_hwi (n); /* Initialize the exponent cache. */ memset (cache, 0, POWI_TABLE_SIZE * sizeof (bool)); should fix that.