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

    <tr>
        <th>Summary</th>
        <td>
            [CorrelatedPropagation] `and X, C` wrongly replaced to `X (!range ...)`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    https://github.com/llvm/llvm-project/blob/84ce230e4298672bb5247170d6183b31aa06fc4b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp#L1181-L1202

LHS could be `undef`.

Alive2 report: https://alive2.llvm.org/ce/z/7aNRWo

```llvm
----------------------------------------
define i16 @foo.2(i16 %x) {
#0:
  %#1 = mul i16 %x, 65535
  %t1 = and i16 %x, %#1
  %t2 = zext i16 %t1 to i32
  %t3 = icmp ult i32 %t2, 255
 %t4 = select i1 %t3, i32 %t2, i32 255
  %t5 = trunc i32 %t4 to i16
 %t6 = and i16 %t5, 255
  ret i16 %t6
}
=>
define i16 @foo.2(i16 %x) {
#0:
  %#1 = mul i16 %x, 65535
  %t1 = and i16 %x, %#1
  %t2 = zext i16 %t1 to i32
  %t3 = icmp ult i32 %t2, 255
  %t4 = select i1 %t3, i32 %t2, i32 255
  %t5 = trunc i32 %t4 to i16
  %#range_0_%t5 = !range i16 %t5, i16 0, i16 256
  ret i16 %#range_0_%t5
}
Transformation doesn't verify!

ERROR: Target is more poisonous than source

Example:
i16 %x = undef

Source:
i16 %#1 = #x0000 (0)    [based on undef value]
i16 %t1 = #x0000 (0)
i32 %t2 = #x00000000 (0)
i1 %t3 = #x1 (1)
i32 %t4 = #x00000000 (0)        [based on undef value]
i16 %t5 = #x0000 (0)
i16 %t6 = #x0000 (0)

Target:
i16 %#1 = #x0000 (0)
i16 %t1 = #x0000 (0)
i32 %t2 = #x00000000 (0)
i1 %t3 = #x1 (1)
i32 %t4 = #x00007fff (32767)
i16 %t5 = #x7fff (32767)
i16 %#range_0_%t5 = poison
Source value: #x0000 (0)
Target value: poison


----------------------------------------
define i16 @foo.3(i16 %x) {
#0:
  %#1 = add i16 %x, 255
  %t2 = zext i16 %#1 to i32
  %t3 = icmp ult i32 %t2, 255
  %t4 = select i1 %t3, i32 %t2, i32 255
  %t5 = trunc i32 %t4 to i16
  %t6 = and i16 %t5, 255
  ret i16 %t6
}
=>
define i16 @foo.3(i16 %x) {
#0:
  %#1 = add i16 %x, 255
  %t2 = zext i16 %#1 to i32
  %t3 = icmp ult i32 %t2, 255
  %t4 = select i1 %t3, i32 %t2, i32 255
  %t5 = trunc i32 %t4 to i16
 %#range_0_%t5 = !range i16 %t5, i16 0, i16 256
  ret i16 %#range_0_%t5
}
Transformation doesn't verify!

ERROR: Target is more poisonous than source

Example:
i16 %x = undef

Source:
i16 %#1 = #x00ff (255)  [based on undef value]
i32 %t2 = #x000000ff (255)
i1 %t3 = #x0 (0)
i32 %t4 = #x000000ff (255)
i16 %t5 = #x00ff (255)
i16 %t6 = #x00ff (255)

Target:
i16 %#1 = #x007f (127)
i32 %t2 = #x0000007f (127)
i1 %t3 = #x1 (1)
i32 %t4 = #x00000100 (256)
i16 %t5 = #x0100 (256)
i16 %#range_0_%t5 = poison
Source value: #x00ff (255)
Target value: poison


----------------------------------------
define i16 @foo.4(i16 %x) {
#0:
  %#1 = add i16 %x, 255
  %#2 = sext i16 %#1 to i32
  %t3 = icmp ult i32 %#2, 255
  %t4 = select i1 %t3, i32 %#2, i32 255
  %t5 = trunc i32 %t4 to i16
  %t6 = and i16 %t5, 255
 ret i16 %t6
}
=>
define i16 @foo.4(i16 %x) {
#0:
  %#1 = add i16 %x, 255
  %#2 = sext i16 %#1 to i32
  %t3 = icmp ult i32 %#2, 255
  %t4 = select i1 %t3, i32 %#2, i32 255
  %t5 = trunc i32 %t4 to i16
  %#range_0_%t5 = !range i16 %t5, i16 0, i16 256
  ret i16 %#range_0_%t5
}
Transformation doesn't verify!

ERROR: Target is more poisonous than source

Example:
i16 %x = undef

Source:
i16 %#1 = #x00ff (255)  [based on undef value]
i32 %#2 = #x000000ff (255)
i1 %t3 = #x0 (0)
i32 %t4 = #x000000ff (255)
i16 %t5 = #x00ff (255)
i16 %t6 = #x00ff (255)

Target:
i16 %#1 = #x007f (127)
i32 %#2 = #x0000007f (127)
i1 %t3 = #x1 (1)
i32 %t4 = #x00000100 (256)
i16 %t5 = #x0100 (256)
i16 %#range_0_%t5 = poison
Source value: #x00ff (255)
Target value: poison

Summary:
  0 correct transformations
  3 incorrect transformations
  0 failed-to-prove transformations
  0 Alive2 errors
```
</pre>

<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWE1v2zgQ_TXjCxGDHOrz4ENaV9hDsbtIit3eCkqiHAWyKFCUN-mvX5CSbcmx3cS7KQokQeCY1JsnDod8DxnRtuWqlnIB_gfwlzPRmTulF6mqV_ddfT9LVf64uDOmaYFfAyaAyao0d106z9QaMKmqzfbPVaPVvcwMYJJWKgVMIi-TyKn0MI6CENPURy9kIc0DFvGUMyFoUGReOuIp7eCLFnVbKL1uAZPbTFRCAyYfldayEkbmf4mqk39q1YiVMKWq51nTAPLPjEXs6jNDikCXQK_7z8-_3ZJMdVVOUkkgoF2dywICOh-DrqtyI5Fo2ShtgF-Tac7CPZ7bVc6VXgEmmQRMvgMmofj95m815oKA9r8uKTd19cyfHp3LoqwlKVlAwKOFUnMEjNwQ_QfAmED4YXgXcmpX6QbEPgfkjABfknVXkX3MRxL4PvdHQNPDRJ1PYAPFGIgO-F0-mC3SMGIUKTmOYdzBymzdkK4y9mkfbVnR377aTnkO2cpKZpayj7awSYwd7OPcvO8Cje7qbIf13FJYMOIPDjMz_nQRRMt9LkMkhMvhC18C__QGSvHqtRgy0KJeyW_02z4KkLnJaX3sgG6_oB8cKdYh20HpdsrhdIHkSrY1YGjIRuqyeARk44v66ebmjxt72b8IvbLvaMlaaUkaVbaqVl1LzJ2oSas6nclJ4INYN5XcVXtbNJdbry8j9G0ffwDeHQ5A_kAppQQwooAx0Bj8D6loZU5U3dORjZU88JcTCnOKwGG25ZtgjuDY6MRYmB1H7AmPd4bn2Qv2zy14ex3PYIYqu3K9YEN_jT0Li6KwOI5hED5Z135rzuKOXqf-wI5P27D__PpEpsOJ36HGDOPP_2pc_AK1FPlUBg9056kEushfWgRf1ZHe9_jdZ57tM7202B1-nnCfUMQpzVFNPKGthz5yjOmpWZxGBWdRLzCM0AUzDH9oB0eQl5ko62XZHsEzyZ9GXWgGT7fpZ9mB979LFSDHQVguFCvLcIFcbcNe0xQu94T3jX7_F-TnWMPuXLxNcziS_lu0h9tuvRb6caQslGRKa3unzeRGtFsAJ2X9AwglhSgrmV8ZddVotZGngUMDT2qt9DC968PN8gXPYx6LmVywkNMo9EMaz-4WXsxSL4oLGaZZGnuC-jSkuWRhiIKhkLNygRQ9xmhAAy_CeC5FlksRsciXPA95BB6Va1FWu9bgrGzbTi4Y8xnyWSVSWbXb5qpeuD5p2q1a8GhVtqbdx5nSVK4Nu-9zjlqc4C8JBNR6xVcrTx8hoOQfrepV9Ui0bCqRydwqHwT0qy3fTt7m87mtY0Bnna5e3sp16bSAyZDRZoH_BgAA__8ItJCK">