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

    <tr>
        <th>Summary</th>
        <td>
            Miscompile at -O1 and greater
        </td>
    </tr>

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

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

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

<pre>
    Tested at trunk on x86-64. Does not repro at 16.0.6.

Example produces wrong result at -O1 and greater. Repro at -O2:

```
$ llc bad.ll -filetype=obj -o bad.o
$ clang bad.o main.c -o main
$ ./main
0x0

$ opt bad.ll -O2 -S > opt.bad.ll
$ llc opt.bad.ll -filetype=obj -o opt.bad.o
$ clang opt.bad.o main.c -o opt.main
$ ./opt.main
0x1

$ opt -version
LLVM (http://llvm.org/):
  LLVM version 18.0.0git
  DEBUG build with assertions.
  Default target: x86_64-unknown-linux-gnu
 Host CPU: skylake-avx512
```

bad.ll
```
; ModuleID = '/tmp/xls_fuzzer_debug.A5ZryC/test.ll'
source_filename = "__module"
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"

define i64 @__sample__main(ptr %_input_ptrs, ptr %_output_ptrs, ptr %_tmp_buffer, ptr %_events, ptr %_user_data, ptr %_runtime, i64 %_continuation_point) {
entry:
  %_2 = alloca i8, align 1
  %_3 = load ptr, ptr %_input_ptrs, align 8
  %_x4.i.i = load i8, ptr %_3, align 1
  %_4 = xor i8 %_x4.i.i, -1
  %_5 = and i8 %_4, 31
  %_6 = and i8 %_5, 15
 %_7 = lshr i8 %_5, 1
  %_8 = and i8 %_7, 15
  store i8 %_8, ptr %_2, align 1
  %_9 = load ptr, ptr %_output_ptrs, align 8
  %_10 = icmp ne i8 %_6, %_8
  store i1 %_10, ptr %_9, align 1
  ret i64 0
}
```

main.c
```
#include <stdio.h>
#include <stdint.h>

uint64_t __sample__main(void** input_ptrs, void** output_ptrs, void* tmp_buffer,
                        void* events, void* user_data,
                        int64_t continuation_point);

int main (int argc, char** argv) {
  uint8_t input0 = 0x0;
  void* inputs[1] = {&input0};

  uint8_t output0;
  void* outputs[1] = {&output0};
  __sample__main(inputs, outputs, NULL, NULL, NULL, 0);

  printf("0x%x\n", output0);

  return 0;
}
```

Found via fuzzing in the XLS project (https://github.com/google/xls)
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJx8Vllv4zgS_jX0S0GCRB2WH_zgI95dIL292J4eDOZFoCVKZociBR6O079-QB22lCgJAlqq-urjV6XiQbRmtaB0i5I9So4rYs1Fqm1DL7SqVmdZvm3_oNrQEogBo6x4ASnglqVeGvtwlFSDkAYUbZV0kDD1Az_1UXBEwa4fn26kaTmFVsnSFlTDq5KiBkW15cbFeN9DIKKEWlFiqPLh_yOb9x2jaDclQ2kw_PevOAbOCziT0uccvIpxat5aiqKjPP8CT3Ye-QAXnIi6N0JDmPALB3JPD4yP8OlhCW7BTACOQbbmPuN3DN4PQNGTs_q9da7tYV_SN3o_aLw7Jjqd7aPWuTW4hUt6vStVmskB9Pz85zdAOLsY07oK4xPCJ86vjS9V3b1t7oUH6NBDPISZH_hBzczoPT7tf_4LzpbxEl6ZuQDRmirDpND-HUMr4r62IaqmBkU710J5GntWvAj5KjzOhL15tbBDxL-lNnD4308H1S9vnLxQj1xvSYiX-6AbZ9V_B4j28E2WltP_HAFFR0B4jfDJNC3CpxvXeWV__6YqL-nZ1v4u-Vu9HZyfauMo8bqn0dKqgubuMwrS0IEJ53nTcSM8yOvzhJIYwsmbtGZEUq9B0Y56LV4HKNpFuBvcazh_dU9p3A0euz-EOEPRLsSZV2XB8CQ6UzqGp7H3w8FGKf1Y0ooJCiyNAcVBnutuTeZ51zc4a40ChJOcidaavDVKI3yA0SqtWTKbps3PtqqomlrplQozw1ntCksMmRqVFYY11Jk6UTjJCykME5a41slbyYRBeANove9ToMKot0lXuhDc1ZVwLgsCLHNshLNaQDhFRR2KS1K66acq5vn2odk09Bb7zGeP-H6OMTz6ZMK4C7hJBSyb0Di0NwMmvX5RjsDYYaIZJn2PSRwmTAaMs6x7gfqi5pgpTfaeZj2jAW2koqNvliX-JMvNp2V91zALdQ2DLpgVTQviPm3q0P38c1XhEDSdZLMgS1HTtdO46tfHL7aLfl_95FyJmCi4Ld0SP2hTMulfUPT0mVeYqbsbLRMmjXMDHxbbVbIS4R3CO5j338TxroKDB2ZLbkx6-W8MeazH0TJdj19zjCksrkwU7af5MmG6k8odK-6ZqLpwsxYXooakiKqvsyUN4KqU5aYvRN8T7sCN7oBRdAfQKNmHKBl28PUe4bQPdB96LudB3ZdyibP3LJCOIRNW-PgdB0n4cCfCB_jvz-fnpd_gY8UAWsWEqVC3Wwc3hJMbSg7Cbd130sU4RY1VAh45fd3oJ2lFCVdGwJ1yTNTABJgLhb-ef7hr2S9amPE2oO_XgZqZiz37hWzci5S1O9_cWYnwZlVuo3ITbciKbsN0s4nTKMvw6rKltMBBFkZBSaLzZkPDsIrLCmdVTEmchnjFtjjAURgGWbgOsyD04yzenOM4TqskWOM4QXFAG8K4P15HVkxrS7frcB3EK07OlOvutoqxoK_QOV3FkuNKbV2Md7a1RnHAmTb6wWKY4XT7jelCNi3jdOHmubKKb78oguMafryhbAifOgUa4VOn8J8AAAD__1g6NgM">