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

    <tr>
        <th>Summary</th>
        <td>
            Why can't "const xxx *restrict" be optimized?
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    Why can't "const xxx *restrict" be optimized?

I'm sorry because I can't write makedown.

This is c code:

__attribute__((malloc)) int *get();
void _interface0(int p);
void _interface1(const int *restrict p);

int entry() {
    int *p = get();

    _interface0(*p);
    _interface1(p);

    _interface0(*p);
    _interface1(p);

    _interface0(*p);
    _interface1(p);

    _interface0(*p);
    _interface1(p);

    _interface0(*p);
    _interface1(p);

    return 0;
}

This is command line:

clang -S -O3 main.c -ffreestanding

This is assemble code:

        .def    @feat.00;
        .scl    3;
        .type   0;
        .endef
        .globl  @feat.00
.set @feat.00, 0
        .file   "main.c"
        .def    entry;
        .scl    2;
        .type   32;
        .endef
        .text
        .globl  entry                           # -- Begin function entry
        .p2align        4
entry:                                  # @entry
# %bb.0:
        pushq   %rsi
        subq    $32, %rsp
        callq   get
        movq    %rax, %rsi
        movl    (%rax), %ecx
        callq   _interface0
        movq    %rsi, %rcx
        callq   _interface1
        movl    (%rsi), %ecx
        callq   _interface0
        movq    %rsi, %rcx
        callq   _interface1
        movl    (%rsi), %ecx
        callq   _interface0
        movq    %rsi, %rcx
        callq   _interface1
        movl    (%rsi), %ecx
        callq   _interface0
        movq    %rsi, %rcx
        callq   _interface1
        movl    (%rsi), %ecx
        callq   _interface0
        movq    %rsi, %rcx
        callq   _interface1
        xorl    %eax, %eax
        addq    $32, %rsp
        popq    %rsi
        retq
                                        # -- End function
        .addrsig

Why p can't be optimized into the registers?

Can someone tell me how to do it, I know "pure" does my thing, but it needs not to return void.

If no one realizes that this is a point that can be optimized, I hope someone will pay attention:)
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzsVkGPozgT_TXOpRTkFNCJDxzo7onUp-_wrbTHloEKeMfYjG06yfz6lYFkkuz0arW3lYZLSL2qV8-mXGXpvWoNUcHyZ5a_ruQYOusK_XFWQUnjO7WqbHMufu_OUEvDcBuAIdbW-ACn0wkYlo58cKoODBEqAjsE1avv1LB0z3jJePnGcNuDt86doaJajp7g7Up3dCoQ9PIrNfZokjnkt055UB5qqG1DLC1n8_u7DMGpagz0_s5wx3DXS61tzVAwFKBMlFe2FCZQsPSZ8fLDqgbelQnkDrImznAXHYfPHDYMd_MKF77LCm9CGC8jSCa485wL2DYCAHAJG4Clr_AgZnG5lxOdrx73cBQz_IqeYUdhdAb4Yty-PlSL7XtpGtDK_KiZWkvTwvr_sP5fCr1UJqlhfTg4Ih-kaZRp70mk99RXmu4rj3GRNHRgXLCMH0iGhF9UcJH4WjMu0h-GcB6IcXHjQmYKn95bbSt9T8XLxFOAGwu-AF_8D0pHNoY462eId5LmKnxQg39Rk-LP5QQ6hQdlEyN8_jBMYb2GZ2qVgcNo6qCsWU7DzDSg1Ko1jIuM8XJRWP4N5Q0zy_iVKv7FvKoSfvkWYhh9923aj9x5Ndv8WM2mLMW4dRM2zFgttY5gPImTobcfl3h5unqrKzh9m1idMy4WF6pP94S3xfxI7NWF-POozc8yxsBfGf-LGU_WzRlzupZVfJtA2TSfFuhgh8d6dhS-LU3vnzzLefximutpXM6hbBrn1dLj4hgfrpP3dljHmWUhdASOWuUDOc--7NnzCxPLFH-RBrztyRqCQFpDT9DZIwQLjQUV4qLe4Kuxx3hDGEZH8ULQWPLQnyF0sdHiC1RjABXAEDUejA0xfmnrcQwv8__tAMZCTOVIavWdPIROhkgzN2kYbJyyk7GW5v7iMSnp7EBXwUelNQzyDDIEMtP2LKsrl5edWDVF2ohUyBUVm20mNunmSeSrruBVLQTPnhBl3eBW5Dk1O-SEGW0k8t1KFcgx508836R5ludJjVw85dtM7nbbtOIYG1ovlU60_ugT69qV8n6kYpOheNqttKxI--kOhmjoCBMau3z-unJFDFpXY-tZxrXywf-gCSpo-re3s9XodNGFMPjYWnHPcN-q0I1VUtue4T5mWX7Wg7N_UGTZT9o8w_0i_qPAPwMAAP__-fD1mA">