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

    <tr>
        <th>Summary</th>
        <td>
            clang, clang++, *unsigned_char_ptr = -10.; generates bad code
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          no-bugs-please
      </td>
    </tr>
</table>

<pre>
    # I am running Ubuntu linux under Windows Subsystem Linux on 
# Windows 10, on an Intel Ivy Bridge.  For the code *uptr = -10.;
# a floating point assign to where unsigned char pointer points, 
# Clang appears to generate a store from %al when unoptimized, 
# while not putting anything in %al.  Optimized, Clang appears to 
# not generate any code.  

% uname -a
Linux dopey 5.15.90.1-microsoft-standard-WSL2 #1 SMP Fri Jan 27 02:56:13 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

% clang -v
clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7.5.0
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/8
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/7.5.0
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/8
Selected GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/7.5.0
Candidate multilib: .;@m64
Selected multilib: .;@m64

% apt list clang

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

Listing...
clang/bionic-updates,now 1:6.0-41~exp5~ubuntu1 amd64 [installed]

% cat clangbug1.c
#include <stdlib.h>
#include <stdio.h>

/* For both clang and clang++, unoptimized and optimized the         */
/* following fails.  It seems that *uptr = -10.  just assigns %al to */
/* *uptr, whatever might happen to be in %al, and not 0.  Optimized, */
/* it turned sub to an empty routine.                                */

static char Sccsid[] = "@(#)[marx]/sys/cc/clangbug1";

char const *program = "clangbug1";

void
sub (
  register unsigned char *const uptr)
{
        *uptr = -10.;
        }

int
idemp (
  register int const x)
{
        return (x);
        }

int
main (
  register int const argcount,
  register char **const argvector)
{
        unsigned char u = 1;

        u += idemp (34);
        sub (&u);
        printf ("u = %u\n", u);
        fflush (stdout);

        u += idemp (77);
        sub (&u);
        printf ("u = %u\n", u);
        fflush (stdout);

        exit (0);
        }

% clang -S clangbug1.c
clangbug1.c:17:10: warning: implicit conversion from 'double' to 'unsigned char' changes value from -10 to 0 [-Wliteral-conversion]
        *uptr = -10.;
              ~ ^~~~
1 warning generated.

% cat clangbug1.s
        .text
        .file   "clangbug1.c"
        .globl  sub                     # -- Begin function sub
        .p2align        4, 0x90
        .type   sub,@function
sub:                                    # @sub
        .cfi_startproc
# %bb.0:
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset %rbp, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register %rbp
                                        # implicit-def: %al
        movq    %rdi, -8(%rbp)
        movq    -8(%rbp), %rdi
        movb    %al, (%rdi)
        popq    %rbp
        retq
.Lfunc_end0:
        .size   sub, .Lfunc_end0-sub
        .cfi_endproc
...


# At the "movb %al, (%rdi)" instruction, nothing was put into %al.
# As a result, when the program is run, I think %al gets what was put
# in the return value of idemp.

% clang clangbug1.c
clangbug1.c:17:10: warning: implicit conversion from 'double' to 'unsigned char' changes value from -10 to 0 [-Wliteral-conversion]
        *uptr = -10.;
              ~ ^~~~
1 warning generated.

% a.out
u = 34
u = 77

% clang -O -S clangbug1.c
clangbug1.c:17:10: warning: implicit conversion from 'double' to 'unsigned char' changes value from -10 to 0 [-Wliteral-conversion]
        *uptr = -10.;
              ~ ^~~~
1 warning generated.

% cat clangbug1.s
        .text
        .file   "clangbug1.c"
        .globl  sub                     # -- Begin function sub
        .p2align        4, 0x90
        .type   sub,@function
sub:                                    # @sub
        .cfi_startproc
# %bb.0:
        retq
.Lfunc_end0:
        .size   sub, .Lfunc_end0-sub
        .cfi_endproc
...

# sub has been completely optimized out.  
# Hence *uptr remains unchanged.
% clang -O clangbug1.c
clangbug1.c:17:10: warning: implicit conversion from 'double' to 'unsigned char' changes value from -10 to 0 [-Wliteral-conversion]
        *uptr = -10.;
              ~ ^~~~
1 warning generated.

% a.out
u = 35
u = 112
# same for clang++

% clang++ clangbug1.c
clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated [-Wdeprecated]
clangbug1.c:15:3: warning: 'register' storage class specifier is deprecated and incompatible with C++17 [-Wdeprecated-register]
  register unsigned char *const uptr)
  ^~~~~~~~~
clangbug1.c:17:10: warning: implicit conversion from 'double' to 'unsigned char' changes value from -10 to 0 [-Wliteral-conversion]
        *uptr = -10.;
              ~ ^~~~
clangbug1.c:22:3: for crying out loud would you please stop using register
...
5 warnings generated.

% a.out
u = 34
u = 77

% clang++ -O clangbug1.c
clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated [-Wdeprecated]
clangbug1.c:15:3: warning: 'register' storage class specifier is deprecated and incompatible with C++17 [-Wdeprecated-register]
  register unsigned char *const uptr)
  ^~~~~~~~~
clangbug1.c:17:10: warning: implicit conversion from 'double' to 'unsigned char' changes value from -10 to 0 [-Wliteral-conversion]
        *uptr = -10.;
              ~ ^~~~
...
5 warnings generated.

% a.out
u = 35
u = 112

# Code works with gcc, g++, unoptimized and optimized
% gcc clangbug1.c
clangbug1.c: In function ‘sub’:
clangbug1.c:17:10: warning: overflow in implicit constant conversion [-Woverflow]
  *uptr = -10.;
          ^

% a.out
u = 0
u = 0


</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWVtzozgW_jXKyykoEMZ2HvLgOPFstnpntibT1Y8pAQJrBiRGFzueh_7tW0fC-BInnZ2drt3aCpWKAR19Ojed7wDMGNFIzm9Ifkvyuyvm7FrpG6miwjUm6lvODL8qVLW7ITSDB2AdaCelkA18Lpy0Dloh3TM4WXENX4Ss1NbAoyvMzljewSc_qiSQ5I4kCwTZC6UJoUscYhIepOUtPGx2cKtF1fAYYKU02DWHUlUcCF243mog2R1EaRKT7PYAyKBuFbOoU6-EtBCsAqtgu-aag5PeygrKNdNBhg-_BnU4QC1bJhtgfc-ZNgjQcMk1sxwYGKs0h1qrDgjNWYvgEpxUvRWd-INXp1DbtWg5SGWhd9Yrx-TOrvFEyIAQA_x0PPnF6gc0xDnoInfeLTHsJQa5HJxkHYeIhTvB-5Xq-Q7yOM3j6yROo06UWhlV28hYJiumq-jL4ycKhGYpPP7jn7DSAv7OJNAZJJRki3xKskWawedflkATmsHzfPo0nZz9_PDjZ0JXfslzrUpvWLQJd8LVhmsjlIRpnMRJlDqfTajE3LLGELr6-f7T_eLx_mmaJISuaiFZS-h1gPiF6YZbki2GxaO-jHwiRo10g8hac1ZBpyreomCvjBgUe5DGsrbl1Z3QOEToyhlN6KoQMkislJMVlExWokKP_7BcggizmBVKvphFV3FM6KoVBaGrpiwJXQ2aHdSiq9n3RY_zOPmuK8z_BPp3cMl38sP7jH_kLS8tr75D1Jajnp1rrcCJ2QJ8sZsk3XRypsBbQoe9x3oLrTA2bMLj0S-Ln398-PEHnI5CleLG15k124R6x4qWw_LTA_iCWbOSx_DZcNgKu4aSObQai5kpteitiY_BPwmDRS-O46NN7x2jpCgj16OdWH2l2kJKssU0TqJJ-pU_9_nXUAxSYF01nQDJb8V-x5L87kVxYYNthWvSuBxrppBl65A7sqWxVSuKeE2y-1eGhToeHWRWhC48DxUKDQ7VGfMp2HLr_5bHFOCHD1fIX_uDUI94DF2rtlVbZISaidbEAA8WDOedAbtm9gXrAfzqzJ7ezMBCSBMvoYepqN52zSzfcA2daNYY3b7nnhwLPjIRyqHqGP7knJYuwAsL1mmkVOMKxGISeNfbHWjlrJBITW8fJ6D-v7HMijJw9GNZGlGFpsSbTyglk4TQOaEZskB-2zH9jNlAV2aHdOH315gHKD_2CCEBEbdU0ni_9lo1mnV77DfmbZSoBgVdgfQULgA0b4TBRuK0vSB0EVYJ_h8Ii8xu9_NG-y93NKPA7CTThbTDScW7_qIe2PqEpZ9fX1dzDBzO90LvXbVjPlXeWpTpplROWkKXL6T2nhmdw3Sz4aVVb3jo1K3Oeyo9C84oC7gXszsYvZNNLpm3DyGdukvDvRbS1kGCuiE5ckfypcTEwL1-aVpdt86scZqxlXL2WOZbes5m_4t68meB22SevCNHjhq8x5eF-PhGtkhn-C9BytkyjY8ReCq6vhWl8Im0bwuHPntWKVe0nNBZKHSzk6zA2-WayYYb2LDWDe15lCYonSBzRF9aYblmbXQAH0nk3ZsxHF-B5Pdfv34NY-nehLExr-K3ucmcgsaWP9uzWzU-NMBJSYpLjOmpWNOqog1pcrm4ZhBFcMsbIaF2svRMbVxxBtNT1uKT0nBMMHOS5-vkXM9dz0NS4t6eJHvEsSxiEN9xoFpkkrzUo6zFk7FM216rA4FjThdFjNlylv7OrH_3eLku-gtYFa-fypo9qbo23EI6vSAzjA0YdAnRuVinNr_DsIzpAxN-Y8Gx4F2SfI979lshqngdGkpk51fVqoTXfO4rQTDk-rL0mcxgTCVeSBcDdmgKhkm4zhlwr_pRjXNLNbe_hzvxJ0yWJy6rl2GMjfjjkFdwJBpdThEuq0OCjJ3lYbcdMmdhfe9FKPUWXTaHUt-_axeSmS6x_fEP6Ftm8KkdyU0Nj-pH2AYYaG5ca0N7hd3UmsO-pRAGtPNwD4Bwvw2NWsOt8c3YHv4AKQLCwM2hkqk6kMTLmuJr7UehPX3KidXeoYEPs8nx1Wz2CmP99EFaH6T15vFXkdZ_pSZm3ttrZqDgXEKpur7llre7o4dU5ezhRSLN4G9cloc3rppj62_AyZCzY7oc76GPDfSNYpQfX6UpPYoP6zjUSp-8VLhUq8LQK64-c63VPLwPJ3RWoruERDpjZrgR3lzMAncJCcsBvFMVx7Sza4EZs2YboTQSWsV7zUs0Nnj3cD169SzkOckW2ZlahM72DRKubqzSrOFokjFgel6KWvDz9ZisQEjMXGZF0Q5vnwaN09m5PtG4wiHc_9aTOgzh9sf_ezafWkbpPmg-IfUOU0g5C61yFWyVayvYKQfhsxDGrwdnUGh0-mkZyvceMn85dQ8Z-2rx-dgRHzviz-yI_zR3X6n0Y71fqorDVunfTAib_y6whPe8Tj4s25TltzgXHo6aKHJPyTwh13PsIYbz67H3eE8w1YbrulVb3BvHgTWWyZMI--DspY9C8o5gkPz-m_5NLlyE_1fVTVZdZ9fsit-k03mWz2mS5Ffrm2mdlnmdTeYsn6f5dD65ppOqqrLrjCZlkk6vxA1NaJbkyZymkyTJ43xeT4s6qa_TPCnrCSeTBLugNm7bTRcr3VwJYxy_mdJpmly1rOCt8V_QKZV8C34Q29_87krf4Bz_NZ1MklYYaw4oVtiW3wzlbHn-WQE9NmyLJ9wWT2fuG9PSQMEq_0H4yun2Zm1tbzC4dEXoqhF27Yq4VB2hK1x5-Il6rX7lpSV05fU1hK68Pf8KAAD__11PPMs">