Issue 176281
Summary [Flang] Power operator (`**`) result differs between -O0 and -O1 when the exponent is a variable
Labels flang
Assignees
Reporter nakazawa-fj
    
```
Version of flang : 22.0.0git(2f7e218017db69454ea84e1849fcb9a11b1f7fef)/AArch64
```

On an Arm64 (AArch64) system using Flang:
With -O0:
`r**3` and `r**i` (with i = 3) produce identical results.
With -O1:
only `r**i` (where the exponent is a variable) produces a different value compared to `r**3`.

This behavior does not occur in other compilers such as gfortran or ifx.

Why does Flang produce a different result under -O1 only when the exponent is a variable?
Is this behavior intended or a possible bug?
Are there recommended compiler flags in Flang to obtain invariant numerical results across optimization levels?

sample.f90
```fortran
subroutine sub(r)
 print *, r **3
end subroutine sub
subroutine sub2(r,i)
  print *, r **i
end subroutine sub2
p= 1.2345678
call sub(p)
call sub2(p, 3)
end
```
flang
```
$ flang sample.f90 -O0; ./a.out
 1.8816757
 1.8816757

$ flang sample.f90 -O1; ./a.out
 1.8816757
 1.8816758

$ flang sample.f90 -Ofast; ./a.out
    flang-22: warning: argument '-Ofast' is deprecated; use '-O3 -ffast-math -fstack-arrays' for the same behavior, or '-O3 -fstack-arrays' to enable only conforming optimizations [-Wdeprecated-ofast]
 1.8816757
 1.8816758

$ flang sample.f90 -O3 -fstack-arrays; ./a.out
 1.8816757
 1.8816758
```

gfortran
```
$ gfortran sample.f90 -O0; ./a.out
   1.88167572
   1.88167572

$ gfortran sample.f90 -O1; ./a.out
   1.88167572
   1.88167572

$ gfortran sample.f90 -Ofast; ./a.out
   1.88167572
   1.88167572
```

ifx
```
$ ifx sample.f90 -O0; ./a.out
   1.881676
   1.881676

$ ifx sample.f90 -O1; ./a.out
   1.881676
   1.881676

$ ifx sample.f90 -Ofast; ./a.out
 1.881676
   1.881676
```

_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to