llvm / llvm/llvm-project

[MachinePipeliner] Generate invalid schedule due to incorrect memory instructions reordering

Open
#176,408 0 comments 0 reactions 0 assignees View on GitHub
flang miscompilation
Dominant language
LLVM
Stars
40.5k
Forks
18.7k
PR merge metrics
PR metrics pending

Description

The following Fortran program produces incorrect output when MachinePipeliner is enabled.

```fortran
program main
integer,parameter :: n = 10
real a(n),b(n),c(n)
do i=1,n
a(i)=1.0
b(i)=4.0
c(i)=1.0
end do
call sub(n,a,b,c,4.0)
write(6,*) c
stop
end program main

subroutine sub(n,a,b,c,x)
integer n
real a(n),b(n),c(n),x,s
do i=2,n
s = a(i) + sqrt(b(i))
a(i) = a(i-1) + x
c(i) = a(i) + s
end do
end subroutine
```

```sh
$ flang -v
flang version 22.0.0git (https://github.com/llvm/llvm-project.git 2f7e218017db69454ea84e1849fcb9a11b1f7fef)
...

# Without pipeliner
$ flang -O3 -mcpu=neoverse-v1 -fno-unroll-loops a.f90
$ ./a.out
1. 8. 12. 16. 20. 24. 28. 32. 36. 40.
Fortran STOP

# With pipeliner
$ flang -O3 -mcpu=neoverse-v1 -fno-unroll-loops -mllvm -aarch64-enable-pipeliner a.f90
$ ./a.out
1. 8. 12. 28. 36. 44. 52. 60. 68. 40.
Fortran STOP
```

See https://godbolt.org/z/943W3ch6d for the reduced reproducer and debug output. Apparently, in the subroutine `sub`, the order of `SU(5)` (the load from `a(i)`) and `SU(10)` (the store to `a(i)`) is swapped incorrectly.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.