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

    <tr>
        <th>Summary</th>
        <td>
            [X64] Inst combine Pass bug - Incorrect combining lost memory de-reference
        </td>
    </tr>

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

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

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

<pre>
    The inst-combine is doing incorrect combining for the below code. Instead of de-referencing and then accessing the memory, it did offset addition and accessed wrong memory address.

The CE link is here https://godbolt.org/z/G8e6GrKW8


```
typedef unsigned char ub1;
typedef unsigned short ub2;
typedef unsigned int ub4;
typedef int boolean;

struct spStruct
{
  ub4 phySize;
  void *hSize;
};
typedef struct spStruct spStruct;

struct kccStruct {
  ub4 kfhdbi;
  ub4 kfhcsq;
  ub4 kfhfsz; // till here size = 12 bytes
  ub4 kbsz; 
}; // Size = 16 bytes
typedef struct kccStruct kccStruct;

struct kBlkStruct
{
 kccStruct fh_blk;
  ub4 offset;
  ub4 amount;
  ub4 modtime;
};
typedef struct kBlkStruct kBlkStruct;

struct kStruct {
   ub1 tVar1;
   ub1 tVar2;
   ub2 tVar3;
   ub4 tVar4;
}; // size = 8 bytes
typedef struct kStruct kStruct;

void foo(spStruct *spPointer) {
  spPointer->phySize =
 ((kBlkStruct *)((ub1 *)spPointer->hSize + sizeof(kStruct)))
 ->fh_blk.kbsz;
}

```

```
define dso_local void @foo(spStruct*)(ptr nocapture noundef initializes((0, 4)) %0) local_unnamed_addr #0 !dbg !32 {
 #dbg_value(ptr %0, !43, !DIExpression(), !44)
  %2 = getelementptr inbounds nuw i8, ptr %0, i64 8, !dbg !45
  %3 = load ptr, ptr %2, align 8, !dbg !45
  %4 = getelementptr inbounds nuw i8, ptr %3, i64 20, !dbg !52 ; <---- Wrong, lost de-referencing via (kBlkStruct *); instead combined offset addition as 8 + 12 = 20 bytes. This lead to wrong memory slot
  %5 = load i32, ptr %4, align 4, !dbg !52
  store i32 %5, ptr %0, align 8, !dbg !56
 ret void, !dbg !58
}
```

</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJyUVsFu4zgM_RrlQiSwJTtxDjkkbTMo5jJABzt7K2SLjrVVpKwkt9t-_YK2kzieFosFDNgm-chHihIlQ9AHi7hh-Y7l9zPZxsb5zWNo3qSX32elU--bnw2CtiHOK3cstUXQAZTT9gDaVs57rCL0KpLVzkNsEEo07g0qp3ABjzZElApcDQrnHmv0aCuyllaRtQVZVRgCiQh8xKPz74zfgY6gNCHrgBGkUjpqZztcD0EFb97Zw4AhE48hLFiyZcmWuN89gNH2hWg36BGaGE-BiS3je8b3B6dKZ-LC-QPj-w_G998KXH7z338VvQt6lsnwJNv4fkKFNbS2K52CqpEe2jJlYveZOjTOR2hL_oVeW9Jmt1oSls4ZlLZXsGQbom-rCOH01H2QcEUqIDicmvcn_YG9NcCr0woY3zZXIVvd3waZOLx6nkR8qarBYhzwpW5Uqc_xBkkV_p5I6vDBxA76WkPUxvSLEPQHAhP3kHIo3yOGK6gcIGfKZ_DTBbK8QCa5XKlevn7LZmdephW8wurmuTQv4xz6zhtL5NG19kZydCrq43_U-Rp4zGHKblJpaiyIf0ifnuNdJHwk4Z1EjCRZJ8nGlM51vJS--LKMTzfvC8muq2rnGC8uXcP4Npx-OG0jesbXF-YX4ZyJh6E7KSopGS8YL0YFYXzL-LoXU379_42LpnfAdx1_V5ODgR4huyfZApn2i7gYGmnI_7eNPPlVWNPZpoJ7Nq6SZthCWXKb74XpKXqwrpKn2HoE61rbb1wdtTT6A0OfTUKHWNbzA8bzhN5dgOfWWnlE9UwnFjAuEmA8VeWBXoKfC8m4UOXh-VWaFoewvZs7ssvE8HH_-PDPiQ4-7WwXeX22yIbKEIx3637AiAaPaCN507Yk8gFs-wa6INg4iF5mUAy-BnJZfvYnOn_GSUWYEZTTtzT6YL8GZ_-LjDiT4cmtwy6pHTBxN5_P5_CLhgFZGBfidNy8agmfdp7YdSOOhtQw5T6ZOQGKrgHTvow86ffPAn42OoAhcHS30ygYF8_55tdiacFHqWXXYmXT3Pq9FJ1HAnVupiv0aZnzJSE9xq6PJ7riuidGO2CmNkKtxVrOcJOuMr5OE57ks2az5GpZK7Gq15LLWqUoV2W2Figxy9OqTGd6wxOeJ4LnqcgEzxdyWWXLlSxkocqUq4xlCR6lNgtjXo80amc6hBY3qeBrkc2MLNGE7hLCucU36LSMc7qT-A2B5mV7CCxLjA4xXN1EHU13e_lzmbH8vrtpnFcQfsgQoGwPMIfHT24qXYMM6zTqE5y13mwmlwQdm7ZcVO7I-J6CD6_5ybu_kE6FfUc5ML4fcnrd8H8DAAD__1j42ro">