[Bug tree-optimization/78332] New: [ARM] Negative costs of ivopts groups
ka6ash at gmail dot com
gcc-bugzilla@gcc.gnu.org
Sat Nov 12 08:33:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78332
Bug ID: 78332
Summary: [ARM] Negative costs of ivopts groups
Product: gcc
Version: 7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: ka6ash at gmail dot com
CC: amker.cheng at gmail dot com
Target Milestone: ---
For the following code GCC generates six induction variables for each use
arr[{0-1}][{0-2}][k].
I think the problem is negative costs. The negative costs is appeared in the
following part of the function determine_group_iv_cost_address:
sum_cost = cost;
if (!sum_cost.infinite_cost_p () && cand->ainc_use == use)
{
if (can_autoinc)
sum_cost -= cand->cost_step;
/* If we generated the candidate solely for exploiting autoincrement
opportunities, and it turns out it can't be used, set the cost to
infinity to make sure we ignore it. */
else if (cand->pos == IP_AFTER_USE || cand->pos == IP_BEFORE_USE)
sum_cost = infinite_cost;
}
If we have a zero cost and autoinc is possible, we obtain the negative cost.
This situation is a little bit confusing because we also can have candidates
with a zero cost of casting and they are less preferable than candidates with
autoinc. It seems that there is a preference to use autoinc candidates. But the
testcase shows the preference could increase register pressure without any
reason.
I hotfixed it by zeroing negative costs and GCC started to use two iv.
So, are negative costs a part of the cost model and if it is, is it something
wrong with six ivs?
gcc btc.c -O2 -S -march=armv7-a -mcpu=cortex-a9
void foo(int amount, double arr[2][3][amount])
{
int k;
for (k = 1; k < amount; k++)
{
arr[0][0][k] = 1.0;
arr[0][1][k] = 1.0;
arr[0][2][k] = 1.0;
arr[1][0][k] = 1.0;
arr[1][1][k] = 1.0;
arr[1][2][k] = 1.0;
}
}
<Group-candidate Costs>:
Group 0:
cand cost compl. inv.ex. depends on
0 10 2 1
...
5 0 1
6 -4 0
7 -4 0
...
Group 1:
cand cost compl. inv.ex. depends on
0 10 2 8
...
9 0 1
10 -4 0
11 -4 0
...
More information about the Gcc-bugs
mailing list