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

    <tr>
        <th>Summary</th>
        <td>
            [x86][CF]Unable to obtain the correct CF flag bit
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          zhaojiangkun-1
      </td>
    </tr>
</table>

<pre>
    Retrieve the CF register flag bit through __readeflags() and verify if the parameters are equal.
Clang generates the 'and' instruction after compilation, and clears the CF flag after executing the 'and' instruction. Is this a bug or is it for some purpose? Resulting in the inability to obtain correct results through __readeflags().

https://godbolt.org/z/4oaWeKxY1


**How did I do it**
1)`clang -g test.c -o -test`
2)`cgdb test`
3)  run to  ` flags = readeflags_test (100, 101)` and debug in assembly
**the debug result**

![Image](https://github.com/user-attachments/assets/d0f6daff-e3f0-4db9-9c13-07c615cd5ea4)







**test script:**
```#include <x86intrin.h>

extern void abort (void);

#ifdef __x86_64__
#define EFLAGS_TYPE unsigned long long int
#else
#define EFLAGS_TYPE unsigned int
#endif


EFLAGS_TYPE
readeflags_test (unsigned int a, unsigned int b)
{
    volatile char x = (a == b);
    return __readeflags ();
}

int
main ()
{
    EFLAGS_TYPE flags;

    flags = readeflags_test (100, 100);

    if ((flags & 1) != 0)  /* Read CF */
        abort ();

    flags = readeflags_test (100, 101);
    flags = readeflags_test(101, 100);//新增测试用例,用于验证比较对CF的影响


    if ((flags & 1) == 0)  /* Read CF */
        abort ();

#ifdef DEBUG
    printf ("PASSED\n");
#endif

    return 0;
}



</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJykVk2P2zYT_jXjy8AGRX1YOvgg21Le4O0hSBoUORmUNJKZyqRLUhtvfn1ByvZ6F03aogtiTc_nMw9nSAtr5aCINpBuId0vxOSO2my-H4X-KoUafp_UMlo0unvefCRnJD0RuiPhrkZDg7SODPajGLCRDt3R6Gk44uFgSHTk5RZ4DrxAoTp8IiP7Z5R9iHAWRpzIkbEoDCH9MYlxBazcjUINOJAiIxzZYAt8LVQHfI1SWWem1kmtUPQ-e6tPZzkKLwG-C4nakYSxN5wB3mxLF2onJ9Xw46grfO89pUWBzTSgNigtSoe9Nmj1ifA8mbO2BHGNH8lOY4gnVQgplWjkKN0zOo26cUIqbLUx1Do0wdj-hCVfPrDy6NzZQlwCr4HXg-4aPbqVNgPw-jvwOtHiN_r_5Us0m_vF_fqf_oad7PA9dhqlm4XAygiqGrY7yAvIWBvoXQ7oyLpVi0uNS7-FjAEr-SvToWvwRRf7c0QzKV8bQsYCsxYh3uNLJQfvgMDziDF_HhGLgPto4WQ68pxKhcJaOjXj8x28Z2_Wzjzd0QeLCNLt-5MYCNI98PwNQ9Idp2bV6hPwerJklsI50R5PpJwFXvtcYdOxPutE3y8p7tky6ZpiWbRRvGTrNovStktJJB7sndY3awbq67OtkWcXENxgZuy6eCxVO04dIcS7S55J5YxUqyPE1RyHLo6MwictOxSNNoEu_83njre3ZLHsO-rxcLjk2SFLDodZ2lEvFWFV_1K--3T49cuHCicVhrjDUath_ieVm81ptPT3ji_mqpP9veIHW2DlXxzyYwAU_rxfSZorm2tfFCLik_aTOhK2R2HwEnoHeC78xu-bOwXe2pCbjHo1KDhPypWm9X7GOcM_-Wm76h-TPlY8T9uNZK_9Z03MHs_Gu8l-TpXfYGXoGx19r8Z7ZGFYQn-W-JFE52-i0Cz1NYD_u5_-2-j_YrLubP3QJ7hEr-sIgwNVBkUGWwZVCiWHovKSbQr5FqocyhqKFKo1FAmUOVQJbKugmq-I3WtVCXkFVQFlGVTBPY98QB8n8RLvHodcNWyLXR0ClJAnXrbdwzbymyKGfH9vwZ9yPTfNf-D6PmX7avv53dX6bKRy15T8Q_npU7WHdKeA8xfXV5Py0KvsTWcCKxfdJu6KuBAL2kTrOGF5nCd8cdwkjGVi3eUiS7JEtHzdMtaIpElbHqfpOl7IDWc8iXgUsyJdc75i677vMt4mLMlZ0kSQMDoJOa7G8enkX4iFtHaiTRQVeVIsRtHQaMPTzrmibxi0vo50vzAb77RspsFCwkZpnX0J46Qbw2-CS575Kzfd7mpI95-VaEZ6eNv8rX17325PbSPdYjLj5ieXtM9z_Viejf5KrQNeB3T-nr7Cf9rwPwMAAP__GkZ9Mw">