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

    <tr>
        <th>Summary</th>
        <td>
            constraint elimination not adding a signed constraint
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            missed-optimization,
            llvm:transforms
      </td>
    </tr>

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

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

<pre>
    here's a function:
```c
extern void side_effect(void);

void f(int v1, int v2) {
  if (v1 < 0) return;
  if (v2 < 0) return;
  if (v2 > -5) return;
 side_effect();
}
```
at present, we're not optimizing this away. the IR is:
```lllvm
define void @f(i32 noundef %v1, i32 noundef %v2) {
entry:
 %0 = or i32 %v2, %v1
  %or.cond = icmp slt i32 %0, 0
  %cmp4 = icmp sgt i32 %v2, -5
  %or.cond7 = or i1 %cmp4, %or.cond
  br i1 %or.cond7, label %return, label %if.end6

if.end6: ; preds = %entry
  tail call void @side_effect() #2
  br label %return

return:                                           ; preds = %entry, %if.end6
  ret void
}
```
constraint elimination is correctly learning that `!(%0 < 0)` but I guess we need a little recognizer for the `(x<0)&&(y<0) => (x|y)<0` canonicalization
```
Processing condition to simplify:   %or.cond = icmp slt i32 %0, 0
Checking   %or.cond = icmp slt i32 %0, 0
   failed to decompose condition
Adding 'icmp sle i32 %v2, -5'
 constraint: %v2 <= -5

Checking   %or.cond = icmp slt i32 %0, 0
   failed to decompose condition
Processing condition to simplify:   %cmp4 = icmp sgt i32 %v2, -5
Checking   %cmp4 = icmp sgt i32 %v2, -5
---
%v2 <= -5
sat
---
-1 * %v2 <= 4
sat
Adding 'icmp sge i32 %0, 0'
  constraint: -1 * %0 <= 0

Checking   %cmp4 = icmp sgt i32 %v2, -5
---
-1 * %0 <= 0
%v2 <= -5
sat
---
-1 * %0 <= 0
-1 * %v2 <= 4
sat
Processing fact to add to the system: icmp sle i32 %v2, -5
Adding 'icmp sle i32 %v2, -5'
 constraint: %v2 <= -5

Top of stack : 3 4
CB: 3 4
Processing fact to add to the system: icmp sge i32 %0, 0
Adding 'icmp sge i32 %0, 0'
  constraint: -1 * %0 <= 0

Adding 'icmp uge i32 %0, 0'
  constraint: -1 * %0 <= 0
```
cc @fhahn @dtcxzyw 
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0VkFv6jgQ_jXmMgI5TiDkkAOlW-ndVqu9r4w9Id7n2Mh22tJfvxoHCqWvK572bYXU4Jn55ptvZohljGbvEFu2fGDLx5kcU-9DG3CPfZjtvD62PQZkoo4goRudSsY7Vm4Y37AVnz6K8Q2-JgwOnr3REI3Gv7DrUCUm1nTERMPKB4rhm-zSMbE2LsFzwcQW8pNgogFWkxeA6YBCC2DlFjhZAqYxuAnl3S7usP8G8-Unh48UL_Tqx-vCGN_IBIeAEV0ioi-kREBwPoE_JDOYN-P2kHoTQb7I4wJSj_DtDzDxRiNr7fPA-EZjZxxOOrGKZx1KAc6PTiORXp4kuTm8UgddCscJnkwcWPkIPuSQk-v2BERSMLH0YaG809nRqOEA0aazOydvfvZUw6G6ctunj6jz5Q1k_Z68OIefsp8csv_ubD9HkY-VO7R0eGrM9ZHpFuj0ahqY85dyA6x8oHbomNMysZy0oBxJGgtKWvuu7aceAxOlOBO6TZ9TnWdkA_f_fcFpUuFSCNAAZm4_nDPlXUxB0iagNYNxkhYNTATlQ0CV7BEsyuCmeZMJKE4UubI8A9MesBWH3ZjgG-xHjBFeEByiBgnWpGQRAiq_d-YNA3Q-5HnNSOtXVm4zgljlz_p4OqC6aI2yT7095m3ZEm9Q0nlnlLTmLfO9Ker34BXGSJSp7SaXlDxEMxys6Y6T0PcO6LZH9Z2wfmamoZPGoqasGpUfDj7ihQzjm43WhMlEfULBTyMvaoK6dChPItlJdcqf1-J_Y3i3ivcs70eK90TM53Oq7lO9UaZ365y2-0aU6t3nVuI93sgwCXyj8AWTnyH5j2S-v4avEO8s7UPQv1d81bJOqkTdkjq3mPYtHmPCgWr8cuR-7Vz-6Q_gO4hJqu9AXmXmun24PP8c408d_PVNvsEb_xve9S-tyi_eXvaOHnRSr2_HF5jpttRN2cgZtkVdiobzVbmc9W1RrYpSN1VV1yvZNY3WtVZls8ay3HGl-My0gouqKERT1HxdiYVomq6qBK8VqmW3q1jFcZDGLugOsPBhPzMxjtgWxbooqll-E8V8AxNiMDGinp8uF9OPqqCGMyHyFaLcpCBd7HwYIlmWj7PQkmW-G_eRVdyamOIlVTLJYvvF64XuMXISWkK-CeorQWdjsG2f0iFfZsQTE097k_pxt1B-YOIp85n-zQ_B_51ftE-5tsjE06m851b8EwAA__9g8vNA">