<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">