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

    <tr>
        <th>Summary</th>
        <td>
            Zero-extended i1 value becomes 255 at -O2 on x86_64
        </td>
    </tr>

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

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

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

<pre>
    ```llvm
; ModuleID = 'test'
source_filename = "test"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"

%value.Value = type { i64 }

define external ccc void @"_start"() unnamed_addr {
Entry:
  %0 = alloca [24 x i8], align 8
  %1 = bitcast [24 x i8]* %0 to { { %value.Value, i1, [7 x i8] }, i16, [6 x i8] }*
  call fastcc void @foo({ { %value.Value, i1, [7 x i8] }, i16, [6 x i8] }* sret({ { %value.Value, i1, [7 x i8] }, i16, [6 x i8] }) %1)
  %2 = getelementptr inbounds { { %value.Value, i1, [7 x i8] }, i16, [6 x i8] }, { { %value.Value, i1, [7 x i8] }, i16, [6 x i8] }* %1, i32 0, i32 0, i32 1
  %3 = load i1, i1* %2, align 1
  %4 = zext i1 %3 to i64
  
  call i64 asm sideeffect "syscall", "={rax},{rax},{rdi},~{rcx},~{r11},~{memory},~{dirflag},~{fpsr},~{flags}"(i64 231, i64 %4)
  unreachable
}

define external fastcc void @foo({ { %value.Value, i1, [7 x i8] }, i16, [6 x i8] }* noalias nocapture nonnull writeonly sret({ { %value.Value, i1, [7 x i8] }, i16, [6 x i8] }) %0) unnamed_addr noinline {
Entry: 
  ; Write i1 field in intermediate
  %1 = alloca [16 x i8], align 8
  %2 = bitcast [16 x i8]* %1 to { %value.Value, i1, [7 x i8] }*
  %3 = getelementptr inbounds { %value.Value, i1, [7 x i8] }, { %value.Value, i1, [7 x i8] }* %2, i32 0, i32 1
  store i1 true, i1* %3, align 1

  ; Copy intermediate to return
  %4 = getelementptr inbounds { { %value.Value, i1, [7 x i8] }, i16, [6 x i8] }, { { %value.Value, i1, [7 x i8] }, i16, [6 x i8] }* %0, i32 0, i32 0
  %5 = bitcast { %value.Value, i1, [7 x i8] }* %4 to i8*
  %6 = bitcast { %value.Value, i1, [7 x i8] }* %2 to i8*
  call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 8 %5, i8* align 8 %6, i64 16, i1 false)

  ret void
}

; Function Attrs: argmemonly nofree nounwind willreturn
declare void @llvm.memcpy.p0i8.p0i8.i64(i8* noalias nocapture writeonly %0, i8* noalias nocapture readonly %1, i64 %2, i1 immarg %3) #1

attributes #1 = { argmemonly nofree nounwind willreturn }
```

With LLVM 14.0.5, this program gives a correct result at `-O0`, but at `-O2` the zero-extended `i1` value is 255:
```
$ opt-14 test.ll -o test.bc -filetype=obj -O0
$ llc-14 ./test.bc -O0 -o ./test.o -filetype=obj
$ ld.lld -o test ./test.o && ./test
$ echo $?
1
$ opt-14 test.ll -o test.bc -filetype=obj -O2
$ llc-14 ./test.bc -O2 -o ./test.o -filetype=obj
$ ld.lld -o test ./test.o && ./test
$ echo $?
255
```

Does not reproduce with LLVM 13.0.1:
```
$ opt-13 test.ll -o test.bc -filetype=obj -O0
$ llc-13 ./test.bc -O0 -o ./test.o -filetype=obj
$ ld.lld -o test ./test.o && ./test
$ echo $?
1
$ opt-13 test.ll -o test.bc -filetype=obj -O2
$ llc-13 ./test.bc -O2 -o ./test.o -filetype=obj
$ ld.lld -o test ./test.o && ./test
$ echo $?
1
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzVV0tv2zgQ_jX2hZChhyXbBx-SuAEWaNHDAi2wl4AiKZtdihRIKrH31-8MZcmy3aZJNxvsArbE1wzn8c1HqjT8sJ4UcfdT6rGexJtJfDPJbsknw1slftuQSQb_dOGF8_DqFjjTWiYeKqmEprU4rkm7NWm3xlO7FZ5w6qmiB9P6fpWI6kl2I6ImXcTQyNLwwG5y3sVWMQ-PSPaNaolCSbqM9BIbRS8Dc7_D8OX-3spGDRbul8UDLGz1n9o86UhJ3e6jrW4HqeMzzR-pasXsCz6DsD800FjcErAE3pvxci4qqQURey-spoowxsijkZxM5jFofnBgSwgMmrcircag8QfKuUWVnZIP2tsD-NH1CFibx2FnqpRhlEzy23RO9kQuJ_lmkt7BuNxqshytT8L6UnpGnb8UuOk0ehO8CP8zL1GlTPAJgoteLrgaZorjVHE-NdjLwE5SwcYj5ytj0Oc33Y84K_xba12F8MF7FM00RBMwJJSohfaNt0Tq0rSau7eN4d0bp-ToDCzJUhJfNZKRk1lwUhnKjzvhMyhITxgbC8yDwF-AdVjaaQBIYXn2a8Z4wGKhriZOciGqSjCPVegODmdDRdzhAKgE7y3dd65dtrns2x-wy_Zn3SQZd2tRG6ij0QiXtlJ0Ox6qGmfP-jDvwgDWKBqdZl00sNjB6REyWm0FZTtaKnHkgOfJ4D1KQhtIFHXwZrTxrRXQ0rqFBDxZ6YXR6vDvlU18xWnaSK0wCFfkNqADj5ivaBuiqJJCAf40_CBooEZSL6547cSDSfE8D6aXPDgW6Kpj4MEXh-Hmqmqeo4ZXRPeVZgy1-f2adt7YEFRvT4qCUHZV0ONk3JnmcBZ_jBBAprX6qvr_r5x4TYXxyLf8HDWvz8o8MOHyHCrFP9WaXmkNzNrzCd7aZkB6rDnMmlguuwfyMRAZSvX1EVwMu12OFj3TdcHDgqTKiYHz-n0BDWHb79IeYui-1cxLo8mN99ZhucMdDAkZ-UebygokplY_Sc3Jk1RqjC8umKIA3Zc7ds16J7Ybsv2DlcDhvF84Zvr0GAFZ12D7sWyQ5rKzmqHgoCxbuPCGqe56Cbl9kb-j62N_9x7r_ir9jnz8-OUTSeazeBZy5nfSkcaaraU12cpH2JcSZqzFE9UK1ypPKMCriKPPQR_IgHnDWApPUCLg4LYmwrNJc8FxDrAHUwGQBPZAjPR30Evr4DZpGh8lgHO46M8AhJHpmiUjEX4M4CUZQmHKbwTtGMSUYig2m6T3w_rPMYoPQ-ZSw0iaw16832wsMkkBscUwchIRbIez8M1w3w0mv-ZD-hMf0vf0AXPzY9hsjECAIxwAKLxlUA4nJGWApOSnmc1-LbPZfymzL_ThMrOXPrxrZpOLtEz5OuOrbEWnXnol1n-cVS3QU1evpWCmFqFosdLRaCDf7ht32lq13nnfIA-DBfDbAhzacgYy0Alf-90rArx8AyKBrnSuFQ4aeZEv8-luvVpVNM_YYpXweZ7FccF5wgQrWcKTeZyXU0VLodwaDi-4PGvxRIIKvEjnm6lcp3GaxotkGS_mxTyZLZioFqv5MmYFW1TZEnhe1FSqWWB7Y7dTuw4mlS1cyOEQkM670yR1Dk4tIcJ2oJ-2fmfs2pvGwNkh_WEadl8H6_8G1lKgnQ">