<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/74124>74124</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[flang] `(-1)^n` --> `n % 2 == 0 ? 1 : -1`
</td>
</tr>
<tr>
<th>Labels</th>
<td>
flang
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
foxtran
</td>
</tr>
</table>
<pre>
Dear,
Having the following code,
```fortran
integer function minus_one_pow(x)
implicit none
integer, intent(in) :: x
one_pow = (-1)**x
end function minus_one_pow
```
flang-new generates a very compicated ASM code:
```asm
.file "FIRModule"
.globl one_pow_
.p2align 4, 0x90
.type one_pow_,@function
one_pow_:
movl (%rdi), %ecx
testl %ecx, %ecx
je .LBB0_1
movl %ecx, %eax
andl $1, %eax
negl %eax
orl $1, %eax
cmpl $2, %ecx
jl .LBB0_5
movl $-1, %edx
movl $1, %esi
movl %ecx, %edi
.p2align 4, 0x90
.LBB0_4:
shrl %edi
imull %edx, %edx
testb $2, %cl
movl %edx, %r8d
cmovel %esi, %r8d
imull %r8d, %eax
cmpl $3, %ecx
movl %edi, %ecx
ja .LBB0_4
.LBB0_5:
retq
.LBB0_1:
movl $1, %eax
retq
.Lfunc_end0:
.size one_pow_, .Lfunc_end0-one_pow_
.section ".note.GNU-stack","",@progbits
```
At the same time, GCC produces a little code:
```asm
.file "test.f90"
.text
.p2align 4
.globl one_pow_
.type one_pow_, @function
one_pow_:
.LFB0:
.cfi_startproc
movl (%rdi), %edx
movl $1, %eax
addl %edx, %edx
andl $2, %edx
subl %edx, %eax
ret
.cfi_endproc
.LFE0:
.size one_pow_, .-one_pow_
.ident "GCC: (GNU) 12.2.0 20220819 (HPE)"
.section .note.GNU-stack,"",@progbits
```
Running commands:
```
gfortran test.f90 -O3 -S -o test-gcc.S
flang-new test.f90 -O3 -S -o test-flang.S
```
Used compilers:
- flang-new version 18.0.0 (https://github.com/llvm/llvm-project.git 9584f5834499e6093797d4a28fde209f927ea556
- GNU Fortran (GCC) 12.2.0 20220819 (HPE)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyUVl1vozgX_jXOjQUyBhJ8kYs0aTqvNNN3NVWvIwcfiGeNzWKTpvvrV4Z8kIbJtFJFg88Hz3nOl7m1stQAc5Q-oHQ14a3bmWZemINruJ5sjXifr4A3iC4xIitEFv3zG99LXWK3A1wYpcybf8uNAESXR70p6f8K03hf_anUDkpocNHq3EmjcSV1azdGw6Y2b4hmB0RZr4oxxrKqlcylw9poGBz3Xjwo_1M7RDOpEWUYxQsUL_DhqHv0i1G8wohmQeS90wWii6MGaPE7LNdRDIMvFNdloOENl6Ch4Q4s5ngPzTvOTVXLnDsQePHyo2ckXnzwxW11csfCQipAhCFK1__7-cOIVgGi9CIvldkqRNgR1uYiqSlXstSIsMQzQQ6MXITuvYahFV2ihJwi7dXOsjNAwiqzVx2aDNG0EbLja4kRTSE_nLUcWNerdce3Cr_8t8PvDw9kE936HhrxixHXopcn0YhUQ3myHpya5o5JXtVHKR3DqM4Y01uMSXD2KA4j4rPUyvsBCvmJjPUwkmEm7K45ORu4kFWrzseHEYQ-NdvroHM1hvBs3WRiwJjZw0nDyhGNAQB_fI_0eIT0IQA5lhR-TkoypCYdUtOA-2cojEYreLQkhqa-GzagBRmah1b--6Fx8EA1-NiGZzM4dpbv5FAbB-HT82tgHc__9v1Ml92T9o1YN6bcSmfvDJmF66ar5RVgJys_WPHTconrxog27yaOks4p-NqQ8fURFoxczRgHB3dTpTj5zBC6nTP4z4Mm_L5-uGY9L-TGOt64ujH5Z6bR_aYcThUh7jbMZerQEaltt7fW1_V0HQRocQkh_L5-_HN13dQUC6XwS61L2NNy6TcaotnT86tfcRENaUgwJZSSLGJe8u2vx44aOlaPN8X41Ur82Wrdr_eq4lrY21rrX8vjpsenGsPB_2McvODAdEdBmefhy8cV-jvlTuOkPorr1YLoF66C5oIqwBfne2is3-xRFpKQeKp2ztWdLl0jui6l27XbMDcVomul9qd_Qd2YX5C7sJQOszRLijSLk4QxmBIWz9hMJJxmhQBKWMHoDHiaTk-ff3p-xesjFT5ty-XdtE3EPBYsZnwC82hGoiSdEsYmu3nGBcwIBVEk25wD2eY8S6Y0z-NZlBXTaCLnlNA4oiSKsiSKWZilKYtjAjGnUZTOOEoIVFyq0McUmqacSGtbmM-SiCYTxbegbHfzo7TjzFdFupo0846DbVtalBAlrbMXD0461V0Xe4t0hX1aTner9FGjKcFBgOJHL_AMpJj6C5i_gxGM4jWO_DUNBxGakknbqPnXcoLouovCIrruAvkvAAD__7fg8D4">