<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">