<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/64517>64517</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [bug][arm64be]with the optimize option -O3 and volatile keyword will get wrong result
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          MLsheng
      </td>
    </tr>
</table>

<pre>
    compiler: clang15.0.4 arm64be
demo:
```
#include <stdint.h>
#include <stdio.h>

uint32_t j[6];
uint32_t k;

void left(uint8_t b) { 
    k = k >> 8 ^ j[(k ^ b) & 5]; 
}

#pragma pack(1)
struct {
    signed a : 18;       // 0xc740
    volatile unsigned b : 24;
    signed c : 27;
    unsigned : 20;
    signed : 10;
    signed : 15;
    unsigned : 13;
} d[] = {{51008}};

int main() {
    int i = 0;
    for (; i < 6; i++) {
        j[i] = i;
    }
    left(d[0].b);
    left(d[0].c);
    printf("%X\n", k);
    return 0;
}
```
Turn on the optimize option -O3, with the volatile declear variable b, output is `4`, wrong; without the volatile keyword, output is `0`, right.

#### memery layout of the struct
```
d:
        .byte   49                              // 0x31
        .byte   208                             // 0xd0
        .byte   0                               // 0x0
        .byte   0                               // 0x0
        .byte   0                               // 0x0
        .byte   0                               // 0x0
        .byte   0                               // 0x0
        .byte   0                               // 0x0
        .byte   0                               // 0x0
        .zero   7
        .size   d, 16
```
#### assembly
with volatile keyword:
```
adrp    x8, d
add     x8, x8, :lo12:d
adrp    x9, k
mov     w12, #5
adrp    x13, j
add     x13, x13, :lo12:j
ldp     x8, x10, [x8] // load b, c from memory
adrp    x0, .L.str
add     x0, x0, :lo12:.L.str
ldr     w11, [x9, :lo12:k]
mov     x29, sp
lsr     x8, x8, #59
······························ // left(b)
eor     w10, w11, w10, lsr #22
and     w10, w10, w12
ldr     w10, [x13, w10, uxtw #2]
eor     w10, w10, w11, lsr #8
······························ // left(c)
eor     w8, w10, w8
and     w8, w8, w12
ldr     w8, [x13, w8, uxtw #2]
eor     w1, w8, w10, lsr #8
str     w1, [x9, :lo12:k]
```
without volatile keyword:
```
adrp    x8, k
adrp    x9, d+4
add     x9, x9, :lo12:d+4
mov     w12, #5
adrp    x13, j
add     x13, x13, :lo12:j
ldr     w11, [x8, :lo12:k]
adrp    x0, .L.str
add     x0, x0, :lo12:.L.str
ldr     w10, [x9] // load b 
ldur    x9, [x9, #4] // load c
mov     x29, sp
······························ // left(b)
eor     w10, w11, w10, lsr #22
and     w10, w10, w12
lsr     x9, x9, #59
ldr     w10, [x13, w10, uxtw #2]
eor     w10, w10, w11, lsr #8
······························ // left(c)
eor     w9, w10, w9
and     w9, w9, w12
ldr     w9, [x13, w9, uxtw #2]
eor     w1, w9, w10, lsr #8
str     w1, [x8, :lo12:k]
```
I guess that the registers of variable b and c are reversed with the volatile keyword.


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWF2P4yYX_jXkBm2EwY7xRS4mkxnplfZVb3rRuxU2xGGDTQR4ZrK_vgIcf00y2lZtta02srDN-eI8cB6CmbWyboXYgmwHsv2Kde6ozfb_n-1RtPWq1PyyrXRzlkoYQB5gpVhbJ9karVPITLNJSwHQHqAHLhoNyEN8ARvUX_EVE9lWquMCAvJoHZetWx8Bebon1lNpaDvZOoK_OPgVZLsNyPaA7BaS09AV2xctOVTi4ACmXol-cbAEuIAg38GoAiGEJwjIPrRPgDxBCkH2FKIATE_hJRrhDcxi3N4Y5PtpOIDJ2bC6YfDMqhPANAG4iCLrTFc5H3cMG2DnkEGPakK92_gD-BngZ4jeqjxFo_6LVsxJJWDX9qZlMMXpkPbEbRVl-Uw2WAYZumUXBnNfkt33l5AR_nwPeVxPAVufd77LEoSoxyzfLyZKtg42TLYA0356xhheJoOX-agO2kCvT3ZB_Ag34RHgXbgWXvzPT6m8DknOnA0z6V_6FeMTQCDbr_3sz7SXCtVS4Wxk6w4hGwxw9hvIHtvw-AhPS10jXGfaSXLjqprX0K9eTbfQHQXUZycb-S0-6BZ--oV456_SHYN8WCtcVEowA1-YkaxUwi_lR6g7d-4clBaCDUp9BG9sdFt7DL0X3bm5o5O4vGrD31mj3trI-ujWi3IYLtiIRpgLVOziPetDcB6r4mayfGQSVKzLixMAFWkBP_wNhUOSd7YY0e-z5eidLfo47Gj70_QfNP0mjAaoyMceK795Z2GRJpt7G9G4KJm1oinVJYpC8bxb73c2NMbNGaDijfpY_NrHh67YAvKgdIIBeeBzsyJSQehr9AtAxWsS6AFgks1Vk1DZX2chYl9_G4P0SoqPQ3tLQnWCbPdGA_VFIJVmPFJBBQ9GN74-tbnMIwfL9ee1dWYWPfTHdow91VPchIySa-hirnvyu-gk9zccFOy5N7dmiSMmWb-TgkcMdvm_qx1Qj_tGOfwtEDoCFfk34tW_Keu3N4JxD33Lp5r9Dc_xHqY6Loy-o3tzr8HVgPoi7DR6H5b-Z8CulmDTadJ0hi7t-25gSxfQ0o-RnTpC73ENldKrfVgfC9a57sx_iqVONyiIA7xLZ8UdupcDmqj9DWy1IAt6D4y_jJfQiPuSEuFVszMDGuMMYZIuLaoPiOxHKIcfjqusWS6zkdx_EtkfILJimnQxg77o-24QWbGAtvgOIiu-m8ju1u6CmP4H605YC92RxXOGEbW0ThjrzwbjYQWy1h9lmfEaL8JYwW8ccnoWnJ0-VnxLeEEKthLbZFMk6WaDEro6bvNNwXFepKnIWZLRAlUiq4qSlhku-SEvV3KLESaIIopIihK6zijLRYK4YDQ_ZIKAFImGSbVW6qVZa1OvpLWd2G7SLMlXipVC2evXFLP1Sp_KrrYgRUpaZ0czJ50K313KrvZIZbvrB5VsP2R546gXUFlmD1-lUrAWLh7koBG2U27VGbU9One2fo8IC6qW7tiV60o3AD_7sfS3T2ejv4rKAfwc8rEAP4eUfg8AAP__ZVV5yw">