[Bug tree-optimization/98813] New: loop is sub-optimized if index is unsigned int with offset
guojiufu at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Jan 25 03:27:34 GMT 2021
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98813
Bug ID: 98813
Summary: loop is sub-optimized if index is unsigned int with
offset
Product: gcc
Version: 11.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: guojiufu at gcc dot gnu.org
Target Milestone: ---
For the below code:
---t.c----
void
foo (const double* __restrict__ A, const double* __restrict__ B, double*
__restrict__ C,
int n, int k, int m)
{
for (unsigned int l_m = 0; l_m < m; l_m++)
C[n + l_m] += A[k + l_m] * B[k];
}
------
compile with `gcc -O3 -S t.c -fopt-info`, we can see the loop was not
vectorized because it may not safe to directly optimize with potential
overflow.
clang could vectorize this code, while there are run-time instructions to check
if it is safe to do the optimization.
```
%1 = add nsw i64 %wide.trip.count, -1 = cnt-1
%2 = trunc i64 %1 to i32 = (int)(cnt-1)
%3 = xor i32 %n, -1 = n xor -1
%4 = icmp ult i32 %3, %2 = (n xor -1) < (int)(cnt-1)
%5 = icmp ugt i64 %1, 4294967295 = cnt > 4294967295 (overflow?)
%6 = or i1 %4, %5
```
More information about the Gcc-bugs
mailing list